@endora-commerce/mod-catalog 0.100.0

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.
Files changed (443) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +63 -0
  3. package/dist/admin/components/PackagingUnitsEditor.d.ts +12 -0
  4. package/dist/admin/components/PackagingUnitsEditor.d.ts.map +1 -0
  5. package/dist/admin/components/PackagingUnitsEditor.js +99 -0
  6. package/dist/admin/components/PackagingUnitsEditor.js.map +1 -0
  7. package/dist/admin/components/ProductAttributesTab.d.ts +13 -0
  8. package/dist/admin/components/ProductAttributesTab.d.ts.map +1 -0
  9. package/dist/admin/components/ProductAttributesTab.js +140 -0
  10. package/dist/admin/components/ProductAttributesTab.js.map +1 -0
  11. package/dist/admin/components/ProductInventoryTab.d.ts +14 -0
  12. package/dist/admin/components/ProductInventoryTab.d.ts.map +1 -0
  13. package/dist/admin/components/ProductInventoryTab.js +284 -0
  14. package/dist/admin/components/ProductInventoryTab.js.map +1 -0
  15. package/dist/admin/components/ProductScopeEditor.d.ts +94 -0
  16. package/dist/admin/components/ProductScopeEditor.d.ts.map +1 -0
  17. package/dist/admin/components/ProductScopeEditor.js +395 -0
  18. package/dist/admin/components/ProductScopeEditor.js.map +1 -0
  19. package/dist/admin/components/ProductsBulkEditDialog.d.ts +11 -0
  20. package/dist/admin/components/ProductsBulkEditDialog.d.ts.map +1 -0
  21. package/dist/admin/components/ProductsBulkEditDialog.js +304 -0
  22. package/dist/admin/components/ProductsBulkEditDialog.js.map +1 -0
  23. package/dist/admin/index.d.ts +45 -0
  24. package/dist/admin/index.d.ts.map +1 -0
  25. package/dist/admin/index.js +184 -0
  26. package/dist/admin/index.js.map +1 -0
  27. package/dist/admin/lib/resolve-product-selection.d.ts +21 -0
  28. package/dist/admin/lib/resolve-product-selection.d.ts.map +1 -0
  29. package/dist/admin/lib/resolve-product-selection.js +25 -0
  30. package/dist/admin/lib/resolve-product-selection.js.map +1 -0
  31. package/dist/admin/pages/AttachmentTypesPage.d.ts +18 -0
  32. package/dist/admin/pages/AttachmentTypesPage.d.ts.map +1 -0
  33. package/dist/admin/pages/AttachmentTypesPage.js +92 -0
  34. package/dist/admin/pages/AttachmentTypesPage.js.map +1 -0
  35. package/dist/admin/pages/AttributeSetsPage.d.ts +21 -0
  36. package/dist/admin/pages/AttributeSetsPage.d.ts.map +1 -0
  37. package/dist/admin/pages/AttributeSetsPage.js +158 -0
  38. package/dist/admin/pages/AttributeSetsPage.js.map +1 -0
  39. package/dist/admin/pages/AttributesManager.d.ts +9 -0
  40. package/dist/admin/pages/AttributesManager.d.ts.map +1 -0
  41. package/dist/admin/pages/AttributesManager.js +305 -0
  42. package/dist/admin/pages/AttributesManager.js.map +1 -0
  43. package/dist/admin/pages/BulkOperationDetailPage.d.ts +9 -0
  44. package/dist/admin/pages/BulkOperationDetailPage.d.ts.map +1 -0
  45. package/dist/admin/pages/BulkOperationDetailPage.js +187 -0
  46. package/dist/admin/pages/BulkOperationDetailPage.js.map +1 -0
  47. package/dist/admin/pages/BulkOperationsPage.d.ts +9 -0
  48. package/dist/admin/pages/BulkOperationsPage.d.ts.map +1 -0
  49. package/dist/admin/pages/BulkOperationsPage.js +98 -0
  50. package/dist/admin/pages/BulkOperationsPage.js.map +1 -0
  51. package/dist/admin/pages/CategoriesTree.d.ts +9 -0
  52. package/dist/admin/pages/CategoriesTree.d.ts.map +1 -0
  53. package/dist/admin/pages/CategoriesTree.js +176 -0
  54. package/dist/admin/pages/CategoriesTree.js.map +1 -0
  55. package/dist/admin/pages/ProductEditor.d.ts +13 -0
  56. package/dist/admin/pages/ProductEditor.d.ts.map +1 -0
  57. package/dist/admin/pages/ProductEditor.js +1050 -0
  58. package/dist/admin/pages/ProductEditor.js.map +1 -0
  59. package/dist/admin/pages/ProductsList.d.ts +9 -0
  60. package/dist/admin/pages/ProductsList.d.ts.map +1 -0
  61. package/dist/admin/pages/ProductsList.js +399 -0
  62. package/dist/admin/pages/ProductsList.js.map +1 -0
  63. package/dist/backend/commands/attribute-commands.d.ts +111 -0
  64. package/dist/backend/commands/attribute-commands.d.ts.map +1 -0
  65. package/dist/backend/commands/attribute-commands.js +482 -0
  66. package/dist/backend/commands/attribute-commands.js.map +1 -0
  67. package/dist/backend/demo/reset.d.ts +23 -0
  68. package/dist/backend/demo/reset.d.ts.map +1 -0
  69. package/dist/backend/demo/reset.js +41 -0
  70. package/dist/backend/demo/reset.js.map +1 -0
  71. package/dist/backend/demo/rows.d.ts +103 -0
  72. package/dist/backend/demo/rows.d.ts.map +1 -0
  73. package/dist/backend/demo/rows.js +162 -0
  74. package/dist/backend/demo/rows.js.map +1 -0
  75. package/dist/backend/demo/seed.d.ts +35 -0
  76. package/dist/backend/demo/seed.d.ts.map +1 -0
  77. package/dist/backend/demo/seed.js +177 -0
  78. package/dist/backend/demo/seed.js.map +1 -0
  79. package/dist/backend/entities/attachment-type.entity.d.ts +16 -0
  80. package/dist/backend/entities/attachment-type.entity.d.ts.map +1 -0
  81. package/dist/backend/entities/attachment-type.entity.js +57 -0
  82. package/dist/backend/entities/attachment-type.entity.js.map +1 -0
  83. package/dist/backend/entities/attribute-set-attribute.entity.d.ts +26 -0
  84. package/dist/backend/entities/attribute-set-attribute.entity.d.ts.map +1 -0
  85. package/dist/backend/entities/attribute-set-attribute.entity.js +55 -0
  86. package/dist/backend/entities/attribute-set-attribute.entity.js.map +1 -0
  87. package/dist/backend/entities/attribute-set.entity.d.ts +22 -0
  88. package/dist/backend/entities/attribute-set.entity.d.ts.map +1 -0
  89. package/dist/backend/entities/attribute-set.entity.js +67 -0
  90. package/dist/backend/entities/attribute-set.entity.js.map +1 -0
  91. package/dist/backend/entities/bulk-operation.entity.d.ts +78 -0
  92. package/dist/backend/entities/bulk-operation.entity.d.ts.map +1 -0
  93. package/dist/backend/entities/bulk-operation.entity.js +138 -0
  94. package/dist/backend/entities/bulk-operation.entity.js.map +1 -0
  95. package/dist/backend/entities/bundle-slot-option.entity.d.ts +23 -0
  96. package/dist/backend/entities/bundle-slot-option.entity.d.ts.map +1 -0
  97. package/dist/backend/entities/bundle-slot-option.entity.js +68 -0
  98. package/dist/backend/entities/bundle-slot-option.entity.js.map +1 -0
  99. package/dist/backend/entities/bundle-slot.entity.d.ts +25 -0
  100. package/dist/backend/entities/bundle-slot.entity.d.ts.map +1 -0
  101. package/dist/backend/entities/bundle-slot.entity.js +74 -0
  102. package/dist/backend/entities/bundle-slot.entity.js.map +1 -0
  103. package/dist/backend/entities/category.entity.d.ts +26 -0
  104. package/dist/backend/entities/category.entity.d.ts.map +1 -0
  105. package/dist/backend/entities/category.entity.js +119 -0
  106. package/dist/backend/entities/category.entity.js.map +1 -0
  107. package/dist/backend/entities/gallery-item-label.entity.d.ts +22 -0
  108. package/dist/backend/entities/gallery-item-label.entity.d.ts.map +1 -0
  109. package/dist/backend/entities/gallery-item-label.entity.js +50 -0
  110. package/dist/backend/entities/gallery-item-label.entity.js.map +1 -0
  111. package/dist/backend/entities/gallery-item.entity.d.ts +17 -0
  112. package/dist/backend/entities/gallery-item.entity.d.ts.map +1 -0
  113. package/dist/backend/entities/gallery-item.entity.js +58 -0
  114. package/dist/backend/entities/gallery-item.entity.js.map +1 -0
  115. package/dist/backend/entities/grouped-item.entity.d.ts +23 -0
  116. package/dist/backend/entities/grouped-item.entity.d.ts.map +1 -0
  117. package/dist/backend/entities/grouped-item.entity.js +68 -0
  118. package/dist/backend/entities/grouped-item.entity.js.map +1 -0
  119. package/dist/backend/entities/product-attachment.entity.d.ts +23 -0
  120. package/dist/backend/entities/product-attachment.entity.d.ts.map +1 -0
  121. package/dist/backend/entities/product-attachment.entity.js +77 -0
  122. package/dist/backend/entities/product-attachment.entity.js.map +1 -0
  123. package/dist/backend/entities/product-attribute.entity.d.ts +72 -0
  124. package/dist/backend/entities/product-attribute.entity.d.ts.map +1 -0
  125. package/dist/backend/entities/product-attribute.entity.js +161 -0
  126. package/dist/backend/entities/product-attribute.entity.js.map +1 -0
  127. package/dist/backend/entities/product-editor-preference.entity.d.ts +28 -0
  128. package/dist/backend/entities/product-editor-preference.entity.d.ts.map +1 -0
  129. package/dist/backend/entities/product-editor-preference.entity.js +63 -0
  130. package/dist/backend/entities/product-editor-preference.entity.js.map +1 -0
  131. package/dist/backend/entities/product-link.entity.d.ts +25 -0
  132. package/dist/backend/entities/product-link.entity.d.ts.map +1 -0
  133. package/dist/backend/entities/product-link.entity.js +70 -0
  134. package/dist/backend/entities/product-link.entity.js.map +1 -0
  135. package/dist/backend/entities/product-packaging-unit.entity.d.ts +26 -0
  136. package/dist/backend/entities/product-packaging-unit.entity.d.ts.map +1 -0
  137. package/dist/backend/entities/product-packaging-unit.entity.js +76 -0
  138. package/dist/backend/entities/product-packaging-unit.entity.js.map +1 -0
  139. package/dist/backend/entities/product-value-override.entity.d.ts +43 -0
  140. package/dist/backend/entities/product-value-override.entity.d.ts.map +1 -0
  141. package/dist/backend/entities/product-value-override.entity.js +90 -0
  142. package/dist/backend/entities/product-value-override.entity.js.map +1 -0
  143. package/dist/backend/entities/product-variant.entity.d.ts +18 -0
  144. package/dist/backend/entities/product-variant.entity.d.ts.map +1 -0
  145. package/dist/backend/entities/product-variant.entity.js +68 -0
  146. package/dist/backend/entities/product-variant.entity.js.map +1 -0
  147. package/dist/backend/entities/product.entity.d.ts +108 -0
  148. package/dist/backend/entities/product.entity.d.ts.map +1 -0
  149. package/dist/backend/entities/product.entity.js +230 -0
  150. package/dist/backend/entities/product.entity.js.map +1 -0
  151. package/dist/backend/index.d.ts +262 -0
  152. package/dist/backend/index.d.ts.map +1 -0
  153. package/dist/backend/index.js +642 -0
  154. package/dist/backend/index.js.map +1 -0
  155. package/dist/backend/plugin.d.ts +216 -0
  156. package/dist/backend/plugin.d.ts.map +1 -0
  157. package/dist/backend/plugin.js +223 -0
  158. package/dist/backend/plugin.js.map +1 -0
  159. package/dist/backend/prompt-tools.d.ts +47 -0
  160. package/dist/backend/prompt-tools.d.ts.map +1 -0
  161. package/dist/backend/prompt-tools.js +284 -0
  162. package/dist/backend/prompt-tools.js.map +1 -0
  163. package/dist/backend/routes.admin.d.ts +105 -0
  164. package/dist/backend/routes.admin.d.ts.map +1 -0
  165. package/dist/backend/routes.admin.js +1162 -0
  166. package/dist/backend/routes.admin.js.map +1 -0
  167. package/dist/backend/routes.api-key.d.ts +33 -0
  168. package/dist/backend/routes.api-key.d.ts.map +1 -0
  169. package/dist/backend/routes.api-key.js +43 -0
  170. package/dist/backend/routes.api-key.js.map +1 -0
  171. package/dist/backend/routes.external.d.ts +32 -0
  172. package/dist/backend/routes.external.d.ts.map +1 -0
  173. package/dist/backend/routes.external.js +115 -0
  174. package/dist/backend/routes.external.js.map +1 -0
  175. package/dist/backend/routes.public.d.ts +46 -0
  176. package/dist/backend/routes.public.d.ts.map +1 -0
  177. package/dist/backend/routes.public.js +318 -0
  178. package/dist/backend/routes.public.js.map +1 -0
  179. package/dist/backend/services/asset-references.d.ts +4 -0
  180. package/dist/backend/services/asset-references.d.ts.map +1 -0
  181. package/dist/backend/services/asset-references.js +104 -0
  182. package/dist/backend/services/asset-references.js.map +1 -0
  183. package/dist/backend/services/attachment.service.d.ts +45 -0
  184. package/dist/backend/services/attachment.service.d.ts.map +1 -0
  185. package/dist/backend/services/attachment.service.js +268 -0
  186. package/dist/backend/services/attachment.service.js.map +1 -0
  187. package/dist/backend/services/attribute-option-validator.d.ts +47 -0
  188. package/dist/backend/services/attribute-option-validator.d.ts.map +1 -0
  189. package/dist/backend/services/attribute-option-validator.js +69 -0
  190. package/dist/backend/services/attribute-option-validator.js.map +1 -0
  191. package/dist/backend/services/attribute-set-validations.d.ts +65 -0
  192. package/dist/backend/services/attribute-set-validations.d.ts.map +1 -0
  193. package/dist/backend/services/attribute-set-validations.js +89 -0
  194. package/dist/backend/services/attribute-set-validations.js.map +1 -0
  195. package/dist/backend/services/attribute-set.service.d.ts +50 -0
  196. package/dist/backend/services/attribute-set.service.d.ts.map +1 -0
  197. package/dist/backend/services/attribute-set.service.js +401 -0
  198. package/dist/backend/services/attribute-set.service.js.map +1 -0
  199. package/dist/backend/services/attribute-type-mapping.d.ts +66 -0
  200. package/dist/backend/services/attribute-type-mapping.d.ts.map +1 -0
  201. package/dist/backend/services/attribute-type-mapping.js +121 -0
  202. package/dist/backend/services/attribute-type-mapping.js.map +1 -0
  203. package/dist/backend/services/attribute-value-key.service.d.ts +48 -0
  204. package/dist/backend/services/attribute-value-key.service.d.ts.map +1 -0
  205. package/dist/backend/services/attribute-value-key.service.js +118 -0
  206. package/dist/backend/services/attribute-value-key.service.js.map +1 -0
  207. package/dist/backend/services/audit-references.d.ts +13 -0
  208. package/dist/backend/services/audit-references.d.ts.map +1 -0
  209. package/dist/backend/services/audit-references.js +51 -0
  210. package/dist/backend/services/audit-references.js.map +1 -0
  211. package/dist/backend/services/bulk-operation-queue.d.ts +26 -0
  212. package/dist/backend/services/bulk-operation-queue.d.ts.map +1 -0
  213. package/dist/backend/services/bulk-operation-queue.js +34 -0
  214. package/dist/backend/services/bulk-operation-queue.js.map +1 -0
  215. package/dist/backend/services/bulk-operation.service.d.ts +195 -0
  216. package/dist/backend/services/bulk-operation.service.d.ts.map +1 -0
  217. package/dist/backend/services/bulk-operation.service.js +510 -0
  218. package/dist/backend/services/bulk-operation.service.js.map +1 -0
  219. package/dist/backend/services/bundle.service.d.ts +87 -0
  220. package/dist/backend/services/bundle.service.d.ts.map +1 -0
  221. package/dist/backend/services/bundle.service.js +286 -0
  222. package/dist/backend/services/bundle.service.js.map +1 -0
  223. package/dist/backend/services/catalog-admin.service.d.ts +398 -0
  224. package/dist/backend/services/catalog-admin.service.d.ts.map +1 -0
  225. package/dist/backend/services/catalog-admin.service.js +1516 -0
  226. package/dist/backend/services/catalog-admin.service.js.map +1 -0
  227. package/dist/backend/services/catalog-attribute-read.service.d.ts +78 -0
  228. package/dist/backend/services/catalog-attribute-read.service.d.ts.map +1 -0
  229. package/dist/backend/services/catalog-attribute-read.service.js +216 -0
  230. package/dist/backend/services/catalog-attribute-read.service.js.map +1 -0
  231. package/dist/backend/services/catalog-bulk-import.service.d.ts +30 -0
  232. package/dist/backend/services/catalog-bulk-import.service.d.ts.map +1 -0
  233. package/dist/backend/services/catalog-bulk-import.service.js +136 -0
  234. package/dist/backend/services/catalog-bulk-import.service.js.map +1 -0
  235. package/dist/backend/services/catalog-bulk-update.service.d.ts +91 -0
  236. package/dist/backend/services/catalog-bulk-update.service.d.ts.map +1 -0
  237. package/dist/backend/services/catalog-bulk-update.service.js +330 -0
  238. package/dist/backend/services/catalog-bulk-update.service.js.map +1 -0
  239. package/dist/backend/services/catalog-category-read.service.d.ts +66 -0
  240. package/dist/backend/services/catalog-category-read.service.d.ts.map +1 -0
  241. package/dist/backend/services/catalog-category-read.service.js +248 -0
  242. package/dist/backend/services/catalog-category-read.service.js.map +1 -0
  243. package/dist/backend/services/catalog-org-price-decorator.d.ts +90 -0
  244. package/dist/backend/services/catalog-org-price-decorator.d.ts.map +1 -0
  245. package/dist/backend/services/catalog-org-price-decorator.js +184 -0
  246. package/dist/backend/services/catalog-org-price-decorator.js.map +1 -0
  247. package/dist/backend/services/catalog-product-filter.service.d.ts +82 -0
  248. package/dist/backend/services/catalog-product-filter.service.d.ts.map +1 -0
  249. package/dist/backend/services/catalog-product-filter.service.js +275 -0
  250. package/dist/backend/services/catalog-product-filter.service.js.map +1 -0
  251. package/dist/backend/services/catalog-product-read.service.d.ts +46 -0
  252. package/dist/backend/services/catalog-product-read.service.d.ts.map +1 -0
  253. package/dist/backend/services/catalog-product-read.service.js +197 -0
  254. package/dist/backend/services/catalog-product-read.service.js.map +1 -0
  255. package/dist/backend/services/catalog-query.service.d.ts +444 -0
  256. package/dist/backend/services/catalog-query.service.d.ts.map +1 -0
  257. package/dist/backend/services/catalog-query.service.js +1633 -0
  258. package/dist/backend/services/catalog-query.service.js.map +1 -0
  259. package/dist/backend/services/catalog-quick-search.service.d.ts +78 -0
  260. package/dist/backend/services/catalog-quick-search.service.d.ts.map +1 -0
  261. package/dist/backend/services/catalog-quick-search.service.js +159 -0
  262. package/dist/backend/services/catalog-quick-search.service.js.map +1 -0
  263. package/dist/backend/services/catalog-write-ports.d.ts +25 -0
  264. package/dist/backend/services/catalog-write-ports.d.ts.map +1 -0
  265. package/dist/backend/services/catalog-write-ports.js +63 -0
  266. package/dist/backend/services/catalog-write-ports.js.map +1 -0
  267. package/dist/backend/services/category-admin.service.d.ts +102 -0
  268. package/dist/backend/services/category-admin.service.d.ts.map +1 -0
  269. package/dist/backend/services/category-admin.service.js +271 -0
  270. package/dist/backend/services/category-admin.service.js.map +1 -0
  271. package/dist/backend/services/gallery.service.d.ts +85 -0
  272. package/dist/backend/services/gallery.service.d.ts.map +1 -0
  273. package/dist/backend/services/gallery.service.js +326 -0
  274. package/dist/backend/services/gallery.service.js.map +1 -0
  275. package/dist/backend/services/grouped.service.d.ts +39 -0
  276. package/dist/backend/services/grouped.service.d.ts.map +1 -0
  277. package/dist/backend/services/grouped.service.js +136 -0
  278. package/dist/backend/services/grouped.service.js.map +1 -0
  279. package/dist/backend/services/label-resolver.d.ts +16 -0
  280. package/dist/backend/services/label-resolver.d.ts.map +1 -0
  281. package/dist/backend/services/label-resolver.js +43 -0
  282. package/dist/backend/services/label-resolver.js.map +1 -0
  283. package/dist/backend/services/packaging-unit.service.d.ts +28 -0
  284. package/dist/backend/services/packaging-unit.service.d.ts.map +1 -0
  285. package/dist/backend/services/packaging-unit.service.js +197 -0
  286. package/dist/backend/services/packaging-unit.service.js.map +1 -0
  287. package/dist/backend/services/primary-asset-url.d.ts +4 -0
  288. package/dist/backend/services/primary-asset-url.d.ts.map +1 -0
  289. package/dist/backend/services/primary-asset-url.js +55 -0
  290. package/dist/backend/services/primary-asset-url.js.map +1 -0
  291. package/dist/backend/services/product-editor-preferences.service.d.ts +20 -0
  292. package/dist/backend/services/product-editor-preferences.service.d.ts.map +1 -0
  293. package/dist/backend/services/product-editor-preferences.service.js +44 -0
  294. package/dist/backend/services/product-editor-preferences.service.js.map +1 -0
  295. package/dist/backend/services/product-link.service.d.ts +169 -0
  296. package/dist/backend/services/product-link.service.d.ts.map +1 -0
  297. package/dist/backend/services/product-link.service.js +297 -0
  298. package/dist/backend/services/product-link.service.js.map +1 -0
  299. package/dist/backend/services/product-overrides.service.d.ts +77 -0
  300. package/dist/backend/services/product-overrides.service.d.ts.map +1 -0
  301. package/dist/backend/services/product-overrides.service.js +204 -0
  302. package/dist/backend/services/product-overrides.service.js.map +1 -0
  303. package/dist/backend/services/product-scope-context.service.d.ts +36 -0
  304. package/dist/backend/services/product-scope-context.service.d.ts.map +1 -0
  305. package/dist/backend/services/product-scope-context.service.js +106 -0
  306. package/dist/backend/services/product-scope-context.service.js.map +1 -0
  307. package/dist/backend/services/product-type-validations.d.ts +42 -0
  308. package/dist/backend/services/product-type-validations.d.ts.map +1 -0
  309. package/dist/backend/services/product-type-validations.js +55 -0
  310. package/dist/backend/services/product-type-validations.js.map +1 -0
  311. package/dist/backend/services/product-value-resolver.service.d.ts +59 -0
  312. package/dist/backend/services/product-value-resolver.service.d.ts.map +1 -0
  313. package/dist/backend/services/product-value-resolver.service.js +111 -0
  314. package/dist/backend/services/product-value-resolver.service.js.map +1 -0
  315. package/dist/backend/services/system-attribute-scopes.d.ts +18 -0
  316. package/dist/backend/services/system-attribute-scopes.d.ts.map +1 -0
  317. package/dist/backend/services/system-attribute-scopes.js +18 -0
  318. package/dist/backend/services/system-attribute-scopes.js.map +1 -0
  319. package/dist/backend/services/viewer-organization.d.ts +25 -0
  320. package/dist/backend/services/viewer-organization.d.ts.map +1 -0
  321. package/dist/backend/services/viewer-organization.js +31 -0
  322. package/dist/backend/services/viewer-organization.js.map +1 -0
  323. package/dist/manifest.d.ts +204 -0
  324. package/dist/manifest.d.ts.map +1 -0
  325. package/dist/manifest.js +686 -0
  326. package/dist/manifest.js.map +1 -0
  327. package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts +33 -0
  328. package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts.map +1 -0
  329. package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js +118 -0
  330. package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js.map +1 -0
  331. package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts +24 -0
  332. package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts.map +1 -0
  333. package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js +31 -0
  334. package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js.map +1 -0
  335. package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts +32 -0
  336. package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts.map +1 -0
  337. package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js +58 -0
  338. package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js.map +1 -0
  339. package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts +22 -0
  340. package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts.map +1 -0
  341. package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js +66 -0
  342. package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js.map +1 -0
  343. package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts +18 -0
  344. package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts.map +1 -0
  345. package/dist/migrations/20260429T112543_catalog_product_attachments.js +73 -0
  346. package/dist/migrations/20260429T112543_catalog_product_attachments.js.map +1 -0
  347. package/dist/migrations/20260429T123726_catalog_product_links.d.ts +21 -0
  348. package/dist/migrations/20260429T123726_catalog_product_links.d.ts.map +1 -0
  349. package/dist/migrations/20260429T123726_catalog_product_links.js +48 -0
  350. package/dist/migrations/20260429T123726_catalog_product_links.js.map +1 -0
  351. package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts +23 -0
  352. package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts.map +1 -0
  353. package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js +94 -0
  354. package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js.map +1 -0
  355. package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts +24 -0
  356. package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts.map +1 -0
  357. package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js +31 -0
  358. package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js.map +1 -0
  359. package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts +31 -0
  360. package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts.map +1 -0
  361. package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js +133 -0
  362. package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js.map +1 -0
  363. package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts +16 -0
  364. package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts.map +1 -0
  365. package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js +23 -0
  366. package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js.map +1 -0
  367. package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts +10 -0
  368. package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts.map +1 -0
  369. package/dist/migrations/20260526T124736_catalog_product_status_inactive.js +22 -0
  370. package/dist/migrations/20260526T124736_catalog_product_status_inactive.js.map +1 -0
  371. package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts +38 -0
  372. package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts.map +1 -0
  373. package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js +98 -0
  374. package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js.map +1 -0
  375. package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts +13 -0
  376. package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts.map +1 -0
  377. package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js +17 -0
  378. package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js.map +1 -0
  379. package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts +16 -0
  380. package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts.map +1 -0
  381. package/dist/migrations/20260611T140407_catalog_bulk_operations.js +42 -0
  382. package/dist/migrations/20260611T140407_catalog_bulk_operations.js.map +1 -0
  383. package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts +14 -0
  384. package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts.map +1 -0
  385. package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js +18 -0
  386. package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js.map +1 -0
  387. package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts +11 -0
  388. package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts.map +1 -0
  389. package/dist/migrations/20260611T140412_catalog_product_packaging_units.js +29 -0
  390. package/dist/migrations/20260611T140412_catalog_product_packaging_units.js.map +1 -0
  391. package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts +23 -0
  392. package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts.map +1 -0
  393. package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js +35 -0
  394. package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js.map +1 -0
  395. package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts +12 -0
  396. package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts.map +1 -0
  397. package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js +16 -0
  398. package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js.map +1 -0
  399. package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts +32 -0
  400. package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts.map +1 -0
  401. package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js +286 -0
  402. package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js.map +1 -0
  403. package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts +36 -0
  404. package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts.map +1 -0
  405. package/dist/migrations/20260804T152604_catalog_widen_product_sku.js +63 -0
  406. package/dist/migrations/20260804T152604_catalog_widen_product_sku.js.map +1 -0
  407. package/dist/migrations/20260804T160244_catalog_category_activation.d.ts +18 -0
  408. package/dist/migrations/20260804T160244_catalog_category_activation.d.ts.map +1 -0
  409. package/dist/migrations/20260804T160244_catalog_category_activation.js +22 -0
  410. package/dist/migrations/20260804T160244_catalog_category_activation.js.map +1 -0
  411. package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts +27 -0
  412. package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts.map +1 -0
  413. package/dist/migrations/20260912T094557_catalog_sales_channel_products.js +44 -0
  414. package/dist/migrations/20260912T094557_catalog_sales_channel_products.js.map +1 -0
  415. package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts +27 -0
  416. package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts.map +1 -0
  417. package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js +44 -0
  418. package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js.map +1 -0
  419. package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts +36 -0
  420. package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts.map +1 -0
  421. package/dist/migrations/20260925T125527_catalog_inventory_columns.js +87 -0
  422. package/dist/migrations/20260925T125527_catalog_inventory_columns.js.map +1 -0
  423. package/dist/migrations/index.d.ts +55 -0
  424. package/dist/migrations/index.d.ts.map +1 -0
  425. package/dist/migrations/index.js +80 -0
  426. package/dist/migrations/index.js.map +1 -0
  427. package/dist/ports/index.d.ts +96 -0
  428. package/dist/ports/index.d.ts.map +1 -0
  429. package/dist/ports/index.js +2 -0
  430. package/dist/ports/index.js.map +1 -0
  431. package/docs/catalog/attachments.md +69 -0
  432. package/docs/catalog/attribute-sets.md +63 -0
  433. package/docs/catalog/attributes.md +244 -0
  434. package/docs/catalog/composite-products.md +115 -0
  435. package/docs/catalog/gallery-and-labels.md +73 -0
  436. package/docs/catalog/packaging-units.md +67 -0
  437. package/docs/catalog/per-channel-per-language-overrides.md +234 -0
  438. package/docs/catalog/product-links.md +79 -0
  439. package/docs/catalog.md +207 -0
  440. package/i18n/en.json +649 -0
  441. package/i18n/pl.json +649 -0
  442. package/package.json +109 -0
  443. package/tailwind.css +14 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Endora sp. z o.o. and the Endora Commerce contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,63 @@
1
+ <!-- Generated by `pnpm --filter backend run manifests:generate`. Delete this line to take the file over; a README without it is never regenerated. -->
2
+
3
+ # @endora-commerce/mod-catalog
4
+
5
+ Products, variants, categories, attributes, attribute sets, gallery, attachments, links, and bundles.
6
+
7
+ ## What this is
8
+
9
+ An **Endora Commerce module package**. Its module id is `catalog` — the identity of record in the platform's registries, in its migrations and in its setting, permission and translation codes.
10
+
11
+ A module is not imported by application code. The platform discovers the extension packages an instance has installed, reads the manifest on the root subpath and composes the module from it, so installing this package and starting the instance is the whole integration.
12
+
13
+ ## Entry points
14
+
15
+ | Import | Contents |
16
+ | --- | --- |
17
+ | `@endora-commerce/mod-catalog` | the module manifest — its id, version, dependencies, settings and activation |
18
+ | `@endora-commerce/mod-catalog/admin` | the Admin UI contribution: the screens, navigation and palette actions it adds |
19
+ | `@endora-commerce/mod-catalog/backend` | the composition root the platform calls, with the entities, services, routes and workers it registers |
20
+ | `@endora-commerce/mod-catalog/migrations` | the module’s own schema migrations, in the order the platform runs them |
21
+ | `@endora-commerce/mod-catalog/ports` | type-only — the port interfaces other modules resolve this one through |
22
+ | `@endora-commerce/mod-catalog/tailwind.css` | the Tailwind source declaration for the admin code above |
23
+
24
+ ## Depends on
25
+
26
+ Everything below is a **peer** dependency, so the application resolves exactly one copy of each — two copies of a host or of React are a runtime failure rather than a type error. An entry marked *optional* is needed only by the layers that use it.
27
+
28
+ **Endora packages**
29
+
30
+ - `@endora-commerce/admin-kit` — *optional*
31
+ - `@endora-commerce/contracts`
32
+ - `@endora-commerce/mod-custom-fields`
33
+ - `@endora-commerce/platform`
34
+
35
+ **Third-party**
36
+
37
+ - `@mikro-orm/core` ^6
38
+ - `@mikro-orm/migrations` ^6
39
+ - `@mikro-orm/postgresql` ^6
40
+ - `bullmq` ^5
41
+ - `fastify` ^5
42
+ - `ioredis` ^5
43
+ - `lucide-react` ^1 — *optional*
44
+ - `react` ^19 — *optional*
45
+ - `react-router-dom` ^7 — *optional*
46
+ - `zod` ^4
47
+
48
+ ## What the tarball carries
49
+
50
+ - `dist/` — the compiled JavaScript and its type declarations
51
+ - `i18n/` — the translation bundles this package ships (`en`, `pl`), loaded by the platform
52
+ - `docs/` — the package’s own pages in the Endora Commerce documentation site
53
+ - `tailwind.css` — the Tailwind source declaration
54
+
55
+ ## Install
56
+
57
+ ```bash
58
+ pnpm add @endora-commerce/mod-catalog
59
+ ```
60
+
61
+ ## Licence
62
+
63
+ MIT — the text is in `LICENSE`, beside this file.
@@ -0,0 +1,12 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Feature 043 — Packaging units editor, rendered inside the product card's
4
+ * Inventory tab. Lets operators define named ordering units (e.g. "Paleta" =
5
+ * 480 pieces): add / edit / remove / reorder, and pick one default. Calls the
6
+ * catalog admin packaging-unit endpoints directly via `apiClient`, mirroring
7
+ * the rest of the Inventory tab.
8
+ */
9
+ export declare function PackagingUnitsEditor({ productId }: {
10
+ productId: string;
11
+ }): ReactNode;
12
+ //# sourceMappingURL=PackagingUnitsEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackagingUnitsEditor.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PackagingUnitsEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKzE;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAsNpF"}
@@ -0,0 +1,99 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { ApiError, apiClient } from '@endora-commerce/admin-kit/lib';
4
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
5
+ /**
6
+ * Feature 043 — Packaging units editor, rendered inside the product card's
7
+ * Inventory tab. Lets operators define named ordering units (e.g. "Paleta" =
8
+ * 480 pieces): add / edit / remove / reorder, and pick one default. Calls the
9
+ * catalog admin packaging-unit endpoints directly via `apiClient`, mirroring
10
+ * the rest of the Inventory tab.
11
+ */
12
+ export function PackagingUnitsEditor({ productId }) {
13
+ const t = useTranslation('catalog');
14
+ const base = `/api/v1/admin/catalog/products/${productId}/packaging-units`;
15
+ const [units, setUnits] = useState([]);
16
+ const [loading, setLoading] = useState(true);
17
+ const [error, setError] = useState(null);
18
+ const [busy, setBusy] = useState(false);
19
+ const [newName, setNewName] = useState('');
20
+ const [newQty, setNewQty] = useState('');
21
+ const load = useCallback(async () => {
22
+ setLoading(true);
23
+ setError(null);
24
+ try {
25
+ const res = await apiClient.get(base);
26
+ setUnits(res.data);
27
+ }
28
+ catch (err) {
29
+ setError(err instanceof ApiError ? err.message : t('packagingUnits.error.load'));
30
+ }
31
+ finally {
32
+ setLoading(false);
33
+ }
34
+ }, [base, t]);
35
+ useEffect(() => {
36
+ void load();
37
+ }, [load]);
38
+ const run = useCallback(async (fn) => {
39
+ setBusy(true);
40
+ setError(null);
41
+ try {
42
+ await fn();
43
+ await load();
44
+ }
45
+ catch (err) {
46
+ setError(err instanceof ApiError ? err.message : t('packagingUnits.error.save'));
47
+ }
48
+ finally {
49
+ setBusy(false);
50
+ }
51
+ }, [load, t]);
52
+ const add = () => {
53
+ const name = newName.trim();
54
+ const qty = Number(newQty);
55
+ if (name === '' || !Number.isInteger(qty) || qty < 1) {
56
+ setError(t('packagingUnits.error.invalid'));
57
+ return;
58
+ }
59
+ void run(async () => {
60
+ await apiClient.post(base, { name, baseQuantity: qty });
61
+ setNewName('');
62
+ setNewQty('');
63
+ });
64
+ };
65
+ const patch = (id, body) => {
66
+ void run(async () => {
67
+ await apiClient.patch(`${base}/${id}`, body);
68
+ });
69
+ };
70
+ const remove = (id) => {
71
+ void run(async () => {
72
+ await apiClient.delete(`${base}/${id}`);
73
+ });
74
+ };
75
+ const move = (index, delta) => {
76
+ const next = [...units];
77
+ const target = index + delta;
78
+ if (target < 0 || target >= next.length)
79
+ return;
80
+ [next[index], next[target]] = [next[target], next[index]];
81
+ void run(async () => {
82
+ await apiClient.patch(`${base}/reorder`, { orderedIds: next.map((u) => u.id) });
83
+ });
84
+ };
85
+ return (_jsxs("div", { className: "b2b-card", children: [_jsx("div", { className: "b2b-card__head", children: t('packagingUnits.title') }), _jsxs("div", { className: "b2b-card__body b2b-col", style: { gap: 12 }, children: [_jsx("div", { className: "b2b-help", children: t('packagingUnits.help') }), error ? _jsx("div", { className: "b2b-alert b2b-alert--error", children: error }) : null, loading ? (_jsx("div", { className: "b2b-help", children: t('packagingUnits.loading') })) : units.length === 0 ? (_jsx("div", { className: "b2b-help", children: t('packagingUnits.empty') })) : (_jsxs("table", { className: "b2b-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: t('packagingUnits.col.name') }), _jsx("th", { children: t('packagingUnits.col.baseQuantity') }), _jsx("th", { children: t('packagingUnits.col.default') }), _jsx("th", { children: t('packagingUnits.col.order') }), _jsx("th", {})] }) }), _jsx("tbody", { children: units.map((u, i) => (_jsxs("tr", { children: [_jsx("td", { children: _jsx("input", { className: "b2b-input", defaultValue: u.name, disabled: busy, "aria-label": t('packagingUnits.col.name'), onBlur: (e) => {
86
+ const v = e.target.value.trim();
87
+ if (v && v !== u.name)
88
+ patch(u.id, { name: v });
89
+ } }) }), _jsx("td", { children: _jsx("input", { className: "b2b-input", type: "number", min: 1, step: 1, defaultValue: u.baseQuantity, disabled: busy, "aria-label": t('packagingUnits.col.baseQuantity'), onBlur: (e) => {
90
+ const v = Number(e.target.value);
91
+ if (Number.isInteger(v) && v >= 1 && v !== u.baseQuantity) {
92
+ patch(u.id, { baseQuantity: v });
93
+ }
94
+ } }) }), _jsx("td", { children: _jsx("input", { type: "radio", name: `pkg-default-${productId}`, checked: u.isDefault, disabled: busy, "aria-label": t('packagingUnits.col.default'), onChange: () => {
95
+ if (!u.isDefault)
96
+ patch(u.id, { isDefault: true });
97
+ } }) }), _jsxs("td", { children: [_jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--sm", disabled: busy || i === 0, "aria-label": t('packagingUnits.action.moveUp'), onClick: () => move(i, -1), children: "\u2191" }), _jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--sm", disabled: busy || i === units.length - 1, "aria-label": t('packagingUnits.action.moveDown'), onClick: () => move(i, 1), children: "\u2193" })] }), _jsx("td", { children: _jsx("button", { type: "button", className: "b2b-btn b2b-btn--ghost b2b-btn--sm", disabled: busy, onClick: () => remove(u.id), children: t('packagingUnits.action.remove') }) })] }, u.id))) })] })), _jsxs("div", { className: "b2b-row", style: { gap: 8, alignItems: 'flex-end' }, children: [_jsx("input", { className: "b2b-input", placeholder: t('packagingUnits.newName'), value: newName, disabled: busy, "aria-label": t('packagingUnits.col.name'), onChange: (e) => setNewName(e.target.value) }), _jsx("input", { className: "b2b-input", type: "number", min: 1, step: 1, placeholder: t('packagingUnits.newQuantity'), value: newQty, disabled: busy, "aria-label": t('packagingUnits.col.baseQuantity'), onChange: (e) => setNewQty(e.target.value) }), _jsx("button", { type: "button", className: "b2b-btn b2b-btn--primary b2b-btn--sm", disabled: busy, onClick: add, children: t('packagingUnits.action.add') })] })] })] }));
98
+ }
99
+ //# sourceMappingURL=PackagingUnitsEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PackagingUnitsEditor.js","sourceRoot":"","sources":["../../../src/admin/components/PackagingUnitsEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface ProductAttributesTabProps {
3
+ /**
4
+ * Only for the per-value zone mount below; absent while the product is still
5
+ * being created, which is also when there is nothing to contribute about.
6
+ */
7
+ productId?: string | null | undefined;
8
+ attributeSetId: string;
9
+ values: Record<string, unknown>;
10
+ onChange: (key: string, value: unknown) => void;
11
+ }
12
+ export declare function ProductAttributesTab({ productId, attributeSetId, values, onChange, }: ProductAttributesTabProps): ReactNode;
13
+ //# sourceMappingURL=ProductAttributesTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductAttributesTab.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ProductAttributesTab.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAiE5D,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,cAAc,EACd,MAAM,EACN,QAAQ,GACT,EAAE,yBAAyB,GAAG,SAAS,CA4FvC"}
@@ -0,0 +1,140 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { ApiError, apiClient } from '@endora-commerce/admin-kit/lib';
4
+ import { Alert, AlertDescription, Input, Label, Select, Checkbox, MultiSelect } from '@endora-commerce/admin-kit/ui';
5
+ import { useTranslation } from '@endora-commerce/admin-kit/i18n';
6
+ import { AdminZone } from '@endora-commerce/admin-kit/zones';
7
+ /**
8
+ * The locales this screen edits product copy in — the same list
9
+ * `ProductEditor.tsx` renders its per-language name and description controls
10
+ * from.
11
+ *
12
+ * It is stated here because the zone below carries it: a contributor beside a
13
+ * language-scoped attribute renders one control per locale, and *which* locales
14
+ * a field is edited in is the host's fact, not the contributor's. Before
15
+ * feature 091's P4b the list lived in `pim_ergonode`'s control, restated there
16
+ * so a catalogue screen needed no language wiring — which put the catalogue's
17
+ * own vocabulary inside an integration.
18
+ */
19
+ const LOCALES = ['en-US', 'pl-PL'];
20
+ /** Attribute value types whose values come from a fixed option list. */
21
+ const OPTION_TYPES = new Set(['enum', 'select', 'multiselect']);
22
+ function pickLabel(label, fallback) {
23
+ return label['en-US'] ?? Object.values(label)[0] ?? fallback;
24
+ }
25
+ export function ProductAttributesTab({ productId, attributeSetId, values, onChange, }) {
26
+ const t = useTranslation('catalog');
27
+ const [attributes, setAttributes] = useState([]);
28
+ const [optionsByAttr, setOptionsByAttr] = useState({});
29
+ const [loading, setLoading] = useState(false);
30
+ const [error, setError] = useState(null);
31
+ // Re-load whenever the selected Attribute Set changes — this is what makes
32
+ // the tab track the Details-tab selector live.
33
+ useEffect(() => {
34
+ if (!attributeSetId) {
35
+ setAttributes([]);
36
+ setOptionsByAttr({});
37
+ return;
38
+ }
39
+ let cancelled = false;
40
+ setLoading(true);
41
+ setError(null);
42
+ void (async () => {
43
+ try {
44
+ const res = await apiClient.get(`/api/v1/admin/catalog/attribute-sets/${attributeSetId}`);
45
+ if (cancelled)
46
+ return;
47
+ const attrs = [...res.data.attributes].sort((a, b) => a.position - b.position);
48
+ setAttributes(attrs);
49
+ const optionAttrs = attrs.filter((a) => OPTION_TYPES.has(a.valueType));
50
+ const entries = await Promise.all(optionAttrs.map(async (a) => {
51
+ const optRes = await apiClient.get(`/api/v1/admin/catalog/attributes/${a.id}/options`);
52
+ const opts = [...optRes.data.items].sort((x, y) => x.sortOrder - y.sortOrder);
53
+ return [a.id, opts];
54
+ }));
55
+ if (cancelled)
56
+ return;
57
+ setOptionsByAttr(Object.fromEntries(entries));
58
+ }
59
+ catch (err) {
60
+ if (cancelled)
61
+ return;
62
+ setError(err instanceof ApiError
63
+ ? err.envelope.error.message
64
+ : t('productEditor.attributes.loadFailed'));
65
+ }
66
+ finally {
67
+ if (!cancelled)
68
+ setLoading(false);
69
+ }
70
+ })();
71
+ return () => {
72
+ cancelled = true;
73
+ };
74
+ }, [attributeSetId, t]);
75
+ if (!attributeSetId) {
76
+ return _jsx("div", { className: "b2b-help", children: t('productEditor.attributes.noSet') });
77
+ }
78
+ if (loading) {
79
+ return _jsx("div", { className: "b2b-help", children: t('productEditor.attributes.loading') });
80
+ }
81
+ if (error) {
82
+ return (_jsx(Alert, { variant: "destructive", children: _jsx(AlertDescription, { children: error }) }));
83
+ }
84
+ if (attributes.length === 0) {
85
+ return _jsx("div", { className: "b2b-help", children: t('productEditor.attributes.empty') });
86
+ }
87
+ return (_jsxs("div", { className: "b2b-col", style: { gap: 16 }, children: [_jsx("div", { className: "b2b-help", style: { marginTop: 0 }, children: t('productEditor.attributes.help') }), _jsx("div", { style: { display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 }, children: attributes.map((attr) => (_jsx(AttributeField, { attr: attr, options: optionsByAttr[attr.id] ?? [], value: values[attr.key], onChange: (v) => onChange(attr.key, v), noneLabel: t('productEditor.attributes.selectNone'), productId: productId }, attr.id))) })] }));
88
+ }
89
+ function AttributeField({ attr, options, value, onChange, noneLabel, productId, }) {
90
+ const label = pickLabel(attr.label, attr.key);
91
+ const inputId = `attr-${attr.id}`;
92
+ let control;
93
+ switch (attr.valueType) {
94
+ case 'boolean':
95
+ control = (_jsxs("label", { htmlFor: inputId, className: "b2b-row", style: { gap: 8, alignItems: 'center' }, children: [_jsx(Checkbox, { id: inputId, checked: value === true, onChange: (e) => onChange(e.target.checked) }), _jsx("span", { children: label })] }));
96
+ break;
97
+ case 'number':
98
+ case 'price':
99
+ control = (_jsx(Input, { id: inputId, type: "number", step: "any", value: value == null ? '' : String(value), onChange: (e) => {
100
+ const raw = e.target.value;
101
+ if (raw === '') {
102
+ onChange(undefined);
103
+ return;
104
+ }
105
+ const n = Number(raw);
106
+ onChange(Number.isFinite(n) ? n : undefined);
107
+ } }));
108
+ break;
109
+ case 'date':
110
+ control = (_jsx(Input, { id: inputId, type: "date", value: typeof value === 'string' ? value.slice(0, 10) : '', onChange: (e) => onChange(e.target.value || undefined) }));
111
+ break;
112
+ case 'enum':
113
+ case 'select':
114
+ control = (_jsxs(Select, { id: inputId, value: typeof value === 'string' ? value : '', onChange: (e) => onChange(e.target.value || undefined), children: [_jsx("option", { value: "", children: noneLabel }), options.map((o) => (_jsx("option", { value: o.value, children: pickLabel(o.label, o.labelDefault) }, o.id)))] }));
115
+ break;
116
+ case 'multiselect':
117
+ control = (_jsx(MultiSelect, { options: options.map((o) => ({ value: o.value, label: pickLabel(o.label, o.labelDefault) })), selected: Array.isArray(value) ? value : [], onChange: (next) => onChange(next), placeholder: noneLabel, ariaLabel: label }));
118
+ break;
119
+ case 'string':
120
+ default:
121
+ control = (_jsx(Input, { id: inputId, type: "text", value: typeof value === 'string' ? value : value == null ? '' : String(value), onChange: (e) => onChange(e.target.value) }));
122
+ break;
123
+ }
124
+ // Feature 091 / P4b — the eighth mount of `product.editor.field.after`, one
125
+ // per attribute value, because that is the granularity a per-value protection
126
+ // asks for: an operator curates *this* value, not "the attributes". The host
127
+ // says which locales the value is edited in and a contributor fans out over
128
+ // them; the screen names no integration and knows about none.
129
+ const protection = productId ? (_jsx(AdminZone, { name: "product.editor.field.after", props: {
130
+ productId,
131
+ fieldPath: `attributeValues.${attr.key}`,
132
+ languageCodes: attr.languageScoped === true ? LOCALES : null,
133
+ } })) : null;
134
+ // The boolean control renders its own inline label.
135
+ if (attr.valueType === 'boolean') {
136
+ return (_jsxs("div", { children: [control, protection] }));
137
+ }
138
+ return (_jsxs("div", { children: [_jsxs(Label, { htmlFor: inputId, children: [label, " ", _jsxs("span", { className: "b2b-mono", style: { opacity: 0.6 }, children: ["(", attr.key, ")"] })] }), control, protection] }));
139
+ }
140
+ //# sourceMappingURL=ProductAttributesTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductAttributesTab.js","sourceRoot":"","sources":["../../../src/admin/components/ProductAttributesTab.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Per-product Inventory tab — feature 010 / US2.
4
+ *
5
+ * Two threshold modes:
6
+ * - `cumulative` (default): one product-level threshold against the
7
+ * summed on-hand across every warehouse holding the product.
8
+ * - `per_warehouse`: each warehouse evaluated against its own threshold
9
+ * (per-(product, warehouse) row, falling back to the warehouse default).
10
+ */
11
+ export declare function ProductInventoryTab({ productId }: {
12
+ productId: string;
13
+ }): ReactNode;
14
+ //# sourceMappingURL=ProductInventoryTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductInventoryTab.d.ts","sourceRoot":"","sources":["../../../src/admin/components/ProductInventoryTab.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAkDlF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAufnF"}