@vc-shell/vc-app-skill 2.0.0-alpha.33 → 2.0.0-alpha.34
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 +78 -54
- package/README.md +42 -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 +18 -7
- 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 +28 -24
- 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 +27 -25
- package/runtime/knowledge/docs/core/composables/useBladeRegistry/useBladeRegistry.docs.md +15 -15
- package/runtime/knowledge/docs/core/composables/useBladeWidgets/index.docs.md +43 -47
- 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 +9 -9
- 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/usePlatformLocaleSync/usePlatformLocaleSync.docs.md +28 -0
- 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 +22 -13
- 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 +79 -62
- 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 +91 -83
- 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 +5 -5
- 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 +11 -17
- 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 +100 -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 +55 -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 +92 -65
- package/runtime/knowledge/docs/ui/components/molecules/vc-checkbox-group/vc-checkbox-group.docs.md +22 -36
- package/runtime/knowledge/docs/ui/components/molecules/vc-color-input/vc-color-input.docs.md +65 -23
- package/runtime/knowledge/docs/ui/components/molecules/vc-date-picker/vc-date-picker.docs.md +52 -73
- 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 +56 -73
- package/runtime/knowledge/docs/ui/components/molecules/vc-field/vc-field.docs.md +61 -27
- package/runtime/knowledge/docs/ui/components/molecules/vc-file-upload/vc-file-upload.docs.md +42 -50
- 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 +109 -131
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-currency/vc-input-currency.docs.md +47 -88
- package/runtime/knowledge/docs/ui/components/molecules/vc-input-dropdown/vc-input-dropdown.docs.md +50 -64
- 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 +57 -65
- 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 +55 -20
- package/runtime/knowledge/docs/ui/components/molecules/vc-radio-group/vc-radio-group.docs.md +21 -35
- package/runtime/knowledge/docs/ui/components/molecules/vc-rating/vc-rating.docs.md +38 -33
- package/runtime/knowledge/docs/ui/components/molecules/vc-select/vc-select.docs.md +72 -83
- package/runtime/knowledge/docs/ui/components/molecules/vc-slider/vc-slider.docs.md +21 -16
- package/runtime/knowledge/docs/ui/components/molecules/vc-switch/vc-switch.docs.md +55 -64
- package/runtime/knowledge/docs/ui/components/molecules/vc-textarea/vc-textarea.docs.md +51 -70
- 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 +90 -75
- package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/composables/table-composables.docs.md +99 -48
- package/runtime/knowledge/docs/ui/components/organisms/vc-data-table/vc-data-table.docs.md +548 -367
- 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 +17 -8
- package/runtime/knowledge/migration-prompts/blade-props-migration.md +1 -2
- 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 +8 -3
- package/runtime/knowledge/migration-prompts/nswag-migration.md +25 -29
- 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 +48 -27
- 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 +241 -62
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: icon-migration
|
|
3
|
+
description: AI transformation rules for migrating non-lucide icons to lucide equivalents.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Icon Migration: material-/bi-/fa- → lucide-
|
|
7
|
+
|
|
8
|
+
All icons in the v2 framework must use the `lucide-` prefix. Replace all `material-*`, `bi-*`, and `fa-*` icons with their lucide equivalents.
|
|
9
|
+
|
|
10
|
+
## RULE 1: Replace Icon Strings
|
|
11
|
+
|
|
12
|
+
Scan ALL `.vue` and `.ts` files in the affected module for icon strings. For each non-lucide icon, choose the closest semantic match from the lucide icon set (https://lucide.dev/icons).
|
|
13
|
+
|
|
14
|
+
When choosing a replacement:
|
|
15
|
+
|
|
16
|
+
- Match by **meaning**, not by visual similarity — e.g., `material-delete` → `lucide-trash-2` (both mean "delete")
|
|
17
|
+
- Use the most specific icon available — e.g., `material-person_add` → `lucide-user-plus` (not just `lucide-user`)
|
|
18
|
+
- When no perfect match exists, pick the closest conceptual equivalent and note it in the report
|
|
19
|
+
|
|
20
|
+
**BEFORE:**
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
const bladeToolbar = computed((): IBladeToolbar[] => [
|
|
24
|
+
{
|
|
25
|
+
id: "refresh",
|
|
26
|
+
icon: "material-refresh",
|
|
27
|
+
title: t("...REFRESH"),
|
|
28
|
+
clickHandler: reload,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "add",
|
|
32
|
+
icon: "material-add",
|
|
33
|
+
title: t("...ADD"),
|
|
34
|
+
clickHandler: addItem,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: "delete",
|
|
38
|
+
icon: "material-delete",
|
|
39
|
+
title: t("...DELETE"),
|
|
40
|
+
clickHandler: deleteItems,
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**AFTER:**
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
const bladeToolbar = computed((): IBladeToolbar[] => [
|
|
49
|
+
{
|
|
50
|
+
id: "refresh",
|
|
51
|
+
icon: "lucide-refresh-cw",
|
|
52
|
+
title: t("...REFRESH"),
|
|
53
|
+
clickHandler: reload,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "add",
|
|
57
|
+
icon: "lucide-plus",
|
|
58
|
+
title: t("...ADD"),
|
|
59
|
+
clickHandler: addItem,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "delete",
|
|
63
|
+
icon: "lucide-trash-2",
|
|
64
|
+
title: t("...DELETE"),
|
|
65
|
+
clickHandler: deleteItems,
|
|
66
|
+
},
|
|
67
|
+
]);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## RULE 2: Where Icons Appear
|
|
71
|
+
|
|
72
|
+
Icons appear in these contexts — check ALL of them:
|
|
73
|
+
|
|
74
|
+
1. **Toolbar items:** `icon: "material-*"` in `IBladeToolbar[]`
|
|
75
|
+
2. **Menu items in defineBlade:** `icon: "material-*"` in `menuItem` config
|
|
76
|
+
3. **VcIcon components:** `<VcIcon icon="material-*" />`
|
|
77
|
+
4. **Widget declarations:** `icon: "material-*"` in `useBladeWidgets()` config
|
|
78
|
+
5. **Action builders / row actions:** `icon: "material-*"` in action definitions
|
|
79
|
+
6. **Empty state configs:** `icon: "material-*"` in `:empty-state` or `:not-found-state`
|
|
80
|
+
7. **Any other string literal** containing `material-`, `bi-`, or `fa-` prefixes
|
|
81
|
+
|
|
82
|
+
## RULE 3: Perform Replacements In-Place
|
|
83
|
+
|
|
84
|
+
This is a **mechanical replacement** — do not restructure code. For each icon string found:
|
|
85
|
+
|
|
86
|
+
1. Identify the icon name (e.g., `material-edit_square`)
|
|
87
|
+
2. Determine the semantic meaning (e.g., "edit with square indicator")
|
|
88
|
+
3. Find the best lucide match (e.g., `lucide-square-pen`)
|
|
89
|
+
4. Replace the string in-place
|
|
90
|
+
|
|
91
|
+
## Verification
|
|
92
|
+
|
|
93
|
+
After migration:
|
|
94
|
+
|
|
95
|
+
1. Search for remaining non-lucide icons: `grep -rn '"material-\|"bi-\|fa-' src/modules/`
|
|
96
|
+
2. Verify no results (all icons should be `lucide-*`)
|
|
97
|
+
3. Run the app and visually confirm icons render correctly
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: manual-migration-audit
|
|
3
|
+
description: AI transformation rules for findings emitted by manual-migration-audit transform.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Manual Migration Audit Fixes
|
|
7
|
+
|
|
8
|
+
Apply targeted refactors for diagnostics emitted by `manual-migration-audit`.
|
|
9
|
+
|
|
10
|
+
## RULE 1: `useExternalWidgets` is removed
|
|
11
|
+
|
|
12
|
+
Replace `useExternalWidgets(...)` with module-level widget composables based on `useBladeWidgets()`.
|
|
13
|
+
|
|
14
|
+
**BEFORE:**
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { useExternalWidgets } from "@vc-shell/framework";
|
|
18
|
+
|
|
19
|
+
useExternalWidgets({ bladeId, item });
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**AFTER:**
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { useEntityWidgets } from "../widgets";
|
|
26
|
+
|
|
27
|
+
useEntityWidgets({
|
|
28
|
+
item,
|
|
29
|
+
isVisible: computed(() => !!param.value),
|
|
30
|
+
disabled,
|
|
31
|
+
});
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
If widget migration is not yet done, perform it first (`widgets-migration` topic).
|
|
35
|
+
|
|
36
|
+
## RULE 2: Replace `moment` usage with framework date utilities
|
|
37
|
+
|
|
38
|
+
**BEFORE:**
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import moment from "moment";
|
|
42
|
+
|
|
43
|
+
const formatted = moment(item.value.createdDate).format("L LT");
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**AFTER:**
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import { formatDateWithPattern } from "@vc-shell/framework";
|
|
50
|
+
|
|
51
|
+
const formatted = formatDateWithPattern(item.value.createdDate, "L LT", currentLocale.value);
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
For relative dates, use `formatDateRelative` from `@vc-shell/framework`.
|
|
55
|
+
|
|
56
|
+
## RULE 3: Replace `useFunctions().debounce` with `useDebounceFn`
|
|
57
|
+
|
|
58
|
+
**BEFORE:**
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { useFunctions } from "@vc-shell/framework";
|
|
62
|
+
|
|
63
|
+
const { debounce } = useFunctions();
|
|
64
|
+
const debouncedSearch = debounce(runSearch, 300);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**AFTER:**
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
import { useDebounceFn } from "@vueuse/core";
|
|
71
|
+
|
|
72
|
+
const debouncedSearch = useDebounceFn(runSearch, 300);
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## RULE 4: Replace `closeBlade()` with `closeSelf()` from `useBlade()`
|
|
76
|
+
|
|
77
|
+
**BEFORE:**
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
const { closeBlade } = useBlade();
|
|
81
|
+
await closeBlade();
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**AFTER:**
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
const { closeSelf } = useBlade();
|
|
88
|
+
await closeSelf();
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
If `closeBlade(index)` was used to close by index, refactor to close current blade only (or use explicit navigation logic) — do not keep index-based close calls.
|
|
92
|
+
|
|
93
|
+
## RULE 5: Consolidate multiple `useBlade()` calls per file
|
|
94
|
+
|
|
95
|
+
Use one `useBlade()` destructuring per component/composable unless there is a strong technical reason.
|
|
96
|
+
|
|
97
|
+
**BEFORE:**
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const { openBlade } = useBlade();
|
|
101
|
+
const { closeSelf } = useBlade();
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**AFTER:**
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const { openBlade, closeSelf, callParent, param } = useBlade();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Verification
|
|
111
|
+
|
|
112
|
+
After migration:
|
|
113
|
+
|
|
114
|
+
1. Search and remove stale APIs: `useExternalWidgets`, `import moment`, `useFunctions(`, `closeBlade(`.
|
|
115
|
+
2. Search for duplicate `useBlade()` calls in the same file and consolidate.
|
|
116
|
+
3. Run `npx vue-tsc --noEmit`.
|
|
117
|
+
4. Run `yarn build`.
|
|
@@ -146,6 +146,7 @@ export default defineAppModule({
|
|
|
146
146
|
```
|
|
147
147
|
|
|
148
148
|
Toast options:
|
|
149
|
+
|
|
149
150
|
- `mode`: `"auto"` (show and auto-dismiss), `"progress"` (show with progress bar), `"silent"` (no toast)
|
|
150
151
|
- `severity`: `"info"` (default), `"warning"`, `"error"`, `"critical"`
|
|
151
152
|
|
|
@@ -174,9 +175,13 @@ setNotificationHandler((message) => {
|
|
|
174
175
|
});
|
|
175
176
|
|
|
176
177
|
// or watch pattern:
|
|
177
|
-
watch(
|
|
178
|
-
|
|
179
|
-
|
|
178
|
+
watch(
|
|
179
|
+
moduleNotifications,
|
|
180
|
+
(newVal) => {
|
|
181
|
+
// manual toast management
|
|
182
|
+
},
|
|
183
|
+
{ deep: true },
|
|
184
|
+
);
|
|
180
185
|
```
|
|
181
186
|
|
|
182
187
|
**AFTER:**
|
|
@@ -8,6 +8,7 @@ description: AI transformation rules for NSwag class→interface DTO migration.
|
|
|
8
8
|
You are tasked with fixing TypeScript errors caused by migrating NSwag-generated API clients from class-based to interface-based data models.
|
|
9
9
|
|
|
10
10
|
**Context:**
|
|
11
|
+
|
|
11
12
|
- API Client CLASSES (e.g., `*Client` classes) remain unchanged — they still have constructors
|
|
12
13
|
- DATA MODEL types (DTOs, Commands, Queries, etc.) are now INTERFACES instead of classes
|
|
13
14
|
- Interfaces cannot be instantiated with `new` — use object literals with type assertions instead
|
|
@@ -120,24 +121,14 @@ When a framework function expects a constructor function (callable with `new`),
|
|
|
120
121
|
|
|
121
122
|
```typescript
|
|
122
123
|
// BEFORE — Framework expects constructor
|
|
123
|
-
const { loadItems } = useFrameworkHook<Type1, Type2>(
|
|
124
|
-
fetchFunction,
|
|
125
|
-
ItemClass,
|
|
126
|
-
OtherClass,
|
|
127
|
-
);
|
|
124
|
+
const { loadItems } = useFrameworkHook<Type1, Type2>(fetchFunction, ItemClass, OtherClass);
|
|
128
125
|
|
|
129
126
|
// AFTER — Create factory functions
|
|
130
|
-
const createItem = (data?: Partial<ItemType>): ItemType =>
|
|
131
|
-
({ ...data } as ItemType);
|
|
127
|
+
const createItem = (data?: Partial<ItemType>): ItemType => ({ ...data }) as ItemType;
|
|
132
128
|
|
|
133
|
-
const createOther = (data?: Partial<OtherType>): OtherType =>
|
|
134
|
-
({ ...data } as OtherType);
|
|
129
|
+
const createOther = (data?: Partial<OtherType>): OtherType => ({ ...data }) as OtherType;
|
|
135
130
|
|
|
136
|
-
const { loadItems } = useFrameworkHook<Type1, Type2>(
|
|
137
|
-
fetchFunction,
|
|
138
|
-
createItem,
|
|
139
|
-
createOther,
|
|
140
|
-
);
|
|
131
|
+
const { loadItems } = useFrameworkHook<Type1, Type2>(fetchFunction, createItem, createOther);
|
|
141
132
|
```
|
|
142
133
|
|
|
143
134
|
## RULE 4: Image Import Conflict with Global DOM Type
|
|
@@ -165,14 +156,14 @@ import { Image as ApiImage, Entity } from "@your-api-package";
|
|
|
165
156
|
|
|
166
157
|
```typescript
|
|
167
158
|
// BEFORE
|
|
168
|
-
items.map((x) => x.id)
|
|
169
|
-
items.filter((item) => item.active)
|
|
170
|
-
data.forEach((d) => process(d))
|
|
159
|
+
items.map((x) => x.id);
|
|
160
|
+
items.filter((item) => item.active);
|
|
161
|
+
data.forEach((d) => process(d));
|
|
171
162
|
|
|
172
163
|
// AFTER
|
|
173
|
-
items.map((x: ItemType) => x.id)
|
|
174
|
-
items.filter((item: ItemType) => item.active)
|
|
175
|
-
data.forEach((d: DataType) => process(d))
|
|
164
|
+
items.map((x: ItemType) => x.id);
|
|
165
|
+
items.filter((item: ItemType) => item.active);
|
|
166
|
+
data.forEach((d: DataType) => process(d));
|
|
176
167
|
```
|
|
177
168
|
|
|
178
169
|
## RULE 6: Type Mismatch in Function Arguments
|
|
@@ -183,25 +174,28 @@ Check if the function signature expects a different type (often an ID instead of
|
|
|
183
174
|
|
|
184
175
|
```typescript
|
|
185
176
|
// BEFORE
|
|
186
|
-
someFunction(asset)
|
|
177
|
+
someFunction(asset); // asset is full object
|
|
187
178
|
|
|
188
179
|
// AFTER
|
|
189
|
-
someFunction(asset.id)
|
|
180
|
+
someFunction(asset.id); // pass the id property
|
|
190
181
|
```
|
|
191
182
|
|
|
192
183
|
## Important Notes
|
|
193
184
|
|
|
194
185
|
1. **API Client Classes are NOT affected** — Do NOT modify client classes like `*Client`. They remain classes with constructors:
|
|
186
|
+
|
|
195
187
|
```typescript
|
|
196
188
|
const { getApiClient } = useApiClient(MyApiClient); // No change needed
|
|
197
189
|
```
|
|
198
190
|
|
|
199
191
|
2. **Spread operators work with interfaces:**
|
|
192
|
+
|
|
200
193
|
```typescript
|
|
201
194
|
const updated = { ...existingItem, name: "New Name" }; // Works fine
|
|
202
195
|
```
|
|
203
196
|
|
|
204
197
|
3. **Required properties must be provided** when using type assertions:
|
|
198
|
+
|
|
205
199
|
```typescript
|
|
206
200
|
const details: ItemDetails = {
|
|
207
201
|
sku: item.sku || "",
|
|
@@ -210,6 +204,7 @@ someFunction(asset.id) // pass the id property
|
|
|
210
204
|
```
|
|
211
205
|
|
|
212
206
|
4. **Generic type parameters need updating too:**
|
|
207
|
+
|
|
213
208
|
```typescript
|
|
214
209
|
// BEFORE
|
|
215
210
|
const { action } = useAsync<ISearchQuery>(...)
|
|
@@ -219,6 +214,7 @@ someFunction(asset.id) // pass the id property
|
|
|
219
214
|
```
|
|
220
215
|
|
|
221
216
|
5. **Interfaces with all optional properties** can use empty object:
|
|
217
|
+
|
|
222
218
|
```typescript
|
|
223
219
|
const query: SearchQuery = {}; // OK if all properties are optional
|
|
224
220
|
```
|
|
@@ -230,13 +226,13 @@ someFunction(asset.id) // pass the id property
|
|
|
230
226
|
|
|
231
227
|
## Quick Reference Table
|
|
232
228
|
|
|
233
|
-
| Error Code | Pattern
|
|
234
|
-
|
|
235
|
-
| TS2724
|
|
236
|
-
| TS2693
|
|
237
|
-
| TS2866
|
|
238
|
-
| TS7006
|
|
239
|
-
| TS2345
|
|
229
|
+
| Error Code | Pattern | Fix |
|
|
230
|
+
| ---------- | ---------------------------- | ----------------------------------------------- |
|
|
231
|
+
| TS2724 | `IXxx` not found | Remove "I" prefix from import |
|
|
232
|
+
| TS2693 | Type used as value | Replace `new Type({})` with `{} as Type` |
|
|
233
|
+
| TS2866 | Import conflicts with global | Use `type` import or rename |
|
|
234
|
+
| TS7006 | Implicit any | Add explicit type annotation |
|
|
235
|
+
| TS2345 | Type not assignable | Check if property (like `.id`) should be passed |
|
|
240
236
|
|
|
241
237
|
## Verification
|
|
242
238
|
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: use-assets-migration
|
|
3
|
+
description: AI transformation rules for useAssets()/AssetsHandler migration to useAssetsManager().
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Assets Migration: useAssets -> useAssetsManager
|
|
7
|
+
|
|
8
|
+
Migrate legacy assets handling (`useAssets`, `AssetsHandler`, ad-hoc upload/remove/edit callbacks) to `useAssetsManager`.
|
|
9
|
+
|
|
10
|
+
## RULE 1: Replace `useAssets()` with `useAssetsManager()`
|
|
11
|
+
|
|
12
|
+
**BEFORE:**
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import { useAssets } from "@vc-shell/framework";
|
|
16
|
+
|
|
17
|
+
const { upload, remove, edit, loading } = useAssets(imagesRef, uploadPath);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**AFTER:**
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { useAssetsManager } from "@vc-shell/framework";
|
|
24
|
+
|
|
25
|
+
const assetsManager = useAssetsManager(imagesRef, {
|
|
26
|
+
uploadPath: () => uploadPath.value,
|
|
27
|
+
confirmRemove: () => showConfirmation(t("MY_MODULE.ALERTS.DELETE_CONFIRMATION")),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// assetsManager.items, assetsManager.upload, assetsManager.remove,
|
|
31
|
+
// assetsManager.removeMany, assetsManager.reorder, assetsManager.updateItem, assetsManager.loading
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Notes:
|
|
35
|
+
|
|
36
|
+
- `uploadPath` must be a function (`() => string`), not a static string.
|
|
37
|
+
- If no confirmation is needed, omit `confirmRemove`.
|
|
38
|
+
|
|
39
|
+
## RULE 2: Replace `ICommonAsset` with `AssetLike`
|
|
40
|
+
|
|
41
|
+
**BEFORE:**
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
import type { ICommonAsset } from "@vc-shell/framework";
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**AFTER:**
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import type { AssetLike } from "@vc-shell/framework";
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Also update all type annotations in the file.
|
|
54
|
+
|
|
55
|
+
## RULE 3: Single-image fields must be wrapped in writable computed array
|
|
56
|
+
|
|
57
|
+
For fields like `iconUrl`, `logo`, `photo`, convert single value <-> array bridge.
|
|
58
|
+
|
|
59
|
+
**BEFORE:**
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const { upload, remove } = useAssets(photoRef, () => `users/${item.value?.id}`);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**AFTER:**
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
const photoAssets = computed({
|
|
69
|
+
get: () => (item.value?.iconUrl ? [{ url: item.value.iconUrl }] : []),
|
|
70
|
+
set: (val) => {
|
|
71
|
+
if (item.value) item.value.iconUrl = val[0]?.url;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const photoManager = useAssetsManager(photoAssets, {
|
|
76
|
+
uploadPath: () => `users/${item.value?.id ?? "new"}`,
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## RULE 4: `AssetsHandler` and raw handler props -> manager object
|
|
81
|
+
|
|
82
|
+
If the component receives or creates handler bundles (`assetsUploadHandler`, `assetsEditHandler`, `assetsRemoveHandler`, `AssetsHandler<T>`), replace with a manager instance.
|
|
83
|
+
|
|
84
|
+
**BEFORE:**
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
interface Props {
|
|
88
|
+
imageHandlers?: AssetsHandler<MyImage>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const defaultHandlers = { upload, remove, edit, loading };
|
|
92
|
+
const handlers = props.imageHandlers ?? defaultHandlers;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**AFTER:**
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
interface Props {
|
|
99
|
+
manager?: ReturnType<typeof useAssetsManager>;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const defaultManager = useAssetsManager(imagesRef, {
|
|
103
|
+
uploadPath: () => `products/${item.value?.id}`,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const manager = computed(() => props.manager ?? defaultManager);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## RULE 5: `openBlade("AssetsManager")` must pass `manager: markRaw(...)`
|
|
110
|
+
|
|
111
|
+
**BEFORE:**
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
openBlade({
|
|
115
|
+
name: "AssetsManager",
|
|
116
|
+
options: {
|
|
117
|
+
assets: item.value?.assets,
|
|
118
|
+
assetsUploadHandler: upload,
|
|
119
|
+
assetsEditHandler: edit,
|
|
120
|
+
assetsRemoveHandler: remove,
|
|
121
|
+
loading,
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**AFTER:**
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
import { markRaw } from "vue";
|
|
130
|
+
|
|
131
|
+
openBlade({
|
|
132
|
+
name: "AssetsManager",
|
|
133
|
+
options: {
|
|
134
|
+
manager: markRaw(assetsManager),
|
|
135
|
+
disabled: disabled.value,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
If `manager` is already passed but not wrapped, add `markRaw()`.
|
|
141
|
+
|
|
142
|
+
## RULE 6: Keep `AssetsDetails` callbacks wired to manager methods
|
|
143
|
+
|
|
144
|
+
If opening `AssetsDetails`, connect handlers to manager methods (`updateItem`, `remove`) and keep asset type as `AssetLike`.
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
openBlade({
|
|
148
|
+
name: "AssetsDetails",
|
|
149
|
+
options: {
|
|
150
|
+
asset,
|
|
151
|
+
assetEditHandler: (updated: AssetLike) => assetsManager.updateItem(updated),
|
|
152
|
+
assetRemoveHandler: (toRemove: AssetLike) => assetsManager.remove(toRemove),
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Verification
|
|
158
|
+
|
|
159
|
+
After migration:
|
|
160
|
+
|
|
161
|
+
1. Search for stale API: `useAssets(`, `AssetsHandler`, `ICommonAsset`, `assetsUploadHandler`, `assetsEditHandler`, `assetsRemoveHandler`.
|
|
162
|
+
2. Confirm `AssetsManager` blade calls pass `manager: markRaw(...)`.
|
|
163
|
+
3. Run `npx vue-tsc --noEmit`.
|
|
164
|
+
4. Validate runtime flow: upload, remove, reorder, edit metadata.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# useDataTablePagination Migration
|
|
2
|
+
|
|
3
|
+
Replace the manual `totalCount` / `pages` / `currentPage` computed triple plus hand-written `onPaginationClick` handler with a single `useDataTablePagination()` call.
|
|
4
|
+
|
|
5
|
+
## Rule 1: Update the data composable
|
|
6
|
+
|
|
7
|
+
For each list composable file:
|
|
8
|
+
|
|
9
|
+
### 1a. Add import
|
|
10
|
+
|
|
11
|
+
Add to the `@vc-shell/framework` import (merge, don't duplicate):
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { useDataTablePagination, type UseDataTablePaginationReturn } from "@vc-shell/framework";
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 1b. Create `pagination` before the return
|
|
18
|
+
|
|
19
|
+
Declare, before the return block:
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
const pagination = useDataTablePagination({
|
|
23
|
+
pageSize,
|
|
24
|
+
totalCount: computed(() => searchResult.value?.totalCount ?? 0),
|
|
25
|
+
onPageChange: ({ skip }) => loadItems({ ...searchQuery.value, skip }),
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- Use the same `pageSize` the composable already accepts as option (default 20).
|
|
30
|
+
- Pass `totalCount` as a computed (not a plain number).
|
|
31
|
+
- Use the composable's own loader name for `onPageChange` (`loadItems`, `loadMessages`, `searchXxx` — whatever already exists).
|
|
32
|
+
|
|
33
|
+
### 1c. Replace the three computed in the return
|
|
34
|
+
|
|
35
|
+
**Before:**
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
return {
|
|
39
|
+
totalCount: computed(() => searchResult.value?.totalCount || 0),
|
|
40
|
+
pages: computed(() => Math.ceil((searchResult.value?.totalCount || 1) / pageSize)),
|
|
41
|
+
currentPage: computed(() => Math.ceil((searchQuery.value?.skip || 0) / pageSize + 1)),
|
|
42
|
+
// ...other returns
|
|
43
|
+
};
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**After:**
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
return {
|
|
50
|
+
pagination,
|
|
51
|
+
// ...other returns (unchanged)
|
|
52
|
+
};
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 1d. Update the return type interface (if present)
|
|
56
|
+
|
|
57
|
+
**Before:**
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
export interface IUseList {
|
|
61
|
+
totalCount: ComputedRef<number>;
|
|
62
|
+
pages: ComputedRef<number>;
|
|
63
|
+
currentPage: ComputedRef<number>;
|
|
64
|
+
// ...
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**After:**
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
export interface IUseList {
|
|
72
|
+
pagination: UseDataTablePaginationReturn;
|
|
73
|
+
// ...
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Rule 2: Update the blade page template
|
|
78
|
+
|
|
79
|
+
### 2a. Replace VcDataTable pagination bindings
|
|
80
|
+
|
|
81
|
+
**Before:**
|
|
82
|
+
|
|
83
|
+
```vue
|
|
84
|
+
<VcDataTable :total-count="totalCount" :pagination="{ currentPage, pages }" @pagination-click="onPaginationClick" />
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**After:**
|
|
88
|
+
|
|
89
|
+
```vue
|
|
90
|
+
<VcDataTable :total-count="pagination.totalCount" :pagination="pagination" @pagination-click="pagination.goToPage" />
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 2b. Update the composable destructure
|
|
94
|
+
|
|
95
|
+
**Before:**
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
const { items, totalCount, pages, currentPage, searchQuery, loadItems } = useList();
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**After:**
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
const { items, pagination, searchQuery, loadItems } = useList();
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### 2c. Delete the manual `onPaginationClick` handler
|
|
108
|
+
|
|
109
|
+
Remove the entire function — it's redundant; `pagination.goToPage` fires the composable's `onPageChange`.
|
|
110
|
+
|
|
111
|
+
**Delete:**
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
async function onPaginationClick(page: number) {
|
|
115
|
+
await loadItems({
|
|
116
|
+
...searchQuery.value,
|
|
117
|
+
skip: (page - 1) * (searchQuery.value.take ?? 20),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 2d. Rewrite `reload()` helper (if present)
|
|
123
|
+
|
|
124
|
+
If the blade has a `reload()` helper that recomputes skip from currentPage, use `pagination.skip`:
|
|
125
|
+
|
|
126
|
+
**Before:**
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
const reload = async () => {
|
|
130
|
+
await loadItems({
|
|
131
|
+
...searchQuery.value,
|
|
132
|
+
skip: (currentPage.value - 1) * (searchQuery.value.take ?? 10),
|
|
133
|
+
sort: sortExpression.value,
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**After:**
|
|
139
|
+
|
|
140
|
+
```ts
|
|
141
|
+
const reload = async () => {
|
|
142
|
+
await loadItems({
|
|
143
|
+
...searchQuery.value,
|
|
144
|
+
skip: pagination.skip,
|
|
145
|
+
sort: sortExpression.value,
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Rule 3: VcTable / VcTableAdapter — skip that file (not the whole topic)
|
|
151
|
+
|
|
152
|
+
Per-file check. If a specific blade page still uses `<VcTable>` (legacy adapter, with `:pages` + `:current-page` scalar props), SKIP that file — migrating pagination against a different table API would break the bindings. But:
|
|
153
|
+
|
|
154
|
+
- **Still migrate the composable** if other callers (pages with `<VcDataTable>`) exist — the composable change is independent of any single consumer.
|
|
155
|
+
- **Still migrate other pages** in the same `affectedFiles` list that DO use `<VcDataTable>`.
|
|
156
|
+
- In your report, mark the skipped file(s) as `needs vctable-audit first` so the user knows why.
|
|
157
|
+
|
|
158
|
+
Do not skip the entire topic just because one file is out of scope.
|
|
159
|
+
|
|
160
|
+
## Rule 4: Infinite-scroll tables — skip that file
|
|
161
|
+
|
|
162
|
+
If a specific VcDataTable uses `:infinite-scroll="true"`, pagination is not used — skip that file. Same per-file rule as Rule 3.
|
|
163
|
+
|
|
164
|
+
## Behavioral notes
|
|
165
|
+
|
|
166
|
+
- `pagination` is a `reactive()` object — access properties directly (`pagination.totalCount`), never `.value`.
|
|
167
|
+
- Do NOT destructure `pagination` — destructuring loses reactivity.
|
|
168
|
+
- `pagination.reset()` sets currentPage to 1 silently (no onPageChange fire). Use when resetting filters.
|
|
169
|
+
|
|
170
|
+
## Self-check after migration
|
|
171
|
+
|
|
172
|
+
- [ ] `totalCount`, `pages`, `currentPage` no longer appear in the composable's return.
|
|
173
|
+
- [ ] `onPaginationClick` function is deleted from the blade page.
|
|
174
|
+
- [ ] Template uses `pagination.goToPage` not a handwritten callback.
|
|
175
|
+
- [ ] No `.value` access on `pagination.*` properties.
|
|
176
|
+
- [ ] `useDataTablePagination` import is present in the composable.
|