@carlonicora/nextjs-jsonapi 1.2.0 → 1.3.1
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/{BlockNoteEditor-CNXQ3WL3.js → BlockNoteEditor-7WYPN34K.js} +17 -17
- package/dist/{BlockNoteEditor-CNXQ3WL3.js.map → BlockNoteEditor-7WYPN34K.js.map} +1 -1
- package/dist/{BlockNoteEditor-DC33K4IF.mjs → BlockNoteEditor-V625C23O.mjs} +7 -7
- package/dist/{JsonApiRequest-O7BGUMFO.mjs → JsonApiRequest-6UR7DIAR.mjs} +4 -2
- package/dist/JsonApiRequest-UJ7FGIVI.js +25 -0
- package/dist/JsonApiRequest-UJ7FGIVI.js.map +1 -0
- package/dist/{chunk-EZK3H6EJ.js → chunk-5IET37O4.js} +206 -206
- package/dist/{chunk-EZK3H6EJ.js.map → chunk-5IET37O4.js.map} +1 -1
- package/dist/{chunk-Y4XI3AZR.mjs → chunk-5QC7A6BL.mjs} +32 -20
- package/dist/chunk-5QC7A6BL.mjs.map +1 -0
- package/dist/{chunk-LJRD4SRV.js → chunk-DEYKTLA3.js} +6 -6
- package/dist/{chunk-LJRD4SRV.js.map → chunk-DEYKTLA3.js.map} +1 -1
- package/dist/{chunk-NPPQNSXN.mjs → chunk-FMBQZAIP.mjs} +3 -3
- package/dist/{chunk-MHVXFWZY.mjs → chunk-HTLEKZND.mjs} +3 -3
- package/dist/{chunk-74F6BBHH.mjs → chunk-IKBA4AHN.mjs} +2 -1
- package/dist/chunk-IKBA4AHN.mjs.map +1 -0
- package/dist/{chunk-JLN6UWII.mjs → chunk-JGFWIT2E.mjs} +2 -2
- package/dist/{chunk-KDFDGXCX.js → chunk-K2ANOT66.js} +576 -564
- package/dist/chunk-K2ANOT66.js.map +1 -0
- package/dist/{chunk-X53MF5ZN.mjs → chunk-P2F54I7Q.mjs} +2 -2
- package/dist/{chunk-5ZEADNNP.js → chunk-PMXG5WBC.js} +3 -2
- package/dist/chunk-PMXG5WBC.js.map +1 -0
- package/dist/{chunk-L6LH7WA4.js → chunk-PO5Q3H5I.js} +190 -190
- package/dist/{chunk-L6LH7WA4.js.map → chunk-PO5Q3H5I.js.map} +1 -1
- package/dist/{chunk-WZJDLITG.js → chunk-Q4FXESVT.js} +3 -3
- package/dist/{chunk-WZJDLITG.js.map → chunk-Q4FXESVT.js.map} +1 -1
- package/dist/client/index.js +7 -7
- package/dist/client/index.mjs +6 -6
- package/dist/components/index.js +7 -7
- package/dist/components/index.mjs +6 -6
- package/dist/contexts/index.js +7 -7
- package/dist/contexts/index.mjs +6 -6
- package/dist/core/index.js +2 -2
- package/dist/core/index.mjs +1 -1
- package/dist/features/index.js +4 -4
- package/dist/features/index.mjs +3 -3
- package/dist/hooks/index.js +7 -7
- package/dist/hooks/index.mjs +6 -6
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -2
- package/dist/scripts/generate-web-module/generator.d.ts +15 -0
- package/dist/scripts/generate-web-module/generator.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/generator.js +320 -0
- package/dist/scripts/generate-web-module/generator.js.map +1 -0
- package/dist/scripts/generate-web-module/index.d.ts +16 -0
- package/dist/scripts/generate-web-module/index.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/index.js +80 -0
- package/dist/scripts/generate-web-module/index.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/container.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/components/container.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/container.template.js +124 -0
- package/dist/scripts/generate-web-module/templates/components/container.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/content.template.d.ts +15 -0
- package/dist/scripts/generate-web-module/templates/components/content.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/content.template.js +39 -0
- package/dist/scripts/generate-web-module/templates/components/content.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/deleter.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/components/deleter.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/deleter.template.js +51 -0
- package/dist/scripts/generate-web-module/templates/components/deleter.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/details.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/components/details.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/details.template.js +109 -0
- package/dist/scripts/generate-web-module/templates/components/details.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/components/editor.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/editor.template.js +459 -0
- package/dist/scripts/generate-web-module/templates/components/editor.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/index.d.ts +15 -0
- package/dist/scripts/generate-web-module/templates/components/index.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/index.js +29 -0
- package/dist/scripts/generate-web-module/templates/components/index.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/list-container.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/components/list-container.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/list-container.template.js +30 -0
- package/dist/scripts/generate-web-module/templates/components/list-container.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/list.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/components/list.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/list.template.js +84 -0
- package/dist/scripts/generate-web-module/templates/components/list.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/multi-selector.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/components/multi-selector.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js +184 -0
- package/dist/scripts/generate-web-module/templates/components/multi-selector.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/selector.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/components/selector.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/components/selector.template.js +199 -0
- package/dist/scripts/generate-web-module/templates/components/selector.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/context.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/context.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/context.template.js +121 -0
- package/dist/scripts/generate-web-module/templates/context.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/fields.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/data/fields.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/fields.template.js +55 -0
- package/dist/scripts/generate-web-module/templates/data/fields.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/index.d.ts +10 -0
- package/dist/scripts/generate-web-module/templates/data/index.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/index.js +26 -0
- package/dist/scripts/generate-web-module/templates/data/index.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/interface.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/data/interface.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/interface.template.js +116 -0
- package/dist/scripts/generate-web-module/templates/data/interface.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/model.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/data/model.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/model.template.js +274 -0
- package/dist/scripts/generate-web-module/templates/data/model.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/service.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/data/service.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/data/service.template.js +168 -0
- package/dist/scripts/generate-web-module/templates/data/service.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/index.d.ts +12 -0
- package/dist/scripts/generate-web-module/templates/index.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/index.js +37 -0
- package/dist/scripts/generate-web-module/templates/index.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/module.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/module.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/module.template.js +64 -0
- package/dist/scripts/generate-web-module/templates/module.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/pages/detail-page.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/pages/detail-page.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js +65 -0
- package/dist/scripts/generate-web-module/templates/pages/detail-page.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/pages/index.d.ts +8 -0
- package/dist/scripts/generate-web-module/templates/pages/index.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/pages/index.js +13 -0
- package/dist/scripts/generate-web-module/templates/pages/index.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/pages/list-page.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/pages/list-page.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/pages/list-page.template.js +37 -0
- package/dist/scripts/generate-web-module/templates/pages/list-page.template.js.map +1 -0
- package/dist/scripts/generate-web-module/templates/table-hook.template.d.ts +14 -0
- package/dist/scripts/generate-web-module/templates/table-hook.template.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/templates/table-hook.template.js +174 -0
- package/dist/scripts/generate-web-module/templates/table-hook.template.js.map +1 -0
- package/dist/scripts/generate-web-module/transformers/field-mapper.d.ts +55 -0
- package/dist/scripts/generate-web-module/transformers/field-mapper.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/transformers/field-mapper.js +179 -0
- package/dist/scripts/generate-web-module/transformers/field-mapper.js.map +1 -0
- package/dist/scripts/generate-web-module/transformers/i18n-generator.d.ts +78 -0
- package/dist/scripts/generate-web-module/transformers/i18n-generator.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/transformers/i18n-generator.js +182 -0
- package/dist/scripts/generate-web-module/transformers/i18n-generator.js.map +1 -0
- package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts +106 -0
- package/dist/scripts/generate-web-module/transformers/import-resolver.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/transformers/import-resolver.js +193 -0
- package/dist/scripts/generate-web-module/transformers/import-resolver.js.map +1 -0
- package/dist/scripts/generate-web-module/transformers/index.d.ts +12 -0
- package/dist/scripts/generate-web-module/transformers/index.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/transformers/index.js +28 -0
- package/dist/scripts/generate-web-module/transformers/index.js.map +1 -0
- package/dist/scripts/generate-web-module/transformers/name-transformer.d.ts +60 -0
- package/dist/scripts/generate-web-module/transformers/name-transformer.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/transformers/name-transformer.js +115 -0
- package/dist/scripts/generate-web-module/transformers/name-transformer.js.map +1 -0
- package/dist/scripts/generate-web-module/transformers/parent-detector.d.ts +57 -0
- package/dist/scripts/generate-web-module/transformers/parent-detector.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/transformers/parent-detector.js +88 -0
- package/dist/scripts/generate-web-module/transformers/parent-detector.js.map +1 -0
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts +68 -0
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.js +219 -0
- package/dist/scripts/generate-web-module/transformers/relationship-resolver.js.map +1 -0
- package/dist/scripts/generate-web-module/types/field-mapping.types.d.ts +68 -0
- package/dist/scripts/generate-web-module/types/field-mapping.types.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/types/field-mapping.types.js +129 -0
- package/dist/scripts/generate-web-module/types/field-mapping.types.js.map +1 -0
- package/dist/scripts/generate-web-module/types/index.d.ts +9 -0
- package/dist/scripts/generate-web-module/types/index.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/types/index.js +25 -0
- package/dist/scripts/generate-web-module/types/index.js.map +1 -0
- package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts +40 -0
- package/dist/scripts/generate-web-module/types/json-schema.interface.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/types/json-schema.interface.js +10 -0
- package/dist/scripts/generate-web-module/types/json-schema.interface.js.map +1 -0
- package/dist/scripts/generate-web-module/types/template-data.interface.d.ts +128 -0
- package/dist/scripts/generate-web-module/types/template-data.interface.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/types/template-data.interface.js +9 -0
- package/dist/scripts/generate-web-module/types/template-data.interface.js.map +1 -0
- package/dist/scripts/generate-web-module/utils/bootstrapper-updater.d.ts +29 -0
- package/dist/scripts/generate-web-module/utils/bootstrapper-updater.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/utils/bootstrapper-updater.js +153 -0
- package/dist/scripts/generate-web-module/utils/bootstrapper-updater.js.map +1 -0
- package/dist/scripts/generate-web-module/utils/file-writer.d.ts +38 -0
- package/dist/scripts/generate-web-module/utils/file-writer.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/utils/file-writer.js +126 -0
- package/dist/scripts/generate-web-module/utils/file-writer.js.map +1 -0
- package/dist/scripts/generate-web-module/utils/i18n-updater.d.ts +28 -0
- package/dist/scripts/generate-web-module/utils/i18n-updater.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/utils/i18n-updater.js +122 -0
- package/dist/scripts/generate-web-module/utils/i18n-updater.js.map +1 -0
- package/dist/scripts/generate-web-module/utils/index.d.ts +9 -0
- package/dist/scripts/generate-web-module/utils/index.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/utils/index.js +20 -0
- package/dist/scripts/generate-web-module/utils/index.js.map +1 -0
- package/dist/scripts/generate-web-module/validators/json-schema-validator.d.ts +46 -0
- package/dist/scripts/generate-web-module/validators/json-schema-validator.d.ts.map +1 -0
- package/dist/scripts/generate-web-module/validators/json-schema-validator.js +265 -0
- package/dist/scripts/generate-web-module/validators/json-schema-validator.js.map +1 -0
- package/dist/shadcnui/index.js +4 -4
- package/dist/shadcnui/index.mjs +3 -3
- package/dist/utils/index.js +3 -3
- package/dist/utils/index.mjs +2 -2
- package/package.json +27 -21
- package/scripts/generate-web-module/generator.ts +363 -0
- package/scripts/generate-web-module/index.ts +49 -0
- package/scripts/generate-web-module/templates/components/container.template.ts +129 -0
- package/scripts/generate-web-module/templates/components/content.template.ts +40 -0
- package/scripts/generate-web-module/templates/components/deleter.template.ts +51 -0
- package/scripts/generate-web-module/templates/components/details.template.ts +115 -0
- package/scripts/generate-web-module/templates/components/editor.template.ts +495 -0
- package/scripts/generate-web-module/templates/components/index.ts +18 -0
- package/scripts/generate-web-module/templates/components/list-container.template.ts +30 -0
- package/scripts/generate-web-module/templates/components/list.template.ts +91 -0
- package/scripts/generate-web-module/templates/components/multi-selector.template.ts +184 -0
- package/scripts/generate-web-module/templates/components/selector.template.ts +199 -0
- package/scripts/generate-web-module/templates/context.template.ts +121 -0
- package/scripts/generate-web-module/templates/data/fields.template.ts +64 -0
- package/scripts/generate-web-module/templates/data/index.ts +10 -0
- package/scripts/generate-web-module/templates/data/interface.template.ts +136 -0
- package/scripts/generate-web-module/templates/data/model.template.ts +327 -0
- package/scripts/generate-web-module/templates/data/service.template.ts +185 -0
- package/scripts/generate-web-module/templates/index.ts +34 -0
- package/scripts/generate-web-module/templates/module.template.ts +69 -0
- package/scripts/generate-web-module/templates/pages/detail-page.template.ts +65 -0
- package/scripts/generate-web-module/templates/pages/index.ts +8 -0
- package/scripts/generate-web-module/templates/pages/list-page.template.ts +37 -0
- package/scripts/generate-web-module/templates/table-hook.template.ts +182 -0
- package/scripts/generate-web-module/transformers/field-mapper.ts +201 -0
- package/scripts/generate-web-module/transformers/i18n-generator.ts +199 -0
- package/scripts/generate-web-module/transformers/import-resolver.ts +250 -0
- package/scripts/generate-web-module/transformers/index.ts +12 -0
- package/scripts/generate-web-module/transformers/name-transformer.ts +115 -0
- package/scripts/generate-web-module/transformers/parent-detector.ts +87 -0
- package/scripts/generate-web-module/transformers/relationship-resolver.ts +221 -0
- package/scripts/generate-web-module/tsconfig.json +24 -0
- package/scripts/generate-web-module/types/field-mapping.types.ts +141 -0
- package/scripts/generate-web-module/types/index.ts +9 -0
- package/scripts/generate-web-module/types/json-schema.interface.ts +42 -0
- package/scripts/generate-web-module/types/template-data.interface.ts +164 -0
- package/scripts/generate-web-module/utils/bootstrapper-updater.ts +145 -0
- package/scripts/generate-web-module/utils/file-writer.ts +115 -0
- package/scripts/generate-web-module/utils/i18n-updater.ts +108 -0
- package/scripts/generate-web-module/utils/index.ts +9 -0
- package/scripts/generate-web-module/validators/json-schema-validator.ts +306 -0
- package/src/components/errors/ErrorDetails.tsx +2 -2
- package/src/features/auth/components/containers/AuthContainer.tsx +1 -1
- package/src/features/auth/components/details/LandingComponent.tsx +20 -1
- package/src/features/auth/components/forms/AcceptInvitation.tsx +1 -1
- package/src/features/auth/components/forms/ActivateAccount.tsx +1 -1
- package/src/features/auth/components/forms/ForgotPassword.tsx +1 -1
- package/src/features/auth/components/forms/Login.tsx +1 -1
- package/src/features/auth/components/forms/Register.tsx +1 -1
- package/src/features/auth/components/forms/ResetPassword.tsx +1 -1
- package/src/features/company/components/forms/CompanyLicense.tsx +1 -8
- package/src/unified/JsonApiRequest.ts +2 -2
- package/dist/JsonApiRequest-VARLNKAF.js +0 -23
- package/dist/JsonApiRequest-VARLNKAF.js.map +0 -1
- package/dist/chunk-5ZEADNNP.js.map +0 -1
- package/dist/chunk-74F6BBHH.mjs.map +0 -1
- package/dist/chunk-KDFDGXCX.js.map +0 -1
- package/dist/chunk-Y4XI3AZR.mjs.map +0 -1
- /package/dist/{BlockNoteEditor-DC33K4IF.mjs.map → BlockNoteEditor-V625C23O.mjs.map} +0 -0
- /package/dist/{JsonApiRequest-O7BGUMFO.mjs.map → JsonApiRequest-6UR7DIAR.mjs.map} +0 -0
- /package/dist/{chunk-NPPQNSXN.mjs.map → chunk-FMBQZAIP.mjs.map} +0 -0
- /package/dist/{chunk-MHVXFWZY.mjs.map → chunk-HTLEKZND.mjs.map} +0 -0
- /package/dist/{chunk-JLN6UWII.mjs.map → chunk-JGFWIT2E.mjs.map} +0 -0
- /package/dist/{chunk-X53MF5ZN.mjs.map → chunk-P2F54I7Q.mjs.map} +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* List Template
|
|
4
|
+
*
|
|
5
|
+
* Generates {Module}List.tsx component for displaying a list of items.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generateListTemplate = generateListTemplate;
|
|
9
|
+
const name_transformer_1 = require("../../transformers/name-transformer");
|
|
10
|
+
/**
|
|
11
|
+
* Generate the list component file content
|
|
12
|
+
*
|
|
13
|
+
* @param data - Frontend template data
|
|
14
|
+
* @returns Generated file content
|
|
15
|
+
*/
|
|
16
|
+
function generateListTemplate(data) {
|
|
17
|
+
const { names, fields, relationships, extendsContent, tableFieldNames } = data;
|
|
18
|
+
// Build field list for the table - use name + first few fields + updatedAt
|
|
19
|
+
const displayFields = buildDisplayFields(data);
|
|
20
|
+
return `"use client";
|
|
21
|
+
|
|
22
|
+
import ${names.pascalCase}Editor from "@/features/${data.targetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Editor";
|
|
23
|
+
import { ${names.pascalCase}Fields } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Fields";
|
|
24
|
+
import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
25
|
+
import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
|
|
26
|
+
import "@/features/${data.targetDir}/${names.kebabCase}/hooks/use${names.pascalCase}TableStructure";
|
|
27
|
+
import { ContentListTable } from "@carlonicora/nextjs-jsonapi/components";
|
|
28
|
+
import { Modules } from "@carlonicora/nextjs-jsonapi/core";
|
|
29
|
+
import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jsonapi/hooks";
|
|
30
|
+
import { useTranslations } from "next-intl";
|
|
31
|
+
import { ReactNode } from "react";
|
|
32
|
+
|
|
33
|
+
export default function ${names.pascalCase}List() {
|
|
34
|
+
const t = useTranslations();
|
|
35
|
+
|
|
36
|
+
const data: DataListRetriever<${names.pascalCase}Interface> = useDataListRetriever({
|
|
37
|
+
module: Modules.${names.pascalCase},
|
|
38
|
+
retriever: (params) => ${names.pascalCase}Service.findMany(params),
|
|
39
|
+
retrieverParams: {},
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const functions: ReactNode[] = [<${names.pascalCase}Editor key="create-${names.kebabCase}" />];
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<ContentListTable
|
|
46
|
+
data={data}
|
|
47
|
+
fields={[${displayFields}]}
|
|
48
|
+
tableGeneratorType={Modules.${names.pascalCase}}
|
|
49
|
+
functions={functions}
|
|
50
|
+
title={t(\`types.${names.pluralKebab}\`, { count: 2 })}
|
|
51
|
+
/>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build display fields array for the table
|
|
58
|
+
*/
|
|
59
|
+
function buildDisplayFields(data) {
|
|
60
|
+
const { names, fields, relationships, extendsContent } = data;
|
|
61
|
+
const displayFields = [];
|
|
62
|
+
// Always include name if it exists
|
|
63
|
+
if (extendsContent || fields.some((f) => f.name === "name")) {
|
|
64
|
+
displayFields.push(`${names.pascalCase}Fields.name`);
|
|
65
|
+
}
|
|
66
|
+
// Add author if present
|
|
67
|
+
const authorRel = relationships.find((r) => r.variant === "Author");
|
|
68
|
+
if (authorRel) {
|
|
69
|
+
const authorFieldName = (0, name_transformer_1.toCamelCase)(authorRel.variant);
|
|
70
|
+
displayFields.push(`${names.pascalCase}Fields.${authorFieldName}`);
|
|
71
|
+
}
|
|
72
|
+
// Add first non-author relationship
|
|
73
|
+
const otherRel = relationships.find((r) => r.variant !== "Author");
|
|
74
|
+
if (otherRel) {
|
|
75
|
+
const relFieldName = otherRel.single
|
|
76
|
+
? (0, name_transformer_1.toCamelCase)(otherRel.variant || otherRel.name)
|
|
77
|
+
: (0, name_transformer_1.pluralize)((0, name_transformer_1.toCamelCase)(otherRel.name));
|
|
78
|
+
displayFields.push(`${names.pascalCase}Fields.${relFieldName}`);
|
|
79
|
+
}
|
|
80
|
+
// Add updatedAt
|
|
81
|
+
displayFields.push(`${names.pascalCase}Fields.updatedAt`);
|
|
82
|
+
return displayFields.join(", ");
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=list.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/list.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAWH,oDAyCC;AAjDD,0EAA6E;AAE7E;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,IAA0B;IAC7D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAE/E,2EAA2E;IAC3E,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAE/C,OAAO;;SAEA,KAAK,CAAC,UAAU,2BAA2B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,qBAAqB,KAAK,CAAC,UAAU;WAC/G,KAAK,CAAC,UAAU,6BAA6B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WACvG,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAC1G,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;qBAC9F,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,aAAa,KAAK,CAAC,UAAU;;;;;;;0BAOzD,KAAK,CAAC,UAAU;;;kCAGR,KAAK,CAAC,UAAU;sBAC5B,KAAK,CAAC,UAAU;6BACT,KAAK,CAAC,UAAU;;;;qCAIR,KAAK,CAAC,UAAU,sBAAsB,KAAK,CAAC,SAAS;;;;;iBAKzE,aAAa;oCACM,KAAK,CAAC,UAAU;;yBAE3B,KAAK,CAAC,WAAW;;;;CAIzC,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAA0B;IACpD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC9D,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,mCAAmC;IACnC,IAAI,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;QAC5D,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,aAAa,CAAC,CAAC;IACvD,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;IACpE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,eAAe,GAAG,IAAA,8BAAW,EAAC,SAAS,CAAC,OAAQ,CAAC,CAAC;QACxD,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,UAAU,eAAe,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;IACnE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM;YAClC,CAAC,CAAC,IAAA,8BAAW,EAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC;YAChD,CAAC,CAAC,IAAA,4BAAS,EAAC,IAAA,8BAAW,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,UAAU,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,gBAAgB;IAChB,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,kBAAkB,CAAC,CAAC;IAE1D,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MultiSelector Template
|
|
3
|
+
*
|
|
4
|
+
* Generates {Module}MultiSelector.tsx multi-select component.
|
|
5
|
+
*/
|
|
6
|
+
import { FrontendTemplateData } from "../../types/template-data.interface";
|
|
7
|
+
/**
|
|
8
|
+
* Generate the multi-selector component file content
|
|
9
|
+
*
|
|
10
|
+
* @param data - Frontend template data
|
|
11
|
+
* @returns Generated file content
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateMultiSelectorTemplate(data: FrontendTemplateData): string;
|
|
14
|
+
//# sourceMappingURL=multi-selector.template.d.ts.map
|
package/dist/scripts/generate-web-module/templates/components/multi-selector.template.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-selector.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/multi-selector.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAyKhF"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MultiSelector Template
|
|
4
|
+
*
|
|
5
|
+
* Generates {Module}MultiSelector.tsx multi-select component.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generateMultiSelectorTemplate = generateMultiSelectorTemplate;
|
|
9
|
+
/**
|
|
10
|
+
* Generate the multi-selector component file content
|
|
11
|
+
*
|
|
12
|
+
* @param data - Frontend template data
|
|
13
|
+
* @returns Generated file content
|
|
14
|
+
*/
|
|
15
|
+
function generateMultiSelectorTemplate(data) {
|
|
16
|
+
const { names } = data;
|
|
17
|
+
return `"use client";
|
|
18
|
+
|
|
19
|
+
import { FormControl, FormField, FormItem, FormLabel, FormMessage, MultiSelect } from "@carlonicora/nextjs-jsonapi/shadcnui";
|
|
20
|
+
import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
21
|
+
import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
|
|
22
|
+
import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jsonapi/hooks";
|
|
23
|
+
import { useDebounce } from "@carlonicora/nextjs-jsonapi/hooks";
|
|
24
|
+
import { Modules } from "@carlonicora/nextjs-jsonapi/core";
|
|
25
|
+
import { useTranslations } from "next-intl";
|
|
26
|
+
import { useCallback, useEffect, useState } from "react";
|
|
27
|
+
import { useWatch } from "react-hook-form";
|
|
28
|
+
|
|
29
|
+
type ${names.pascalCase}MultiSelectType = {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
type ${names.pascalCase}MultiSelectorProps = {
|
|
35
|
+
id: string;
|
|
36
|
+
form: any;
|
|
37
|
+
current${names.pascalCase}?: ${names.pascalCase}Interface;
|
|
38
|
+
label?: string;
|
|
39
|
+
placeholder?: string;
|
|
40
|
+
onChange?: (${names.pluralCamel}?: ${names.pascalCase}Interface[]) => void;
|
|
41
|
+
maxCount?: number;
|
|
42
|
+
isRequired?: boolean;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export default function ${names.pascalCase}MultiSelector({
|
|
46
|
+
id,
|
|
47
|
+
form,
|
|
48
|
+
current${names.pascalCase},
|
|
49
|
+
label,
|
|
50
|
+
placeholder,
|
|
51
|
+
onChange,
|
|
52
|
+
maxCount = 3,
|
|
53
|
+
isRequired = false,
|
|
54
|
+
}: ${names.pascalCase}MultiSelectorProps) {
|
|
55
|
+
const t = useTranslations("features.${names.camelCase}");
|
|
56
|
+
const [${names.camelCase}Options, set${names.pascalCase}Options] = useState<any[]>([]);
|
|
57
|
+
const [searchTerm, setSearchTerm] = useState<string>("");
|
|
58
|
+
|
|
59
|
+
const selected${names.pluralPascal}: ${names.pascalCase}MultiSelectType[] = useWatch({ control: form.control, name: id }) || [];
|
|
60
|
+
|
|
61
|
+
const data: DataListRetriever<${names.pascalCase}Interface> = useDataListRetriever({
|
|
62
|
+
retriever: (params) => ${names.pascalCase}Service.findMany(params),
|
|
63
|
+
retrieverParams: {},
|
|
64
|
+
ready: true,
|
|
65
|
+
module: Modules.${names.pascalCase},
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const updateSearch = useCallback(
|
|
69
|
+
(searchedTerm: string) => {
|
|
70
|
+
if (searchedTerm.trim()) {
|
|
71
|
+
data.addAdditionalParameter("search", searchedTerm.trim());
|
|
72
|
+
} else {
|
|
73
|
+
data.removeAdditionalParameter("search");
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
[data],
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
const debouncedUpdateSearch = useDebounce(updateSearch, 500);
|
|
80
|
+
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
debouncedUpdateSearch(searchTerm);
|
|
83
|
+
}, [debouncedUpdateSearch, searchTerm]);
|
|
84
|
+
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
if (data.data && data.data.length > 0) {
|
|
87
|
+
const ${names.pluralCamel} = data.data as ${names.pascalCase}Interface[];
|
|
88
|
+
const filtered${names.pluralPascal} = ${names.pluralCamel}.filter((${names.camelCase}) => ${names.camelCase}.id !== current${names.pascalCase}?.id);
|
|
89
|
+
|
|
90
|
+
const options = filtered${names.pluralPascal}.map((${names.camelCase}) => ({
|
|
91
|
+
label: ${names.camelCase}.name,
|
|
92
|
+
value: ${names.camelCase}.id,
|
|
93
|
+
${names.camelCase}Data: ${names.camelCase},
|
|
94
|
+
}));
|
|
95
|
+
|
|
96
|
+
set${names.pascalCase}Options(options);
|
|
97
|
+
}
|
|
98
|
+
}, [data.data, current${names.pascalCase}]);
|
|
99
|
+
|
|
100
|
+
// Add options for any already selected ${names.pluralCamel} that aren't in search results
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
if (selected${names.pluralPascal}.length > 0) {
|
|
103
|
+
// Create a map of existing option IDs for quick lookup
|
|
104
|
+
const existingOptionIds = new Set(${names.camelCase}Options.map((option) => option.value));
|
|
105
|
+
|
|
106
|
+
// Find selected ${names.pluralCamel} that don't have an option yet
|
|
107
|
+
const missingOptions = selected${names.pluralPascal}
|
|
108
|
+
.filter((${names.camelCase}) => !existingOptionIds.has(${names.camelCase}.id))
|
|
109
|
+
.map((${names.camelCase}) => ({
|
|
110
|
+
label: ${names.camelCase}.name,
|
|
111
|
+
value: ${names.camelCase}.id,
|
|
112
|
+
${names.camelCase}Data: ${names.camelCase},
|
|
113
|
+
}));
|
|
114
|
+
|
|
115
|
+
if (missingOptions.length > 0) {
|
|
116
|
+
set${names.pascalCase}Options((prev) => [...prev, ...missingOptions]);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, [selected${names.pluralPascal}, ${names.camelCase}Options]);
|
|
120
|
+
|
|
121
|
+
const handleValueChange = (selectedIds: string[]) => {
|
|
122
|
+
const updatedSelected${names.pluralPascal} = selectedIds.map((id) => {
|
|
123
|
+
const existing${names.pascalCase} = selected${names.pluralPascal}.find((${names.camelCase}) => ${names.camelCase}.id === id);
|
|
124
|
+
if (existing${names.pascalCase}) {
|
|
125
|
+
return existing${names.pascalCase};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const option = ${names.camelCase}Options.find((option) => option.value === id);
|
|
129
|
+
if (option?.${names.camelCase}Data) {
|
|
130
|
+
return {
|
|
131
|
+
id: option.${names.camelCase}Data.id,
|
|
132
|
+
name: option.${names.camelCase}Data.name,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return { id, name: id };
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
form.setValue(id, updatedSelected${names.pluralPascal});
|
|
140
|
+
|
|
141
|
+
if (onChange) {
|
|
142
|
+
const fullSelected${names.pluralPascal} = selectedIds
|
|
143
|
+
.map((id) => ${names.camelCase}Options.find((option) => option.value === id)?.${names.camelCase}Data)
|
|
144
|
+
.filter(Boolean) as ${names.pascalCase}Interface[];
|
|
145
|
+
onChange(fullSelected${names.pluralPascal});
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const selected${names.pascalCase}Ids = selected${names.pluralPascal}.map((${names.camelCase}: ${names.pascalCase}MultiSelectType) => ${names.camelCase}.id);
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<div className="flex w-full flex-col">
|
|
153
|
+
<FormField
|
|
154
|
+
control={form.control}
|
|
155
|
+
name={id}
|
|
156
|
+
render={({ field }) => (
|
|
157
|
+
<FormItem className={\`\${label ? "mb-5" : "mb-1"}\`}>
|
|
158
|
+
{label && (
|
|
159
|
+
<FormLabel className="flex items-center">
|
|
160
|
+
{label}
|
|
161
|
+
{isRequired && <span className="text-destructive ml-2 font-semibold">*</span>}
|
|
162
|
+
</FormLabel>
|
|
163
|
+
)}
|
|
164
|
+
<FormControl>
|
|
165
|
+
<MultiSelect
|
|
166
|
+
options={${names.camelCase}Options}
|
|
167
|
+
onValueChange={handleValueChange}
|
|
168
|
+
defaultValue={selected${names.pascalCase}Ids}
|
|
169
|
+
placeholder={placeholder}
|
|
170
|
+
maxCount={maxCount}
|
|
171
|
+
animation={0}
|
|
172
|
+
onSearchChange={setSearchTerm}
|
|
173
|
+
/>
|
|
174
|
+
</FormControl>
|
|
175
|
+
<FormMessage />
|
|
176
|
+
</FormItem>
|
|
177
|
+
)}
|
|
178
|
+
/>
|
|
179
|
+
</div>
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
`;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=multi-selector.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-selector.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/multi-selector.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,sEAyKC;AA/KD;;;;;GAKG;AACH,SAAgB,6BAA6B,CAAC,IAA0B;IACtE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,OAAO;;;WAGE,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAC1G,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;OAQ5G,KAAK,CAAC,UAAU;;;;;OAKhB,KAAK,CAAC,UAAU;;;WAGZ,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,UAAU;;;gBAGjC,KAAK,CAAC,WAAW,MAAM,KAAK,CAAC,UAAU;;;;;0BAK7B,KAAK,CAAC,UAAU;;;WAG/B,KAAK,CAAC,UAAU;;;;;;KAMtB,KAAK,CAAC,UAAU;wCACmB,KAAK,CAAC,SAAS;WAC5C,KAAK,CAAC,SAAS,eAAe,KAAK,CAAC,UAAU;;;kBAGvC,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,UAAU;;kCAEvB,KAAK,CAAC,UAAU;6BACrB,KAAK,CAAC,UAAU;;;sBAGvB,KAAK,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;cAsBxB,KAAK,CAAC,WAAW,mBAAmB,KAAK,CAAC,UAAU;sBAC5C,KAAK,CAAC,YAAY,MAAM,KAAK,CAAC,WAAW,YAAY,KAAK,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS,kBAAkB,KAAK,CAAC,UAAU;;gCAEnH,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS;iBACzD,KAAK,CAAC,SAAS;iBACf,KAAK,CAAC,SAAS;UACtB,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,SAAS;;;WAGtC,KAAK,CAAC,UAAU;;0BAED,KAAK,CAAC,UAAU;;4CAEE,KAAK,CAAC,WAAW;;kBAE3C,KAAK,CAAC,YAAY;;0CAEM,KAAK,CAAC,SAAS;;yBAEhC,KAAK,CAAC,WAAW;uCACH,KAAK,CAAC,YAAY;mBACtC,KAAK,CAAC,SAAS,+BAA+B,KAAK,CAAC,SAAS;gBAChE,KAAK,CAAC,SAAS;mBACZ,KAAK,CAAC,SAAS;mBACf,KAAK,CAAC,SAAS;YACtB,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,SAAS;;;;aAItC,KAAK,CAAC,UAAU;;;gBAGb,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,SAAS;;;2BAG3B,KAAK,CAAC,YAAY;sBACvB,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,YAAY,UAAU,KAAK,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS;oBAClG,KAAK,CAAC,UAAU;yBACX,KAAK,CAAC,UAAU;;;uBAGlB,KAAK,CAAC,SAAS;oBAClB,KAAK,CAAC,SAAS;;uBAEZ,KAAK,CAAC,SAAS;yBACb,KAAK,CAAC,SAAS;;;;;;;uCAOD,KAAK,CAAC,YAAY;;;0BAG/B,KAAK,CAAC,YAAY;uBACrB,KAAK,CAAC,SAAS,kDAAkD,KAAK,CAAC,SAAS;8BACzE,KAAK,CAAC,UAAU;6BACjB,KAAK,CAAC,YAAY;;;;kBAI7B,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,YAAY,SAAS,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU,uBAAuB,KAAK,CAAC,SAAS;;;;;;;;;;;;;;;;;2BAiB7H,KAAK,CAAC,SAAS;;wCAEF,KAAK,CAAC,UAAU;;;;;;;;;;;;;;CAcvD,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selector Template
|
|
3
|
+
*
|
|
4
|
+
* Generates {Module}Selector.tsx searchable combobox component.
|
|
5
|
+
*/
|
|
6
|
+
import { FrontendTemplateData } from "../../types/template-data.interface";
|
|
7
|
+
/**
|
|
8
|
+
* Generate the selector component file content
|
|
9
|
+
*
|
|
10
|
+
* @param data - Frontend template data
|
|
11
|
+
* @returns Generated file content
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateSelectorTemplate(data: FrontendTemplateData): string;
|
|
14
|
+
//# sourceMappingURL=selector.template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.template.d.ts","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/selector.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAwL3E"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Selector Template
|
|
4
|
+
*
|
|
5
|
+
* Generates {Module}Selector.tsx searchable combobox component.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generateSelectorTemplate = generateSelectorTemplate;
|
|
9
|
+
/**
|
|
10
|
+
* Generate the selector component file content
|
|
11
|
+
*
|
|
12
|
+
* @param data - Frontend template data
|
|
13
|
+
* @returns Generated file content
|
|
14
|
+
*/
|
|
15
|
+
function generateSelectorTemplate(data) {
|
|
16
|
+
const { names } = data;
|
|
17
|
+
return `"use client";
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
Command,
|
|
21
|
+
CommandItem,
|
|
22
|
+
CommandList,
|
|
23
|
+
FormControl,
|
|
24
|
+
FormField,
|
|
25
|
+
FormItem,
|
|
26
|
+
FormLabel,
|
|
27
|
+
FormMessage,
|
|
28
|
+
Input,
|
|
29
|
+
Popover,
|
|
30
|
+
PopoverContent,
|
|
31
|
+
PopoverTrigger,
|
|
32
|
+
} from "@carlonicora/nextjs-jsonapi/shadcnui";
|
|
33
|
+
import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
34
|
+
import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
|
|
35
|
+
import { DataListRetriever, useDataListRetriever } from "@carlonicora/nextjs-jsonapi/hooks";
|
|
36
|
+
import { useDebounce } from "@carlonicora/nextjs-jsonapi/hooks";
|
|
37
|
+
import { Modules } from "@carlonicora/nextjs-jsonapi/core";
|
|
38
|
+
|
|
39
|
+
import { CircleX, RefreshCwIcon, SearchIcon, XIcon } from "lucide-react";
|
|
40
|
+
import { useTranslations } from "next-intl";
|
|
41
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
42
|
+
|
|
43
|
+
type ${names.pascalCase}SelectorProps = {
|
|
44
|
+
id: string;
|
|
45
|
+
form: any;
|
|
46
|
+
label?: string;
|
|
47
|
+
placeholder?: string;
|
|
48
|
+
onChange?: (${names.camelCase}?: ${names.pascalCase}Interface) => void;
|
|
49
|
+
isRequired?: boolean;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export default function ${names.pascalCase}Selector({
|
|
53
|
+
id,
|
|
54
|
+
form,
|
|
55
|
+
label,
|
|
56
|
+
placeholder,
|
|
57
|
+
onChange,
|
|
58
|
+
isRequired = false,
|
|
59
|
+
}: ${names.pascalCase}SelectorProps) {
|
|
60
|
+
const t = useTranslations();
|
|
61
|
+
|
|
62
|
+
const [open, setOpen] = useState<boolean>(false);
|
|
63
|
+
|
|
64
|
+
const searchTermRef = useRef<string>("");
|
|
65
|
+
const [searchTerm, setSearchTerm] = useState<string>("");
|
|
66
|
+
|
|
67
|
+
const [isSearching, setIsSearching] = useState<boolean>(false);
|
|
68
|
+
|
|
69
|
+
const data: DataListRetriever<${names.pascalCase}Interface> = useDataListRetriever({
|
|
70
|
+
retriever: (params) => {
|
|
71
|
+
return ${names.pascalCase}Service.findMany(params);
|
|
72
|
+
},
|
|
73
|
+
retrieverParams: {},
|
|
74
|
+
module: Modules.${names.pascalCase},
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const search = useCallback(
|
|
78
|
+
async (searchedTerm: string) => {
|
|
79
|
+
try {
|
|
80
|
+
if (searchedTerm === searchTermRef.current) return;
|
|
81
|
+
setIsSearching(true);
|
|
82
|
+
searchTermRef.current = searchedTerm;
|
|
83
|
+
await data.search(searchedTerm);
|
|
84
|
+
} finally {
|
|
85
|
+
setIsSearching(false);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
[searchTermRef, data],
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const updateSearchTerm = useDebounce(search, 500);
|
|
92
|
+
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
setIsSearching(true);
|
|
95
|
+
updateSearchTerm(searchTerm);
|
|
96
|
+
}, [updateSearchTerm, searchTerm]);
|
|
97
|
+
|
|
98
|
+
const set${names.pascalCase} = (${names.camelCase}?: ${names.pascalCase}Interface) => {
|
|
99
|
+
if (onChange) onChange(${names.camelCase});
|
|
100
|
+
if (!${names.camelCase}) {
|
|
101
|
+
form.setValue(id, undefined);
|
|
102
|
+
setOpen(false);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
form.setValue(id, { id: ${names.camelCase}.id, name: ${names.camelCase}.name });
|
|
107
|
+
setOpen(false);
|
|
108
|
+
|
|
109
|
+
setTimeout(() => {
|
|
110
|
+
setOpen(false);
|
|
111
|
+
}, 0);
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<div className="flex w-full flex-col">
|
|
116
|
+
<FormField
|
|
117
|
+
control={form.control}
|
|
118
|
+
name={id}
|
|
119
|
+
render={({ field }) => (
|
|
120
|
+
<FormItem className={\`\${label ? "mb-5" : "mb-1"}\`}>
|
|
121
|
+
{label && (
|
|
122
|
+
<FormLabel className="flex items-center">
|
|
123
|
+
{label}
|
|
124
|
+
{isRequired && <span className="text-destructive ml-2 font-semibold">*</span>}
|
|
125
|
+
</FormLabel>
|
|
126
|
+
)}
|
|
127
|
+
<FormControl>
|
|
128
|
+
<Popover open={open} onOpenChange={setOpen} modal={true}>
|
|
129
|
+
<div className="flex w-full flex-row items-center justify-between">
|
|
130
|
+
<PopoverTrigger className="w-full">
|
|
131
|
+
<div className="flex w-full flex-row items-center justify-start rounded-md text-sm">
|
|
132
|
+
{field.value ? (
|
|
133
|
+
<>
|
|
134
|
+
<div className="flex w-full flex-row items-center justify-start rounded-md border p-2">
|
|
135
|
+
<span className="">{field.value?.name ?? ""}</span>
|
|
136
|
+
</div>
|
|
137
|
+
</>
|
|
138
|
+
) : (
|
|
139
|
+
<div className="text-muted-foreground mr-7 flex h-10 w-full flex-row items-center justify-start rounded-md border p-2 text-sm">
|
|
140
|
+
{placeholder ?? t(\`generic.search.placeholder\`, { type: t(\`types.${names.pluralKebab}\`, { count: 1 }) })}
|
|
141
|
+
</div>
|
|
142
|
+
)}
|
|
143
|
+
</div>
|
|
144
|
+
</PopoverTrigger>
|
|
145
|
+
{field.value && (
|
|
146
|
+
<CircleX
|
|
147
|
+
className="text-muted hover:text-destructive ml-2 h-6 w-6 cursor-pointer"
|
|
148
|
+
onClick={() => set${names.pascalCase}()}
|
|
149
|
+
/>
|
|
150
|
+
)}
|
|
151
|
+
</div>
|
|
152
|
+
<PopoverContent>
|
|
153
|
+
<Command shouldFilter={false}>
|
|
154
|
+
<div className="relative mb-2 w-full">
|
|
155
|
+
<SearchIcon className="text-muted-foreground absolute left-2.5 top-2.5 h-4 w-4" />
|
|
156
|
+
<Input
|
|
157
|
+
placeholder={t(\`generic.search.placeholder\`, { type: t(\`types.${names.pluralKebab}\`, { count: 1 }) })}
|
|
158
|
+
type="text"
|
|
159
|
+
className="w-full pl-8 pr-8"
|
|
160
|
+
onChange={(e) => setSearchTerm(e.target.value)}
|
|
161
|
+
value={searchTerm}
|
|
162
|
+
/>
|
|
163
|
+
{isSearching ? (
|
|
164
|
+
<RefreshCwIcon className="text-muted-foreground absolute right-2.5 top-2.5 h-4 w-4 animate-spin" />
|
|
165
|
+
) : searchTermRef.current ? (
|
|
166
|
+
<XIcon
|
|
167
|
+
className={\`absolute right-2.5 top-2.5 h-4 w-4 \${searchTermRef.current ? "cursor-pointer" : "text-muted-foreground"}\`}
|
|
168
|
+
onClick={() => {
|
|
169
|
+
setSearchTerm("");
|
|
170
|
+
search("");
|
|
171
|
+
}}
|
|
172
|
+
/>
|
|
173
|
+
) : (
|
|
174
|
+
<></>
|
|
175
|
+
)}
|
|
176
|
+
</div>
|
|
177
|
+
<CommandList>
|
|
178
|
+
{data.data &&
|
|
179
|
+
data.data.length > 0 &&
|
|
180
|
+
(data.data as ${names.pascalCase}Interface[]).map((${names.camelCase}: ${names.pascalCase}Interface) => (
|
|
181
|
+
<CommandItem className="cursor-pointer" key={${names.camelCase}.id} onSelect={() => set${names.pascalCase}(${names.camelCase})}>
|
|
182
|
+
<span className="">{${names.camelCase}.name}</span>
|
|
183
|
+
</CommandItem>
|
|
184
|
+
))}
|
|
185
|
+
</CommandList>
|
|
186
|
+
</Command>
|
|
187
|
+
</PopoverContent>
|
|
188
|
+
</Popover>
|
|
189
|
+
</FormControl>
|
|
190
|
+
<FormMessage />
|
|
191
|
+
</FormItem>
|
|
192
|
+
)}
|
|
193
|
+
/>
|
|
194
|
+
</div>
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
`;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=selector.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.template.js","sourceRoot":"","sources":["../../../../../scripts/generate-web-module/templates/components/selector.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,4DAwLC;AA9LD;;;;;GAKG;AACH,SAAgB,wBAAwB,CAAC,IAA0B;IACjE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAEvB,OAAO;;;;;;;;;;;;;;;;WAgBE,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAC1G,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;;OAS5G,KAAK,CAAC,UAAU;;;;;gBAKP,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU;;;;0BAI3B,KAAK,CAAC,UAAU;;;;;;;KAOrC,KAAK,CAAC,UAAU;;;;;;;;;;kCAUa,KAAK,CAAC,UAAU;;eAEnC,KAAK,CAAC,UAAU;;;sBAGT,KAAK,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;aAwBzB,KAAK,CAAC,UAAU,OAAO,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,UAAU;6BAC5C,KAAK,CAAC,SAAS;WACjC,KAAK,CAAC,SAAS;;;;;;8BAMI,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gGAkCsB,KAAK,CAAC,WAAW;;;;;;;;0CAQvE,KAAK,CAAC,UAAU;;;;;;;;;2FASiC,KAAK,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;wCAuBpE,KAAK,CAAC,UAAU,qBAAqB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU;yEACxC,KAAK,CAAC,SAAS,2BAA2B,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS;kDACpG,KAAK,CAAC,SAAS;;;;;;;;;;;;;;;CAehE,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Template
|
|
3
|
+
*
|
|
4
|
+
* Generates {Module}Context.tsx for module state management.
|
|
5
|
+
*/
|
|
6
|
+
import { FrontendTemplateData } from "../types/template-data.interface";
|
|
7
|
+
/**
|
|
8
|
+
* Generate the context file content
|
|
9
|
+
*
|
|
10
|
+
* @param data - Frontend template data
|
|
11
|
+
* @returns Generated file content
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateContextTemplate(data: FrontendTemplateData): string;
|
|
14
|
+
//# sourceMappingURL=context.template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.template.d.ts","sourceRoot":"","sources":["../../../../scripts/generate-web-module/templates/context.template.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CA0G1E"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Context Template
|
|
4
|
+
*
|
|
5
|
+
* Generates {Module}Context.tsx for module state management.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.generateContextTemplate = generateContextTemplate;
|
|
9
|
+
/**
|
|
10
|
+
* Generate the context file content
|
|
11
|
+
*
|
|
12
|
+
* @param data - Frontend template data
|
|
13
|
+
* @returns Generated file content
|
|
14
|
+
*/
|
|
15
|
+
function generateContextTemplate(data) {
|
|
16
|
+
const { names, extendsContent } = data;
|
|
17
|
+
return `"use client";
|
|
18
|
+
|
|
19
|
+
import ${names.pascalCase}Deleter from "@/features/${data.targetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Deleter";
|
|
20
|
+
import ${names.pascalCase}Editor from "@/features/${data.targetDir}/${names.kebabCase}/components/forms/${names.pascalCase}Editor";
|
|
21
|
+
import { ${names.pascalCase}Interface } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Interface";
|
|
22
|
+
import { ${names.pascalCase}Service } from "@/features/${data.targetDir}/${names.kebabCase}/data/${names.pascalCase}Service";
|
|
23
|
+
import { SharedProvider } from "@carlonicora/nextjs-jsonapi/contexts";
|
|
24
|
+
import { usePageUrlGenerator } from "@carlonicora/nextjs-jsonapi/hooks";
|
|
25
|
+
import { BreadcrumbItemData } from "@carlonicora/nextjs-jsonapi/interfaces";
|
|
26
|
+
|
|
27
|
+
import { JsonApiHydratedDataInterface, Modules, rehydrate } from "@carlonicora/nextjs-jsonapi/core";
|
|
28
|
+
import { useTranslations } from "next-intl";
|
|
29
|
+
import { createContext, ReactNode, useContext, useState } from "react";
|
|
30
|
+
|
|
31
|
+
interface ${names.pascalCase}ContextType {
|
|
32
|
+
${names.camelCase}: ${names.pascalCase}Interface | undefined;
|
|
33
|
+
set${names.pascalCase}: (value: ${names.pascalCase}Interface | undefined) => void;
|
|
34
|
+
reload${names.pascalCase}: () => Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const ${names.pascalCase}Context = createContext<${names.pascalCase}ContextType | undefined>(undefined);
|
|
38
|
+
|
|
39
|
+
type ${names.pascalCase}ProviderProps = {
|
|
40
|
+
children: ReactNode;
|
|
41
|
+
dehydrated${names.pascalCase}?: JsonApiHydratedDataInterface;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const ${names.pascalCase}Provider = ({ children, dehydrated${names.pascalCase} }: ${names.pascalCase}ProviderProps) => {
|
|
45
|
+
const generateUrl = usePageUrlGenerator();
|
|
46
|
+
const t = useTranslations();
|
|
47
|
+
|
|
48
|
+
const [${names.camelCase}, set${names.pascalCase}] = useState<${names.pascalCase}Interface | undefined>(
|
|
49
|
+
dehydrated${names.pascalCase} ? rehydrate<${names.pascalCase}Interface>(Modules.${names.pascalCase}, dehydrated${names.pascalCase}) : undefined,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
const reload${names.pascalCase} = async () => {
|
|
53
|
+
if (!${names.camelCase}) return;
|
|
54
|
+
|
|
55
|
+
const fresh${names.pascalCase} = await ${names.pascalCase}Service.findOne({ id: ${names.camelCase}.id });
|
|
56
|
+
set${names.pascalCase}(fresh${names.pascalCase});
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const breadcrumb = () => {
|
|
60
|
+
const response: BreadcrumbItemData[] = [];
|
|
61
|
+
|
|
62
|
+
response.push({
|
|
63
|
+
name: t(\`types.${names.pluralCamel}\`, { count: 2 }),
|
|
64
|
+
href: generateUrl({ page: Modules.${names.pascalCase} }),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
if (${names.camelCase})
|
|
68
|
+
response.push({
|
|
69
|
+
name: ${names.camelCase}.name,
|
|
70
|
+
href: generateUrl({ page: Modules.${names.pascalCase}, id: ${names.camelCase}.id }),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
return response;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const title = () => {
|
|
77
|
+
const response: any = {
|
|
78
|
+
type: t(\`types.${names.pluralCamel}\`, { count: ${names.camelCase} ? 1 : 2 }),
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const functions: ReactNode[] = [];
|
|
82
|
+
|
|
83
|
+
if (${names.camelCase}) {
|
|
84
|
+
response.element = ${names.camelCase}.name;
|
|
85
|
+
|
|
86
|
+
functions.push(<${names.pascalCase}Deleter key={\`${names.pascalCase}Deleter\`} ${names.camelCase}={${names.camelCase}} />);
|
|
87
|
+
functions.push(<${names.pascalCase}Editor key={\`${names.pascalCase}Editor\`} ${names.camelCase}={${names.camelCase}} propagateChanges={set${names.pascalCase}} />);
|
|
88
|
+
} else {
|
|
89
|
+
functions.push(<${names.pascalCase}Editor key={\`${names.pascalCase}Editor\`} />);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (functions.length > 0) response.functions = functions;
|
|
93
|
+
|
|
94
|
+
return response;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<SharedProvider value={{ breadcrumbs: breadcrumb(), title: title() }}>
|
|
99
|
+
<${names.pascalCase}Context.Provider
|
|
100
|
+
value={{
|
|
101
|
+
${names.camelCase}: ${names.camelCase},
|
|
102
|
+
set${names.pascalCase}: set${names.pascalCase},
|
|
103
|
+
reload${names.pascalCase}: reload${names.pascalCase},
|
|
104
|
+
}}
|
|
105
|
+
>
|
|
106
|
+
{children}
|
|
107
|
+
</${names.pascalCase}Context.Provider>
|
|
108
|
+
</SharedProvider>
|
|
109
|
+
);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
export const use${names.pascalCase}Context = (): ${names.pascalCase}ContextType => {
|
|
113
|
+
const context = useContext(${names.pascalCase}Context);
|
|
114
|
+
if (context === undefined) {
|
|
115
|
+
throw new Error("use${names.pascalCase}Context must be used within a ${names.pascalCase}Provider");
|
|
116
|
+
}
|
|
117
|
+
return context;
|
|
118
|
+
};
|
|
119
|
+
`;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=context.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.template.js","sourceRoot":"","sources":["../../../../scripts/generate-web-module/templates/context.template.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,0DA0GC;AAhHD;;;;;GAKG;AACH,SAAgB,uBAAuB,CAAC,IAA0B;IAChE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAEvC,OAAO;;SAEA,KAAK,CAAC,UAAU,4BAA4B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,qBAAqB,KAAK,CAAC,UAAU;SAClH,KAAK,CAAC,UAAU,2BAA2B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,qBAAqB,KAAK,CAAC,UAAU;WAC/G,KAAK,CAAC,UAAU,gCAAgC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;WAC1G,KAAK,CAAC,UAAU,8BAA8B,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU;;;;;;;;;YASvG,KAAK,CAAC,UAAU;IACxB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU;OACjC,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,UAAU;UAC1C,KAAK,CAAC,UAAU;;;QAGlB,KAAK,CAAC,UAAU,2BAA2B,KAAK,CAAC,UAAU;;OAE5D,KAAK,CAAC,UAAU;;cAET,KAAK,CAAC,UAAU;;;eAGf,KAAK,CAAC,UAAU,qCAAqC,KAAK,CAAC,UAAU,OAAO,KAAK,CAAC,UAAU;;;;WAIhG,KAAK,CAAC,SAAS,QAAQ,KAAK,CAAC,UAAU,gBAAgB,KAAK,CAAC,UAAU;gBAClE,KAAK,CAAC,UAAU,gBAAgB,KAAK,CAAC,UAAU,sBAAsB,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC,UAAU;;;gBAGrH,KAAK,CAAC,UAAU;WACrB,KAAK,CAAC,SAAS;;iBAET,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC,UAAU,yBAAyB,KAAK,CAAC,SAAS;SAC5F,KAAK,CAAC,UAAU,SAAS,KAAK,CAAC,UAAU;;;;;;;wBAO1B,KAAK,CAAC,WAAW;0CACC,KAAK,CAAC,UAAU;;;UAGhD,KAAK,CAAC,SAAS;;gBAET,KAAK,CAAC,SAAS;4CACa,KAAK,CAAC,UAAU,SAAS,KAAK,CAAC,SAAS;;;;;;;;wBAQ5D,KAAK,CAAC,WAAW,gBAAgB,KAAK,CAAC,SAAS;;;;;UAK9D,KAAK,CAAC,SAAS;2BACE,KAAK,CAAC,SAAS;;wBAElB,KAAK,CAAC,UAAU,kBAAkB,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;wBACnG,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,0BAA0B,KAAK,CAAC,UAAU;;wBAE3I,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,UAAU;;;;;;;;;;SAUhE,KAAK,CAAC,UAAU;;YAEb,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;eAChC,KAAK,CAAC,UAAU,QAAQ,KAAK,CAAC,UAAU;kBACrC,KAAK,CAAC,UAAU,WAAW,KAAK,CAAC,UAAU;;;;UAInD,KAAK,CAAC,UAAU;;;;;kBAKR,KAAK,CAAC,UAAU,iBAAiB,KAAK,CAAC,UAAU;+BACpC,KAAK,CAAC,UAAU;;0BAErB,KAAK,CAAC,UAAU,iCAAiC,KAAK,CAAC,UAAU;;;;CAI1F,CAAC;AACF,CAAC"}
|