@akanjs/cli 0.0.142 → 0.0.144
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/cjs/index.js +2437 -3204
- package/cjs/src/guidelines/___library/sharedUiStructureDescription.en.md +786 -0
- package/cjs/src/guidelines/___library/utilUiStructureDescription.en.md +395 -0
- package/cjs/src/guidelines/___lint/lintRuleDescription.en.md +64 -0
- package/cjs/src/guidelines/___module/moduleStructureDescription.en.md +80 -0
- package/cjs/src/guidelines/componentRule/componentRule.instruction.md +732 -0
- package/cjs/src/guidelines/databaseModule/databaseModule.instruction.md +691 -0
- package/cjs/src/guidelines/enumConstant/enumConstant.instruction.md +232 -0
- package/cjs/src/guidelines/fieldDecorator/fieldDecorator.instruction.md +611 -0
- package/cjs/src/guidelines/framework/framework.instruction.md +1112 -0
- package/cjs/src/guidelines/modelConstant/modelConstant.instruction.md +958 -0
- package/cjs/src/guidelines/modelDictionary/modelDictionary.instruction.md +583 -0
- package/cjs/src/guidelines/modelDocument/modelDocument.instruction.md +683 -0
- package/cjs/src/guidelines/modelService/modelService.instruction.md +935 -0
- package/cjs/src/guidelines/modelSignal/modelSignal.instruction.md +588 -0
- package/cjs/src/guidelines/modelStore/modelStore.instruction.md +591 -0
- package/cjs/src/guidelines/modelTemplate/modelTemplate.instruction.md +577 -0
- package/cjs/src/guidelines/modelUnit/modelUnit.instruction.md +833 -0
- package/cjs/src/guidelines/modelUtil/modelUtil.instruction.md +752 -0
- package/cjs/src/guidelines/modelView/modelView.instruction.md +1005 -0
- package/cjs/src/guidelines/modelZone/modelZone.instruction.md +528 -0
- package/cjs/src/guidelines/scalarConstant/scalarConstant.instruction.md +489 -0
- package/cjs/src/guidelines/scalarDictionary/scalarDictionary.instruction.md +347 -0
- package/cjs/src/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +318 -0
- package/cjs/src/guidelines/utilUiUsage/utilUiUsage.instruction.md +339 -0
- package/cjs/src/templates/module/__model__.dictionary.js +4 -5
- package/esm/index.js +2524 -3286
- package/esm/src/guidelines/___library/sharedUiStructureDescription.en.md +786 -0
- package/esm/src/guidelines/___library/utilUiStructureDescription.en.md +395 -0
- package/esm/src/guidelines/___lint/lintRuleDescription.en.md +64 -0
- package/esm/src/guidelines/___module/moduleStructureDescription.en.md +80 -0
- package/esm/src/guidelines/componentRule/componentRule.instruction.md +732 -0
- package/esm/src/guidelines/databaseModule/databaseModule.instruction.md +691 -0
- package/esm/src/guidelines/enumConstant/enumConstant.instruction.md +232 -0
- package/esm/src/guidelines/fieldDecorator/fieldDecorator.instruction.md +611 -0
- package/esm/src/guidelines/framework/framework.instruction.md +1112 -0
- package/esm/src/guidelines/modelConstant/modelConstant.instruction.md +958 -0
- package/esm/src/guidelines/modelDictionary/modelDictionary.instruction.md +583 -0
- package/esm/src/guidelines/modelDocument/modelDocument.instruction.md +683 -0
- package/esm/src/guidelines/modelService/modelService.instruction.md +935 -0
- package/esm/src/guidelines/modelSignal/modelSignal.instruction.md +588 -0
- package/esm/src/guidelines/modelStore/modelStore.instruction.md +591 -0
- package/esm/src/guidelines/modelTemplate/modelTemplate.instruction.md +577 -0
- package/esm/src/guidelines/modelUnit/modelUnit.instruction.md +833 -0
- package/esm/src/guidelines/modelUtil/modelUtil.instruction.md +752 -0
- package/esm/src/guidelines/modelView/modelView.instruction.md +1005 -0
- package/esm/src/guidelines/modelZone/modelZone.instruction.md +528 -0
- package/esm/src/guidelines/scalarConstant/scalarConstant.instruction.md +489 -0
- package/esm/src/guidelines/scalarDictionary/scalarDictionary.instruction.md +347 -0
- package/esm/src/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +318 -0
- package/esm/src/guidelines/utilUiUsage/utilUiUsage.instruction.md +339 -0
- package/esm/src/templates/module/__model__.dictionary.js +4 -5
- package/package.json +3 -1
- package/src/guideline/guideline.command.d.ts +7 -0
- package/src/guideline/guideline.prompt.d.ts +15 -0
- package/src/guideline/guideline.runner.d.ts +5 -0
- package/src/guideline/guideline.script.d.ts +6 -0
- package/src/guidelines/___library/sharedUiStructureDescription.en.md +786 -0
- package/src/guidelines/___library/utilUiStructureDescription.en.md +395 -0
- package/src/guidelines/___lint/lintRuleDescription.en.md +64 -0
- package/src/guidelines/___module/moduleStructureDescription.en.md +80 -0
- package/src/guidelines/componentRule/componentRule.instruction.md +732 -0
- package/src/guidelines/databaseModule/databaseModule.instruction.md +691 -0
- package/src/guidelines/enumConstant/enumConstant.instruction.md +232 -0
- package/src/guidelines/fieldDecorator/fieldDecorator.instruction.md +611 -0
- package/src/guidelines/framework/framework.instruction.md +1112 -0
- package/src/guidelines/modelConstant/modelConstant.instruction.md +958 -0
- package/src/guidelines/modelDictionary/modelDictionary.instruction.md +583 -0
- package/src/guidelines/modelDocument/modelDocument.instruction.md +683 -0
- package/src/guidelines/modelService/modelService.instruction.md +935 -0
- package/src/guidelines/modelSignal/modelSignal.instruction.md +588 -0
- package/src/guidelines/modelStore/modelStore.instruction.md +591 -0
- package/src/guidelines/modelTemplate/modelTemplate.instruction.md +577 -0
- package/src/guidelines/modelUnit/modelUnit.instruction.md +833 -0
- package/src/guidelines/modelUtil/modelUtil.instruction.md +752 -0
- package/src/guidelines/modelView/modelView.instruction.md +1005 -0
- package/src/guidelines/modelZone/modelZone.instruction.md +528 -0
- package/src/guidelines/scalarConstant/scalarConstant.instruction.md +489 -0
- package/src/guidelines/scalarDictionary/scalarDictionary.instruction.md +347 -0
- package/src/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +318 -0
- package/src/guidelines/utilUiUsage/utilUiUsage.instruction.md +339 -0
- package/src/module/module.command.d.ts +6 -8
- package/src/module/module.prompt.d.ts +2 -15
- package/src/module/module.request.d.ts +22 -18
- package/src/module/module.runner.d.ts +4 -20
- package/src/module/module.script.d.ts +6 -7
- package/src/scalar/scalar.command.d.ts +7 -0
- package/src/scalar/scalar.prompt.d.ts +23 -0
- package/src/scalar/scalar.runner.d.ts +13 -0
- package/src/scalar/scalar.script.d.ts +6 -0
- package/cjs/src/templates/app/app/[lang]/(__appName__)/(public)/forgotpassword/page.js +0 -47
- package/cjs/src/templates/app/app/[lang]/(__appName__)/(public)/page.js +0 -128
- package/cjs/src/templates/app/app/[lang]/(__appName__)/(public)/privacy/page.js +0 -42
- package/cjs/src/templates/app/app/[lang]/(__appName__)/(public)/signin/page.js +0 -50
- package/cjs/src/templates/app/app/[lang]/(__appName__)/(public)/termsofservice/page.js +0 -41
- package/cjs/src/templates/app/app/[lang]/(__appName__)/(public)/unknown/page.js +0 -51
- package/cjs/src/templates/app/app/[lang]/(__appName__)/(user)/layout.js +0 -43
- package/cjs/src/templates/app/app/[lang]/(__appName__)/(user)/self/page.js +0 -60
- package/cjs/src/templates/app/app/[lang]/(__appName__)/layout.js +0 -54
- package/cjs/src/templates/app/app/[lang]/(__appName__)/styles.css.template +0 -19
- package/cjs/src/templates/app/app/[lang]/admin/layout.js +0 -54
- package/cjs/src/templates/app/app/[lang]/admin/page.js +0 -63
- package/cjs/src/templates/app/app/csr.js +0 -34
- package/cjs/src/templates/app/app/index.html.template +0 -13
- package/cjs/src/templates/app/app/layout.js +0 -38
- package/cjs/src/templates/app/capacitor.config.ts.template +0 -8
- package/cjs/src/templates/app/env/env.client.debug.ts.template +0 -7
- package/cjs/src/templates/app/env/env.client.develop.ts.template +0 -7
- package/cjs/src/templates/app/env/env.client.local.ts.template +0 -7
- package/cjs/src/templates/app/env/env.client.main.ts.template +0 -7
- package/cjs/src/templates/app/env/env.client.testing.ts.template +0 -7
- package/cjs/src/templates/app/env/env.server.debug.ts.template +0 -15
- package/cjs/src/templates/app/env/env.server.develop.ts.template +0 -15
- package/cjs/src/templates/app/env/env.server.local.ts.template +0 -15
- package/cjs/src/templates/app/env/env.server.main.ts.template +0 -15
- package/cjs/src/templates/app/env/env.server.testing.ts.template +0 -7
- package/cjs/src/templates/app/lib/setting/Setting.Template.js +0 -57
- package/cjs/src/templates/app/lib/setting/Setting.Unit.js +0 -38
- package/cjs/src/templates/app/lib/setting/Setting.Util.js +0 -34
- package/cjs/src/templates/app/lib/setting/Setting.View.js +0 -51
- package/cjs/src/templates/app/lib/setting/Setting.Zone.js +0 -80
- package/cjs/src/templates/app/lib/setting/index.js +0 -61
- package/cjs/src/templates/app/lib/summary/Summary.Template.js +0 -43
- package/cjs/src/templates/app/lib/summary/Summary.Unit.js +0 -38
- package/cjs/src/templates/app/lib/summary/Summary.Util.js +0 -33
- package/cjs/src/templates/app/lib/summary/Summary.View.js +0 -51
- package/cjs/src/templates/app/lib/summary/Summary.Zone.js +0 -62
- package/cjs/src/templates/app/lib/summary/index.js +0 -67
- package/cjs/src/templates/app/lib/user/User.Template.js +0 -65
- package/cjs/src/templates/app/lib/user/User.Unit.js +0 -38
- package/cjs/src/templates/app/lib/user/User.Util.js +0 -94
- package/cjs/src/templates/app/lib/user/User.View.js +0 -66
- package/cjs/src/templates/app/lib/user/User.Zone.js +0 -74
- package/cjs/src/templates/app/lib/user/index.js +0 -61
- package/cjs/src/templates/app/page.test.ts.template +0 -10
- package/cjs/src/templates/app/playwright.config.ts.template +0 -6
- package/cjs/src/templates/app/postcss.config.js.template +0 -10
- package/cjs/src/templates/app/public/manifest.json.template +0 -67
- package/cjs/src/templates/app/tsconfig.json.template +0 -22
- package/cjs/src/templates/app/tsconfig.spec.json.template +0 -7
- package/cjs/src/templates/app/ui/Footer.js +0 -67
- package/cjs/src/templates/app/ui/MainHeader.js +0 -131
- package/cjs/src/templates/crudPages/[__model__Id]/edit/page.js +0 -73
- package/cjs/src/templates/crudPages/[__model__Id]/page.js +0 -83
- package/cjs/src/templates/crudPages/new/page.js +0 -70
- package/cjs/src/templates/crudPages/page.js +0 -71
- package/cjs/src/templates/libRoot/.gitignore.template +0 -15
- package/cjs/src/templates/libRoot/env/env.server.example.ts.template +0 -7
- package/cjs/src/templates/libRoot/env/env.server.testing.ts.template +0 -7
- package/cjs/src/templates/libRoot/lib/setting/Setting.Template.js +0 -57
- package/cjs/src/templates/libRoot/lib/setting/Setting.Unit.js +0 -38
- package/cjs/src/templates/libRoot/lib/setting/Setting.Util.js +0 -34
- package/cjs/src/templates/libRoot/lib/setting/Setting.View.js +0 -51
- package/cjs/src/templates/libRoot/lib/setting/Setting.Zone.js +0 -80
- package/cjs/src/templates/libRoot/lib/setting/index.js +0 -61
- package/cjs/src/templates/libRoot/lib/summary/Summary.Template.js +0 -43
- package/cjs/src/templates/libRoot/lib/summary/Summary.Unit.js +0 -38
- package/cjs/src/templates/libRoot/lib/summary/Summary.Util.js +0 -33
- package/cjs/src/templates/libRoot/lib/summary/Summary.View.js +0 -51
- package/cjs/src/templates/libRoot/lib/summary/Summary.Zone.js +0 -62
- package/cjs/src/templates/libRoot/lib/summary/index.js +0 -67
- package/cjs/src/templates/libRoot/lib/user/User.Template.js +0 -65
- package/cjs/src/templates/libRoot/lib/user/User.Unit.js +0 -38
- package/cjs/src/templates/libRoot/lib/user/User.Util.js +0 -94
- package/cjs/src/templates/libRoot/lib/user/User.View.js +0 -66
- package/cjs/src/templates/libRoot/lib/user/User.Zone.js +0 -74
- package/cjs/src/templates/libRoot/lib/user/index.js +0 -61
- package/cjs/src/templates/libRoot/package.json.template +0 -4
- package/cjs/src/templates/libRoot/tsconfig.json.template +0 -13
- package/cjs/src/templates/libRoot/tsconfig.spec.json.template +0 -7
- package/cjs/src/templates/localDev/docker-compose.yaml.template +0 -36
- package/cjs/src/templates/module/__Model__.Template.js +0 -54
- package/cjs/src/templates/module/__Model__.Unit.js +0 -42
- package/cjs/src/templates/module/__Model__.Util.js +0 -70
- package/cjs/src/templates/module/__Model__.View.js +0 -48
- package/cjs/src/templates/module/__Model__.Zone.js +0 -83
- package/cjs/src/templates/module/index.js +0 -61
- package/cjs/src/templates/pkgRoot/tsconfig.json.template +0 -15
- package/cjs/src/templates/workspaceRoot/.env.template +0 -20
- package/cjs/src/templates/workspaceRoot/.gitignore.template +0 -118
- package/cjs/src/templates/workspaceRoot/.prettierignore.template +0 -10
- package/cjs/src/templates/workspaceRoot/.prettierrc.json.template +0 -6
- package/cjs/src/templates/workspaceRoot/.swcrc.template +0 -9
- package/cjs/src/templates/workspaceRoot/.vscode/settings.json.template +0 -13
- package/cjs/src/templates/workspaceRoot/README.md.template +0 -37
- package/cjs/src/templates/workspaceRoot/eslint.config.ts.template +0 -3
- package/cjs/src/templates/workspaceRoot/package.json.template +0 -43
- package/cjs/src/templates/workspaceRoot/tsconfig.json.template +0 -29
- package/esm/src/templates/app/app/[lang]/(__appName__)/(public)/forgotpassword/page.js +0 -27
- package/esm/src/templates/app/app/[lang]/(__appName__)/(public)/page.js +0 -108
- package/esm/src/templates/app/app/[lang]/(__appName__)/(public)/privacy/page.js +0 -22
- package/esm/src/templates/app/app/[lang]/(__appName__)/(public)/signin/page.js +0 -30
- package/esm/src/templates/app/app/[lang]/(__appName__)/(public)/termsofservice/page.js +0 -21
- package/esm/src/templates/app/app/[lang]/(__appName__)/(public)/unknown/page.js +0 -31
- package/esm/src/templates/app/app/[lang]/(__appName__)/(user)/layout.js +0 -23
- package/esm/src/templates/app/app/[lang]/(__appName__)/(user)/self/page.js +0 -40
- package/esm/src/templates/app/app/[lang]/(__appName__)/layout.js +0 -34
- package/esm/src/templates/app/app/[lang]/(__appName__)/styles.css.template +0 -19
- package/esm/src/templates/app/app/[lang]/admin/layout.js +0 -34
- package/esm/src/templates/app/app/[lang]/admin/page.js +0 -43
- package/esm/src/templates/app/app/csr.js +0 -14
- package/esm/src/templates/app/app/index.html.template +0 -13
- package/esm/src/templates/app/app/layout.js +0 -18
- package/esm/src/templates/app/capacitor.config.ts.template +0 -8
- package/esm/src/templates/app/env/env.client.debug.ts.template +0 -7
- package/esm/src/templates/app/env/env.client.develop.ts.template +0 -7
- package/esm/src/templates/app/env/env.client.local.ts.template +0 -7
- package/esm/src/templates/app/env/env.client.main.ts.template +0 -7
- package/esm/src/templates/app/env/env.client.testing.ts.template +0 -7
- package/esm/src/templates/app/env/env.server.debug.ts.template +0 -15
- package/esm/src/templates/app/env/env.server.develop.ts.template +0 -15
- package/esm/src/templates/app/env/env.server.local.ts.template +0 -15
- package/esm/src/templates/app/env/env.server.main.ts.template +0 -15
- package/esm/src/templates/app/env/env.server.testing.ts.template +0 -7
- package/esm/src/templates/app/lib/setting/Setting.Template.js +0 -37
- package/esm/src/templates/app/lib/setting/Setting.Unit.js +0 -18
- package/esm/src/templates/app/lib/setting/Setting.Util.js +0 -14
- package/esm/src/templates/app/lib/setting/Setting.View.js +0 -31
- package/esm/src/templates/app/lib/setting/Setting.Zone.js +0 -60
- package/esm/src/templates/app/lib/setting/index.js +0 -41
- package/esm/src/templates/app/lib/summary/Summary.Template.js +0 -23
- package/esm/src/templates/app/lib/summary/Summary.Unit.js +0 -18
- package/esm/src/templates/app/lib/summary/Summary.Util.js +0 -13
- package/esm/src/templates/app/lib/summary/Summary.View.js +0 -31
- package/esm/src/templates/app/lib/summary/Summary.Zone.js +0 -42
- package/esm/src/templates/app/lib/summary/index.js +0 -47
- package/esm/src/templates/app/lib/user/User.Template.js +0 -45
- package/esm/src/templates/app/lib/user/User.Unit.js +0 -18
- package/esm/src/templates/app/lib/user/User.Util.js +0 -74
- package/esm/src/templates/app/lib/user/User.View.js +0 -46
- package/esm/src/templates/app/lib/user/User.Zone.js +0 -54
- package/esm/src/templates/app/lib/user/index.js +0 -41
- package/esm/src/templates/app/page.test.ts.template +0 -10
- package/esm/src/templates/app/playwright.config.ts.template +0 -6
- package/esm/src/templates/app/postcss.config.js.template +0 -10
- package/esm/src/templates/app/public/manifest.json.template +0 -67
- package/esm/src/templates/app/tsconfig.json.template +0 -22
- package/esm/src/templates/app/tsconfig.spec.json.template +0 -7
- package/esm/src/templates/app/ui/Footer.js +0 -47
- package/esm/src/templates/app/ui/MainHeader.js +0 -111
- package/esm/src/templates/crudPages/[__model__Id]/edit/page.js +0 -53
- package/esm/src/templates/crudPages/[__model__Id]/page.js +0 -63
- package/esm/src/templates/crudPages/new/page.js +0 -50
- package/esm/src/templates/crudPages/page.js +0 -51
- package/esm/src/templates/libRoot/.gitignore.template +0 -15
- package/esm/src/templates/libRoot/env/env.server.example.ts.template +0 -7
- package/esm/src/templates/libRoot/env/env.server.testing.ts.template +0 -7
- package/esm/src/templates/libRoot/lib/setting/Setting.Template.js +0 -37
- package/esm/src/templates/libRoot/lib/setting/Setting.Unit.js +0 -18
- package/esm/src/templates/libRoot/lib/setting/Setting.Util.js +0 -14
- package/esm/src/templates/libRoot/lib/setting/Setting.View.js +0 -31
- package/esm/src/templates/libRoot/lib/setting/Setting.Zone.js +0 -60
- package/esm/src/templates/libRoot/lib/setting/index.js +0 -41
- package/esm/src/templates/libRoot/lib/summary/Summary.Template.js +0 -23
- package/esm/src/templates/libRoot/lib/summary/Summary.Unit.js +0 -18
- package/esm/src/templates/libRoot/lib/summary/Summary.Util.js +0 -13
- package/esm/src/templates/libRoot/lib/summary/Summary.View.js +0 -31
- package/esm/src/templates/libRoot/lib/summary/Summary.Zone.js +0 -42
- package/esm/src/templates/libRoot/lib/summary/index.js +0 -47
- package/esm/src/templates/libRoot/lib/user/User.Template.js +0 -45
- package/esm/src/templates/libRoot/lib/user/User.Unit.js +0 -18
- package/esm/src/templates/libRoot/lib/user/User.Util.js +0 -74
- package/esm/src/templates/libRoot/lib/user/User.View.js +0 -46
- package/esm/src/templates/libRoot/lib/user/User.Zone.js +0 -54
- package/esm/src/templates/libRoot/lib/user/index.js +0 -41
- package/esm/src/templates/libRoot/package.json.template +0 -4
- package/esm/src/templates/libRoot/tsconfig.json.template +0 -13
- package/esm/src/templates/libRoot/tsconfig.spec.json.template +0 -7
- package/esm/src/templates/localDev/docker-compose.yaml.template +0 -36
- package/esm/src/templates/module/__Model__.Template.js +0 -34
- package/esm/src/templates/module/__Model__.Unit.js +0 -22
- package/esm/src/templates/module/__Model__.Util.js +0 -50
- package/esm/src/templates/module/__Model__.View.js +0 -28
- package/esm/src/templates/module/__Model__.Zone.js +0 -63
- package/esm/src/templates/module/index.js +0 -41
- package/esm/src/templates/pkgRoot/tsconfig.json.template +0 -15
- package/esm/src/templates/workspaceRoot/.env.template +0 -20
- package/esm/src/templates/workspaceRoot/.gitignore.template +0 -118
- package/esm/src/templates/workspaceRoot/.prettierignore.template +0 -10
- package/esm/src/templates/workspaceRoot/.prettierrc.json.template +0 -6
- package/esm/src/templates/workspaceRoot/.swcrc.template +0 -9
- package/esm/src/templates/workspaceRoot/.vscode/settings.json.template +0 -13
- package/esm/src/templates/workspaceRoot/README.md.template +0 -37
- package/esm/src/templates/workspaceRoot/eslint.config.ts.template +0 -3
- package/esm/src/templates/workspaceRoot/package.json.template +0 -43
- package/esm/src/templates/workspaceRoot/tsconfig.json.template +0 -29
- package/src/application/application.prompt.d.ts +0 -2
- package/src/templates/app/app/[lang]/(__appName__)/(public)/forgotpassword/page.d.ts +0 -9
- package/src/templates/app/app/[lang]/(__appName__)/(public)/page.d.ts +0 -9
- package/src/templates/app/app/[lang]/(__appName__)/(public)/privacy/page.d.ts +0 -9
- package/src/templates/app/app/[lang]/(__appName__)/(public)/signin/page.d.ts +0 -9
- package/src/templates/app/app/[lang]/(__appName__)/(public)/termsofservice/page.d.ts +0 -10
- package/src/templates/app/app/[lang]/(__appName__)/(public)/unknown/page.d.ts +0 -9
- package/src/templates/app/app/[lang]/(__appName__)/(user)/layout.d.ts +0 -9
- package/src/templates/app/app/[lang]/(__appName__)/(user)/self/page.d.ts +0 -9
- package/src/templates/app/app/[lang]/(__appName__)/layout.d.ts +0 -9
- package/src/templates/app/app/[lang]/admin/layout.d.ts +0 -9
- package/src/templates/app/app/[lang]/admin/page.d.ts +0 -9
- package/src/templates/app/app/csr.d.ts +0 -9
- package/src/templates/app/app/layout.d.ts +0 -9
- package/src/templates/app/lib/setting/Setting.Template.d.ts +0 -9
- package/src/templates/app/lib/setting/Setting.Unit.d.ts +0 -9
- package/src/templates/app/lib/setting/Setting.Util.d.ts +0 -9
- package/src/templates/app/lib/setting/Setting.View.d.ts +0 -9
- package/src/templates/app/lib/setting/Setting.Zone.d.ts +0 -9
- package/src/templates/app/lib/setting/index.d.ts +0 -9
- package/src/templates/app/lib/summary/Summary.Template.d.ts +0 -9
- package/src/templates/app/lib/summary/Summary.Unit.d.ts +0 -9
- package/src/templates/app/lib/summary/Summary.Util.d.ts +0 -9
- package/src/templates/app/lib/summary/Summary.View.d.ts +0 -9
- package/src/templates/app/lib/summary/Summary.Zone.d.ts +0 -9
- package/src/templates/app/lib/summary/index.d.ts +0 -9
- package/src/templates/app/lib/user/User.Template.d.ts +0 -9
- package/src/templates/app/lib/user/User.Unit.d.ts +0 -9
- package/src/templates/app/lib/user/User.Util.d.ts +0 -9
- package/src/templates/app/lib/user/User.View.d.ts +0 -9
- package/src/templates/app/lib/user/User.Zone.d.ts +0 -9
- package/src/templates/app/lib/user/index.d.ts +0 -9
- package/src/templates/app/ui/Footer.d.ts +0 -9
- package/src/templates/app/ui/MainHeader.d.ts +0 -10
- package/src/templates/crudPages/[__model__Id]/edit/page.d.ts +0 -11
- package/src/templates/crudPages/[__model__Id]/page.d.ts +0 -11
- package/src/templates/crudPages/new/page.d.ts +0 -11
- package/src/templates/crudPages/page.d.ts +0 -11
- package/src/templates/libRoot/lib/setting/Setting.Template.d.ts +0 -9
- package/src/templates/libRoot/lib/setting/Setting.Unit.d.ts +0 -9
- package/src/templates/libRoot/lib/setting/Setting.Util.d.ts +0 -9
- package/src/templates/libRoot/lib/setting/Setting.View.d.ts +0 -9
- package/src/templates/libRoot/lib/setting/Setting.Zone.d.ts +0 -9
- package/src/templates/libRoot/lib/setting/index.d.ts +0 -9
- package/src/templates/libRoot/lib/summary/Summary.Template.d.ts +0 -9
- package/src/templates/libRoot/lib/summary/Summary.Unit.d.ts +0 -9
- package/src/templates/libRoot/lib/summary/Summary.Util.d.ts +0 -9
- package/src/templates/libRoot/lib/summary/Summary.View.d.ts +0 -9
- package/src/templates/libRoot/lib/summary/Summary.Zone.d.ts +0 -9
- package/src/templates/libRoot/lib/summary/index.d.ts +0 -9
- package/src/templates/libRoot/lib/user/User.Template.d.ts +0 -9
- package/src/templates/libRoot/lib/user/User.Unit.d.ts +0 -9
- package/src/templates/libRoot/lib/user/User.Util.d.ts +0 -9
- package/src/templates/libRoot/lib/user/User.View.d.ts +0 -9
- package/src/templates/libRoot/lib/user/User.Zone.d.ts +0 -9
- package/src/templates/libRoot/lib/user/index.d.ts +0 -9
- package/src/templates/module/__Model__.Template.d.ts +0 -11
- package/src/templates/module/__Model__.Unit.d.ts +0 -11
- package/src/templates/module/__Model__.Util.d.ts +0 -11
- package/src/templates/module/__Model__.View.d.ts +0 -11
- package/src/templates/module/__Model__.Zone.d.ts +0 -11
- package/src/templates/module/index.d.ts +0 -11
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
# Model.Template.tsx Implementation Guide
|
|
2
|
+
|
|
3
|
+
## Purpose and Role of Model.Template.tsx Files
|
|
4
|
+
|
|
5
|
+
Model.Template.tsx files are client-side React components that define the form structure for creating/editing models in Akan.js applications. They serve as:
|
|
6
|
+
|
|
7
|
+
1. **Form Blueprints**: Provide reusable form structures for model CRUD operations
|
|
8
|
+
2. **State Management**: Connect form inputs to Zustand store slices
|
|
9
|
+
3. **Validation**: Implement field-level validation rules
|
|
10
|
+
4. **UI Consistency**: Ensure uniform form design across the application
|
|
11
|
+
5. **Type Safety**: Enforce data types based on Model.Constant definitions
|
|
12
|
+
6. **Internationalization**: Support multi-language form fields with dictionary integration
|
|
13
|
+
|
|
14
|
+
## File Location and Naming Convention
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
libs/[domain]/lib/[model]/[Model].Template.tsx
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
For example:
|
|
21
|
+
|
|
22
|
+
- `libs/shared/lib/admin/Admin.Template.tsx`
|
|
23
|
+
- `apps/akamir/lib/rewardRequest/RewardRequest.Template.tsx`
|
|
24
|
+
|
|
25
|
+
The file should export one or more named components, typically including:
|
|
26
|
+
|
|
27
|
+
- `General`: Main form template used in most scenarios
|
|
28
|
+
- `Advanced`: Optional complex fields for advanced forms
|
|
29
|
+
- `Compact`: Simplified version for inline editing or mobile views
|
|
30
|
+
|
|
31
|
+
## Creating Model.Template.tsx Files
|
|
32
|
+
|
|
33
|
+
### Basic Structure
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
// File: libs/[domain]/lib/[model]/[Model].Template.tsx
|
|
37
|
+
"use client";
|
|
38
|
+
import { Field } from "@akanjs/client";
|
|
39
|
+
import { cnst } from "@[project]/constant";
|
|
40
|
+
import { st } from "@[project]/client";
|
|
41
|
+
import { usePage } from "@[project]/lib/usePage";
|
|
42
|
+
|
|
43
|
+
export const General = ({ id }: { id?: string }) => {
|
|
44
|
+
const form = st.use.[model]Form(); // e.g., st.use.adminForm()
|
|
45
|
+
const { l } = usePage();
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
|
49
|
+
<Field.Text
|
|
50
|
+
label={l.field.name}
|
|
51
|
+
value={form.name}
|
|
52
|
+
onChange={(v) => st.do.setNameOn[Model](v)}
|
|
53
|
+
required
|
|
54
|
+
maxLength={30}
|
|
55
|
+
/>
|
|
56
|
+
|
|
57
|
+
<Field.Select
|
|
58
|
+
label={l.field.status}
|
|
59
|
+
value={form.status}
|
|
60
|
+
options={cnst.[Model]Status.options}
|
|
61
|
+
onChange={(v) => st.do.setStatusOn[Model](v)}
|
|
62
|
+
/>
|
|
63
|
+
|
|
64
|
+
{/* Add other fields */}
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Integration with Store State
|
|
71
|
+
|
|
72
|
+
Model.Template components connect to Zustand store slices that follow a consistent pattern:
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
// Form state (defined in model.store.ts)
|
|
76
|
+
interface [Model]State {
|
|
77
|
+
[model]Form: cnst.[Model]Input;
|
|
78
|
+
// other state properties...
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Form actions (defined in model.store.ts)
|
|
82
|
+
interface [Model]Action {
|
|
83
|
+
setNameOn[Model]: (name: string) => void;
|
|
84
|
+
setStatusOn[Model]: (status: cnst.[Model]Status) => void;
|
|
85
|
+
// other actions...
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// In Template component
|
|
89
|
+
const form = st.use.[model]Form();
|
|
90
|
+
const { setNameOn[Model] } = st.do;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Field Types and Components
|
|
94
|
+
|
|
95
|
+
Akan.js provides a comprehensive set of form field components in the `Field` namespace:
|
|
96
|
+
|
|
97
|
+
```tsx
|
|
98
|
+
<Field.Text /> // Text input
|
|
99
|
+
<Field.Textarea /> // Multi-line text
|
|
100
|
+
<Field.Number /> // Numeric input
|
|
101
|
+
<Field.Select /> // Dropdown selection
|
|
102
|
+
<Field.Checkbox /> // Toggle input
|
|
103
|
+
<Field.Date /> // Date picker
|
|
104
|
+
<Field.File /> // File upload
|
|
105
|
+
<Field.Image /> // Image upload with preview
|
|
106
|
+
<Field.Radio /> // Radio button group
|
|
107
|
+
<Field.Switch /> // Toggle switch
|
|
108
|
+
<Field.Tags /> // Tag input
|
|
109
|
+
<Field.Time /> // Time picker
|
|
110
|
+
<Field.Color /> // Color picker
|
|
111
|
+
<Field.Autocomplete /> // Text input with suggestions
|
|
112
|
+
<Field.MultiSelect /> // Multi-value selection
|
|
113
|
+
<Field.RichText /> // Rich text editor
|
|
114
|
+
<Field.CodeEditor /> // Code editor
|
|
115
|
+
<Field.Location /> // Map location picker
|
|
116
|
+
<Field.Slider /> // Numeric range slider
|
|
117
|
+
<Field.Password /> // Password input with visibility toggle
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Form Validation
|
|
121
|
+
|
|
122
|
+
Field components support validation through props:
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
<Field.Text
|
|
126
|
+
label="Email"
|
|
127
|
+
value={form.email}
|
|
128
|
+
onChange={(v) => st.do.setEmailOnUser(v)}
|
|
129
|
+
validate={(v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)}
|
|
130
|
+
errorMessage="Invalid email format"
|
|
131
|
+
required
|
|
132
|
+
maxLength={50}
|
|
133
|
+
/>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Common validation options:
|
|
137
|
+
|
|
138
|
+
- `required`: Makes the field required
|
|
139
|
+
- `maxLength`: Maximum character length
|
|
140
|
+
- `minLength`: Minimum character length
|
|
141
|
+
- `min`/`max`: Number range limits
|
|
142
|
+
- `pattern`: Regex pattern for validation
|
|
143
|
+
- `validate`: Custom validation function
|
|
144
|
+
- `errorMessage`: Custom error message
|
|
145
|
+
|
|
146
|
+
### Internationalization
|
|
147
|
+
|
|
148
|
+
Templates should use the `usePage()` hook to access localized strings:
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
const { l } = usePage();
|
|
152
|
+
|
|
153
|
+
<Field.Text
|
|
154
|
+
label={l.field.email}
|
|
155
|
+
placeholder={l.desc.enterEmail}
|
|
156
|
+
// ...
|
|
157
|
+
/>;
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Form Layout Patterns
|
|
161
|
+
|
|
162
|
+
### Basic Grid Layout
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
|
166
|
+
<Field.Text label="First Name" /* ... */ />
|
|
167
|
+
<Field.Text label="Last Name" /* ... */ />
|
|
168
|
+
<Field.Email label="Email" className="md:col-span-2" /* ... */ />
|
|
169
|
+
</div>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Grouped Fields
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
<div className="space-y-6">
|
|
176
|
+
<fieldset className="rounded-md border p-4">
|
|
177
|
+
<legend className="text-lg font-medium">{l.section.personalInfo}</legend>
|
|
178
|
+
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">{/* Personal info fields */}</div>
|
|
179
|
+
</fieldset>
|
|
180
|
+
|
|
181
|
+
<fieldset className="rounded-md border p-4">
|
|
182
|
+
<legend className="text-lg font-medium">{l.section.contactInfo}</legend>
|
|
183
|
+
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">{/* Contact info fields */}</div>
|
|
184
|
+
</fieldset>
|
|
185
|
+
</div>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Conditional Fields
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
{
|
|
192
|
+
form.type === "business" && (
|
|
193
|
+
<>
|
|
194
|
+
<Field.Text label="Company Name" /* ... */ />
|
|
195
|
+
<Field.Text label="Tax ID" /* ... */ />
|
|
196
|
+
</>
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Nested Components
|
|
202
|
+
|
|
203
|
+
Break complex forms into nested components for better organization:
|
|
204
|
+
|
|
205
|
+
```tsx
|
|
206
|
+
export const General = ({ id }: { id?: string }) => {
|
|
207
|
+
// Main form logic
|
|
208
|
+
return (
|
|
209
|
+
<div className="space-y-6">
|
|
210
|
+
<BasicInfo />
|
|
211
|
+
<ContactDetails />
|
|
212
|
+
<Preferences />
|
|
213
|
+
</div>
|
|
214
|
+
);
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const BasicInfo = () => {
|
|
218
|
+
const form = st.use.userForm();
|
|
219
|
+
// Component implementation
|
|
220
|
+
};
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Using Model.Template in Pages
|
|
224
|
+
|
|
225
|
+
### Creation Page
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
// apps/app-name/app/[lang]/[model]/new/page.tsx
|
|
229
|
+
import { Model } from "@shared/ui";
|
|
230
|
+
import { [Model] } from "@[project]/client";
|
|
231
|
+
|
|
232
|
+
export default function NewModelPage() {
|
|
233
|
+
return (
|
|
234
|
+
<Model.Edit
|
|
235
|
+
sliceName="[model]"
|
|
236
|
+
type="form"
|
|
237
|
+
onSubmit="/[model]"
|
|
238
|
+
>
|
|
239
|
+
<[Model].Template.General />
|
|
240
|
+
</Model.Edit>
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Editing Page
|
|
246
|
+
|
|
247
|
+
```tsx
|
|
248
|
+
// apps/app-name/app/[lang]/[model]/[id]/edit/page.tsx
|
|
249
|
+
import { Model } from "@shared/ui";
|
|
250
|
+
import { [Model] } from "@[project]/client";
|
|
251
|
+
|
|
252
|
+
export default function EditModelPage({ params }) {
|
|
253
|
+
return (
|
|
254
|
+
<Model.Edit
|
|
255
|
+
modelId={params.id}
|
|
256
|
+
sliceName="[model]"
|
|
257
|
+
renderTitle={l => l.title.edit[model]}
|
|
258
|
+
>
|
|
259
|
+
<[Model].Template.General id={params.id} />
|
|
260
|
+
</Model.Edit>
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Using Model.Template in Utility Components
|
|
266
|
+
|
|
267
|
+
### In Modal Dialogs
|
|
268
|
+
|
|
269
|
+
```tsx
|
|
270
|
+
// libs/[domain]/lib/[model]/[Model].Util.tsx
|
|
271
|
+
import { Modal, Model } from "@util/ui";
|
|
272
|
+
import { [Model] } from "@[project]/client";
|
|
273
|
+
|
|
274
|
+
export const EditButton = ({ id }: { id: string }) => (
|
|
275
|
+
<>
|
|
276
|
+
<Modal.Open opens={`edit-${id}`}>
|
|
277
|
+
<button>Edit</button>
|
|
278
|
+
</Modal.Open>
|
|
279
|
+
|
|
280
|
+
<Modal.Window name={`edit-${id}`}>
|
|
281
|
+
<Model.Edit
|
|
282
|
+
modelId={id}
|
|
283
|
+
sliceName="[model]"
|
|
284
|
+
>
|
|
285
|
+
<[Model].Template.General id={id} />
|
|
286
|
+
</Model.Edit>
|
|
287
|
+
</Modal.Window>
|
|
288
|
+
</>
|
|
289
|
+
);
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### In Custom Forms
|
|
293
|
+
|
|
294
|
+
```tsx
|
|
295
|
+
// libs/[domain]/lib/[model]/[Model].Util.tsx
|
|
296
|
+
import { st } from "@[project]/client";
|
|
297
|
+
import { [Model] } from "@[project]/client";
|
|
298
|
+
|
|
299
|
+
export const CustomFormSection = () => {
|
|
300
|
+
const form = st.use.[model]Form();
|
|
301
|
+
|
|
302
|
+
return (
|
|
303
|
+
<div>
|
|
304
|
+
<h3>Advanced Settings</h3>
|
|
305
|
+
<[Model].Template.Advanced />
|
|
306
|
+
<button onClick={st.do.submit[model]}>Save</button>
|
|
307
|
+
</div>
|
|
308
|
+
);
|
|
309
|
+
};
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Using Model.Template in Zone Components
|
|
313
|
+
|
|
314
|
+
### List View Creation
|
|
315
|
+
|
|
316
|
+
```tsx
|
|
317
|
+
// libs/[domain]/lib/[model]/[Model].Zone.tsx
|
|
318
|
+
import { Data } from "@shared/ui";
|
|
319
|
+
import { [Model] } from "@[project]/client";
|
|
320
|
+
|
|
321
|
+
export const AdminZone = () => (
|
|
322
|
+
<Data.ListContainer
|
|
323
|
+
renderTemplate={() => <[Model].Template.General />}
|
|
324
|
+
// ...other props
|
|
325
|
+
/>
|
|
326
|
+
);
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Inline Editing
|
|
330
|
+
|
|
331
|
+
```tsx
|
|
332
|
+
// libs/[domain]/lib/[model]/[Model].Zone.tsx
|
|
333
|
+
import { Model } from "@shared/ui";
|
|
334
|
+
import { [Model] } from "@[project]/client";
|
|
335
|
+
|
|
336
|
+
export const InlineEditor = ({ id }: { id: string }) => (
|
|
337
|
+
<Model.EditInline
|
|
338
|
+
modelId={id}
|
|
339
|
+
sliceName="[model]"
|
|
340
|
+
>
|
|
341
|
+
<[Model].Template.Compact id={id} />
|
|
342
|
+
</Model.EditInline>
|
|
343
|
+
);
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
## Best Practices
|
|
347
|
+
|
|
348
|
+
### 1. Component Organization
|
|
349
|
+
|
|
350
|
+
Split complex templates into logical sections:
|
|
351
|
+
|
|
352
|
+
```tsx
|
|
353
|
+
// Recommended structure
|
|
354
|
+
[Model].Template.tsx
|
|
355
|
+
├─ General.tsx // Main form
|
|
356
|
+
├─ Advanced.tsx // Advanced fields
|
|
357
|
+
├─ Compact.tsx // Simplified form
|
|
358
|
+
└─ Sections/ // Form sections
|
|
359
|
+
├─ Basic.tsx
|
|
360
|
+
└─ Metadata.tsx
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### 2. State Management
|
|
364
|
+
|
|
365
|
+
- Use `st.use.[model]Form()` for accessing form state
|
|
366
|
+
- Use `st.do.set[Field]On[Model]()` for updating form fields
|
|
367
|
+
- Perform form initialization in useEffect:
|
|
368
|
+
|
|
369
|
+
```tsx
|
|
370
|
+
useEffect(() => {
|
|
371
|
+
if (id) {
|
|
372
|
+
void sig.[model].get[Model](id).then(data => {
|
|
373
|
+
st.do.set[Model]Form(data.[model]);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Reset form on unmount
|
|
378
|
+
return () => st.do.reset[Model]Form();
|
|
379
|
+
}, [id]);
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### 3. Validation Approaches
|
|
383
|
+
|
|
384
|
+
- **Field-level validation**: Use the `validate` prop on field components
|
|
385
|
+
- **Form-level validation**: Use custom validation logic before submission
|
|
386
|
+
- **Server-side validation**: Always validate in the service layer as well
|
|
387
|
+
|
|
388
|
+
```tsx
|
|
389
|
+
// Form-level validation example
|
|
390
|
+
const handleSubmit = () => {
|
|
391
|
+
const errors = validateForm(form);
|
|
392
|
+
if (Object.keys(errors).length > 0) {
|
|
393
|
+
st.do.setFormErrors(errors);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
st.do.submit[Model]();
|
|
398
|
+
};
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 4. Performance Optimization
|
|
402
|
+
|
|
403
|
+
- Memoize components with `React.memo` for complex forms
|
|
404
|
+
- Use controlled components consistently
|
|
405
|
+
- Debounce input changes for expensive operations:
|
|
406
|
+
|
|
407
|
+
```tsx
|
|
408
|
+
import { useDebounce } from "@[project]/lib/hooks";
|
|
409
|
+
|
|
410
|
+
const debouncedValue = useDebounce(inputValue, 300);
|
|
411
|
+
|
|
412
|
+
useEffect(() => {
|
|
413
|
+
// Perform expensive operation with debouncedValue
|
|
414
|
+
}, [debouncedValue]);
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### 5. Accessibility
|
|
418
|
+
|
|
419
|
+
- Associate labels with inputs using `htmlFor`/`id`
|
|
420
|
+
- Provide ARIA attributes for custom components
|
|
421
|
+
- Ensure keyboard navigation works properly
|
|
422
|
+
- Use semantic HTML elements
|
|
423
|
+
|
|
424
|
+
```tsx
|
|
425
|
+
<label htmlFor="name-field" className="block text-sm font-medium">
|
|
426
|
+
Name
|
|
427
|
+
</label>
|
|
428
|
+
<input
|
|
429
|
+
id="name-field"
|
|
430
|
+
type="text"
|
|
431
|
+
aria-describedby="name-description"
|
|
432
|
+
// ...
|
|
433
|
+
/>
|
|
434
|
+
<p id="name-description" className="text-xs text-gray-500">
|
|
435
|
+
Enter your full name as it appears on your ID
|
|
436
|
+
</p>
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## Common Patterns
|
|
440
|
+
|
|
441
|
+
### Conditional Fields
|
|
442
|
+
|
|
443
|
+
```tsx
|
|
444
|
+
{
|
|
445
|
+
form.type === "advanced" && (
|
|
446
|
+
<Field.Text
|
|
447
|
+
label="Advanced Option"
|
|
448
|
+
value={form.advancedOption}
|
|
449
|
+
onChange={(v) => st.do.setAdvancedOptionOn[Model](v)}
|
|
450
|
+
/>
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### Field Groups
|
|
456
|
+
|
|
457
|
+
```tsx
|
|
458
|
+
const ContactSection = () => {
|
|
459
|
+
const form = st.use.[model]Form();
|
|
460
|
+
const { l } = usePage();
|
|
461
|
+
|
|
462
|
+
return (
|
|
463
|
+
<fieldset className="border p-4">
|
|
464
|
+
<legend>{l.section.contactInfo}</legend>
|
|
465
|
+
<Field.Text label={l.field.email} /* ... */ />
|
|
466
|
+
<Field.Text label={l.field.phone} /* ... */ />
|
|
467
|
+
</fieldset>
|
|
468
|
+
);
|
|
469
|
+
};
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### Custom Field Components
|
|
473
|
+
|
|
474
|
+
```tsx
|
|
475
|
+
const CustomField = ({ label, value, onChange }) => {
|
|
476
|
+
const handleChange = (e) => {
|
|
477
|
+
onChange(e.target.value);
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
return (
|
|
481
|
+
<div className="custom-field">
|
|
482
|
+
<label>{label}</label>
|
|
483
|
+
<input value={value} onChange={handleChange} className="special-input" />
|
|
484
|
+
</div>
|
|
485
|
+
);
|
|
486
|
+
};
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
## Form State Integration with Database Models
|
|
490
|
+
|
|
491
|
+
Templates connect to state that directly corresponds to the model structure defined in `[model].constant.ts`:
|
|
492
|
+
|
|
493
|
+
```tsx
|
|
494
|
+
// In [model].constant.ts
|
|
495
|
+
@Model.Input("[Model]Input")
|
|
496
|
+
export class [Model]Input {
|
|
497
|
+
@Field.Prop(() => String)
|
|
498
|
+
name: string;
|
|
499
|
+
|
|
500
|
+
@Field.Prop(() => String)
|
|
501
|
+
description: string;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// In [Model].Template.tsx
|
|
505
|
+
const form = st.use.[model]Form(); // Type: [Model]Input
|
|
506
|
+
|
|
507
|
+
<Field.Text
|
|
508
|
+
value={form.name}
|
|
509
|
+
onChange={(v) => st.do.setNameOn[Model](v)}
|
|
510
|
+
/>
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
## Troubleshooting
|
|
514
|
+
|
|
515
|
+
### Form Not Updating
|
|
516
|
+
|
|
517
|
+
- Verify Zustand store actions are properly connected
|
|
518
|
+
- Check for conflicting state updates in parent components
|
|
519
|
+
- Ensure `onChange` handlers are updating the correct store slice
|
|
520
|
+
- Verify that the form state is being properly initialized
|
|
521
|
+
|
|
522
|
+
### Validation Issues
|
|
523
|
+
|
|
524
|
+
- Confirm validation regex patterns match server-side rules
|
|
525
|
+
- Check field requirements in `[model].constant.ts`
|
|
526
|
+
- Verify error messages are properly displayed
|
|
527
|
+
- Test edge cases like empty strings and special characters
|
|
528
|
+
|
|
529
|
+
### Performance Problems
|
|
530
|
+
|
|
531
|
+
- Profile re-renders with React DevTools
|
|
532
|
+
- Implement memoization on complex components
|
|
533
|
+
- Consider virtualizing large forms
|
|
534
|
+
- Check for unnecessary re-renders
|
|
535
|
+
|
|
536
|
+
### Type Errors
|
|
537
|
+
|
|
538
|
+
- Ensure `[model].constant.ts` types are up to date
|
|
539
|
+
- Verify FormState interface matches `[Model]Input`
|
|
540
|
+
- Check for correct import paths
|
|
541
|
+
- Validate that prop types match the expected form field types
|
|
542
|
+
|
|
543
|
+
## Integration with API Calls
|
|
544
|
+
|
|
545
|
+
Templates should work with signals and stores to handle form submissions:
|
|
546
|
+
|
|
547
|
+
```tsx
|
|
548
|
+
// In [model].store.ts
|
|
549
|
+
createUser: async () => {
|
|
550
|
+
const { userForm } = get();
|
|
551
|
+
try {
|
|
552
|
+
const user = await sig.user.createUser({ data: userForm });
|
|
553
|
+
set((state) => {
|
|
554
|
+
state.users = [...state.users, user];
|
|
555
|
+
state.userForm = {
|
|
556
|
+
/* reset form */
|
|
557
|
+
};
|
|
558
|
+
});
|
|
559
|
+
return user;
|
|
560
|
+
} catch (error) {
|
|
561
|
+
set((state) => {
|
|
562
|
+
state.formErrors = error.errors || { general: error.message };
|
|
563
|
+
});
|
|
564
|
+
throw error;
|
|
565
|
+
}
|
|
566
|
+
};
|
|
567
|
+
|
|
568
|
+
// In component
|
|
569
|
+
const handleSubmit = async () => {
|
|
570
|
+
try {
|
|
571
|
+
await st.do.createUser();
|
|
572
|
+
// Handle success (navigation, toast, etc.)
|
|
573
|
+
} catch (error) {
|
|
574
|
+
// Error already handled in store
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
```
|