@creezio/shell-ui 0.22.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/README.md +336 -0
- package/dist/adapters/nav-shell.d.ts +54 -0
- package/dist/adapters/nav-shell.d.ts.map +1 -0
- package/dist/adapters/nav-shell.js +112 -0
- package/dist/adapters/nav-shell.js.map +1 -0
- package/dist/brand.d.ts +64 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +59 -0
- package/dist/brand.js.map +1 -0
- package/dist/core-nav.d.ts +17 -0
- package/dist/core-nav.d.ts.map +1 -0
- package/dist/core-nav.js +40 -0
- package/dist/core-nav.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-scopes.d.ts +24 -0
- package/dist/lib/api-scopes.d.ts.map +1 -0
- package/dist/lib/api-scopes.js +78 -0
- package/dist/lib/api-scopes.js.map +1 -0
- package/dist/lib/catalog-suspense-key.d.ts +3 -0
- package/dist/lib/catalog-suspense-key.d.ts.map +1 -0
- package/dist/lib/catalog-suspense-key.js +12 -0
- package/dist/lib/catalog-suspense-key.js.map +1 -0
- package/dist/lib/data-changed.d.ts +51 -0
- package/dist/lib/data-changed.d.ts.map +1 -0
- package/dist/lib/data-changed.js +227 -0
- package/dist/lib/data-changed.js.map +1 -0
- package/dist/lib/desktop-home-path.d.ts +14 -0
- package/dist/lib/desktop-home-path.d.ts.map +1 -0
- package/dist/lib/desktop-home-path.js +29 -0
- package/dist/lib/desktop-home-path.js.map +1 -0
- package/dist/lib/geo-distance.d.ts +6 -0
- package/dist/lib/geo-distance.d.ts.map +1 -0
- package/dist/lib/geo-distance.js +27 -0
- package/dist/lib/geo-distance.js.map +1 -0
- package/dist/lib/img.d.ts +2 -0
- package/dist/lib/img.d.ts.map +1 -0
- package/dist/lib/img.js +40 -0
- package/dist/lib/img.js.map +1 -0
- package/dist/lib/keepalive-eviction.d.ts +14 -0
- package/dist/lib/keepalive-eviction.d.ts.map +1 -0
- package/dist/lib/keepalive-eviction.js +44 -0
- package/dist/lib/keepalive-eviction.js.map +1 -0
- package/dist/lib/ops-track.d.ts +29 -0
- package/dist/lib/ops-track.d.ts.map +1 -0
- package/dist/lib/ops-track.js +37 -0
- package/dist/lib/ops-track.js.map +1 -0
- package/dist/lib/optimize-cover-url.d.ts +10 -0
- package/dist/lib/optimize-cover-url.d.ts.map +1 -0
- package/dist/lib/optimize-cover-url.js +80 -0
- package/dist/lib/optimize-cover-url.js.map +1 -0
- package/dist/lib/page-trails.d.ts +9 -0
- package/dist/lib/page-trails.d.ts.map +1 -0
- package/dist/lib/page-trails.js +20 -0
- package/dist/lib/page-trails.js.map +1 -0
- package/dist/lib/public-origin.d.ts +32 -0
- package/dist/lib/public-origin.d.ts.map +1 -0
- package/dist/lib/public-origin.js +125 -0
- package/dist/lib/public-origin.js.map +1 -0
- package/dist/lib/server-incident.d.ts +12 -0
- package/dist/lib/server-incident.d.ts.map +1 -0
- package/dist/lib/server-incident.js +72 -0
- package/dist/lib/server-incident.js.map +1 -0
- package/dist/lib/tab-document-url.d.ts +13 -0
- package/dist/lib/tab-document-url.d.ts.map +1 -0
- package/dist/lib/tab-document-url.js +60 -0
- package/dist/lib/tab-document-url.js.map +1 -0
- package/dist/lib/utils.d.ts +20 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +87 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/nav-catalog.d.ts +97 -0
- package/dist/nav-catalog.d.ts.map +1 -0
- package/dist/nav-catalog.js +282 -0
- package/dist/nav-catalog.js.map +1 -0
- package/dist/registry.d.ts +11 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +60 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist-cjs/adapters/nav-shell.js +115 -0
- package/dist-cjs/adapters/nav-shell.js.map +1 -0
- package/dist-cjs/brand.js +66 -0
- package/dist-cjs/brand.js.map +1 -0
- package/dist-cjs/core-nav.js +43 -0
- package/dist-cjs/core-nav.js.map +1 -0
- package/dist-cjs/index.js +95 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/lib/api-scopes.js +86 -0
- package/dist-cjs/lib/api-scopes.js.map +1 -0
- package/dist-cjs/lib/catalog-suspense-key.js +15 -0
- package/dist-cjs/lib/catalog-suspense-key.js.map +1 -0
- package/dist-cjs/lib/data-changed.js +236 -0
- package/dist-cjs/lib/data-changed.js.map +1 -0
- package/dist-cjs/lib/desktop-home-path.js +34 -0
- package/dist-cjs/lib/desktop-home-path.js.map +1 -0
- package/dist-cjs/lib/geo-distance.js +30 -0
- package/dist-cjs/lib/geo-distance.js.map +1 -0
- package/dist-cjs/lib/img.js +43 -0
- package/dist-cjs/lib/img.js.map +1 -0
- package/dist-cjs/lib/keepalive-eviction.js +49 -0
- package/dist-cjs/lib/keepalive-eviction.js.map +1 -0
- package/dist-cjs/lib/ops-track.js +41 -0
- package/dist-cjs/lib/ops-track.js.map +1 -0
- package/dist-cjs/lib/optimize-cover-url.js +83 -0
- package/dist-cjs/lib/optimize-cover-url.js.map +1 -0
- package/dist-cjs/lib/page-trails.js +25 -0
- package/dist-cjs/lib/page-trails.js.map +1 -0
- package/dist-cjs/lib/public-origin.js +130 -0
- package/dist-cjs/lib/public-origin.js.map +1 -0
- package/dist-cjs/lib/server-incident.js +75 -0
- package/dist-cjs/lib/server-incident.js.map +1 -0
- package/dist-cjs/lib/tab-document-url.js +65 -0
- package/dist-cjs/lib/tab-document-url.js.map +1 -0
- package/dist-cjs/lib/utils.js +97 -0
- package/dist-cjs/lib/utils.js.map +1 -0
- package/dist-cjs/nav-catalog.js +293 -0
- package/dist-cjs/nav-catalog.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/registry.js +64 -0
- package/dist-cjs/registry.js.map +1 -0
- package/dist-cjs/types.js +3 -0
- package/dist-cjs/types.js.map +1 -0
- package/package.json +163 -0
- package/ui/app-error-boundary.tsx +59 -0
- package/ui/data-table.tsx +121 -0
- package/ui/desktop/auth-window-chrome.tsx +51 -0
- package/ui/desktop/desktop-bridge.tsx +87 -0
- package/ui/desktop/external-site-slot.tsx +313 -0
- package/ui/desktop/external-site-surface.ts +58 -0
- package/ui/desktop/site-link.tsx +105 -0
- package/ui/desktop/window-chrome-controls.tsx +5 -0
- package/ui/desktop-types.ts +30 -0
- package/ui/faceted-filters.tsx +119 -0
- package/ui/global-search-host.ts +20 -0
- package/ui/global-search.tsx +66 -0
- package/ui/index.ts +178 -0
- package/ui/kit.ts +30 -0
- package/ui/layout/app-shell.tsx +58 -0
- package/ui/layout/desktop-update-banner.tsx +100 -0
- package/ui/layout/entity-header.tsx +44 -0
- package/ui/layout/native-os-nav.ts +104 -0
- package/ui/layout/nav-catalog-loader.tsx +98 -0
- package/ui/layout/nav-icons.ts +67 -0
- package/ui/layout/page-chrome.tsx +90 -0
- package/ui/layout/page-toolbar-context.tsx +82 -0
- package/ui/layout/sandbox-banner.tsx +38 -0
- package/ui/layout/section-view-shell.tsx +73 -0
- package/ui/layout/sidebar-host.ts +144 -0
- package/ui/layout/sidebar.tsx +1150 -0
- package/ui/lib/ai-screencast-hub.ts +127 -0
- package/ui/lib/ai-workspace-client.ts +46 -0
- package/ui/lib/aid.ts +22 -0
- package/ui/lib/desktop-host.ts +114 -0
- package/ui/lib/fleet-tracker-client.ts +237 -0
- package/ui/lib/hermes-ui.ts +114 -0
- package/ui/lib/n8n-ui.ts +115 -0
- package/ui/lib/use-creezio-resource.tsx +121 -0
- package/ui/lib/use-shell-ui-brand.ts +22 -0
- package/ui/list-toolbar.tsx +309 -0
- package/ui/os-pages/desktop-settings-page.tsx +158 -0
- package/ui/os-pages/index.ts +8 -0
- package/ui/page-loading/entity-page-loading.tsx +59 -0
- package/ui/page-loading/list-page-loading.tsx +61 -0
- package/ui/pagination.tsx +56 -0
- package/ui/primitives/avatar.tsx +33 -0
- package/ui/primitives/badge.tsx +36 -0
- package/ui/primitives/breadcrumb.tsx +93 -0
- package/ui/primitives/button.tsx +44 -0
- package/ui/primitives/card.tsx +44 -0
- package/ui/primitives/chart.tsx +317 -0
- package/ui/primitives/command.tsx +111 -0
- package/ui/primitives/dialog.tsx +100 -0
- package/ui/primitives/dropdown-menu.tsx +187 -0
- package/ui/primitives/input.tsx +19 -0
- package/ui/primitives/label.tsx +17 -0
- package/ui/primitives/resizable.tsx +45 -0
- package/ui/primitives/scroll-area.tsx +41 -0
- package/ui/primitives/select.tsx +73 -0
- package/ui/primitives/separator.tsx +26 -0
- package/ui/primitives/sheet.tsx +90 -0
- package/ui/primitives/skeleton.tsx +7 -0
- package/ui/primitives/sonner.tsx +22 -0
- package/ui/primitives/tabs.tsx +51 -0
- package/ui/primitives/textarea.tsx +22 -0
- package/ui/primitives/tooltip.tsx +31 -0
- package/ui/pwa/client-error-reporter.tsx +62 -0
- package/ui/pwa/register-sw.tsx +50 -0
- package/ui/range-filters.tsx +174 -0
- package/ui/search/global-search-config.ts +32 -0
- package/ui/search/global-search-provider.tsx +528 -0
- package/ui/search/search-history.ts +74 -0
- package/ui/search-input.tsx +146 -0
- package/ui/settings/account-settings.tsx +140 -0
- package/ui/settings/agent-profile-settings.tsx +184 -0
- package/ui/settings/api-keys-settings.tsx +349 -0
- package/ui/settings/desktop-background-settings.tsx +128 -0
- package/ui/settings/desktop-connection-settings.tsx +251 -0
- package/ui/settings/desktop-embed-env-panel.tsx +257 -0
- package/ui/settings/desktop-fleet-telemetry-settings.tsx +269 -0
- package/ui/settings/desktop-hermes-settings.tsx +341 -0
- package/ui/settings/desktop-llm-keys.tsx +192 -0
- package/ui/settings/desktop-n8n-settings.tsx +306 -0
- package/ui/settings/desktop-tunnel.tsx +264 -0
- package/ui/settings/desktop-update-settings.tsx +175 -0
- package/ui/settings/factory-reset-settings.tsx +89 -0
- package/ui/settings/host-only-settings.tsx +62 -0
- package/ui/settings/locked-config-field.tsx +30 -0
- package/ui/settings/ops-diagnostic-settings.tsx +242 -0
- package/ui/settings/search-reindex-settings.tsx +158 -0
- package/ui/settings/server-mode-cards.tsx +801 -0
- package/ui/theme/tailwind-preset.cjs +82 -0
- package/ui/theme/theme.css +328 -0
- package/ui/workspace/ai-activity-panel-host.tsx +19 -0
- package/ui/workspace/ai-workspace-agent-host.tsx +54 -0
- package/ui/workspace/ai-workspace-banner.tsx +168 -0
- package/ui/workspace/impersonation-banner.tsx +39 -0
- package/ui/workspace/keep-alive.tsx +220 -0
- package/ui/workspace/tab-workspace-context.tsx +1172 -0
- package/ui/workspace/tab-workspace-host.ts +89 -0
- package/ui/workspace/types.ts +500 -0
- package/ui/workspace/use-location-search.tsx +50 -0
- package/ui/workspace/window-chrome-controls.tsx +116 -0
- package/ui/workspace/workspace-config.ts +47 -0
- package/ui/workspace/workspace-root.tsx +147 -0
- package/ui/workspace/workspace-shell.tsx +292 -0
- package/ui/workspace/workspace-tab-bar.tsx +572 -0
package/dist/registry.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const FORBIDDEN_BRAND_IDS = new Set([
|
|
2
|
+
"panier",
|
|
3
|
+
"cart",
|
|
4
|
+
"dispatch",
|
|
5
|
+
"optimiser",
|
|
6
|
+
"catalog",
|
|
7
|
+
"catalogue",
|
|
8
|
+
]);
|
|
9
|
+
function assertBrandItem(item) {
|
|
10
|
+
const id = item.id.toLowerCase();
|
|
11
|
+
const href = item.href.toLowerCase();
|
|
12
|
+
// H3 : les slots marque peuvent pointer vers les vraies routes produit
|
|
13
|
+
// (`/panier`, `/optimiser`…) si l'id est préfixé `brand.*`.
|
|
14
|
+
// Interdit : id métier nu (ex. `panier`) = confusion avec nav native.
|
|
15
|
+
for (const bad of FORBIDDEN_BRAND_IDS) {
|
|
16
|
+
if (id === bad) {
|
|
17
|
+
throw new Error(`Nav brand refusée: id réservé métier (${bad}). Utiliser brand.${bad}.`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (!id.startsWith("brand.") && FORBIDDEN_BRAND_IDS.has(href.replace(/^\//, ""))) {
|
|
21
|
+
throw new Error(`Nav brand refusée: href métier (${href}) sans id brand.*.`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function createNavRegistry() {
|
|
25
|
+
const slots = new Map([
|
|
26
|
+
["brand-primary", []],
|
|
27
|
+
["brand-secondary", []],
|
|
28
|
+
["plugins", []],
|
|
29
|
+
]);
|
|
30
|
+
return {
|
|
31
|
+
registerBrandNav(items, slot = "brand-primary") {
|
|
32
|
+
for (const item of items)
|
|
33
|
+
assertBrandItem(item);
|
|
34
|
+
const tagged = items.map((i) => ({
|
|
35
|
+
...i,
|
|
36
|
+
group: i.group || "brand",
|
|
37
|
+
}));
|
|
38
|
+
slots.set(slot, tagged);
|
|
39
|
+
},
|
|
40
|
+
getBrandNav(slot = "brand-primary") {
|
|
41
|
+
return [...(slots.get(slot) || [])];
|
|
42
|
+
},
|
|
43
|
+
getSlots() {
|
|
44
|
+
return [...slots.entries()].map(([id, items]) => ({ id, items: [...items] }));
|
|
45
|
+
},
|
|
46
|
+
clearBrandNav(slot) {
|
|
47
|
+
if (slot) {
|
|
48
|
+
slots.set(slot, []);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
for (const id of slots.keys())
|
|
52
|
+
slots.set(id, []);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Fusion nav cœur + items brand (slot primary par défaut). */
|
|
57
|
+
export function mergeNav(core, brand) {
|
|
58
|
+
return [...core.map((i) => ({ ...i })), ...brand.map((i) => ({ ...i }))];
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,QAAQ;IACR,MAAM;IACN,UAAU;IACV,WAAW;IACX,SAAS;IACT,WAAW;CACZ,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,IAAiB;IACxC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,uEAAuE;IACvE,4DAA4D;IAC5D,sEAAsE;IACtE,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,yCAAyC,GAAG,qBAAqB,GAAG,GAAG,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CACb,mCAAmC,IAAI,oBAAoB,CAC5D,CAAC;IACJ,CAAC;AACH,CAAC;AASD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,CAA2B;QAC9C,CAAC,eAAe,EAAE,EAAE,CAAC;QACrB,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACvB,CAAC,SAAS,EAAE,EAAE,CAAC;KAChB,CAAC,CAAC;IAEH,OAAO;QACL,gBAAgB,CAAC,KAAK,EAAE,IAAI,GAAG,eAAe;YAC5C,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,eAAe,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,GAAG,CAAC;gBACJ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAK,OAAiB;aACrC,CAAC,CAAC,CAAC;YACJ,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC;QACD,WAAW,CAAC,IAAI,GAAG,eAAe;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,QAAQ;YACN,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,aAAa,CAAC,IAAI;YAChB,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YACD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,QAAQ,CACtB,IAA4B,EAC5B,KAA6B;IAE7B,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type CoreNavItem = {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
href: string;
|
|
5
|
+
/** Groupe UI optionnel. */
|
|
6
|
+
group?: "core" | "brand" | "plugin";
|
|
7
|
+
icon?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Permission requise pour voir l'entrée (ex. "nav.crm") — filtrée par la
|
|
10
|
+
* sidebar kit sur me.permissions (même logique que les entrées admin).
|
|
11
|
+
* Absente = visible par tous.
|
|
12
|
+
*/
|
|
13
|
+
permission?: string;
|
|
14
|
+
};
|
|
15
|
+
/** Alias historique factory demobrand. */
|
|
16
|
+
export type NavItem = CoreNavItem;
|
|
17
|
+
export type NavSlotId = "brand-primary" | "brand-secondary" | "plugins";
|
|
18
|
+
export type NavSlot = {
|
|
19
|
+
id: NavSlotId;
|
|
20
|
+
items: CoreNavItem[];
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,0CAA0C;AAC1C,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC;AAElC,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAExE,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Adapter nav shell (Phase I7) — contrat de rendu UI-agnostique.
|
|
4
|
+
*
|
|
5
|
+
* Marque = `registerBrandNav` uniquement ; pas de hardcode panier/dispatch
|
|
6
|
+
* dans le kit. React/Next consomme `getRenderModel()` / `subscribe`.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createNavShellAdapter = createNavShellAdapter;
|
|
10
|
+
const core_nav_js_1 = require("../core-nav.js");
|
|
11
|
+
const registry_js_1 = require("../registry.js");
|
|
12
|
+
const GROUP_LABELS = {
|
|
13
|
+
core: "Creezio",
|
|
14
|
+
brand: "Métier",
|
|
15
|
+
plugin: "Plugins",
|
|
16
|
+
};
|
|
17
|
+
function sourceOf(item) {
|
|
18
|
+
if (item.group === "plugin")
|
|
19
|
+
return "plugin";
|
|
20
|
+
if (item.group === "brand" || item.id.startsWith("brand."))
|
|
21
|
+
return "brand";
|
|
22
|
+
return "core";
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Crée l'adapter shell. Usage marque :
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* const shell = createNavShellAdapter();
|
|
29
|
+
* shell.registerBrandNav([{ id: "brand.home", label: "Métier", href: "/brand" }]);
|
|
30
|
+
* const model = shell.getRenderModel(); // → UI React / HTML
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
function createNavShellAdapter(opts) {
|
|
34
|
+
const core = opts?.coreItems || core_nav_js_1.CORE_NAV_ITEMS;
|
|
35
|
+
const registry = opts?.registry || (0, registry_js_1.createNavRegistry)();
|
|
36
|
+
let activeHref = opts?.activeHref ?? null;
|
|
37
|
+
const listeners = new Set();
|
|
38
|
+
function notify() {
|
|
39
|
+
for (const l of listeners)
|
|
40
|
+
l();
|
|
41
|
+
}
|
|
42
|
+
const adapter = {
|
|
43
|
+
registry,
|
|
44
|
+
registerBrandNav(items, slot) {
|
|
45
|
+
registry.registerBrandNav(items, slot);
|
|
46
|
+
notify();
|
|
47
|
+
},
|
|
48
|
+
clearBrandNav(slot) {
|
|
49
|
+
registry.clearBrandNav(slot);
|
|
50
|
+
notify();
|
|
51
|
+
},
|
|
52
|
+
setActiveHref(href) {
|
|
53
|
+
activeHref = href;
|
|
54
|
+
notify();
|
|
55
|
+
},
|
|
56
|
+
getMergedNav() {
|
|
57
|
+
const brand = [
|
|
58
|
+
...registry.getBrandNav("brand-primary"),
|
|
59
|
+
...registry.getBrandNav("brand-secondary"),
|
|
60
|
+
...registry.getBrandNav("plugins"),
|
|
61
|
+
];
|
|
62
|
+
return (0, registry_js_1.mergeNav)(core, brand);
|
|
63
|
+
},
|
|
64
|
+
getRenderModel() {
|
|
65
|
+
const items = adapter.getMergedNav().map((i) => ({
|
|
66
|
+
...i,
|
|
67
|
+
source: sourceOf(i),
|
|
68
|
+
active: Boolean(activeHref && i.href === activeHref),
|
|
69
|
+
}));
|
|
70
|
+
const groups = ["core", "brand", "plugin"].map((id) => ({
|
|
71
|
+
id,
|
|
72
|
+
label: GROUP_LABELS[id],
|
|
73
|
+
items: items.filter((i) => i.source === id),
|
|
74
|
+
}));
|
|
75
|
+
return {
|
|
76
|
+
items,
|
|
77
|
+
groups,
|
|
78
|
+
activeHref,
|
|
79
|
+
generatedAt: new Date().toISOString(),
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
subscribe(listener) {
|
|
83
|
+
listeners.add(listener);
|
|
84
|
+
return () => listeners.delete(listener);
|
|
85
|
+
},
|
|
86
|
+
renderNavHtml(htmlOpts) {
|
|
87
|
+
const model = adapter.getRenderModel();
|
|
88
|
+
const cls = htmlOpts?.className || "creezio-nav";
|
|
89
|
+
const parts = [`<nav class="${cls}" data-creezio-shell-ui="i7">`];
|
|
90
|
+
for (const g of model.groups) {
|
|
91
|
+
if (!g.items.length)
|
|
92
|
+
continue;
|
|
93
|
+
parts.push(`<div class="${cls}__group" data-group="${g.id}">`);
|
|
94
|
+
parts.push(`<div class="${cls}__group-label">${escapeHtml(g.label)}</div>`);
|
|
95
|
+
parts.push(`<ul>`);
|
|
96
|
+
for (const item of g.items) {
|
|
97
|
+
const active = item.active ? ' aria-current="page"' : "";
|
|
98
|
+
parts.push(`<li data-source="${item.source}"><a href="${escapeHtml(item.href)}"${active}>${escapeHtml(item.label)}</a></li>`);
|
|
99
|
+
}
|
|
100
|
+
parts.push(`</ul></div>`);
|
|
101
|
+
}
|
|
102
|
+
parts.push(`</nav>`);
|
|
103
|
+
return parts.join("");
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
return adapter;
|
|
107
|
+
}
|
|
108
|
+
function escapeHtml(s) {
|
|
109
|
+
return s
|
|
110
|
+
.replace(/&/g, "&")
|
|
111
|
+
.replace(/</g, "<")
|
|
112
|
+
.replace(/>/g, ">")
|
|
113
|
+
.replace(/"/g, """);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=nav-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-shell.js","sourceRoot":"","sources":["../../src/adapters/nav-shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* O9 — tokens marque pour shell-ui (desktop API, hosts, titlebar).
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.configureShellUiBrand = configureShellUiBrand;
|
|
7
|
+
exports.getShellUiBrand = getShellUiBrand;
|
|
8
|
+
exports.subscribeShellUiBrand = subscribeShellUiBrand;
|
|
9
|
+
exports.resetShellUiBrandForTests = resetShellUiBrandForTests;
|
|
10
|
+
exports.getShellDesktopApi = getShellDesktopApi;
|
|
11
|
+
const DEFAULT = {
|
|
12
|
+
desktopApiGlobal: "creezioDesktop",
|
|
13
|
+
publicHostSuffix: "creez.io",
|
|
14
|
+
titlebarDragClass: "creezio-titlebar-drag",
|
|
15
|
+
titlebarNoDragClass: "creezio-titlebar-no-drag",
|
|
16
|
+
apiKeyPrefix: "creezio_live_",
|
|
17
|
+
productName: "Creezio",
|
|
18
|
+
aidAttr: "data-creezio-aid",
|
|
19
|
+
};
|
|
20
|
+
let brand = { ...DEFAULT };
|
|
21
|
+
const listeners = new Set();
|
|
22
|
+
function notifyBrandChanged() {
|
|
23
|
+
for (const listener of listeners)
|
|
24
|
+
listener();
|
|
25
|
+
}
|
|
26
|
+
function configureShellUiBrand(next) {
|
|
27
|
+
const merged = { ...brand, ...next };
|
|
28
|
+
// No-op si aucune clé ne change — CreezioUiBoot appelle au render (marque
|
|
29
|
+
// correcte dès le 1er paint, zéro flash du défaut) : la détection évite
|
|
30
|
+
// les boucles de re-render des abonnés useSyncExternalStore. `login` est
|
|
31
|
+
// comparé en profondeur (objet littéral → nouvelle identité à chaque render).
|
|
32
|
+
const changed = Object.keys(merged).some((k) => k === "login"
|
|
33
|
+
? JSON.stringify(merged.login ?? null) !== JSON.stringify(brand.login ?? null)
|
|
34
|
+
: merged[k] !== brand[k]);
|
|
35
|
+
if (!changed)
|
|
36
|
+
return;
|
|
37
|
+
brand = merged;
|
|
38
|
+
notifyBrandChanged();
|
|
39
|
+
}
|
|
40
|
+
function getShellUiBrand() {
|
|
41
|
+
return brand;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Abonnement aux changements de brand — la marque est appliquée par
|
|
45
|
+
* CreezioUiBoot en useEffect (après le 1er render) : les composants qui
|
|
46
|
+
* lisent la brand au render (page login…) doivent passer par le hook
|
|
47
|
+
* useShellUiBrand (@creezio/shell-ui/ui/kit) pour re-render.
|
|
48
|
+
*/
|
|
49
|
+
function subscribeShellUiBrand(listener) {
|
|
50
|
+
listeners.add(listener);
|
|
51
|
+
return () => {
|
|
52
|
+
listeners.delete(listener);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function resetShellUiBrandForTests() {
|
|
56
|
+
brand = { ...DEFAULT };
|
|
57
|
+
notifyBrandChanged();
|
|
58
|
+
}
|
|
59
|
+
/** Accès typé soft à window[desktopApiGlobal]. */
|
|
60
|
+
function getShellDesktopApi() {
|
|
61
|
+
if (typeof window === "undefined")
|
|
62
|
+
return undefined;
|
|
63
|
+
const key = getShellUiBrand().desktopApiGlobal;
|
|
64
|
+
return window[key];
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=brand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAmEH,sDAcC;AAED,0CAEC;AAQD,sDAKC;AAED,8DAGC;AAGD,gDAIC;AA7DD,MAAM,OAAO,GAAiB;IAC5B,gBAAgB,EAAE,gBAAgB;IAClC,gBAAgB,EAAE,UAAU;IAC5B,iBAAiB,EAAE,uBAAuB;IAC1C,mBAAmB,EAAE,0BAA0B;IAC/C,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,SAAS;IACtB,OAAO,EAAE,kBAAkB;CAC5B,CAAC;AAEF,IAAI,KAAK,GAAiB,EAAE,GAAG,OAAO,EAAE,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;AAExC,SAAS,kBAAkB;IACzB,KAAK,MAAM,QAAQ,IAAI,SAAS;QAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAA2B;IAC/D,MAAM,MAAM,GAAiB,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC;IACnD,0EAA0E;IAC1E,wEAAwE;IACxE,yEAAyE;IACzE,8EAA8E;IAC9E,MAAM,OAAO,GAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACzE,CAAC,KAAK,OAAO;QACX,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;QAC9E,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAC3B,CAAC;IACF,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,KAAK,GAAG,MAAM,CAAC;IACf,kBAAkB,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,eAAe;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,QAAoB;IACxD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,yBAAyB;IACvC,KAAK,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IACvB,kBAAkB,EAAE,CAAC;AACvB,CAAC;AAED,kDAAkD;AAClD,SAAgB,kBAAkB;IAChC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC,gBAAgB,CAAC;IAC/C,OAAQ,MAAc,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.coreNavItems = exports.CORE_NAV_ITEMS = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Entrées nav natives Creezio — aucune entrée métier marque
|
|
6
|
+
* (panier, dispatch, GED, RTI…).
|
|
7
|
+
*
|
|
8
|
+
* Liste historique (home / assistant / setup / login / about…) consommée
|
|
9
|
+
* par `createNavShellAdapter` — **pas** la sidebar CRM. La sidebar OS
|
|
10
|
+
* primaire (taches, mails, granola, grokbot…) vit dans le catalogue
|
|
11
|
+
* `defaultOsCatalogEntries()` / `registerOsNavEntry`
|
|
12
|
+
* (`nav-catalog.ts`, plan `docs/plans/PLAN-NAV-CATALOG.md`). Ne pas
|
|
13
|
+
* recopier granola/grokbot ici pour « aligner » : Phase D dérivera
|
|
14
|
+
* `CORE_NAV_ITEMS` du catalogue, ou documentera l'écart à vie.
|
|
15
|
+
*/
|
|
16
|
+
exports.CORE_NAV_ITEMS = [
|
|
17
|
+
{ id: "core.home", label: "Accueil", href: "/", group: "core" },
|
|
18
|
+
{ id: "core.settings", label: "Réglages", href: "/settings", group: "core" },
|
|
19
|
+
{
|
|
20
|
+
id: "core.assistant",
|
|
21
|
+
label: "Assistant",
|
|
22
|
+
href: "/assistant",
|
|
23
|
+
group: "core",
|
|
24
|
+
},
|
|
25
|
+
{ id: "core.tasks", label: "Tâches", href: "/taches", group: "core" },
|
|
26
|
+
{ id: "core.mails", label: "Mails", href: "/mails", group: "core" },
|
|
27
|
+
{ id: "core.granola", label: "Granola", href: "/granola", group: "core" },
|
|
28
|
+
{ id: "core.grokbot", label: "GrokBot", href: "/grokbot", group: "core" },
|
|
29
|
+
{ id: "core.setup", label: "Setup", href: "/setup", group: "core" },
|
|
30
|
+
{ id: "core.login", label: "Login", href: "/login", group: "core" },
|
|
31
|
+
{
|
|
32
|
+
id: "core.developers",
|
|
33
|
+
label: "Developers",
|
|
34
|
+
href: "/developers",
|
|
35
|
+
group: "core",
|
|
36
|
+
},
|
|
37
|
+
{ id: "core.about", label: "À propos", href: "/about", group: "core" },
|
|
38
|
+
];
|
|
39
|
+
/** Alias factory / demobrand. */
|
|
40
|
+
exports.coreNavItems = exports.CORE_NAV_ITEMS.map((i) => ({
|
|
41
|
+
...i,
|
|
42
|
+
}));
|
|
43
|
+
//# sourceMappingURL=core-nav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-nav.js","sourceRoot":"","sources":["../src/core-nav.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACU,QAAA,cAAc,GAA2B;IACpD,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/D,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;IAC5E;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,MAAM;KACd;IACD,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;IACrE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACnE,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACzE,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACzE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACnE,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IACnE;QACE,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,MAAM;KACd;IACD,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;CAC9D,CAAC;AAEX,iCAAiC;AACpB,QAAA,YAAY,GAAkB,sBAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,GAAG,CAAC;CACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @creezio/shell-ui — nav + slots (H1.4 / I7) + libs plateforme (O9).
|
|
4
|
+
* UI React : `@creezio/shell-ui/ui`.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.normalizeTabDocumentUrl = exports.buildCatalogSuspenseKey = exports.optimizeCoverUrl = exports.thumbUrl = exports.haversineKm = exports.reportServerIncident = exports.trackServerDebounced = exports.trackServer = exports.trailForLoading = exports.trailForAnalytics = exports.trailForRequestLogs = exports.isLoopbackHost = exports.resolveCookieSecure = exports.resolvePublicOrigin = exports.variationTone = exports.formatDeltaMoney = exports.formatVariationPct = exports.parsePage = exports.formatMoney = exports.formatDateTime = exports.formatDate = exports.cn = exports.scopesFromPluginPermissions = exports.apiKeyAllowsTasks = exports.apiKeyAllowsMethod = exports.parseApiKeyScopes = exports.normalizeApiScopes = exports.API_SCOPE_TASKS_RUN = exports.API_SCOPE_CRM_WRITE = exports.API_SCOPE_CRM_READ = exports.API_SCOPE_FULL = exports.subscribeShellUiBrand = exports.resetShellUiBrandForTests = exports.getShellDesktopApi = exports.getShellUiBrand = exports.configureShellUiBrand = exports.createNavShellAdapter = exports.mergeNav = exports.createNavRegistry = exports.resolveNavCatalog = exports.resetOsNavRegistryForTests = exports.registerOsNavEntry = exports.registerDefaultOsNavEntries = exports.parseNavCatalogSessionItems = exports.listOsNavEntries = exports.isKnownNavIcon = exports.defaultOsCatalogEntries = exports.NAV_ICON_ALLOWLIST = exports.coreNavItems = exports.CORE_NAV_ITEMS = void 0;
|
|
8
|
+
exports.resetDataChangedFetchForTests = exports.installCreezioDataChangedFetch = exports.inferResourceFromToolName = exports.parseDataChangedHeader = exports.subscribeDataChanged = exports.emitDataChanged = exports.CREEZIO_DATA_CHANGED_HEADER = exports.CREEZIO_DATA_CHANGED_EVENT = exports.configureKeepAliveFullscreenMatchers = exports.rankKeepAliveEvictionKeys = exports.isKeepAliveProtectedKey = exports.resolveDesktopHomePath = exports.defaultHomePathSync = exports.SERVER_COCKPIT_PATH = exports.CRM_HOME_PATH = exports.isSameTabOrigin = exports.isSameTabDocument = void 0;
|
|
9
|
+
var core_nav_js_1 = require("./core-nav.js");
|
|
10
|
+
Object.defineProperty(exports, "CORE_NAV_ITEMS", { enumerable: true, get: function () { return core_nav_js_1.CORE_NAV_ITEMS; } });
|
|
11
|
+
Object.defineProperty(exports, "coreNavItems", { enumerable: true, get: function () { return core_nav_js_1.coreNavItems; } });
|
|
12
|
+
var nav_catalog_js_1 = require("./nav-catalog.js");
|
|
13
|
+
Object.defineProperty(exports, "NAV_ICON_ALLOWLIST", { enumerable: true, get: function () { return nav_catalog_js_1.NAV_ICON_ALLOWLIST; } });
|
|
14
|
+
Object.defineProperty(exports, "defaultOsCatalogEntries", { enumerable: true, get: function () { return nav_catalog_js_1.defaultOsCatalogEntries; } });
|
|
15
|
+
Object.defineProperty(exports, "isKnownNavIcon", { enumerable: true, get: function () { return nav_catalog_js_1.isKnownNavIcon; } });
|
|
16
|
+
Object.defineProperty(exports, "listOsNavEntries", { enumerable: true, get: function () { return nav_catalog_js_1.listOsNavEntries; } });
|
|
17
|
+
Object.defineProperty(exports, "parseNavCatalogSessionItems", { enumerable: true, get: function () { return nav_catalog_js_1.parseNavCatalogSessionItems; } });
|
|
18
|
+
Object.defineProperty(exports, "registerDefaultOsNavEntries", { enumerable: true, get: function () { return nav_catalog_js_1.registerDefaultOsNavEntries; } });
|
|
19
|
+
Object.defineProperty(exports, "registerOsNavEntry", { enumerable: true, get: function () { return nav_catalog_js_1.registerOsNavEntry; } });
|
|
20
|
+
Object.defineProperty(exports, "resetOsNavRegistryForTests", { enumerable: true, get: function () { return nav_catalog_js_1.resetOsNavRegistryForTests; } });
|
|
21
|
+
Object.defineProperty(exports, "resolveNavCatalog", { enumerable: true, get: function () { return nav_catalog_js_1.resolveNavCatalog; } });
|
|
22
|
+
var registry_js_1 = require("./registry.js");
|
|
23
|
+
Object.defineProperty(exports, "createNavRegistry", { enumerable: true, get: function () { return registry_js_1.createNavRegistry; } });
|
|
24
|
+
Object.defineProperty(exports, "mergeNav", { enumerable: true, get: function () { return registry_js_1.mergeNav; } });
|
|
25
|
+
var nav_shell_js_1 = require("./adapters/nav-shell.js");
|
|
26
|
+
Object.defineProperty(exports, "createNavShellAdapter", { enumerable: true, get: function () { return nav_shell_js_1.createNavShellAdapter; } });
|
|
27
|
+
var brand_js_1 = require("./brand.js");
|
|
28
|
+
Object.defineProperty(exports, "configureShellUiBrand", { enumerable: true, get: function () { return brand_js_1.configureShellUiBrand; } });
|
|
29
|
+
Object.defineProperty(exports, "getShellUiBrand", { enumerable: true, get: function () { return brand_js_1.getShellUiBrand; } });
|
|
30
|
+
Object.defineProperty(exports, "getShellDesktopApi", { enumerable: true, get: function () { return brand_js_1.getShellDesktopApi; } });
|
|
31
|
+
Object.defineProperty(exports, "resetShellUiBrandForTests", { enumerable: true, get: function () { return brand_js_1.resetShellUiBrandForTests; } });
|
|
32
|
+
Object.defineProperty(exports, "subscribeShellUiBrand", { enumerable: true, get: function () { return brand_js_1.subscribeShellUiBrand; } });
|
|
33
|
+
var api_scopes_js_1 = require("./lib/api-scopes.js");
|
|
34
|
+
Object.defineProperty(exports, "API_SCOPE_FULL", { enumerable: true, get: function () { return api_scopes_js_1.API_SCOPE_FULL; } });
|
|
35
|
+
Object.defineProperty(exports, "API_SCOPE_CRM_READ", { enumerable: true, get: function () { return api_scopes_js_1.API_SCOPE_CRM_READ; } });
|
|
36
|
+
Object.defineProperty(exports, "API_SCOPE_CRM_WRITE", { enumerable: true, get: function () { return api_scopes_js_1.API_SCOPE_CRM_WRITE; } });
|
|
37
|
+
Object.defineProperty(exports, "API_SCOPE_TASKS_RUN", { enumerable: true, get: function () { return api_scopes_js_1.API_SCOPE_TASKS_RUN; } });
|
|
38
|
+
Object.defineProperty(exports, "normalizeApiScopes", { enumerable: true, get: function () { return api_scopes_js_1.normalizeApiScopes; } });
|
|
39
|
+
Object.defineProperty(exports, "parseApiKeyScopes", { enumerable: true, get: function () { return api_scopes_js_1.parseApiKeyScopes; } });
|
|
40
|
+
Object.defineProperty(exports, "apiKeyAllowsMethod", { enumerable: true, get: function () { return api_scopes_js_1.apiKeyAllowsMethod; } });
|
|
41
|
+
Object.defineProperty(exports, "apiKeyAllowsTasks", { enumerable: true, get: function () { return api_scopes_js_1.apiKeyAllowsTasks; } });
|
|
42
|
+
Object.defineProperty(exports, "scopesFromPluginPermissions", { enumerable: true, get: function () { return api_scopes_js_1.scopesFromPluginPermissions; } });
|
|
43
|
+
var utils_js_1 = require("./lib/utils.js");
|
|
44
|
+
Object.defineProperty(exports, "cn", { enumerable: true, get: function () { return utils_js_1.cn; } });
|
|
45
|
+
Object.defineProperty(exports, "formatDate", { enumerable: true, get: function () { return utils_js_1.formatDate; } });
|
|
46
|
+
Object.defineProperty(exports, "formatDateTime", { enumerable: true, get: function () { return utils_js_1.formatDateTime; } });
|
|
47
|
+
Object.defineProperty(exports, "formatMoney", { enumerable: true, get: function () { return utils_js_1.formatMoney; } });
|
|
48
|
+
Object.defineProperty(exports, "parsePage", { enumerable: true, get: function () { return utils_js_1.parsePage; } });
|
|
49
|
+
Object.defineProperty(exports, "formatVariationPct", { enumerable: true, get: function () { return utils_js_1.formatVariationPct; } });
|
|
50
|
+
Object.defineProperty(exports, "formatDeltaMoney", { enumerable: true, get: function () { return utils_js_1.formatDeltaMoney; } });
|
|
51
|
+
Object.defineProperty(exports, "variationTone", { enumerable: true, get: function () { return utils_js_1.variationTone; } });
|
|
52
|
+
var public_origin_js_1 = require("./lib/public-origin.js");
|
|
53
|
+
Object.defineProperty(exports, "resolvePublicOrigin", { enumerable: true, get: function () { return public_origin_js_1.resolvePublicOrigin; } });
|
|
54
|
+
Object.defineProperty(exports, "resolveCookieSecure", { enumerable: true, get: function () { return public_origin_js_1.resolveCookieSecure; } });
|
|
55
|
+
Object.defineProperty(exports, "isLoopbackHost", { enumerable: true, get: function () { return public_origin_js_1.isLoopbackHost; } });
|
|
56
|
+
var page_trails_js_1 = require("./lib/page-trails.js");
|
|
57
|
+
Object.defineProperty(exports, "trailForRequestLogs", { enumerable: true, get: function () { return page_trails_js_1.trailForRequestLogs; } });
|
|
58
|
+
Object.defineProperty(exports, "trailForAnalytics", { enumerable: true, get: function () { return page_trails_js_1.trailForAnalytics; } });
|
|
59
|
+
Object.defineProperty(exports, "trailForLoading", { enumerable: true, get: function () { return page_trails_js_1.trailForLoading; } });
|
|
60
|
+
var ops_track_js_1 = require("./lib/ops-track.js");
|
|
61
|
+
Object.defineProperty(exports, "trackServer", { enumerable: true, get: function () { return ops_track_js_1.trackServer; } });
|
|
62
|
+
Object.defineProperty(exports, "trackServerDebounced", { enumerable: true, get: function () { return ops_track_js_1.trackServerDebounced; } });
|
|
63
|
+
var server_incident_js_1 = require("./lib/server-incident.js");
|
|
64
|
+
Object.defineProperty(exports, "reportServerIncident", { enumerable: true, get: function () { return server_incident_js_1.reportServerIncident; } });
|
|
65
|
+
var geo_distance_js_1 = require("./lib/geo-distance.js");
|
|
66
|
+
Object.defineProperty(exports, "haversineKm", { enumerable: true, get: function () { return geo_distance_js_1.haversineKm; } });
|
|
67
|
+
var img_js_1 = require("./lib/img.js");
|
|
68
|
+
Object.defineProperty(exports, "thumbUrl", { enumerable: true, get: function () { return img_js_1.thumbUrl; } });
|
|
69
|
+
var optimize_cover_url_js_1 = require("./lib/optimize-cover-url.js");
|
|
70
|
+
Object.defineProperty(exports, "optimizeCoverUrl", { enumerable: true, get: function () { return optimize_cover_url_js_1.optimizeCoverUrl; } });
|
|
71
|
+
var catalog_suspense_key_js_1 = require("./lib/catalog-suspense-key.js");
|
|
72
|
+
Object.defineProperty(exports, "buildCatalogSuspenseKey", { enumerable: true, get: function () { return catalog_suspense_key_js_1.buildCatalogSuspenseKey; } });
|
|
73
|
+
var tab_document_url_js_1 = require("./lib/tab-document-url.js");
|
|
74
|
+
Object.defineProperty(exports, "normalizeTabDocumentUrl", { enumerable: true, get: function () { return tab_document_url_js_1.normalizeTabDocumentUrl; } });
|
|
75
|
+
Object.defineProperty(exports, "isSameTabDocument", { enumerable: true, get: function () { return tab_document_url_js_1.isSameTabDocument; } });
|
|
76
|
+
Object.defineProperty(exports, "isSameTabOrigin", { enumerable: true, get: function () { return tab_document_url_js_1.isSameTabOrigin; } });
|
|
77
|
+
var desktop_home_path_js_1 = require("./lib/desktop-home-path.js");
|
|
78
|
+
Object.defineProperty(exports, "CRM_HOME_PATH", { enumerable: true, get: function () { return desktop_home_path_js_1.CRM_HOME_PATH; } });
|
|
79
|
+
Object.defineProperty(exports, "SERVER_COCKPIT_PATH", { enumerable: true, get: function () { return desktop_home_path_js_1.SERVER_COCKPIT_PATH; } });
|
|
80
|
+
Object.defineProperty(exports, "defaultHomePathSync", { enumerable: true, get: function () { return desktop_home_path_js_1.defaultHomePathSync; } });
|
|
81
|
+
Object.defineProperty(exports, "resolveDesktopHomePath", { enumerable: true, get: function () { return desktop_home_path_js_1.resolveDesktopHomePath; } });
|
|
82
|
+
var keepalive_eviction_js_1 = require("./lib/keepalive-eviction.js");
|
|
83
|
+
Object.defineProperty(exports, "isKeepAliveProtectedKey", { enumerable: true, get: function () { return keepalive_eviction_js_1.isKeepAliveProtectedKey; } });
|
|
84
|
+
Object.defineProperty(exports, "rankKeepAliveEvictionKeys", { enumerable: true, get: function () { return keepalive_eviction_js_1.rankKeepAliveEvictionKeys; } });
|
|
85
|
+
Object.defineProperty(exports, "configureKeepAliveFullscreenMatchers", { enumerable: true, get: function () { return keepalive_eviction_js_1.configureKeepAliveFullscreenMatchers; } });
|
|
86
|
+
var data_changed_js_1 = require("./lib/data-changed.js");
|
|
87
|
+
Object.defineProperty(exports, "CREEZIO_DATA_CHANGED_EVENT", { enumerable: true, get: function () { return data_changed_js_1.CREEZIO_DATA_CHANGED_EVENT; } });
|
|
88
|
+
Object.defineProperty(exports, "CREEZIO_DATA_CHANGED_HEADER", { enumerable: true, get: function () { return data_changed_js_1.CREEZIO_DATA_CHANGED_HEADER; } });
|
|
89
|
+
Object.defineProperty(exports, "emitDataChanged", { enumerable: true, get: function () { return data_changed_js_1.emitDataChanged; } });
|
|
90
|
+
Object.defineProperty(exports, "subscribeDataChanged", { enumerable: true, get: function () { return data_changed_js_1.subscribeDataChanged; } });
|
|
91
|
+
Object.defineProperty(exports, "parseDataChangedHeader", { enumerable: true, get: function () { return data_changed_js_1.parseDataChangedHeader; } });
|
|
92
|
+
Object.defineProperty(exports, "inferResourceFromToolName", { enumerable: true, get: function () { return data_changed_js_1.inferResourceFromToolName; } });
|
|
93
|
+
Object.defineProperty(exports, "installCreezioDataChangedFetch", { enumerable: true, get: function () { return data_changed_js_1.installCreezioDataChangedFetch; } });
|
|
94
|
+
Object.defineProperty(exports, "resetDataChangedFetchForTests", { enumerable: true, get: function () { return data_changed_js_1.resetDataChangedFetchForTests; } });
|
|
95
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;AAGH,6CAA6D;AAApD,6GAAA,cAAc,OAAA;AAAE,2GAAA,YAAY,OAAA;AAarC,mDAU0B;AATxB,oHAAA,kBAAkB,OAAA;AAClB,yHAAA,uBAAuB,OAAA;AACvB,gHAAA,cAAc,OAAA;AACd,kHAAA,gBAAgB,OAAA;AAChB,6HAAA,2BAA2B,OAAA;AAC3B,6HAAA,2BAA2B,OAAA;AAC3B,oHAAA,kBAAkB,OAAA;AAClB,4HAAA,0BAA0B,OAAA;AAC1B,mHAAA,iBAAiB,OAAA;AAGnB,6CAA4D;AAAnD,gHAAA,iBAAiB,OAAA;AAAE,uGAAA,QAAQ,OAAA;AAQpC,wDAAgE;AAAvD,qHAAA,qBAAqB,OAAA;AAI9B,uCAMoB;AALlB,iHAAA,qBAAqB,OAAA;AACrB,2GAAA,eAAe,OAAA;AACf,8GAAA,kBAAkB,OAAA;AAClB,qHAAA,yBAAyB,OAAA;AACzB,iHAAA,qBAAqB,OAAA;AAGvB,qDAU6B;AAT3B,+GAAA,cAAc,OAAA;AACd,mHAAA,kBAAkB,OAAA;AAClB,oHAAA,mBAAmB,OAAA;AACnB,oHAAA,mBAAmB,OAAA;AACnB,mHAAA,kBAAkB,OAAA;AAClB,kHAAA,iBAAiB,OAAA;AACjB,mHAAA,kBAAkB,OAAA;AAClB,kHAAA,iBAAiB,OAAA;AACjB,4HAAA,2BAA2B,OAAA;AAG7B,2CASwB;AARtB,8FAAA,EAAE,OAAA;AACF,sGAAA,UAAU,OAAA;AACV,0GAAA,cAAc,OAAA;AACd,uGAAA,WAAW,OAAA;AACX,qGAAA,SAAS,OAAA;AACT,8GAAA,kBAAkB,OAAA;AAClB,4GAAA,gBAAgB,OAAA;AAChB,yGAAA,aAAa,OAAA;AAGf,2DAMgC;AAL9B,uHAAA,mBAAmB,OAAA;AACnB,uHAAA,mBAAmB,OAAA;AACnB,kHAAA,cAAc,OAAA;AAKhB,uDAK8B;AAJ5B,qHAAA,mBAAmB,OAAA;AACnB,mHAAA,iBAAiB,OAAA;AACjB,iHAAA,eAAe,OAAA;AAIjB,mDAK4B;AAJ1B,2GAAA,WAAW,OAAA;AACX,oHAAA,oBAAoB,OAAA;AAItB,+DAAgE;AAAvD,0HAAA,oBAAoB,OAAA;AAC7B,yDAAoD;AAA3C,8GAAA,WAAW,OAAA;AACpB,uCAAwC;AAA/B,kGAAA,QAAQ,OAAA;AACjB,qEAA+D;AAAtD,yHAAA,gBAAgB,OAAA;AACzB,yEAAwE;AAA/D,kIAAA,uBAAuB,OAAA;AAChC,iEAImC;AAHjC,8HAAA,uBAAuB,OAAA;AACvB,wHAAA,iBAAiB,OAAA;AACjB,sHAAA,eAAe,OAAA;AAEjB,mEAKoC;AAJlC,qHAAA,aAAa,OAAA;AACb,2HAAA,mBAAmB,OAAA;AACnB,2HAAA,mBAAmB,OAAA;AACnB,8HAAA,sBAAsB,OAAA;AAExB,qEAIqC;AAHnC,gIAAA,uBAAuB,OAAA;AACvB,kIAAA,yBAAyB,OAAA;AACzB,6IAAA,oCAAoC,OAAA;AAGtC,yDAU+B;AAT7B,6HAAA,0BAA0B,OAAA;AAC1B,8HAAA,2BAA2B,OAAA;AAC3B,kHAAA,eAAe,OAAA;AACf,uHAAA,oBAAoB,OAAA;AACpB,yHAAA,sBAAsB,OAAA;AACtB,4HAAA,yBAAyB,OAAA;AACzB,iIAAA,8BAA8B,OAAA;AAC9B,gIAAA,6BAA6B,OAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scopes des clés API publiques (`api_keys.scopes`).
|
|
4
|
+
*
|
|
5
|
+
* - `full` : accès intégration complet (Hermes, clés UI)
|
|
6
|
+
* - `crm:read` : GET/HEAD/OPTIONS uniquement
|
|
7
|
+
* - `crm:write` : lectures + mutations (implique read)
|
|
8
|
+
*
|
|
9
|
+
* Stockage : chaîne CSV (`crm:read,crm:write`) ou `full`.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.API_SCOPE_TASKS_RUN = exports.API_SCOPE_CRM_WRITE = exports.API_SCOPE_CRM_READ = exports.API_SCOPE_FULL = void 0;
|
|
13
|
+
exports.normalizeApiScopes = normalizeApiScopes;
|
|
14
|
+
exports.parseApiKeyScopes = parseApiKeyScopes;
|
|
15
|
+
exports.apiKeyAllowsMethod = apiKeyAllowsMethod;
|
|
16
|
+
exports.apiKeyAllowsTasks = apiKeyAllowsTasks;
|
|
17
|
+
exports.scopesFromPluginPermissions = scopesFromPluginPermissions;
|
|
18
|
+
exports.API_SCOPE_FULL = "full";
|
|
19
|
+
exports.API_SCOPE_CRM_READ = "crm:read";
|
|
20
|
+
exports.API_SCOPE_CRM_WRITE = "crm:write";
|
|
21
|
+
/** Lancer / suivre des tâches de collaborateurs IA (/api/v1/tasks). */
|
|
22
|
+
exports.API_SCOPE_TASKS_RUN = "tasks:run";
|
|
23
|
+
const KNOWN = new Set([
|
|
24
|
+
exports.API_SCOPE_FULL,
|
|
25
|
+
exports.API_SCOPE_CRM_READ,
|
|
26
|
+
exports.API_SCOPE_CRM_WRITE,
|
|
27
|
+
exports.API_SCOPE_TASKS_RUN,
|
|
28
|
+
]);
|
|
29
|
+
/** Normalise vers CSV canonique (write ⇒ read ; full gagne). */
|
|
30
|
+
function normalizeApiScopes(scopes) {
|
|
31
|
+
if (scopes == null || scopes === "")
|
|
32
|
+
return exports.API_SCOPE_FULL;
|
|
33
|
+
const list = Array.isArray(scopes)
|
|
34
|
+
? scopes.map(String)
|
|
35
|
+
: String(scopes)
|
|
36
|
+
.split(/[,\s]+/)
|
|
37
|
+
.map((s) => s.trim())
|
|
38
|
+
.filter(Boolean);
|
|
39
|
+
if (list.includes(exports.API_SCOPE_FULL) || list.includes("*")) {
|
|
40
|
+
return exports.API_SCOPE_FULL;
|
|
41
|
+
}
|
|
42
|
+
const out = new Set();
|
|
43
|
+
for (const s of list) {
|
|
44
|
+
if (KNOWN.has(s) && s !== exports.API_SCOPE_FULL)
|
|
45
|
+
out.add(s);
|
|
46
|
+
}
|
|
47
|
+
if (out.has(exports.API_SCOPE_CRM_WRITE))
|
|
48
|
+
out.add(exports.API_SCOPE_CRM_READ);
|
|
49
|
+
if (!out.size)
|
|
50
|
+
return exports.API_SCOPE_FULL;
|
|
51
|
+
return Array.from(out).sort().join(",");
|
|
52
|
+
}
|
|
53
|
+
function parseApiKeyScopes(scopes) {
|
|
54
|
+
const n = normalizeApiScopes(scopes);
|
|
55
|
+
if (n === exports.API_SCOPE_FULL)
|
|
56
|
+
return new Set([exports.API_SCOPE_FULL]);
|
|
57
|
+
return new Set(n.split(",").filter(Boolean));
|
|
58
|
+
}
|
|
59
|
+
/** true si la clé peut exécuter la méthode HTTP sur les routes d’intégration. */
|
|
60
|
+
function apiKeyAllowsMethod(scopes, method) {
|
|
61
|
+
const s = parseApiKeyScopes(scopes);
|
|
62
|
+
if (s.has(exports.API_SCOPE_FULL))
|
|
63
|
+
return true;
|
|
64
|
+
const m = method.toUpperCase();
|
|
65
|
+
if (m === "GET" || m === "HEAD" || m === "OPTIONS") {
|
|
66
|
+
return s.has(exports.API_SCOPE_CRM_READ) || s.has(exports.API_SCOPE_CRM_WRITE);
|
|
67
|
+
}
|
|
68
|
+
return s.has(exports.API_SCOPE_CRM_WRITE);
|
|
69
|
+
}
|
|
70
|
+
/** true si la clé peut lancer / suivre des tâches IA (/api/v1/tasks). */
|
|
71
|
+
function apiKeyAllowsTasks(scopes) {
|
|
72
|
+
const s = parseApiKeyScopes(scopes);
|
|
73
|
+
return s.has(exports.API_SCOPE_FULL) || s.has(exports.API_SCOPE_TASKS_RUN);
|
|
74
|
+
}
|
|
75
|
+
/** Dérive les scopes DB depuis les permissions manifest plugin. */
|
|
76
|
+
function scopesFromPluginPermissions(permissions) {
|
|
77
|
+
const perms = new Set(permissions.map(String));
|
|
78
|
+
if (perms.has("crm:write")) {
|
|
79
|
+
return normalizeApiScopes([exports.API_SCOPE_CRM_READ, exports.API_SCOPE_CRM_WRITE]);
|
|
80
|
+
}
|
|
81
|
+
if (perms.has("crm:read")) {
|
|
82
|
+
return exports.API_SCOPE_CRM_READ;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=api-scopes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-scopes.js","sourceRoot":"","sources":["../../src/lib/api-scopes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildCatalogSuspenseKey = buildCatalogSuspenseKey;
|
|
4
|
+
/** Clé Suspense stable — inclut la vue + filtres actifs (sans recréer page par page). */
|
|
5
|
+
function buildCatalogSuspenseKey(sp, resolveView, filterKeys) {
|
|
6
|
+
const view = resolveView(sp?.view);
|
|
7
|
+
const parts = [view];
|
|
8
|
+
for (const key of filterKeys) {
|
|
9
|
+
const value = (sp?.[key] || "").trim();
|
|
10
|
+
if (value)
|
|
11
|
+
parts.push(`${key}=${value}`);
|
|
12
|
+
}
|
|
13
|
+
return parts.join("&");
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=catalog-suspense-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-suspense-key.js","sourceRoot":"","sources":["../../src/lib/catalog-suspense-key.ts"],"names":[],"mappings":";;AACA,0DAYC;AAbD,yFAAyF;AACzF,SAAgB,uBAAuB,CACrC,EAAkD,EAClD,WAAgD,EAChD,UAA6B;IAE7B,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|