Ver Fonte

Merge branch 'develop' of http://git.zanxiangnet.com/wjx/ad-manage into develop

shenwu há 2 anos atrás
pai
commit
58f07eb49b

+ 1 - 1
src/components/Tables/EditableCell.tsx

@@ -62,7 +62,7 @@ const EditableCell: React.FC<EditableCellProps> = ({
             name={dataIndex}
             rules={[{ required: true, message: `${title} is required.` }]}
         >
-            <Input ref={inputRef} onPressEnter={save} onBlur={save} />
+            <Input ref={inputRef} size="small" onPressEnter={save} onBlur={save} bordered/>
         </Form.Item>) : (<div className="editable-cell-value-wrap ellipsisText" onClick={toggleEdit}>
             {children}
         </div>);

+ 2 - 2
src/components/Tables/index.less

@@ -15,13 +15,13 @@
 }
 
 .editable-cell-value-wrap {
-    padding: 5px;
+    padding: 1px 2px;
     cursor: pointer;
     box-sizing: border-box;
 }
 
 .editable-cell-value-wrap:hover {
-    padding: 5px;
+    padding: 1px 2px;
     box-shadow: 0 0 0 1px #d9d9d9;
     border-radius: 4px;
 }

+ 2 - 16
src/components/Tables/index.tsx

@@ -5,8 +5,6 @@ import style from './index.less'
 import './index.less'
 import { Resizable } from 'react-resizable'
 import { SortOrder } from 'antd/lib/table/interface';
-import EditableRow from './EditableRow';
-import EditableCell from './EditableCell';
 
 export interface DataType {
     key: React.Key;
@@ -64,12 +62,11 @@ interface Props {
     sortDirections?: SortOrder[],
     isShowTotal?: boolean,  // 是否展示总计
     myKey?: any,//自定义要用哪个值做key
-    handleSave?: (row: DataType) => void
 }
 
 function Tables(props: Props) {
     // //导出数据
-    let { columns, dataSource, excle, total, handelResize, rowSelection, onRow, isShowTotal = true, hideOnSinglePage, handleSave, rowClassName, className, expandedRowRender, scroll, summary, showHeader, bordered, size = 'small', onChange, sortDirections, pagination, myKey, ...prop } = props
+    let { columns, dataSource, excle, total, handelResize, rowSelection, onRow, isShowTotal = true, hideOnSinglePage, rowClassName, className, expandedRowRender, scroll, summary, showHeader, bordered, size = 'small', onChange, sortDirections, pagination, myKey, ...prop } = props
     let handleExcle = () => {
         if (dataSource.length < 1) {
             message.error('请先搜索再导出');
@@ -92,10 +89,6 @@ function Tables(props: Props) {
         header: {
             cell: ResizableHeader
         },
-        body: {
-            row: EditableRow,
-            cell: EditableCell
-        }
     }
 
     useEffect(() => {
@@ -117,14 +110,7 @@ function Tables(props: Props) {
         onHeaderCell: (column: any) => ({
             width: column.width,
             onResize: handleResize(index)
-        }),
-        onCell: (record: DataType) => ({
-            record,
-            editable: col.editable,
-            dataIndex: col.dataIndex,
-            title: col.title,
-            handleSave: (row: DataType) => { handleSave?.(row) },
-        }),
+        })
     }))
 
     return <div className='components-table-resizable-column'>

+ 5 - 0
src/pages/launchSystemNew/account/index.tsx

@@ -205,6 +205,11 @@ const AdAuthorize: React.FC = () => {
                             }
                         }
                     }}
+                    onChange={(props: any) => {
+                        let { pagination } = props
+                        let { current, pageSize } = pagination
+                        setQueryForm({ ...queryForm, pageNum: current, pageSize })
+                    }}
                 />
             </div>
         </div>

+ 8 - 1
src/pages/launchSystemNew/account/tablesConfig.tsx

@@ -48,11 +48,18 @@ const columnsCrGdt = (editHandle: (data: any) => void) => {
             dataIndex: 'putResourceKey',
             key: 'putResourceKey',
             ellipsis: true,
-            width: 200,
+            width: 180,
             render: (a: any, b: any) => {
                 return <span>{a || '<空>'}</span>
             }
         },
+        {
+            title: '授权者',
+            dataIndex: 'putUserName',
+            key: 'putUserName',
+            ellipsis: true,
+            width: 80
+        },
         {
             title: '操作',
             dataIndex: 'cz',

+ 16 - 12
src/pages/launchSystemNew/adq/ad/index.tsx

@@ -10,6 +10,7 @@ import { CopyOutlined, DeleteOutlined, FieldTimeOutlined, PauseCircleOutlined, P
 import UpdateAd from './updateAd'
 import Copy from './copy'
 import PlanDetail from '@/pages/adMonitor/adMonitorList/components/planDetail'
+import { txAdConfig } from '../config'
 
 type Props = {
     accountId: string,
@@ -196,9 +197,10 @@ const Ad: React.FC<Props> = (props) => {
         {copyData.visible && <Copy selectedRows={selectedRows} {...copyData} onClose={() => setCopyData({ visible: false })} onChange={() => { setCopyData({ visible: false }); listAjax.refresh(); setSelectedRows([]) }} />}
         <TableData
             isCard={false}
-            columns={() => tableConfig(onChange, details, tableIdClick)}
+            columns={() => tableConfig(onChange, details, handleSave, tableIdClick)}
             ajax={listAjax}
             syncAjax={sync}
+            fixed={{ left: 2, right: 4 }}
             dataSource={listAjax?.data?.data?.records}
             loading={listAjax?.loading || syncAjax?.loading}
             scroll={{ y: 560 }}
@@ -206,14 +208,16 @@ const Ad: React.FC<Props> = (props) => {
             page={listAjax?.data?.data?.current}
             pageSize={listAjax?.data?.data?.size}
             myKey={'adgroupId'}
-            handleSave={handleSave}
+            gutter={[0, 10]}
+            config={txAdConfig}
+            configName="腾讯广告"
             leftChild={<Space direction='vertical'>
-                <Row gutter={[10, 10]} align='middle'>
+                <Row gutter={[6, 6]} align='middle'>
                     <Col>
                         <Input
                             placeholder='广告账号'
                             allowClear
-                            style={{ width: 150 }}
+                            style={{ width: 120 }}
                             onBlur={(e) => {
                                 let value = e.target.value
                                 let arr: any = []
@@ -255,7 +259,7 @@ const Ad: React.FC<Props> = (props) => {
                         <Input
                             placeholder='广告名称'
                             allowClear
-                            style={{ width: 150 }}
+                            style={{ width: 120 }}
                             onBlur={(e) => {
                                 let value = e.target.value
                                 set_queryFrom({ ...queryFrom, adgroupName: value })
@@ -282,7 +286,7 @@ const Ad: React.FC<Props> = (props) => {
                         <Input
                             placeholder='广告ID'
                             allowClear
-                            style={{ width: 150 }}
+                            style={{ width: 120 }}
                             onBlur={(e) => {
                                 let value = e.target.value
                                 let arr: any = []
@@ -324,7 +328,7 @@ const Ad: React.FC<Props> = (props) => {
                         <Input
                             placeholder='计划ID'
                             allowClear
-                            style={{ width: 150 }}
+                            style={{ width: 120 }}
                             onBlur={(e) => {
                                 let value = e.target.value
                                 let arr: any = []
@@ -365,7 +369,7 @@ const Ad: React.FC<Props> = (props) => {
                     <Col>
                         <Select
                             placeholder='推广目标选择'
-                            style={{ width: 150 }}
+                            style={{ width: 120 }}
                             showSearch
                             filterOption={(input: any, option: any) =>
                                 (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
@@ -384,7 +388,7 @@ const Ad: React.FC<Props> = (props) => {
                     <Col>
                         <Select
                             placeholder='是否已删除'
-                            style={{ width: 150 }}
+                            style={{ width: 120 }}
                             showSearch
                             filterOption={(input: any, option: any) =>
                                 (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
@@ -403,7 +407,7 @@ const Ad: React.FC<Props> = (props) => {
                         <Select
                             placeholder='广告状态'
                             mode="multiple"
-                            style={{ width: 200 }}
+                            style={{ width: 120 }}
                             showSearch
                             filterOption={(input: any, option: any) =>
                                 (option!.children as unknown as string).toLowerCase().includes(input.toLowerCase())
@@ -425,7 +429,7 @@ const Ad: React.FC<Props> = (props) => {
                         <Input
                             placeholder='腾讯备注'
                             allowClear
-                            style={{ width: 150 }}
+                            style={{ width: 120 }}
                             onBlur={(e) => {
                                 let value = e.target.value
                                 let arr: any = []
@@ -467,7 +471,7 @@ const Ad: React.FC<Props> = (props) => {
                         <Input
                             placeholder='本地备注'
                             allowClear
-                            style={{ width: 150 }}
+                            style={{ width: 120 }}
                             onBlur={(e) => {
                                 let value = e.target.value
                                 let arr: any = []

+ 53 - 0
src/pages/launchSystemNew/adq/ad/inputUpdate.tsx

@@ -0,0 +1,53 @@
+import { Form, Input, InputRef } from "antd";
+import React, { useEffect, useRef, useState } from "react"
+
+interface Props {
+    title: string,
+    dataIndex: string
+    record: any;
+    handleSave: (data: any) => void
+}
+
+const InputUpdate: React.FC<Props> = ({ title, dataIndex, record, handleSave }) => {
+    const [form] = Form.useForm();
+    const [editing, setEditing] = useState(false);
+    const inputRef = useRef<InputRef>(null);
+
+    useEffect(() => {
+        if (editing) {
+            inputRef.current!.focus({ cursor: 'all' });
+        }
+    }, [editing]);
+
+    const toggleEdit = () => {
+        setEditing(!editing);
+        form.setFieldsValue({ [dataIndex]: record[dataIndex] });
+    };
+
+    const save = async () => {
+        try {
+            const values = await form.validateFields();
+            if (values?.adgroupName !== (record as any)?.adgroupName) {
+                handleSave({ ...record, ...values });
+            }
+            toggleEdit();
+        } catch (errInfo) {
+            console.log('Save failed:', errInfo);
+        }
+    };
+
+    let childNode = editing ? (<Form form={form}><Form.Item
+        style={{ margin: 0 }}
+        name={dataIndex}
+        rules={[{ required: true, message: `${title} is required.` }]}
+    >
+        <Input ref={inputRef} size="small" onPressEnter={save} onBlur={save} bordered />
+    </Form.Item></Form>) : (<span className="editable-cell-value-wrap ellipsisText" onClick={toggleEdit}>
+        {title}
+    </span>)
+
+    return childNode;
+}
+
+
+export default React.memo(InputUpdate)

+ 1 - 1
src/pages/launchSystemNew/adq/ad/switchStatus.tsx

@@ -33,7 +33,7 @@ const SwitchStatus: React.FC<Props> = (prosp) => {
         })
     }
 
-    return <Switch checked={configuredStatus === 'AD_STATUS_NORMAL'} loading={editAdqAdgroupsData.loading} disabled={isDeleted} onChange={(checked) => switchHandle([adgroupId] ,checked ? 'AD_STATUS_NORMAL' : 'AD_STATUS_SUSPEND')}/>
+    return <Switch size="small" checked={configuredStatus === 'AD_STATUS_NORMAL'} loading={editAdqAdgroupsData.loading} disabled={isDeleted} onChange={(checked) => switchHandle([adgroupId] ,checked ? 'AD_STATUS_NORMAL' : 'AD_STATUS_SUSPEND')}/>
 }
 
 

+ 21 - 17
src/pages/launchSystemNew/adq/ad/tableConfig.tsx

@@ -8,9 +8,11 @@ import { ReactComponent as RocketSvg } from '@/assets/rocket.svg'
 import '../index.less'
 import { CopyOutlined } from '@ant-design/icons'
 import { copy } from '@/utils/utils'
+import InputUpdate from './inputUpdate'
 function tableConfig(
     onChange: () => void,
     details: (data: any) => void,
+    handleSave: (data: any) => void,
     tableIdClick: (props: {
         activeKey: string,
         parma: {
@@ -28,7 +30,7 @@ function tableConfig(
             dataIndex: 'configuredStatus',
             key: 'configuredStatus',
             align: 'center',
-            width: 55,
+            width: 40,
             fixed: 'left',
             render: (a: string, b: any) => {
                 return <SwitchStatus configuredStatus={a} isDeleted={b?.isDeleted} adgroupId={b?.adgroupId} onChange={onChange} />
@@ -40,7 +42,6 @@ function tableConfig(
             key: 'accountId',
             align: 'center',
             width: 100,
-            fixed: 'left',
             ellipsis: true,
             render: (a: string) => {
                 return <Space>
@@ -55,8 +56,7 @@ function tableConfig(
             dataIndex: 'memo',
             key: 'memo',
             align: 'center',
-            width: 90,
-            fixed: 'left',
+            width: 80,
             ellipsis: true,
         },
         {
@@ -64,8 +64,7 @@ function tableConfig(
             dataIndex: 'remark',
             key: 'remark',
             align: 'center',
-            width: 90,
-            fixed: 'left',
+            width: 80,
             ellipsis: true,
         },
         {
@@ -74,7 +73,6 @@ function tableConfig(
             key: 'adgroupId',
             align: 'center',
             width: 120,
-            fixed: 'left',
             ellipsis: true,
             render: (a: string, b: any) => {
                 return <Space>
@@ -91,7 +89,6 @@ function tableConfig(
             key: 'campaignId',
             align: 'center',
             width: 120,
-            fixed: 'left',
             ellipsis: true,
             render: (a: string, b: any) => {
                 return <Space >
@@ -108,14 +105,17 @@ function tableConfig(
             key: 'adgroupName',
             width: 280,
             ellipsis: true,
-            editable: true
+            render: (a: string, b: any) => {
+                return <InputUpdate title={a} dataIndex={'adgroupName'} record={b} handleSave={handleSave}/>
+            }
         },
         {
             title: '推广目标类型',
             dataIndex: 'promotedObjectType',
             key: 'promotedObjectType',
             align: 'center',
-            width: 85,
+            width: 75,
+            ellipsis: true,
             render: (a: string | number) => {
                 return PromotedObjectType[a]
             }
@@ -135,7 +135,8 @@ function tableConfig(
             dataIndex: 'beginDate',
             key: 'beginDate',
             align: 'center',
-            width: 160,
+            width: 150,
+            ellipsis: true,
             render: (a: string, b: { endDate: string }) => {
                 return b?.endDate ? a + '~' + b.endDate : a + '~' + '长期投放'
             }
@@ -155,13 +156,13 @@ function tableConfig(
             dataIndex: 'firstDayBeginTime',
             key: 'firstDayBeginTime',
             align: 'center',
-            width: 75,
+            width: 70,
         },
         {
             title: '出价',
             dataIndex: 'bidAmount',
             key: 'bidAmount',
-            width: 150,
+            width: 140,
             ellipsis: true,
             render: (a: string, b: { bidMode: string, optimizationGoal: string }) => {
                 return `${BidModeEnum[b?.bidMode]} ${a}元/${b?.bidMode === 'BID_MODE_CPM' ? '千次曝光' : b?.bidMode === 'BID_MODE_CPC' ? '点击' : OptimizationGoalEnum[b?.optimizationGoal]}`
@@ -173,6 +174,7 @@ function tableConfig(
             key: 'smartBidType',
             align: 'center',
             width: 80,
+            ellipsis: true,
             render: (a: string, b: { endDate: string }) => {
                 return a === 'SMART_BID_TYPE_CUSTOM' ? '手动出价' : '自动出价'
             }
@@ -182,7 +184,8 @@ function tableConfig(
             dataIndex: 'bidStrategy',
             key: 'bidStrategy',
             align: 'center',
-            width: 80,
+            width: 70,
+            ellipsis: true,
             render: (a: string, b: { endDate: string }) => {
                 return BidStrategyEnum[a]
             }
@@ -192,7 +195,7 @@ function tableConfig(
             dataIndex: 'dailyBudget',
             key: 'dailyBudget',
             align: 'center',
-            width: 80,
+            width: 70,
         },
         {
             title: '是否开启自动版位功能',
@@ -210,6 +213,7 @@ function tableConfig(
             key: 'createdTime',
             align: 'center',
             width: 140,
+            ellipsis: true,
         },
         // {
         //     title: '客户设置的状态',
@@ -227,7 +231,6 @@ function tableConfig(
             key: 'isDeleted',
             align: 'center',
             width: 60,
-            fixed: 'right',
             render: (a: any, b: any) => {
                 return <Badge status={!a ? "processing" : "error"} text={a ? '是' : '否'} />
             }
@@ -237,8 +240,9 @@ function tableConfig(
             dataIndex: 'status',
             key: 'status',
             align: 'center',
-            width: 80,
+            width: 70,
             fixed: 'right',
+            ellipsis: true,
             render: (a: string) => {
                 return AdStatusEnum[a]
             }

+ 3 - 2
src/pages/launchSystemNew/adq/adAccount/index.tsx

@@ -5,6 +5,7 @@ import React, { useEffect, useState, useCallback } from 'react'
 import TableData from '../../components/TableData'
 import tableConfig from './tableConfig'
 import { putAdqAdAccountSyncByIds, getAdqAdAccountList } from '@/services/launchAdq/adq'
+import { getAdAccountListApi } from '@/services/launchAdq/adAuthorize'
 type Props = {
     accountId: string,
     adAccountId: string,
@@ -38,7 +39,7 @@ function AdAccount(props: Props) {
         adcreativeName?: string;
     }>({pageNum: 1, pageSize: 20})
     // api方法
-    const listAjax = useAjax((params) => getAdqAdAccountList(params), { formatResult: true })
+    const listAjax = useAjax((params) => getAdAccountListApi(params), { formatResult: true })
     const syncAjax = useAjax((params) => putAdqAdAccountSyncByIds(params))
     console.log('创意=====》')
     useEffect(() => {
@@ -46,7 +47,7 @@ function AdAccount(props: Props) {
     }, [queryForm, userId])
     // 获取列表
     const getList = useCallback(() => {
-        listAjax.run({ ...queryForm, userId })
+        listAjax.run({ ...queryForm, putUserId: userId })
     }, [queryForm, userId, listAjax])
     // 同步 
     const sync = useCallback(() => {

+ 1 - 1
src/pages/launchSystemNew/adq/campaign/index.tsx

@@ -65,8 +65,8 @@ function Campaign(props: Props) {
     }) => {
         if (!params.campaignName || params.campaignName !== listAjax?.params[0]?.adcreativeName) {
             !params.campaignName && delete params.campaignName
-            listAjax.run({ ...params, userId })
         }
+        listAjax.run({ ...params, userId })
     }, [userId, listAjax])
     // 同步 
     const sync = useCallback(() => {

+ 34 - 0
src/pages/launchSystemNew/adq/config.ts

@@ -0,0 +1,34 @@
+/**广告 */
+const txAdConfig = [
+    {
+        label: '设置信息',
+        data: [
+            { title: '启停', dataIndex: 'configuredStatus', label: '设置信息', default: 1, width: 40 },
+            { title: '所属账号', dataIndex: 'accountId', label: '设置信息', default: 2, width: 100 },
+            { title: '腾讯备注', dataIndex: 'memo', label: '设置信息', default: 3, width: 80 },
+            { title: '本地备注', dataIndex: 'remark', label: '设置信息', default: 4, width: 80 },
+            { title: '广告ID', dataIndex: 'adgroupId', label: '设置信息', default: 5, width: 120 },
+            { title: '所属计划ID', dataIndex: 'campaignId', label: '设置信息', default: 6, width: 120 },
+            { title: '广告名称', dataIndex: 'adgroupName', label: '设置信息', default: 7, width: 280 },
+            { title: '推广目标类型', dataIndex: 'promotedObjectType', label: '设置信息', default: 8, width: 75 },
+            { title: '投放日期', dataIndex: 'beginDate', label: '设置信息', default: 9, width: 150 },
+            { title: '投放时间', dataIndex: 'timeSeries', label: '设置信息', default: 10, width: 55 },
+            { title: '首日开始投放时间', dataIndex: 'firstDayBeginTime', label: '设置信息', default: 11, width: 70 },
+            { title: '出价', dataIndex: 'bidAmount', label: '设置信息', default: 12, width: 140 },
+            { title: '出价类型', dataIndex: 'smartBidType', label: '设置信息', default: 13, width: 80 },
+            { title: '广告组日预算(分)', dataIndex: 'dailyBudget', label: '设置信息', default: 14, width: 70 },
+            { title: '是否开启自动版位功能', dataIndex: 'automaticSiteEnabled', label: '设置信息', default: 15, width: 80 },
+            { title: '创建时间', dataIndex: 'createdTime', label: '设置信息', default: 16, width: 140 },
+            { title: '是否已删除', dataIndex: 'isDeleted', label: '设置信息', default: 17, width: 60 },
+            { title: '广告状态', dataIndex: 'status', label: '设置信息', default: 18, width: 70 },
+            { title: '创意预览', dataIndex: 'creativePreview', label: '设置信息', default: 19, width: 70 },
+            { title: '单位时间消耗速度', dataIndex: 'costSpeed', label: '设置信息', default: 20, width: 80 },
+            { title: '操作', dataIndex: 'cz', label: '设置信息', default: 21, width: 65 },
+        ]
+    }
+]
+
+
+export {
+    txAdConfig
+}

+ 1 - 1
src/pages/launchSystemNew/adq/creative/index.tsx

@@ -55,8 +55,8 @@ function Creative(props: Props) {
     }) => {
         if (!params.adcreativeName || params.adcreativeName !== listAjax?.params[0]?.adcreativeName) {
             !params.adcreativeName && delete params.adcreativeName
-            listAjax.run({ ...params, userId })
         }
+        listAjax.run({ ...params, userId })
     }, [userId, listAjax])
     // 同步 
     const sync = useCallback(() => {

+ 2 - 2
src/pages/launchSystemNew/adq/index.tsx

@@ -178,8 +178,8 @@ function Adq() {
         </div>}
         <div className={style.right} style={!hide ? { width: 'calc(100% - 150px)' } : { width: '100%' }}>
             <div className={style.hiddenBtn}><Button size='small' type="primary" onClick={() => setHide(!hide)} icon={!hide ? <MenuFoldOutlined /> : <MenuUnfoldOutlined />} /></div>
-            <Card>
-                <Tabs activeKey={activeKey} type="card" onChange={(activeKey) => { setActiveKey(activeKey) }} tabBarExtraContent={<>
+            <Card bodyStyle={{ padding: '12px 16px' }}>
+                <Tabs activeKey={activeKey} size="small" type="card" onChange={(activeKey) => { setActiveKey(activeKey) }} tabBarExtraContent={<>
                     {/* <Select
                     placeholder='广点通账号'
                     style={{ minWidth: 200 }}

+ 1 - 1
src/pages/launchSystemNew/adq/landingPage/index.tsx

@@ -34,8 +34,8 @@ function LandingPage(props: { accountId: string, adAccountId: string, userId: st
     }) => {
         if (!params.pageName || params.pageName !== listAjax?.params[0]?.pageName) {
             !params.pageName && delete params.pageName
-            listAjax.run({ ...params, userId })
         }
+        listAjax.run({ ...params, userId })
     }, [listAjax, userId])
     // 同步 
     const sync = useCallback(() => {

+ 1 - 1
src/pages/launchSystemNew/adq/targeting/index.tsx

@@ -29,8 +29,8 @@ function Targeting(props: { adAccountId: any, userId: string, accountId: any, ta
         console.log(accountId)
         if (!params.targetingName || params.targetingName !== listAjax?.params[0]?.targetingName) {
             !params.targetingName && delete params.targetingName
-            listAjax.run({ ...params, userId })
         }
+        listAjax.run({ ...params, userId })
     }, [listAjax, userId])
     // 同步 
     const sync = useCallback(() => {

+ 3 - 5
src/pages/launchSystemNew/components/TableData/index.tsx

@@ -47,11 +47,10 @@ interface Prosp {
     bodyStyle?: any
     gutter?: any
     isCard?: boolean
-    handleSave?: (row: DataType) => void
 }
 
 function TableData(props: Prosp) {
-    const { isZj, scroll, columns, title, dataSource, expandedRowRender, className, isCard = true, leftChild, handleSave, page = undefined, rowSelection = false, pageSize = undefined, size = 'small', fixed = { left: 0, right: 1 }, total = 0, loading = false, onChange, config, configName, ajax, syncAjax, hoverable = true, myKey, gutter = [0, 20] } = props
+    const { isZj, scroll, columns, title, dataSource, expandedRowRender, className, isCard = true, leftChild, page = undefined, rowSelection = false, pageSize = undefined, size = 'small', fixed = { left: 0, right: 1 }, total = 0, loading = false, onChange, config, configName, ajax, syncAjax, hoverable = true, myKey, gutter = [0, 20] } = props
     const { state: userState } = useModel('useOperating.useUser')
     const { isFell } = userState
     const [visible, setVisible] = useState<boolean>(false)
@@ -253,7 +252,7 @@ function TableData(props: Prosp) {
                 </Row>
             </Card> : <Row gutter={gutter}>
                 {header}
-                <Tab {...{ size, newColumns, handelResize, className, isZj, rowSelection, columns, loading, handleSave, scroll, isFell, page, pageSize, dataSource, onChange, expandedRowRender, total, ajax, myKey }} />
+                <Tab {...{ size, newColumns, handelResize, className, isZj, rowSelection, columns, loading, scroll, isFell, page, pageSize, dataSource, onChange, expandedRowRender, total, ajax, myKey }} />
             </Row>}
         </Col>
     </Row >
@@ -264,7 +263,7 @@ function TableData(props: Prosp) {
 
 /**表格 */
 const Tab = React.memo((props: any) => {
-    const { size, newColumns, className, handelResize, columns, scroll, loading, handleSave, rowSelection, isFell, page, pageSize, dataSource, onChange, expandedRowRender, total, ajax, myKey } = props
+    const { size, newColumns, className, handelResize, columns, scroll, loading, rowSelection, isFell, page, pageSize, dataSource, onChange, expandedRowRender, total, ajax, myKey } = props
     return < Col span={24} >
         <div className={`${style[size]} ${className ? style[className] : ''} `}>
             {dataSource || !ajax?.loading ? <Tables
@@ -286,7 +285,6 @@ const Tab = React.memo((props: any) => {
                 rowSelection={rowSelection}
                 handelResize={((columns: any) => handelResize(columns))}
                 myKey={myKey}
-                handleSave={handleSave}
             /> : <div className={style.example}>
                 <Spin />
             </div>}

+ 6 - 0
src/pages/launchSystemNew/launchManage/createAd/creativeCL/modal/config.ts

@@ -54,6 +54,12 @@ export const creativeConfig = {
       'OPTION_CREATIVE_OVERRIDE_CANVAS',
     ],
   },
+  2106: {
+    overrideCanvasHeadOption: [
+      'OPTION_CANVAS_OVERRIDE_CREATIVE',
+      'OPTION_CREATIVE_OVERRIDE_CANVAS',
+    ],
+  },
   721: {
     //保持一致,替换
     overrideCanvasHeadOption: [