|
@@ -1,4 +1,17 @@
|
|
-import React from "react"
|
|
|
|
|
|
+import React, { useEffect, useRef, useState } from "react"
|
|
|
|
+import '../../tencentAdPutIn/index.less'
|
|
|
|
+import { Button, Card, DatePicker, Dropdown, Input, Pagination, Select, Space, Spin, Table, Tabs } from "antd"
|
|
|
|
+import { getCreativeComponentListApi, GetCreativeComponentProps } from "@/services/adqV3/global"
|
|
|
|
+import './index.less'
|
|
|
|
+import { PlusOutlined } from "@ant-design/icons"
|
|
|
|
+import { useAjax } from "@/Hook/useAjax"
|
|
|
|
+import SelectAdAccount from "@/components/SelectAdAccount"
|
|
|
|
+import { COMMON_POTENTIAL_STATUS_ENUM, COMPONENT_GENERATION_TYPE_ENUM, DEFAULT_COMPONENT_SUB_IMAGE_TYPE, DEFAULT_COMPONENT_SUB_SHOW_IMAGE, DEFAULT_COMPONENT_SUB_SHOW_VIDEO, DEFAULT_COMPONENT_SUB_VIDEO_TYPE } from "./const"
|
|
|
|
+import moment from "moment"
|
|
|
|
+import { useDebounce, useSize } from "ahooks"
|
|
|
|
+import TableConfig from "./tableConfig"
|
|
|
|
+const COMPONENT_SUB_IMAGE_ENUM = DEFAULT_COMPONENT_SUB_IMAGE_TYPE.map(item => item.value)
|
|
|
|
+const COMPONENT_SUB_VIDEO_ENUM = DEFAULT_COMPONENT_SUB_VIDEO_TYPE.map(item => item.value)
|
|
|
|
|
|
/**
|
|
/**
|
|
* 创意组件
|
|
* 创意组件
|
|
@@ -6,9 +19,180 @@ import React from "react"
|
|
*/
|
|
*/
|
|
const ManageComponent: React.FC = () => {
|
|
const ManageComponent: React.FC = () => {
|
|
|
|
|
|
|
|
+ /*************************************/
|
|
|
|
+ const [queryParams, setQueryParams] = React.useState<GetCreativeComponentProps>({ pageNum: 1, pageSize: 20, activeKey: 'IMAGE' })
|
|
|
|
+ const [idSting, setIdSting] = useState<string>();
|
|
|
|
+ const debouncedIdSting = useDebounce(idSting, { wait: 500 });
|
|
|
|
+ const ref = useRef<HTMLDivElement>(null);
|
|
|
|
+ const size = useSize(ref);
|
|
|
|
|
|
- return <div>
|
|
|
|
- 111111111111111
|
|
|
|
|
|
+ const getCreativeComponentList = useAjax((params) => getCreativeComponentListApi(params))
|
|
|
|
+ /*************************************/
|
|
|
|
+
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ if (queryParams?.adAccountId) {
|
|
|
|
+ const { activeKey, componentSubType, ...params } = queryParams
|
|
|
|
+ if (debouncedIdSting) {
|
|
|
|
+ params[activeKey === 'IMAGE' ? 'imageId' : 'videoId'] = debouncedIdSting.split(/[,,\n\s]+/ig).filter((item: any) => item)
|
|
|
|
+ } else {
|
|
|
|
+ delete params?.[activeKey === 'IMAGE' ? 'imageId' : 'videoId']
|
|
|
|
+ }
|
|
|
|
+ getCreativeComponentList.run({ ...params, componentSubType: componentSubType || (activeKey === 'IMAGE' ? DEFAULT_COMPONENT_SUB_SHOW_IMAGE : DEFAULT_COMPONENT_SUB_SHOW_VIDEO) })
|
|
|
|
+ }
|
|
|
|
+ }, [queryParams, debouncedIdSting])
|
|
|
|
+
|
|
|
|
+ return <div className="manageComponent">
|
|
|
|
+ <Card
|
|
|
|
+ className="cardResetCss"
|
|
|
|
+ bodyStyle={{ paddingBottom: 0, paddingTop: 0 }}
|
|
|
|
+ >
|
|
|
|
+ <Space size={40}>
|
|
|
|
+ <Tabs
|
|
|
|
+ items={[
|
|
|
|
+ { label: '图片', key: 'IMAGE', children: false },
|
|
|
|
+ { label: '视频', key: 'VIDEO', children: false }
|
|
|
|
+ ]}
|
|
|
|
+ activeKey={queryParams?.activeKey}
|
|
|
|
+ onChange={(e) => {
|
|
|
|
+ setQueryParams({
|
|
|
|
+ ...queryParams,
|
|
|
|
+ activeKey: e
|
|
|
|
+ })
|
|
|
|
+ }}
|
|
|
|
+
|
|
|
|
+ />
|
|
|
|
+ <SelectAdAccount
|
|
|
|
+ isReturnFirstValue
|
|
|
|
+ value={queryParams?.adAccountId ? [queryParams.adAccountId] : undefined}
|
|
|
|
+ type="radio"
|
|
|
|
+ onChange={(value) => {
|
|
|
|
+ setQueryParams({
|
|
|
|
+ ...queryParams,
|
|
|
|
+ adAccountId: value as number,
|
|
|
|
+ })
|
|
|
|
+ }}
|
|
|
|
+ allowClear={false}
|
|
|
|
+ />
|
|
|
|
+ </Space>
|
|
|
|
+ </Card>
|
|
|
|
+ <Card
|
|
|
|
+ className="cardResetCss"
|
|
|
|
+ style={{ flex: 1, overflow: 'hidden' }}
|
|
|
|
+ bodyStyle={{
|
|
|
|
+ height: '100%',
|
|
|
|
+ overflow: 'hidden',
|
|
|
|
+ display: 'flex',
|
|
|
|
+ flexDirection: 'column',
|
|
|
|
+ width: '100%',
|
|
|
|
+ padding: 0
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+ <div className="manageComponent-header">
|
|
|
|
+ <Button icon={<PlusOutlined />} type="primary">新建组件</Button>
|
|
|
|
+ <Input.TextArea
|
|
|
|
+ style={{ width: 160 }}
|
|
|
|
+ value={idSting}
|
|
|
|
+ rows={1}
|
|
|
|
+ placeholder="素材ID(多个,,空格换行)"
|
|
|
|
+ allowClear
|
|
|
|
+ onChange={(e) => setIdSting(e.target.value)}
|
|
|
|
+ />
|
|
|
|
+ <Select
|
|
|
|
+ showSearch
|
|
|
|
+ placeholder="二级组件类型"
|
|
|
|
+ filterOption={(input, option) =>
|
|
|
|
+ ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
|
|
|
|
+ }
|
|
|
|
+ style={{ minWidth: 160 }}
|
|
|
|
+ maxTagCount={1}
|
|
|
|
+ mode="multiple"
|
|
|
|
+ allowClear
|
|
|
|
+ value={queryParams?.componentSubType}
|
|
|
|
+ onChange={(e) => {
|
|
|
|
+ setQueryParams({ ...queryParams, componentSubType: e, pageNum: 1 })
|
|
|
|
+ }}
|
|
|
|
+ options={queryParams?.activeKey === 'IMAGE' ? DEFAULT_COMPONENT_SUB_IMAGE_TYPE : DEFAULT_COMPONENT_SUB_VIDEO_TYPE}
|
|
|
|
+ />
|
|
|
|
+ <Select
|
|
|
|
+ showSearch
|
|
|
|
+ placeholder="已删除?"
|
|
|
|
+ filterOption={(input, option) =>
|
|
|
|
+ ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
|
|
|
|
+ }
|
|
|
|
+ style={{ width: 120 }}
|
|
|
|
+ value={queryParams?.isDeleted}
|
|
|
|
+ allowClear
|
|
|
|
+ onChange={(e) => {
|
|
|
|
+ setQueryParams({ ...queryParams, isDeleted: e, pageNum: 1 })
|
|
|
|
+ }}
|
|
|
|
+ options={[
|
|
|
|
+ { label: '已删除', value: true },
|
|
|
|
+ { label: '未删除', value: false }
|
|
|
|
+ ]}
|
|
|
|
+ />
|
|
|
|
+ <Select
|
|
|
|
+ showSearch
|
|
|
|
+ placeholder="组件潜力"
|
|
|
|
+ filterOption={(input, option) =>
|
|
|
|
+ ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
|
|
|
|
+ }
|
|
|
|
+ style={{ minWidth: 120 }}
|
|
|
|
+ maxTagCount={1}
|
|
|
|
+ mode="multiple"
|
|
|
|
+ value={queryParams?.potentialStatus}
|
|
|
|
+ onChange={(e) => {
|
|
|
|
+ setQueryParams({ ...queryParams, potentialStatus: e, pageNum: 1 })
|
|
|
|
+ }}
|
|
|
|
+ options={Object.keys(COMMON_POTENTIAL_STATUS_ENUM).map(key => ({ label: COMMON_POTENTIAL_STATUS_ENUM[key as keyof typeof COMMON_POTENTIAL_STATUS_ENUM], value: key }))}
|
|
|
|
+ />
|
|
|
|
+ <Select
|
|
|
|
+ showSearch
|
|
|
|
+ placeholder="来源"
|
|
|
|
+ filterOption={(input, option) =>
|
|
|
|
+ ((option?.label ?? '') as any).toLowerCase().includes(input.toLowerCase())
|
|
|
|
+ }
|
|
|
|
+ style={{ minWidth: 120 }}
|
|
|
|
+ maxTagCount={1}
|
|
|
|
+ mode="multiple"
|
|
|
|
+ value={queryParams?.generationType}
|
|
|
|
+ onChange={(e) => {
|
|
|
|
+ setQueryParams({ ...queryParams, generationType: e, pageNum: 1 })
|
|
|
|
+ }}
|
|
|
|
+ options={Object.keys(COMPONENT_GENERATION_TYPE_ENUM).map(key => ({ label: COMPONENT_GENERATION_TYPE_ENUM[key as keyof typeof COMPONENT_GENERATION_TYPE_ENUM], value: key }))}
|
|
|
|
+ />
|
|
|
|
+ <DatePicker.RangePicker
|
|
|
|
+ placeholder={['创建时间开始', '创建时间结束']}
|
|
|
|
+ value={queryParams?.createTimeMin && queryParams?.createTimeMax ? [moment(queryParams?.createTimeMin), moment(queryParams?.createTimeMax)] as any : undefined}
|
|
|
|
+ onChange={(_, option) => setQueryParams({ ...queryParams, createTimeMin: option[0], createTimeMax: option[1], pageNum: 1 })}
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ <div className="manageComponent-content" ref={ref}>
|
|
|
|
+ <Table
|
|
|
|
+ columns={TableConfig(queryParams?.activeKey as any)}
|
|
|
|
+ dataSource={getCreativeComponentList.data?.records || []}
|
|
|
|
+ loading={getCreativeComponentList.loading}
|
|
|
|
+ scroll={{ x: 1000, y: (size?.height || 0) - 36 }}
|
|
|
|
+ pagination={false}
|
|
|
|
+ size="small"
|
|
|
|
+ bordered
|
|
|
|
+ rowKey="componentId"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ <div className="manageComponent-footer">
|
|
|
|
+ <Pagination
|
|
|
|
+ size="small"
|
|
|
|
+ total={getCreativeComponentList?.data?.total || 0}
|
|
|
|
+ showSizeChanger
|
|
|
|
+ showQuickJumper
|
|
|
|
+ pageSize={getCreativeComponentList?.data?.size || 30}
|
|
|
|
+ current={getCreativeComponentList?.data?.current || 1}
|
|
|
|
+ onChange={(page: number, pageSize: number) => {
|
|
|
|
+ ref.current?.querySelector('.ant-table-body')?.scrollTo({ top: 0 })
|
|
|
|
+ setTimeout(() => setQueryParams({ ...queryParams, pageNum: page, pageSize }), 50)
|
|
|
|
+ }}
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ </Card>
|
|
</div>
|
|
</div>
|
|
}
|
|
}
|
|
|
|
|