@mantajs/dashboard 0.1.12 → 0.1.14
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.
- package/LICENSE +21 -0
- package/README.md +253 -0
- package/dist/{api-key-management-detail-TM6K63HF.mjs → api-key-management-detail-SZR6LLZY.mjs} +16 -16
- package/dist/{api-key-management-sales-channels-4GOYD6BF.mjs → api-key-management-sales-channels-WZAGFYC5.mjs} +6 -6
- package/dist/app.css +0 -20
- package/dist/app.js +11156 -11279
- package/dist/app.mjs +9 -9
- package/dist/campaign-create-FJOECKGT.mjs +1 -1
- package/dist/{chunk-LISLAU2F.mjs → chunk-FBYTX6K7.mjs} +7 -7
- package/dist/{chunk-VHUQFKRO.mjs → chunk-M5AMBSF6.mjs} +188 -181
- package/dist/{collection-list-KLL2VLDE.mjs → collection-list-EFER73U6.mjs} +10 -10
- package/dist/{customer-detail-DN46Z4Z7.mjs → customer-detail-NCPDOSIN.mjs} +15 -15
- package/dist/{customer-group-list-UW5KXNKV.mjs → customer-group-list-KZHWADWX.mjs} +17 -17
- package/dist/{home-524EFXYO.mjs → home-KFQGXKRT.mjs} +1 -1
- package/dist/{inventory-detail-42PY5NFS.mjs → inventory-detail-2MFCIKDT.mjs} +16 -16
- package/dist/{inventory-stock-MCURFEYD.mjs → inventory-stock-3PPGJ2JD.mjs} +8 -9
- package/dist/{location-fulfillment-providers-KQUDIYAF.mjs → location-fulfillment-providers-TXNXNHRD.mjs} +16 -16
- package/dist/{location-list-YDMTR5QM.mjs → location-list-KVBA6J47.mjs} +4 -4
- package/dist/{location-sales-channels-WGVKHV3B.mjs → location-sales-channels-P6O7KJAO.mjs} +6 -6
- package/dist/{location-service-zone-shipping-option-create-5XHKSHIS.mjs → location-service-zone-shipping-option-create-XXHX5DWG.mjs} +15 -15
- package/dist/{location-service-zone-shipping-option-pricing-VTD5YQ7X.mjs → location-service-zone-shipping-option-pricing-5HN2Z5RB.mjs} +2 -2
- package/dist/{order-export-Z7RZH5EX.mjs → order-export-IFN234IN.mjs} +12 -12
- package/dist/{order-list-BXZST6UW.mjs → order-list-57XK2DRD.mjs} +10 -10
- package/dist/{product-attributes-NT25DQN6.mjs → product-attributes-TGLEKV7Y.mjs} +8 -8
- package/dist/{product-create-GZANVK54.mjs → product-create-IGJXOMQN.mjs} +28 -28
- package/dist/{product-detail-P3LEJNTC.mjs → product-detail-ZZMHLWWL.mjs} +19 -19
- package/dist/{product-edit-ZWEDI4DK.mjs → product-edit-AH2FVEYF.mjs} +8 -8
- package/dist/{product-export-TJYITBFD.mjs → product-export-TX7U6SYH.mjs} +10 -10
- package/dist/{product-list-7EB54CNP.mjs → product-list-RZNYCKTQ.mjs} +13 -13
- package/dist/{product-media-WN2GYSM3.mjs → product-media-CG4RFOTX.mjs} +2 -2
- package/dist/{product-organization-3PJP3Y43.mjs → product-organization-C4LU2WFS.mjs} +8 -8
- package/dist/{product-sales-channels-KZMXJISB.mjs → product-sales-channels-XBALPVAL.mjs} +6 -6
- package/dist/{product-tag-detail-JPH3QX6V.mjs → product-tag-detail-JPNWE5QK.mjs} +12 -12
- package/dist/{product-tag-list-AOR3RSJW.mjs → product-tag-list-KOYJZMGY.mjs} +12 -12
- package/dist/promotion-add-campaign-DO67QK6M.mjs +1 -1
- package/dist/{refund-reason-list-GKHO2WDS.mjs → refund-reason-list-YROTDEQW.mjs} +12 -12
- package/dist/{sales-channel-list-SWDVR3IS.mjs → sales-channel-list-BHMHTVP5.mjs} +13 -13
- package/dist/{tax-region-detail-D22AOV54.mjs → tax-region-detail-JDWO7JFL.mjs} +17 -17
- package/dist/{tax-region-province-detail-B5FBOF3U.mjs → tax-region-province-detail-NEYURIVX.mjs} +17 -17
- package/dist/{tax-region-tax-override-create-XDO7RON2.mjs → tax-region-tax-override-create-EBTFIY7C.mjs} +19 -19
- package/dist/{tax-region-tax-override-edit-3RTRDVDI.mjs → tax-region-tax-override-edit-UUKEKERW.mjs} +15 -15
- package/dist/{user-list-XFW3SHWQ.mjs → user-list-YTZQNYSO.mjs} +5 -5
- package/dist/vite-plugin/index.js +79 -21
- package/dist/vite-plugin/index.mjs +79 -21
- package/package.json +29 -3
- package/src/app.tsx +1 -1
- package/src/components/layout/main-layout/main-layout.tsx +2 -2
- package/src/dashboard-app/dashboard-app.tsx +2 -1
- package/src/dashboard-app/forms/hooks.tsx +1 -1
- package/src/dashboard-app/links/utils.ts +1 -1
- package/src/dashboard-app/routes/get-route.map.tsx +0 -8
- package/src/dashboard-app/routes/merge-extension-routes.ts +13 -4
- package/src/dashboard-app/routes/utils.ts +1 -1
- package/src/dashboard-app/utils/sort-menu-items-by-rank.ts +9 -7
- package/src/index.css +2 -8
- package/src/routes/home/home.tsx +1 -1
- package/src/routes/inventory/inventory-stock/components/inventory-stock-form/inventory-stock-form.tsx +1 -1
- package/src/vite-env.d.ts +4 -4
- package/src/vite-plugin/index.ts +91 -21
- package/dist/dashboard-C2M5PQNL.mjs +0 -135
- package/src/routes/dashboard/dashboard.tsx +0 -174
- package/src/routes/dashboard/index.ts +0 -1
- package/dist/{add-campaign-promotions-H7C2TJIH.mjs → add-campaign-promotions-OYPGISTF.mjs} +6 -6
- package/dist/{add-locales-47HF5EWF.mjs → add-locales-F4BOSZNU.mjs} +10 -10
- package/dist/{api-key-management-list-DPFW5U7B.mjs → api-key-management-list-2T35G3KT.mjs} +4 -4
- package/dist/{campaign-budget-edit-NLP7CWGC.mjs → campaign-budget-edit-B5MSE26J.mjs} +3 -3
- package/dist/{campaign-detail-JWCA2BOR.mjs → campaign-detail-2SHJIBIS.mjs} +9 -9
- package/dist/{campaign-list-CXECHCH4.mjs → campaign-list-PEOTTWBA.mjs} +2 -2
- package/dist/{categories-metadata-WYRXRAIH.mjs → categories-metadata-4OV6MKAD.mjs} +7 -7
- package/dist/{category-create-RCWOWE4W.mjs → category-create-G2JK5KDF.mjs} +3 -3
- package/dist/{category-detail-3GT2DMFA.mjs → category-detail-2TPOPANL.mjs} +9 -9
- package/dist/{category-list-C3JVQYQF.mjs → category-list-WHGMREI2.mjs} +4 -4
- package/dist/{category-products-KHRVHYTY.mjs → category-products-LKS7U7MI.mjs} +13 -13
- package/dist/{chunk-RCTRYC7L.mjs → chunk-5FMYPGTX.mjs} +3 -3
- package/dist/{chunk-5WXY5NFW.mjs → chunk-DODQ3KJT.mjs} +3 -3
- package/dist/{chunk-QV7RN52R.mjs → chunk-JUZ754L2.mjs} +3 -3
- package/dist/{chunk-5YS7C2IA.mjs → chunk-KCWP7RF5.mjs} +3 -3
- package/dist/{chunk-K737PKHV.mjs → chunk-KSDXSKJ7.mjs} +3 -3
- package/dist/{collection-add-products-5U6UXZO5.mjs → collection-add-products-KTACHFJO.mjs} +12 -12
- package/dist/{collection-detail-62PCW5E4.mjs → collection-detail-7GFJ3MAT.mjs} +9 -9
- package/dist/{collection-metadata-72WIRMTB.mjs → collection-metadata-EVPJGU6A.mjs} +7 -7
- package/dist/{customer-group-add-customers-OHFJCJAX.mjs → customer-group-add-customers-XMR2WBXX.mjs} +6 -6
- package/dist/{customer-group-detail-W2JHFS5S.mjs → customer-group-detail-GWTXNJ3C.mjs} +13 -13
- package/dist/{customer-list-RRV4GEKX.mjs → customer-list-UI5EQDII.mjs} +2 -2
- package/dist/{customers-add-customer-group-CG24Z4SE.mjs → customers-add-customer-group-3XYEAGX4.mjs} +16 -16
- package/dist/{edit-rules-IMAV7O5S.mjs → edit-rules-OOIFNR4Z.mjs} +7 -7
- package/dist/{inventory-create-PUU6JZLV.mjs → inventory-create-HQNGRBCA.mjs} +16 -16
- package/dist/{inventory-list-R5DC2CUH.mjs → inventory-list-IPORNDO4.mjs} +4 -4
- package/dist/{inventory-metadata-S66XTCLQ.mjs → inventory-metadata-RC7I7WAH.mjs} +7 -7
- package/dist/{location-detail-ULAMYS5R.mjs → location-detail-POZVJTS7.mjs} +8 -8
- package/dist/{location-service-zone-create-QINLHG5Y.mjs → location-service-zone-create-J43WN6G4.mjs} +3 -3
- package/dist/{location-service-zone-manage-areas-T5DBC22A.mjs → location-service-zone-manage-areas-6ZPMKMSX.mjs} +3 -3
- package/dist/{location-service-zone-shipping-option-edit-GGMKFUXK.mjs → location-service-zone-shipping-option-edit-4CGPQ3VT.mjs} +3 -3
- package/dist/{login-WK4YY6KQ.mjs → login-IMDOL4BZ.mjs} +7 -7
- package/dist/{order-create-claim-AB33KP6F.mjs → order-create-claim-H75RPNWI.mjs} +20 -20
- package/dist/{order-create-edit-QKGYBXVY.mjs → order-create-edit-6ZOYALA6.mjs} +15 -15
- package/dist/{order-create-exchange-YYNNY3HT.mjs → order-create-exchange-BUZTV7O7.mjs} +20 -20
- package/dist/{order-create-fulfillment-B4UKJX5F.mjs → order-create-fulfillment-YJS27E6Y.mjs} +9 -9
- package/dist/{order-create-refund-7MWFY4N3.mjs → order-create-refund-MY2VRRFA.mjs} +15 -15
- package/dist/{order-create-return-UZ2BDDH5.mjs → order-create-return-W3KT5LKU.mjs} +8 -8
- package/dist/{order-create-shipment-626Z6TQY.mjs → order-create-shipment-QMFZC6ZM.mjs} +9 -9
- package/dist/{order-detail-HISCRCUI.mjs → order-detail-VYLTG5MG.mjs} +20 -20
- package/dist/{order-edit-billing-address-3KER7QBF.mjs → order-edit-billing-address-ZZ4KK47F.mjs} +9 -9
- package/dist/{order-edit-email-4VZBU7P3.mjs → order-edit-email-TCRXOK3W.mjs} +9 -9
- package/dist/{order-edit-shipping-address-RKSV6BV6.mjs → order-edit-shipping-address-C3K5IZRG.mjs} +9 -9
- package/dist/{order-metadata-3F3KZ3GQ.mjs → order-metadata-5ESVMAPY.mjs} +9 -9
- package/dist/{order-receive-return-DA7KQHSO.mjs → order-receive-return-7N3532LA.mjs} +10 -10
- package/dist/{order-request-transfer-FP4FQQXG.mjs → order-request-transfer-VUPJ2FET.mjs} +9 -9
- package/dist/{price-list-configuration-MTUTPHQE.mjs → price-list-configuration-OH3KGRDN.mjs} +5 -5
- package/dist/{price-list-create-6TE264GD.mjs → price-list-create-77TLF2P2.mjs} +14 -14
- package/dist/{price-list-detail-ZML6WEJG.mjs → price-list-detail-KDMHC6V4.mjs} +12 -12
- package/dist/{price-list-list-P4O3ONES.mjs → price-list-list-JJXWBCTJ.mjs} +5 -5
- package/dist/{price-list-prices-add-BZIVC7QO.mjs → price-list-prices-add-RWB7WFOE.mjs} +14 -14
- package/dist/{price-list-prices-edit-42U6MFTL.mjs → price-list-prices-edit-ICTQBHHM.mjs} +2 -2
- package/dist/{product-create-variant-5HSS43Z7.mjs → product-create-variant-7EIWI54C.mjs} +13 -13
- package/dist/{product-image-variants-edit-S336246K.mjs → product-image-variants-edit-DWZWPK64.mjs} +12 -12
- package/dist/{product-import-72B4A7NT.mjs → product-import-NPPDYH7E.mjs} +7 -7
- package/dist/{product-metadata-QC3M4MYP.mjs → product-metadata-YNSTB5IC.mjs} +7 -7
- package/dist/{product-prices-WEGXAXQO.mjs → product-prices-LAVS64HJ.mjs} +1 -1
- package/dist/{product-stock-C5XB6GSY.mjs → product-stock-PEGYC4J5.mjs} +11 -11
- package/dist/{product-tag-create-TBICZVLL.mjs → product-tag-create-DJQIEWOF.mjs} +7 -7
- package/dist/{product-tag-edit-3DQJQ5YE.mjs → product-tag-edit-76EA7NLB.mjs} +7 -7
- package/dist/{product-tag-metadata-MQ5SCB3J.mjs → product-tag-metadata-HMCF2W4C.mjs} +7 -7
- package/dist/{product-type-detail-N2MDJT6X.mjs → product-type-detail-IJ6FGSB2.mjs} +9 -9
- package/dist/{product-type-list-BZDXJ2HH.mjs → product-type-list-MQ2PW2IE.mjs} +2 -2
- package/dist/{product-type-metadata-WPX7ZGF4.mjs → product-type-metadata-5Y5M2IQP.mjs} +7 -7
- package/dist/{product-variant-detail-PR4HNZ5A.mjs → product-variant-detail-N7YAKUOH.mjs} +8 -8
- package/dist/{product-variant-edit-UZBA2SBV.mjs → product-variant-edit-L2T5V2HJ.mjs} +11 -11
- package/dist/{product-variant-metadata-3YFLI23Q.mjs → product-variant-metadata-VTAPSZ24.mjs} +7 -7
- package/dist/{promotion-create-QDNLZXBY.mjs → promotion-create-I7OYJO55.mjs} +11 -11
- package/dist/{promotion-detail-P2C5XMVT.mjs → promotion-detail-Q7MMF7CC.mjs} +8 -8
- package/dist/{promotion-edit-details-DDT7MQVJ.mjs → promotion-edit-details-6BSOOWQN.mjs} +4 -4
- package/dist/{promotion-list-JFBYPMYZ.mjs → promotion-list-L22GJE3P.mjs} +2 -2
- package/dist/{refund-reason-create-DY22FUI4.mjs → refund-reason-create-UFAJFFFX.mjs} +7 -7
- package/dist/{refund-reason-edit-GLTVSOTD.mjs → refund-reason-edit-HM42SYVK.mjs} +7 -7
- package/dist/{region-add-countries-7P7MDPO2.mjs → region-add-countries-2VAVXMJQ.mjs} +3 -3
- package/dist/{region-create-DIZZS7HR.mjs → region-create-NA7Y2LN4.mjs} +6 -6
- package/dist/{region-detail-PL2IAQ4V.mjs → region-detail-3BARMXUE.mjs} +2 -2
- package/dist/{region-edit-2XQSSCPV.mjs → region-edit-WAU347DP.mjs} +3 -3
- package/dist/{region-list-J7R4D635.mjs → region-list-V4R2REMH.mjs} +2 -2
- package/dist/{region-metadata-ISC23DPY.mjs → region-metadata-UZXRJHUJ.mjs} +7 -7
- package/dist/{reservation-detail-7HTLPUEY.mjs → reservation-detail-JRY5S7TS.mjs} +9 -9
- package/dist/{reservation-list-IQ7T3RF2.mjs → reservation-list-HSF22GFZ.mjs} +4 -4
- package/dist/{reservation-metadata-E55IGDZR.mjs → reservation-metadata-UQZXHUCV.mjs} +9 -9
- package/dist/{return-reason-list-EGGZ7O6G.mjs → return-reason-list-EYLIXARO.mjs} +4 -4
- package/dist/{sales-channel-add-products-M37VZP3G.mjs → sales-channel-add-products-WNHRWOZS.mjs} +14 -14
- package/dist/{sales-channel-detail-4E2NPXYK.mjs → sales-channel-detail-GKI35W5H.mjs} +10 -10
- package/dist/{sales-channel-metadata-TXFO5GWM.mjs → sales-channel-metadata-GY2GM5OH.mjs} +8 -8
- package/dist/{shipping-option-type-create-Q47KBJCI.mjs → shipping-option-type-create-WKI3RSYP.mjs} +7 -7
- package/dist/{shipping-option-type-detail-UM6CAZRM.mjs → shipping-option-type-detail-RJ75KMFI.mjs} +7 -7
- package/dist/{shipping-option-type-edit-UB3ORRBC.mjs → shipping-option-type-edit-4KGCJFG3.mjs} +7 -7
- package/dist/{shipping-option-type-list-H3VQNXL7.mjs → shipping-option-type-list-NAT6DIHR.mjs} +11 -11
- package/dist/{shipping-profile-metadata-3VGQN6KZ.mjs → shipping-profile-metadata-6D3FYDC4.mjs} +7 -7
- package/dist/{shipping-profiles-list-RCSILIP5.mjs → shipping-profiles-list-WRPIJBZZ.mjs} +4 -4
- package/dist/{store-add-currencies-JCQAADSP.mjs → store-add-currencies-OX2WXFMS.mjs} +3 -3
- package/dist/{store-add-locales-S2HKXAPY.mjs → store-add-locales-37443R2E.mjs} +10 -10
- package/dist/{store-detail-LRVBWDU5.mjs → store-detail-IIKGTBWO.mjs} +11 -11
- package/dist/{store-metadata-X7X7J26V.mjs → store-metadata-3P5YI3YQ.mjs} +7 -7
- package/dist/{tax-region-create-BH4AS4OU.mjs → tax-region-create-BFOF2UVZ.mjs} +7 -7
- package/dist/{tax-region-edit-AGUULZKA.mjs → tax-region-edit-I2DTFHH4.mjs} +7 -7
- package/dist/{tax-region-list-ZYTJG7HC.mjs → tax-region-list-P4LDOPZD.mjs} +1 -1
- package/dist/{translation-list-3EGUQC7L.mjs → translation-list-2QIA5IZ4.mjs} +7 -7
- package/dist/{translations-edit-IWXQCTSI.mjs → translations-edit-K7EMV5N3.mjs} +8 -8
- package/dist/{user-invite-AQQMVG4K.mjs → user-invite-GAGIM5DO.mjs} +5 -5
- package/dist/{user-metadata-CGFMJKPT.mjs → user-metadata-WQ57HEMA.mjs} +7 -7
- package/dist/{workflow-execution-detail-QKA2H2VA.mjs → workflow-execution-detail-RRZJQZV6.mjs} +7 -7
- package/dist/{workflow-execution-list-N6YFMSXW.mjs → workflow-execution-list-C3EJMVSZ.mjs} +4 -4
|
@@ -39,13 +39,47 @@ var import_fs = __toESM(require("fs"));
|
|
|
39
39
|
var MENU_VIRTUAL_ID = "virtual:dashboard/menu-config";
|
|
40
40
|
var MENU_RESOLVED_ID = "\0" + MENU_VIRTUAL_ID;
|
|
41
41
|
var COMPONENT_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mts", ".mjs"];
|
|
42
|
+
var COMPONENT_EXT_SET = new Set(COMPONENT_EXTENSIONS);
|
|
43
|
+
var VALID_LOADERS = {
|
|
44
|
+
tsx: "tsx",
|
|
45
|
+
ts: "ts",
|
|
46
|
+
jsx: "jsx",
|
|
47
|
+
js: "js",
|
|
48
|
+
mts: "ts",
|
|
49
|
+
mjs: "js"
|
|
50
|
+
};
|
|
51
|
+
function collectComponentFiles(dir, depth = 0) {
|
|
52
|
+
if (depth > 20) return [];
|
|
53
|
+
const results = [];
|
|
54
|
+
let entries;
|
|
55
|
+
try {
|
|
56
|
+
entries = import_fs.default.readdirSync(dir, { withFileTypes: true });
|
|
57
|
+
} catch {
|
|
58
|
+
return results;
|
|
59
|
+
}
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
62
|
+
const fullPath = import_path.default.resolve(dir, entry.name);
|
|
63
|
+
if (entry.isDirectory()) {
|
|
64
|
+
results.push(...collectComponentFiles(fullPath, depth + 1));
|
|
65
|
+
} else if (entry.isFile()) {
|
|
66
|
+
const ext = import_path.default.extname(entry.name);
|
|
67
|
+
if (COMPONENT_EXT_SET.has(ext)) {
|
|
68
|
+
results.push(fullPath);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return results;
|
|
73
|
+
}
|
|
42
74
|
function getComponentName(filePath) {
|
|
43
75
|
const normalized = filePath.replace(/\\/g, "/");
|
|
44
|
-
const parts = normalized.split("/");
|
|
76
|
+
const parts = normalized.split("/").filter(Boolean);
|
|
77
|
+
if (parts.length === 0) return null;
|
|
45
78
|
const fileName = parts[parts.length - 1];
|
|
46
79
|
const baseName = fileName.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
|
|
80
|
+
if (!baseName) return null;
|
|
47
81
|
if (baseName === "index") {
|
|
48
|
-
return parts.length >= 2 ? parts[parts.length - 2] : null;
|
|
82
|
+
return parts.length >= 2 ? parts[parts.length - 2] || null : null;
|
|
49
83
|
}
|
|
50
84
|
if (parts.length >= 2 && baseName === parts[parts.length - 2]) {
|
|
51
85
|
return baseName;
|
|
@@ -56,15 +90,22 @@ function customDashboardPlugin() {
|
|
|
56
90
|
const componentsDir = import_path.default.resolve(process.cwd(), "src/admin/components");
|
|
57
91
|
const overridesByName = /* @__PURE__ */ new Map();
|
|
58
92
|
if (import_fs.default.existsSync(componentsDir)) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const name =
|
|
63
|
-
|
|
93
|
+
const collectedFiles = collectComponentFiles(componentsDir).sort();
|
|
94
|
+
for (const fullPath of collectedFiles) {
|
|
95
|
+
const fileName = import_path.default.basename(fullPath);
|
|
96
|
+
const name = fileName.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
|
|
97
|
+
if (name && name !== "index") {
|
|
98
|
+
if (overridesByName.has(name) && process.env.NODE_ENV === "development") {
|
|
99
|
+
console.warn(
|
|
100
|
+
`[custom-dashboard] Duplicate override "${name}": ${overridesByName.get(name)} will be replaced by ${fullPath}`
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
overridesByName.set(name, fullPath);
|
|
104
|
+
}
|
|
64
105
|
}
|
|
65
106
|
}
|
|
66
107
|
const hasOverrides = overridesByName.size > 0;
|
|
67
|
-
if (hasOverrides) {
|
|
108
|
+
if (hasOverrides && process.env.NODE_ENV === "development") {
|
|
68
109
|
console.log("[custom-dashboard] overrides:", [...overridesByName.keys()]);
|
|
69
110
|
}
|
|
70
111
|
return {
|
|
@@ -84,13 +125,20 @@ function customDashboardPlugin() {
|
|
|
84
125
|
build.onLoad({ filter: /app\.(mjs|js)$/ }, (args) => {
|
|
85
126
|
const normalized = args.path.replace(/\\/g, "/");
|
|
86
127
|
if (!normalized.includes("/dashboard/dist/")) return void 0;
|
|
87
|
-
const srcEntry =
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
128
|
+
const srcEntry = normalized.replace(/\/dist\/app\.(mjs|js)$/, "/src/app.tsx");
|
|
129
|
+
let contents;
|
|
130
|
+
try {
|
|
131
|
+
contents = import_fs.default.readFileSync(srcEntry, "utf-8");
|
|
132
|
+
} catch {
|
|
133
|
+
return void 0;
|
|
134
|
+
}
|
|
135
|
+
if (process.env.NODE_ENV === "development") {
|
|
136
|
+
console.log(
|
|
137
|
+
`[custom-dashboard] Redirecting entry: ${args.path} \u2192 ${srcEntry}`
|
|
138
|
+
);
|
|
139
|
+
}
|
|
92
140
|
return {
|
|
93
|
-
contents
|
|
141
|
+
contents,
|
|
94
142
|
loader: "tsx",
|
|
95
143
|
resolveDir: import_path.default.dirname(srcEntry)
|
|
96
144
|
};
|
|
@@ -104,12 +152,21 @@ function customDashboardPlugin() {
|
|
|
104
152
|
if (componentName && overrides.has(componentName)) {
|
|
105
153
|
const overridePath = overrides.get(componentName);
|
|
106
154
|
const ext = import_path.default.extname(overridePath).slice(1);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
155
|
+
const loader = VALID_LOADERS[ext] || "tsx";
|
|
156
|
+
let contents;
|
|
157
|
+
try {
|
|
158
|
+
contents = import_fs.default.readFileSync(overridePath, "utf-8");
|
|
159
|
+
} catch {
|
|
160
|
+
return void 0;
|
|
161
|
+
}
|
|
162
|
+
if (process.env.NODE_ENV === "development") {
|
|
163
|
+
console.log(
|
|
164
|
+
`[custom-dashboard] Override: ${componentName} \u2192 ${overridePath}`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
110
167
|
return {
|
|
111
|
-
contents
|
|
112
|
-
loader
|
|
168
|
+
contents,
|
|
169
|
+
loader,
|
|
113
170
|
resolveDir: import_path.default.dirname(overridePath)
|
|
114
171
|
};
|
|
115
172
|
}
|
|
@@ -128,8 +185,9 @@ function customDashboardPlugin() {
|
|
|
128
185
|
if (id !== MENU_RESOLVED_ID) return;
|
|
129
186
|
const basePath = import_path.default.resolve(process.cwd(), "src/admin/menu.config");
|
|
130
187
|
for (const ext of COMPONENT_EXTENSIONS) {
|
|
131
|
-
|
|
132
|
-
|
|
188
|
+
const fullPath = (basePath + ext).replace(/\\/g, "/");
|
|
189
|
+
if (import_fs.default.existsSync(fullPath)) {
|
|
190
|
+
return `export { default } from "${fullPath}"`;
|
|
133
191
|
}
|
|
134
192
|
}
|
|
135
193
|
return "export default null";
|
|
@@ -4,13 +4,47 @@ import fs from "fs";
|
|
|
4
4
|
var MENU_VIRTUAL_ID = "virtual:dashboard/menu-config";
|
|
5
5
|
var MENU_RESOLVED_ID = "\0" + MENU_VIRTUAL_ID;
|
|
6
6
|
var COMPONENT_EXTENSIONS = [".tsx", ".ts", ".jsx", ".js", ".mts", ".mjs"];
|
|
7
|
+
var COMPONENT_EXT_SET = new Set(COMPONENT_EXTENSIONS);
|
|
8
|
+
var VALID_LOADERS = {
|
|
9
|
+
tsx: "tsx",
|
|
10
|
+
ts: "ts",
|
|
11
|
+
jsx: "jsx",
|
|
12
|
+
js: "js",
|
|
13
|
+
mts: "ts",
|
|
14
|
+
mjs: "js"
|
|
15
|
+
};
|
|
16
|
+
function collectComponentFiles(dir, depth = 0) {
|
|
17
|
+
if (depth > 20) return [];
|
|
18
|
+
const results = [];
|
|
19
|
+
let entries;
|
|
20
|
+
try {
|
|
21
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
22
|
+
} catch {
|
|
23
|
+
return results;
|
|
24
|
+
}
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
27
|
+
const fullPath = path.resolve(dir, entry.name);
|
|
28
|
+
if (entry.isDirectory()) {
|
|
29
|
+
results.push(...collectComponentFiles(fullPath, depth + 1));
|
|
30
|
+
} else if (entry.isFile()) {
|
|
31
|
+
const ext = path.extname(entry.name);
|
|
32
|
+
if (COMPONENT_EXT_SET.has(ext)) {
|
|
33
|
+
results.push(fullPath);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return results;
|
|
38
|
+
}
|
|
7
39
|
function getComponentName(filePath) {
|
|
8
40
|
const normalized = filePath.replace(/\\/g, "/");
|
|
9
|
-
const parts = normalized.split("/");
|
|
41
|
+
const parts = normalized.split("/").filter(Boolean);
|
|
42
|
+
if (parts.length === 0) return null;
|
|
10
43
|
const fileName = parts[parts.length - 1];
|
|
11
44
|
const baseName = fileName.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
|
|
45
|
+
if (!baseName) return null;
|
|
12
46
|
if (baseName === "index") {
|
|
13
|
-
return parts.length >= 2 ? parts[parts.length - 2] : null;
|
|
47
|
+
return parts.length >= 2 ? parts[parts.length - 2] || null : null;
|
|
14
48
|
}
|
|
15
49
|
if (parts.length >= 2 && baseName === parts[parts.length - 2]) {
|
|
16
50
|
return baseName;
|
|
@@ -21,15 +55,22 @@ function customDashboardPlugin() {
|
|
|
21
55
|
const componentsDir = path.resolve(process.cwd(), "src/admin/components");
|
|
22
56
|
const overridesByName = /* @__PURE__ */ new Map();
|
|
23
57
|
if (fs.existsSync(componentsDir)) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const name =
|
|
28
|
-
|
|
58
|
+
const collectedFiles = collectComponentFiles(componentsDir).sort();
|
|
59
|
+
for (const fullPath of collectedFiles) {
|
|
60
|
+
const fileName = path.basename(fullPath);
|
|
61
|
+
const name = fileName.replace(/\.(tsx?|jsx?|mts|mjs)$/, "");
|
|
62
|
+
if (name && name !== "index") {
|
|
63
|
+
if (overridesByName.has(name) && process.env.NODE_ENV === "development") {
|
|
64
|
+
console.warn(
|
|
65
|
+
`[custom-dashboard] Duplicate override "${name}": ${overridesByName.get(name)} will be replaced by ${fullPath}`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
overridesByName.set(name, fullPath);
|
|
69
|
+
}
|
|
29
70
|
}
|
|
30
71
|
}
|
|
31
72
|
const hasOverrides = overridesByName.size > 0;
|
|
32
|
-
if (hasOverrides) {
|
|
73
|
+
if (hasOverrides && process.env.NODE_ENV === "development") {
|
|
33
74
|
console.log("[custom-dashboard] overrides:", [...overridesByName.keys()]);
|
|
34
75
|
}
|
|
35
76
|
return {
|
|
@@ -49,13 +90,20 @@ function customDashboardPlugin() {
|
|
|
49
90
|
build.onLoad({ filter: /app\.(mjs|js)$/ }, (args) => {
|
|
50
91
|
const normalized = args.path.replace(/\\/g, "/");
|
|
51
92
|
if (!normalized.includes("/dashboard/dist/")) return void 0;
|
|
52
|
-
const srcEntry =
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
93
|
+
const srcEntry = normalized.replace(/\/dist\/app\.(mjs|js)$/, "/src/app.tsx");
|
|
94
|
+
let contents;
|
|
95
|
+
try {
|
|
96
|
+
contents = fs.readFileSync(srcEntry, "utf-8");
|
|
97
|
+
} catch {
|
|
98
|
+
return void 0;
|
|
99
|
+
}
|
|
100
|
+
if (process.env.NODE_ENV === "development") {
|
|
101
|
+
console.log(
|
|
102
|
+
`[custom-dashboard] Redirecting entry: ${args.path} \u2192 ${srcEntry}`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
57
105
|
return {
|
|
58
|
-
contents
|
|
106
|
+
contents,
|
|
59
107
|
loader: "tsx",
|
|
60
108
|
resolveDir: path.dirname(srcEntry)
|
|
61
109
|
};
|
|
@@ -69,12 +117,21 @@ function customDashboardPlugin() {
|
|
|
69
117
|
if (componentName && overrides.has(componentName)) {
|
|
70
118
|
const overridePath = overrides.get(componentName);
|
|
71
119
|
const ext = path.extname(overridePath).slice(1);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
120
|
+
const loader = VALID_LOADERS[ext] || "tsx";
|
|
121
|
+
let contents;
|
|
122
|
+
try {
|
|
123
|
+
contents = fs.readFileSync(overridePath, "utf-8");
|
|
124
|
+
} catch {
|
|
125
|
+
return void 0;
|
|
126
|
+
}
|
|
127
|
+
if (process.env.NODE_ENV === "development") {
|
|
128
|
+
console.log(
|
|
129
|
+
`[custom-dashboard] Override: ${componentName} \u2192 ${overridePath}`
|
|
130
|
+
);
|
|
131
|
+
}
|
|
75
132
|
return {
|
|
76
|
-
contents
|
|
77
|
-
loader
|
|
133
|
+
contents,
|
|
134
|
+
loader,
|
|
78
135
|
resolveDir: path.dirname(overridePath)
|
|
79
136
|
};
|
|
80
137
|
}
|
|
@@ -93,8 +150,9 @@ function customDashboardPlugin() {
|
|
|
93
150
|
if (id !== MENU_RESOLVED_ID) return;
|
|
94
151
|
const basePath = path.resolve(process.cwd(), "src/admin/menu.config");
|
|
95
152
|
for (const ext of COMPONENT_EXTENSIONS) {
|
|
96
|
-
|
|
97
|
-
|
|
153
|
+
const fullPath = (basePath + ext).replace(/\\/g, "/");
|
|
154
|
+
if (fs.existsSync(fullPath)) {
|
|
155
|
+
return `export { default } from "${fullPath}"`;
|
|
98
156
|
}
|
|
99
157
|
}
|
|
100
158
|
return "export default null";
|
package/package.json
CHANGED
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mantajs/dashboard",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"description": "B2B Admin Dashboard for Medusa - Fork of @medusajs/dashboard",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Olivier Belaud",
|
|
8
|
+
"url": "https://github.com/OlivierBelaud"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/manta-js/dashboard#readme",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/manta-js/dashboard"
|
|
14
|
+
},
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/manta-js/dashboard/issues"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public",
|
|
20
|
+
"provenance": true
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"medusa",
|
|
24
|
+
"dashboard",
|
|
25
|
+
"admin",
|
|
26
|
+
"b2b",
|
|
27
|
+
"ecommerce",
|
|
28
|
+
"vite-plugin"
|
|
29
|
+
],
|
|
5
30
|
"scripts": {
|
|
6
31
|
"dev": "vite",
|
|
7
32
|
"build": "tsup && node ./scripts/generate-types.js",
|
|
@@ -34,6 +59,8 @@
|
|
|
34
59
|
},
|
|
35
60
|
"files": [
|
|
36
61
|
"package.json",
|
|
62
|
+
"LICENSE",
|
|
63
|
+
"README.md",
|
|
37
64
|
"src",
|
|
38
65
|
"dist"
|
|
39
66
|
],
|
|
@@ -79,12 +106,11 @@
|
|
|
79
106
|
"zod": "3.25.76"
|
|
80
107
|
},
|
|
81
108
|
"devDependencies": {
|
|
82
|
-
"@medusajs/admin-shared": "2.13.1",
|
|
83
109
|
"@medusajs/admin-vite-plugin": "2.13.1",
|
|
84
110
|
"@medusajs/types": "2.13.1",
|
|
85
111
|
"@medusajs/ui-preset": "2.13.1",
|
|
86
112
|
"@types/node": "^20.0.0",
|
|
87
|
-
"@types/react": "^
|
|
113
|
+
"@types/react": "^18.2.0",
|
|
88
114
|
"@vitejs/plugin-react": "^4.0.0",
|
|
89
115
|
"autoprefixer": "^10.4.16",
|
|
90
116
|
"postcss": "^8.4.31",
|
package/src/app.tsx
CHANGED
|
@@ -200,7 +200,7 @@ const getDefaultMedusaRoutes = (t: (key: string) => string): Omit<INavItem, "pat
|
|
|
200
200
|
const useCoreRoutes = (): Omit<INavItem, "pathname">[] => {
|
|
201
201
|
const { t } = useTranslation()
|
|
202
202
|
|
|
203
|
-
if (!menuConfig) {
|
|
203
|
+
if (!menuConfig || !Array.isArray((menuConfig as MenuConfig).items)) {
|
|
204
204
|
return getDefaultMedusaRoutes(t)
|
|
205
205
|
}
|
|
206
206
|
|
|
@@ -271,7 +271,7 @@ const CoreRouteSection = () => {
|
|
|
271
271
|
|
|
272
272
|
// Derived from config: avoids duplication between custom menu and extensions
|
|
273
273
|
const getMainMenuPaths = (): string[] => {
|
|
274
|
-
if (!menuConfig) return []
|
|
274
|
+
if (!menuConfig || !Array.isArray((menuConfig as MenuConfig).items)) return []
|
|
275
275
|
const config = menuConfig as MenuConfig
|
|
276
276
|
const paths: string[] = []
|
|
277
277
|
config.items.forEach((item) => {
|
|
@@ -137,7 +137,8 @@ export class DashboardApp {
|
|
|
137
137
|
allMenuItems.sort((a, b) => a.path.length - b.path.length)
|
|
138
138
|
|
|
139
139
|
allMenuItems.forEach((item) => {
|
|
140
|
-
|
|
140
|
+
const normalizedPath = item.path.replace(OPTIONAL_LAST_SEGMENT_MATCH, "")
|
|
141
|
+
item.path = normalizedPath
|
|
141
142
|
if (item.path.includes("/:") || item.path.endsWith("/*")) {
|
|
142
143
|
if (process.env.NODE_ENV === "development") {
|
|
143
144
|
console.warn(
|
|
@@ -11,7 +11,7 @@ function appendLinkableFields(
|
|
|
11
11
|
: link.map((l) => `+${l}.*`)
|
|
12
12
|
})
|
|
13
13
|
|
|
14
|
-
return [fields, ...linkableFields].join(",")
|
|
14
|
+
return [fields, ...linkableFields].filter(Boolean).join(",")
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export function getLinkedFields(model: CustomFieldModel, fields: string = "") {
|
|
@@ -30,14 +30,6 @@ export function getRouteMap({
|
|
|
30
30
|
errorElement: <ErrorBoundary />,
|
|
31
31
|
lazy: () => import("../../routes/home"),
|
|
32
32
|
},
|
|
33
|
-
{
|
|
34
|
-
path: "/dashboard",
|
|
35
|
-
errorElement: <ErrorBoundary />,
|
|
36
|
-
handle: {
|
|
37
|
-
breadcrumb: () => "Dashboard",
|
|
38
|
-
},
|
|
39
|
-
lazy: () => import("../../routes/dashboard"),
|
|
40
|
-
},
|
|
41
33
|
{
|
|
42
34
|
path: "/products",
|
|
43
35
|
errorElement: <ErrorBoundary />,
|
|
@@ -28,10 +28,19 @@ export function mergeExtensionRoutes(
|
|
|
28
28
|
const merged = { ...existing }
|
|
29
29
|
|
|
30
30
|
// Extension component takes priority
|
|
31
|
-
if (ext.lazy) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
if (ext.lazy || ext.Component) {
|
|
32
|
+
if (ext.lazy) {
|
|
33
|
+
merged.lazy = ext.lazy
|
|
34
|
+
delete (merged as any).Component
|
|
35
|
+
} else if (ext.Component) {
|
|
36
|
+
;(merged as any).Component = ext.Component
|
|
37
|
+
delete (merged as any).lazy
|
|
38
|
+
}
|
|
39
|
+
if (ext.loader) {
|
|
40
|
+
;(merged as any).loader = ext.loader
|
|
41
|
+
} else {
|
|
42
|
+
delete (merged as any).loader
|
|
43
|
+
}
|
|
35
44
|
}
|
|
36
45
|
|
|
37
46
|
// Recursively merge children — static children not redefined by the
|
|
@@ -166,7 +166,7 @@ const addRoute = (
|
|
|
166
166
|
leaf.children = processParallelRoutes(parallelRoutes, currentFullPath)
|
|
167
167
|
Object.assign(route, leaf)
|
|
168
168
|
} else {
|
|
169
|
-
const leaf = createLeafRoute(Component, loader)
|
|
169
|
+
const leaf = createLeafRoute(Component, loader, handle)
|
|
170
170
|
leaf.children = processParallelRoutes(parallelRoutes, currentFullPath)
|
|
171
171
|
route.children.push(leaf)
|
|
172
172
|
}
|
|
@@ -12,7 +12,7 @@ export function sortMenuItemsByRank(
|
|
|
12
12
|
// Sort items by rank (ascending order)
|
|
13
13
|
// Items with rank come first, sorted by rank value
|
|
14
14
|
// Items without rank come last, maintaining their original order
|
|
15
|
-
const sortedItems = items.sort((a, b) => {
|
|
15
|
+
const sortedItems = [...items].sort((a, b) => {
|
|
16
16
|
// If both have rank, sort by rank value
|
|
17
17
|
if (a.rank !== undefined && b.rank !== undefined) {
|
|
18
18
|
return a.rank - b.rank
|
|
@@ -30,14 +30,16 @@ export function sortMenuItemsByRank(
|
|
|
30
30
|
})
|
|
31
31
|
|
|
32
32
|
// Recursively sort nested items
|
|
33
|
-
sortedItems.
|
|
33
|
+
return sortedItems.map((item) => {
|
|
34
34
|
if (item.items && item.items.length > 0) {
|
|
35
|
-
|
|
36
|
-
item
|
|
37
|
-
|
|
35
|
+
return {
|
|
36
|
+
...item,
|
|
37
|
+
items: sortMenuItemsByRank(
|
|
38
|
+
item.items as (INavItem & { rank?: number })[]
|
|
39
|
+
),
|
|
40
|
+
}
|
|
38
41
|
}
|
|
42
|
+
return item
|
|
39
43
|
})
|
|
40
|
-
|
|
41
|
-
return sortedItems
|
|
42
44
|
}
|
|
43
45
|
|
package/src/index.css
CHANGED
|
@@ -34,15 +34,9 @@
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
@layer components {
|
|
37
|
-
.
|
|
37
|
+
.workflow-grid {
|
|
38
38
|
background-image: radial-gradient(black 1px, transparent 0);
|
|
39
39
|
background-size: 40px 40px;
|
|
40
|
-
background: repeat;
|
|
40
|
+
background-repeat: repeat;
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
|
|
44
|
-
.worfklow-grid {
|
|
45
|
-
background-image: radial-gradient(black 1px, transparent 0);
|
|
46
|
-
background-size: 40px 40px;
|
|
47
|
-
background: repeat;
|
|
48
|
-
}
|
package/src/routes/home/home.tsx
CHANGED
|
@@ -32,7 +32,7 @@ export const InventoryStockForm = ({
|
|
|
32
32
|
const { setCloseOnEscape, handleSuccess } = useRouteModal()
|
|
33
33
|
|
|
34
34
|
const initialValues = useRef(getDefaultValues(items, locations))
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
|
|
37
37
|
const form = useForm<InventoryStockSchema>({
|
|
38
38
|
defaultValues: getDefaultValues(items, locations),
|
package/src/vite-env.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="vite/client" />
|
|
2
2
|
|
|
3
3
|
interface ImportMetaEnv {
|
|
4
|
-
readonly
|
|
4
|
+
readonly VITE_MEDUSA_BACKEND_URL: string
|
|
5
5
|
readonly VITE_MEDUSA_STOREFRONT_URL: string
|
|
6
|
+
readonly VITE_MEDUSA_BASE?: string
|
|
7
|
+
readonly VITE_MEDUSA_PROJECT?: string
|
|
6
8
|
readonly VITE_MEDUSA_V2: "true" | "false"
|
|
7
9
|
}
|
|
8
10
|
|
|
@@ -16,5 +18,3 @@ interface ImportMeta {
|
|
|
16
18
|
declare const __BACKEND_URL__: string | undefined
|
|
17
19
|
declare const __STOREFRONT_URL__: string | undefined
|
|
18
20
|
declare const __BASE__: string
|
|
19
|
-
declare const __AUTH_TYPE__: "session" | "jwt" | undefined
|
|
20
|
-
declare const __JWT_TOKEN_STORAGE_KEY__: string | undefined
|