@postxl/generators 1.12.2 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/backend-ai/ai.generator.d.ts +18 -0
  2. package/dist/backend-ai/ai.generator.js +174 -0
  3. package/dist/backend-ai/ai.generator.js.map +1 -0
  4. package/dist/backend-ai/generators/ai-agent-service.generator.d.ts +4 -0
  5. package/dist/backend-ai/generators/ai-agent-service.generator.js +264 -0
  6. package/dist/backend-ai/generators/ai-agent-service.generator.js.map +1 -0
  7. package/dist/backend-ai/generators/ai-cache-service.generator.d.ts +1 -0
  8. package/dist/backend-ai/generators/ai-cache-service.generator.js +110 -0
  9. package/dist/backend-ai/generators/ai-cache-service.generator.js.map +1 -0
  10. package/dist/backend-ai/generators/ai-config.generator.d.ts +1 -0
  11. package/dist/backend-ai/generators/ai-config.generator.js +27 -0
  12. package/dist/backend-ai/generators/ai-config.generator.js.map +1 -0
  13. package/dist/backend-ai/generators/ai-module.generator.d.ts +2 -0
  14. package/dist/backend-ai/generators/ai-module.generator.js +89 -0
  15. package/dist/backend-ai/generators/ai-module.generator.js.map +1 -0
  16. package/dist/backend-ai/generators/ai-route.generator.d.ts +1 -0
  17. package/dist/backend-ai/generators/ai-route.generator.js +29 -0
  18. package/dist/backend-ai/generators/ai-route.generator.js.map +1 -0
  19. package/dist/backend-ai/generators/ai-tools-service.generator.d.ts +4 -0
  20. package/dist/backend-ai/generators/ai-tools-service.generator.js +222 -0
  21. package/dist/backend-ai/generators/ai-tools-service.generator.js.map +1 -0
  22. package/dist/backend-ai/generators/model-provider-interface.generator.d.ts +1 -0
  23. package/dist/backend-ai/generators/model-provider-interface.generator.js +48 -0
  24. package/dist/backend-ai/generators/model-provider-interface.generator.js.map +1 -0
  25. package/dist/backend-ai/generators/openai-model-provider-service.generator.d.ts +1 -0
  26. package/dist/backend-ai/generators/openai-model-provider-service.generator.js +128 -0
  27. package/dist/backend-ai/generators/openai-model-provider-service.generator.js.map +1 -0
  28. package/dist/backend-ai/index.d.ts +4 -0
  29. package/dist/backend-ai/index.js +40 -0
  30. package/dist/backend-ai/index.js.map +1 -0
  31. package/dist/backend-core/generators/main.generator.js +4 -3
  32. package/dist/backend-core/generators/main.generator.js.map +1 -1
  33. package/dist/backend-e2e/backend-e2e.generator.js +4 -4
  34. package/dist/backend-e2e/backend-e2e.generator.js.map +1 -1
  35. package/dist/backend-import/generators/detect-delta/detect-delta-functions.generator.js +1 -1
  36. package/dist/backend-router-trpc/generators/app-routes.generator.js +3 -1
  37. package/dist/backend-router-trpc/generators/app-routes.generator.js.map +1 -1
  38. package/dist/backend-router-trpc/generators/trpc-plugin.generator.js +3 -0
  39. package/dist/backend-router-trpc/generators/trpc-plugin.generator.js.map +1 -1
  40. package/dist/backend-router-trpc/generators/trpc-router-module.generator.js +2 -1
  41. package/dist/backend-router-trpc/generators/trpc-router-module.generator.js.map +1 -1
  42. package/dist/backend-router-trpc/generators/trpc-shared.generator.js +7 -1
  43. package/dist/backend-router-trpc/generators/trpc-shared.generator.js.map +1 -1
  44. package/dist/backend-router-trpc/router-trpc.generator.d.ts +2 -1
  45. package/dist/backend-router-trpc/router-trpc.generator.js +2 -0
  46. package/dist/backend-router-trpc/router-trpc.generator.js.map +1 -1
  47. package/dist/backend-seed/seed.generator.js +10 -1
  48. package/dist/backend-seed/seed.generator.js.map +1 -1
  49. package/dist/base/template/scripts/setup.sh +9 -4
  50. package/dist/base/template/sonar-project.properties +9 -1
  51. package/dist/devops/generators/bitbucket-pipelines-yml.generator.js +1 -0
  52. package/dist/devops/generators/bitbucket-pipelines-yml.generator.js.map +1 -1
  53. package/dist/devops/generators/e2e-yml.generator.js +35 -10
  54. package/dist/devops/generators/e2e-yml.generator.js.map +1 -1
  55. package/dist/devops/generators/jenkinsfile.generator.js +25 -1
  56. package/dist/devops/generators/jenkinsfile.generator.js.map +1 -1
  57. package/dist/e2e/template/e2e/specs/example.spec.ts-snapshots/Navigate-to-homepage-and-take-snapshot-1-chromium-linux.png +0 -0
  58. package/dist/frontend-actions/actions.generator.d.ts +9 -0
  59. package/dist/frontend-actions/actions.generator.js +111 -0
  60. package/dist/frontend-actions/actions.generator.js.map +1 -0
  61. package/dist/frontend-actions/generators/ai-action-text.utils.generator.d.ts +1 -0
  62. package/dist/frontend-actions/generators/ai-action-text.utils.generator.js +52 -0
  63. package/dist/frontend-actions/generators/ai-action-text.utils.generator.js.map +1 -0
  64. package/dist/frontend-actions/generators/ai-assistant-store.generator.d.ts +1 -0
  65. package/dist/frontend-actions/generators/ai-assistant-store.generator.js +230 -0
  66. package/dist/frontend-actions/generators/ai-assistant-store.generator.js.map +1 -0
  67. package/dist/frontend-actions/generators/ai-sidebar-content.generator.d.ts +1 -0
  68. package/dist/frontend-actions/generators/ai-sidebar-content.generator.js +139 -0
  69. package/dist/frontend-actions/generators/ai-sidebar-content.generator.js.map +1 -0
  70. package/dist/frontend-actions/generators/ai-sidepane.generator.d.ts +1 -0
  71. package/dist/frontend-actions/generators/ai-sidepane.generator.js +98 -0
  72. package/dist/frontend-actions/generators/ai-sidepane.generator.js.map +1 -0
  73. package/dist/frontend-actions/generators/base-global-actions.generator.d.ts +1 -0
  74. package/dist/frontend-actions/generators/base-global-actions.generator.js +405 -0
  75. package/dist/frontend-actions/generators/base-global-actions.generator.js.map +1 -0
  76. package/dist/frontend-actions/generators/command-palette-action.generator.d.ts +1 -0
  77. package/dist/frontend-actions/generators/command-palette-action.generator.js +87 -0
  78. package/dist/frontend-actions/generators/command-palette-action.generator.js.map +1 -0
  79. package/dist/frontend-actions/generators/command-palette-store.generator.d.ts +1 -0
  80. package/dist/frontend-actions/generators/command-palette-store.generator.js +288 -0
  81. package/dist/frontend-actions/generators/command-palette-store.generator.js.map +1 -0
  82. package/dist/frontend-actions/generators/command-palette.generator.d.ts +5 -0
  83. package/dist/frontend-actions/generators/command-palette.generator.js +332 -0
  84. package/dist/frontend-actions/generators/command-palette.generator.js.map +1 -0
  85. package/dist/frontend-actions/generators/filter-utils.generator.d.ts +1 -0
  86. package/dist/frontend-actions/generators/filter-utils.generator.js +50 -0
  87. package/dist/frontend-actions/generators/filter-utils.generator.js.map +1 -0
  88. package/dist/frontend-actions/generators/sidepanel-toggle.generator.d.ts +1 -0
  89. package/dist/frontend-actions/generators/sidepanel-toggle.generator.js +37 -0
  90. package/dist/frontend-actions/generators/sidepanel-toggle.generator.js.map +1 -0
  91. package/dist/frontend-actions/index.d.ts +4 -0
  92. package/dist/frontend-actions/index.js +40 -0
  93. package/dist/frontend-actions/index.js.map +1 -0
  94. package/dist/frontend-admin/admin.generator.d.ts +3 -1
  95. package/dist/frontend-admin/admin.generator.js +8 -1
  96. package/dist/frontend-admin/admin.generator.js.map +1 -1
  97. package/dist/frontend-admin/generators/admin-global-actions.generator.d.ts +4 -0
  98. package/dist/frontend-admin/generators/admin-global-actions.generator.js +152 -0
  99. package/dist/frontend-admin/generators/admin-global-actions.generator.js.map +1 -0
  100. package/dist/frontend-admin/generators/comment-sidebar.generator.js +5 -3
  101. package/dist/frontend-admin/generators/comment-sidebar.generator.js.map +1 -1
  102. package/dist/frontend-admin/generators/detail-sidebar.generator.js +40 -24
  103. package/dist/frontend-admin/generators/detail-sidebar.generator.js.map +1 -1
  104. package/dist/frontend-admin/generators/model-admin-page.generator.js +172 -11
  105. package/dist/frontend-admin/generators/model-admin-page.generator.js.map +1 -1
  106. package/dist/frontend-admin/utils.d.ts +1 -0
  107. package/dist/frontend-admin/utils.js +1 -0
  108. package/dist/frontend-admin/utils.js.map +1 -1
  109. package/dist/frontend-core/generators/tsconfig.generator.js +1 -0
  110. package/dist/frontend-core/generators/tsconfig.generator.js.map +1 -1
  111. package/dist/frontend-core/template/.env.example +3 -0
  112. package/dist/frontend-core/template/src/components/admin/table-view-panel.tsx +22 -4
  113. package/dist/frontend-core/template/src/components/ui/color-mode-toggle/color-mode-toggle.tsx +1 -1
  114. package/dist/frontend-core/template/src/lib/color.ts +6 -3
  115. package/dist/frontend-core/template/src/lib/config.ts +3 -1
  116. package/dist/frontend-tables/generators/model-table.generator.js +13 -0
  117. package/dist/frontend-tables/generators/model-table.generator.js.map +1 -1
  118. package/dist/generators.js +4 -0
  119. package/dist/generators.js.map +1 -1
  120. package/dist/index.d.ts +2 -0
  121. package/dist/index.js +8 -2
  122. package/dist/index.js.map +1 -1
  123. package/dist/types/template/ai.types.ts +34 -0
  124. package/dist/types/types.generator.js +1 -0
  125. package/dist/types/types.generator.js.map +1 -1
  126. package/package.json +4 -4
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSidepanelToggle = generateSidepanelToggle;
4
+ function generateSidepanelToggle() {
5
+ return `import { PanelRightIcon } from 'lucide-react'
6
+ import { useLocation } from '@tanstack/react-router'
7
+
8
+ import { Button } from '@postxl/ui-components'
9
+
10
+ import { APP_CONFIG } from '@lib/config'
11
+ import { useAiAssistantActions, useAiAssistantState } from './ai-assistant-store'
12
+
13
+ export const SidepanelToggle = () => {
14
+ const pathname = useLocation({ select: (location) => location.pathname })
15
+ const open = useAiAssistantState((state) => state.open)
16
+ const { setOpen } = useAiAssistantActions()
17
+ const isAdminRoute = pathname.startsWith('/admin')
18
+
19
+ if (!APP_CONFIG.enableAI && !isAdminRoute) {
20
+ return null
21
+ }
22
+
23
+ return (
24
+ <Button
25
+ variant="outline"
26
+ size="icon"
27
+ className="fixed right-4 top-4 z-40"
28
+ onClick={() => setOpen(!open)}
29
+ aria-label={open ? 'Close sidepanel' : 'Open sidepanel'}
30
+ >
31
+ <PanelRightIcon className="size-4" />
32
+ </Button>
33
+ )
34
+ }
35
+ `;
36
+ }
37
+ //# sourceMappingURL=sidepanel-toggle.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidepanel-toggle.generator.js","sourceRoot":"","sources":["../../../src/frontend-actions/generators/sidepanel-toggle.generator.ts"],"names":[],"mappings":";;AAAA,0DAgCC;AAhCD,SAAgB,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BR,CAAA;AACD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import * as Generator from './actions.generator';
2
+ export type WithFrontendActions<Context extends import('@postxl/generator').Context> = Generator.WithFrontendActions<Context>;
3
+ export declare const frontendActionsGenerator: import("@postxl/generator").GeneratorInterface;
4
+ export declare const frontendActionsGeneratorId: string & import("zod").$brand<"PXL.GeneratorInterfaceId">;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.frontendActionsGeneratorId = exports.frontendActionsGenerator = void 0;
37
+ const Generator = __importStar(require("./actions.generator"));
38
+ exports.frontendActionsGenerator = Generator.generator;
39
+ exports.frontendActionsGeneratorId = Generator.generatorId;
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frontend-actions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAAgD;AAInC,QAAA,wBAAwB,GAAG,SAAS,CAAC,SAAS,CAAA;AAC9C,QAAA,0BAA0B,GAAG,SAAS,CAAC,WAAW,CAAA"}
@@ -1,12 +1,14 @@
1
1
  import * as Generator from '@postxl/generator';
2
2
  import { WithBackendTrpcRouter } from '../backend-router-trpc';
3
3
  import { WithBase } from '../base';
4
+ import { WithFrontendActions } from '../frontend-actions';
4
5
  import { WithFrontend } from '../frontend-core';
5
6
  import { WithForms } from '../frontend-forms';
6
7
  import { WithTables } from '../frontend-tables';
7
8
  import { WithTrpcClient } from '../frontend-trpc-client/trpc-client.generator';
8
9
  import { WithTypes } from '../types';
9
- type ContextRequirements = WithTables<WithFrontend<WithForms<WithTrpcClient<WithBackendTrpcRouter<WithTypes<WithBase<Generator.Context>>>>>>>;
10
+ type FrontendAdminBaseContext = WithFrontend<WithForms<WithTrpcClient<WithBackendTrpcRouter<WithTypes<WithBase<Generator.Context>>>>>>;
11
+ type ContextRequirements = WithTables<WithFrontendActions<FrontendAdminBaseContext>>;
10
12
  export type ModelContextRequirements = Generator.InferModelContext<ContextRequirements>;
11
13
  export type EnumContextRequirements = Generator.InferEnumContext<ContextRequirements>;
12
14
  export type ContextResult = WithAdmin<ContextRequirements>;
@@ -37,8 +37,10 @@ exports.generator = exports.generatorId = void 0;
37
37
  const node_path_1 = require("node:path");
38
38
  const Generator = __importStar(require("@postxl/generator"));
39
39
  const base_1 = require("../base");
40
+ const frontend_actions_1 = require("../frontend-actions");
40
41
  const frontend_tables_1 = require("../frontend-tables");
41
42
  const types_1 = require("../types");
43
+ const admin_global_actions_generator_1 = require("./generators/admin-global-actions.generator");
42
44
  const admin_overview_page_generator_1 = require("./generators/admin-overview-page.generator");
43
45
  const admin_sidebar_generator_1 = require("./generators/admin-sidebar.generator");
44
46
  const audit_log_sidebar_generator_1 = require("./generators/audit-log-sidebar.generator");
@@ -57,7 +59,7 @@ exports.generatorId = Generator.toGeneratorInterfaceId('frontend-admin');
57
59
  const moduleName = Generator.toBackendModuleName('admin');
58
60
  exports.generator = {
59
61
  id: exports.generatorId,
60
- requires: [base_1.baseGeneratorId, types_1.typesGeneratorId, frontend_tables_1.frontendTablesGeneratorId],
62
+ requires: [base_1.baseGeneratorId, types_1.typesGeneratorId, frontend_tables_1.frontendTablesGeneratorId, frontend_actions_1.frontendActionsGeneratorId],
61
63
  register: (context) => {
62
64
  const hasCommentModel = context.models.has('Comment');
63
65
  const admin = {
@@ -111,6 +113,10 @@ exports.generator = {
111
113
  hasIndex: false,
112
114
  isAbsolute: true,
113
115
  });
116
+ context.frontendActions.globalActionHooks.push({
117
+ name: Generator.toFunctionName('useAdminGlobalActions'),
118
+ location: Generator.toBackendModuleLocation('@admin/admin-global.actions'),
119
+ });
114
120
  return { ...context, admin, models };
115
121
  },
116
122
  generate: async (context) => {
@@ -127,6 +133,7 @@ exports.generator = {
127
133
  content: (0, data_management_page_generator_1.generateDataManagementPage)({ context }),
128
134
  });
129
135
  context.vfs.write((0, node_path_1.join)(paths.components, 'admin', Generator.toLocalReactComponent(context.admin.components.sidebar)), (0, admin_sidebar_generator_1.generateAdminSidebar)({ context }));
136
+ context.vfs.write((0, node_path_1.join)(paths.components, 'admin', 'admin-global.actions.tsx'), (0, admin_global_actions_generator_1.generateAdminGlobalActions)({ context }));
130
137
  context.vfs.write((0, node_path_1.join)(paths.components, 'admin', Generator.toLocalReactComponent(context.admin.components.auditLogSidebar)), (0, audit_log_sidebar_generator_1.generateAuditLogSidebar)({ context }));
131
138
  context.vfs.write((0, node_path_1.join)(paths.components, 'admin', Generator.toLocalReactComponent(context.admin.components.adminDetailSidebar)), (0, detail_sidebar_generator_1.generateAdminDetailSidebar)({ context }));
132
139
  if (context.admin.components.commentSidebar) {
@@ -1 +1 @@
1
- {"version":3,"file":"admin.generator.js","sourceRoot":"","sources":["../../src/frontend-admin/admin.generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin.generator.js","sourceRoot":"","sources":["../../src/frontend-admin/admin.generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ContextResult } from '../admin.generator';
2
+ export declare function generateAdminGlobalActions({ context }: {
3
+ context: ContextResult;
4
+ }): string;
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateAdminGlobalActions = generateAdminGlobalActions;
37
+ const Generator = __importStar(require("@postxl/generator"));
38
+ const utils_1 = require("../utils");
39
+ function generateAdminGlobalActions({ context }) {
40
+ const imports = Generator.ImportGenerator.from(Generator.toFilePath('./admin-global-actions.tsx'))
41
+ .addImport({ from: Generator.toPackageName('react'), items: [Generator.toFunctionName('useEffect')] })
42
+ .addImport({
43
+ from: Generator.toPackageName('@tanstack/react-router'),
44
+ items: [Generator.toFunctionName('useNavigate')],
45
+ })
46
+ .addImport({
47
+ from: Generator.toBackendModuleLocation('@app-actions/command-palette-action'),
48
+ items: [Generator.toFunctionName('command'), Generator.toFunctionName('waitForNextFrame')],
49
+ })
50
+ .addImport({
51
+ from: Generator.toBackendModuleLocation('@app-actions/command-palette-store'),
52
+ items: [Generator.toFunctionName('useCommandPaletteActions')],
53
+ });
54
+ const { schemas: sortedSchemas, modelsBySchema } = (0, utils_1.groupAndSortModelsBySchema)(context);
55
+ const createActions = sortedSchemas
56
+ .map((schema) => {
57
+ const models = (modelsBySchema.get(schema) ?? []).filter((model) => !model.isReadonly);
58
+ return models
59
+ .map((model) => {
60
+ return `
61
+ command({
62
+ key: 'create-admin-${model.name.toLowerCase()}',
63
+ visibility: 'visible',
64
+ group: 'Create',
65
+ label: 'Create new ${model.userFriendlyName}',
66
+ keywords: ['create', 'new', '${model.name.toLowerCase()}', '${model.userFriendlyName.toLowerCase()}'],
67
+ run: async () => {
68
+ if (typeof globalThis !== 'undefined') {
69
+ globalThis.sessionStorage.setItem('pxl:create-intent-model', '${model.name}')
70
+ globalThis.dispatchEvent(new CustomEvent('pxl:create-intent', { detail: { model: '${model.name}' } }))
71
+ }
72
+ await navigate({ to: '${model.route}' })
73
+ await waitForNextFrame()
74
+ return { kind: 'close' }
75
+ },
76
+ })
77
+ `;
78
+ })
79
+ .join(',\n');
80
+ })
81
+ .join(',\n');
82
+ const modelActions = sortedSchemas
83
+ .map((schema) => {
84
+ const models = modelsBySchema.get(schema) ?? [];
85
+ return models
86
+ .map((model) => {
87
+ return `
88
+ command({
89
+ key: 'navigate-admin-${model.name.toLowerCase()}',
90
+ visibility: 'visible',
91
+ group: 'Navigate',
92
+ label: 'Admin: ${model.userFriendlyName}',
93
+ keywords: ['admin', '${model.name.toLowerCase()}', '${model.userFriendlyName.toLowerCase()}'],
94
+ run: async () => {
95
+ await navigate({ to: '${model.route}' })
96
+ await waitForNextFrame()
97
+ return { kind: 'close' }
98
+ },
99
+ })
100
+ `;
101
+ })
102
+ .join(',\n');
103
+ })
104
+ .join(',\n');
105
+ const dynamicActions = [createActions, modelActions].filter((value) => value.trim().length > 0).join(',\n');
106
+ return `
107
+ ${imports.generate()}
108
+
109
+ export const useAdminGlobalActions = () => {
110
+ const navigate = useNavigate()
111
+ const { registerGlobalActions } = useCommandPaletteActions()
112
+
113
+ useEffect(() => {
114
+ const actions = [
115
+ command({
116
+ key: 'navigate-admin-overview',
117
+ visibility: 'visible',
118
+ group: 'Navigate',
119
+ label: 'Admin: Overview',
120
+ keywords: ['admin', 'overview'],
121
+ run: async () => {
122
+ await navigate({ to: '/admin' })
123
+ await waitForNextFrame()
124
+ return { kind: 'close' }
125
+ },
126
+ }),
127
+ ${dynamicActions}
128
+ ]
129
+
130
+ if (import.meta.env.VITE_PUBLIC_ALLOW_ADMIN === 'true') {
131
+ actions.push(
132
+ command({
133
+ key: 'navigate-admin-data-management',
134
+ visibility: 'visible',
135
+ group: 'Navigate',
136
+ label: 'Admin: Data Management',
137
+ keywords: ['admin', 'data', 'management'],
138
+ run: async () => {
139
+ await navigate({ to: '/admin/data-management' })
140
+ await waitForNextFrame()
141
+ return { kind: 'close' }
142
+ },
143
+ }),
144
+ )
145
+ }
146
+
147
+ registerGlobalActions(...actions)
148
+ }, [navigate, registerGlobalActions])
149
+ }
150
+ `;
151
+ }
152
+ //# sourceMappingURL=admin-global-actions.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-global-actions.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/admin-global-actions.generator.ts"],"names":[],"mappings":"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"}
@@ -72,9 +72,10 @@ type ModelCommentContentProps = Readonly<{
72
72
  labelMap?: Record<string, string>
73
73
  selectedEntityId?: string
74
74
  onCommentCountChange?: (count: number) => void
75
+ singleCommentThread?: boolean
75
76
  }>
76
77
 
77
- export function ${context.admin.components.commentSidebar.name}({ model, filteredIds, labelMap, selectedEntityId, onCommentCountChange }: ModelCommentContentProps) {
78
+ export function ${context.admin.components.commentSidebar.name}({ model, filteredIds, labelMap, selectedEntityId, onCommentCountChange, singleCommentThread }: ModelCommentContentProps) {
78
79
  const { viewerData } = useAuth()
79
80
  const currentUserId = viewerData?.user?.id
80
81
  const [commentTarget, setCommentTarget] = useState<{ entityId: string; label: string } | null>(null)
@@ -130,6 +131,7 @@ export function ${context.admin.components.commentSidebar.name}({ model, filtere
130
131
  comments: items.filter(c => !c.replyToCommentId).map(c => toItem(c, items)),
131
132
  }))
132
133
  .filter(g => g.comments.length > 0)
134
+ .sort((a, b) => a.groupName.localeCompare(b.groupName))
133
135
  }, [comments, userMap, labelMap])
134
136
 
135
137
  const commentCount = useMemo(() => groups.reduce((sum, g) => sum + g.comments.length, 0), [groups])
@@ -232,10 +234,10 @@ export function ${context.admin.components.commentSidebar.name}({ model, filtere
232
234
  )}
233
235
  {groups.length > 0 && (
234
236
  <CommentList
235
- comments={groups}
237
+ comments={singleCommentThread && groups.length === 1 ? groups[0].comments : groups}
236
238
  onResolve={handleResolve}
237
239
  onReply={currentUserId ? handleReply : undefined}
238
- onCreate={currentUserId ? handleCreate : undefined}
240
+ onCreate={singleCommentThread && groups.length === 1 ? (currentUserId ? (text: string) => handleCreate(text, groups[0].groupId) : undefined) : (currentUserId ? handleCreate : undefined)}
239
241
  />
240
242
  )}
241
243
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"comment-sidebar.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/comment-sidebar.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,wDA6MC;AAtND,6DAA8C;AAI9C;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,EAAE,OAAO,EAA8B;IAC5E,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,SAAgB,CAAE,CAAA;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAa,CAAE,CAAA;IAEpD,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe;QACvC,EAAE;SACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAe,CAAC,QAAQ,CAAC;SACvD,SAAS,CAAC;QACT,IAAI,EAAE,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC;QACtC,KAAK,EAAE;YACL,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC;YACpC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC;YACnC,SAAS,CAAC,cAAc,CAAC,aAAa,CAAC;YACvC,SAAS,CAAC,cAAc,CAAC,WAAW,CAAC;SACtC;KACF,CAAC;SACD,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;SAC3B,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;SACxB,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;SAC9B,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAE9B,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAA;IAEhD,OAAO;EACP,OAAO,CAAC,QAAQ,EAAE;;;;;;;;;;;;;kBAaF,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAe,CAAC,IAAI;;;;;;MAMzD,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI;MACxC,YAAY,CAAC,SAAS,CAAC,MAAO,CAAC,IAAI;MACnC,YAAY,CAAC,SAAS,CAAC,WAAY,CAAC,IAAI;MACxC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI;QAClC,YAAY,CAAC,SAAS,CAAC,IAAI;;;;;;;;;YASvB,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,iBAAiB,SAAS,CAAC,SAAS,CAAC,IAAI;;;;;;;;;;0BAUvD,cAAc;;;;yDAIiB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAgCtB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;;;;;iCAQ1C,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;sCAIlB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;;;;;iCAQ/B,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;;;;;;;;;iCAYvB,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEvD,CAAA;AACD,CAAC"}
1
+ {"version":3,"file":"comment-sidebar.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/comment-sidebar.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,wDA+MC;AAxND,6DAA8C;AAI9C;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,EAAE,OAAO,EAA8B;IAC5E,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,SAAgB,CAAE,CAAA;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAa,CAAE,CAAA;IAEpD,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe;QACvC,EAAE;SACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAe,CAAC,QAAQ,CAAC;SACvD,SAAS,CAAC;QACT,IAAI,EAAE,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC;QACtC,KAAK,EAAE;YACL,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC;YACpC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC;YACnC,SAAS,CAAC,cAAc,CAAC,aAAa,CAAC;YACvC,SAAS,CAAC,cAAc,CAAC,WAAW,CAAC;SACtC;KACF,CAAC;SACD,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;SAC3B,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC;SACxB,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;SAC9B,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAE9B,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAA;IAEhD,OAAO;EACP,OAAO,CAAC,QAAQ,EAAE;;;;;;;;;;;;;;kBAcF,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAe,CAAC,IAAI;;;;;;MAMzD,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI;MACxC,YAAY,CAAC,SAAS,CAAC,MAAO,CAAC,IAAI;MACnC,YAAY,CAAC,SAAS,CAAC,WAAY,CAAC,IAAI;MACxC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI;QAClC,YAAY,CAAC,SAAS,CAAC,IAAI;;;;;;;;;YASvB,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,iBAAiB,SAAS,CAAC,SAAS,CAAC,IAAI;;;;;;;;;;0BAUvD,cAAc;;;;yDAIiB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAiCtB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;;;;;iCAQ1C,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;sCAIlB,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;;;;;iCAQ/B,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;;;;;;;;;iCAYvB,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEvD,CAAA;AACD,CAAC"}
@@ -44,15 +44,24 @@ function generateAdminDetailSidebar({ context }) {
44
44
  const imports = Generator.ImportGenerator
45
45
  //
46
46
  .from(Generator.toBackendModuleLocation('@ui/admin/AdminDetailSidebar'))
47
- .add(context.admin.components.auditLogSidebar);
47
+ .add(context.admin.components.auditLogSidebar)
48
+ .addImport({
49
+ from: Generator.toBackendModuleLocation('@app-actions/ai-assistant-store'),
50
+ items: [Generator.toFunctionName('useAiAssistantActions'), Generator.toFunctionName('useAiAssistantState')],
51
+ })
52
+ .addImport({
53
+ from: Generator.toBackendModuleLocation('@app-actions/ai-sidebar-content'),
54
+ items: [Generator.toFunctionName('AiSidebarContent')],
55
+ });
48
56
  const hasComments = !!context.admin.components.commentSidebar;
49
57
  if (hasComments) {
50
- imports.add(context.admin.components.commentSidebar);
58
+ imports.add(context.admin.components.commentSidebar); // NOSONAR
51
59
  }
52
60
  return `
53
- ${hasComments ? "import { useState } from 'react'" : ''}
54
61
  import type { ComponentProps } from 'react'
62
+ ${hasComments ? "import { useState } from 'react'" : ''}
55
63
  ${imports.generate()}
64
+ import { APP_CONFIG } from '@lib/config'
56
65
  import {
57
66
  Badge,
58
67
  Sidebar,
@@ -60,12 +69,10 @@ import {
60
69
  SidebarGroup,
61
70
  SidebarGroupContent,
62
71
  SidebarRail,
63
- ${hasComments
64
- ? `Tabs,
72
+ Tabs,
65
73
  TabsContent,
66
74
  TabsList,
67
- TabsTrigger,`
68
- : ''}
75
+ TabsTrigger,
69
76
  } from '@postxl/ui-components'
70
77
 
71
78
  type AdminDetailSidebarProps = Readonly<{
@@ -79,7 +86,8 @@ type AdminDetailSidebarProps = Readonly<{
79
86
  ${hasComments
80
87
  ? `filteredIds?: string[]
81
88
  labelMap?: Record<string, string>
82
- selectedEntityId?: string`
89
+ selectedEntityId?: string
90
+ singleCommentThread?: boolean`
83
91
  : ''}
84
92
  }> & ComponentProps<typeof Sidebar>
85
93
 
@@ -91,33 +99,45 @@ export function AdminDetailSidebar({
91
99
  labelField,
92
100
  onClearField,
93
101
  onClearEntity,
94
- ${hasComments ? 'filteredIds, labelMap, selectedEntityId,' : ''}
102
+ ${hasComments ? 'filteredIds, labelMap, selectedEntityId, singleCommentThread,' : ''}
95
103
  ...sidebarProps
96
104
  }: AdminDetailSidebarProps) {
97
105
  ${hasComments ? 'const [commentCount, setCommentCount] = useState(0)' : ''}
106
+ const activeAdminTab = useAiAssistantState((state) => state.activeAdminTab)
107
+ const { setActiveAdminTab } = useAiAssistantActions()
108
+ const availableTabs = new Set([${hasComments ? "'comments', " : ''}'audit-log', ...(APP_CONFIG.enableAI ? ['ai'] : [])])
109
+ const selectedTab = availableTabs.has(activeAdminTab) ? activeAdminTab : '${hasComments ? 'comments' : 'audit-log'}'
110
+
98
111
  return (
99
112
  <Sidebar {...sidebarProps} onMouseDown={(e) => e.stopPropagation()}>
100
113
  <SidebarRail />
101
114
  <SidebarContent>
102
- ${hasComments
103
- ? `<Tabs defaultValue="comments">
115
+ <Tabs value={selectedTab} onValueChange={setActiveAdminTab} className="h-full">
104
116
  <SidebarGroup>
105
117
  <SidebarGroupContent className="px-2 pt-2">
106
118
  <TabsList variant="protocol">
107
- <TabsTrigger value="comments" variant="protocol" className="group/tab cursor-pointer px-3 h-8">Comments{commentCount > 0 && <Badge variant="secondary" size="xs" className="ml-1.5 transition-none group-hover/tab:bg-primary group-hover/tab:text-primary-foreground group-data-[state=active]/tab:bg-primary group-data-[state=active]/tab:text-primary-foreground">{commentCount}</Badge>}</TabsTrigger>
119
+ ${hasComments
120
+ ? `<TabsTrigger value="comments" variant="protocol" className="group/tab cursor-pointer px-3 h-8">Comments{commentCount > 0 && <Badge variant="secondary" size="xs" className="ml-1.5 transition-none group-hover/tab:bg-primary group-hover/tab:text-primary-foreground group-data-[state=active]/tab:bg-primary group-data-[state=active]/tab:text-primary-foreground">{commentCount}</Badge>}</TabsTrigger>`
121
+ : ''}
108
122
  <TabsTrigger value="audit-log" variant="protocol" className="cursor-pointer px-3 h-8">Audit Log</TabsTrigger>
123
+ {APP_CONFIG.enableAI && (
124
+ <TabsTrigger value="ai" variant="protocol" className="cursor-pointer px-3 h-8">AI</TabsTrigger>
125
+ )}
109
126
  </TabsList>
110
127
  </SidebarGroupContent>
111
128
  </SidebarGroup>
112
- <TabsContent value="comments" className="mt-0">
129
+ ${hasComments
130
+ ? `<TabsContent value="comments" className="mt-0">
113
131
  <${context.admin.components.commentSidebar.name}
114
132
  model={model}
115
133
  filteredIds={filteredIds}
116
134
  labelMap={labelMap}
117
135
  selectedEntityId={selectedEntityId}
118
136
  onCommentCountChange={setCommentCount}
137
+ singleCommentThread={singleCommentThread}
119
138
  />
120
- </TabsContent>
139
+ </TabsContent>`
140
+ : ''}
121
141
  <TabsContent value="audit-log" className="mt-0">
122
142
  <AuditLogSidebar
123
143
  model={model}
@@ -129,16 +149,12 @@ export function AdminDetailSidebar({
129
149
  onClearEntity={onClearEntity}
130
150
  />
131
151
  </TabsContent>
132
- </Tabs>`
133
- : `<AuditLogSidebar
134
- model={model}
135
- entityId={entityId}
136
- entityIds={entityIds}
137
- field={field}
138
- labelField={labelField}
139
- onClearField={onClearField}
140
- onClearEntity={onClearEntity}
141
- />`}
152
+ {APP_CONFIG.enableAI && (
153
+ <TabsContent value="ai" className="mt-0 h-full min-h-0">
154
+ <AiSidebarContent />
155
+ </TabsContent>
156
+ )}
157
+ </Tabs>
142
158
  </SidebarContent>
143
159
  </Sidebar>
144
160
  )
@@ -1 +1 @@
1
- {"version":3,"file":"detail-sidebar.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/detail-sidebar.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,gEAgHC;AAzHD,6DAA8C;AAI9C;;;;GAIG;AACH,SAAgB,0BAA0B,CAAC,EAAE,OAAO,EAA8B;IAChF,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe;QACvC,EAAE;SACD,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,8BAA8B,CAAC,CAAC;SACvE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IAEhD,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAA;IAC7D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAe,CAAC,CAAA;IACvD,CAAC;IAED,OAAO;EACP,WAAW,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE;;EAErD,OAAO,CAAC,QAAQ,EAAE;;;;;;;;IAShB,WAAW;QACT,CAAC,CAAC;;;eAGO;QACT,CAAC,CAAC,EACN;;;;;;;;;;;IAYE,WAAW;QACT,CAAC,CAAC;;4BAEoB;QACtB,CAAC,CAAC,EACN;;;;;;;;;;;IAWE,WAAW,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,EAAE;;;IAG7D,WAAW,CAAC,CAAC,CAAC,qDAAqD,CAAC,CAAC,CAAC,EAAE;;;;;UAMlE,WAAW;QACT,CAAC,CAAC;;;;;;;;;;eAUC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAe,CAAC,IAAI;;;;;;;;;;;;;;;;;;;gBAmB5C;QACJ,CAAC,CAAC;;;;;;;;WASN;;;;;CAKP,CAAA;AACD,CAAC"}
1
+ {"version":3,"file":"detail-sidebar.generator.js","sourceRoot":"","sources":["../../../src/frontend-admin/generators/detail-sidebar.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,gEAgIC;AAzID,6DAA8C;AAI9C;;;;GAIG;AACH,SAAgB,0BAA0B,CAAC,EAAE,OAAO,EAA8B;IAChF,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe;QACvC,EAAE;SACD,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,8BAA8B,CAAC,CAAC;SACvE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC;SAC7C,SAAS,CAAC;QACT,IAAI,EAAE,SAAS,CAAC,uBAAuB,CAAC,iCAAiC,CAAC;QAC1E,KAAK,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,uBAAuB,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;KAC5G,CAAC;SACD,SAAS,CAAC;QACT,IAAI,EAAE,SAAS,CAAC,uBAAuB,CAAC,iCAAiC,CAAC;QAC1E,KAAK,EAAE,CAAC,SAAS,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;KACtD,CAAC,CAAA;IAEJ,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAA;IAC7D,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAe,CAAC,CAAA,CAAC,UAAU;IAClE,CAAC;IAED,OAAO;;EAEP,WAAW,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE;EACrD,OAAO,CAAC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;IAwBhB,WAAW;QACT,CAAC,CAAC;;;gCAGwB;QAC1B,CAAC,CAAC,EACN;;;;;;;;;;;IAWE,WAAW,CAAC,CAAC,CAAC,+DAA+D,CAAC,CAAC,CAAC,EAAE;;;IAGlF,WAAW,CAAC,CAAC,CAAC,qDAAqD,CAAC,CAAC,CAAC,EAAE;;;mCAGzC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;8EACU,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;;;;;;;;;;kBAWlG,WAAW;QACT,CAAC,CAAC,6YAA6Y;QAC/Y,CAAC,CAAC,EACN;;;;;;;;YASJ,WAAW;QACT,CAAC,CAAC;eACD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,cAAe,CAAC,IAAI;;;;;;;;yBAQnC;QACX,CAAC,CAAC,EACN;;;;;;;;;;;;;;;;;;;;;;CAsBT,CAAA;AACD,CAAC"}