@deenruv/admin-dashboard 1.0.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 (292) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +30 -0
  3. package/dist/@types/resources.js +51 -0
  4. package/dist/DeenruvAdminPanel.js +118 -0
  5. package/dist/DeenruvDeveloperIndicator.js +57 -0
  6. package/dist/components/Aexol.js +4 -0
  7. package/dist/components/BrandLogo.js +22 -0
  8. package/dist/components/CanLeaveRouteDialog.js +8 -0
  9. package/dist/components/DataTable.js +13 -0
  10. package/dist/components/DeleteDialog.js +6 -0
  11. package/dist/components/DuplicateEntry.js +46 -0
  12. package/dist/components/GlobalSearch.js +134 -0
  13. package/dist/components/History/AddEntryForm.js +29 -0
  14. package/dist/components/History/DeleteEntryDialog.js +25 -0
  15. package/dist/components/History/EditEntryDialog.js +32 -0
  16. package/dist/components/History/History.js +13 -0
  17. package/dist/components/History/ModifyHistoryInfo.js +6 -0
  18. package/dist/components/History/Timeline.js +53 -0
  19. package/dist/components/History/index.js +5 -0
  20. package/dist/components/Menu/ActiveAdmins.js +24 -0
  21. package/dist/components/Menu/ChannelSwitcher.js +20 -0
  22. package/dist/components/Menu/LanguagesDropdown.js +26 -0
  23. package/dist/components/Menu/Navigation.js +270 -0
  24. package/dist/components/Menu/NavigationFooter.js +12 -0
  25. package/dist/components/Menu/Notifications.js +90 -0
  26. package/dist/components/Menu/index.js +67 -0
  27. package/dist/components/index.js +6 -0
  28. package/dist/graphql/base.js +95 -0
  29. package/dist/graphql/collections.js +94 -0
  30. package/dist/graphql/draft_order.js +307 -0
  31. package/dist/graphql/orders.js +157 -0
  32. package/dist/graphql/products.js +230 -0
  33. package/dist/graphql/scalars.js +22 -0
  34. package/dist/i18.js +13 -0
  35. package/dist/index.css +161 -0
  36. package/dist/index.d.ts +11 -0
  37. package/dist/index.js +1 -0
  38. package/dist/locales/en/admins.json +57 -0
  39. package/dist/locales/en/assets.json +69 -0
  40. package/dist/locales/en/channels.json +66 -0
  41. package/dist/locales/en/collections.json +145 -0
  42. package/dist/locales/en/common.json +1127 -0
  43. package/dist/locales/en/countries.json +50 -0
  44. package/dist/locales/en/customerGroups.json +6 -0
  45. package/dist/locales/en/customers.json +109 -0
  46. package/dist/locales/en/dashboard.json +34 -0
  47. package/dist/locales/en/facets.json +78 -0
  48. package/dist/locales/en/globalSettings.json +15 -0
  49. package/dist/locales/en/index.js +52 -0
  50. package/dist/locales/en/orders.json +932 -0
  51. package/dist/locales/en/paymentMethods.json +59 -0
  52. package/dist/locales/en/permissions.json +94 -0
  53. package/dist/locales/en/products.json +194 -0
  54. package/dist/locales/en/promotions.json +65 -0
  55. package/dist/locales/en/roles.json +59 -0
  56. package/dist/locales/en/sellers.json +41 -0
  57. package/dist/locales/en/shippingMethods.json +84 -0
  58. package/dist/locales/en/stockLocations.json +40 -0
  59. package/dist/locales/en/system.json +41 -0
  60. package/dist/locales/en/table.json +201 -0
  61. package/dist/locales/en/taxCategories.json +47 -0
  62. package/dist/locales/en/taxRates.json +56 -0
  63. package/dist/locales/en/zones.json +47 -0
  64. package/dist/locales/index.js +2 -0
  65. package/dist/locales/pl/admins.json +57 -0
  66. package/dist/locales/pl/assets.json +69 -0
  67. package/dist/locales/pl/channels.json +66 -0
  68. package/dist/locales/pl/collections.json +145 -0
  69. package/dist/locales/pl/common.json +1128 -0
  70. package/dist/locales/pl/countries.json +50 -0
  71. package/dist/locales/pl/customerGroups.json +6 -0
  72. package/dist/locales/pl/customers.json +109 -0
  73. package/dist/locales/pl/dashboard.json +34 -0
  74. package/dist/locales/pl/facets.json +78 -0
  75. package/dist/locales/pl/globalSettings.json +15 -0
  76. package/dist/locales/pl/index.js +52 -0
  77. package/dist/locales/pl/orders.json +932 -0
  78. package/dist/locales/pl/paymentMethods.json +59 -0
  79. package/dist/locales/pl/permissions.json +94 -0
  80. package/dist/locales/pl/products.json +194 -0
  81. package/dist/locales/pl/promotions.json +65 -0
  82. package/dist/locales/pl/roles.json +59 -0
  83. package/dist/locales/pl/sellers.json +41 -0
  84. package/dist/locales/pl/shippingMethods.json +84 -0
  85. package/dist/locales/pl/stockLocations.json +40 -0
  86. package/dist/locales/pl/system.json +41 -0
  87. package/dist/locales/pl/table.json +201 -0
  88. package/dist/locales/pl/taxCategories.json +47 -0
  89. package/dist/locales/pl/taxRates.json +56 -0
  90. package/dist/locales/pl/zones.json +47 -0
  91. package/dist/notifications/OrderStatusNotification.js +47 -0
  92. package/dist/notifications/SystemStatusNotification.js +19 -0
  93. package/dist/pages/Custom404.js +5 -0
  94. package/dist/pages/LoginScreen.js +37 -0
  95. package/dist/pages/Root.js +252 -0
  96. package/dist/pages/admins/Detail.js +72 -0
  97. package/dist/pages/admins/List.js +56 -0
  98. package/dist/pages/admins/_components/AdminDetailView.js +34 -0
  99. package/dist/pages/admins/_components/RolesCard.js +31 -0
  100. package/dist/pages/admins/index.js +2 -0
  101. package/dist/pages/assets/List.js +82 -0
  102. package/dist/pages/assets/_components/Asset.js +114 -0
  103. package/dist/pages/assets/_components/AssetListView.js +29 -0
  104. package/dist/pages/assets/_components/EditAssetDialog.js +85 -0
  105. package/dist/pages/assets/_components/UploadAssetDialog.js +133 -0
  106. package/dist/pages/assets/_components/UploadProgress.js +20 -0
  107. package/dist/pages/assets/index.js +1 -0
  108. package/dist/pages/channels/Detail.js +149 -0
  109. package/dist/pages/channels/List.js +46 -0
  110. package/dist/pages/channels/_components/ChannelDetailView.js +51 -0
  111. package/dist/pages/channels/_components/DefaultsCard.js +25 -0
  112. package/dist/pages/channels/index.js +2 -0
  113. package/dist/pages/collections/Detail.js +61 -0
  114. package/dist/pages/collections/List.js +135 -0
  115. package/dist/pages/collections/_components/CollectionDetailView.js +52 -0
  116. package/dist/pages/collections/_components/CollectionProductVariantsDrawer.js +28 -0
  117. package/dist/pages/collections/_components/CombinationMode.js +6 -0
  118. package/dist/pages/collections/_components/ContentsCard.js +43 -0
  119. package/dist/pages/collections/_components/ContentsTable.js +102 -0
  120. package/dist/pages/collections/_components/DeleteCollectionsFromChannel.js +36 -0
  121. package/dist/pages/collections/_components/FacetsSelector.js +30 -0
  122. package/dist/pages/collections/_components/FiltersCard.js +101 -0
  123. package/dist/pages/collections/_components/MoveCollectionsToCollections.js +107 -0
  124. package/dist/pages/collections/_components/MoveEntityToChannels.js +115 -0
  125. package/dist/pages/collections/_components/PageHeader.js +11 -0
  126. package/dist/pages/collections/_components/SelectedCollectionsModal.js +22 -0
  127. package/dist/pages/collections/_components/VariantsSelector.js +43 -0
  128. package/dist/pages/collections/consts.js +7 -0
  129. package/dist/pages/collections/index.js +2 -0
  130. package/dist/pages/countries/Detail.js +57 -0
  131. package/dist/pages/countries/List.js +47 -0
  132. package/dist/pages/countries/_components/CountryDetailView.js +28 -0
  133. package/dist/pages/countries/index.js +2 -0
  134. package/dist/pages/customer-groups/Detail.js +76 -0
  135. package/dist/pages/customer-groups/List.js +41 -0
  136. package/dist/pages/customer-groups/_components/CustomerGroupsDetailView.js +21 -0
  137. package/dist/pages/customer-groups/index.js +2 -0
  138. package/dist/pages/customers/Detail.js +75 -0
  139. package/dist/pages/customers/List.js +60 -0
  140. package/dist/pages/customers/_components/Address.js +59 -0
  141. package/dist/pages/customers/_components/AddressDialog.js +56 -0
  142. package/dist/pages/customers/_components/AddressForm.js +77 -0
  143. package/dist/pages/customers/_components/AddressesCard.js +9 -0
  144. package/dist/pages/customers/_components/CustomerDetailSidebar.js +9 -0
  145. package/dist/pages/customers/_components/CustomerDetailView.js +41 -0
  146. package/dist/pages/customers/_components/CustomerGroupsCard.js +46 -0
  147. package/dist/pages/customers/_components/HistoryTab.js +65 -0
  148. package/dist/pages/customers/_components/OrdersTab.js +46 -0
  149. package/dist/pages/customers/_components/PersonalDataCard.js +6 -0
  150. package/dist/pages/customers/_components/VerifiedCard.js +6 -0
  151. package/dist/pages/customers/index.js +2 -0
  152. package/dist/pages/dashboard/Dashboard.js +10 -0
  153. package/dist/pages/dashboard/index.js +1 -0
  154. package/dist/pages/extensions/Extensions.js +74 -0
  155. package/dist/pages/extensions/index.js +1 -0
  156. package/dist/pages/facets/Detail.js +56 -0
  157. package/dist/pages/facets/List.js +48 -0
  158. package/dist/pages/facets/_components/AddFacetValueDialog.js +105 -0
  159. package/dist/pages/facets/_components/ColorSample.js +18 -0
  160. package/dist/pages/facets/_components/FacetDetailView.js +98 -0
  161. package/dist/pages/facets/index.js +2 -0
  162. package/dist/pages/global-settings/GlobalSettingsComponent.js +30 -0
  163. package/dist/pages/global-settings/index.js +71 -0
  164. package/dist/pages/index.js +25 -0
  165. package/dist/pages/orders/Detail.js +21 -0
  166. package/dist/pages/orders/List.js +132 -0
  167. package/dist/pages/orders/_components/AddPaymentDialog.js +50 -0
  168. package/dist/pages/orders/_components/AddressCard.js +260 -0
  169. package/dist/pages/orders/_components/CancelAndRefundDialog.js +29 -0
  170. package/dist/pages/orders/_components/ChangesRegister.js +68 -0
  171. package/dist/pages/orders/_components/ChangesRegisterTable.js +18 -0
  172. package/dist/pages/orders/_components/CouponCodesCard.js +85 -0
  173. package/dist/pages/orders/_components/CustomComponent.js +21 -0
  174. package/dist/pages/orders/_components/CustomerSelectCard.js +117 -0
  175. package/dist/pages/orders/_components/EditNoteButton.js +10 -0
  176. package/dist/pages/orders/_components/FulfillmentModal.js +85 -0
  177. package/dist/pages/orders/_components/LineItem.js +7 -0
  178. package/dist/pages/orders/_components/ManualOrderChangeModal.js +47 -0
  179. package/dist/pages/orders/_components/ModifyAcceptModal.js +22 -0
  180. package/dist/pages/orders/_components/ModifyingCard.js +77 -0
  181. package/dist/pages/orders/_components/OrderHistory.js +59 -0
  182. package/dist/pages/orders/_components/OrderLineActionModal/ActionQuantityPrice.js +58 -0
  183. package/dist/pages/orders/_components/OrderLineActionModal/index.js +7 -0
  184. package/dist/pages/orders/_components/OrderLineActionModal/types.js +1 -0
  185. package/dist/pages/orders/_components/OrderLineCustomFields.js +26 -0
  186. package/dist/pages/orders/_components/OrderSummary.js +10 -0
  187. package/dist/pages/orders/_components/PaymentMetadata.js +6 -0
  188. package/dist/pages/orders/_components/Payments.js +113 -0
  189. package/dist/pages/orders/_components/PossibleOrderStates.js +54 -0
  190. package/dist/pages/orders/_components/PriceChangedInfo.js +16 -0
  191. package/dist/pages/orders/_components/ProductsCard.js +308 -0
  192. package/dist/pages/orders/_components/ProductsTable.js +29 -0
  193. package/dist/pages/orders/_components/PromotionsList.js +73 -0
  194. package/dist/pages/orders/_components/RealizationCard.js +98 -0
  195. package/dist/pages/orders/_components/RefundCard.js +11 -0
  196. package/dist/pages/orders/_components/RefundPaymentCard.js +13 -0
  197. package/dist/pages/orders/_components/ShippingMethod.js +112 -0
  198. package/dist/pages/orders/_components/SpecialLineItem.js +7 -0
  199. package/dist/pages/orders/_components/SurchargeCard.js +99 -0
  200. package/dist/pages/orders/_components/SurchargeTable.js +8 -0
  201. package/dist/pages/orders/_components/TaxSummary.js +11 -0
  202. package/dist/pages/orders/_components/ToRealizationForm.js +64 -0
  203. package/dist/pages/orders/_components/TopActions.js +219 -0
  204. package/dist/pages/orders/_components/index.js +25 -0
  205. package/dist/pages/orders/index.js +2 -0
  206. package/dist/pages/payment-methods/Detail.js +67 -0
  207. package/dist/pages/payment-methods/List.js +41 -0
  208. package/dist/pages/payment-methods/_components/OptionsCard.js +60 -0
  209. package/dist/pages/payment-methods/_components/PaymentMethodDetailView.js +53 -0
  210. package/dist/pages/payment-methods/index.js +2 -0
  211. package/dist/pages/product-variants/Detail.js +4 -0
  212. package/dist/pages/product-variants/List.js +76 -0
  213. package/dist/pages/product-variants/index.js +2 -0
  214. package/dist/pages/products/Detail.js +75 -0
  215. package/dist/pages/products/List.js +79 -0
  216. package/dist/pages/products/_components/AddOptionGroupDialog.js +65 -0
  217. package/dist/pages/products/_components/AssetsCard.js +35 -0
  218. package/dist/pages/products/_components/BasicFieldsCard.js +6 -0
  219. package/dist/pages/products/_components/ChannelsCard.js +6 -0
  220. package/dist/pages/products/_components/CollectionsCard.js +6 -0
  221. package/dist/pages/products/_components/Container.js +4 -0
  222. package/dist/pages/products/_components/DiscountRatingCard.js +6 -0
  223. package/dist/pages/products/_components/FacetValuesCard.js +6 -0
  224. package/dist/pages/products/_components/ImagesCard.js +6 -0
  225. package/dist/pages/products/_components/OptionGroup.js +93 -0
  226. package/dist/pages/products/_components/OptionValueCard.js +59 -0
  227. package/dist/pages/products/_components/OptionsCard.js +38 -0
  228. package/dist/pages/products/_components/OptionsTab.js +40 -0
  229. package/dist/pages/products/_components/PriceCard.js +27 -0
  230. package/dist/pages/products/_components/ProductDetailSidebar.js +30 -0
  231. package/dist/pages/products/_components/ProductDetailView.js +54 -0
  232. package/dist/pages/products/_components/SettingsCard.js +6 -0
  233. package/dist/pages/products/_components/StockCard.js +40 -0
  234. package/dist/pages/products/_components/Variant.js +149 -0
  235. package/dist/pages/products/_components/VariantsTab.js +46 -0
  236. package/dist/pages/products/index.js +2 -0
  237. package/dist/pages/promotions/Detail.js +80 -0
  238. package/dist/pages/promotions/List.js +38 -0
  239. package/dist/pages/promotions/_components/ActionsCard.js +67 -0
  240. package/dist/pages/promotions/_components/BasicFieldsCard.js +6 -0
  241. package/dist/pages/promotions/_components/ConditionsCard.js +70 -0
  242. package/dist/pages/promotions/_components/CustomerGroupsSelector.js +25 -0
  243. package/dist/pages/promotions/_components/EnabledCard.js +6 -0
  244. package/dist/pages/promotions/_components/OptionsCard.js +6 -0
  245. package/dist/pages/promotions/_components/PromotionDetailSidebar.js +15 -0
  246. package/dist/pages/promotions/_components/PromotionDetailView.js +66 -0
  247. package/dist/pages/promotions/_components/PromotionFieldRender.js +4 -0
  248. package/dist/pages/promotions/index.js +2 -0
  249. package/dist/pages/roles/Detail.js +72 -0
  250. package/dist/pages/roles/List.js +70 -0
  251. package/dist/pages/roles/_components/PermissionsCard.js +7 -0
  252. package/dist/pages/roles/_components/PermissionsTable.js +42 -0
  253. package/dist/pages/roles/_components/RoleDetailView.js +49 -0
  254. package/dist/pages/roles/index.js +2 -0
  255. package/dist/pages/sellers/Detail.js +48 -0
  256. package/dist/pages/sellers/List.js +37 -0
  257. package/dist/pages/sellers/_components/SellerDetailView.js +20 -0
  258. package/dist/pages/sellers/index.js +2 -0
  259. package/dist/pages/shipping-methods/Detail.js +105 -0
  260. package/dist/pages/shipping-methods/List.js +40 -0
  261. package/dist/pages/shipping-methods/_components/CalculatorCard.js +79 -0
  262. package/dist/pages/shipping-methods/_components/CheckerCard.js +76 -0
  263. package/dist/pages/shipping-methods/_components/Lines.js +20 -0
  264. package/dist/pages/shipping-methods/_components/ShippingMethodDetailView.js +67 -0
  265. package/dist/pages/shipping-methods/_components/TestCard.js +62 -0
  266. package/dist/pages/shipping-methods/index.js +2 -0
  267. package/dist/pages/status/Status.js +6 -0
  268. package/dist/pages/status/_components/FilterToolbar.js +29 -0
  269. package/dist/pages/status/_components/Health.js +21 -0
  270. package/dist/pages/status/_components/JobResultPopover.js +8 -0
  271. package/dist/pages/status/_components/Jobs.js +199 -0
  272. package/dist/pages/status/_components/JsonExplorer.js +44 -0
  273. package/dist/pages/status/_components/JsonPopup.js +8 -0
  274. package/dist/pages/status/index.js +1 -0
  275. package/dist/pages/stock-locations/Detail.js +77 -0
  276. package/dist/pages/stock-locations/List.js +38 -0
  277. package/dist/pages/stock-locations/_components/StockLocationDetailView.js +22 -0
  278. package/dist/pages/stock-locations/index.js +2 -0
  279. package/dist/pages/tax-categories/Detail.js +85 -0
  280. package/dist/pages/tax-categories/List.js +46 -0
  281. package/dist/pages/tax-categories/_components/TaxCategoryDetailView.js +24 -0
  282. package/dist/pages/tax-categories/index.js +2 -0
  283. package/dist/pages/tax-rates/Detail.js +62 -0
  284. package/dist/pages/tax-rates/List.js +64 -0
  285. package/dist/pages/tax-rates/_components/TaxRateDetailView.js +64 -0
  286. package/dist/pages/tax-rates/index.js +2 -0
  287. package/dist/pages/zones/Detail.js +86 -0
  288. package/dist/pages/zones/List.js +52 -0
  289. package/dist/pages/zones/_components/ZoneDetailView.js +49 -0
  290. package/dist/pages/zones/index.js +2 -0
  291. package/dist/version.js +1 -0
  292. package/package.json +122 -0
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback } from 'react';
3
+ import { useParams } from 'react-router-dom';
4
+ import { useValidators, DetailView, createDeenruvForm, getMutation, useMutation, useTranslation, } from '@deenruv/react-ui-devkit';
5
+ import { TaxRateDetailView } from "./_components/TaxRateDetailView.js";
6
+ const CreateTaxRateMutation = getMutation('createTaxRate');
7
+ const EditTaxRateMutation = getMutation('updateTaxRate');
8
+ const DeleteTaxRateMutation = getMutation('deleteTaxRate');
9
+ export const TaxRatesDetailPage = () => {
10
+ const { id } = useParams();
11
+ const [update] = useMutation(EditTaxRateMutation);
12
+ const [create] = useMutation(CreateTaxRateMutation);
13
+ const [remove] = useMutation(DeleteTaxRateMutation);
14
+ const { t } = useTranslation('taxRates');
15
+ const { nameValidator, stringValidator, numberValidator } = useValidators();
16
+ const onSubmitHandler = useCallback((data) => {
17
+ if (!data.name?.validatedValue) {
18
+ throw new Error('Name is required.');
19
+ }
20
+ const inputData = {
21
+ name: data.name.validatedValue,
22
+ enabled: data.enabled.value,
23
+ categoryId: data.categoryId.validatedValue,
24
+ value: data.value?.validatedValue || data.value?.initialValue,
25
+ zoneId: data.zoneId.validatedValue,
26
+ customerGroupId: data.customerGroupId?.validatedValue,
27
+ ...(data.customFields?.validatedValue ? { customFields: data.customFields?.validatedValue } : {}),
28
+ };
29
+ if (id) {
30
+ return update({ input: { id, ...inputData } });
31
+ }
32
+ else {
33
+ return create({ input: { ...inputData } });
34
+ }
35
+ }, [id, update, create]);
36
+ const onDeleteHandler = useCallback(() => {
37
+ if (!id) {
38
+ throw new Error('Could not find the id.');
39
+ }
40
+ return remove({ input: { id } });
41
+ }, [remove, id]);
42
+ return (_jsx("div", { className: "relative flex flex-col gap-y-4", children: _jsx(DetailView, { id: id, locationId: "taxRates-detail-view", main: {
43
+ name: 'taxRate',
44
+ label: 'Tax Rate',
45
+ component: _jsx(TaxRateDetailView, {}),
46
+ form: createDeenruvForm({
47
+ key: 'CreateTaxRateInput',
48
+ keys: ['name', 'categoryId', 'customerGroupId', 'enabled', 'value', 'zoneId', 'customFields'],
49
+ config: {
50
+ name: nameValidator,
51
+ categoryId: stringValidator(t('validation.taxCategoryRequired')),
52
+ value: numberValidator(t('validation.valueRequired')),
53
+ zoneId: stringValidator(t('validation.zoneRequired')),
54
+ enabled: {
55
+ initialValue: true,
56
+ },
57
+ },
58
+ onSubmitted: onSubmitHandler,
59
+ onDeleted: onDeleteHandler,
60
+ }),
61
+ } }) }));
62
+ };
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Routes, apiClient, DetailList, deepMerge, TableLabel, ListLocations, useTranslation, } from '@deenruv/react-ui-devkit';
3
+ import { Permission, SortOrder } from '@deenruv/admin-types';
4
+ const tableId = 'taxRates-list-view';
5
+ const { selector } = ListLocations[tableId];
6
+ const fetch = async ({ page, perPage, filter, filterOperator, sort }, additionalSelector) => {
7
+ const response = await apiClient('query')({
8
+ ['taxRates']: [
9
+ {
10
+ options: {
11
+ take: perPage,
12
+ skip: (page - 1) * perPage,
13
+ filterOperator: filterOperator,
14
+ sort: sort ? { [sort.key]: sort.sortDir } : { createdAt: SortOrder.DESC },
15
+ ...(filter && { filter }),
16
+ },
17
+ },
18
+ { items: deepMerge(selector, additionalSelector ?? {}), totalItems: true },
19
+ ],
20
+ });
21
+ return response['taxRates'];
22
+ };
23
+ const onRemove = async (items) => {
24
+ try {
25
+ const ids = items.map((item) => item.id);
26
+ const { deleteTaxRates } = await apiClient('mutation')({
27
+ deleteTaxRates: [
28
+ { ids },
29
+ {
30
+ message: true,
31
+ result: true,
32
+ },
33
+ ],
34
+ });
35
+ return !!deleteTaxRates.length;
36
+ }
37
+ catch (error) {
38
+ return error;
39
+ }
40
+ };
41
+ export const TaxRatesListPage = () => {
42
+ const { t } = useTranslation('taxRates');
43
+ return (_jsx(DetailList, { filterFields: [
44
+ { key: 'name', operator: 'StringOperators' },
45
+ { key: 'enabled', operator: 'BooleanOperators' },
46
+ { key: 'value', operator: 'NumberOperators' },
47
+ ], detailLinkColumn: "id", searchFields: ['name'], hideColumns: ['customFields', 'translations', 'category'], additionalColumns: [
48
+ {
49
+ accessorKey: 'taxCategory',
50
+ header: () => _jsx(TableLabel, { children: t('table.taxCategory') }),
51
+ cell: ({ row }) => row.original.category.name,
52
+ },
53
+ {
54
+ accessorKey: 'zone',
55
+ header: () => _jsx(TableLabel, { children: t('table.zone') }),
56
+ cell: ({ row }) => row.original.zone.name,
57
+ },
58
+ {
59
+ accessorKey: 'customerGroup',
60
+ header: () => _jsx(TableLabel, { children: t('table.customerGroup') }),
61
+ cell: ({ row }) => row.original.customerGroup?.name ?? '—',
62
+ },
63
+ ], entityName: 'TaxRate', route: Routes['taxRates'], tableId: tableId, fetch: fetch, onRemove: onRemove, createPermissions: [Permission.CreateTaxRate], deletePermissions: [Permission.DeleteTaxRate] }));
64
+ };
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { Input, Label, Switch, apiClient, SimpleSelect, useDetailView, DetailViewMarker, CustomCard, CardIcons, EntityCustomFields, useTranslation, } from '@deenruv/react-ui-devkit';
4
+ const TAX_RATES_FORM_KEYS = [
5
+ 'CreateTaxRateInput',
6
+ 'name',
7
+ 'enabled',
8
+ 'value',
9
+ 'categoryId',
10
+ 'zoneId',
11
+ 'customerGroupId',
12
+ 'customFields',
13
+ ];
14
+ export const TaxRateDetailView = () => {
15
+ const { t } = useTranslation('taxRates');
16
+ const [taxCategoriesOptions, setTaxCategoriesOptions] = useState([]);
17
+ const [zonesOptions, setZonesOptions] = useState([]);
18
+ const { form, entity, fetchEntity, id } = useDetailView('taxRates-detail-view', ...TAX_RATES_FORM_KEYS);
19
+ const { base: { setField, state }, } = form;
20
+ const fetchItemsForOptions = useCallback(async () => {
21
+ const response = await apiClient('query')({
22
+ taxCategories: [
23
+ {},
24
+ {
25
+ items: {
26
+ id: true,
27
+ name: true,
28
+ },
29
+ },
30
+ ],
31
+ zones: [
32
+ {},
33
+ {
34
+ items: {
35
+ id: true,
36
+ name: true,
37
+ },
38
+ },
39
+ ],
40
+ });
41
+ setTaxCategoriesOptions(response.taxCategories.items.map((c) => ({ label: c.name, value: c.id })));
42
+ setZonesOptions(response.zones.items.map((z) => ({ label: z.name, value: z.id })));
43
+ }, [setTaxCategoriesOptions, setZonesOptions]);
44
+ useEffect(() => {
45
+ fetchItemsForOptions();
46
+ }, [id, fetchItemsForOptions]);
47
+ useEffect(() => {
48
+ fetchEntity();
49
+ }, []);
50
+ useEffect(() => {
51
+ console.log('ENT', entity);
52
+ if (!entity)
53
+ return;
54
+ setField('name', entity.name);
55
+ setField('enabled', entity.enabled);
56
+ setField('categoryId', entity.category.id);
57
+ setField('customerGroupId', entity.customerGroup?.id);
58
+ setField('zoneId', entity.zone.id);
59
+ setField('value', entity.value);
60
+ }, [entity]);
61
+ return (_jsx("main", { className: "my-4 min-h-96", children: _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx(CustomCard, { title: t('details.basic.title'), icon: _jsx(CardIcons.basic, {}), color: "green", children: _jsxs("div", { className: "flex flex-col gap-4 p-0 pt-4", children: [_jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "flex basis-full md:basis-1/2", children: _jsx(Input, { label: t('details.basic.name'), value: state.name?.value ?? undefined, onChange: (e) => setField('name', e.target.value), errors: state.name?.errors, required: true }) }), _jsx("div", { className: "flex basis-full md:basis-1/2", children: _jsx(Input, { type: "number", label: t('details.basic.value'), value: state.value?.value ?? undefined, onChange: (e) => setField('value', +e.target.value), errors: state.value?.errors, endAdornment: '%', min: 0, max: 100, required: true }) })] }), _jsxs("div", { className: "flex items-end gap-4", children: [_jsx("div", { className: "flex basis-full md:basis-1/2", children: _jsx(SimpleSelect, { label: t('details.basic.taxCategory'), value: state.categoryId?.value ?? undefined, onValueChange: (e) => setField('categoryId', e), options: taxCategoriesOptions, errors: state.categoryId?.errors, required: true }) }), _jsx("div", { className: "flex basis-full md:basis-1/2", children: _jsx(SimpleSelect, { label: t('details.basic.zone'), value: state.zoneId?.value ?? undefined, onValueChange: (e) => setField('zoneId', e), options: zonesOptions, errors: state.zoneId?.errors, required: true }) })] }), _jsx("div", { className: "flex items-end gap-4", children: _jsxs("div", { className: "mb-2 flex basis-full items-center gap-3 md:basis-1/2", children: [_jsx(Switch, { checked: state.enabled?.value ?? undefined, onCheckedChange: (e) => setField('enabled', e) }), _jsx(Label, { children: t('details.basic.enabled') })] }) })] }) }), _jsx(DetailViewMarker, { position: 'taxRates-detail-view' }), _jsx(EntityCustomFields, { entityName: "taxRate", id: id, onChange: (customFields) => {
62
+ setField('customFields', customFields);
63
+ }, initialValues: entity && 'customFields' in entity ? { customFields: entity.customFields } : { customFields: {} }, hideButton: true })] }) }));
64
+ };
@@ -0,0 +1,2 @@
1
+ export * from './List.js';
2
+ export * from './Detail.js';
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback } from 'react';
3
+ import { useParams } from 'react-router-dom';
4
+ import { useValidators, apiClient, useMutation, DetailView, getMutation, createDeenruvForm, useTranslation, } from '@deenruv/react-ui-devkit';
5
+ import { ZoneDetailView } from "./_components/ZoneDetailView.js";
6
+ const CreateZoneMutation = getMutation('createZone');
7
+ const EditZoneMutation = getMutation('updateZone');
8
+ const DeleteZoneMutation = getMutation('deleteZone');
9
+ export const ZonesDetailPage = () => {
10
+ const { id } = useParams();
11
+ const [update] = useMutation(EditZoneMutation);
12
+ const [create] = useMutation(CreateZoneMutation);
13
+ const [remove] = useMutation(DeleteZoneMutation);
14
+ const { nameValidator } = useValidators();
15
+ const { t } = useTranslation('zones');
16
+ const updateMembers = useCallback((toAdd, toRemove) => {
17
+ if ((!toAdd || toAdd.length === 0) && (!toRemove || toRemove.length === 0)) {
18
+ return Promise.resolve();
19
+ }
20
+ return apiClient('mutation')({
21
+ ...(toRemove && toRemove.length > 0
22
+ ? {
23
+ removeMembersFromZone: [
24
+ {
25
+ zoneId: id,
26
+ memberIds: toRemove,
27
+ },
28
+ { id: true },
29
+ ],
30
+ }
31
+ : {}),
32
+ ...(toAdd && toAdd.length > 0
33
+ ? {
34
+ addMembersToZone: [
35
+ {
36
+ zoneId: id,
37
+ memberIds: toAdd,
38
+ },
39
+ { id: true },
40
+ ],
41
+ }
42
+ : {}),
43
+ });
44
+ }, [id, t]);
45
+ const onSubmitHandler = useCallback((data, additionalData) => {
46
+ if (!data.name?.validatedValue) {
47
+ throw new Error('Name is required.');
48
+ }
49
+ const { membersIdsToRemove = [], membersIdsToAdd = [] } = additionalData && 'membersIdsToRemove' in additionalData && 'membersIdsToAdd' in additionalData
50
+ ? additionalData
51
+ : {};
52
+ const inputData = {
53
+ name: data.name.validatedValue,
54
+ ...(data.customFields?.validatedValue ? { customFields: data.customFields?.validatedValue } : {}),
55
+ };
56
+ if (id) {
57
+ return Promise.all([
58
+ update({ input: { id, ...inputData } }),
59
+ updateMembers(membersIdsToAdd, membersIdsToRemove),
60
+ ]).then(([res]) => res);
61
+ }
62
+ else {
63
+ return create({ input: { ...inputData, memberIds: data.memberIds?.validatedValue } });
64
+ }
65
+ }, [id, update, create]);
66
+ const onDeleteHandler = useCallback(() => {
67
+ if (!id) {
68
+ throw new Error('Could not find the id.');
69
+ }
70
+ return remove({ input: { id } });
71
+ }, [remove, id]);
72
+ return (_jsx("div", { className: "relative flex flex-col gap-y-4", children: _jsx(DetailView, { id: id, locationId: "zones-detail-view", main: {
73
+ name: 'zone',
74
+ label: 'Zone',
75
+ component: _jsx(ZoneDetailView, {}),
76
+ form: createDeenruvForm({
77
+ key: 'CreateZoneInput',
78
+ keys: ['name', 'memberIds', 'customFields'],
79
+ config: {
80
+ name: nameValidator,
81
+ },
82
+ onSubmitted: onSubmitHandler,
83
+ onDeleted: onDeleteHandler,
84
+ }),
85
+ } }) }));
86
+ };
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useTranslation, DetailList, ListLocations, TableLabel, apiClient, deepMerge, } from '@deenruv/react-ui-devkit';
3
+ import { Routes } from '@deenruv/react-ui-devkit';
4
+ import { Permission, SortOrder } from '@deenruv/admin-types';
5
+ const tableId = 'zones-list-view';
6
+ const { selector } = ListLocations[tableId];
7
+ const fetch = async ({ page, perPage, filter, filterOperator, sort }, additionalSelector) => {
8
+ const response = await apiClient('query')({
9
+ ['zones']: [
10
+ {
11
+ options: {
12
+ take: perPage,
13
+ skip: (page - 1) * perPage,
14
+ filterOperator: filterOperator,
15
+ sort: sort ? { [sort.key]: sort.sortDir } : { createdAt: SortOrder.DESC },
16
+ ...(filter && { filter }),
17
+ },
18
+ },
19
+ { items: deepMerge(selector, additionalSelector ?? {}), totalItems: true },
20
+ ],
21
+ });
22
+ return response['zones'];
23
+ };
24
+ const onRemove = async (items) => {
25
+ try {
26
+ const ids = items.map((item) => item.id);
27
+ const { deleteZones } = await apiClient('mutation')({
28
+ deleteZones: [
29
+ { ids },
30
+ {
31
+ message: true,
32
+ result: true,
33
+ },
34
+ ],
35
+ });
36
+ return !!deleteZones.length;
37
+ }
38
+ catch (error) {
39
+ return error;
40
+ }
41
+ };
42
+ export const ZonesListPage = () => {
43
+ const { t } = useTranslation('zones');
44
+ return (_jsx(DetailList, { filterFields: [{ key: 'name', operator: 'StringOperators' }], detailLinkColumn: "id", searchFields: ['name'], hideColumns: ['customFields', 'translations'], additionalColumns: [
45
+ {
46
+ accessorKey: 'members',
47
+ enableColumnFilter: false,
48
+ header: () => _jsx(TableLabel, { children: t('table.members') }),
49
+ cell: ({ row }) => row.original.members.length,
50
+ },
51
+ ], entityName: 'Zone', route: Routes['zones'], tableId: tableId, fetch: fetch, onRemove: onRemove, createPermissions: [Permission.CreateZone], deletePermissions: [Permission.DeleteZone] }));
52
+ };
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from 'react';
3
+ import { Input, Label, MultipleSelector, useServer, useDetailView, DetailViewMarker, CustomCard, CardIcons, EntityCustomFields, useTranslation, } from '@deenruv/react-ui-devkit';
4
+ const STOCK_LOCATION_FORM_KEYS = ['CreateZoneInput', 'name', 'memberIds', 'customFields'];
5
+ export const ZoneDetailView = () => {
6
+ const { form, fetchEntity, entity, setAdditionalData, id } = useDetailView('zones-detail-view', ...STOCK_LOCATION_FORM_KEYS);
7
+ const { base: { setField, state }, } = form;
8
+ const editMode = useMemo(() => !!id, [id]);
9
+ const { t } = useTranslation('zones');
10
+ const [countriesOptions, setCountriesOptions] = useState();
11
+ const [, setMembersIdsToRemove] = useState([]);
12
+ const [, setMembersIdsToAdd] = useState([]);
13
+ const countries = useServer((p) => p.countries);
14
+ useEffect(() => {
15
+ setCountriesOptions(countries.map((c) => ({ label: c.name, value: c.id })));
16
+ }, [countries]);
17
+ useEffect(() => {
18
+ (async () => {
19
+ const res = await fetchEntity();
20
+ if (!res)
21
+ return;
22
+ setField('name', res.name);
23
+ setField('memberIds', res.members.map((m) => m.id));
24
+ })();
25
+ }, []);
26
+ const handleChange = useCallback((options) => {
27
+ setField('memberIds', options.map((o) => o.value));
28
+ if (editMode && entity) {
29
+ const backendMembersIds = entity.members.map((m) => m.id);
30
+ const optionValues = options.map((o) => o.value);
31
+ const toAdd = optionValues.filter((v) => !backendMembersIds?.includes(v));
32
+ const toRemove = backendMembersIds?.filter((id) => !optionValues.includes(id));
33
+ setAdditionalData((prev) => {
34
+ const newData = { ...prev, membersIdsToRemove: toRemove, membersIdsToAdd: toAdd };
35
+ return newData;
36
+ });
37
+ // if BE doesn't include option ids, add them
38
+ setMembersIdsToAdd(toAdd);
39
+ // if currentState doesn't include BE ids, remove them
40
+ setMembersIdsToRemove(toRemove);
41
+ }
42
+ }, [editMode, setField, entity]);
43
+ return (_jsx("main", { className: "my-4 min-h-96", children: _jsxs("div", { className: "flex flex-col gap-3", children: [_jsx(CustomCard, { title: t('details.basic.title'), icon: _jsx(CardIcons.basic, {}), color: "green", children: _jsxs("div", { className: "flex gap-3", children: [_jsx("div", { className: "flex basis-full md:basis-1/2", children: _jsx(Input, { label: t('details.basic.name'), value: state.name?.value, onChange: (e) => setField('name', e.target.value), errors: state.name?.errors, required: true }) }), _jsxs("div", { className: "flex basis-full flex-col md:basis-1/2", children: [_jsx(Label, { className: "mb-2", children: t('details.basic.members') }), _jsx(MultipleSelector, { options: countriesOptions, value: state?.memberIds?.value?.map((id) => ({
44
+ label: countriesOptions?.find((o) => o.value === id)?.label || id,
45
+ value: id,
46
+ })), placeholder: t('details.basic.memberPlaceholder'), onChange: handleChange, hideClearAllButton: true })] })] }) }), _jsx(DetailViewMarker, { position: 'zones-detail-view' }), _jsx(EntityCustomFields, { entityName: "zone", id: id, hideButton: true, onChange: (customFields) => {
47
+ setField('customFields', customFields);
48
+ }, initialValues: entity && 'customFields' in entity ? { customFields: entity.customFields } : { customFields: {} } })] }) }));
49
+ };
@@ -0,0 +1,2 @@
1
+ export * from './Detail.js';
2
+ export * from './List.js';
@@ -0,0 +1 @@
1
+ export const ADMIN_DASHBOARD_VERSION = '1.0.0';
package/package.json ADDED
@@ -0,0 +1,122 @@
1
+ {
2
+ "name": "@deenruv/admin-dashboard",
3
+ "version": "1.0.0",
4
+ "main": "dist/index.js",
5
+ "style": "dist/index.css",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist/**/*"
9
+ ],
10
+ "dependencies": {
11
+ "@aexol-studio/hooks": "^0.2.16",
12
+ "@dnd-kit/core": "^6.1.0",
13
+ "@dnd-kit/modifiers": "^7.0.0",
14
+ "@dnd-kit/sortable": "^8.0.0",
15
+ "@dnd-kit/utilities": "^3.2.2",
16
+ "@hookform/resolvers": "^3.3.4",
17
+ "@radix-ui/react-accordion": "^1.1.2",
18
+ "@radix-ui/react-alert-dialog": "^1.0.5",
19
+ "@radix-ui/react-aspect-ratio": "^1.0.3",
20
+ "@radix-ui/react-checkbox": "^1.0.4",
21
+ "@radix-ui/react-dialog": "^1.0.5",
22
+ "@radix-ui/react-dropdown-menu": "^2.0.6",
23
+ "@radix-ui/react-hover-card": "^1.0.7",
24
+ "@radix-ui/react-icons": "^1.3.0",
25
+ "@radix-ui/react-label": "^2.0.2",
26
+ "@radix-ui/react-popover": "^1.0.7",
27
+ "@radix-ui/react-radio-group": "^1.2.0",
28
+ "@radix-ui/react-scroll-area": "^1.0.5",
29
+ "@radix-ui/react-select": "^2.0.0",
30
+ "@radix-ui/react-separator": "^1.1.0",
31
+ "@radix-ui/react-slot": "^1.0.2",
32
+ "@radix-ui/react-switch": "^1.0.3",
33
+ "@radix-ui/react-tabs": "^1.0.4",
34
+ "@radix-ui/react-toast": "^1.1.5",
35
+ "@radix-ui/react-toggle": "^1.1.0",
36
+ "@radix-ui/react-toggle-group": "^1.1.0",
37
+ "@radix-ui/react-tooltip": "^1.0.7",
38
+ "@tanstack/react-table": "^8.15.3",
39
+ "@tiptap/extension-document": "^2.8.0",
40
+ "@tiptap/extension-heading": "^2.8.0",
41
+ "@tiptap/extension-paragraph": "^2.8.0",
42
+ "@tiptap/extension-text": "^2.8.0",
43
+ "@tiptap/pm": "^2.7.2",
44
+ "@tiptap/react": "^2.7.2",
45
+ "@tiptap/starter-kit": "^2.7.2",
46
+ "class-variance-authority": "^0.7.0",
47
+ "clsx": "^2.1.0",
48
+ "cmdk": "^1.0.0",
49
+ "compression": "^1.7.4",
50
+ "country-flag-icons": "^1.5.11",
51
+ "date-fns": "^4.0.0",
52
+ "express": "^4.19.2",
53
+ "framer-motion": "11.1.7",
54
+ "i18next": "^23.2.3",
55
+ "i18next-browser-languagedetector": "^7.2.0",
56
+ "localforage": "^1.10.0",
57
+ "lucide-react": "^0.363.0",
58
+ "match-sorter": "^6.3.4",
59
+ "next-themes": "^0.3.0",
60
+ "react": "^18.2.0",
61
+ "react-color": "^2.19.3",
62
+ "react-day-picker": "^9.7.0",
63
+ "react-dom": "^18.2.0",
64
+ "react-hook-form": "^7.51.3",
65
+ "react-i18next": "^14.0.5",
66
+ "react-resizable-panels": "^2.0.17",
67
+ "react-router-dom": "^6.22.1",
68
+ "recharts": "^2.12.7",
69
+ "rimraf": "^6.0.1",
70
+ "sirv": "^2.0.4",
71
+ "socket.io-client": "^4.7.5",
72
+ "sonner": "^1.4.41",
73
+ "sort-by": "^1.2.0",
74
+ "tailwind-merge": "^2.2.2",
75
+ "tailwindcss-animate": "^1.0.7",
76
+ "ts-patch": "^3.2.1",
77
+ "typescript-transform-paths": "^3.5.1",
78
+ "use-debounce": "^10.0.0",
79
+ "uuid": "^9.0.1",
80
+ "vaul": "^0.9.1",
81
+ "yup": "^1.3.3",
82
+ "zod": "^3.22.5",
83
+ "zustand": "^4.5.2",
84
+ "@deenruv/admin-dashboard": "1.0.0",
85
+ "@deenruv/admin-types": "1.0.0",
86
+ "@deenruv/deenruv-examples-plugin": "1.0.0",
87
+ "@deenruv/react-ui-devkit": "1.0.0"
88
+ },
89
+ "devDependencies": {
90
+ "@tailwindcss/typography": "^0.5.15",
91
+ "@types/express": "^4.17.21",
92
+ "@types/react": "^18.2.0",
93
+ "@types/react-color": "^3.0.12",
94
+ "@types/react-dom": "^18.2.0",
95
+ "@types/uuid": "^9.0.8",
96
+ "@vitejs/plugin-react-swc": "^3.5.0",
97
+ "autoprefixer": "^10.4.19",
98
+ "graphql-zeus": "^7.0.0",
99
+ "i18next-resources-for-ts": "^1.5.0",
100
+ "postcss": "^8.4.38",
101
+ "tailwindcss": "^3.4.1",
102
+ "tsx": "^4.19.1",
103
+ "typescript": "^5.2.2",
104
+ "vite": "^5.1.0",
105
+ "vite-plugin-i18next-loader": "^2.0.12",
106
+ "vite-tsconfig-paths": "^4.3.1"
107
+ },
108
+ "scripts": {
109
+ "watch": "tspc --watch",
110
+ "build": "tspc --build && npm run copy-types && npm run copy-styles",
111
+ "copy-types": "cp src/root.d.ts dist/index.d.ts",
112
+ "copy-styles": "cp src/root.css dist/index.css",
113
+ "check-types": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
114
+ "zeus:local": "zeus http://localhost:3000/admin-api ./src/",
115
+ "lint": "eslint .",
116
+ "lint:fix": "eslint --fix .",
117
+ "preview": "vite preview",
118
+ "toc": "i18next-resources-for-ts toc -i ./src/locales/en -o ./src/@types/resources.ts",
119
+ "interface": "i18next-resources-for-ts interface -i ./src/locales/en -o ./src/@types/resources.d.ts",
120
+ "postversion": "node upgrade_version.js"
121
+ }
122
+ }