diff --git a/src/assets/images/seller/selectCollectionNullStatus.png b/src/assets/images/seller/selectCollectionNullStatus.png new file mode 100644 index 00000000..56ecc260 Binary files /dev/null and b/src/assets/images/seller/selectCollectionNullStatus.png differ diff --git a/src/component/Administrator/allUser.vue b/src/component/Administrator/allUser.vue index 481ec0f6..97c47775 100644 --- a/src/component/Administrator/allUser.vue +++ b/src/component/Administrator/allUser.vue @@ -1,529 +1,585 @@ + + + + \ No newline at end of file + diff --git a/src/component/Administrator/subscriptionPlan.vue b/src/component/Administrator/subscriptionPlan.vue index 2ba9f564..a52a555e 100644 --- a/src/component/Administrator/subscriptionPlan.vue +++ b/src/component/Administrator/subscriptionPlan.vue @@ -1,1133 +1,1536 @@ diff --git a/src/lang/cn.ts b/src/lang/cn.ts index 3772aedb..7ecc8c7a 100644 --- a/src/lang/cn.ts +++ b/src/lang/cn.ts @@ -1737,7 +1737,7 @@ export default { GetStarted: '开始体验', }, SellerListEdit:{ - saveDraft: "保存草稿", + saveDraft: "全部保存", publish: "发布", sketch: "线稿图", mainProductImage: "产品主图", diff --git a/src/lang/en.ts b/src/lang/en.ts index 6a621158..2653c745 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -1788,7 +1788,7 @@ export default { GetStarted: 'Get Started', }, SellerListEdit:{ - saveDraft:'Save Draft', + saveDraft:'Save All New', publish:'Publish', sketch:'Sketch', mainProductImage:'Main Product Image', diff --git a/src/views/SellerDashboard/BrandProfile/image-clip-dialog.vue b/src/views/SellerDashboard/BrandProfile/image-clip-dialog.vue index 399f15c3..6fb34a98 100644 --- a/src/views/SellerDashboard/BrandProfile/image-clip-dialog.vue +++ b/src/views/SellerDashboard/BrandProfile/image-clip-dialog.vue @@ -144,7 +144,6 @@ const open = (url, callback, options, origin) => { coverOrigin.value = origin data.url = origin[0].url } - console.log("-------", origin) show.value = true } const onCancel = () => { diff --git a/src/views/SellerDashboard/BrandProfile/image-clip.vue b/src/views/SellerDashboard/BrandProfile/image-clip.vue index ffeb2f9f..189a1ec5 100644 --- a/src/views/SellerDashboard/BrandProfile/image-clip.vue +++ b/src/views/SellerDashboard/BrandProfile/image-clip.vue @@ -204,23 +204,23 @@ .cropper-box-canvas { background-color: #ffffff; - img { - height: 100%; - } + // img { + // height: 100%; + // } } } &.is-cover { :deep(.vue-cropper) { overflow: hidden; } - :deep(.cropper-box-canvas) { - width: 31.1rem !important; - left: 50% !important; - transform: translateX(-50%) !important; - img { - display: none; - } - } + // :deep(.cropper-box-canvas) { + // width: 31.1rem !important; + // left: 50% !important; + // transform: translateX(-50%) !important; + // img { + // display: none; + // } + // } } } diff --git a/src/views/SellerDashboard/MyListings/EditDetail/components/ApparelSketchList.vue b/src/views/SellerDashboard/MyListings/EditDetail/components/ApparelSketchList.vue new file mode 100644 index 00000000..af4230a2 --- /dev/null +++ b/src/views/SellerDashboard/MyListings/EditDetail/components/ApparelSketchList.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/src/views/SellerDashboard/MyListings/EditDetail/components/ListingForm.vue b/src/views/SellerDashboard/MyListings/EditDetail/components/ListingForm.vue new file mode 100644 index 00000000..a9791459 --- /dev/null +++ b/src/views/SellerDashboard/MyListings/EditDetail/components/ListingForm.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/src/views/SellerDashboard/MyListings/EditDetail/components/ProductImageList.vue b/src/views/SellerDashboard/MyListings/EditDetail/components/ProductImageList.vue new file mode 100644 index 00000000..e9c4c972 --- /dev/null +++ b/src/views/SellerDashboard/MyListings/EditDetail/components/ProductImageList.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/src/views/SellerDashboard/MyListings/EditDetail/components/Radio.vue b/src/views/SellerDashboard/MyListings/EditDetail/components/Radio.vue index c746dbe7..ff0b9322 100644 --- a/src/views/SellerDashboard/MyListings/EditDetail/components/Radio.vue +++ b/src/views/SellerDashboard/MyListings/EditDetail/components/Radio.vue @@ -8,7 +8,7 @@ 'radio-button', { 'is-active': multiple - ? selectedValues.includes(item.key) + ? selectedValues.includes(normalizeValue(item.key)) : modelValue === item.key } ]" @@ -20,54 +20,73 @@ diff --git a/src/views/SellerDashboard/MyListings/EditDetail/index.vue b/src/views/SellerDashboard/MyListings/EditDetail/index.vue index 5fc83dda..b1438021 100644 --- a/src/views/SellerDashboard/MyListings/EditDetail/index.vue +++ b/src/views/SellerDashboard/MyListings/EditDetail/index.vue @@ -28,191 +28,32 @@
-
-
-
- {{ $t(topImageTitleMap[type]) }} -
-
-
- -
- -
-
- -
- {{ $t("SellerListEdit.cropDesc") }} -
-
- -
-
-
-
-
-
-
- {{ - $t("SellerListEdit.productImageMainTitle") - }} - {{ - $t("SellerListEdit.productImageSubTitle") - }} -
-
- {{ selectedProdImgs }}/{{ prodImgList.length }} selected -
-
-
-
- - -
- main -
-
-
-
-
-
- {{ - $t("SellerListEdit.apparelSketchTitle") - }} - - {{ $t("SellerListEdit.apparelSketchSubTitle") }} -
-
-
- -
- -
-
-
-
+ + +
-
-
-
- {{ $t("SellerListEdit.productName") }} -
-
- -
-
-
-
{{ $t("SellerListEdit.price") }}
-
- HK$ - -
-
-
-
- {{ $t("SellerListEdit.productDescription") }} -
-
- -
-
-
-
- {{ $t("SellerListEdit.designFor") }} -
-
- -
-
-
-
- {{ $t("SellerListEdit.productCategory") }} - {{ $t("SellerListEdit.categoryTips") }} -
-
- -
-
-
- -
- {{ $t("SellerListEdit.policy") }} - {{ $t("SellerListEdit.learnMore") }} -
-
-
+
@@ -602,362 +528,10 @@ height: 0; } - .required { - &::after { - content: "*"; - color: #df2b2c; - margin-left: 0.4rem; - } - } - - .left { - // flex: 1; - // min-width: 0; - - .main-image-container { - // max-width: 80.2rem; - column-gap: 3.5rem; - .main-image-item { - flex-shrink: 0; - - .title { - font-size: 1.4rem; - margin-bottom: 0.8rem; - text-align: center; - } - - .sketch-item { - width: 11.6rem; - height: 20.4rem; - border: 0.15rem solid #d1d1d1; - border-radius: 1rem; - position: relative; - background-color: #f6f6f6; - overflow: hidden; - - &.cover { - width: 16.2rem; - background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' rx='11' ry='11' fill='none' stroke='%23D1D1D1' stroke-width='1.5' stroke-dasharray='8%2c 5' stroke-linecap='square'/%3e%3c/svg%3e"); - border: none; - } - - .crop-tool { - position: absolute; - top: 0.8rem; - right: 0.8rem; - width: 2rem; - height: 2rem; - border-radius: 50%; - background-color: #000000; - z-index: 1; - cursor: pointer; - } - - .sketch-img { - height: 100%; - &.sketch { - height: initial; - width: 100%; - } - } - - .trigger { - cursor: pointer; - height: 100%; - padding: 6rem 2rem 0; - &, - .cover-trigger { - row-gap: 1.2rem; - } - - .placeholder { - width: 2.4rem; - height: 2.4rem; - border-radius: 0.6rem; - background: linear-gradient(135deg, #efefef 0%, #cdcdcd 100%); - } - - .trigger-tips { - font-size: 1.2rem; - text-align: center; - color: #585858; - line-height: 1.3; - } - } - } - } - } - - .product-image-list-container { - margin-top: 3rem; - - .title { - font-size: 1.4rem; - margin-bottom: 1.2rem; - - .main-title { - font-weight: 400; - font-style: bold; - } - - .sub-title { - font-size: 1.2rem; - color: #999; - } - - .title-right { - color: #585858; - font-size: 1.4rem; - } - } - - .product-image-list { - overflow-x: auto; - overflow-y: hidden; - column-gap: 0.8rem; - max-width: 80.2rem; - padding-bottom: 1.2rem; - - &::-webkit-scrollbar { - height: 0.8rem; - } - - &::-webkit-scrollbar-track { - background: #d9d9d9; - border-radius: 0.8rem; - } - - &::-webkit-scrollbar-thumb { - background: #000000; - border-radius: 0.8rem; - } - - .product-image-item { - width: 11.6rem; - height: 20.6rem; - border-radius: 1rem; - border: 0.15rem solid #c7c7c7; - position: relative; - cursor: pointer; - overflow: hidden; - flex-shrink: 0; - - &::after { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - content: ""; - background-color: #fcfcfc; - opacity: 0.7; - border-radius: 1rem; - } - - &.selected { - border-color: #000; - - &::after { - display: none; - } - } - - .checked { - width: 2rem; - height: 2rem; - position: absolute; - top: 0.8rem; - right: 0.8rem; - z-index: 1; - } - - .img-src { - height: 100%; - } - - .main-pic { - position: absolute; - height: 2.4rem; - line-height: 2.4rem; - left: 0.8rem; - right: 0.8rem; - bottom: 0.8rem; - z-index: 1; - background: rgba(0, 0, 0, 0.8); - color: #fff; - font-size: 1.4rem; - border-radius: 1.2rem; - text-align: center; - } - } - } - } - - .apparel-container { - margin-top: 3rem; - - .title { - font-size: 1.4rem; - margin-bottom: 0.8rem; - - .main-title { - font-weight: 400; - font-style: bold; - - &::after { - content: "*"; - color: #df2b2c; - } - } - - .sub-title { - font-size: 1.2rem; - color: #999; - } - } - - .sketch-list-container { - column-gap: 1rem; - flex-wrap: wrap; - - .sketch-element { - width: 10rem; - height: 14.6rem; - border: 0.15rem solid #c7c7c7; - border-radius: 1.2rem; - position: relative; - overflow: hidden; - - .img-src { - // height: 100%; - width: 100%; - } - - .crop-tool { - position: absolute; - top: 0.4rem; - right: 0.4rem; - width: 2rem; - height: 2rem; - border-radius: 50%; - background-color: #000000; - } - } - } - } - } - .right { width: 55.2rem; flex-shrink: 0; - .form-container { - row-gap: 3rem; - - .form-item { - .form-item-label { - font-size: 1.4rem; - font-weight: 400; - font-style: bold; - margin-bottom: 0.6rem; - line-height: 1.5; - - &.with-tip { - display: flex; - align-items: center; - column-gap: 0.8rem; - } - - .help-text { - font-size: 1rem; - color: #999; - } - } - - .form-item-value { - border: 0.16rem solid #d1d1d1; - border-radius: 1.2rem; - position: relative; - padding: 1.6rem; - box-sizing: border-box; - font-size: 1.2rem; - color: #000; - - &.no-border { - border: none; - padding: 0; - } - - &.price { - column-gap: 0.6rem; - } - - :deep(.ant-input), - :deep(.ant-input-affix-wrapper), - :deep(.ant-input-textarea textarea) { - border: none; - padding: 0; - font-size: 1.2rem; - color: #000; - box-shadow: none; - } - - :deep(.ant-input) { - line-height: 1.5; - } - - :deep(.ant-input-show-count-suffix) { - color: #df2c2c; - font-size: 1rem; - } - - :deep(textarea.ant-input) { - resize: none; - min-height: 5.4rem; - padding-bottom: 1.8rem; - line-height: 1.5; - } - - :deep(.ant-input-textarea-show-count) { - position: relative; - &::after { - float: none; - position: absolute; - color: #df2c2c; - bottom: 0; - right: 1.6rem; - } - } - } - } - } - - .license-note { - padding: 1.6rem; - column-gap: 1.6rem; - background: #f7f7f7; - border-radius: 0.8rem; - - .info-icon { - width: 2.4rem; - height: 2.4rem; - flex-shrink: 0; - } - - .note-copy { - font-size: 1.2rem; - line-height: 1.5; - color: #000; - font-weight: 400; - font-style: medium; - - a { - color: #0080ed; - text-decoration: underline; - margin-left: 0.4rem; - } - } - } .page-control { justify-content: flex-end; margin-top: 4rem; diff --git a/src/views/SellerDashboard/MyListings/EditDetail/types.ts b/src/views/SellerDashboard/MyListings/EditDetail/types.ts new file mode 100644 index 00000000..a2414647 --- /dev/null +++ b/src/views/SellerDashboard/MyListings/EditDetail/types.ts @@ -0,0 +1,47 @@ +export type RadioOption = { + name: string | number + value: string | number | boolean + key: string + optype: boolean +} + +export type TopImageType = "sketch" | "mainProductImage" | "cover" +export type CropType = TopImageType | "apparel" + +export type ListingItem = { + designItemId: number | string | null + sketch: string | null + mainProductImage: string + cover: string + productImage: string[] + apparelSketch: string[] + productName: string + price: string + desc: string + gender: string + category: string[] | null + prodImageList: Array<{ + url: string + selected?: boolean + }> + sketchList: Array<{ url: string | null }> +} + +export type ListingDetailImage = { + category?: string | null + imageUrl?: string | null + isSelected?: boolean | number | string | null + sortOrder?: number | null +} + +export type ListingDetailResponse = { + id?: number | string | null + title?: string | null + description?: string | null + price?: number | string | null + designFor?: string | null + productCategory?: string | string[] | null + images?: ListingDetailImage[] | null +} + +export type StatusType = "draft" | "publish" diff --git a/src/views/SellerDashboard/MyListings/createSelect/historyList.vue b/src/views/SellerDashboard/MyListings/createSelect/historyList.vue index bcd2ed6c..8452f7b6 100644 --- a/src/views/SellerDashboard/MyListings/createSelect/historyList.vue +++ b/src/views/SellerDashboard/MyListings/createSelect/historyList.vue @@ -41,7 +41,10 @@ const getCreateList = ()=>{ }) } const selectCollectionItem = (item:any)=>{ - emit('selectCollectionItem',item) + console.log(item) + if(item.userLikeGroupVO?.groupDetails?.length > 0){ + emit('selectCollectionItem',item) + } } onMounted(()=>{ getCreateList() @@ -55,9 +58,12 @@ defineExpose({getCreateList})
-
+
+
+ +
{{item.name}}
@@ -123,6 +129,12 @@ defineExpose({getCreateList}) border-radius: 1rem; overflow: hidden; background-color: #fff; + &.null{ + background-color: transparent; + > img{ + object-fit: contain; + } + } > img{ object-fit: cover; height: 100%; diff --git a/src/views/SellerDashboard/MyListings/createSelectItem/index.vue b/src/views/SellerDashboard/MyListings/createSelectItem/index.vue index 9944930d..78653341 100644 --- a/src/views/SellerDashboard/MyListings/createSelectItem/index.vue +++ b/src/views/SellerDashboard/MyListings/createSelectItem/index.vue @@ -45,8 +45,8 @@ const next = ()=>{ router.push({ path:'/home/seller/myListings/edit', state: { - id:route.params.collectionId, designItemIds, + type:'create' } }) } @@ -83,7 +83,7 @@ const setDomSize = (width: number)=>{ if(!listingsBoxRef.value)return let listDom = listingsBoxRef.value.querySelector('.list') let listItemDom = listDom.querySelector('.item') - let offsetWidth = listItemDom.getBoundingClientRect().width + let offsetWidth = listItemDom?.getBoundingClientRect?.()?.width let lineNum = Math.floor(width / offsetWidth) let itemNum = Math.floor((width - (lineNum - 1) * parseInt(gap.value[domSize.value])) / offsetWidth) listDom.style.maxWidth = ((itemNum - 1) * parseInt(gap.value[domSize.value]) + itemNum * (offsetWidth)) + 'px' diff --git a/src/views/SellerDashboard/MyListings/main/content.vue b/src/views/SellerDashboard/MyListings/main/content.vue index 67634495..4e1dcfc5 100644 --- a/src/views/SellerDashboard/MyListings/main/content.vue +++ b/src/views/SellerDashboard/MyListings/main/content.vue @@ -5,6 +5,8 @@ import contentItem from "./contentItem.vue" import selectMenu from '@/component/modules/selectMenu.vue' import deleteDrafts from './deleteDrafts.vue' import { Https } from '@/tool/https' +import { message } from 'ant-design-vue' +import { useRouter } from 'vue-router' //const props = defineProps({ //}) @@ -63,10 +65,13 @@ const domSizeList = ref([ const visible = ref(false) const deleteDraftsRef = ref(null) +const router = useRouter() const deleteDraft = (item: any)=>{ - deleteDraftsRef.value.open(()=>{ - list2.value = list2.value.filter((v: any)=>v.id != item.id) + deleteDraftsRef.value.open(item,()=>{ + putListingStatus(item,2).then(()=>{ + list2.value = list2.value.filter((v: any)=>v.id != item.id) + }) }) } @@ -99,6 +104,7 @@ const getPublishedData = async ()=>{ } await getPublishList(value).then((res)=>{ if(res.content.length == 0)publishData.isNoData = true + publishData.pageNum += 1 list.value.push(...res.content) }) publishData.isShowMark = false @@ -113,6 +119,7 @@ const getNoPublishedData = async ()=>{ } await getPublishList(value).then((res)=>{ if(res.content.length == 0)noPublishData.isNoData = true + noPublishData.pageNum += 1 list2.value.push(...res.content) }) noPublishData.isShowMark = false @@ -127,28 +134,46 @@ const getPublishList = (data:any)=>{ }) } -const putListingStatus = ()=>{ - let data = { - id:'', - status:'', - } - Https.axiosPut(Https.httpUrls.putListingStatus,data).then((res:any)=>{ +const putListingStatus = async (item,status:number)=>{ + return new Promise((resolve, reject) => { + let data = { + id:item.id, + status:status, + } + Https.axiosPut(Https.httpUrls.putListingStatus,data).then((res:any)=>{ + resolve(res) + }).catch((err:any)=>{ + reject(err) + }) }) } -const draftListing = (item: any)=>{ +const draftListing = async (item: any)=>{ //数组前面添加item - list2.value.unshift(item) - list.value = list.value.filter((v: any)=>v.id != item.id) + await putListingStatus(item,0).then(()=>{ + list2.value.unshift(item) + list.value = list.value.filter((v: any)=>v.id != item.id) + }) + message.success('Product moved to drafts and stats reset.') } -const publishListing = (item: any)=>{ - list.value.unshift(item) - list2.value = list2.value.filter((v: any)=>v.id != item.id) +const publishListing = async (item: any)=>{ + await putListingStatus(item,1).then(()=>{ + list.value.unshift(item) + list2.value = list2.value.filter((v: any)=>v.id != item.id) + }) + message.success('Item is now live on the Marketplace.') } const editListing = (item: any)=>{ + router.push({ + path:'/home/seller/myListings/edit', + state: { + id:item.id, + type:'edit' + } + }) } @@ -167,7 +192,7 @@ const setDomSize = (width: number)=>{ if(!listingsBoxRef.value)return let listDom = listingsBoxRef.value.querySelector('.list') let listItemDom = listDom.querySelector('.item') - let offsetWidth = listItemDom.getBoundingClientRect().width + let offsetWidth = listItemDom?.getBoundingClientRect?.()?.width let lineNum = Math.floor(width / offsetWidth) let itemNum = Math.floor((width - (lineNum - 1) * parseInt(gap.value[domSize.value])) / offsetWidth) listDom.style.maxWidth = ((itemNum - 1) * parseInt(gap.value[domSize.value]) + itemNum * (offsetWidth)) + 'px' diff --git a/src/views/SellerDashboard/MyListings/main/contentItem.vue b/src/views/SellerDashboard/MyListings/main/contentItem.vue index f190ffcb..cc088540 100644 --- a/src/views/SellerDashboard/MyListings/main/contentItem.vue +++ b/src/views/SellerDashboard/MyListings/main/contentItem.vue @@ -32,7 +32,7 @@ const {} = toRefs(data);