|
@@ -1,13 +1,12 @@
|
|
|
import { CloseCircleOutlined, DeleteOutlined, PlusOutlined } from "@ant-design/icons"
|
|
|
-import { Button, Card, Dropdown, Empty, Form, InputNumber, Menu, Modal, Popconfirm, Space, message } from "antd"
|
|
|
+import { Button, Card, Dropdown, Empty, Form, InputNumber, Modal, Popconfirm, Space, message } from "antd"
|
|
|
import React, { useEffect, useState } from "react"
|
|
|
import styles from './index.less'
|
|
|
import VideoNews from "@/pages/launchSystemNew/components/newsModal/videoNews"
|
|
|
-import { useModel } from "umi"
|
|
|
-import SelectCloud from "@/pages/launchSystemNew/components/selectCloud"
|
|
|
import { chunkArray1, getVideoImgUrl } from "@/utils/utils"
|
|
|
import VideoFrameSelect from "@/pages/launchSystemV3/components/VideoFrameSelect"
|
|
|
import New1Radio from "@/pages/launchSystemV3/components/New1Radio"
|
|
|
+import SelectCloudNew from "@/pages/launchSystemV3/material/cloudNew/selectCloudNew"
|
|
|
|
|
|
interface Props {
|
|
|
adLength: number,
|
|
@@ -23,8 +22,6 @@ interface Props {
|
|
|
const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, deliveryMode, visible, value, onChange, onClose, adLength }) => {
|
|
|
|
|
|
/*********************************/
|
|
|
- const { init } = useModel('useLaunchAdq.useBdMediaPup')
|
|
|
-
|
|
|
const [form] = Form.useForm();
|
|
|
const dynamicGroup = Form.useWatch('dynamicGroup', form)
|
|
|
const mediaType = Form.useWatch('mediaType', form)
|
|
@@ -52,6 +49,18 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
const [imgUploads, setImgUploads] = useState<any>()
|
|
|
const [minNumber, setMinNumber] = useState<number>(3)
|
|
|
const [mCount, setMCount] = useState<number>(1)
|
|
|
+ const [selectCloudData, setSelectCloudData] = useState<{
|
|
|
+ defaultParams: {
|
|
|
+ sizeQueries?: {
|
|
|
+ width: number,
|
|
|
+ height: number,
|
|
|
+ relation: string
|
|
|
+ }[],
|
|
|
+ materialType: 'image' | 'video'
|
|
|
+ fileSize: number
|
|
|
+ }
|
|
|
+ num: number
|
|
|
+ }>()
|
|
|
/*********************************/
|
|
|
|
|
|
useEffect(() => {
|
|
@@ -103,13 +112,6 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
|
|
|
const handleOk = (values: any) => {
|
|
|
const { mediaType, dynamicGroup } = values
|
|
|
- // if (mediaType === 1 && dynamicGroup.length < adLength) {
|
|
|
- // message.error({
|
|
|
- // content: `创意组分配规则选择“平均分配到广告”时,创意组总数必须大于等于广告总数。当前广告总数:${adLength},创意组总数:${dynamicGroup.length}`,
|
|
|
- // duration: 8
|
|
|
- // })
|
|
|
- // return
|
|
|
- // }
|
|
|
if (mediaType === 2 && dynamicGroup.length > adLength) {
|
|
|
message.error({
|
|
|
content: `创意组分配规则选择“顺序分配到广告”时,创意组总数必须小于等于广告总数。当前广告总数:${adLength},创意组总数:${dynamicGroup.length}`,
|
|
@@ -140,7 +142,7 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
}
|
|
|
|
|
|
const selectGroupImg = (index: number, num: number) => {
|
|
|
- init({ mediaType: 'IMG', num, cloudSize: [[{ relation: '=', width: 800, height: 800 }]], maxSize: 400 * 1024 })
|
|
|
+ setSelectCloudData({ defaultParams: { sizeQueries: [{ width: 800, height: 800, relation: '=' }], fileSize: 400 * 1024, materialType: 'image' }, num })
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
|
type: 'image',
|
|
@@ -174,7 +176,7 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
<strong style={{ fontSize: 20 }}>创意素材</strong>
|
|
|
{deliveryMode === 'DELIVERY_MODE_CUSTOMIZE' ? <>
|
|
|
{videoUploads && Object.keys(videoUploads)?.length > 0 && <Button type="link" onClick={() => {
|
|
|
- init({ mediaType: 'VIDEO', num: 100, cloudSize: creativeTemplateId === 1708 ? [[{ relation: '>=', width: 1280, height: 720 }]] : [[{ relation: '>=', width: videoUploads.restriction.videoRestriction.minWidth, height: videoUploads.restriction.videoRestriction.minHeight }]], maxSize: videoUploads.restriction.videoRestriction.fileSize * 1024 })
|
|
|
+ setSelectCloudData({ defaultParams: { sizeQueries: creativeTemplateId === 1708 ? [{ relation: '>=', width: 1280, height: 720 }] : [{ relation: '>=', width: videoUploads.restriction.videoRestriction.minWidth, height: videoUploads.restriction.videoRestriction.minHeight }], fileSize: videoUploads.restriction.videoRestriction.fileSize * 1024, materialType: 'video' }, num: 100 })
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
|
type: videoUploads.name,
|
|
@@ -187,7 +189,7 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
}, 100)
|
|
|
}}>批量添加视频素材</Button>}
|
|
|
{imgUploads && Object.keys(imgUploads)?.length > 0 && <Button type="link" onClick={() => {
|
|
|
- init({ mediaType: 'IMG', num: 100, cloudSize: [[{ relation: '=', width: imgUploads.restriction.imageRestriction.width, height: imgUploads.restriction.imageRestriction.height }]], maxSize: imgUploads.restriction.imageRestriction.fileSize * 1024 })
|
|
|
+ setSelectCloudData({ defaultParams: { sizeQueries: [{ relation: '=', width: imgUploads.restriction.imageRestriction.width, height: imgUploads.restriction.imageRestriction.height }], fileSize: imgUploads.restriction.imageRestriction.fileSize * 1024, materialType: 'image' }, num: 100 })
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
|
type: imgUploads.name,
|
|
@@ -202,14 +204,19 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
</> : <>
|
|
|
<InputNumber size="small" min={1} style={{ width: 50 }} value={mCount} max={15} onChange={(e) => setMCount(e || 0)} />
|
|
|
<Button type="link" onClick={() => {
|
|
|
- init({
|
|
|
- mediaType: 'IMG', num: 100, cloudSize: [[
|
|
|
- { relation: '=', width: 800, height: 800 },
|
|
|
- { relation: '=', width: 1280, height: 720 },
|
|
|
- { relation: '=', width: 720, height: 1280 },
|
|
|
- { relation: '=', width: 960, height: 334 },
|
|
|
- { relation: '=', width: 480, height: 320 },
|
|
|
- ]], maxSize: 400 * 1024
|
|
|
+ setSelectCloudData({
|
|
|
+ num: 100,
|
|
|
+ defaultParams: {
|
|
|
+ materialType: 'image',
|
|
|
+ sizeQueries: [
|
|
|
+ { relation: '=', width: 800, height: 800 },
|
|
|
+ { relation: '=', width: 1280, height: 720 },
|
|
|
+ { relation: '=', width: 720, height: 1280 },
|
|
|
+ { relation: '=', width: 960, height: 334 },
|
|
|
+ { relation: '=', width: 480, height: 320 },
|
|
|
+ ],
|
|
|
+ fileSize: 400 * 1024
|
|
|
+ }
|
|
|
})
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
@@ -224,11 +231,16 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
}, 100)
|
|
|
}}>批量添加图片素材</Button>
|
|
|
<Button type="link" onClick={() => {
|
|
|
- init({
|
|
|
- mediaType: 'VIDEO', num: 100, cloudSize: [[
|
|
|
- { relation: '>=', width: 1280, height: 720 },
|
|
|
- { relation: '>=', width: 720, height: 1280 }
|
|
|
- ]], maxSize: 512000 * 1024
|
|
|
+ setSelectCloudData({
|
|
|
+ num: 100,
|
|
|
+ defaultParams: {
|
|
|
+ materialType: 'video',
|
|
|
+ sizeQueries: [
|
|
|
+ { relation: '>=', width: 1280, height: 720 },
|
|
|
+ { relation: '>=', width: 720, height: 1280 }
|
|
|
+ ],
|
|
|
+ fileSize: 512000 * 1024
|
|
|
+ }
|
|
|
})
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
@@ -305,11 +317,16 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
label: '添加视频',
|
|
|
key: 'addVideo',
|
|
|
onClick: () => {
|
|
|
- init({
|
|
|
- mediaType: 'VIDEO', num: 15, cloudSize: [[
|
|
|
- { relation: '>=', width: 1280, height: 720 },
|
|
|
- { relation: '>=', width: 720, height: 1280 }
|
|
|
- ]], maxSize: 512000 * 1024
|
|
|
+ setSelectCloudData({
|
|
|
+ num: 15 - (dynamicGroup?.[num]?.['list']?.length || 0),
|
|
|
+ defaultParams: {
|
|
|
+ materialType: 'video',
|
|
|
+ sizeQueries: [
|
|
|
+ { relation: '>=', width: 1280, height: 720 },
|
|
|
+ { relation: '>=', width: 720, height: 1280 }
|
|
|
+ ],
|
|
|
+ fileSize: 512000 * 1024
|
|
|
+ }
|
|
|
})
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
@@ -328,14 +345,19 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
label: '添加图片',
|
|
|
key: 'addImg',
|
|
|
onClick: () => {
|
|
|
- init({
|
|
|
- mediaType: 'IMG', num: 15, cloudSize: [[
|
|
|
- { relation: '=', width: 800, height: 800 },
|
|
|
- { relation: '=', width: 1280, height: 720 },
|
|
|
- { relation: '=', width: 720, height: 1280 },
|
|
|
- { relation: '=', width: 960, height: 334 },
|
|
|
- { relation: '=', width: 480, height: 320 },
|
|
|
- ]], maxSize: 400 * 1024
|
|
|
+ setSelectCloudData({
|
|
|
+ num: 15 - (dynamicGroup?.[num]?.['list']?.length || 0),
|
|
|
+ defaultParams: {
|
|
|
+ materialType: 'image',
|
|
|
+ sizeQueries: [
|
|
|
+ { relation: '=', width: 800, height: 800 },
|
|
|
+ { relation: '=', width: 1280, height: 720 },
|
|
|
+ { relation: '=', width: 720, height: 1280 },
|
|
|
+ { relation: '=', width: 960, height: 334 },
|
|
|
+ { relation: '=', width: 480, height: 320 },
|
|
|
+ ],
|
|
|
+ fileSize: 400 * 1024
|
|
|
+ }
|
|
|
})
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
@@ -393,7 +415,14 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
key={k}
|
|
|
>
|
|
|
<div className={`${styles.box} ${styles.video}`} style={{ width: 300, height: 160 }} onClick={() => {
|
|
|
- init({ mediaType: 'VIDEO', cloudSize: creativeTemplateId === 1708 ? [[{ relation: '>=', width: 1280, height: 720 }]] : [[{ relation: '>=', width: item.restriction.videoRestriction.minWidth, height: item.restriction.videoRestriction.minHeight }]], maxSize: item.restriction.videoRestriction.fileSize * 1024 })
|
|
|
+ setSelectCloudData({
|
|
|
+ num: 1,
|
|
|
+ defaultParams: {
|
|
|
+ materialType: 'video',
|
|
|
+ sizeQueries: creativeTemplateId === 1708 ? [{ relation: '>=', width: 1280, height: 720 }] : [{ relation: '>=', width: item.restriction.videoRestriction.minWidth, height: item.restriction.videoRestriction.minHeight }],
|
|
|
+ fileSize: item.restriction.videoRestriction.fileSize * 1024
|
|
|
+ }
|
|
|
+ })
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
|
type: item.name,
|
|
@@ -424,7 +453,14 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
>
|
|
|
<Space align="end">
|
|
|
<div className={`${styles.box} ${styles.image}`} style={{ width: 300, height: 160 }} onClick={() => {
|
|
|
- init({ mediaType: 'IMG', cloudSize: [[{ relation: '=', width: item.restriction.imageRestriction.width, height: item.restriction.imageRestriction.height }]], maxSize: item.restriction.imageRestriction.fileSize * 1024 })
|
|
|
+ setSelectCloudData({
|
|
|
+ num: 1,
|
|
|
+ defaultParams: {
|
|
|
+ materialType: 'image',
|
|
|
+ sizeQueries: [{ relation: '=', width: item.restriction.imageRestriction.width, height: item.restriction.imageRestriction.height }],
|
|
|
+ fileSize: item.restriction.imageRestriction.fileSize * 1024
|
|
|
+ }
|
|
|
+ })
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
|
type: item.name,
|
|
@@ -471,7 +507,14 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
key={key}
|
|
|
>
|
|
|
<div className={`${styles.box} ${item.arrayProperty.maxNumber >= 3 ? styles.image_list : styles.imageMater}`} style={item.arrayProperty.maxNumber >= 3 ? { flexFlow: 'row', width: '100%', gap: 2 } : {}} onClick={() => {
|
|
|
- init({ mediaType: 'IMG', num: item.arrayProperty.maxNumber, cloudSize: [[{ relation: '=', width: imageData.restriction.imageRestriction.width, height: imageData.restriction.imageRestriction.height }]], maxSize: imageData.restriction.imageRestriction.fileSize * 1024 })
|
|
|
+ setSelectCloudData({
|
|
|
+ num: item.arrayProperty.maxNumber,
|
|
|
+ defaultParams: {
|
|
|
+ materialType: 'image',
|
|
|
+ sizeQueries: [{ relation: '=', width: imageData.restriction.imageRestriction.width, height: imageData.restriction.imageRestriction.height }],
|
|
|
+ fileSize: imageData.restriction.imageRestriction.fileSize * 1024
|
|
|
+ }
|
|
|
+ })
|
|
|
setMaterialConfig({
|
|
|
...materialConfig,
|
|
|
type: name,
|
|
@@ -566,17 +609,20 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
</Form.Item>
|
|
|
</Form>
|
|
|
|
|
|
-
|
|
|
- {/* 选择视频素材 */}
|
|
|
- {selectVideoVisible && <SelectCloud
|
|
|
- isGroup={materialConfig?.isGroup}
|
|
|
+ {/* 选择素材 */}
|
|
|
+ {(selectVideoVisible && selectCloudData) && <SelectCloudNew
|
|
|
+ {...selectCloudData}
|
|
|
visible={selectVideoVisible}
|
|
|
- onClose={() => setSelectVideoVisible(false)}
|
|
|
+ isGroup={materialConfig?.isGroup}
|
|
|
sliderImgContent={materialConfig.index === 99999 ? undefined :
|
|
|
- materialConfig.type === 'element_story' ? (dynamicGroup[materialConfig.index] && Object.keys(dynamicGroup[materialConfig.index])?.includes('element_story')) ? dynamicGroup[materialConfig.index]['element_story']?.map((item: any) => item) : undefined :
|
|
|
- materialConfig.type === 'image_list' ? (dynamicGroup[materialConfig.index] && Object.keys(dynamicGroup[materialConfig.index])?.includes('image_list')) ? dynamicGroup[materialConfig.index]['image_list']?.map((item: any) => item) : undefined :
|
|
|
- (dynamicGroup[materialConfig.index] && Object.keys(dynamicGroup[materialConfig.index])?.includes(materialConfig.type)) ? [{ url: dynamicGroup[materialConfig.index][materialConfig.type] }] : undefined
|
|
|
+ materialConfig.type === 'element_story' ? (dynamicGroup[materialConfig.index] && Object.keys(dynamicGroup[materialConfig.index])?.includes('element_story')) ? dynamicGroup[materialConfig.index]['element_story']?.map((item: any) => ({ oss_url: item.url, id: item.id })) : undefined :
|
|
|
+ materialConfig.type === 'image_list' ? (dynamicGroup[materialConfig.index] && Object.keys(dynamicGroup[materialConfig.index])?.includes('image_list')) ? dynamicGroup[materialConfig.index]['image_list']?.map((item: any) => ({ oss_url: item.url, id: item.id })) : undefined :
|
|
|
+ (dynamicGroup[materialConfig.index] && Object.keys(dynamicGroup[materialConfig.index])?.includes(materialConfig.type)) ? [{ oss_url: dynamicGroup[materialConfig.index][materialConfig.type]['url'], id: dynamicGroup[materialConfig.index][materialConfig.type]['id'] }] : undefined
|
|
|
}
|
|
|
+ onClose={() => {
|
|
|
+ setSelectVideoVisible(false)
|
|
|
+ setSelectCloudData(undefined)
|
|
|
+ }}
|
|
|
onChange={(content: any) => {
|
|
|
if (content.length > 0) {
|
|
|
if (deliveryMode === 'DELIVERY_MODE_COMPONENT') { // 组件化创意
|
|
@@ -584,7 +630,7 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
if (materialConfig.isGroup) {
|
|
|
|
|
|
} else {
|
|
|
- const aContent = content.map((m: any) => ({ id: m?.id, url: m?.url, materialType: 0 }))
|
|
|
+ const aContent = content.map((m: any) => ({ id: m?.id, url: m?.oss_url, materialType: 0 }))
|
|
|
let newDynamicGroup = dynamicGroup?.map((item: any) => {
|
|
|
let oldList = item?.list || []
|
|
|
if (oldList.length < mCount) {
|
|
@@ -608,10 +654,10 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
if (materialConfig.index === index) {
|
|
|
let oldList = item?.list || []
|
|
|
if (materialConfig.isGroup) {
|
|
|
- oldList = oldList.concat([content.map((m: any) => ({ id: m?.id, url: m?.url, materialType: 0 }))])
|
|
|
+ oldList = oldList.concat([content.map((m: any) => ({ id: m?.id, url: m?.oss_url, materialType: 0 }))])
|
|
|
return { list: oldList }
|
|
|
} else {
|
|
|
- oldList = oldList.concat(content.map((m: any) => ({ id: m?.id, url: m?.url, materialType: 0 })))
|
|
|
+ oldList = oldList.concat(content.map((m: any) => ({ id: m?.id, url: m?.oss_url, materialType: 0 })))
|
|
|
return { list: oldList }
|
|
|
}
|
|
|
}
|
|
@@ -622,7 +668,7 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
} else { // 自定义创意
|
|
|
if (materialConfig.index === 99999) {
|
|
|
if (materialConfig.type === 'image_list' || materialConfig.type === 'element_story') {
|
|
|
- let urls = content?.map((item: any) => ({ id: item?.id, url: item?.url, materialType: 0 }))
|
|
|
+ let urls = content?.map((item: any) => ({ id: item?.id, url: item?.oss_url, materialType: 0 }))
|
|
|
let max = materialConfig.max
|
|
|
let materialsNew = dynamicGroup.map((item: any) => {
|
|
|
let newItem = item || {}
|
|
@@ -670,9 +716,9 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
} else {
|
|
|
let newMaterials = content?.map((item: any) => {
|
|
|
if (["short_video1", 'video_id'].includes(materialConfig.type) && mLength === 2) {
|
|
|
- return { [materialConfig.type]: { url: item?.url, id: item?.id, materialType: 0 }, cover_id: { url: getVideoImgUrl(item?.url), id: null, materialType: 0 } }
|
|
|
+ return { [materialConfig.type]: { url: item?.oss_url, id: item?.id, materialType: 0 }, cover_id: { url: getVideoImgUrl(item?.oss_url), id: null, materialType: 0 } }
|
|
|
}
|
|
|
- return { [materialConfig.type]: { url: item?.url, id: item?.id, materialType: 0 } }
|
|
|
+ return { [materialConfig.type]: { url: item?.oss_url, id: item?.id, materialType: 0 } }
|
|
|
})
|
|
|
if (newMaterials.length > 0) {
|
|
|
if (dynamicGroup?.every((item: any) => !item)) { // 没设置过
|
|
@@ -703,20 +749,20 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
if (materialConfig.index === index) {
|
|
|
if (materialConfig.type === 'image_list' || materialConfig.type === 'element_story') {
|
|
|
if (item) {
|
|
|
- item[materialConfig.type] = content?.map((item: any) => ({ id: item?.id, url: item?.url, materialType: 0 }))
|
|
|
+ item[materialConfig.type] = content?.map((item: any) => ({ id: item?.id, url: item?.oss_url, materialType: 0 }))
|
|
|
return { ...item }
|
|
|
} else {
|
|
|
- return { [materialConfig.type]: content?.map((item: any) => ({ id: item?.id, url: item?.url, materialType: 0 })) }
|
|
|
+ return { [materialConfig.type]: content?.map((item: any) => ({ id: item?.id, url: item?.oss_url, materialType: 0 })) }
|
|
|
}
|
|
|
} else {
|
|
|
if (item) {
|
|
|
- item[materialConfig.type] = { id: content[0]?.id, url: content[0]?.url, materialType: 0 }
|
|
|
+ item[materialConfig.type] = { id: content[0]?.id, url: content[0]?.oss_url, materialType: 0 }
|
|
|
return { ...item }
|
|
|
} else {
|
|
|
if (["short_video1", 'video_id'].includes(materialConfig.type) && mLength === 2) {
|
|
|
- return { [materialConfig.type]: { id: content[0]?.id, url: content[0]?.url, materialType: 0 }, cover_id: { id: null, url: getVideoImgUrl(content[0]?.url), materialType: 0 } }
|
|
|
+ return { [materialConfig.type]: { id: content[0]?.id, url: content[0]?.oss_url, materialType: 0 }, cover_id: { id: null, url: getVideoImgUrl(content[0]?.oss_url), materialType: 0 } }
|
|
|
}
|
|
|
- return { [materialConfig.type]: { id: content[0]?.id, url: content[0]?.url, materialType: 0 } }
|
|
|
+ return { [materialConfig.type]: { id: content[0]?.id, url: content[0]?.oss_url, materialType: 0 } }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -727,6 +773,7 @@ const AddMaterial: React.FC<Props> = ({ creativeTemplateId, materialData, delive
|
|
|
}
|
|
|
}
|
|
|
setSelectVideoVisible(false)
|
|
|
+ setSelectCloudData(undefined)
|
|
|
}}
|
|
|
/>}
|
|
|
</Modal>
|