cabloy 5.1.61 → 5.1.62
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/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
- package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
- package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
- package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +2 -0
- package/CHANGELOG.md +42 -0
- package/CLAUDE.md +1 -0
- package/cabloy-docs/.vitepress/config.mjs +158 -12
- package/cabloy-docs/ai/docs-skills-rules-mapping.md +8 -0
- package/cabloy-docs/ai/future-skill-roadmap.md +2 -0
- package/cabloy-docs/ai/skills.md +1 -0
- package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
- package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
- package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
- package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
- package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
- package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
- package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
- package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
- package/cabloy-docs/backend/broadcast-guide.md +3 -3
- package/cabloy-docs/backend/cli.md +20 -11
- package/cabloy-docs/backend/config-guide.md +4 -4
- package/cabloy-docs/backend/controller-aop-guide.md +10 -10
- package/cabloy-docs/backend/controller-guide.md +12 -2
- package/cabloy-docs/backend/crud-workflow.md +7 -3
- package/cabloy-docs/backend/dto-guide.md +12 -2
- package/cabloy-docs/backend/dto-infer-generation.md +201 -25
- package/cabloy-docs/backend/election-guide.md +2 -2
- package/cabloy-docs/backend/entity-guide.md +12 -3
- package/cabloy-docs/backend/error-guide.md +3 -3
- package/cabloy-docs/backend/event-guide.md +4 -4
- package/cabloy-docs/backend/external-aop-guide.md +2 -2
- package/cabloy-docs/backend/field-indexes.md +9 -3
- package/cabloy-docs/backend/foundation.md +8 -8
- package/cabloy-docs/backend/i18n-guide.md +6 -6
- package/cabloy-docs/backend/internal-aop-guide.md +2 -2
- package/cabloy-docs/backend/introduction.md +13 -0
- package/cabloy-docs/backend/migration-and-changes.md +3 -3
- package/cabloy-docs/backend/model-guide.md +16 -6
- package/cabloy-docs/backend/openapi-guide.md +3 -0
- package/cabloy-docs/backend/queue-guide.md +3 -3
- package/cabloy-docs/backend/redlock-guide.md +2 -2
- package/cabloy-docs/backend/schedule-guide.md +2 -2
- package/cabloy-docs/backend/scripts.md +8 -0
- package/cabloy-docs/backend/serialization-guide.md +2 -2
- package/cabloy-docs/backend/service-guide.md +18 -9
- package/cabloy-docs/backend/startup-guide.md +5 -5
- package/cabloy-docs/backend/status-guide.md +7 -7
- package/cabloy-docs/backend/unit-testing.md +3 -3
- package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
- package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
- package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
- package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
- package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
- package/cabloy-docs/frontend/a-router-guide.md +307 -0
- package/cabloy-docs/frontend/api-guide.md +4 -4
- package/cabloy-docs/frontend/api-schema-guide.md +1 -0
- package/cabloy-docs/frontend/app-startup-guide.md +7 -4
- package/cabloy-docs/frontend/bean-scene-authoring.md +1 -1
- package/cabloy-docs/frontend/behavior-guide.md +16 -16
- package/cabloy-docs/frontend/cli.md +5 -5
- package/cabloy-docs/frontend/command-scene-authoring.md +17 -8
- package/cabloy-docs/frontend/component-guide.md +5 -5
- package/cabloy-docs/frontend/component-props-guide.md +1 -1
- package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
- package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
- package/cabloy-docs/frontend/form-guide.md +19 -28
- package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
- package/cabloy-docs/frontend/foundation.md +10 -6
- package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
- package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
- package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
- package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
- package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
- package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
- package/cabloy-docs/frontend/generic-component-guide.md +1 -1
- package/cabloy-docs/frontend/introduction.md +29 -7
- package/cabloy-docs/frontend/model-architecture.md +38 -2
- package/cabloy-docs/frontend/model-resource-cookbook.md +11 -8
- package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
- package/cabloy-docs/frontend/model-resource-owner-pattern.md +22 -2
- package/cabloy-docs/frontend/model-resource-usage-guide.md +22 -6
- package/cabloy-docs/frontend/model-state-guide.md +12 -9
- package/cabloy-docs/frontend/module-scope.md +8 -8
- package/cabloy-docs/frontend/modules-and-suites.md +2 -1
- package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
- package/cabloy-docs/frontend/openapi-sdk-guide.md +12 -4
- package/cabloy-docs/frontend/page-guide.md +9 -9
- package/cabloy-docs/frontend/page-meta-guide.md +466 -0
- package/cabloy-docs/frontend/page-params-guide.md +3 -3
- package/cabloy-docs/frontend/page-query-guide.md +2 -2
- package/cabloy-docs/frontend/page-route-guide.md +6 -0
- package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
- package/cabloy-docs/frontend/quickstart.md +14 -2
- package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
- package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
- package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
- package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
- package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
- package/cabloy-docs/frontend/route-alias-guide.md +6 -0
- package/cabloy-docs/frontend/router-stack-guide.md +229 -0
- package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
- package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
- package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
- package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
- package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
- package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
- package/cabloy-docs/frontend/server-data.md +2 -1
- package/cabloy-docs/frontend/system-startup-guide.md +2 -2
- package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
- package/cabloy-docs/frontend/table-cell-cookbook.md +568 -0
- package/cabloy-docs/frontend/table-guide.md +373 -0
- package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
- package/cabloy-docs/frontend/zova-app-guide.md +251 -0
- package/cabloy-docs/frontend/zova-form-source-reading-map.md +7 -9
- package/cabloy-docs/frontend/zova-form-under-the-hood.md +5 -0
- package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
- package/cabloy-docs/frontend/zova-source-reading-map.md +101 -7
- package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
- package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
- package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
- package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
- package/cabloy-docs/fullstack/contract-loop-playbook.md +8 -2
- package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
- package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +181 -48
- package/cabloy-docs/fullstack/introduction.md +3 -0
- package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -2
- package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
- package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
- package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
- package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +4 -0
- package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +31 -19
- package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +5 -0
- package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +4 -0
- package/cabloy-docs/fullstack/tutorials-overview.md +1 -1
- package/cabloy-docs/reference/bean-scene-boilerplates.md +13 -13
- package/cabloy-docs/reference/package-map.md +4 -3
- package/package.json +1 -1
- package/vona/pnpm-lock.yaml +22 -258
- package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
- package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
- package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
- package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
- package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
- package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
- package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
- package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
- package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
- package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
- package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
- package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
- package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
- package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
- package/vona/src/suite/a-training/package.json +12 -0
- package/vona/src/suite/a-training/tsconfig.base.json +4 -0
- package/vona/src/suite/a-training/tsconfig.json +10 -0
- package/zova/packages-zova/zova/package.json +2 -2
- package/zova/pnpm-lock.yaml +406 -680
- package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/package.json +52 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
- package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
- package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
- package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +51 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
- package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
- package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
- package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
- package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
- package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
- package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
- package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
- package/zova/src/suite/a-training/package.json +12 -0
- package/zova/src/suite/a-training/tsconfig.base.json +4 -0
- package/zova/src/suite/a-training/tsconfig.json +4 -0
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
- package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
- package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
- package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
- package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
- package/zova/src/suite-vendor/a-zova/package.json +2 -2
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { IApiActionOptions } from 'zova-module-a-api';
|
|
2
|
+
|
|
3
|
+
import { Api, BeanApiBase } from 'zova-module-a-api';
|
|
4
|
+
|
|
5
|
+
import type { components, paths } from './openapi/index.js';
|
|
6
|
+
|
|
7
|
+
import { OpenApiBaseURL } from './openapi/index.js';
|
|
8
|
+
|
|
9
|
+
/** TrainingStudent_select */
|
|
10
|
+
export const ApiApiTrainingStudentselectPath = '/api/training/student';
|
|
11
|
+
export type ApiApiTrainingStudentselectPath = '/api/training/student';
|
|
12
|
+
export type ApiApiTrainingStudentselectMethod = 'get';
|
|
13
|
+
export type ApiApiTrainingStudentselectRequestQuery =
|
|
14
|
+
paths[ApiApiTrainingStudentselectPath][ApiApiTrainingStudentselectMethod]['parameters']['query'];
|
|
15
|
+
export type ApiApiTrainingStudentselectResponseBody =
|
|
16
|
+
paths[ApiApiTrainingStudentselectPath][ApiApiTrainingStudentselectMethod]['responses']['200']['content']['application/json']['data'];
|
|
17
|
+
|
|
18
|
+
/** TrainingStudent_create */
|
|
19
|
+
export const ApiApiTrainingStudentcreatePath = '/api/training/student';
|
|
20
|
+
export type ApiApiTrainingStudentcreatePath = '/api/training/student';
|
|
21
|
+
export type ApiApiTrainingStudentcreateMethod = 'post';
|
|
22
|
+
export type ApiApiTrainingStudentcreateRequestBody =
|
|
23
|
+
components['schemas']['training-student.dto.studentCreate'];
|
|
24
|
+
export type ApiApiTrainingStudentcreateResponseBody =
|
|
25
|
+
paths[ApiApiTrainingStudentcreatePath][ApiApiTrainingStudentcreateMethod]['responses']['200']['content']['application/json']['data'];
|
|
26
|
+
|
|
27
|
+
/** TrainingStudent_view */
|
|
28
|
+
export const ApiApiTrainingStudentviewPath = '/api/training/student/{id}';
|
|
29
|
+
export type ApiApiTrainingStudentviewPath = '/api/training/student/{id}';
|
|
30
|
+
export type ApiApiTrainingStudentviewMethod = 'get';
|
|
31
|
+
export type ApiApiTrainingStudentviewRequestParams =
|
|
32
|
+
paths[ApiApiTrainingStudentviewPath][ApiApiTrainingStudentviewMethod]['parameters']['path'];
|
|
33
|
+
export type ApiApiTrainingStudentviewResponseBody =
|
|
34
|
+
paths[ApiApiTrainingStudentviewPath][ApiApiTrainingStudentviewMethod]['responses']['200']['content']['application/json']['data'];
|
|
35
|
+
|
|
36
|
+
/** TrainingStudent_delete */
|
|
37
|
+
export const ApiApiTrainingStudentdeletePath = '/api/training/student/{id}';
|
|
38
|
+
export type ApiApiTrainingStudentdeletePath = '/api/training/student/{id}';
|
|
39
|
+
export type ApiApiTrainingStudentdeleteMethod = 'delete';
|
|
40
|
+
export type ApiApiTrainingStudentdeleteRequestParams =
|
|
41
|
+
paths[ApiApiTrainingStudentdeletePath][ApiApiTrainingStudentdeleteMethod]['parameters']['path'];
|
|
42
|
+
export type ApiApiTrainingStudentdeleteResponseBody =
|
|
43
|
+
paths[ApiApiTrainingStudentdeletePath][ApiApiTrainingStudentdeleteMethod]['responses']['200']['content']['application/json']['data'];
|
|
44
|
+
|
|
45
|
+
/** TrainingStudent_update */
|
|
46
|
+
export const ApiApiTrainingStudentupdatePath = '/api/training/student/{id}';
|
|
47
|
+
export type ApiApiTrainingStudentupdatePath = '/api/training/student/{id}';
|
|
48
|
+
export type ApiApiTrainingStudentupdateMethod = 'patch';
|
|
49
|
+
export type ApiApiTrainingStudentupdateRequestParams =
|
|
50
|
+
paths[ApiApiTrainingStudentupdatePath][ApiApiTrainingStudentupdateMethod]['parameters']['path'];
|
|
51
|
+
export type ApiApiTrainingStudentupdateRequestBody =
|
|
52
|
+
components['schemas']['training-student.dto.studentUpdate'];
|
|
53
|
+
export type ApiApiTrainingStudentupdateResponseBody =
|
|
54
|
+
paths[ApiApiTrainingStudentupdatePath][ApiApiTrainingStudentupdateMethod]['responses']['200']['content']['application/json']['data'];
|
|
55
|
+
|
|
56
|
+
/** TrainingStudent_summary */
|
|
57
|
+
export const ApiApiTrainingStudentsummaryPath = '/api/training/student/summary/{id}';
|
|
58
|
+
export type ApiApiTrainingStudentsummaryPath = '/api/training/student/summary/{id}';
|
|
59
|
+
export type ApiApiTrainingStudentsummaryMethod = 'get';
|
|
60
|
+
export type ApiApiTrainingStudentsummaryRequestParams =
|
|
61
|
+
paths[ApiApiTrainingStudentsummaryPath][ApiApiTrainingStudentsummaryMethod]['parameters']['path'];
|
|
62
|
+
export type ApiApiTrainingStudentsummaryResponseBody =
|
|
63
|
+
paths[ApiApiTrainingStudentsummaryPath][ApiApiTrainingStudentsummaryMethod]['responses']['200']['content']['application/json']['data'];
|
|
64
|
+
|
|
65
|
+
/** TrainingStudent_deleteForce */
|
|
66
|
+
export const ApiApiTrainingStudentdeleteForcePath = '/api/training/student/deleteForce/{id}';
|
|
67
|
+
export type ApiApiTrainingStudentdeleteForcePath = '/api/training/student/deleteForce/{id}';
|
|
68
|
+
export type ApiApiTrainingStudentdeleteForceMethod = 'delete';
|
|
69
|
+
export type ApiApiTrainingStudentdeleteForceRequestParams =
|
|
70
|
+
paths[ApiApiTrainingStudentdeleteForcePath][ApiApiTrainingStudentdeleteForceMethod]['parameters']['path'];
|
|
71
|
+
export type ApiApiTrainingStudentdeleteForceResponseBody =
|
|
72
|
+
paths[ApiApiTrainingStudentdeleteForcePath][ApiApiTrainingStudentdeleteForceMethod]['responses']['200']['content']['application/json']['data'];
|
|
73
|
+
|
|
74
|
+
@Api()
|
|
75
|
+
export class ApiTrainingStudent extends BeanApiBase {
|
|
76
|
+
select(
|
|
77
|
+
options?: {
|
|
78
|
+
query?: ApiApiTrainingStudentselectRequestQuery;
|
|
79
|
+
} & IApiActionOptions,
|
|
80
|
+
) {
|
|
81
|
+
return this.$fetch.get<any, ApiApiTrainingStudentselectResponseBody>(
|
|
82
|
+
ApiApiTrainingStudentselectPath,
|
|
83
|
+
this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
create(body: ApiApiTrainingStudentcreateRequestBody, options?: IApiActionOptions) {
|
|
88
|
+
return this.$fetch.post<any, ApiApiTrainingStudentcreateResponseBody>(
|
|
89
|
+
ApiApiTrainingStudentcreatePath,
|
|
90
|
+
body,
|
|
91
|
+
this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
view(
|
|
96
|
+
options: {
|
|
97
|
+
params: ApiApiTrainingStudentviewRequestParams;
|
|
98
|
+
} & IApiActionOptions,
|
|
99
|
+
) {
|
|
100
|
+
return this.$fetch.get<any, ApiApiTrainingStudentviewResponseBody>(
|
|
101
|
+
this.$pathTranslate(ApiApiTrainingStudentviewPath, options.params),
|
|
102
|
+
this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
delete(
|
|
107
|
+
options: {
|
|
108
|
+
params: ApiApiTrainingStudentdeleteRequestParams;
|
|
109
|
+
} & IApiActionOptions,
|
|
110
|
+
) {
|
|
111
|
+
return this.$fetch.delete<any, ApiApiTrainingStudentdeleteResponseBody>(
|
|
112
|
+
this.$pathTranslate(ApiApiTrainingStudentdeletePath, options.params),
|
|
113
|
+
this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
update(
|
|
118
|
+
body: ApiApiTrainingStudentupdateRequestBody,
|
|
119
|
+
options: {
|
|
120
|
+
params: ApiApiTrainingStudentupdateRequestParams;
|
|
121
|
+
} & IApiActionOptions,
|
|
122
|
+
) {
|
|
123
|
+
return this.$fetch.patch<any, ApiApiTrainingStudentupdateResponseBody>(
|
|
124
|
+
this.$pathTranslate(ApiApiTrainingStudentupdatePath, options.params),
|
|
125
|
+
body,
|
|
126
|
+
this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
summary(
|
|
131
|
+
options: {
|
|
132
|
+
params: ApiApiTrainingStudentsummaryRequestParams;
|
|
133
|
+
} & IApiActionOptions,
|
|
134
|
+
) {
|
|
135
|
+
return this.$fetch.get<any, ApiApiTrainingStudentsummaryResponseBody>(
|
|
136
|
+
this.$pathTranslate(ApiApiTrainingStudentsummaryPath, options.params),
|
|
137
|
+
this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
deleteForce(
|
|
142
|
+
options: {
|
|
143
|
+
params: ApiApiTrainingStudentdeleteForceRequestParams;
|
|
144
|
+
} & IApiActionOptions,
|
|
145
|
+
) {
|
|
146
|
+
return this.$fetch.delete<any, ApiApiTrainingStudentdeleteForceResponseBody>(
|
|
147
|
+
this.$pathTranslate(ApiApiTrainingStudentdeleteForcePath, options.params),
|
|
148
|
+
this.$configPrepare(OpenApiBaseURL(this.sys), options, true),
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BeanBase } from 'zova';
|
|
2
|
+
import { ApiSchema, IApiSchemaOptions } from 'zova-module-a-api';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
ApiApiTrainingStudentselectPath,
|
|
6
|
+
ApiApiTrainingStudentcreatePath,
|
|
7
|
+
ApiApiTrainingStudentviewPath,
|
|
8
|
+
ApiApiTrainingStudentdeletePath,
|
|
9
|
+
ApiApiTrainingStudentupdatePath,
|
|
10
|
+
ApiApiTrainingStudentsummaryPath,
|
|
11
|
+
ApiApiTrainingStudentdeleteForcePath,
|
|
12
|
+
} from '../api/trainingStudent.js';
|
|
13
|
+
|
|
14
|
+
@ApiSchema()
|
|
15
|
+
export class ApiSchemaTrainingStudent extends BeanBase {
|
|
16
|
+
select(options?: IApiSchemaOptions) {
|
|
17
|
+
return this.$sdk.createApiSchemas(ApiApiTrainingStudentselectPath, 'get', options);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
create(options?: IApiSchemaOptions) {
|
|
21
|
+
return this.$sdk.createApiSchemas(ApiApiTrainingStudentcreatePath, 'post', options);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
view(options?: IApiSchemaOptions) {
|
|
25
|
+
return this.$sdk.createApiSchemas(ApiApiTrainingStudentviewPath, 'get', options);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
delete(options?: IApiSchemaOptions) {
|
|
29
|
+
return this.$sdk.createApiSchemas(ApiApiTrainingStudentdeletePath, 'delete', options);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
update(options?: IApiSchemaOptions) {
|
|
33
|
+
return this.$sdk.createApiSchemas(ApiApiTrainingStudentupdatePath, 'patch', options);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
summary(options?: IApiSchemaOptions) {
|
|
37
|
+
return this.$sdk.createApiSchemas(ApiApiTrainingStudentsummaryPath, 'get', options);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
deleteForce(options?: IApiSchemaOptions) {
|
|
41
|
+
return this.$sdk.createApiSchemas(ApiApiTrainingStudentdeleteForcePath, 'delete', options);
|
|
42
|
+
}
|
|
43
|
+
}
|
package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { IResourceTableActionRowOptionsBase } from 'zova-module-a-openapi';
|
|
2
|
+
import type {
|
|
3
|
+
IJsxRenderContextTableCell,
|
|
4
|
+
ITableCellRender,
|
|
5
|
+
NextTableCellRender,
|
|
6
|
+
} from 'zova-module-a-table';
|
|
7
|
+
|
|
8
|
+
import { BeanBase } from 'zova';
|
|
9
|
+
import { TableCell } from 'zova-module-a-table';
|
|
10
|
+
|
|
11
|
+
import type { ModelStudent } from '../model/student.ts';
|
|
12
|
+
|
|
13
|
+
declare module 'zova-module-a-openapi' {
|
|
14
|
+
export interface IResourceTableActionRowRecord {
|
|
15
|
+
'training-student:actionDeleteForce'?: ITableCellOptionsActionDeleteForce;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ITableCellOptionsActionDeleteForce extends IResourceTableActionRowOptionsBase {}
|
|
20
|
+
|
|
21
|
+
@TableCell<ITableCellOptionsActionDeleteForce>({
|
|
22
|
+
class: 'btn btn-outline btn-error join-item',
|
|
23
|
+
})
|
|
24
|
+
export class TableCellActionDeleteForce extends BeanBase implements ITableCellRender {
|
|
25
|
+
render(
|
|
26
|
+
options: ITableCellOptionsActionDeleteForce,
|
|
27
|
+
renderContext: IJsxRenderContextTableCell,
|
|
28
|
+
_next: NextTableCellRender,
|
|
29
|
+
) {
|
|
30
|
+
return (
|
|
31
|
+
<button
|
|
32
|
+
class={options.class}
|
|
33
|
+
type="button"
|
|
34
|
+
onClick={async e => {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
// eslint-disable-next-line no-alert
|
|
38
|
+
if (!window.confirm(this.scope.locale.ForceDeleteConfirm())) return;
|
|
39
|
+
const modelStudent = await this._getModelStudent();
|
|
40
|
+
await modelStudent.deleteForce(renderContext.cellContext.row.id).mutateAsync();
|
|
41
|
+
}}
|
|
42
|
+
>
|
|
43
|
+
{this.scope.locale.ForceDelete()}
|
|
44
|
+
</button>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private async _getModelStudent() {
|
|
49
|
+
return (await this.bean._getBean('training-student.model.student', true)) as ModelStudent;
|
|
50
|
+
}
|
|
51
|
+
}
|
package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { TableIdentity } from 'table-identity';
|
|
2
|
+
import type { IResourceTableActionRowOptionsBase } from 'zova-module-a-openapi';
|
|
3
|
+
import type {
|
|
4
|
+
IJsxRenderContextTableCell,
|
|
5
|
+
ITableCellRender,
|
|
6
|
+
NextTableCellRender,
|
|
7
|
+
} from 'zova-module-a-table';
|
|
8
|
+
import type { ModelStudent } from 'zova-module-training-student';
|
|
9
|
+
|
|
10
|
+
import { BeanBase } from 'zova';
|
|
11
|
+
import { TableCell } from 'zova-module-a-table';
|
|
12
|
+
|
|
13
|
+
declare module 'zova-module-a-openapi' {
|
|
14
|
+
export interface IResourceTableActionRowRecord {
|
|
15
|
+
'training-student:actionSummary'?: ITableCellOptionsActionSummary;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ITableCellOptionsActionSummary extends IResourceTableActionRowOptionsBase {}
|
|
20
|
+
|
|
21
|
+
@TableCell<ITableCellOptionsActionSummary>({
|
|
22
|
+
class: 'btn btn-outline btn-info join-item',
|
|
23
|
+
})
|
|
24
|
+
export class TableCellActionSummary extends BeanBase implements ITableCellRender {
|
|
25
|
+
render(
|
|
26
|
+
options: ITableCellOptionsActionSummary,
|
|
27
|
+
renderContext: IJsxRenderContextTableCell,
|
|
28
|
+
_next: NextTableCellRender,
|
|
29
|
+
) {
|
|
30
|
+
const { $host, cellContext, ctx } = renderContext;
|
|
31
|
+
return (
|
|
32
|
+
<button
|
|
33
|
+
class={options.class}
|
|
34
|
+
type="button"
|
|
35
|
+
onClick={async () => {
|
|
36
|
+
const id = cellContext.row.id as TableIdentity;
|
|
37
|
+
const modelStudent = (await ctx.bean._getBean(
|
|
38
|
+
'training-student.model.student',
|
|
39
|
+
true,
|
|
40
|
+
)) as ModelStudent;
|
|
41
|
+
const querySummary = modelStudent.summary(id);
|
|
42
|
+
const { data: summary } = await querySummary.refetch();
|
|
43
|
+
const message = [
|
|
44
|
+
`${this.scope.locale.Id()}: ${summary?.id ?? '-'}`,
|
|
45
|
+
`${this.scope.locale.Name()}: ${summary?.name ?? '-'}`,
|
|
46
|
+
`${this.scope.locale.Level()}: ${summary?.level ?? '-'}`,
|
|
47
|
+
`${this.scope.locale.Description()}: ${summary?.description ?? '-'}`,
|
|
48
|
+
].join('\n');
|
|
49
|
+
await $host.$performCommand('basic-commands:alert', { message }, renderContext);
|
|
50
|
+
}}
|
|
51
|
+
>
|
|
52
|
+
{this.scope.locale.Summary()}
|
|
53
|
+
</button>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { IResourceTableCellOptionsBase } from 'zova-module-a-openapi';
|
|
2
|
+
import type {
|
|
3
|
+
IJsxRenderContextTableCell,
|
|
4
|
+
ITableCellRender,
|
|
5
|
+
NextTableCellRender,
|
|
6
|
+
} from 'zova-module-a-table';
|
|
7
|
+
|
|
8
|
+
import { classes } from 'typestyle';
|
|
9
|
+
import { BeanBase } from 'zova';
|
|
10
|
+
import { TableCell } from 'zova-module-a-table';
|
|
11
|
+
|
|
12
|
+
declare module 'zova-module-a-openapi' {
|
|
13
|
+
export interface IResourceTableCellRecord {
|
|
14
|
+
'training-student:level'?: ITableCellOptionsLevel;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ITableCellOptionsLevelItem {
|
|
19
|
+
value?: any;
|
|
20
|
+
title?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ITableCellOptionsLevel extends IResourceTableCellOptionsBase {
|
|
24
|
+
items?: ITableCellOptionsLevelItem[];
|
|
25
|
+
itemValue?: string;
|
|
26
|
+
itemTitle?: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@TableCell<ITableCellOptionsLevel>({
|
|
30
|
+
itemValue: 'value',
|
|
31
|
+
itemTitle: 'title',
|
|
32
|
+
})
|
|
33
|
+
export class TableCellLevel extends BeanBase implements ITableCellRender {
|
|
34
|
+
render(
|
|
35
|
+
options: ITableCellOptionsLevel,
|
|
36
|
+
_renderContext: IJsxRenderContextTableCell,
|
|
37
|
+
next: NextTableCellRender,
|
|
38
|
+
) {
|
|
39
|
+
const value = next();
|
|
40
|
+
const item = options.items?.find(
|
|
41
|
+
item => String(item[String(options.itemValue)]) === String(value),
|
|
42
|
+
);
|
|
43
|
+
const title = item?.[String(options.itemTitle)] ?? value;
|
|
44
|
+
return (
|
|
45
|
+
<span
|
|
46
|
+
class={classes(
|
|
47
|
+
'badge badge-sm font-medium border-0 whitespace-nowrap px-2',
|
|
48
|
+
this._getBadgeClass(value),
|
|
49
|
+
options.class,
|
|
50
|
+
)}
|
|
51
|
+
>
|
|
52
|
+
{title}
|
|
53
|
+
</span>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private _getBadgeClass(value: unknown) {
|
|
58
|
+
if (String(value) === '1') return 'badge-warning text-warning-content';
|
|
59
|
+
if (String(value) === '2') return 'badge-info text-info-content';
|
|
60
|
+
if (String(value) === '3') return 'badge-success text-success-content';
|
|
61
|
+
return 'badge-neutral text-neutral-content';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { IComponentOptions } from 'zova';
|
|
2
|
+
import type { IFormFieldComponentOptions } from 'zova-module-a-form';
|
|
3
|
+
import type { IResourceFormFieldOptionsBase } from 'zova-module-a-openapi';
|
|
4
|
+
|
|
5
|
+
import { classes } from 'typestyle';
|
|
6
|
+
import { BeanControllerBase } from 'zova';
|
|
7
|
+
import { Controller } from 'zova-module-a-bean';
|
|
8
|
+
import { ZFormField } from 'zova-module-a-form';
|
|
9
|
+
|
|
10
|
+
declare module 'zova-module-a-openapi' {
|
|
11
|
+
export interface IResourceFormFieldRecord {
|
|
12
|
+
'training-student:formFieldLevel'?: IResourceFormFieldLevelOptions;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface IResourceFormFieldLevelItem {
|
|
17
|
+
value?: any;
|
|
18
|
+
title?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface IResourceFormFieldLevelOptions extends IResourceFormFieldOptionsBase {
|
|
22
|
+
items?: IResourceFormFieldLevelItem[];
|
|
23
|
+
itemValue?: string;
|
|
24
|
+
itemTitle?: string;
|
|
25
|
+
placeholder?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ControllerFormFieldLevelProps extends IFormFieldComponentOptions {
|
|
29
|
+
options?: IResourceFormFieldLevelOptions;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@Controller()
|
|
33
|
+
export class ControllerFormFieldLevel extends BeanControllerBase {
|
|
34
|
+
static $propsDefault = {
|
|
35
|
+
options: {
|
|
36
|
+
itemValue: 'value',
|
|
37
|
+
itemTitle: 'title',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
static $componentOptions: IComponentOptions = { inheritAttrs: false, deepExtendDefault: true };
|
|
42
|
+
|
|
43
|
+
protected async __init__() {}
|
|
44
|
+
|
|
45
|
+
protected render() {
|
|
46
|
+
const propsFormField = this.$props as ControllerFormFieldLevelProps;
|
|
47
|
+
return (
|
|
48
|
+
<ZFormField
|
|
49
|
+
{...propsFormField}
|
|
50
|
+
slotDefault={({ propsBucket, props }, $$formField) => {
|
|
51
|
+
const items = propsBucket.options.items ?? [];
|
|
52
|
+
const value = propsBucket.value;
|
|
53
|
+
const itemSelected = items.find(
|
|
54
|
+
item => String(item[String(propsBucket.options.itemValue)]) === String(value),
|
|
55
|
+
);
|
|
56
|
+
if (propsBucket.readonly) {
|
|
57
|
+
return (
|
|
58
|
+
<div class={classes('flex min-h-12 items-center', props.class)}>
|
|
59
|
+
<span
|
|
60
|
+
class={classes(
|
|
61
|
+
'badge badge-lg font-semibold border-0 px-4 py-3 tracking-wide',
|
|
62
|
+
this._getBadgeClass(value),
|
|
63
|
+
)}
|
|
64
|
+
>
|
|
65
|
+
{itemSelected?.[String(propsBucket.options.itemTitle)] ??
|
|
66
|
+
propsBucket.options.placeholder ??
|
|
67
|
+
''}
|
|
68
|
+
</span>
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return (
|
|
73
|
+
<div class={classes('flex flex-wrap gap-2', props.class)}>
|
|
74
|
+
{items.map(item => {
|
|
75
|
+
const itemValue = item[String(propsBucket.options.itemValue)];
|
|
76
|
+
const selected = String(itemValue) === String(value);
|
|
77
|
+
return (
|
|
78
|
+
<button
|
|
79
|
+
key={String(itemValue)}
|
|
80
|
+
type="button"
|
|
81
|
+
class={classes(
|
|
82
|
+
'btn btn-sm rounded-full border-0 px-4 font-medium transition-colors',
|
|
83
|
+
selected
|
|
84
|
+
? this._getButtonClass(itemValue)
|
|
85
|
+
: 'btn-outline text-base-content/70',
|
|
86
|
+
!$$formField.field.state.meta.isValid && 'btn-error',
|
|
87
|
+
)}
|
|
88
|
+
onClick={() => {
|
|
89
|
+
$$formField.setValue(itemValue, propsBucket.disableNotifyChanged);
|
|
90
|
+
$$formField.handleBlur();
|
|
91
|
+
}}
|
|
92
|
+
>
|
|
93
|
+
{item[String(propsBucket.options.itemTitle)]}
|
|
94
|
+
</button>
|
|
95
|
+
);
|
|
96
|
+
})}
|
|
97
|
+
</div>
|
|
98
|
+
);
|
|
99
|
+
}}
|
|
100
|
+
></ZFormField>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private _getBadgeClass(value: unknown) {
|
|
105
|
+
if (String(value) === '1') return 'badge-warning text-warning-content';
|
|
106
|
+
if (String(value) === '2') return 'badge-info text-info-content';
|
|
107
|
+
if (String(value) === '3') return 'badge-success text-success-content';
|
|
108
|
+
return 'badge-neutral text-neutral-content';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private _getButtonClass(value: unknown) {
|
|
112
|
+
if (String(value) === '1') return 'btn-warning text-warning-content';
|
|
113
|
+
if (String(value) === '2') return 'btn-info text-info-content';
|
|
114
|
+
if (String(value) === '3') return 'btn-success text-success-content';
|
|
115
|
+
return 'btn-neutral text-neutral-content';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { TableIdentity } from 'table-identity';
|
|
2
|
+
import type { IDecoratorModelOptions } from 'zova-module-a-model';
|
|
3
|
+
import type { ModelResource } from 'zova-module-rest-resource';
|
|
4
|
+
|
|
5
|
+
import { Use, usePrepareArg } from 'zova';
|
|
6
|
+
import { BeanModelBase, Model } from 'zova-module-a-model';
|
|
7
|
+
|
|
8
|
+
export interface IModelOptionsStudent extends IDecoratorModelOptions {}
|
|
9
|
+
|
|
10
|
+
const StudentResource = 'training-student:student';
|
|
11
|
+
|
|
12
|
+
@Model<IModelOptionsStudent>()
|
|
13
|
+
export class ModelStudent extends BeanModelBase {
|
|
14
|
+
@Use({ beanFullName: 'rest-resource.model.resource' })
|
|
15
|
+
protected get $$modelResource(): ModelResource {
|
|
16
|
+
return usePrepareArg(StudentResource, true);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
summary(id: TableIdentity) {
|
|
20
|
+
return this.$$modelResource.queryItem({
|
|
21
|
+
id,
|
|
22
|
+
action: 'summary',
|
|
23
|
+
queryFn: async () => {
|
|
24
|
+
const res = await this.scope.api.trainingStudent.summary({ params: { id } });
|
|
25
|
+
return res ?? null;
|
|
26
|
+
},
|
|
27
|
+
meta: {
|
|
28
|
+
disableSuspenseOnInit: true,
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
deleteForce(id: TableIdentity) {
|
|
34
|
+
return this.$$modelResource.mutationItem<void, void>({
|
|
35
|
+
id,
|
|
36
|
+
action: 'deleteForce',
|
|
37
|
+
mutationFn: async () => {
|
|
38
|
+
await this.scope.api.trainingStudent.deleteForce({ params: { id } });
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"rootDir": "src",
|
|
5
|
+
"outDir": "dist",
|
|
6
|
+
"declaration": true,
|
|
7
|
+
"declarationMap": true,
|
|
8
|
+
"emitDeclarationOnly": true,
|
|
9
|
+
"allowImportingTsExtensions": true,
|
|
10
|
+
"noEmit": false
|
|
11
|
+
},
|
|
12
|
+
"include": ["src", "src/.metadata/**/*"]
|
|
13
|
+
}
|
|
@@ -49,8 +49,12 @@ export class ControllerFormFieldSelect extends BeanControllerBase {
|
|
|
49
49
|
<ZFormField
|
|
50
50
|
{...this.$props}
|
|
51
51
|
slotDefault={({ propsBucket, props }, $$formField) => {
|
|
52
|
-
const
|
|
53
|
-
|
|
52
|
+
const needClearableEmptyOption = !propsBucket.needHandleBorder;
|
|
53
|
+
const className = needClearableEmptyOption
|
|
54
|
+
? classes(
|
|
55
|
+
props.class,
|
|
56
|
+
'grow w-full h-full min-h-0 border-0 rounded-none bg-transparent pl-0 pr-8 py-0 shadow-none outline-none focus:outline-none focus:shadow-none focus:border-0',
|
|
57
|
+
)
|
|
54
58
|
: classes(
|
|
55
59
|
props.class,
|
|
56
60
|
'select',
|
|
@@ -61,23 +65,41 @@ export class ControllerFormFieldSelect extends BeanControllerBase {
|
|
|
61
65
|
'onUpdate:modelValue': (value: any) => {
|
|
62
66
|
$$formField.setValue(value, propsBucket.disableNotifyChanged);
|
|
63
67
|
},
|
|
68
|
+
'onBlur': () => {
|
|
69
|
+
$$formField.handleBlur();
|
|
70
|
+
},
|
|
64
71
|
...propsBucket.options,
|
|
65
72
|
...props,
|
|
66
73
|
'class': className,
|
|
67
74
|
};
|
|
68
|
-
|
|
75
|
+
if (needClearableEmptyOption) {
|
|
76
|
+
propsNew.items = this._ensureEmptyItemFallback(
|
|
77
|
+
propsNew.items,
|
|
78
|
+
propsNew.placeholder,
|
|
79
|
+
true,
|
|
80
|
+
);
|
|
81
|
+
propsNew.placeholder = undefined;
|
|
82
|
+
} else if (!propsNew.placeholder) {
|
|
83
|
+
propsNew.items = this._ensureEmptyItemFallback(propsNew.items, undefined);
|
|
84
|
+
}
|
|
69
85
|
return <ZSelect {...propsNew}></ZSelect>;
|
|
70
86
|
}}
|
|
71
87
|
></ZFormField>
|
|
72
88
|
);
|
|
73
89
|
}
|
|
74
90
|
|
|
75
|
-
private _ensureEmptyItemFallback(
|
|
76
|
-
|
|
91
|
+
private _ensureEmptyItemFallback(
|
|
92
|
+
items: any[] | undefined,
|
|
93
|
+
placeholder: unknown,
|
|
94
|
+
force = false,
|
|
95
|
+
): any[] | undefined {
|
|
96
|
+
if (!items?.length) return items;
|
|
77
97
|
const valueKey = String(this.$props.options.itemValue);
|
|
78
98
|
const titleKey = String(this.$props.options.itemTitle);
|
|
79
|
-
|
|
80
|
-
|
|
99
|
+
const emptyValue = '';
|
|
100
|
+
if (items[0]?.[valueKey] === emptyValue) return items;
|
|
101
|
+
if (!force && !!placeholder) return items;
|
|
102
|
+
return [{ [valueKey]: emptyValue, [titleKey]: placeholder ?? '' }, ...items];
|
|
81
103
|
}
|
|
82
104
|
|
|
83
105
|
private _getValueByItems() {
|