@vc-shell/vc-app-skill 2.0.0-alpha.32 → 2.0.0-alpha.33-pr220.455e322
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/CHANGELOG.md +59 -47
- package/README.md +18 -12
- package/package.json +4 -4
- package/runtime/VERSION +1 -1
- package/runtime/agents/api-analyzer.md +31 -16
- package/runtime/agents/blade-enhancer.md +15 -9
- package/runtime/agents/details-blade-generator.md +47 -31
- package/runtime/agents/list-blade-generator.md +21 -37
- package/runtime/agents/locales-generator.md +3 -0
- package/runtime/agents/migration-agent.md +94 -0
- package/runtime/agents/module-analyzer.md +2 -0
- package/runtime/agents/module-assembler.md +15 -0
- package/runtime/agents/promote-agent.md +15 -4
- package/runtime/agents/type-checker.md +11 -0
- package/runtime/knowledge/docs/_BUILD_HASH.md +1 -1
- package/runtime/knowledge/docs/core/api/platform.docs.md +30 -30
- package/runtime/knowledge/docs/core/blade-navigation/blade-nav-composables.docs.md +41 -41
- package/runtime/knowledge/docs/core/composables/bladeContext/index.docs.md +12 -10
- package/runtime/knowledge/docs/core/composables/useApiClient/useApiClient.docs.md +11 -14
- package/runtime/knowledge/docs/core/composables/useAppBarMobileButtons/useAppBarMobileButtons.docs.md +35 -35
- package/runtime/knowledge/docs/core/composables/useAppBarWidget/useAppBarWidget.docs.md +35 -35
- package/runtime/knowledge/docs/core/composables/useAppInsights/useAppInsights.docs.md +15 -15
- package/runtime/knowledge/docs/core/composables/useAssets/useAssets.docs.md +21 -18
- package/runtime/knowledge/docs/core/composables/useAssetsManager/useAssetsManager.docs.md +31 -27
- package/runtime/knowledge/docs/core/composables/useAsync/useAsync.docs.md +90 -61
- package/runtime/knowledge/docs/core/composables/useBeforeUnload/useBeforeUnload.docs.md +19 -18
- package/runtime/knowledge/docs/core/composables/useBlade/useBlade.docs.md +89 -68
- package/runtime/knowledge/docs/core/composables/useBladeForm/useBladeForm.docs.md +75 -19
- package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +15 -15
- package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +74 -78
- package/runtime/knowledge/docs/core/composables/useBreadcrumbs/useBreadcrumbs.docs.md +11 -11
- package/runtime/knowledge/docs/core/composables/useConnectionStatus/useConnectionStatus.docs.md +27 -15
- package/runtime/knowledge/docs/core/composables/useDashboard/useDashboard.docs.md +30 -30
- package/runtime/knowledge/docs/core/composables/useDynamicProperties/useDynamicProperties.docs.md +34 -36
- package/runtime/knowledge/docs/core/composables/useErrorHandler/useErrorHandler.docs.md +44 -23
- package/runtime/knowledge/docs/core/composables/useFunctions/useFunctions.docs.md +14 -11
- package/runtime/knowledge/docs/core/composables/useKeyboardNavigation/useKeyboardNavigation.docs.md +47 -38
- package/runtime/knowledge/docs/core/composables/useLanguages/useLanguages.docs.md +37 -28
- package/runtime/knowledge/docs/core/composables/useLoading/useLoading.docs.md +23 -17
- package/runtime/knowledge/docs/core/composables/useMenuExpanded/index.docs.md +10 -10
- package/runtime/knowledge/docs/core/composables/useMenuService/useMenuService.docs.md +42 -42
- package/runtime/knowledge/docs/core/composables/useModificationTracker/useModificationTracker.docs.md +22 -12
- package/runtime/knowledge/docs/core/composables/useNotifications/useNotifications.docs.md +33 -41
- package/runtime/knowledge/docs/core/composables/usePermissions/usePermissions.docs.md +16 -16
- package/runtime/knowledge/docs/core/composables/usePopup/usePopup.docs.md +32 -24
- package/runtime/knowledge/docs/core/composables/useResponsive/useResponsive.docs.md +32 -11
- package/runtime/knowledge/docs/core/composables/useSettings/useSettings.docs.md +24 -15
- package/runtime/knowledge/docs/core/composables/useSettingsMenu/useSettingsMenu.docs.md +7 -7
- package/runtime/knowledge/docs/core/composables/useSidebarState/useSidebarState.docs.md +32 -24
- package/runtime/knowledge/docs/core/composables/useSlowNetworkDetection/useSlowNetworkDetection.docs.md +21 -17
- package/runtime/knowledge/docs/core/composables/useTheme/useTheme.docs.md +24 -24
- package/runtime/knowledge/docs/core/composables/useToolbar/useToolbar.docs.md +28 -31
- package/runtime/knowledge/docs/core/composables/useUser/useUser.docs.md +43 -24
- package/runtime/knowledge/docs/core/composables/useUserManagement/useUserManagement.docs.md +68 -48
- package/runtime/knowledge/docs/core/composables/useWebVitals/useWebVitals.docs.md +19 -19
- package/runtime/knowledge/docs/core/composables/useWidgets/useWidgets.docs.md +42 -47
- package/runtime/knowledge/docs/core/directives/autofocus/autofocus.docs.md +10 -4
- package/runtime/knowledge/docs/core/directives/loading/loading.docs.md +35 -20
- package/runtime/knowledge/docs/core/notifications/notifications.docs.md +36 -35
- package/runtime/knowledge/docs/core/plugins/ai-agent/ai-agent.docs.md +38 -38
- package/runtime/knowledge/docs/core/plugins/extension-points/extension-points.docs.md +107 -91
- package/runtime/knowledge/docs/core/plugins/global-error-handler/global-error-handler.docs.md +10 -10
- package/runtime/knowledge/docs/core/plugins/i18n/i18n.docs.md +21 -23
- package/runtime/knowledge/docs/core/plugins/modularity/modularity.docs.md +98 -90
- package/runtime/knowledge/docs/core/plugins/permissions/permissions.docs.md +10 -16
- package/runtime/knowledge/docs/core/plugins/signalR/signalR.docs.md +9 -9
- package/runtime/knowledge/docs/core/plugins/validation/validation.docs.md +65 -22
- package/runtime/knowledge/docs/core/services/services.docs.md +19 -22
- package/runtime/knowledge/docs/core/types/types.docs.md +40 -40
- package/runtime/knowledge/docs/core/utilities/date/date-utilities.docs.md +27 -27
- package/runtime/knowledge/docs/core/utilities/shared-utilities.docs.md +23 -23
- package/runtime/knowledge/docs/core/utilities/thumbnail/thumbnail.docs.md +22 -25
- package/runtime/knowledge/docs/core/utilities/utilities.docs.md +64 -64
- package/runtime/knowledge/docs/injection-keys.docs.md +52 -51
- package/runtime/knowledge/docs/modules/assets-manager/assets-manager.docs.md +9 -9
- package/runtime/knowledge/docs/shell/_internal/popup/common/popup-common.docs.md +23 -43
- package/runtime/knowledge/docs/shell/auth/ChangePasswordPage/change-password-page.docs.md +102 -0
- package/runtime/knowledge/docs/shell/auth/ForgotPasswordPage/forgot-password-page.docs.md +5 -5
- package/runtime/knowledge/docs/shell/auth/InvitePage/invite-page.docs.md +8 -7
- package/runtime/knowledge/docs/shell/auth/LoginPage/login-page.docs.md +7 -7
- package/runtime/knowledge/docs/shell/auth/ResetPasswordPage/reset-password-page.docs.md +8 -7
- package/runtime/knowledge/docs/shell/auth/sign-in/sign-in.docs.md +29 -13
- package/runtime/knowledge/docs/shell/components/change-password/change-password.docs.md +13 -16
- package/runtime/knowledge/docs/shell/components/change-password-button/change-password-button.docs.md +1 -7
- package/runtime/knowledge/docs/shell/components/error-interceptor/error-interceptor.docs.md +5 -5
- package/runtime/knowledge/docs/shell/components/language-selector/language-selector.docs.md +1 -1
- package/runtime/knowledge/docs/shell/components/logout-button/logout-button.docs.md +1 -1
- package/runtime/knowledge/docs/shell/components/notification-template/notification-template.docs.md +17 -9
- package/runtime/knowledge/docs/shell/components/settings-menu/settings-menu.docs.md +12 -18
- package/runtime/knowledge/docs/shell/components/settings-menu-item/settings-menu-item.docs.md +34 -65
- package/runtime/knowledge/docs/shell/components/sidebar/sidebar.docs.md +16 -26
- package/runtime/knowledge/docs/shell/components/theme-selector/theme-selector.docs.md +2 -2
- package/runtime/knowledge/docs/shell/components/user-dropdown-button/user-dropdown-button.docs.md +7 -9
- package/runtime/knowledge/docs/shell/dashboard/dashboard-charts/dashboard-charts.docs.md +30 -40
- package/runtime/knowledge/docs/shell/dashboard/dashboard-widget-card/dashboard-widget-card.docs.md +26 -19
- package/runtime/knowledge/docs/shell/dashboard/draggable-dashboard/draggable-dashboard.docs.md +15 -12
- package/runtime/knowledge/docs/ui/components/atoms/vc-badge/vc-badge.docs.md +15 -26
- package/runtime/knowledge/docs/ui/components/atoms/vc-banner/vc-banner.docs.md +21 -19
- package/runtime/knowledge/docs/ui/components/atoms/vc-button/vc-button.docs.md +83 -67
- package/runtime/knowledge/docs/ui/components/atoms/vc-card/vc-card.docs.md +104 -59
- package/runtime/knowledge/docs/ui/components/atoms/vc-col/vc-col.docs.md +28 -11
- package/runtime/knowledge/docs/ui/components/atoms/vc-container/vc-container.docs.md +20 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-hint/vc-hint.docs.md +26 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-icon/vc-icon.docs.md +30 -32
- package/runtime/knowledge/docs/ui/components/atoms/vc-image/vc-image.docs.md +25 -48
- package/runtime/knowledge/docs/ui/components/atoms/vc-label/vc-label.docs.md +29 -24
- package/runtime/knowledge/docs/ui/components/atoms/vc-link/vc-link.docs.md +23 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-loading/vc-loading.docs.md +22 -13
- package/runtime/knowledge/docs/ui/components/atoms/vc-progress/vc-progress.docs.md +33 -18
- package/runtime/knowledge/docs/ui/components/atoms/vc-row/vc-row.docs.md +56 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-scrollable-container/vc-scrollable-container.docs.md +28 -15
- package/runtime/knowledge/docs/ui/components/atoms/vc-skeleton/vc-skeleton.docs.md +40 -20
- package/runtime/knowledge/docs/ui/components/atoms/vc-status/vc-status.docs.md +25 -14
- package/runtime/knowledge/docs/ui/components/atoms/vc-status-icon/vc-status-icon.docs.md +40 -14
- package/runtime/knowledge/docs/ui/components/atoms/vc-tooltip/vc-tooltip.docs.md +54 -42
- package/runtime/knowledge/docs/ui/components/atoms/vc-video/vc-video.docs.md +17 -17
- package/runtime/knowledge/docs/ui/components/atoms/vc-widget/vc-widget.docs.md +21 -21
- package/runtime/knowledge/docs/ui/components/molecules/multilanguage-selector/multilanguage-selector.docs.md +23 -10
- package/runtime/knowledge/docs/ui/components/molecules/vc-accordion/vc-accordion.docs.md +59 -44
- package/runtime/knowledge/docs/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.docs.md +23 -20
- package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox/vc-checkbox.docs.md +96 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +26 -35
- package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +69 -22
- package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +58 -72
- package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown/vc-dropdown.docs.md +91 -85
- package/runtime/knowledge/docs/ui/components/molecules/vc-dropdown-panel/vc-dropdown-panel.docs.md +38 -42
- package/runtime/knowledge/docs/ui/components/molecules/vc-editor/vc-editor.docs.md +60 -72
- package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +65 -26
- package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +46 -49
- package/runtime/knowledge/docs/ui/components/molecules/vc-form/vc-form.docs.md +35 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-image-tile/vc-image-tile.docs.md +38 -41
- package/runtime/knowledge/docs/ui/components/molecules/vc-input/vc-input.docs.md +115 -130
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +53 -87
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +56 -63
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-group/vc-input-group.docs.md +29 -24
- package/runtime/knowledge/docs/ui/components/molecules/vc-menu/vc-menu.docs.md +32 -28
- package/runtime/knowledge/docs/ui/components/molecules/vc-multivalue/vc-multivalue.docs.md +63 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-pagination/vc-pagination.docs.md +28 -26
- package/runtime/knowledge/docs/ui/components/molecules/vc-radio-button/vc-radio-button.docs.md +59 -19
- package/runtime/knowledge/docs/ui/components/molecules/vc-radio-group/vc-radio-group.docs.md +25 -34
- package/runtime/knowledge/docs/ui/components/molecules/vc-rating/vc-rating.docs.md +42 -32
- package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +78 -82
- package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +25 -15
- package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +59 -63
- package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +57 -69
- package/runtime/knowledge/docs/ui/components/molecules/vc-toast/vc-toast.docs.md +58 -57
- package/runtime/knowledge/docs/ui/components/organisms/vc-app/vc-app.docs.md +49 -26
- package/runtime/knowledge/docs/ui/components/organisms/vc-auth-layout/vc-auth-layout.docs.md +82 -28
- package/runtime/knowledge/docs/ui/components/organisms/vc-blade/vc-blade.docs.md +120 -75
- package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +30 -44
- package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +536 -365
- package/runtime/knowledge/docs/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.docs.md +35 -52
- package/runtime/knowledge/docs/ui/components/organisms/vc-gallery/vc-gallery.docs.md +33 -62
- package/runtime/knowledge/docs/ui/components/organisms/vc-image-upload/vc-image-upload.docs.md +17 -23
- package/runtime/knowledge/docs/ui/components/organisms/vc-popup/vc-popup.docs.md +109 -68
- package/runtime/knowledge/docs/ui/components/organisms/vc-sidebar/vc-sidebar.docs.md +82 -44
- package/runtime/knowledge/docs/ui/composables/ui-composables.docs.md +8 -8
- package/runtime/knowledge/docs/ui/composables/useDataTablePagination.docs.md +164 -0
- package/runtime/knowledge/docs/ui/composables/useDataTableSort.docs.md +34 -26
- package/runtime/knowledge/docs/ui/composables/useTableSelection.docs.md +48 -40
- package/runtime/knowledge/docs/ui/composables/useTableSort.docs.md +30 -17
- package/runtime/knowledge/docs/ui/types/ui-types.docs.md +40 -29
- package/runtime/knowledge/examples/offers-module.md +15 -13
- package/runtime/knowledge/examples/team-module.md +82 -119
- package/runtime/knowledge/examples/videos-module.md +44 -17
- package/runtime/knowledge/index.md +22 -0
- package/runtime/knowledge/migration-prompts/blade-form-migration.md +255 -0
- package/runtime/knowledge/migration-prompts/blade-props-migration.md +194 -0
- package/runtime/knowledge/migration-prompts/datatable-migration.md +801 -0
- package/runtime/knowledge/migration-prompts/icon-migration.md +97 -0
- package/runtime/knowledge/migration-prompts/manual-migration-audit.md +117 -0
- package/runtime/knowledge/migration-prompts/notifications-migration.md +223 -0
- package/runtime/knowledge/migration-prompts/nswag-migration.md +244 -0
- package/runtime/knowledge/migration-prompts/use-assets-migration.md +164 -0
- package/runtime/knowledge/migration-prompts/use-data-table-pagination-migration.md +176 -0
- package/runtime/knowledge/migration-prompts/widgets-migration.md +178 -0
- package/runtime/knowledge/patterns/assets-management.md +20 -20
- package/runtime/knowledge/patterns/blade-navigation.md +7 -14
- package/runtime/knowledge/patterns/blade-widget.md +19 -17
- package/runtime/knowledge/patterns/child-blade-flow.md +19 -7
- package/runtime/knowledge/patterns/composable-details.md +20 -50
- package/runtime/knowledge/patterns/composable-list.md +43 -31
- package/runtime/knowledge/patterns/dashboard-widget.md +14 -16
- package/runtime/knowledge/patterns/datatable-pattern.md +521 -0
- package/runtime/knowledge/patterns/details-blade-pattern.md +78 -116
- package/runtime/knowledge/patterns/extension-points-usage.md +53 -44
- package/runtime/knowledge/patterns/form-validation.md +28 -64
- package/runtime/knowledge/patterns/list-blade-pattern.md +33 -21
- package/runtime/knowledge/patterns/module-structure.md +7 -1
- package/runtime/knowledge/patterns/multilanguage-fields.md +8 -14
- package/runtime/knowledge/patterns/notification-template.md +21 -14
- package/runtime/knowledge/patterns/signalr-notifications.md +30 -32
- package/runtime/knowledge/patterns/toolbar-pattern.md +18 -20
- package/runtime/vc-app.md +354 -49
- package/runtime/knowledge/docs/core/constants/constants.docs.md +0 -185
|
@@ -16,9 +16,9 @@ description: Performs surgical edits on a prototype module to replace mock data
|
|
|
16
16
|
"entityName": "string — PascalCase entity name"
|
|
17
17
|
},
|
|
18
18
|
"dataSource": {
|
|
19
|
-
"clientClass": "string — NSwag client class name (e.g., '
|
|
20
|
-
"entityType": "string — PascalCase entity type (e.g., '
|
|
21
|
-
"entityTypePath": "string — import path for entity types (e.g., '../../api_client/virtocommerce.
|
|
19
|
+
"clientClass": "string — NSwag client class name (e.g., 'MyEntityClient')",
|
|
20
|
+
"entityType": "string — PascalCase entity type (e.g., 'MyEntity')",
|
|
21
|
+
"entityTypePath": "string — import path for entity types (e.g., '../../api_client/virtocommerce.mymodule')",
|
|
22
22
|
"searchMethod": "string? — camelCase search method on client",
|
|
23
23
|
"getMethod": "string? — camelCase get method on client",
|
|
24
24
|
"createMethod": "string? — camelCase create method on client",
|
|
@@ -61,6 +61,7 @@ If `bladeTypes` is `"details-only"`, skip all list composable and list blade fil
|
|
|
61
61
|
### Step 1: Validate generated files
|
|
62
62
|
|
|
63
63
|
For each path in `prototypeMetadata.generatedFiles`:
|
|
64
|
+
|
|
64
65
|
1. Check that `{targetDir}/{path}` exists on disk
|
|
65
66
|
2. Read the file contents
|
|
66
67
|
3. If a file is missing, record a warning: `"MISSING: {path} — listed in prototypeMetadata but not found on disk"`
|
|
@@ -76,11 +77,13 @@ Process each composable file (`.ts` files under `composables/`) listed in `gener
|
|
|
76
77
|
Search for `// vc-app:mock-start` and `// vc-app:mock-end` markers in the file.
|
|
77
78
|
|
|
78
79
|
**Primary path (markers found):**
|
|
80
|
+
|
|
79
81
|
- Extract the entire block between `// vc-app:mock-start` and `// vc-app:mock-end` (inclusive of the marker lines)
|
|
80
82
|
- Replace the block with the real API integration code (see Step 2c)
|
|
81
83
|
- Remove the marker comments themselves
|
|
82
84
|
|
|
83
85
|
**Fallback path (markers NOT found):**
|
|
86
|
+
|
|
84
87
|
- Pattern-match mock function signatures: look for functions that return hardcoded arrays/objects, `const mockData`, `const mock`, `setTimeout` simulating async, or inline `Promise.resolve(...)` with literal data
|
|
85
88
|
- Replace matched regions with real API integration code
|
|
86
89
|
- Set status to `DONE_WITH_CONCERNS` with concern: `"Mock markers not found in {filePath} — used pattern-matching fallback. Verify edits manually."`
|
|
@@ -90,6 +93,7 @@ Search for `// vc-app:mock-start` and `// vc-app:mock-end` markers in the file.
|
|
|
90
93
|
At the top of the file, apply these import changes:
|
|
91
94
|
|
|
92
95
|
**Add** (if not already present):
|
|
96
|
+
|
|
93
97
|
```ts
|
|
94
98
|
import { useApiClient } from "@vc-shell/framework";
|
|
95
99
|
import { {dataSource.clientClass} } from "{dataSource.entityTypePath}";
|
|
@@ -97,6 +101,7 @@ import { {dataSource.entityType}, /* SearchQuery, SearchResult types as needed *
|
|
|
97
101
|
```
|
|
98
102
|
|
|
99
103
|
**Remove:**
|
|
104
|
+
|
|
100
105
|
- Any imports that reference mock data files or mock type definitions that no longer exist
|
|
101
106
|
- Do NOT remove other existing imports (framework composables, Vue imports, etc.)
|
|
102
107
|
|
|
@@ -109,6 +114,7 @@ const apiClient = useApiClient({dataSource.clientClass});
|
|
|
109
114
|
```
|
|
110
115
|
|
|
111
116
|
Then replace mock function bodies:
|
|
117
|
+
|
|
112
118
|
- **List composable** (`useList` / `use{EntityPlural}`):
|
|
113
119
|
- Mock search/fetch function → `apiClient.{dataSource.searchMethod}(query)`
|
|
114
120
|
- Mock remove function → `apiClient.{dataSource.deleteMethod}(ids)`
|
|
@@ -118,6 +124,7 @@ Then replace mock function bodies:
|
|
|
118
124
|
- Mock delete function → `apiClient.{dataSource.deleteMethod}(ids)`
|
|
119
125
|
|
|
120
126
|
If a method is not provided in `dataSource` (e.g., `deleteMethod` is undefined), leave a TODO comment:
|
|
127
|
+
|
|
121
128
|
```ts
|
|
122
129
|
// TODO [vc-app:promote]: deleteMethod not provided — implement manually
|
|
123
130
|
```
|
|
@@ -139,11 +146,13 @@ For each entry in `fieldMap`:
|
|
|
139
146
|
- Computed property keys and template literals referencing the field
|
|
140
147
|
|
|
141
148
|
- **`action: "delete"`** — Remove code blocks that reference the deleted field. If the field appears in a return statement or interface, remove it. If it appears in logic that cannot be cleanly removed, comment it out with:
|
|
149
|
+
|
|
142
150
|
```ts
|
|
143
151
|
// TODO [vc-app:promote]: removed field "{mockFieldName}" — clean up surrounding logic
|
|
144
152
|
```
|
|
145
153
|
|
|
146
154
|
- **`action: "keep-stub"`** — Leave the existing code for this field in place and add a comment:
|
|
155
|
+
|
|
147
156
|
```ts
|
|
148
157
|
// TODO [vc-app:promote]: {mockFieldName} — kept as stub, provide implementation
|
|
149
158
|
```
|
|
@@ -156,6 +165,7 @@ For each entry in `fieldMap`:
|
|
|
156
165
|
#### 2f: Preserve untouched code
|
|
157
166
|
|
|
158
167
|
All code outside the mock block and the renamed/deleted field references must remain exactly as-is. This includes:
|
|
168
|
+
|
|
159
169
|
- Computed properties
|
|
160
170
|
- Watchers
|
|
161
171
|
- Validation logic
|
|
@@ -235,7 +245,7 @@ Compile the final report with:
|
|
|
235
245
|
- `DONE_WITH_CONCERNS` — transformations applied but with fallback pattern-matching or ambiguities
|
|
236
246
|
- `BLOCKED` — cannot proceed (all files missing, or critical error)
|
|
237
247
|
|
|
238
|
-
- **Files modified:** list each file with a one-line summary of changes (e.g., `"composables/useTeamMembers/index.ts — replaced mock data source with
|
|
248
|
+
- **Files modified:** list each file with a one-line summary of changes (e.g., `"composables/useTeamMembers/index.ts — replaced mock data source with UserSecurityClient API calls, renamed 3 fields"`)
|
|
239
249
|
|
|
240
250
|
- **Warnings:** list all warnings collected during Steps 1-5
|
|
241
251
|
|
|
@@ -244,6 +254,7 @@ Compile the final report with:
|
|
|
244
254
|
## Output Contract
|
|
245
255
|
|
|
246
256
|
Report format:
|
|
257
|
+
|
|
247
258
|
```
|
|
248
259
|
Status: DONE | DONE_WITH_CONCERNS | BLOCKED
|
|
249
260
|
Files modified:
|
|
@@ -23,11 +23,13 @@ No pattern files needed. This agent works with TypeScript diagnostics directly.
|
|
|
23
23
|
### Step 1: Run vue-tsc
|
|
24
24
|
|
|
25
25
|
From `projectRoot`, run:
|
|
26
|
+
|
|
26
27
|
```bash
|
|
27
28
|
cd {projectRoot} && npx vue-tsc --noEmit 2>&1
|
|
28
29
|
```
|
|
29
30
|
|
|
30
31
|
Capture all output. If `vue-tsc` is not available, fall back to:
|
|
32
|
+
|
|
31
33
|
```bash
|
|
32
34
|
cd {projectRoot} && npx tsc --noEmit 2>&1
|
|
33
35
|
```
|
|
@@ -35,6 +37,7 @@ cd {projectRoot} && npx tsc --noEmit 2>&1
|
|
|
35
37
|
### Step 2: Filter errors to generated files only
|
|
36
38
|
|
|
37
39
|
Parse the output for TypeScript error lines. Each error line has format:
|
|
40
|
+
|
|
38
41
|
```
|
|
39
42
|
{filepath}({line},{col}): error TS{code}: {message}
|
|
40
43
|
```
|
|
@@ -48,27 +51,34 @@ If no errors match the generated files, report **PASS** and stop.
|
|
|
48
51
|
For each error in the generated files, attempt to fix using these patterns:
|
|
49
52
|
|
|
50
53
|
**TS2339 — Property does not exist on type:**
|
|
54
|
+
|
|
51
55
|
- If `entity.{field}` and `{field}` is not on the entity type, add `?` optional chaining: `entity.value?.{field}`
|
|
52
56
|
- If it's a missing property on an imported type, add a type assertion: `(entity.value as any).{field}` as a last resort
|
|
53
57
|
|
|
54
58
|
**TS2345 — Argument type mismatch:**
|
|
59
|
+
|
|
55
60
|
- If passing `string | undefined` where `string` is expected, add non-null assertion: `value!`
|
|
56
61
|
- If command class is missing a required field, add it from the entity with a comment
|
|
57
62
|
|
|
58
63
|
**TS2304 — Cannot find name:**
|
|
64
|
+
|
|
59
65
|
- If a composable function name is wrong, check the composable file and correct the import/destructure
|
|
60
66
|
- If an imported type is missing, check the api client file for the correct class name
|
|
61
67
|
|
|
62
68
|
**TS7006 — Parameter implicitly has 'any' type:**
|
|
69
|
+
|
|
63
70
|
- Add explicit type annotation from context (e.g., `(query: ISearch{Entity}Query)`)
|
|
64
71
|
|
|
65
72
|
**TS2554 — Expected N arguments but got M:**
|
|
73
|
+
|
|
66
74
|
- Check the method signature in the api client file and adjust the call
|
|
67
75
|
|
|
68
76
|
**TS1005 — Expected token:**
|
|
77
|
+
|
|
69
78
|
- Syntax error — re-read the generated file and fix malformed syntax
|
|
70
79
|
|
|
71
80
|
For each fix:
|
|
81
|
+
|
|
72
82
|
1. Read the affected generated file
|
|
73
83
|
2. Apply the minimal fix (Edit tool, targeted replacement)
|
|
74
84
|
3. Note the fix applied
|
|
@@ -108,6 +118,7 @@ Returns a text report with PASS/FAIL status, fixes applied, and any remaining er
|
|
|
108
118
|
## Self-Check
|
|
109
119
|
|
|
110
120
|
Before completing, verify:
|
|
121
|
+
|
|
111
122
|
- [ ] `vue-tsc` (or `tsc`) was run from `projectRoot`, not from a subdirectory
|
|
112
123
|
- [ ] Only errors in `generatedFiles` were addressed — no fixes to unrelated files
|
|
113
124
|
- [ ] Fixes were minimal (targeted Edit calls, not full file rewrites)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Synced from framework at commit
|
|
1
|
+
Synced from framework at commit b399787ff on 2026-04-14T15:15:27.844Z
|
|
@@ -21,38 +21,38 @@ Each API client class extends `AuthApiBase`, which automatically attaches the Be
|
|
|
21
21
|
|
|
22
22
|
All clients extend `AuthApiBase` and accept an optional `baseUrl` and `http` fetch implementation.
|
|
23
23
|
|
|
24
|
-
| Client
|
|
25
|
-
|
|
26
|
-
| `ExternalSignInClient`
|
|
27
|
-
| `AppsClient`
|
|
28
|
-
| `AuthorizationClient`
|
|
29
|
-
| `ChangeLogClient`
|
|
30
|
-
| `DiagnosticsClient`
|
|
31
|
-
| `DynamicPropertiesClient`
|
|
32
|
-
| `JobsClient`
|
|
33
|
-
| `LocalizableSettingsClient` | Localizable setting values
|
|
34
|
-
| `ModulesClient`
|
|
35
|
-
| `OAuthAppsClient`
|
|
36
|
-
| `PushNotificationClient`
|
|
37
|
-
| `SecurityClient`
|
|
38
|
-
| `SettingClient`
|
|
24
|
+
| Client | Description |
|
|
25
|
+
| --------------------------- | -------------------------------------------------------- |
|
|
26
|
+
| `ExternalSignInClient` | External authentication provider sign-in |
|
|
27
|
+
| `AppsClient` | Application descriptor operations |
|
|
28
|
+
| `AuthorizationClient` | Permission and role checking |
|
|
29
|
+
| `ChangeLogClient` | Platform change log / audit trail |
|
|
30
|
+
| `DiagnosticsClient` | System diagnostics and health |
|
|
31
|
+
| `DynamicPropertiesClient` | Dynamic property CRUD and dictionary management |
|
|
32
|
+
| `JobsClient` | Background job management |
|
|
33
|
+
| `LocalizableSettingsClient` | Localizable setting values |
|
|
34
|
+
| `ModulesClient` | Platform module management (install, update, restart) |
|
|
35
|
+
| `OAuthAppsClient` | OAuth application registration |
|
|
36
|
+
| `PushNotificationClient` | Push notification search and mark-as-read |
|
|
37
|
+
| `SecurityClient` | User management, roles, permissions, password operations |
|
|
38
|
+
| `SettingClient` | Platform settings CRUD |
|
|
39
39
|
|
|
40
40
|
## Key DTOs (Interfaces)
|
|
41
41
|
|
|
42
|
-
| Interface
|
|
43
|
-
|
|
44
|
-
| `PushNotification`
|
|
45
|
-
| `PushNotificationSearchCriteria` | Search criteria for notification queries
|
|
46
|
-
| `ApplicationUser`
|
|
47
|
-
| `Role`
|
|
48
|
-
| `Permission`
|
|
49
|
-
| `DynamicProperty`
|
|
50
|
-
| `DynamicObjectProperty`
|
|
51
|
-
| `ModuleDescriptor`
|
|
52
|
-
| `ChangeLogSearchCriteria`
|
|
53
|
-
| `ChangeLogSearchResult`
|
|
54
|
-
| `ObjectSettingEntry`
|
|
55
|
-
| `License`
|
|
42
|
+
| Interface | Description |
|
|
43
|
+
| -------------------------------- | --------------------------------------------------------------------------------- |
|
|
44
|
+
| `PushNotification` | Push notification payload: `id`, `title`, `notifyType`, `isNew`, `finished`, etc. |
|
|
45
|
+
| `PushNotificationSearchCriteria` | Search criteria for notification queries |
|
|
46
|
+
| `ApplicationUser` | Platform user with roles, permissions, logins |
|
|
47
|
+
| `Role` | Security role with permissions |
|
|
48
|
+
| `Permission` | Individual permission entry |
|
|
49
|
+
| `DynamicProperty` | Dynamic property definition |
|
|
50
|
+
| `DynamicObjectProperty` | Property value bound to an object |
|
|
51
|
+
| `ModuleDescriptor` | Module metadata (id, version, dependencies) |
|
|
52
|
+
| `ChangeLogSearchCriteria` | Audit log search parameters |
|
|
53
|
+
| `ChangeLogSearchResult` | Paginated audit log results |
|
|
54
|
+
| `ObjectSettingEntry` | Setting entry with value and metadata |
|
|
55
|
+
| `License` | Platform license information |
|
|
56
56
|
|
|
57
57
|
## Base Class
|
|
58
58
|
|
|
@@ -93,7 +93,7 @@ const securityClient = new SecurityClient();
|
|
|
93
93
|
const user = await securityClient.getCurrentUser();
|
|
94
94
|
|
|
95
95
|
console.log(`Logged in as: ${user.userName}`);
|
|
96
|
-
console.log(`Roles: ${user.roles?.map(r => r.name).join(", ")}`);
|
|
96
|
+
console.log(`Roles: ${user.roles?.map((r) => r.name).join(", ")}`);
|
|
97
97
|
console.log(`Is admin: ${user.isAdministrator}`);
|
|
98
98
|
```
|
|
99
99
|
|
|
@@ -34,27 +34,27 @@ Creates a new stack instance. Called once by the navigation plugin.
|
|
|
34
34
|
|
|
35
35
|
### API
|
|
36
36
|
|
|
37
|
-
| Method
|
|
38
|
-
|
|
39
|
-
| `openWorkspace(event)`
|
|
40
|
-
| `openBlade(event)`
|
|
41
|
-
| `closeBlade(bladeId)`
|
|
42
|
-
| `closeChildren(parentId)`
|
|
43
|
-
| `replaceCurrentBlade(event)`
|
|
44
|
-
| `coverCurrentBlade(event)`
|
|
45
|
-
| `registerBeforeClose(bladeId, guard)` | Registers a guard function. Return `true` from the guard to PREVENT closing.
|
|
46
|
-
| `unregisterBeforeClose(bladeId)`
|
|
47
|
-
| `setBladeError(bladeId, error)`
|
|
48
|
-
| `clearBladeError(bladeId)`
|
|
49
|
-
| `setBladeTitle(bladeId, title)`
|
|
37
|
+
| Method | Description |
|
|
38
|
+
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
39
|
+
| `openWorkspace(event)` | Sets the root blade (index 0). Closes all existing blades unconditionally. |
|
|
40
|
+
| `openBlade(event)` | Opens a child blade after a parent. Closes any blades deeper than the parent (with guard checks). |
|
|
41
|
+
| `closeBlade(bladeId)` | Closes a blade and all its children. Returns `true` if a guard prevented closing. |
|
|
42
|
+
| `closeChildren(parentId)` | Closes all blades after the given parent. |
|
|
43
|
+
| `replaceCurrentBlade(event)` | Destroys the current active blade and creates a new one at the same stack index with the same `parentId`. |
|
|
44
|
+
| `coverCurrentBlade(event)` | Hides the current active blade (keeps it in the stack) and opens a new blade on top. Closing the covering blade restores the hidden blade. |
|
|
45
|
+
| `registerBeforeClose(bladeId, guard)` | Registers a guard function. Return `true` from the guard to PREVENT closing. |
|
|
46
|
+
| `unregisterBeforeClose(bladeId)` | Removes a close guard. |
|
|
47
|
+
| `setBladeError(bladeId, error)` | Sets an error on a blade descriptor (displayed as error banner). |
|
|
48
|
+
| `clearBladeError(bladeId)` | Clears a blade's error. |
|
|
49
|
+
| `setBladeTitle(bladeId, title)` | Updates the blade's title in the descriptor. |
|
|
50
50
|
|
|
51
51
|
### Computed
|
|
52
52
|
|
|
53
|
-
| Property
|
|
54
|
-
|
|
55
|
-
| `workspace`
|
|
56
|
-
| `blades`
|
|
57
|
-
| `activeBlade` | `BladeDescriptor`
|
|
53
|
+
| Property | Type | Description |
|
|
54
|
+
| ------------- | ---------------------------- | ------------------------ |
|
|
55
|
+
| `workspace` | `BladeDescriptor` | The root blade (index 0) |
|
|
56
|
+
| `blades` | `readonly BladeDescriptor[]` | Full ordered stack |
|
|
57
|
+
| `activeBlade` | `BladeDescriptor` | The last visible blade |
|
|
58
58
|
|
|
59
59
|
### Composable: `useBladeStack()`
|
|
60
60
|
|
|
@@ -66,11 +66,11 @@ Inter-blade communication via exposed methods.
|
|
|
66
66
|
|
|
67
67
|
### Factory: `createBladeMessaging(bladeStack)`
|
|
68
68
|
|
|
69
|
-
| Method
|
|
70
|
-
|
|
71
|
-
| `exposeToChildren(bladeId, methods)`
|
|
69
|
+
| Method | Description |
|
|
70
|
+
| ------------------------------------------ | ------------------------------------------------------------------------- |
|
|
71
|
+
| `exposeToChildren(bladeId, methods)` | Registers methods that child blades can call |
|
|
72
72
|
| `callParent(callerBladeId, method, args?)` | Calls a method on the caller's parent blade. Returns the method's result. |
|
|
73
|
-
| `cleanup(bladeId)`
|
|
73
|
+
| `cleanup(bladeId)` | Removes exposed methods for a blade (called on close). |
|
|
74
74
|
|
|
75
75
|
### Composable: `useBladeMessaging()`
|
|
76
76
|
|
|
@@ -84,13 +84,13 @@ The primary composable for module developers. Maps the legacy `IUseBladeNavigati
|
|
|
84
84
|
|
|
85
85
|
```typescript
|
|
86
86
|
const {
|
|
87
|
-
openBlade,
|
|
88
|
-
closeBlade,
|
|
89
|
-
resolveBladeByName,
|
|
90
|
-
onParentCall,
|
|
91
|
-
onBeforeClose,
|
|
92
|
-
blades,
|
|
93
|
-
activeWorkspace,
|
|
87
|
+
openBlade, // Open a child blade
|
|
88
|
+
closeBlade, // Close by index (deprecated -- use useBlade().closeSelf())
|
|
89
|
+
resolveBladeByName, // Look up a blade component by name
|
|
90
|
+
onParentCall, // Call parent blade method (deprecated -- use useBlade().callParent())
|
|
91
|
+
onBeforeClose, // Register close guard (deprecated -- use useBlade().onBeforeClose())
|
|
92
|
+
blades, // Reactive blade array (shim objects)
|
|
93
|
+
activeWorkspace, // Current workspace blade
|
|
94
94
|
} = useBladeNavigation();
|
|
95
95
|
```
|
|
96
96
|
|
|
@@ -124,18 +124,18 @@ openBlade({
|
|
|
124
124
|
|
|
125
125
|
The plain data object stored in the stack for each blade:
|
|
126
126
|
|
|
127
|
-
| Field
|
|
128
|
-
|
|
129
|
-
| `id`
|
|
130
|
-
| `name`
|
|
131
|
-
| `url`
|
|
132
|
-
| `param`
|
|
133
|
-
| `query`
|
|
134
|
-
| `options`
|
|
135
|
-
| `parentId` | `string?`
|
|
136
|
-
| `visible`
|
|
137
|
-
| `error`
|
|
138
|
-
| `title`
|
|
127
|
+
| Field | Type | Description |
|
|
128
|
+
| ---------- | ---------- | -------------------------------------------------------------------------- |
|
|
129
|
+
| `id` | `string` | Unique instance ID (auto-generated) |
|
|
130
|
+
| `name` | `string` | Blade registration name |
|
|
131
|
+
| `url` | `string?` | URL segment for address bar sync |
|
|
132
|
+
| `param` | `unknown` | Parameter passed when opening (e.g., entity ID) |
|
|
133
|
+
| `query` | `Record?` | Query parameters |
|
|
134
|
+
| `options` | `unknown` | Arbitrary options passed to the blade |
|
|
135
|
+
| `parentId` | `string?` | ID of the parent blade |
|
|
136
|
+
| `visible` | `boolean` | Whether the blade is rendered (false when covered via `coverCurrentBlade`) |
|
|
137
|
+
| `error` | `unknown?` | Error state for the error banner |
|
|
138
|
+
| `title` | `string?` | Dynamic title override |
|
|
139
139
|
|
|
140
140
|
## Tips
|
|
141
141
|
|
|
@@ -15,7 +15,7 @@ The pattern follows a "define once, inject anywhere" approach: the blade compone
|
|
|
15
15
|
|
|
16
16
|
```typescript
|
|
17
17
|
// In a blade's <script setup>
|
|
18
|
-
import { defineBladeContext, injectBladeContext } from
|
|
18
|
+
import { defineBladeContext, injectBladeContext } from "@vc-shell/framework";
|
|
19
19
|
|
|
20
20
|
// Provide context — refs/computeds are auto-unwrapped for consumers
|
|
21
21
|
defineBladeContext({ item, disabled, loading });
|
|
@@ -26,7 +26,7 @@ defineBladeContext(computed(() => ({ id: item.value?.id })));
|
|
|
26
26
|
|
|
27
27
|
```typescript
|
|
28
28
|
// In a widget or nested component
|
|
29
|
-
import { injectBladeContext } from
|
|
29
|
+
import { injectBladeContext } from "@vc-shell/framework";
|
|
30
30
|
|
|
31
31
|
const ctx = injectBladeContext();
|
|
32
32
|
// Refs are already unwrapped — access values directly, no .value needed
|
|
@@ -38,9 +38,9 @@ const item = computed(() => ctx.value.item as { id: string; name: string });
|
|
|
38
38
|
|
|
39
39
|
### defineBladeContext
|
|
40
40
|
|
|
41
|
-
| Parameter | Type
|
|
42
|
-
|
|
43
|
-
| `data`
|
|
41
|
+
| Parameter | Type | Required | Description |
|
|
42
|
+
| --------- | ------------------------------------------- | -------- | -------------------------------------- |
|
|
43
|
+
| `data` | `MaybeRefOrGetter<Record<string, unknown>>` | Yes | Plain object, ref, or getter to expose |
|
|
44
44
|
|
|
45
45
|
Returns `void`. Must be called in the blade's `<script setup>`.
|
|
46
46
|
|
|
@@ -82,11 +82,13 @@ const customer = ref({ id: "cust-1", name: "Acme Corp" });
|
|
|
82
82
|
const loading = ref(false);
|
|
83
83
|
|
|
84
84
|
// Expose the customer data to all descendant widgets
|
|
85
|
-
defineBladeContext(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
defineBladeContext(
|
|
86
|
+
computed(() => ({
|
|
87
|
+
id: customer.value?.id,
|
|
88
|
+
name: customer.value?.name,
|
|
89
|
+
loading: loading.value,
|
|
90
|
+
})),
|
|
91
|
+
);
|
|
90
92
|
</script>
|
|
91
93
|
```
|
|
92
94
|
|
|
@@ -187,10 +187,7 @@ const { action: loadDashboardData } = useAsync(async () => {
|
|
|
187
187
|
const orderClient = await getOrderClient();
|
|
188
188
|
const customerClient = await getCustomerClient();
|
|
189
189
|
|
|
190
|
-
const [orders, customers] = await Promise.all([
|
|
191
|
-
orderClient.searchOrders({ take: 5, sort: "createdDate:DESC" }),
|
|
192
|
-
customerClient.searchCustomers({ take: 5, sort: "createdDate:DESC" }),
|
|
193
|
-
]);
|
|
190
|
+
const [orders, customers] = await Promise.all([orderClient.searchOrders({ take: 5, sort: "createdDate:DESC" }), customerClient.searchCustomers({ take: 5, sort: "createdDate:DESC" })]);
|
|
194
191
|
|
|
195
192
|
recentOrders.value = orders.results ?? [];
|
|
196
193
|
recentCustomers.value = customers.results ?? [];
|
|
@@ -263,25 +260,25 @@ const response = await fetch("https://api.weather.com/forecast");
|
|
|
263
260
|
|
|
264
261
|
### Parameters
|
|
265
262
|
|
|
266
|
-
| Parameter | Type
|
|
267
|
-
|
|
268
|
-
| `c`
|
|
263
|
+
| Parameter | Type | Required | Description |
|
|
264
|
+
| --------- | ---------------------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------ |
|
|
265
|
+
| `c` | `new (baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> }) => ApiClient` | Yes | API client constructor class. Must implement `IAuthApiBase`. |
|
|
269
266
|
|
|
270
267
|
### Returns: `UseApiClientReturn<ApiClient>`
|
|
271
268
|
|
|
272
|
-
| Property
|
|
273
|
-
|
|
269
|
+
| Property | Type | Description |
|
|
270
|
+
| -------------- | -------------------------- | ---------------------------------------------------------------------- |
|
|
274
271
|
| `getApiClient` | `() => Promise<ApiClient>` | Async factory that returns a configured, authenticated client instance |
|
|
275
272
|
|
|
276
273
|
### IAuthApiBase Interface
|
|
277
274
|
|
|
278
275
|
All generated API client classes implement this interface:
|
|
279
276
|
|
|
280
|
-
| Property / Method | Type
|
|
281
|
-
|
|
282
|
-
| `authToken`
|
|
283
|
-
| `setAuthToken`
|
|
284
|
-
| `getBaseUrl`
|
|
277
|
+
| Property / Method | Type | Description |
|
|
278
|
+
| ----------------- | ------------------------------------------------- | ----------------------------- |
|
|
279
|
+
| `authToken` | `string` | Current authentication token |
|
|
280
|
+
| `setAuthToken` | `(token: string) => void` | Sets the authentication token |
|
|
281
|
+
| `getBaseUrl` | `(defaultUrl: string, baseUrl: string) => string` | Resolves the API base URL |
|
|
285
282
|
|
|
286
283
|
### Generated Client Classes
|
|
287
284
|
|
|
@@ -13,15 +13,15 @@ Manages custom action buttons in the mobile app bar. Uses provide/inject to shar
|
|
|
13
13
|
|
|
14
14
|
```vue
|
|
15
15
|
<script setup lang="ts">
|
|
16
|
-
import { useAppBarMobileButtons } from
|
|
17
|
-
import { onUnmounted, computed, ref } from
|
|
16
|
+
import { useAppBarMobileButtons } from "@vc-shell/framework";
|
|
17
|
+
import { onUnmounted, computed, ref } from "vue";
|
|
18
18
|
|
|
19
19
|
const { register, unregister } = useAppBarMobileButtons();
|
|
20
20
|
const unreadCount = ref(3);
|
|
21
21
|
|
|
22
22
|
register({
|
|
23
|
-
id:
|
|
24
|
-
icon:
|
|
23
|
+
id: "notifications-btn",
|
|
24
|
+
icon: "fas fa-bell",
|
|
25
25
|
onClick: () => openNotificationsPanel(),
|
|
26
26
|
order: 10,
|
|
27
27
|
badge: computed(() => unreadCount.value > 0),
|
|
@@ -29,7 +29,7 @@ register({
|
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
// Always clean up when the component is destroyed
|
|
32
|
-
onUnmounted(() => unregister(
|
|
32
|
+
onUnmounted(() => unregister("notifications-btn"));
|
|
33
33
|
</script>
|
|
34
34
|
```
|
|
35
35
|
|
|
@@ -37,27 +37,27 @@ onUnmounted(() => unregister('notifications-btn'));
|
|
|
37
37
|
|
|
38
38
|
### Returns
|
|
39
39
|
|
|
40
|
-
| Property
|
|
41
|
-
|
|
42
|
-
| `registeredButtons` | `ComputedRef<AppBarButtonContent[]>`
|
|
43
|
-
| `register`
|
|
44
|
-
| `unregister`
|
|
45
|
-
| `getButton`
|
|
46
|
-
| `getButtons`
|
|
40
|
+
| Property | Type | Description |
|
|
41
|
+
| ------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
42
|
+
| `registeredButtons` | `ComputedRef<AppBarButtonContent[]>` | All registered buttons (unfiltered, unsorted). Useful for debugging. |
|
|
43
|
+
| `register` | `(button: AppBarButtonContent) => void` | Add or update a button by `id`. If a button with the same ID already exists, it is replaced. |
|
|
44
|
+
| `unregister` | `(buttonId: string) => void` | Remove a button by `id`. No-op if the ID does not exist. |
|
|
45
|
+
| `getButton` | `(buttonId: string) => AppBarButtonContent \| undefined` | Look up a single button by ID. |
|
|
46
|
+
| `getButtons` | `ComputedRef<AppBarButtonContent[]>` | Visible buttons sorted by `order` (ascending). Filters out buttons where `isVisible` is `false`. |
|
|
47
47
|
|
|
48
48
|
### AppBarButtonContent
|
|
49
49
|
|
|
50
|
-
| Field
|
|
51
|
-
|
|
52
|
-
| `id`
|
|
53
|
-
| `icon`
|
|
54
|
-
| `component` | `Component`
|
|
55
|
-
| `props`
|
|
56
|
-
| `onClick`
|
|
57
|
-
| `onClose`
|
|
58
|
-
| `order`
|
|
59
|
-
| `isVisible` | `MaybeRef<boolean>`
|
|
60
|
-
| `badge`
|
|
50
|
+
| Field | Type | Required | Description |
|
|
51
|
+
| ----------- | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
|
|
52
|
+
| `id` | `string` | Yes | Unique identifier. Used for register/unregister/lookup. |
|
|
53
|
+
| `icon` | `Component \| string` | No | Icon component or CSS class string (e.g., `'fas fa-bell'`). |
|
|
54
|
+
| `component` | `Component` | No | Custom Vue component to render instead of a default icon button. |
|
|
55
|
+
| `props` | `Record<string, unknown>` | No | Props passed to the custom `component`. |
|
|
56
|
+
| `onClick` | `() => void` | No | Click handler for the default button rendering. |
|
|
57
|
+
| `onClose` | `() => void` | No | Close/dismiss handler (e.g., for popover-style buttons). |
|
|
58
|
+
| `order` | `number` | No | Sort priority. Lower values appear first. Defaults to 0 if omitted. |
|
|
59
|
+
| `isVisible` | `MaybeRef<boolean>` | No | Reactive visibility toggle. When `false`, the button is excluded from `getButtons`. Defaults to `true`. |
|
|
60
|
+
| `badge` | `MaybeRef<boolean>` | No | Show a small badge indicator on the button (e.g., for unread notifications). |
|
|
61
61
|
|
|
62
62
|
## Setup
|
|
63
63
|
|
|
@@ -65,7 +65,7 @@ onUnmounted(() => unregister('notifications-btn'));
|
|
|
65
65
|
|
|
66
66
|
```typescript
|
|
67
67
|
// Inside VcApp.vue setup
|
|
68
|
-
import { provideAppBarMobileButtonsService } from
|
|
68
|
+
import { provideAppBarMobileButtonsService } from "@vc-shell/framework";
|
|
69
69
|
|
|
70
70
|
provideAppBarMobileButtonsService();
|
|
71
71
|
```
|
|
@@ -74,15 +74,15 @@ provideAppBarMobileButtonsService();
|
|
|
74
74
|
|
|
75
75
|
```vue
|
|
76
76
|
<script setup lang="ts">
|
|
77
|
-
import { useAppBarMobileButtons } from
|
|
78
|
-
import { ref, computed, onUnmounted } from
|
|
77
|
+
import { useAppBarMobileButtons } from "@vc-shell/framework";
|
|
78
|
+
import { ref, computed, onUnmounted } from "vue";
|
|
79
79
|
|
|
80
80
|
const { register, unregister } = useAppBarMobileButtons();
|
|
81
81
|
const isFilterActive = ref(false);
|
|
82
82
|
|
|
83
83
|
register({
|
|
84
|
-
id:
|
|
85
|
-
icon: computed(() => isFilterActive.value ?
|
|
84
|
+
id: "product-list-filter",
|
|
85
|
+
icon: computed(() => (isFilterActive.value ? "fas fa-filter" : "far fa-filter")),
|
|
86
86
|
onClick: () => {
|
|
87
87
|
isFilterActive.value = !isFilterActive.value;
|
|
88
88
|
// Open or close the filter panel
|
|
@@ -91,7 +91,7 @@ register({
|
|
|
91
91
|
badge: isFilterActive,
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
-
onUnmounted(() => unregister(
|
|
94
|
+
onUnmounted(() => unregister("product-list-filter"));
|
|
95
95
|
</script>
|
|
96
96
|
```
|
|
97
97
|
|
|
@@ -101,20 +101,20 @@ If you need more than an icon and a click handler (e.g., a dropdown or popover),
|
|
|
101
101
|
|
|
102
102
|
```vue
|
|
103
103
|
<script setup lang="ts">
|
|
104
|
-
import { useAppBarMobileButtons } from
|
|
105
|
-
import { onUnmounted, markRaw } from
|
|
106
|
-
import LanguageSwitcher from
|
|
104
|
+
import { useAppBarMobileButtons } from "@vc-shell/framework";
|
|
105
|
+
import { onUnmounted, markRaw } from "vue";
|
|
106
|
+
import LanguageSwitcher from "./LanguageSwitcher.vue";
|
|
107
107
|
|
|
108
108
|
const { register, unregister } = useAppBarMobileButtons();
|
|
109
109
|
|
|
110
110
|
register({
|
|
111
|
-
id:
|
|
111
|
+
id: "language-switcher",
|
|
112
112
|
component: markRaw(LanguageSwitcher),
|
|
113
|
-
props: { position:
|
|
113
|
+
props: { position: "bottom-right" },
|
|
114
114
|
order: 50,
|
|
115
115
|
});
|
|
116
116
|
|
|
117
|
-
onUnmounted(() => unregister(
|
|
117
|
+
onUnmounted(() => unregister("language-switcher"));
|
|
118
118
|
</script>
|
|
119
119
|
```
|
|
120
120
|
|