diff --git a/apps/business/src/components/OrderItemsModal.tsx b/apps/business/src/components/OrderItemsModal.tsx index 5c7dfc5..3a673d4 100644 --- a/apps/business/src/components/OrderItemsModal.tsx +++ b/apps/business/src/components/OrderItemsModal.tsx @@ -57,6 +57,7 @@ function parseOrderShipping(shippingAddress: Record) { title: typeof row.title === 'string' ? row.title : '', methodLabel: typeof row.methodLabel === 'string' ? row.methodLabel : null, amount: typeof row.amount === 'number' && Number.isFinite(row.amount) ? row.amount : 0, + pasKraye: row.pasKraye === true, itemNames: Array.isArray(row.itemNames) ? row.itemNames.filter((name): name is string => typeof name === 'string') : [], @@ -75,6 +76,7 @@ function parseOrderShipping(shippingAddress: Record) { deliveryMode, addressLine: addressParts.join(' · '), groups, + hasPasKraye: groups.some((group) => group.pasKraye), } } @@ -109,6 +111,7 @@ export function OrderItemsModal({ open, order, onClose }: OrderItemsModalProps) if (!mounted || !order) return null const itemCount = totalQuantity(order) + const shippingInfo = parseOrderShipping(order.shippingAddress) return createPortal(
- {(() => { - const shippingInfo = parseOrderShipping(order.shippingAddress) - return ( -
-
{t('orderItems.delivery')}
- {shippingInfo.deliveryMode === 'pickup' ? ( -

{t('orderItems.pickup')}

- ) : shippingInfo.addressLine ? ( -

{shippingInfo.addressLine}

- ) : null} +
+
{t('orderItems.delivery')}
+ {shippingInfo.deliveryMode === 'pickup' ? ( +

{t('orderItems.pickup')}

+ ) : shippingInfo.addressLine ? ( +

{shippingInfo.addressLine}

+ ) : null} - {shippingInfo.groups.length > 0 ? ( -
    - {shippingInfo.groups.map((group) => ( -
  • -
    - {group.title} - - {group.amount > 0 - ? formatIrtPrice(group.amount) - : t('orderItems.freeShipping')} - -
    - {group.methodLabel ? ( -
    {group.methodLabel}
    - ) : null} - {group.itemNames.length > 0 ? ( -
      - {group.itemNames.map((name) => ( -
    • {name}
    • - ))} -
    - ) : null} -
  • - ))} -
- ) : null} -
- ) - })()} + {shippingInfo.groups.length > 0 ? ( +
    + {shippingInfo.groups.map((group) => ( +
  • +
    + {group.title} + + {group.pasKraye + ? t('orderItems.pasKraye') + : group.amount > 0 + ? formatIrtPrice(group.amount) + : t('orderItems.freeShipping')} + +
    + {group.methodLabel ? ( +
    {group.methodLabel}
    + ) : null} + {group.itemNames.length > 0 ? ( +
      + {group.itemNames.map((name) => ( +
    • {name}
    • + ))} +
    + ) : null} +
  • + ))} +
+ ) : null} +
{order.items.length === 0 ? (

{t('orderItems.empty')}

@@ -243,7 +243,9 @@ export function OrderItemsModal({ open, order, onClose }: OrderItemsModalProps) {order.shippingTotal > 0 ? formatIrtPrice(order.shippingTotal) - : t('orderItems.freeShipping')} + : shippingInfo.hasPasKraye + ? t('orderItems.pasKraye') + : t('orderItems.freeShipping')} {order.discountTotal > 0 ? ( diff --git a/apps/business/src/components/ShippingCostGroupModal.module.css b/apps/business/src/components/ShippingCostGroupModal.module.css index 11e2e12..560fbdd 100644 --- a/apps/business/src/components/ShippingCostGroupModal.module.css +++ b/apps/business/src/components/ShippingCostGroupModal.module.css @@ -199,6 +199,37 @@ direction: ltr; } +.pasKrayeCheck { + display: inline-flex; + align-items: center; + gap: 6px; + flex-shrink: 0; + margin-inline-start: 4px; + padding: 6px 10px; + border-radius: var(--radius-sm); + border: 1px solid rgba(148, 163, 184, 0.28); + background: rgba(148, 163, 184, 0.08); + font-size: 12px; + font-weight: 700; + color: var(--text-primary); + cursor: pointer; + user-select: none; + white-space: nowrap; +} + +.pasKrayeCheck input { + width: 15px; + height: 15px; + accent-color: var(--primary); + cursor: pointer; +} + +.amountRow input:disabled { + opacity: 0.55; + cursor: not-allowed; + background: rgba(148, 163, 184, 0.1); +} + .checkRow { display: flex; align-items: flex-start; diff --git a/apps/business/src/components/ShippingCostGroupModal.tsx b/apps/business/src/components/ShippingCostGroupModal.tsx index 694fd7a..c03944b 100644 --- a/apps/business/src/components/ShippingCostGroupModal.tsx +++ b/apps/business/src/components/ShippingCostGroupModal.tsx @@ -47,6 +47,7 @@ export function ShippingCostGroupModal({ const [description, setDescription] = useState('') const [methods, setMethods] = useState([]) const [defaultAmount, setDefaultAmount] = useState('') + const [pasKraye, setPasKraye] = useState(false) const [isDefault, setIsDefault] = useState(false) const [formError, setFormError] = useState('') @@ -58,6 +59,7 @@ export function ShippingCostGroupModal({ setNameEn(editingGroup?.nameEn ?? '') setDescription(editingGroup?.description ?? '') setMethods(editingGroup?.methods ?? []) + setPasKraye(editingGroup?.pasKraye ?? false) setDefaultAmount( editingGroup ? formatIrtInput(String(Math.round(editingGroup.defaultAmount))) @@ -98,7 +100,7 @@ export function ShippingCostGroupModal({ const trimmedFa = nameFa.trim() const trimmedEn = nameEn.trim() - const amount = parseIrtInput(defaultAmount) + const amount = pasKraye ? 0 : parseIrtInput(defaultAmount) if (!trimmedFa || !trimmedEn) { setFormError(t('store.shipping.form.errorRequired')) @@ -108,7 +110,7 @@ export function ShippingCostGroupModal({ setFormError(t('store.shipping.form.errorMethods')) return } - if (amount === null || amount < 0) { + if (!pasKraye && (amount === null || amount < 0)) { setFormError(t('store.shipping.form.errorAmount')) return } @@ -118,7 +120,8 @@ export function ShippingCostGroupModal({ nameEn: trimmedEn, description: description.trim() || undefined, methods, - defaultAmount: amount, + defaultAmount: amount ?? 0, + pasKraye, isDefault, }) } @@ -244,11 +247,28 @@ export function ShippingCostGroupModal({ placeholder={t('store.shipping.form.defaultAmountPlaceholder')} value={defaultAmount} onChange={(e) => setDefaultAmount(formatIrtInput(e.target.value))} - disabled={isSubmitting} - required + disabled={isSubmitting || pasKraye} + required={!pasKraye} /> IRT + + {pasKraye ? ( +

{t('store.shipping.form.pasKrayeHint')}

+ ) : null}