@voyantjs/suppliers-ui 0.105.3 → 0.106.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.
- package/dist/admin/index.d.ts +68 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +58 -0
- package/dist/admin/supplier-detail-host.d.ts +38 -0
- package/dist/admin/supplier-detail-host.d.ts.map +1 -0
- package/dist/admin/supplier-detail-host.js +38 -0
- package/dist/admin/supplier-detail-skeleton.d.ts +9 -0
- package/dist/admin/supplier-detail-skeleton.d.ts.map +1 -0
- package/dist/admin/supplier-detail-skeleton.js +20 -0
- package/dist/admin/suppliers-host.d.ts +11 -0
- package/dist/admin/suppliers-host.d.ts.map +1 -0
- package/dist/admin/suppliers-host.js +17 -0
- package/dist/admin/suppliers-list-skeleton.d.ts +9 -0
- package/dist/admin/suppliers-list-skeleton.d.ts.map +1 -0
- package/dist/admin/suppliers-list-skeleton.js +24 -0
- package/package.json +12 -5
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type AdminExtension } from "@voyantjs/admin";
|
|
2
|
+
/**
|
|
3
|
+
* Semantic destinations the suppliers admin surfaces navigate to
|
|
4
|
+
* (packaged-admin RFC §4.7). The supplier pages link between the list and
|
|
5
|
+
* the detail page, so instead of importing a host route tree they resolve
|
|
6
|
+
* these keys through `useAdminHref`/`useAdminNavigate` from
|
|
7
|
+
* `@voyantjs/admin`. Hosts register one resolver per key
|
|
8
|
+
* (`satisfies AdminDestinationResolvers`).
|
|
9
|
+
*
|
|
10
|
+
* `supplier.detail` is also declared by `@voyantjs/catalog-ui/admin` and
|
|
11
|
+
* `@voyantjs/finance-ui/admin` — interface merging requires the member shape
|
|
12
|
+
* to stay identical across packages.
|
|
13
|
+
*/
|
|
14
|
+
declare module "@voyantjs/admin" {
|
|
15
|
+
interface AdminDestinations {
|
|
16
|
+
/** The suppliers list page. */
|
|
17
|
+
"supplier.list": Record<string, never>;
|
|
18
|
+
/** A supplier's detail page. */
|
|
19
|
+
"supplier.detail": {
|
|
20
|
+
supplierId: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export { SupplierDetailHost, type SupplierDetailHostProps, type SupplierDetailHostSlotContext, supplierDetailPaymentPolicySlot, } from "./supplier-detail-host.js";
|
|
25
|
+
export { SupplierDetailSkeleton } from "./supplier-detail-skeleton.js";
|
|
26
|
+
export { SuppliersHost } from "./suppliers-host.js";
|
|
27
|
+
export { SuppliersListSkeleton } from "./suppliers-list-skeleton.js";
|
|
28
|
+
export interface CreateSuppliersAdminExtensionOptions {
|
|
29
|
+
/** Mount path of the supplier pages inside the admin workspace. Default `/suppliers`. */
|
|
30
|
+
basePath?: string;
|
|
31
|
+
/** Localized page titles. Defaults are the English operator nav labels. */
|
|
32
|
+
labels?: {
|
|
33
|
+
suppliers?: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The suppliers admin contribution (packaged-admin RFC Phase 3,
|
|
38
|
+
* `@voyantjs/<domain>-ui/admin` convention).
|
|
39
|
+
*
|
|
40
|
+
* NAVIGATION: deliberately none. The Suppliers nav item is part of the BASE
|
|
41
|
+
* operator navigation — see `createOperatorAdminNavigation` in
|
|
42
|
+
* `@voyantjs/admin` — so contributing nav entries here would duplicate it.
|
|
43
|
+
* If the base nav ever drops the suppliers item, this extension is where the
|
|
44
|
+
* entry moves.
|
|
45
|
+
*
|
|
46
|
+
* ROUTES: contributions are metadata only — the supplier pages carry no URL
|
|
47
|
+
* search state (the list keeps its filters local). The PAGES are
|
|
48
|
+
* package-owned: {@link SuppliersHost} (zero-prop, attachable directly as a
|
|
49
|
+
* route `component:`) and {@link SupplierDetailHost} bind the canonical
|
|
50
|
+
* supplier pages to their data wiring (the shared suppliers provider
|
|
51
|
+
* context) and resolve every cross-route link through the semantic
|
|
52
|
+
* destinations declared above — no app RPC client, no host route tree.
|
|
53
|
+
*
|
|
54
|
+
* `component:` is intentionally NOT attached to these contributions yet:
|
|
55
|
+
* the contribution contract renders zero-prop pages (route components read
|
|
56
|
+
* params via the router, per RFC §4.2), and {@link SupplierDetailHost}
|
|
57
|
+
* takes the supplier id as a prop. Host route files stay the thin binding
|
|
58
|
+
* layer (`Route.useParams()` → host props) until the §4.2 code-based route
|
|
59
|
+
* assembly gives packaged pages a router-agnostic way to read route state.
|
|
60
|
+
*
|
|
61
|
+
* WIDGETS: none contributed, but {@link SupplierDetailHost} exposes the
|
|
62
|
+
* `supplier.details.payment-policy` slot ({@link
|
|
63
|
+
* supplierDetailPaymentPolicySlot}) — the §4.7 cycle resolution that lets
|
|
64
|
+
* `@voyantjs/finance-ui` (which depends on this package) contribute the
|
|
65
|
+
* finance-owned customer-payment-policy card to the supplier detail page.
|
|
66
|
+
*/
|
|
67
|
+
export declare function createSuppliersAdminExtension(options?: CreateSuppliersAdminExtensionOptions): AdminExtension;
|
|
68
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,iBAAiB,CAAA;AAE3E;;;;;;;;;;;GAWG;AACH,OAAO,QAAQ,iBAAiB,CAAC;IAC/B,UAAU,iBAAiB;QACzB,+BAA+B;QAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACtC,gCAAgC;QAChC,iBAAiB,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAA;KAC1C;CACF;AAKD,OAAO,EACL,kBAAkB,EAClB,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,+BAA+B,GAChC,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,WAAW,oCAAoC;IACnD,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2EAA2E;IAC3E,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,oCAAyC,GACjD,cAAc,CAmBhB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { defineAdminExtension } from "@voyantjs/admin";
|
|
2
|
+
// Packaged admin hosts (packaged-admin RFC Phase 3): the supplier pages
|
|
3
|
+
// bound to their data wiring + semantic-destination navigation. Host route
|
|
4
|
+
// files only bind route params onto these.
|
|
5
|
+
export { SupplierDetailHost, supplierDetailPaymentPolicySlot, } from "./supplier-detail-host.js";
|
|
6
|
+
export { SupplierDetailSkeleton } from "./supplier-detail-skeleton.js";
|
|
7
|
+
export { SuppliersHost } from "./suppliers-host.js";
|
|
8
|
+
export { SuppliersListSkeleton } from "./suppliers-list-skeleton.js";
|
|
9
|
+
/**
|
|
10
|
+
* The suppliers admin contribution (packaged-admin RFC Phase 3,
|
|
11
|
+
* `@voyantjs/<domain>-ui/admin` convention).
|
|
12
|
+
*
|
|
13
|
+
* NAVIGATION: deliberately none. The Suppliers nav item is part of the BASE
|
|
14
|
+
* operator navigation — see `createOperatorAdminNavigation` in
|
|
15
|
+
* `@voyantjs/admin` — so contributing nav entries here would duplicate it.
|
|
16
|
+
* If the base nav ever drops the suppliers item, this extension is where the
|
|
17
|
+
* entry moves.
|
|
18
|
+
*
|
|
19
|
+
* ROUTES: contributions are metadata only — the supplier pages carry no URL
|
|
20
|
+
* search state (the list keeps its filters local). The PAGES are
|
|
21
|
+
* package-owned: {@link SuppliersHost} (zero-prop, attachable directly as a
|
|
22
|
+
* route `component:`) and {@link SupplierDetailHost} bind the canonical
|
|
23
|
+
* supplier pages to their data wiring (the shared suppliers provider
|
|
24
|
+
* context) and resolve every cross-route link through the semantic
|
|
25
|
+
* destinations declared above — no app RPC client, no host route tree.
|
|
26
|
+
*
|
|
27
|
+
* `component:` is intentionally NOT attached to these contributions yet:
|
|
28
|
+
* the contribution contract renders zero-prop pages (route components read
|
|
29
|
+
* params via the router, per RFC §4.2), and {@link SupplierDetailHost}
|
|
30
|
+
* takes the supplier id as a prop. Host route files stay the thin binding
|
|
31
|
+
* layer (`Route.useParams()` → host props) until the §4.2 code-based route
|
|
32
|
+
* assembly gives packaged pages a router-agnostic way to read route state.
|
|
33
|
+
*
|
|
34
|
+
* WIDGETS: none contributed, but {@link SupplierDetailHost} exposes the
|
|
35
|
+
* `supplier.details.payment-policy` slot ({@link
|
|
36
|
+
* supplierDetailPaymentPolicySlot}) — the §4.7 cycle resolution that lets
|
|
37
|
+
* `@voyantjs/finance-ui` (which depends on this package) contribute the
|
|
38
|
+
* finance-owned customer-payment-policy card to the supplier detail page.
|
|
39
|
+
*/
|
|
40
|
+
export function createSuppliersAdminExtension(options = {}) {
|
|
41
|
+
const { basePath = "/suppliers", labels = {} } = options;
|
|
42
|
+
const { suppliers = "Suppliers" } = labels;
|
|
43
|
+
return defineAdminExtension({
|
|
44
|
+
id: "suppliers",
|
|
45
|
+
routes: [
|
|
46
|
+
{
|
|
47
|
+
id: "suppliers-index",
|
|
48
|
+
path: basePath,
|
|
49
|
+
title: suppliers,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "suppliers-detail",
|
|
53
|
+
path: `${basePath}/$id`,
|
|
54
|
+
title: suppliers,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Supplier, UpdateSupplierInput } from "@voyantjs/suppliers-react";
|
|
2
|
+
/**
|
|
3
|
+
* Widget slot rendered as the supplier detail page's customer-payment-policy
|
|
4
|
+
* card (packaged-admin RFC §4.7 cycle resolution): `@voyantjs/finance-ui`
|
|
5
|
+
* depends on this package, so the host cannot import the finance-owned
|
|
6
|
+
* payment-policy form/preview directly — instead finance's admin extension
|
|
7
|
+
* contributes a widget targeting this slot and the host renders the section
|
|
8
|
+
* whenever a contribution exists. Widgets receive
|
|
9
|
+
* {@link SupplierDetailHostSlotContext} as props.
|
|
10
|
+
*/
|
|
11
|
+
export declare const supplierDetailPaymentPolicySlot = "supplier.details.payment-policy";
|
|
12
|
+
/**
|
|
13
|
+
* Render context handed to widget contributions targeting
|
|
14
|
+
* {@link supplierDetailPaymentPolicySlot}. Mirrors the canonical page's
|
|
15
|
+
* `renderCustomerPaymentPolicy` args: the supplier plus the page-owned
|
|
16
|
+
* update mutation so contributed cards persist without re-deriving it.
|
|
17
|
+
*/
|
|
18
|
+
export interface SupplierDetailHostSlotContext {
|
|
19
|
+
supplier: Supplier;
|
|
20
|
+
updateSupplier: (input: UpdateSupplierInput) => Promise<Supplier>;
|
|
21
|
+
isUpdating: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface SupplierDetailHostProps {
|
|
24
|
+
id: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Packaged admin host for the canonical `SupplierDetailPage` (packaged-admin
|
|
28
|
+
* RFC Phase 3). Owns everything package-clean:
|
|
29
|
+
*
|
|
30
|
+
* - Cross-route links resolve through semantic destinations (RFC §4.7):
|
|
31
|
+
* back/deleted navigate to `"supplier.list"` — no host route tree import.
|
|
32
|
+
* - Locale comes from the admin chrome (`useLocale`).
|
|
33
|
+
* - The customer-payment-policy section mounts through
|
|
34
|
+
* {@link supplierDetailPaymentPolicySlot} whenever a widget contribution
|
|
35
|
+
* targets it (finance-ui contributes its card there).
|
|
36
|
+
*/
|
|
37
|
+
export declare function SupplierDetailHost({ id }: SupplierDetailHostProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
//# sourceMappingURL=supplier-detail-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supplier-detail-host.d.ts","sourceRoot":"","sources":["../../src/admin/supplier-detail-host.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAI9E;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B,oCAAoC,CAAA;AAEhF;;;;;GAKG;AACH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,QAAQ,CAAA;IAClB,cAAc,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;IACjE,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;CACX;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,uBAAuB,2CA6BjE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { AdminWidgetSlotRenderer, resolveAdminWidgets, useAdminExtensions, useAdminNavigate, useLocale, } from "@voyantjs/admin";
|
|
4
|
+
import { SupplierDetailPage } from "../components/supplier-detail-page.js";
|
|
5
|
+
/**
|
|
6
|
+
* Widget slot rendered as the supplier detail page's customer-payment-policy
|
|
7
|
+
* card (packaged-admin RFC §4.7 cycle resolution): `@voyantjs/finance-ui`
|
|
8
|
+
* depends on this package, so the host cannot import the finance-owned
|
|
9
|
+
* payment-policy form/preview directly — instead finance's admin extension
|
|
10
|
+
* contributes a widget targeting this slot and the host renders the section
|
|
11
|
+
* whenever a contribution exists. Widgets receive
|
|
12
|
+
* {@link SupplierDetailHostSlotContext} as props.
|
|
13
|
+
*/
|
|
14
|
+
export const supplierDetailPaymentPolicySlot = "supplier.details.payment-policy";
|
|
15
|
+
/**
|
|
16
|
+
* Packaged admin host for the canonical `SupplierDetailPage` (packaged-admin
|
|
17
|
+
* RFC Phase 3). Owns everything package-clean:
|
|
18
|
+
*
|
|
19
|
+
* - Cross-route links resolve through semantic destinations (RFC §4.7):
|
|
20
|
+
* back/deleted navigate to `"supplier.list"` — no host route tree import.
|
|
21
|
+
* - Locale comes from the admin chrome (`useLocale`).
|
|
22
|
+
* - The customer-payment-policy section mounts through
|
|
23
|
+
* {@link supplierDetailPaymentPolicySlot} whenever a widget contribution
|
|
24
|
+
* targets it (finance-ui contributes its card there).
|
|
25
|
+
*/
|
|
26
|
+
export function SupplierDetailHost({ id }) {
|
|
27
|
+
const { resolvedLocale } = useLocale();
|
|
28
|
+
const navigateTo = useAdminNavigate();
|
|
29
|
+
// Finance (or any extension that may not be imported by this package)
|
|
30
|
+
// contributes the payment-policy card as widget contributions; the section
|
|
31
|
+
// renders only when at least one widget targets the slot.
|
|
32
|
+
const adminExtensions = useAdminExtensions();
|
|
33
|
+
const hasPaymentPolicyWidgets = resolveAdminWidgets({ slot: supplierDetailPaymentPolicySlot, extensions: adminExtensions })
|
|
34
|
+
.length > 0;
|
|
35
|
+
return (_jsx(SupplierDetailPage, { id: id, locale: resolvedLocale, onBack: () => navigateTo("supplier.list", {}), onDeleted: () => navigateTo("supplier.list", {}), renderCustomerPaymentPolicy: hasPaymentPolicyWidgets
|
|
36
|
+
? (context) => (_jsx(AdminWidgetSlotRenderer, { slot: supplierDetailPaymentPolicySlot, props: { ...context } }))
|
|
37
|
+
: undefined }));
|
|
38
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout-matched route-level placeholder for `SupplierDetailPage`:
|
|
3
|
+
* - Back button + name + status pill + edit/delete actions
|
|
4
|
+
* - 2-col summary cards (Supplier Details + Primary Contact)
|
|
5
|
+
* - Services card (full width) with expandable rows
|
|
6
|
+
* - Notes card (full width)
|
|
7
|
+
*/
|
|
8
|
+
export declare function SupplierDetailSkeleton(): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=supplier-detail-skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supplier-detail-skeleton.d.ts","sourceRoot":"","sources":["../../src/admin/supplier-detail-skeleton.tsx"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAgB,sBAAsB,4CA6CrC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Card, CardContent, CardHeader } from "@voyantjs/ui/components/card";
|
|
4
|
+
import { Skeleton } from "@voyantjs/ui/components/skeleton";
|
|
5
|
+
/**
|
|
6
|
+
* Layout-matched route-level placeholder for `SupplierDetailPage`:
|
|
7
|
+
* - Back button + name + status pill + edit/delete actions
|
|
8
|
+
* - 2-col summary cards (Supplier Details + Primary Contact)
|
|
9
|
+
* - Services card (full width) with expandable rows
|
|
10
|
+
* - Notes card (full width)
|
|
11
|
+
*/
|
|
12
|
+
export function SupplierDetailSkeleton() {
|
|
13
|
+
return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsx(Header, {}), _jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [_jsx(SummaryCard, { titleWidth: "w-36", rows: 8 }), _jsx(SummaryCard, { titleWidth: "w-32", rows: 7 })] }), _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsx(Skeleton, { className: "h-5 w-20" }), _jsx(Skeleton, { className: "h-8 w-28" })] }), _jsx(CardContent, { className: "flex flex-col gap-2", children: Array.from({ length: 3 }, (_, index) => `service-${index}`).map((key) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg border px-4 py-3", children: [_jsx(Skeleton, { className: "h-4 w-4" }), _jsx(Skeleton, { className: "h-4 w-48" }), _jsx(Skeleton, { className: "h-5 w-16 rounded-full" }), _jsx("div", { className: "flex-1" }), _jsx(Skeleton, { className: "h-4 w-20" }), _jsx(Skeleton, { className: "h-8 w-8 rounded" })] }, key))) })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(Skeleton, { className: "h-5 w-16" }) }), _jsxs(CardContent, { className: "space-y-3", children: [_jsx(Skeleton, { className: "h-20 w-full" }), _jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-4 w-full" }), _jsx(Skeleton, { className: "h-4 w-3/4" })] })] })] })] }));
|
|
14
|
+
}
|
|
15
|
+
function Header() {
|
|
16
|
+
return (_jsxs("div", { className: "flex items-center gap-4", children: [_jsx(Skeleton, { className: "h-9 w-9 rounded-md" }), _jsxs("div", { className: "flex-1 space-y-2", children: [_jsx(Skeleton, { className: "h-7 w-64" }), _jsx("div", { className: "flex gap-2", children: _jsx(Skeleton, { className: "h-5 w-16 rounded-full" }) })] }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Skeleton, { className: "h-9 w-20" }), _jsx(Skeleton, { className: "h-9 w-24" })] })] }));
|
|
17
|
+
}
|
|
18
|
+
function SummaryCard({ titleWidth, rows }) {
|
|
19
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx(Skeleton, { className: `h-5 ${titleWidth}` }) }), _jsx(CardContent, { className: "grid gap-3", children: Array.from({ length: rows }, (_, index) => `row-${index}`).map((key) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Skeleton, { className: "h-3.5 w-24" }), _jsx(Skeleton, { className: "h-3.5 w-32" })] }, key))) })] }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Packaged admin host for `SuppliersPage` (packaged-admin RFC Phase 3).
|
|
3
|
+
*
|
|
4
|
+
* No host route tree is imported — opening a supplier resolves the
|
|
5
|
+
* `"supplier.detail"` semantic destination (RFC §4.7) through the resolvers
|
|
6
|
+
* the workspace shell registered. The page keeps its filter/sort/paging
|
|
7
|
+
* state locally (no URL search contract), so the host takes no props and
|
|
8
|
+
* route files can attach it as a zero-prop `component:` directly.
|
|
9
|
+
*/
|
|
10
|
+
export declare function SuppliersHost(): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=suppliers-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suppliers-host.d.ts","sourceRoot":"","sources":["../../src/admin/suppliers-host.tsx"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,wBAAgB,aAAa,4CAQ5B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useAdminNavigate } from "@voyantjs/admin";
|
|
4
|
+
import { SuppliersPage } from "../components/suppliers-page.js";
|
|
5
|
+
/**
|
|
6
|
+
* Packaged admin host for `SuppliersPage` (packaged-admin RFC Phase 3).
|
|
7
|
+
*
|
|
8
|
+
* No host route tree is imported — opening a supplier resolves the
|
|
9
|
+
* `"supplier.detail"` semantic destination (RFC §4.7) through the resolvers
|
|
10
|
+
* the workspace shell registered. The page keeps its filter/sort/paging
|
|
11
|
+
* state locally (no URL search contract), so the host takes no props and
|
|
12
|
+
* route files can attach it as a zero-prop `component:` directly.
|
|
13
|
+
*/
|
|
14
|
+
export function SuppliersHost() {
|
|
15
|
+
const navigateTo = useAdminNavigate();
|
|
16
|
+
return (_jsx(SuppliersPage, { onSupplierOpen: (supplier) => navigateTo("supplier.detail", { supplierId: supplier.id }) }));
|
|
17
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route-level placeholder for the suppliers list. Mirrors `SuppliersPage`:
|
|
3
|
+
* - Page title + description
|
|
4
|
+
* - Filter row: search input (left), Filters button, "New Supplier" (right)
|
|
5
|
+
* - 5-column table: Name / Type / Status / Country / Currency
|
|
6
|
+
* - Summary + pagination footer
|
|
7
|
+
*/
|
|
8
|
+
export declare function SuppliersListSkeleton(): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=suppliers-list-skeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suppliers-list-skeleton.d.ts","sourceRoot":"","sources":["../../src/admin/suppliers-list-skeleton.tsx"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,wBAAgB,qBAAqB,4CAuDpC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Skeleton } from "@voyantjs/ui/components/skeleton";
|
|
4
|
+
import { useSuppliersUiMessagesOrDefault } from "../i18n/index.js";
|
|
5
|
+
const COLUMNS = [
|
|
6
|
+
{ id: "name", width: "w-40" },
|
|
7
|
+
{ id: "type", width: "w-20" },
|
|
8
|
+
{ id: "status", width: "w-16" },
|
|
9
|
+
{ id: "country", width: "w-20" },
|
|
10
|
+
{ id: "currency", width: "w-12" },
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Route-level placeholder for the suppliers list. Mirrors `SuppliersPage`:
|
|
14
|
+
* - Page title + description
|
|
15
|
+
* - Filter row: search input (left), Filters button, "New Supplier" (right)
|
|
16
|
+
* - 5-column table: Name / Type / Status / Country / Currency
|
|
17
|
+
* - Summary + pagination footer
|
|
18
|
+
*/
|
|
19
|
+
export function SuppliersListSkeleton() {
|
|
20
|
+
const messages = useSuppliersUiMessagesOrDefault();
|
|
21
|
+
const columns = messages.suppliersPage.columns;
|
|
22
|
+
const titles = [columns.name, columns.type, columns.status, columns.country, columns.currency];
|
|
23
|
+
return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-7 w-28" }), _jsx(Skeleton, { className: "h-4 w-80" })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Skeleton, { className: "h-9 min-w-[14rem] flex-1" }), _jsx(Skeleton, { className: "h-9 w-24" }), _jsx("div", { className: "ml-auto", children: _jsx(Skeleton, { className: "h-9 w-36" }) })] }), _jsx("div", { className: "overflow-hidden rounded-md border", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted/40 text-left text-muted-foreground", children: _jsx("tr", { children: titles.map((title) => (_jsx("th", { className: "px-4 py-3 font-medium", children: title }, title))) }) }), _jsx("tbody", { children: Array.from({ length: 8 }, (_, rowIndex) => `row-${rowIndex}`).map((rowKey) => (_jsx("tr", { className: "border-t", children: COLUMNS.map((column) => (_jsx("td", { className: "px-4 py-3", children: _jsx(Skeleton, { className: `h-4 ${column.width}` }) }, `${rowKey}-${column.id}`))) }, rowKey))) })] }) }), _jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between", children: [_jsx(Skeleton, { className: "h-4 w-44" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Skeleton, { className: "h-8 w-20" }), _jsx(Skeleton, { className: "h-4 w-20" }), _jsx(Skeleton, { className: "h-8 w-16" })] })] })] }));
|
|
24
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/suppliers-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.106.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,6 +15,11 @@
|
|
|
15
15
|
"import": "./dist/index.js",
|
|
16
16
|
"default": "./dist/index.js"
|
|
17
17
|
},
|
|
18
|
+
"./admin": {
|
|
19
|
+
"types": "./dist/admin/index.d.ts",
|
|
20
|
+
"import": "./dist/admin/index.js",
|
|
21
|
+
"default": "./dist/admin/index.js"
|
|
22
|
+
},
|
|
18
23
|
"./styles.css": {
|
|
19
24
|
"default": "./src/styles.css"
|
|
20
25
|
},
|
|
@@ -46,8 +51,9 @@
|
|
|
46
51
|
"react-dom": "^19.0.0",
|
|
47
52
|
"react-hook-form": "^7.60.0",
|
|
48
53
|
"zod": "^4.0.0",
|
|
49
|
-
"@voyantjs/
|
|
50
|
-
"@voyantjs/
|
|
54
|
+
"@voyantjs/admin": "^0.106.0",
|
|
55
|
+
"@voyantjs/suppliers-react": "^0.106.0",
|
|
56
|
+
"@voyantjs/ui": "^0.106.0"
|
|
51
57
|
},
|
|
52
58
|
"dependencies": {
|
|
53
59
|
"@voyantjs/i18n": "^0.106.0"
|
|
@@ -64,9 +70,10 @@
|
|
|
64
70
|
"typescript": "^6.0.2",
|
|
65
71
|
"vitest": "^4.1.2",
|
|
66
72
|
"zod": "^4.3.6",
|
|
73
|
+
"@voyantjs/admin": "^0.106.0",
|
|
67
74
|
"@voyantjs/i18n": "^0.106.0",
|
|
68
|
-
"@voyantjs/suppliers-react": "^0.
|
|
69
|
-
"@voyantjs/ui": "^0.
|
|
75
|
+
"@voyantjs/suppliers-react": "^0.106.0",
|
|
76
|
+
"@voyantjs/ui": "^0.106.0",
|
|
70
77
|
"@voyantjs/voyant-typescript-config": "^0.1.0"
|
|
71
78
|
},
|
|
72
79
|
"files": [
|