Tom Butcher 26132d206c
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
Add Payment and Fulfillment Policy Components with SVG Icons
- Introduced new components for managing Payment Policies and Fulfillment Policies, enhancing the dashboard's functionality for financial management.
- Added corresponding SVG icons for Payment Policy, Fulfillment Policy, and Return Policy to improve visual representation.
- Updated App.css with new styles for file gallery previews, ensuring a cohesive layout and user experience across the dashboard.
- Implemented new object forms and tables for Payment Policies, allowing for better data handling and user interaction.
2026-08-29 00:47:46 +01:00

528 lines
13 KiB
JavaScript

import { createElement, lazy } from 'react'
const ListingInfo = lazy(
() => import('../../components/Dashboard/Sales/Listings/ListingInfo')
)
const NewListing = lazy(
() => import('../../components/Dashboard/Sales/Listings/NewListing')
)
const PublishListing = lazy(
() => import('../../components/Dashboard/Sales/Listings/PublishListing')
)
const UnpublishListing = lazy(
() => import('../../components/Dashboard/Sales/Listings/UnpublishListing')
)
const DeleteObject = lazy(
() => import('../../components/Dashboard/common/DeleteObject')
)
import ListingIcon from '../../components/Icons/ListingIcon'
import PlusIcon from '../../components/Icons/PlusIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import EditIcon from '../../components/Icons/EditIcon'
import CheckIcon from '../../components/Icons/CheckIcon'
import XMarkIcon from '../../components/Icons/XMarkIcon'
import BinIcon from '../../components/Icons/BinIcon'
import ListIcon from '../../components/Icons/ListIcon'
export const Listing = {
name: 'listing',
label: 'Listing',
labelPlural: 'Listings',
url: '/dashboard/sales/listings',
prefix: 'LST',
icon: ListingIcon,
actions: [
{
name: 'new',
type: 'modal',
pageName: 'list',
modalWidth: 800,
label: 'New Listing',
icon: PlusIcon,
content: (objectData, { onOk } = {}) => {
return createElement(NewListing, {
defaultValues: objectData,
onOk,
reset: true
})
}
},
{
name: 'list',
type: 'page',
pageName: 'list',
label: 'List',
icon: ListIcon
},
{
name: 'info',
type: 'page',
pageName: 'info',
label: 'Info',
default: true,
row: true,
icon: InfoCircleIcon
},
{
name: 'edit',
type: 'page',
pageName: 'info',
label: 'Edit',
row: true,
icon: EditIcon,
visible: (objectData) => {
return !(objectData?._isEditing && objectData?._isEditing == true)
}
},
{
name: 'cancelEdit',
label: 'Cancel Edits',
type: 'page',
pageName: 'info',
icon: XMarkIcon,
visible: (objectData) => {
return objectData?._isEditing && objectData?._isEditing == true
}
},
{
name: 'finishEdit',
label: 'Save Edits',
type: 'page',
pageName: 'info',
icon: CheckIcon,
visible: (objectData) => {
return objectData?._isEditing && objectData?._isEditing == true
}
},
{ type: 'divider' },
{
name: 'newListingVarient',
type: 'alias',
objectType: 'listingVarient',
aliasAction: 'new',
objectData: (objectData) => ({ listing: objectData })
},
{ type: 'divider' },
{
name: 'publish',
type: 'modal',
modalWidth: 520,
label: 'Publish',
icon: CheckIcon,
visible: (objectData) =>
objectData?.state?.type === 'draft' ||
objectData?.state?.type === 'inactive',
disabled: (objectData) =>
['syncing', 'publishing', 'unpublishing'].includes(
objectData?.state?.type
),
content: (objectData, { onOk } = {}) => {
return createElement(PublishListing, { objectData, onOk })
}
},
{
name: 'unpublish',
type: 'modal',
modalWidth: 520,
label: 'Unpublish',
icon: XMarkIcon,
danger: true,
visible: (objectData) => objectData?.state?.type === 'active',
disabled: (objectData) =>
['syncing', 'publishing', 'unpublishing'].includes(
objectData?.state?.type
),
content: (objectData, { onOk } = {}) => {
return createElement(UnpublishListing, { objectData, onOk })
}
},
{ type: 'divider' },
{
name: 'delete',
type: 'modal',
modalWidth: 520,
modalCentered: true,
label: 'Delete',
icon: BinIcon,
danger: true,
content: (objectData, { onOk } = {}) => {
return createElement(DeleteObject, { objectData, onOk })
}
}
],
pages: [
{
name: 'info',
content: () => createElement(ListingInfo)
}
],
columns: [
'_reference',
'title',
'product',
'vendor',
'stockLocation',
'stockQuantity',
'marketplace',
'fulfillmentPolicy',
'paymentPolicy',
'returnPolicy',
'courierServices',
'state',
'condition',
'price',
'currency',
'lastSyncedAt',
'createdAt',
'updatedAt'
],
filters: [
'product',
'vendor',
'stockLocation',
'stockQuantity',
'marketplace',
'fulfillmentPolicy',
'paymentPolicy',
'returnPolicy',
'courierServices',
'state',
'state.type',
'condition',
'createdAt',
'updatedAt',
'_reference'
],
sorters: [
'title',
'vendor',
'state',
'stockQuantity',
'price',
'lastSyncedAt',
'createdAt',
'updatedAt',
'_id'
],
group: ['marketplace', 'vendor', 'product', 'stockLocation'],
properties: [
{
name: '_id',
label: 'ID',
columnFixed: 'left',
type: 'id',
objectType: 'listing',
showCopy: true,
columnWidth: 140
},
{
name: 'createdAt',
label: 'Created At',
type: 'dateTime',
readOnly: true,
columnWidth: 175
},
{
name: '_reference',
label: 'Reference',
type: 'reference',
columnFixed: 'left',
objectType: 'listing',
showCopy: true,
readOnly: true,
columnWidth: 180
},
{
name: 'updatedAt',
label: 'Updated At',
type: 'dateTime',
readOnly: true,
columnWidth: 175
},
{
name: 'title',
label: 'Title',
columnFixed: 'left',
type: 'text',
readOnly: false,
required: true,
columnWidth: 250,
value: (objectData) => {
if (objectData?.title == undefined) {
return objectData?.product?.name
}
return objectData?.title
}
},
{
name: 'description',
label: 'Description',
type: 'markdown',
readOnly: false,
required: false,
span: 2,
extra:
'Used as the eBay listing description. If empty, the title is sent instead.'
},
{
name: 'listingImages',
label: 'Listing Images',
type: 'fileList',
gallery: true,
required: false,
masterFilter: ['.jpg', '.jpeg', '.png', '.gif', '.webp']
},
{
name: 'lastSyncedAt',
label: 'Last Synced',
type: 'dateTime',
readOnly: true,
columnWidth: 175
},
{
name: 'product',
label: 'Product',
type: 'object',
objectType: 'product',
showHyperlink: true,
readOnly: false,
required: true,
columnWidth: 200
},
{
name: 'vendor',
label: 'Vendor',
type: 'object',
objectType: 'vendor',
showHyperlink: true,
readOnly: false,
required: true,
value: (objectData) => {
if (objectData?.vendor == undefined) {
return objectData?.product?.vendor
}
return objectData?.vendor
},
columnWidth: 200
},
{
name: 'stockLocation',
label: 'Stock Location',
type: 'object',
objectType: 'stockLocation',
showHyperlink: true,
readOnly: false,
required: true,
columnWidth: 200
},
{
name: 'stockQuantity',
label: 'Stock Quantity',
type: 'number',
min: 0,
readOnly: true,
required: false,
columnWidth: 170
},
{
name: 'marketplace',
label: 'Marketplace',
type: 'object',
objectType: 'marketplace',
showHyperlink: true,
readOnly: false,
required: true,
columnWidth: 200
},
{
name: 'fulfillmentPolicy',
label: 'Fulfillment Policy',
type: 'object',
objectType: 'fulfillmentPolicy',
showHyperlink: true,
readOnly: false,
required: false,
extra:
'Defaults from the marketplace. Courier services are used as a fallback when this is empty.',
value: (objectData) => {
if (objectData?.fulfillmentPolicy == undefined) {
return objectData?.marketplace?.defaultFulfillmentPolicy
}
return objectData?.fulfillmentPolicy
},
columnWidth: 220
},
{
name: 'paymentPolicy',
label: 'Payment Policy',
type: 'object',
objectType: 'paymentPolicy',
showHyperlink: true,
readOnly: false,
required: false,
extra: 'Defaults from the marketplace. Required when publishing to eBay.',
value: (objectData) => {
if (objectData?.paymentPolicy == undefined) {
return objectData?.marketplace?.defaultPaymentPolicy
}
return objectData?.paymentPolicy
},
columnWidth: 200
},
{
name: 'returnPolicy',
label: 'Return Policy',
type: 'object',
objectType: 'returnPolicy',
showHyperlink: true,
readOnly: false,
required: false,
extra: 'Defaults from the marketplace. Required when publishing to eBay.',
value: (objectData) => {
if (objectData?.returnPolicy == undefined) {
return objectData?.marketplace?.defaultReturnPolicy
}
return objectData?.returnPolicy
},
columnWidth: 200
},
{
name: 'state',
label: 'State',
type: 'state',
objectType: 'listing',
readOnly: true,
columnWidth: 260
},
{
name: 'condition',
label: 'Condition',
type: 'select',
required: true,
extra:
'Required by eBay for most categories. Stored in camel case and converted when publishing.',
options: [
{ value: 'new', label: 'New' },
{ value: 'likeNew', label: 'Like New' },
{ value: 'newOther', label: 'New Other' },
{ value: 'newWithDefects', label: 'New With Defects' },
{ value: 'manufacturerRefurbished', label: 'Manufacturer Refurbished' },
{ value: 'certifiedRefurbished', label: 'Certified Refurbished' },
{ value: 'excellentRefurbished', label: 'Excellent Refurbished' },
{ value: 'veryGoodRefurbished', label: 'Very Good Refurbished' },
{ value: 'goodRefurbished', label: 'Good Refurbished' },
{ value: 'sellerRefurbished', label: 'Seller Refurbished' },
{ value: 'usedExcellent', label: 'Used Excellent' },
{ value: 'usedVeryGood', label: 'Used Very Good' },
{ value: 'usedGood', label: 'Used Good' },
{ value: 'usedAcceptable', label: 'Used Acceptable' },
{ value: 'forPartsOrNotWorking', label: 'For Parts Or Not Working' },
{ value: 'preOwnedExcellent', label: 'Pre Owned Excellent' },
{ value: 'preOwnedFair', label: 'Pre Owned Fair' }
],
value: (objectData) => objectData?.condition || 'new',
columnWidth: 200
},
{
name: 'price',
label: 'Price',
type: 'number',
prefix: '£',
min: 0,
step: 0.01,
readOnly: true,
required: false,
columnWidth: 120
},
{
name: 'currency',
label: 'Currency',
type: 'text',
readOnly: true,
required: false,
columnWidth: 100
},
{
name: 'url',
label: 'URL',
type: 'url',
readOnly: true,
required: false,
columnWidth: 250
},
{
name: 'externalReference',
label: 'External Reference',
type: 'miscId',
readOnly: true,
required: false,
extra:
'eBay item ID for this listing. Publish and unpublish reuse this ID when set.',
showCopy: true,
columnWidth: 180
},
{
name: 'courierServices',
label: 'Courier Services',
type: 'objectList',
showHyperlink: true,
objectType: 'courierService',
readOnly: false,
required: true,
extra:
'Used for order shipping and as the eBay fulfillment fallback when no fulfillment policy is set.',
columnWidth: 250
}
],
stats: [
{
name: 'draft.count',
label: 'Draft',
type: 'number',
color: 'default'
},
{
name: 'active.count',
label: 'Active',
type: 'number',
color: 'success'
},
{
name: 'inactive.count',
label: 'Inactive',
type: 'number',
color: 'default'
},
{
name: 'syncing.count',
label: 'Syncing',
type: 'number',
color: 'processing'
},
{
name: 'publishing.count',
label: 'Publishing',
type: 'number',
color: 'processing'
},
{
name: 'unpublishing.count',
label: 'Unpublishing',
type: 'number',
color: 'processing'
},
{
name: 'suspended.count',
label: 'Suspended',
type: 'number',
color: 'error'
},
{
name: 'deleted.count',
label: 'Deleted',
type: 'number',
color: 'error'
}
]
}