@dropins/storefront-quick-order 0.1.2-alpha3 → 1.0.0-beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"QuickOrderVariantsGrid.js","sources":["/@dropins/storefront-quick-order/src/hooks/useQuickOrderVariantsData.tsx","/@dropins/storefront-quick-order/src/containers/QuickOrderVariantsGrid/QuickOrderVariantsGrid.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport {\n VariantWithQuantity,\n ProductVariant,\n UseQuickOrderVariantsDataProps,\n UseQuickOrderVariantsDataReturn,\n} from '@/b2b-quick-order/types';\nimport { debounce } from '@adobe-commerce/elsie/lib/debounce';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport const useQuickOrderVariantsData = ({\n initialVariants,\n fetchVariants,\n onVariantsLoaded,\n onTableDataChange,\n debounceMs = 300,\n initialLoading = true,\n}: UseQuickOrderVariantsDataProps = {}): UseQuickOrderVariantsDataReturn => {\n const [variants, setVariants] = useState<VariantWithQuantity[]>([]);\n const variantsRef = useRef<VariantWithQuantity[]>([]);\n const [loading, setLoading] = useState(initialLoading);\n const [error, setError] = useState<string | null>(null);\n\n const loadVariants = useCallback(async () => {\n if (initialVariants) {\n const variantsWithQuantity: VariantWithQuantity[] = initialVariants.map(\n (variant) => ({\n ...variant,\n quantity: 0,\n })\n );\n setVariants(variantsWithQuantity);\n variantsRef.current = variantsWithQuantity;\n setLoading(false);\n onVariantsLoaded?.(variantsWithQuantity);\n return;\n }\n\n if (!fetchVariants) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const data = await fetchVariants();\n const variantsWithQuantity: VariantWithQuantity[] = data.map(\n (variant) => ({\n ...variant,\n quantity: 0,\n })\n );\n\n setVariants(variantsWithQuantity);\n variantsRef.current = variantsWithQuantity;\n onVariantsLoaded?.(variantsWithQuantity);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to load variants';\n setError(errorMessage);\n console.error('Error fetching variants:', err);\n } finally {\n setLoading(false);\n }\n }, [initialVariants, fetchVariants, onVariantsLoaded]);\n\n useEffect(() => {\n loadVariants();\n }, [loadVariants]);\n\n useEffect(() => {\n const variantsEvent = events.on(\n 'quick-order/grid-ordering-variants',\n (data: { variants: ProductVariant[] }) => {\n const incomingVariants = data?.variants || [];\n\n if (incomingVariants.length === 0) {\n setVariants([]);\n variantsRef.current = [];\n setLoading(false);\n } else {\n const variantsWithQuantity: VariantWithQuantity[] =\n incomingVariants.map((variant) => ({\n ...variant,\n quantity: 0,\n }));\n setVariants(variantsWithQuantity);\n variantsRef.current = variantsWithQuantity;\n setLoading(false);\n onVariantsLoaded?.(variantsWithQuantity);\n }\n },\n {\n eager: true,\n }\n );\n\n return () => {\n variantsEvent?.off();\n };\n }, [onVariantsLoaded]);\n\n const debouncedTableDataChange = useMemo(\n () =>\n debounce((updatedVariants: VariantWithQuantity[]) => {\n const collectedData = updatedVariants\n .filter((v) => v.quantity > 0)\n .map((v) => ({\n sku: v.product.sku,\n name: v.product.name,\n inStock: v.product.inStock,\n attributes: v.product.attributes.reduce((acc, attr) => {\n if (attr.value) {\n acc[attr.name] = {\n label: attr.label,\n value: attr.value,\n };\n }\n return acc;\n }, {} as Record<string, { label: string; value: string | number }>),\n price: v.product.price.final.amount.value,\n quantity: v.quantity,\n subtotal: v.product.price.final.amount.value * v.quantity,\n image: v.product.images[0]?.url || '',\n }));\n\n if (onTableDataChange) {\n onTableDataChange(collectedData);\n }\n\n events.emit('quick-order/grid-ordering-updated', {\n variants: collectedData,\n });\n }, debounceMs),\n [onTableDataChange, debounceMs]\n );\n\n const updateQuantity = useCallback(\n (sku: string, quantity: number) => {\n setVariants((prevVariants) => {\n const updated = prevVariants.map((variant) => {\n if (variant.product.sku === sku) {\n if (!variant.product.inStock) {\n return { ...variant, quantity: 0 };\n }\n return { ...variant, quantity: Math.max(0, quantity) };\n }\n return variant;\n });\n\n variantsRef.current = updated;\n debouncedTableDataChange(updated);\n\n return updated;\n });\n },\n [debouncedTableDataChange]\n );\n\n const clearAllQuantities = useCallback(() => {\n setVariants((prevVariants) => {\n const cleared = prevVariants.map((variant) => ({\n ...variant,\n quantity: 0,\n }));\n\n variantsRef.current = cleared;\n return cleared;\n });\n events.emit('quick-order/grid-ordering-list-updated', []);\n }, []);\n\n const exportToCsv = useCallback(() => {\n const currentVariants =\n variantsRef.current.length > 0 ? variantsRef.current : variants;\n const variantsToExport = currentVariants.filter((v) => v.quantity > 0);\n\n if (variantsToExport.length === 0) {\n console.warn('No variants with quantity to export');\n return;\n }\n\n const csvHeader = 'SKU,Quantity\\n';\n const csvRows = variantsToExport\n .map((v) => `${v.product.sku},${v.quantity}`)\n .join('\\n');\n const csvContent = csvHeader + csvRows;\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n\n const timestamp = new Date().toISOString().split('T')[0];\n link.setAttribute('href', url);\n link.setAttribute('download', `product-variants-${timestamp}.csv`);\n link.style.visibility = 'hidden';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n URL.revokeObjectURL(url);\n }, [variants]);\n\n const refetchVariants = useCallback(async () => {\n await loadVariants();\n }, [loadVariants]);\n\n const collectTableData = useCallback(() => {\n const currentVariants =\n variantsRef.current.length > 0 ? variantsRef.current : variants;\n const tableData = currentVariants\n .filter((v) => v.quantity > 0)\n .map((variant) => ({\n sku: variant.product.sku,\n name: variant.product.name,\n inStock: variant.product.inStock,\n attributes: variant.product.attributes.reduce((acc, attr) => {\n if (attr.value && attr.value !== '') {\n acc[attr.name] = {\n label: attr.label,\n value: attr.value,\n };\n }\n return acc;\n }, {} as Record<string, { label: string; value: string | number }>),\n price: variant.product.price.final.amount.value,\n quantity: variant.quantity,\n subtotal: variant.product.price.final.amount.value * variant.quantity,\n image: variant.product.images[0]?.url || '',\n }));\n\n return tableData;\n }, [variants]);\n\n const variantsWithQuantity = useMemo(\n () => variants.filter((v) => v.quantity > 0).length,\n [variants]\n );\n\n return {\n variants,\n loading,\n error,\n updateQuantity,\n clearAllQuantities,\n exportToCsv,\n refetchVariants,\n collectTableData,\n variantsWithQuantity,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { QuickOrderVariantsGrid as QuickOrderVariantsGridComponent } from '@/b2b-quick-order/components/QuickOrderVariantsGrid/QuickOrderVariantsGrid';\nimport { QuickOrderVariantsActions } from '@/b2b-quick-order/components/QuickOrderVariantsActions/QuickOrderVariantsActions';\nimport { useQuickOrderVariantsData } from '@/b2b-quick-order/hooks/useQuickOrderVariantsData';\nimport { QuickOrderVariantsGridProps } from '@/b2b-quick-order/types/quickOrderVariantsGrid.types';\n\nexport const QuickOrderVariantsGrid: Container<QuickOrderVariantsGridProps> = ({\n className,\n variants: initialVariants,\n fetchVariants,\n onVariantsLoaded,\n onTableDataChange,\n debounceMs,\n initialLoading,\n initialVisibleVariantsCount = 10,\n columns,\n slots,\n}) => {\n const t = useText({\n imageColumn: 'QuickOrder.VariantsGrid.imageColumn',\n variantColumn: 'QuickOrder.VariantsGrid.variantColumn',\n skuColumn: 'QuickOrder.VariantsGrid.skuColumn',\n availabilityColumn: 'QuickOrder.VariantsGrid.availabilityColumn',\n priceColumn: 'QuickOrder.VariantsGrid.priceColumn',\n quantityColumn: 'QuickOrder.VariantsGrid.quantityColumn',\n subtotalColumn: 'QuickOrder.VariantsGrid.subtotalColumn',\n clearButton: 'QuickOrder.VariantsGrid.clearButton',\n saveToCsvButton: 'QuickOrder.VariantsGrid.saveToCsvButton',\n collectDataButton: 'QuickOrder.VariantsGrid.collectDataButton',\n inStock: 'QuickOrder.VariantsGrid.inStock',\n outOfStock: 'QuickOrder.VariantsGrid.outOfStock',\n tableCaption: 'QuickOrder.VariantsGrid.tableCaption',\n quantityLabel: 'QuickOrder.VariantsGrid.quantityLabel',\n showAll: 'QuickOrder.VariantsGrid.showAll',\n showLess: 'QuickOrder.VariantsGrid.showLess',\n });\n\n const {\n variants,\n loading,\n error,\n updateQuantity,\n clearAllQuantities,\n exportToCsv,\n collectTableData,\n variantsWithQuantity,\n } = useQuickOrderVariantsData({\n initialVariants,\n fetchVariants,\n onVariantsLoaded,\n onTableDataChange,\n debounceMs,\n initialLoading,\n });\n\n if (error) {\n return (\n <div\n className={classes([\n 'b2b-quick-order-variants-grid-container',\n 'b2b-quick-order-variants-grid-container--error',\n className,\n ])}\n data-testid=\"variants-grid-container-error\"\n >\n <p className=\"b2b-quick-order-variants-grid-container__error-message\">\n {error}\n </p>\n </div>\n );\n }\n\n if (variants.length === 0 && !loading) {\n return null;\n }\n\n return (\n <div\n className={classes([\n 'b2b-quick-order-variants-grid-container',\n className,\n ])}\n data-testid=\"variants-grid-container\"\n >\n <QuickOrderVariantsActions\n t={t}\n onClear={clearAllQuantities}\n onSaveToCsv={exportToCsv}\n onCollectData={collectTableData}\n isDisabled={loading}\n variantsCount={variantsWithQuantity}\n slots={slots}\n />\n\n <QuickOrderVariantsGridComponent\n t={t}\n variants={variants}\n loading={loading}\n onQuantityChange={updateQuantity}\n initialVisibleVariantsCount={initialVisibleVariantsCount}\n columns={columns}\n slots={slots}\n />\n </div>\n );\n};\n"],"names":["useQuickOrderVariantsData","initialVariants","fetchVariants","onVariantsLoaded","onTableDataChange","debounceMs","initialLoading","variants","setVariants","useState","variantsRef","useRef","loading","setLoading","error","setError","loadVariants","useCallback","variantsWithQuantity","variant","err","errorMessage","useEffect","variantsEvent","events","data","incomingVariants","debouncedTableDataChange","useMemo","debounce","updatedVariants","collectedData","v","acc","attr","_a","updateQuantity","sku","quantity","prevVariants","updated","clearAllQuantities","cleared","exportToCsv","variantsToExport","csvHeader","csvRows","csvContent","blob","link","url","timestamp","refetchVariants","collectTableData","QuickOrderVariantsGrid","className","initialVisibleVariantsCount","columns","slots","t","useText","jsx","classes","jsxs","QuickOrderVariantsActions","QuickOrderVariantsGridComponent"],"mappings":"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"}
1
+ {"version":3,"file":"QuickOrderVariantsGrid.js","sources":["/@dropins/storefront-quick-order/src/hooks/useQuickOrderVariantsData.tsx","/@dropins/storefront-quick-order/src/containers/QuickOrderVariantsGrid/QuickOrderVariantsGrid.tsx"],"sourcesContent":["/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'preact/hooks';\nimport {\n VariantWithQuantity,\n ProductVariant,\n UseQuickOrderVariantsDataProps,\n UseQuickOrderVariantsDataReturn,\n} from '@/b2b-quick-order/types';\nimport { debounce } from '@adobe-commerce/elsie/lib/debounce';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport const useQuickOrderVariantsData = ({\n initialVariants,\n onVariantsLoaded,\n onSelectedVariantsChange,\n debounceMs = 300,\n initialLoading = true,\n}: UseQuickOrderVariantsDataProps = {}): UseQuickOrderVariantsDataReturn => {\n const [variants, setVariants] = useState<VariantWithQuantity[]>([]);\n const variantsRef = useRef<VariantWithQuantity[]>([]);\n const [loading, setLoading] = useState(initialLoading);\n\n // Emit event when initialVariants prop is provided (e.g., from Storybook)\n useEffect(() => {\n if (initialVariants && initialVariants.length > 0) {\n events.emit('quick-order/grid-ordering-variants', initialVariants);\n }\n }, [initialVariants]);\n\n // Initializing event\n useEffect(() => {\n const variantsEvent = events.on(\n 'quick-order/grid-ordering-variants',\n (incomingVariants: ProductVariant[]) => {\n if (!incomingVariants || incomingVariants.length === 0) {\n setVariants([]);\n variantsRef.current = [];\n setLoading(false);\n } else {\n const variantsWithQuantity: VariantWithQuantity[] =\n incomingVariants.map((variant) => ({\n ...variant,\n quantity: 0,\n }));\n setVariants(variantsWithQuantity);\n variantsRef.current = variantsWithQuantity;\n setLoading(false);\n events.emit('quick-order/grid-ordering-selected-variants', []);\n onVariantsLoaded?.(variantsWithQuantity);\n }\n },\n {\n eager: true,\n }\n );\n\n return () => {\n variantsEvent?.off();\n };\n }, [onVariantsLoaded]);\n\n const debouncedSelectedVariantsChange = useMemo(\n () =>\n debounce((updatedVariants: VariantWithQuantity[]) => {\n const collectedData = updatedVariants\n .filter((v) => v.quantity > 0)\n .map((v) => ({\n sku: v.product.sku,\n name: v.product.name,\n inStock: v.product.inStock,\n attributes: v.product.attributes.reduce((acc, attr) => {\n if (attr.value) {\n acc[attr.name] = {\n label: attr.label,\n value: attr.value,\n };\n }\n return acc;\n }, {} as Record<string, { label: string; value: string | number }>),\n price: v.product.price.final.amount.value,\n quantity: v.quantity,\n subtotal: v.product.price.final.amount.value * v.quantity,\n image: v.product.images[0]?.url || '',\n }));\n\n if (onSelectedVariantsChange) {\n onSelectedVariantsChange(collectedData);\n }\n\n events.emit(\n 'quick-order/grid-ordering-selected-variants',\n collectedData\n );\n }, debounceMs),\n [onSelectedVariantsChange, debounceMs]\n );\n\n const updateQuantity = useCallback(\n (sku: string, quantity: number) => {\n setVariants((prevVariants) => {\n const updated = prevVariants.map((variant) => {\n if (variant.product.sku === sku) {\n if (!variant.product.inStock) {\n return { ...variant, quantity: 0 };\n }\n return { ...variant, quantity: Math.max(0, quantity) };\n }\n return variant;\n });\n\n variantsRef.current = updated;\n debouncedSelectedVariantsChange(updated);\n\n return updated;\n });\n },\n [debouncedSelectedVariantsChange]\n );\n\n const clearAllQuantities = useCallback(() => {\n setVariants((prevVariants) => {\n const cleared = prevVariants.map((variant) => ({\n ...variant,\n quantity: 0,\n }));\n\n variantsRef.current = cleared;\n debouncedSelectedVariantsChange(cleared);\n return cleared;\n });\n }, [debouncedSelectedVariantsChange]);\n\n useEffect(() => {\n const clearAllQuantitiesEvent = events.on(\n 'quick-order/grid-ordering-reset-selected-variants',\n clearAllQuantities,\n {\n eager: true,\n }\n );\n\n return () => {\n clearAllQuantitiesEvent?.off();\n };\n }, [clearAllQuantities]);\n\n const exportToCsv = useCallback(() => {\n const currentVariants =\n variantsRef.current.length > 0 ? variantsRef.current : variants;\n const variantsToExport = currentVariants.filter((v) => v.quantity > 0);\n\n if (variantsToExport.length === 0) {\n console.warn('No variants with quantity to export');\n return;\n }\n\n const csvHeader = 'SKU,Quantity\\n';\n const csvRows = variantsToExport\n .map((v) => `${v.product.sku},${v.quantity}`)\n .join('\\n');\n const csvContent = csvHeader + csvRows;\n\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const link = document.createElement('a');\n const url = URL.createObjectURL(blob);\n\n const timestamp = new Date().toISOString().split('T')[0];\n link.setAttribute('href', url);\n link.setAttribute('download', `product-variants-${timestamp}.csv`);\n link.style.visibility = 'hidden';\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n URL.revokeObjectURL(url);\n }, [variants]);\n\n const collectTableData = useCallback(() => {\n const currentVariants =\n variantsRef.current.length > 0 ? variantsRef.current : variants;\n const tableData = currentVariants\n .filter((v) => v.quantity > 0)\n .map((variant) => ({\n sku: variant.product.sku,\n name: variant.product.name,\n inStock: variant.product.inStock,\n attributes: variant.product.attributes.reduce((acc, attr) => {\n if (attr.value && attr.value !== '') {\n acc[attr.name] = {\n label: attr.label,\n value: attr.value,\n };\n }\n return acc;\n }, {} as Record<string, { label: string; value: string | number }>),\n price: variant.product.price.final.amount.value,\n quantity: variant.quantity,\n subtotal: variant.product.price.final.amount.value * variant.quantity,\n image: variant.product.images[0]?.url || '',\n }));\n\n return tableData;\n }, [variants]);\n\n const variantsWithQuantity = useMemo(\n () => variants.filter((v) => v.quantity > 0).length,\n [variants]\n );\n\n return {\n variants,\n loading,\n updateQuantity,\n clearAllQuantities,\n exportToCsv,\n collectTableData,\n variantsWithQuantity,\n };\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { useText } from '@adobe-commerce/elsie/i18n';\nimport { classes, Container } from '@adobe-commerce/elsie/lib';\nimport { QuickOrderVariantsGrid as QuickOrderVariantsGridComponent } from '@/b2b-quick-order/components/QuickOrderVariantsGrid/QuickOrderVariantsGrid';\nimport { QuickOrderVariantsActions } from '@/b2b-quick-order/components/QuickOrderVariantsActions/QuickOrderVariantsActions';\nimport { useQuickOrderVariantsData } from '@/b2b-quick-order/hooks/useQuickOrderVariantsData';\nimport { QuickOrderVariantsGridProps } from '@/b2b-quick-order/types/quickOrderVariantsGrid.types';\n\nexport const QuickOrderVariantsGrid: Container<QuickOrderVariantsGridProps> = ({\n className,\n initialVariants,\n onVariantsLoaded,\n onSelectedVariantsChange,\n debounceMs = 300,\n initialLoading,\n visibleVariantsLimit = 10,\n columns,\n slots,\n}) => {\n const t = useText({\n imageColumn: 'QuickOrder.VariantsGrid.imageColumn',\n skuColumn: 'QuickOrder.VariantsGrid.skuColumn',\n availabilityColumn: 'QuickOrder.VariantsGrid.availabilityColumn',\n priceColumn: 'QuickOrder.VariantsGrid.priceColumn',\n quantityColumn: 'QuickOrder.VariantsGrid.quantityColumn',\n subtotalColumn: 'QuickOrder.VariantsGrid.subtotalColumn',\n clearButton: 'QuickOrder.VariantsGrid.clearButton',\n saveToCsvButton: 'QuickOrder.VariantsGrid.saveToCsvButton',\n collectDataButton: 'QuickOrder.VariantsGrid.collectDataButton',\n inStock: 'QuickOrder.VariantsGrid.inStock',\n outOfStock: 'QuickOrder.VariantsGrid.outOfStock',\n quantityLabel: 'QuickOrder.VariantsGrid.quantityLabel',\n showAll: 'QuickOrder.VariantsGrid.showAll',\n showLess: 'QuickOrder.VariantsGrid.showLess',\n });\n\n const {\n variants,\n loading,\n updateQuantity,\n clearAllQuantities,\n exportToCsv,\n collectTableData,\n variantsWithQuantity,\n } = useQuickOrderVariantsData({\n initialVariants,\n onVariantsLoaded,\n onSelectedVariantsChange,\n debounceMs,\n initialLoading,\n });\n\n if (variants.length === 0 && !loading) {\n return null;\n }\n\n return (\n <div\n className={classes([\n 'b2b-quick-order-variants-grid-container',\n className,\n ])}\n data-testid=\"variants-grid-container\"\n >\n <QuickOrderVariantsActions\n t={t}\n onClear={clearAllQuantities}\n onSaveToCsv={exportToCsv}\n onCollectData={collectTableData}\n isDisabled={loading}\n variantsCount={variantsWithQuantity}\n slots={slots}\n />\n\n <QuickOrderVariantsGridComponent\n t={t}\n variants={variants}\n loading={loading}\n onQuantityChange={updateQuantity}\n visibleVariantsLimit={visibleVariantsLimit}\n columns={columns}\n slots={slots}\n />\n </div>\n );\n};\n"],"names":["useQuickOrderVariantsData","initialVariants","onVariantsLoaded","onSelectedVariantsChange","debounceMs","initialLoading","variants","setVariants","useState","variantsRef","useRef","loading","setLoading","useEffect","events","variantsEvent","incomingVariants","variantsWithQuantity","variant","debouncedSelectedVariantsChange","useMemo","debounce","updatedVariants","collectedData","v","acc","attr","_a","updateQuantity","useCallback","sku","quantity","prevVariants","updated","clearAllQuantities","cleared","clearAllQuantitiesEvent","exportToCsv","variantsToExport","csvHeader","csvRows","csvContent","blob","link","url","timestamp","collectTableData","QuickOrderVariantsGrid","className","visibleVariantsLimit","columns","slots","t","useText","jsxs","classes","jsx","QuickOrderVariantsActions","QuickOrderVariantsGridComponent"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import { UseQuickOrderVariantsDataProps, UseQuickOrderVariantsDataReturn } from '../types';
2
2
 
3
- export declare const useQuickOrderVariantsData: ({ initialVariants, fetchVariants, onVariantsLoaded, onTableDataChange, debounceMs, initialLoading, }?: UseQuickOrderVariantsDataProps) => UseQuickOrderVariantsDataReturn;
3
+ export declare const useQuickOrderVariantsData: ({ initialVariants, onVariantsLoaded, onSelectedVariantsChange, debounceMs, initialLoading, }?: UseQuickOrderVariantsDataProps) => UseQuickOrderVariantsDataReturn;
4
4
  //# sourceMappingURL=useQuickOrderVariantsData.d.ts.map
@@ -1,94 +1,94 @@
1
1
  declare const _default: {
2
- "QuickOrder": {
3
- "Search": {
4
- "placeholder": "Search by SKU...",
5
- "ariaLabel": "Search for products by SKU",
6
- "emptyState": "No results found",
7
- "resultsAvailable": "results available",
8
- "resultAvailable": "result available",
9
- "srInstructions": "Use arrow keys or Tab to navigate, Enter or Space to select, Escape to close."
10
- },
11
- "SkuListInput": {
12
- "title": "Add Products by SKU",
13
- "helperText": "Use commas or paragraphs to separate SKUs.",
14
- "textArea": {
15
- "label": "Enter Multiple SKUs",
16
- "placeholder": "Enter SKUs here..."
17
- },
18
- "button": "Add to List"
19
- },
20
- "CsvFileInput": {
21
- "title": "Add from File",
22
- "helperText": "File must be in .csv format and include \"SKU\" and \"QTY\" columns ",
23
- "downloadSample": "Download sample",
24
- "inputLabel": "Choose File",
25
- "selectedFile": "Selected file",
26
- "uploadCSVErrors": {
27
- "invalidFile": "Invalid CSV file",
28
- "emptyFile": "File is empty",
29
- "missingColumns": "Must contain \"SKU\" and \"QTY\" columns",
30
- "extraColumns": "Must contain only \"SKU\" and \"QTY\" columns",
31
- "maxRowsExceeded": "File exceeds maximum of {maxRows} rows",
32
- "skuRequired": "Row {rowNumber}: SKU is required",
33
- "invalidQuantity": "Row {rowNumber}: QTY must be a positive integer",
34
- "noValidData": "File contains no valid data rows",
35
- "onlyCSV": "Only CSV files are allowed",
36
- "failedToRead": "Failed to read file",
37
- "failedToParse": "Failed to parse CSV file"
38
- }
39
- },
40
- "QuickOrderItem": {
41
- "title": "Enter SKU or search by Product Name",
42
- "quantity": "Quantity: ",
43
- "price": "Price: ",
44
- "sku": "SKU",
45
- "remove": "Remove",
46
- "removeItem": "Remove item",
47
- "showOptions": "Show additional options",
48
- "hideOptions": "Hide additional options",
49
- "additionalOptions": "Additional options",
50
- "noAdditionalOptions": "No additional options available",
51
- "emptyList": "No products in the list",
52
- "loading": "Loading...",
53
- "productNotFound": "Product not found",
54
- "productNotFoundDescription": "The product with SKU {sku} could not be found",
55
- "configurableProductError": "Configuration required",
56
- "configurableProductErrorDescription": "Use ProductOptions Slot in QuickOrderItems container to enable configurable product options.",
57
- "configurableOptionsWarning": "Product configuration required",
58
- "configurableOptionsWarningDescription": "Please select all required product options before adding to cart",
59
- "productOptions": "Product Options",
60
- "outOfStock": "Out of Stock",
61
- "addAllToCart": "Add to Cart",
62
- "disabledMessage": "Quick Order feature disabled",
63
- "notification": {
64
- "validationError": "Product(s) require(s) your attention",
65
- "backendError": "An error occurred while adding products to the cart",
66
- "success": "{count} product(s) successfully added to the cart",
67
- "partialSuccess": "{count} of {total} products were added to the cart. Some products could not be added",
68
- "unexpectedError": "An unexpected error has occurred"
69
- }
70
- },
71
- "VariantsGrid": {
72
- "imageColumn": "Image",
73
- "attributesColumn": "Attributes",
74
- "variantColumn": "Variant",
75
- "skuColumn": "SKU",
76
- "availabilityColumn": "Availability",
77
- "priceColumn": "Price",
78
- "minOrderColumn": "Min Order / Pack Size",
79
- "quantityColumn": "Quantity",
80
- "subtotalColumn": "Subtotal",
81
- "clearButton": "Clear",
82
- "saveToCsvButton": "Save to CSV",
83
- "collectDataButton": "Collect Data",
84
- "inStock": "In Stock",
85
- "outOfStock": "Out of Stock",
86
- "tableCaption": "Product Variants Grid",
87
- "quantityLabel": "Quantity for",
88
- "showAll": "Show All Items",
89
- "showLess": "Show Less"
90
- }
2
+ "QuickOrder": {
3
+ "Search": {
4
+ "placeholder": "Search by SKU...",
5
+ "ariaLabel": "Search for products by SKU",
6
+ "emptyState": "No results found",
7
+ "resultsAvailable": "results available",
8
+ "resultAvailable": "result available",
9
+ "srInstructions": "Use arrow keys or Tab to navigate, Enter or Space to select, Escape to close."
10
+ },
11
+ "SkuListInput": {
12
+ "title": "Add Products by SKU",
13
+ "helperText": "Use commas or paragraphs to separate SKUs.",
14
+ "textArea": {
15
+ "label": "Enter Multiple SKUs",
16
+ "placeholder": "Enter SKUs here..."
17
+ },
18
+ "button": "Add to List"
19
+ },
20
+ "CsvFileInput": {
21
+ "title": "Add from File",
22
+ "helperText": "File must be in .csv format and include \"SKU\" and \"QTY\" columns ",
23
+ "downloadSample": "Download sample",
24
+ "inputLabel": "Choose File",
25
+ "selectedFile": "Selected file",
26
+ "uploadCSVErrors": {
27
+ "invalidFile": "Invalid CSV file",
28
+ "emptyFile": "File is empty",
29
+ "missingColumns": "Must contain \"SKU\" and \"QTY\" columns",
30
+ "extraColumns": "Must contain only \"SKU\" and \"QTY\" columns",
31
+ "maxRowsExceeded": "File exceeds maximum of {maxRows} rows",
32
+ "skuRequired": "Row {rowNumber}: SKU is required",
33
+ "invalidQuantity": "Row {rowNumber}: QTY must be a positive integer",
34
+ "noValidData": "File contains no valid data rows",
35
+ "onlyCSV": "Only CSV files are allowed",
36
+ "failedToRead": "Failed to read file",
37
+ "failedToParse": "Failed to parse CSV file"
38
+ }
39
+ },
40
+ "QuickOrderItem": {
41
+ "title": "Enter SKU or search by Product Name",
42
+ "quantity": "Quantity: ",
43
+ "price": "Price: ",
44
+ "sku": "SKU",
45
+ "remove": "Remove",
46
+ "removeItem": "Remove item",
47
+ "showOptions": "Show additional options",
48
+ "hideOptions": "Hide additional options",
49
+ "additionalOptions": "Additional options",
50
+ "noAdditionalOptions": "No additional options available",
51
+ "emptyList": "No products in the list",
52
+ "loading": "Loading...",
53
+ "productNotFound": "Product not found",
54
+ "productNotFoundDescription": "The product with SKU {sku} could not be found",
55
+ "configurableProductError": "Configuration required",
56
+ "configurableProductErrorDescription": "Use ProductOptions Slot in QuickOrderItems container to enable configurable product options.",
57
+ "configurableOptionsWarning": "Product configuration required",
58
+ "configurableOptionsWarningDescription": "Please select all required product options before adding to cart",
59
+ "productOptions": "Product Options",
60
+ "outOfStock": "Out of Stock",
61
+ "addAllToCart": "Add to Cart",
62
+ "disabledMessage": "Quick Order feature disabled",
63
+ "notification": {
64
+ "validationError": "Product(s) require(s) your attention",
65
+ "backendError": "An error occurred while adding products to the cart",
66
+ "success": "{count} product(s) successfully added to the cart",
67
+ "partialSuccess": "{count} of {total} products were added to the cart. Some products could not be added",
68
+ "unexpectedError": "An unexpected error has occurred"
69
+ }
70
+ },
71
+ "VariantsGrid": {
72
+ "imageColumn": "Image",
73
+ "attributesColumn": "Attributes",
74
+ "skuColumn": "SKU",
75
+ "availabilityColumn": "Availability",
76
+ "priceColumn": "Price",
77
+ "minOrderColumn": "Min Order / Pack Size",
78
+ "quantityColumn": "Quantity",
79
+ "subtotalColumn": "Subtotal",
80
+ "clearButton": "Clear",
81
+ "saveToCsvButton": "Save to CSV",
82
+ "collectDataButton": "Collect Data",
83
+ "inStock": "In Stock",
84
+ "outOfStock": "Out of Stock",
85
+ "tableCaption": "Product Variants Grid",
86
+ "quantityLabel": "Quantity for",
87
+ "showAll": "Show All Items",
88
+ "showLess": "Show Less"
91
89
  }
92
- };
90
+ }
91
+ }
92
+ ;
93
93
 
94
94
  export default _default;
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name": "@dropins/storefront-quick-order", "version": "0.1.2-alpha3", "@dropins/tools": "~1.7.0", "license": "SEE LICENSE IN LICENSE.md"}
1
+ {"name": "@dropins/storefront-quick-order", "version": "1.0.0-beta2", "@dropins/tools": "~1.7.0", "license": "SEE LICENSE IN LICENSE.md"}
package/render.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /*! Copyright 2026 Adobe
2
2
  All Rights Reserved. */
3
- (function(t,i){try{if(typeof document<"u"){const r=document.createElement("style"),a=i.styleId;for(const e in i.attributes)r.setAttribute(e,i.attributes[e]);r.setAttribute("data-dropin",a),r.appendChild(document.createTextNode(t));const o=document.querySelector('style[data-dropin="sdk"]');if(o)o.after(r);else{const e=document.querySelector('link[rel="stylesheet"], style');e?e.before(r):document.head.append(r)}}}catch(r){console.error("dropin-styles (injectCodeFunction)",r)}})(`.b2b-quick-order-variants-grid{width:100%}.b2b-quick-order-variants-grid .dropin-table__header__row th{padding:var(--spacing-small) var(--spacing-xsmall)}.b2b-quick-order-variants-grid .dropin-table__body__cell{padding:var(--spacing-xsmall) var(--spacing-xsmall)}.b2b-quick-order-variants-grid__table{width:100%}.b2b-quick-order-variants-grid__image{width:64px;height:64px;object-fit:cover;border-radius:var(--border-radius-small, 4px);display:block}.b2b-quick-order-variants-grid__variant{display:flex;flex-direction:column;gap:4px}.b2b-quick-order-variants-grid__attribute{font-size:14px;line-height:1.4}.b2b-quick-order-variants-grid__attribute strong{font-weight:600;margin-right:4px}.b2b-quick-order-variants-grid__availability{font-size:14px;font-weight:500;padding:4px 8px;border-radius:var(--border-radius-small, 4px)}.b2b-quick-order-variants-grid__availability--in-stock{color:var(--color-success-text, #1a7f37);background-color:var(--color-success-bg, #d1f4dd)}.b2b-quick-order-variants-grid__availability--in-stock .dropin-tag-container__label{color:var(--color-success-text, #1a7f37)}.b2b-quick-order-variants-grid__availability--out-of-stock{color:var(--color-error-text, #d1242f);background-color:var(--color-error-bg, #ffe0e0)}.b2b-quick-order-variants-grid__availability--out-of-stock .dropin-tag-container__label{color:var(--color-error-text, #d1242f)}.b2b-quick-order-variants-grid__quantity-input{width:min-content;padding:8px;border-radius:var(--border-radius-small, 4px);font-size:14px;text-align:center}.b2b-quick-order-variants-grid__quantity-input:focus{outline:2px solid var(--color-primary, #0066cc);outline-offset:2px}.b2b-quick-order-variants-grid__quantity-input:disabled{background-color:var(--color-disabled-bg, #f5f5f5);color:var(--color-disabled-text, #999);cursor:not-allowed;opacity:.6;border-color:var(--color-border-disabled, #e0e0e0)}.b2b-quick-order-variants-grid__footer{display:flex;justify-content:center;margin-top:var(--spacing-medium, 16px);padding-top:var(--spacing-medium, 16px);border-top:1px solid var(--color-border, #e0e0e0)}.b2b-quick-order-variants-grid__toggle-button{min-width:200px}@media (max-width: 600px){.b2b-quick-order-variants-grid__image{width:48px;height:48px}.b2b-quick-order-variants-grid__quantity-input{width:100%}.b2b-quick-order-variants-grid__attribute{font-size:12px}}.b2b-quick-order-variants-actions{display:flex;justify-content:flex-end;align-items:center;padding:var(--spacing-medium, 16px);gap:var(--spacing-small, 8px)}.b2b-quick-order-variants-actions__buttons{display:flex;gap:var(--spacing-small, 8px)}@media (max-width: 600px){.b2b-quick-order-variants-actions{flex-direction:column;align-items:stretch}.b2b-quick-order-variants-actions__buttons{flex-direction:column;width:100%}}
4
- .b2b-quick-order-quick-order-multiple-sku{display:flex;flex-direction:column;gap:var(--grid-1-gutters)}.b2b-quick-order-sku-list-input__title{color:var(--color-neutral-800);font:var(--type-headline-2-font);letter-spacing:var(--type-headline-2-letter-spacing);margin-bottom:var(--spacing-small)}.b2b-quick-order-sku-list-input__textarea{margin-bottom:var(--spacing-xsmall)}.b2b-quick-order-sku-list-input__message{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);margin-bottom:var(--spacing-xsmall);text-align:left}.b2b-quick-order-csv-file-input{display:flex;flex-direction:column;gap:var(--grid-1-gutters)}.b2b-quick-order-csv-file-input__title{color:var(--color-neutral-800);font:var(--type-headline-2-font);letter-spacing:var(--type-headline-2-letter-spacing)}.b2b-quick-order-csv-file-input__helper{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);text-align:left}.b2b-quick-order-csv-file-input__download-link{color:var(--color-informational-800);text-decoration:underline;background:none;border:none;padding:0;cursor:pointer;font-size:inherit}.b2b-quick-order-csv-file-input__download-link:hover{color:var(--color-informational-500)}.b2b-quick-order-csv-file-input__input-wrapper{margin-top:var(--spacing-xsmall);width:max-content}.b2b-quick-order-csv-file-input__input{width:100%}.b2b-quick-order-csv-file-input__input-wrapper--disabled button,.b2b-quick-order-csv-file-input__input-wrapper--disabled label,.b2b-quick-order-csv-file-input__input-wrapper--disabled .dropin-button{background:var(--color-neutral-300) 0 0% no-repeat padding-box!important;color:var(--color-neutral-500)!important;fill:var(--color-neutral-300)!important;pointer-events:none;-webkit-user-select:none;user-select:none;cursor:not-allowed!important}.b2b-quick-order-csv-file-input__input:has(input:disabled) button,.b2b-quick-order-csv-file-input__input:has(input:disabled) label{background:var(--color-neutral-300) 0 0% no-repeat padding-box;color:var(--color-neutral-500);fill:var(--color-neutral-300);pointer-events:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.b2b-quick-order-csv-file-input__input--loading{cursor:not-allowed;opacity:.3}.b2b-quick-order-csv-file-input__file-name{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.b2b-quick-order-csv-file-input__error{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);padding-top:var(--spacing-xsmall);text-align:left;color:var(--color-alert-800)}.b2b-quick-order-form-quick-order-items-list{width:100%}.b2b-quick-order-form-quick-order-items-list__title{color:var(--color-neutral-800);font:var(--type-headline-2-font);letter-spacing:var(--type-headline-2-letter-spacing);margin-bottom:var(--spacing-small)}.b2b-quick-order-form-quick-order-items-list__empty{color:var(--color-neutral-600);font:var(--type-body-1-font);letter-spacing:var(--type-body-1-letter-spacing);text-align:center;padding:var(--spacing-large)}.b2b-quick-order-form-quick-order-items-list__actions{display:flex;justify-content:flex-start;margin-top:var(--spacing-medium)}.b2b-quick-order-form-quick-order-items-list__warning{background-color:var(--color-warning-200, #fef3cd);border:1px solid var(--color-warning-500, #ff9800);border-radius:var(--shape-border-radius-2);padding:var(--spacing-medium);margin-bottom:var(--spacing-medium)}.b2b-quick-order-form-quick-order-items-list__warning-title{color:var(--color-warning-800, #e65100);font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-strong-letter-spacing);margin-bottom:var(--spacing-xsmall)}.b2b-quick-order-form-quick-order-items-list__warning-description{color:var(--color-warning-700, #f57c00);font:var(--type-body-2-font);letter-spacing:var(--type-body-2-letter-spacing)}.b2b-quick-order-form-quick-order-items-list .dropin-divider--secondary{border-width:var(--shape-border-width-3);margin-top:0}@media screen and (max-width: 1285px){.b2b-quick-order-form-quick-order-items-list .dropin-divider--secondary{display:none}}.b2b-quick-order-form-quick-order-items-list__actions--disabled{background-color:red}.b2b-quick-order-form-quick-order-items__item-form{min-height:170px}.b2b-quick-order-form-quick-order-items__item-form .dropin-accordion-section__content-container{margin-bottom:0}.b2b-quick-order-form-quick-order-items__item-form:last-child{margin-bottom:var(--spacing-medium)}.b2b-quick-order-list-item__accordion .dropin-accordion-section__title{color:var(--color-neutral-800);font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.b2b-quick-order-items__error{color:var(--color-alert-800);font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing)}.b2b-quick-order-form-quick-order-items__item-search{margin-bottom:var(--spacing-big)}.b2b-quick-order-items__configurable-error{color:var(--color-alert-500);font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing)}.b2b-quick-order-search{position:relative;width:100%}.b2b-quick-order-search__input{width:100%}.b2b-quick-order-search__results{position:absolute;top:100%;left:0;right:0;background-color:var(--color-neutral-50);border:var(--shape-border-width-1) solid var(--color-neutral-300);border-radius:var(--spacing-xxsmall);margin-top:var(--spacing-xxsmall);max-height:300px;overflow-y:auto;z-index:10;box-shadow:0 2px 8px #0000001a}.b2b-quick-order-search__result-item{padding:var(--spacing-xsmall) var(--spacing-small);cursor:pointer;transition:background-color .2s,outline .2s}.b2b-quick-order-search__result-item:hover{background-color:var(--color-neutral-100)}.b2b-quick-order-search__result-item--active,.b2b-quick-order-search__result-item[aria-selected=true]{background-color:var(--color-neutral-100);outline:2px solid var(--color-brand-500);outline-offset:-2px}.b2b-quick-order-search__result-item:not(:last-child){border-bottom:var(--shape-border-width-1) solid var(--color-neutral-200)}.b2b-quick-order-search__empty-state{position:absolute;top:100%;left:0;right:0;z-index:10;text-align:center;background-color:var(--color-neutral-50);border:var(--shape-border-width-1) solid var(--color-neutral-300);border-radius:var(--shape-border-radius-1);margin-top:var(--spacing-xxsmall);padding:var(--spacing-small);color:var(--color-neutral-600);box-shadow:0 2px 8px #0000001a}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.b2b-quick-order-notification-banner{margin-bottom:20px}.b2b-quick-order-notification-banner .dropin-alert-banner__message{max-width:500px}.b2b-quick-order-notification-banner--warning .dropin-alert-banner{background-color:var(--color-warning-500)}.b2b-quick-order-notification-banner--success .dropin-alert-banner{background-color:var(--color-positive-500)}.b2b-quick-order-notification-banner--neutral .dropin-alert-banner{background-color:var(--color-neutral-600)}.b2b-quick-order-notification-banner--brand .dropin-alert-banner{background-color:var(--color-brand-500)}.b2b-quick-order-disabled-overlay{position:relative}.b2b-quick-order-disabled-overlay__blur{position:absolute;top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background-color:#ffffffb3;z-index:1}.b2b-quick-order-disabled-overlay__message{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2;font-size:16px;font-weight:500;color:#666;text-align:center;padding:20px}`,{styleId:"b2b-quick-order"});
5
- import{jsx as t}from"@dropins/tools/preact-jsx-runtime.js";import{Render as n}from"@dropins/tools/lib.js";import{useState as l,useEffect as s}from"@dropins/tools/preact-hooks.js";import{UIProvider as d}from"@dropins/tools/components.js";import{events as u}from"@dropins/tools/event-bus.js";const c={Search:{placeholder:"Search by SKU...",ariaLabel:"Search for products by SKU",emptyState:"No results found",resultsAvailable:"results available",resultAvailable:"result available",srInstructions:"Use arrow keys or Tab to navigate, Enter or Space to select, Escape to close."},SkuListInput:{title:"Add Products by SKU",helperText:"Use commas or paragraphs to separate SKUs.",textArea:{label:"Enter Multiple SKUs",placeholder:"Enter SKUs here..."},button:"Add to List"},CsvFileInput:{title:"Add from File",helperText:'File must be in .csv format and include "SKU" and "QTY" columns ',downloadSample:"Download sample",inputLabel:"Choose File",selectedFile:"Selected file",uploadCSVErrors:{invalidFile:"Invalid CSV file",emptyFile:"File is empty",missingColumns:'Must contain "SKU" and "QTY" columns',extraColumns:'Must contain only "SKU" and "QTY" columns',maxRowsExceeded:"File exceeds maximum of {maxRows} rows",skuRequired:"Row {rowNumber}: SKU is required",invalidQuantity:"Row {rowNumber}: QTY must be a positive integer",noValidData:"File contains no valid data rows",onlyCSV:"Only CSV files are allowed",failedToRead:"Failed to read file",failedToParse:"Failed to parse CSV file"}},QuickOrderItem:{title:"Enter SKU or search by Product Name",quantity:"Quantity: ",price:"Price: ",sku:"SKU",remove:"Remove",removeItem:"Remove item",showOptions:"Show additional options",hideOptions:"Hide additional options",additionalOptions:"Additional options",noAdditionalOptions:"No additional options available",emptyList:"No products in the list",loading:"Loading...",productNotFound:"Product not found",productNotFoundDescription:"The product with SKU {sku} could not be found",configurableProductError:"Configuration required",configurableProductErrorDescription:"Use ProductOptions Slot in QuickOrderItems container to enable configurable product options.",configurableOptionsWarning:"Product configuration required",configurableOptionsWarningDescription:"Please select all required product options before adding to cart",productOptions:"Product Options",outOfStock:"Out of Stock",addAllToCart:"Add to Cart",disabledMessage:"Quick Order feature disabled",notification:{validationError:"Product(s) require(s) your attention",backendError:"An error occurred while adding products to the cart",success:"{count} product(s) successfully added to the cart",partialSuccess:"{count} of {total} products were added to the cart. Some products could not be added",unexpectedError:"An unexpected error has occurred"}},VariantsGrid:{imageColumn:"Image",attributesColumn:"Attributes",variantColumn:"Variant",skuColumn:"SKU",availabilityColumn:"Availability",priceColumn:"Price",minOrderColumn:"Min Order / Pack Size",quantityColumn:"Quantity",subtotalColumn:"Subtotal",clearButton:"Clear",saveToCsvButton:"Save to CSV",collectDataButton:"Collect Data",inStock:"In Stock",outOfStock:"Out of Stock",tableCaption:"Product Variants Grid",quantityLabel:"Quantity for",showAll:"Show All Items",showLess:"Show Less"}},p={QuickOrder:c},m={default:p},S=({children:o})=>{const[r,i]=l("en_US");return s(()=>{const e=u.on("locale",a=>{i(a)},{eager:!0});return()=>{e==null||e.off()}},[]),t(d,{lang:r,langDefinitions:m,children:o})},g=new n(t(S,{}));export{g as render};
3
+ (function(t,i){try{if(typeof document<"u"){const r=document.createElement("style"),a=i.styleId;for(const e in i.attributes)r.setAttribute(e,i.attributes[e]);r.setAttribute("data-dropin",a),r.appendChild(document.createTextNode(t));const o=document.querySelector('style[data-dropin="sdk"]');if(o)o.after(r);else{const e=document.querySelector('link[rel="stylesheet"], style');e?e.before(r):document.head.append(r)}}}catch(r){console.error("dropin-styles (injectCodeFunction)",r)}})(`.b2b-quick-order-variants-grid{width:100%}.b2b-quick-order-variants-grid .dropin-table__header__row th{padding:var(--spacing-small) var(--spacing-xsmall)}.b2b-quick-order-variants-grid .dropin-table__body__cell{padding:var(--spacing-xsmall) var(--spacing-xsmall)}.b2b-quick-order-variants-grid__table{width:100%}.b2b-quick-order-variants-grid__image{width:64px;height:64px;object-fit:cover;border-radius:var(--shape-border-radius-1);display:block}.b2b-quick-order-variants-grid__variant{display:flex;flex-direction:column;gap:var(--spacing-xxsmall)}.b2b-quick-order-variants-grid__availability{width:fit-content;border-radius:var(--shape-border-radius-1)}.b2b-quick-order-variants-grid__availability--in-stock{color:var(--color-positive-800);background-color:var(--color-positive-200)}.b2b-quick-order-variants-grid__availability--out-of-stock{color:var(--color-warning-800);background-color:var(--color-warning-200)}.b2b-quick-order-variants-grid__quantity-input{width:min-content}.b2b-quick-order-variants-grid__footer{display:flex;justify-content:center;margin-top:var(--spacing-medium);padding-top:var(--spacing-medium);border-top:1px solid var(--color-neutral-500)}.b2b-quick-order-variants-grid__toggle-button{min-width:200px}@media (max-width: 600px){.b2b-quick-order-variants-grid__image{width:48px;height:48px}}.b2b-quick-order-variants-actions{display:flex;justify-content:flex-end;align-items:center;padding:var(--spacing-medium) 0;gap:var(--spacing-small)}.b2b-quick-order-variants-actions__buttons{display:flex;gap:var(--spacing-small)}@media (max-width: 600px){.b2b-quick-order-variants-actions{flex-direction:column;align-items:stretch}.b2b-quick-order-variants-actions__buttons{flex-direction:column;width:100%}}
4
+ .b2b-quick-order-quick-order-multiple-sku{display:flex;flex-direction:column;gap:var(--grid-1-gutters)}.b2b-quick-order-sku-list-input__title{color:var(--color-neutral-800);font:var(--type-headline-2-font);letter-spacing:var(--type-headline-2-letter-spacing);margin-bottom:var(--spacing-small)}.b2b-quick-order-sku-list-input__textarea{margin-bottom:var(--spacing-xsmall)}.b2b-quick-order-sku-list-input__message{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);margin-bottom:var(--spacing-xsmall);text-align:left}.b2b-quick-order-csv-file-input{display:flex;flex-direction:column;gap:var(--grid-1-gutters)}.b2b-quick-order-csv-file-input__title{color:var(--color-neutral-800);font:var(--type-headline-2-font);letter-spacing:var(--type-headline-2-letter-spacing)}.b2b-quick-order-csv-file-input__helper{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);text-align:left}.b2b-quick-order-csv-file-input__download-link{color:var(--color-informational-800);text-decoration:underline;background:none;border:none;padding:0;cursor:pointer;font-size:inherit}.b2b-quick-order-csv-file-input__download-link:hover{color:var(--color-informational-500)}.b2b-quick-order-csv-file-input__input-wrapper{margin-top:var(--spacing-xsmall);width:max-content}.b2b-quick-order-csv-file-input__input{width:100%}.b2b-quick-order-csv-file-input__input-wrapper--disabled button,.b2b-quick-order-csv-file-input__input-wrapper--disabled label,.b2b-quick-order-csv-file-input__input-wrapper--disabled .dropin-button{background:var(--color-neutral-300) 0 0% no-repeat padding-box!important;color:var(--color-neutral-500)!important;fill:var(--color-neutral-300)!important;pointer-events:none;-webkit-user-select:none;user-select:none;cursor:not-allowed!important}.b2b-quick-order-csv-file-input__input:has(input:disabled) button,.b2b-quick-order-csv-file-input__input:has(input:disabled) label{background:var(--color-neutral-300) 0 0% no-repeat padding-box;color:var(--color-neutral-500);fill:var(--color-neutral-300);pointer-events:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.b2b-quick-order-csv-file-input__input--loading{cursor:not-allowed;opacity:.3}.b2b-quick-order-csv-file-input__file-name{font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.b2b-quick-order-csv-file-input__error{font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing);padding-top:var(--spacing-xsmall);text-align:left;color:var(--color-alert-800)}.b2b-quick-order-form-quick-order-items-list{width:100%}.b2b-quick-order-form-quick-order-items-list__title{color:var(--color-neutral-800);font:var(--type-headline-2-font);letter-spacing:var(--type-headline-2-letter-spacing);margin-bottom:var(--spacing-small)}.b2b-quick-order-form-quick-order-items-list__empty{color:var(--color-neutral-600);font:var(--type-body-1-font);letter-spacing:var(--type-body-1-letter-spacing);text-align:center;padding:var(--spacing-large)}.b2b-quick-order-form-quick-order-items-list__actions{display:flex;justify-content:flex-start;margin-top:var(--spacing-medium)}.b2b-quick-order-form-quick-order-items-list__warning{background-color:var(--color-warning-200);border:1px solid var(--color-warning-500);border-radius:var(--shape-border-radius-2);padding:var(--spacing-medium);margin-bottom:var(--spacing-medium)}.b2b-quick-order-form-quick-order-items-list__warning-title{color:var(--color-warning-800, #e65100);font:var(--type-body-1-strong-font);letter-spacing:var(--type-body-1-strong-letter-spacing);margin-bottom:var(--spacing-xsmall)}.b2b-quick-order-form-quick-order-items-list__warning-description{color:var(--color-warning-700, #f57c00);font:var(--type-body-2-font);letter-spacing:var(--type-body-2-letter-spacing)}.b2b-quick-order-form-quick-order-items-list .dropin-divider--secondary{border-width:var(--shape-border-width-3);margin-top:0}@media screen and (max-width: 1285px){.b2b-quick-order-form-quick-order-items-list .dropin-divider--secondary{display:none}}.b2b-quick-order-form-quick-order-items-list__actions--disabled{background-color:red}.b2b-quick-order-form-quick-order-items__item-form{min-height:170px}.b2b-quick-order-form-quick-order-items__item-form .dropin-accordion-section__content-container{margin-bottom:0}.b2b-quick-order-form-quick-order-items__item-form:last-child{margin-bottom:var(--spacing-medium)}.b2b-quick-order-list-item__accordion .dropin-accordion-section__title{color:var(--color-neutral-800);font:var(--type-body-2-default-font);letter-spacing:var(--type-body-2-default-letter-spacing)}.b2b-quick-order-items__error{color:var(--color-alert-800);font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing)}.b2b-quick-order-form-quick-order-items__item-search{margin-bottom:var(--spacing-big)}.b2b-quick-order-items__configurable-error{color:var(--color-alert-500);font:var(--type-details-caption-2-font);letter-spacing:var(--type-details-caption-2-letter-spacing)}.b2b-quick-order-search{position:relative;width:100%}.b2b-quick-order-search__input{width:100%}.b2b-quick-order-search__results{position:absolute;top:100%;left:0;right:0;background-color:var(--color-neutral-50);border:var(--shape-border-width-1) solid var(--color-neutral-300);border-radius:var(--spacing-xxsmall);margin-top:var(--spacing-xxsmall);max-height:300px;overflow-y:auto;z-index:10;box-shadow:0 2px 8px #0000001a}.b2b-quick-order-search__result-item{padding:var(--spacing-xsmall) var(--spacing-small);cursor:pointer;transition:background-color .2s,outline .2s}.b2b-quick-order-search__result-item:hover{background-color:var(--color-neutral-100)}.b2b-quick-order-search__result-item--active,.b2b-quick-order-search__result-item[aria-selected=true]{background-color:var(--color-neutral-100);outline:2px solid var(--color-brand-500);outline-offset:-2px}.b2b-quick-order-search__result-item:not(:last-child){border-bottom:var(--shape-border-width-1) solid var(--color-neutral-200)}.b2b-quick-order-search__empty-state{position:absolute;top:100%;left:0;right:0;z-index:10;text-align:center;background-color:var(--color-neutral-50);border:var(--shape-border-width-1) solid var(--color-neutral-300);border-radius:var(--shape-border-radius-1);margin-top:var(--spacing-xxsmall);padding:var(--spacing-small);color:var(--color-neutral-600);box-shadow:0 2px 8px #0000001a}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.b2b-quick-order-notification-banner{margin-bottom:20px}.b2b-quick-order-notification-banner .dropin-alert-banner__message{max-width:500px}.b2b-quick-order-notification-banner--warning .dropin-alert-banner{background-color:var(--color-warning-500)}.b2b-quick-order-notification-banner--success .dropin-alert-banner{background-color:var(--color-positive-500)}.b2b-quick-order-notification-banner--neutral .dropin-alert-banner{background-color:var(--color-neutral-600)}.b2b-quick-order-notification-banner--brand .dropin-alert-banner{background-color:var(--color-brand-500)}.b2b-quick-order-disabled-overlay{position:relative}.b2b-quick-order-disabled-overlay__blur{position:absolute;top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background-color:#ffffffb3;z-index:1}.b2b-quick-order-disabled-overlay__message{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2;font:var(--type-body-1-default-font);color:var(--color-brand-500);text-align:center;padding:var(--spacing-medium)}`,{styleId:"b2b-quick-order"});
5
+ import{jsx as o}from"@dropins/tools/preact-jsx-runtime.js";import{deepmerge as d,Render as u}from"@dropins/tools/lib.js";import{useState as c,useEffect as p}from"@dropins/tools/preact-hooks.js";import{UIProvider as m}from"@dropins/tools/components.js";import{events as f}from"@dropins/tools/event-bus.js";import{c as S}from"./chunks/getStoreConfig.js";import"@dropins/tools/fetch-graphql.js";const b={Search:{placeholder:"Search by SKU...",ariaLabel:"Search for products by SKU",emptyState:"No results found",resultsAvailable:"results available",resultAvailable:"result available",srInstructions:"Use arrow keys or Tab to navigate, Enter or Space to select, Escape to close."},SkuListInput:{title:"Add Products by SKU",helperText:"Use commas or paragraphs to separate SKUs.",textArea:{label:"Enter Multiple SKUs",placeholder:"Enter SKUs here..."},button:"Add to List"},CsvFileInput:{title:"Add from File",helperText:'File must be in .csv format and include "SKU" and "QTY" columns ',downloadSample:"Download sample",inputLabel:"Choose File",selectedFile:"Selected file",uploadCSVErrors:{invalidFile:"Invalid CSV file",emptyFile:"File is empty",missingColumns:'Must contain "SKU" and "QTY" columns',extraColumns:'Must contain only "SKU" and "QTY" columns',maxRowsExceeded:"File exceeds maximum of {maxRows} rows",skuRequired:"Row {rowNumber}: SKU is required",invalidQuantity:"Row {rowNumber}: QTY must be a positive integer",noValidData:"File contains no valid data rows",onlyCSV:"Only CSV files are allowed",failedToRead:"Failed to read file",failedToParse:"Failed to parse CSV file"}},QuickOrderItem:{title:"Enter SKU or search by Product Name",quantity:"Quantity: ",price:"Price: ",sku:"SKU",remove:"Remove",removeItem:"Remove item",showOptions:"Show additional options",hideOptions:"Hide additional options",additionalOptions:"Additional options",noAdditionalOptions:"No additional options available",emptyList:"No products in the list",loading:"Loading...",productNotFound:"Product not found",productNotFoundDescription:"The product with SKU {sku} could not be found",configurableProductError:"Configuration required",configurableProductErrorDescription:"Use ProductOptions Slot in QuickOrderItems container to enable configurable product options.",configurableOptionsWarning:"Product configuration required",configurableOptionsWarningDescription:"Please select all required product options before adding to cart",productOptions:"Product Options",outOfStock:"Out of Stock",addAllToCart:"Add to Cart",disabledMessage:"Quick Order feature disabled",notification:{validationError:"Product(s) require(s) your attention",backendError:"An error occurred while adding products to the cart",success:"{count} product(s) successfully added to the cart",partialSuccess:"{count} of {total} products were added to the cart. Some products could not be added",unexpectedError:"An unexpected error has occurred"}},VariantsGrid:{imageColumn:"Image",attributesColumn:"Attributes",skuColumn:"SKU",availabilityColumn:"Availability",priceColumn:"Price",minOrderColumn:"Min Order / Pack Size",quantityColumn:"Quantity",subtotalColumn:"Subtotal",clearButton:"Clear",saveToCsvButton:"Save to CSV",collectDataButton:"Collect Data",inStock:"In Stock",outOfStock:"Out of Stock",tableCaption:"Product Variants Grid",quantityLabel:"Quantity for",showAll:"Show All Items",showLess:"Show Less"}},g={QuickOrder:b},h={default:g},C=({children:r})=>{var t;const[i,a]=c("en_US");p(()=>{const e=f.on("locale",l=>{a(l)},{eager:!0});return()=>{e==null||e.off()}},[]);const n=(t=S.getConfig())==null?void 0:t.langDefinitions,s=d(h,n??{});return o(m,{lang:i,langDefinitions:s,children:r})},A=new u(o(C,{}));export{A as render};
6
6
  //# sourceMappingURL=render.js.map
package/render.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sources":["/@dropins/storefront-quick-order/src/render/Provider.tsx","/@dropins/storefront-quick-order/src/render/render.tsx"],"sourcesContent":["import { FunctionComponent } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { UIProvider } from '@adobe-commerce/elsie/components';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\n\nimport en_US from '../i18n/en_US.json';\n\n// Langs\nconst langDefinitions = {\n default: en_US,\n};\n\ninterface CartProviderProps {\n children?: any;\n}\n\nexport const Provider: FunctionComponent<CartProviderProps> = ({\n children,\n}) => {\n const [lang, setLang] = useState<Lang>('en_US');\n\n // Events\n useEffect(() => {\n const localeEvent = events.on(\n 'locale',\n (locale: string) => {\n setLang(locale as Lang);\n },\n { eager: true }\n );\n return () => {\n localeEvent?.off();\n };\n }, []);\n\n return (\n <UIProvider lang={lang} langDefinitions={langDefinitions}>\n {children}\n </UIProvider>\n );\n};\n","import { Render } from '@adobe-commerce/elsie/lib';\nimport { Provider } from './Provider';\n\nexport const render = new Render(<Provider />);\n"],"names":["langDefinitions","en_US","Provider","children","lang","setLang","useState","useEffect","localeEvent","events","locale","jsx","UIProvider","render","Render"],"mappings":"6uGASMA,EAAkB,CACtB,QAASC,CACX,EAMaC,EAAiD,CAAC,CAC7D,SAAAC,CACF,IAAM,CACJ,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAe,OAAO,EAG9C,OAAAC,EAAU,IAAM,CACd,MAAMC,EAAcC,EAAO,GACzB,SACCC,GAAmB,CAClBL,EAAQK,CAAc,CACxB,EACA,CAAE,MAAO,EAAA,CAAK,EAEhB,MAAO,IAAM,CACXF,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAGHG,EAACC,EAAA,CAAW,KAAAR,EAAY,gBAAAJ,EACrB,SAAAG,CAAA,CACH,CAEJ,ECtCaU,EAAS,IAAIC,EAAOH,EAACT,IAAS,CAAE"}
1
+ {"version":3,"file":"render.js","sources":["/@dropins/storefront-quick-order/src/render/Provider.tsx","/@dropins/storefront-quick-order/src/render/render.tsx"],"sourcesContent":["import { FunctionComponent } from 'preact';\nimport { useState, useEffect } from 'preact/hooks';\nimport { UIProvider } from '@adobe-commerce/elsie/components';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport { deepmerge } from '@adobe-commerce/elsie/lib';\nimport { config } from '@/b2b-quick-order/api';\n\nimport en_US from '../i18n/en_US.json';\n\n// Langs\nconst langDefinitions = {\n default: en_US,\n};\n\ninterface CartProviderProps {\n children?: any;\n}\n\nexport const Provider: FunctionComponent<CartProviderProps> = ({\n children,\n}) => {\n const [lang, setLang] = useState<Lang>('en_US');\n\n // Events\n useEffect(() => {\n const localeEvent = events.on(\n 'locale',\n (locale: string) => {\n setLang(locale as Lang);\n },\n { eager: true }\n );\n return () => {\n localeEvent?.off();\n };\n }, []);\n\n const userLangDefinitions = config.getConfig()?.langDefinitions;\n const definitions = deepmerge(langDefinitions, userLangDefinitions ?? {});\n\n return (\n <UIProvider lang={lang} langDefinitions={definitions}>\n {children}\n </UIProvider>\n );\n};\n","import { Render } from '@adobe-commerce/elsie/lib';\nimport { Provider } from './Provider';\n\nexport const render = new Render(<Provider />);\n"],"names":["langDefinitions","en_US","Provider","children","lang","setLang","useState","useEffect","localeEvent","events","locale","userLangDefinitions","_a","config","definitions","deepmerge","jsx","UIProvider","render","Render"],"mappings":"2zGAWMA,EAAkB,CACtB,QAASC,CACX,EAMaC,EAAiD,CAAC,CAC7D,SAAAC,CACF,IAAM,OACJ,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAe,OAAO,EAG9CC,EAAU,IAAM,CACd,MAAMC,EAAcC,EAAO,GACzB,SACCC,GAAmB,CAClBL,EAAQK,CAAc,CACxB,EACA,CAAE,MAAO,EAAA,CAAK,EAEhB,MAAO,IAAM,CACXF,GAAA,MAAAA,EAAa,KACf,CACF,EAAG,CAAA,CAAE,EAEL,MAAMG,GAAsBC,EAAAC,EAAO,UAAA,IAAP,YAAAD,EAAoB,gBAC1CE,EAAcC,EAAUf,EAAiBW,GAAuB,CAAA,CAAE,EAExE,OACEK,EAACC,EAAA,CAAW,KAAAb,EAAY,gBAAiBU,EACtC,SAAAX,EACH,CAEJ,EC3Cae,EAAS,IAAIC,EAAOH,EAACd,IAAS,CAAE"}
@@ -31,7 +31,6 @@ export interface ProductVariant {
31
31
  export interface VariantRow {
32
32
  id: string;
33
33
  image: VNode | string;
34
- variant: VNode | string;
35
34
  sku: VNode | string;
36
35
  availability: VNode | string;
37
36
  price: VNode | string;
@@ -42,10 +41,23 @@ export interface VariantRow {
42
41
  export interface VariantWithQuantity extends ProductVariant {
43
42
  quantity: number;
44
43
  }
44
+ export interface VariantTableData {
45
+ sku: string;
46
+ name: string;
47
+ inStock: boolean;
48
+ attributes: Record<string, {
49
+ label: string;
50
+ value: string | number;
51
+ }>;
52
+ price: number;
53
+ quantity: number;
54
+ subtotal: number;
55
+ image: string;
56
+ }
45
57
  export type VariantActionsContext = {
46
58
  onClear: () => void;
47
59
  onSaveToCsv: () => void;
48
- onCollectData: () => any[];
60
+ onCollectData: () => VariantTableData[];
49
61
  isDisabled: boolean;
50
62
  variantsCount: number;
51
63
  };
@@ -56,28 +68,25 @@ export type VariantCellContext = {
56
68
  };
57
69
  export interface UseQuickOrderVariantsDataProps {
58
70
  initialVariants?: ProductVariant[];
59
- fetchVariants?: () => Promise<ProductVariant[]>;
60
71
  onVariantsLoaded?: (variants: VariantWithQuantity[]) => void;
61
- onTableDataChange?: (data: any[]) => void;
72
+ onSelectedVariantsChange?: (data: VariantTableData[]) => void;
62
73
  debounceMs?: number;
63
74
  initialLoading?: boolean;
64
75
  }
65
76
  export interface UseQuickOrderVariantsDataReturn {
66
77
  variants: VariantWithQuantity[];
67
78
  loading: boolean;
68
- error: string | null;
69
79
  updateQuantity: (sku: string, quantity: number) => void;
70
80
  clearAllQuantities: () => void;
71
81
  exportToCsv: () => void;
72
- refetchVariants: () => Promise<void>;
73
- collectTableData: () => any[];
82
+ collectTableData: () => VariantTableData[];
74
83
  variantsWithQuantity: number;
75
84
  }
76
85
  export interface QuickOrderVariantsActionsProps {
77
86
  t: Record<string, string>;
78
87
  onClear: () => void;
79
88
  onSaveToCsv: () => void;
80
- onCollectData?: () => any[];
89
+ onCollectData?: () => VariantTableData[];
81
90
  isDisabled?: boolean;
82
91
  variantsCount?: number;
83
92
  className?: string;
@@ -91,7 +100,7 @@ export interface QuickOrderVariantsGridComponentProps {
91
100
  loading?: boolean;
92
101
  className?: string;
93
102
  onQuantityChange: (sku: string, quantity: number) => void;
94
- initialVisibleVariantsCount?: number;
103
+ visibleVariantsLimit?: number;
95
104
  columns?: Array<{
96
105
  key: string;
97
106
  label: string;
@@ -99,7 +108,6 @@ export interface QuickOrderVariantsGridComponentProps {
99
108
  }>;
100
109
  slots?: {
101
110
  ImageCell?: SlotProps<VariantCellContext>;
102
- VariantCell?: SlotProps<VariantCellContext>;
103
111
  SKUCell?: SlotProps<VariantCellContext>;
104
112
  AvailabilityCell?: SlotProps<VariantCellContext>;
105
113
  PriceCell?: SlotProps<VariantCellContext>;
@@ -109,13 +117,12 @@ export interface QuickOrderVariantsGridComponentProps {
109
117
  }
110
118
  export interface QuickOrderVariantsGridProps {
111
119
  className?: string;
112
- variants?: ProductVariant[];
113
- fetchVariants?: () => Promise<ProductVariant[]>;
120
+ initialVariants?: ProductVariant[];
114
121
  onVariantsLoaded?: (variants: VariantWithQuantity[]) => void;
115
- onTableDataChange?: (data: any[]) => void;
122
+ onSelectedVariantsChange?: (data: VariantTableData[]) => void;
116
123
  debounceMs?: number;
117
124
  initialLoading?: boolean;
118
- initialVisibleVariantsCount?: number;
125
+ visibleVariantsLimit?: number;
119
126
  columns?: Array<{
120
127
  key: string;
121
128
  label: string;
@@ -124,7 +131,6 @@ export interface QuickOrderVariantsGridProps {
124
131
  slots?: {
125
132
  Actions?: SlotProps<VariantActionsContext>;
126
133
  ImageCell?: SlotProps<VariantCellContext>;
127
- VariantCell?: SlotProps<VariantCellContext>;
128
134
  SKUCell?: SlotProps<VariantCellContext>;
129
135
  AvailabilityCell?: SlotProps<VariantCellContext>;
130
136
  PriceCell?: SlotProps<VariantCellContext>;
@@ -1,10 +0,0 @@
1
- /*! Copyright 2026 Adobe
2
- All Rights Reserved. */
3
- import{Initializer as c}from"@dropins/tools/lib.js";import{FetchGraphQL as a}from"@dropins/tools/fetch-graphql.js";import{events as n}from"@dropins/tools/event-bus.js";const{setEndpoint:m,setFetchGraphQlHeader:C,removeFetchGraphQlHeader:G,setFetchGraphQlHeaders:k,fetchGraphQl:s,getConfig:O}=new a().getMethods(),f=`
4
- query GET_STORE_CONFIG {
5
- storeConfig {
6
- quickorder_active
7
- }
8
- }
9
- `,h=r=>{throw r instanceof DOMException&&r.name==="AbortError"||n.emit("b2b-quick-order/error",{source:"auth",type:"network",error:r}),r},g=r=>{const t=r.map(e=>e.message).join(" ");throw Error(t)},d=async()=>await s(f,{method:"GET",cache:"force-cache"}).then(r=>{var t,e,o;return(t=r.errors)!=null&&t.length?g(r.errors):{storeConfig:{quickOrderActive:((o=(e=r==null?void 0:r.data)==null?void 0:e.storeConfig)==null?void 0:o.quickorder_active)??!1}}}).catch(h),i=new c({init:async r=>{const t={quickOrderActive:!1};try{const e=await d();t.quickOrderActive=e.storeConfig.quickOrderActive}catch(e){console.error("Failed to fetch store config:",e)}i.config.setConfig({...t,...r})},listeners:()=>[]}),p=i.config;export{d as a,C as b,p as c,k as d,s as f,O as g,i,G as r,m as s};
10
- //# sourceMappingURL=initialize.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"initialize.js","sources":["/@dropins/storefront-quick-order/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-quick-order/src/api/getStoreConfig/graphql/getStoreConfig.graphql.ts","/@dropins/storefront-quick-order/src/lib/network-error.ts","/@dropins/storefront-quick-order/src/lib/fetch-error.ts","/@dropins/storefront-quick-order/src/api/getStoreConfig/getStoreConfig.ts","/@dropins/storefront-quick-order/src/api/initialize/initialize.ts"],"sourcesContent":["import { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nexport const GET_STORE_CONFIG = /* GraphQL */ `\n query GET_STORE_CONFIG {\n storeConfig {\n quickorder_active\n }\n }\n`;\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { events } from '@adobe-commerce/event-bus';\n\n/**\n * A function which can be attached to fetchGraphQL to handle thrown errors in\n * a generic way.\n */\nexport const handleNetworkError = (error: Error) => {\n const isAbortError =\n error instanceof DOMException && error.name === 'AbortError';\n\n if (!isAbortError) {\n events.emit('b2b-quick-order/error', {\n source: 'auth',\n type: 'network',\n error,\n });\n }\n throw error;\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\n/** Actions */\nexport const handleFetchError = (errors: Array<{ message: string }>) => {\n const errorMessage = errors.map((e: any) => e.message).join(' ');\n\n throw Error(errorMessage);\n};\n","/********************************************************************\n * ADOBE CONFIDENTIAL\n * __________________\n *\n * Copyright 2024 Adobe\n * All Rights Reserved.\n *\n * NOTICE: All information contained herein is, and remains\n * the property of Adobe and its suppliers, if any. The intellectual\n * and technical concepts contained herein are proprietary to Adobe\n * and its suppliers and are protected by all applicable intellectual\n * property laws, including trade secret and copyright laws.\n * Dissemination of this information or reproduction of this material\n * is strictly forbidden unless prior written permission is obtained\n * from Adobe.\n *******************************************************************/\n\nimport { fetchGraphQl } from '../fetch-graphql';\nimport { GET_STORE_CONFIG } from './graphql/getStoreConfig.graphql';\nimport { handleNetworkError } from '@/b2b-quick-order/lib/network-error';\nimport { handleFetchError } from '@/b2b-quick-order/lib/fetch-error';\n\nexport const getStoreConfig = async (): Promise<{\n storeConfig: {\n quickOrderActive: boolean;\n };\n}> => {\n return await fetchGraphQl(GET_STORE_CONFIG, {\n method: 'GET',\n cache: 'force-cache',\n })\n .then((response) => {\n if (response.errors?.length) return handleFetchError(response.errors);\n\n return {\n storeConfig: {\n quickOrderActive:\n response?.data?.storeConfig?.quickorder_active ?? false,\n },\n };\n })\n .catch(handleNetworkError);\n};\n","import { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { getStoreConfig } from '../getStoreConfig/getStoreConfig';\n// import { events } from '@adobe-commerce/event-bus';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n quickOrderActive?: boolean;\n};\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig: Partial<ConfigProps> = {\n quickOrderActive: false,\n };\n\n try {\n const storeConfigResponse = await getStoreConfig();\n defaultConfig.quickOrderActive =\n storeConfigResponse.storeConfig.quickOrderActive;\n } catch (error) {\n console.error('Failed to fetch store config:', error);\n }\n\n initialize.config.setConfig({ ...defaultConfig, ...config });\n },\n\n listeners: () => [\n // events.on('authenticated', (authenticated) => {\n // console.log('authenticated', authenticated);\n // }),\n ],\n});\n\nexport const config = initialize.config;\n"],"names":["setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","GET_STORE_CONFIG","handleNetworkError","error","events","handleFetchError","errors","errorMessage","getStoreConfig","response","_a","_c","_b","initialize","Initializer","config","defaultConfig","storeConfigResponse"],"mappings":"wKAEO,KAAM,CACX,YAAAA,EACA,sBAAAC,EACA,yBAAAC,EACA,uBAAAC,EACA,aAAAC,EACA,UAAAC,CACF,EAAI,IAAIC,EAAA,EAAe,WAAA,ECQVC,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,ECMjCC,EAAsBC,GAAiB,CAIlD,MAFEA,aAAiB,cAAgBA,EAAM,OAAS,cAGhDC,EAAO,KAAK,wBAAyB,CACnC,OAAQ,OACR,KAAM,UACN,MAAAD,CAAA,CACD,EAEGA,CACR,ECjBaE,EAAoBC,GAAuC,CACtE,MAAMC,EAAeD,EAAO,IAAK,GAAW,EAAE,OAAO,EAAE,KAAK,GAAG,EAE/D,MAAM,MAAMC,CAAY,CAC1B,ECAaC,EAAiB,SAKrB,MAAMV,EAAaG,EAAkB,CAC1C,OAAQ,MACR,MAAO,aAAA,CACR,EACE,KAAMQ,GAAa,WAClB,OAAIC,EAAAD,EAAS,SAAT,MAAAC,EAAiB,OAAeL,EAAiBI,EAAS,MAAM,EAE7D,CACL,YAAa,CACX,mBACEE,GAAAC,EAAAH,GAAA,YAAAA,EAAU,OAAV,YAAAG,EAAgB,cAAhB,YAAAD,EAA6B,oBAAqB,EAAA,CACtD,CAEJ,CAAC,EACA,MAAMT,CAAkB,EC/BhBW,EAAa,IAAIC,EAAyB,CACrD,KAAM,MAAOC,GAAW,CACtB,MAAMC,EAAsC,CAC1C,iBAAkB,EAAA,EAGpB,GAAI,CACF,MAAMC,EAAsB,MAAMT,EAAA,EAClCQ,EAAc,iBACZC,EAAoB,YAAY,gBACpC,OAASd,EAAO,CACd,QAAQ,MAAM,gCAAiCA,CAAK,CACtD,CAEAU,EAAW,OAAO,UAAU,CAAE,GAAGG,EAAe,GAAGD,EAAQ,CAC7D,EAEA,UAAW,IAAM,CAAA,CAKnB,CAAC,EAEYA,EAASF,EAAW"}