@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
|
@@ -32,19 +32,19 @@ The i18n instance is created once and shared as a singleton. Calling `app.use(i1
|
|
|
32
32
|
|
|
33
33
|
### Singleton Export
|
|
34
34
|
|
|
35
|
-
| Export | Type
|
|
36
|
-
|
|
35
|
+
| Export | Type | Description |
|
|
36
|
+
| ------ | ------ | --------------------------------------------------------------- |
|
|
37
37
|
| `i18n` | `I18n` | The shared vue-i18n instance used across the entire application |
|
|
38
38
|
|
|
39
39
|
### Configuration (set by framework)
|
|
40
40
|
|
|
41
|
-
| Option
|
|
42
|
-
|
|
43
|
-
| `legacy`
|
|
44
|
-
| `globalInjection`
|
|
45
|
-
| `locale`
|
|
46
|
-
| `fallbackLocale`
|
|
47
|
-
| `formatFallbackMessages` | `true`
|
|
41
|
+
| Option | Value | Description |
|
|
42
|
+
| ------------------------ | ------- | -------------------------------------------------------- |
|
|
43
|
+
| `legacy` | `false` | Composition API mode |
|
|
44
|
+
| `globalInjection` | `true` | Enables `$t()` in templates without explicit `useI18n()` |
|
|
45
|
+
| `locale` | `"en"` | Default locale |
|
|
46
|
+
| `fallbackLocale` | `"en"` | Fallback when a key is missing in the active locale |
|
|
47
|
+
| `formatFallbackMessages` | `true` | Uses the message key itself as fallback text |
|
|
48
48
|
|
|
49
49
|
## Usage
|
|
50
50
|
|
|
@@ -109,9 +109,7 @@ Thanks to `globalInjection: true`, `$t()` is available in every template without
|
|
|
109
109
|
```vue
|
|
110
110
|
<template>
|
|
111
111
|
<VcBlade :title="$t('ORDERS.PAGES.LIST.TITLE')">
|
|
112
|
-
<VcDataTable
|
|
113
|
-
:empty-text="$t('ORDERS.PAGES.LIST.EMPTY_STATE')"
|
|
114
|
-
/>
|
|
112
|
+
<VcDataTable :empty-text="$t('ORDERS.PAGES.LIST.EMPTY_STATE')" />
|
|
115
113
|
</VcBlade>
|
|
116
114
|
</template>
|
|
117
115
|
```
|
|
@@ -188,9 +186,9 @@ The framework exports its locale files as typed ES modules. App developers can i
|
|
|
188
186
|
### Importing Framework Locales
|
|
189
187
|
|
|
190
188
|
```typescript
|
|
191
|
-
import en from
|
|
192
|
-
import de from
|
|
193
|
-
import type { VcShellLocale, VcShellLocalePartial } from
|
|
189
|
+
import en from "@vc-shell/framework/locales/en";
|
|
190
|
+
import de from "@vc-shell/framework/locales/de";
|
|
191
|
+
import type { VcShellLocale, VcShellLocalePartial } from "@vc-shell/framework/locales/types";
|
|
194
192
|
```
|
|
195
193
|
|
|
196
194
|
The `VcShellLocale` interface provides autocomplete for all framework translation keys. Use it when creating a full translation to ensure no keys are missed.
|
|
@@ -200,8 +198,8 @@ The `VcShellLocale` interface provides autocomplete for all framework translatio
|
|
|
200
198
|
Spread the English locale as a base and override all sections:
|
|
201
199
|
|
|
202
200
|
```typescript
|
|
203
|
-
import en from
|
|
204
|
-
import type { VcShellLocale } from
|
|
201
|
+
import en from "@vc-shell/framework/locales/en";
|
|
202
|
+
import type { VcShellLocale } from "@vc-shell/framework/locales/types";
|
|
205
203
|
|
|
206
204
|
const fr: VcShellLocale = {
|
|
207
205
|
...en,
|
|
@@ -219,10 +217,10 @@ const fr: VcShellLocale = {
|
|
|
219
217
|
...en.COMPONENTS,
|
|
220
218
|
// ... translate component strings
|
|
221
219
|
},
|
|
222
|
-
}
|
|
220
|
+
};
|
|
223
221
|
|
|
224
222
|
// Register in your app's main.ts or plugin setup:
|
|
225
|
-
app.config.globalProperties.$mergeLocaleMessage(
|
|
223
|
+
app.config.globalProperties.$mergeLocaleMessage("fr", fr);
|
|
226
224
|
```
|
|
227
225
|
|
|
228
226
|
### Overriding Specific Keys
|
|
@@ -230,13 +228,13 @@ app.config.globalProperties.$mergeLocaleMessage('fr', fr)
|
|
|
230
228
|
Use `VcShellLocalePartial` for partial overrides — all keys are optional:
|
|
231
229
|
|
|
232
230
|
```typescript
|
|
233
|
-
import type { VcShellLocalePartial } from
|
|
231
|
+
import type { VcShellLocalePartial } from "@vc-shell/framework/locales/types";
|
|
234
232
|
|
|
235
233
|
const overrides: VcShellLocalePartial = {
|
|
236
|
-
SHELL: { ACCOUNT: { LOGOUT: "Sign Out" } }
|
|
237
|
-
}
|
|
234
|
+
SHELL: { ACCOUNT: { LOGOUT: "Sign Out" } },
|
|
235
|
+
};
|
|
238
236
|
|
|
239
|
-
app.config.globalProperties.$mergeLocaleMessage(
|
|
237
|
+
app.config.globalProperties.$mergeLocaleMessage("en", overrides);
|
|
240
238
|
```
|
|
241
239
|
|
|
242
240
|
### Validating Your Translation
|
|
@@ -59,7 +59,11 @@ export default defineAppModule({
|
|
|
59
59
|
```vue
|
|
60
60
|
<!-- modules/my-feature/pages/MyFeatureList.vue -->
|
|
61
61
|
<template>
|
|
62
|
-
<VcBlade
|
|
62
|
+
<VcBlade
|
|
63
|
+
title="My Feature"
|
|
64
|
+
:closable="closable"
|
|
65
|
+
@close="$emit('close:blade')"
|
|
66
|
+
>
|
|
63
67
|
<p>Hello from my first module!</p>
|
|
64
68
|
</VcBlade>
|
|
65
69
|
</template>
|
|
@@ -109,12 +113,12 @@ The module is installed by the host application (or loaded remotely via Module F
|
|
|
109
113
|
|
|
110
114
|
A module is a **Vue plugin** created by `defineAppModule()`. It bundles everything a feature needs:
|
|
111
115
|
|
|
112
|
-
| Asset
|
|
113
|
-
|
|
114
|
-
| **Blades**
|
|
115
|
-
| **Locales**
|
|
116
|
-
| **Notifications**
|
|
117
|
-
| **Dashboard widgets** | Cards displayed on the main dashboard (registered separately)
|
|
116
|
+
| Asset | Purpose |
|
|
117
|
+
| --------------------- | ----------------------------------------------------------------- |
|
|
118
|
+
| **Blades** | Vue components registered in `BladeRegistry` for blade navigation |
|
|
119
|
+
| **Locales** | Translation objects merged into the global vue-i18n instance |
|
|
120
|
+
| **Notifications** | Notification type configurations for real-time push events |
|
|
121
|
+
| **Dashboard widgets** | Cards displayed on the main dashboard (registered separately) |
|
|
118
122
|
|
|
119
123
|
Modules are self-contained: each module declares its own routes, menu entries, permissions, and translations. The framework composes them at runtime.
|
|
120
124
|
|
|
@@ -180,18 +184,20 @@ export default createAppModule(pages, locales, notificationTemplates, components
|
|
|
180
184
|
export default defineAppModule({
|
|
181
185
|
blades: pages,
|
|
182
186
|
locales,
|
|
183
|
-
notifications: {
|
|
187
|
+
notifications: {
|
|
188
|
+
/* ... */
|
|
189
|
+
},
|
|
184
190
|
});
|
|
185
191
|
```
|
|
186
192
|
|
|
187
193
|
Key differences:
|
|
188
194
|
|
|
189
|
-
|
|
|
190
|
-
|
|
191
|
-
| API style
|
|
192
|
-
| Notifications
|
|
195
|
+
| | `createAppModule` | `defineAppModule` |
|
|
196
|
+
| ----------------- | --------------------------------------- | ---------------------------------- |
|
|
197
|
+
| API style | Positional args | Named options object |
|
|
198
|
+
| Notifications | `notificationTemplates` (legacy) | `notifications` (new typed config) |
|
|
193
199
|
| Global components | 4th arg registers via `app.component()` | Not supported (use provide/inject) |
|
|
194
|
-
| Status
|
|
200
|
+
| Status | **Deprecated** -- will be removed | **Current** -- use this |
|
|
195
201
|
|
|
196
202
|
Migration is a one-line change:
|
|
197
203
|
|
|
@@ -220,7 +226,7 @@ export default defineAppModule({
|
|
|
220
226
|
|
|
221
227
|
// Notification type configurations (new API)
|
|
222
228
|
notifications: {
|
|
223
|
-
|
|
229
|
+
OrderChangedEvent: {
|
|
224
230
|
toast: { mode: "auto" },
|
|
225
231
|
},
|
|
226
232
|
},
|
|
@@ -249,14 +255,14 @@ export default defineAppModule({
|
|
|
249
255
|
|
|
250
256
|
Each blade is registered in the `BladeRegistry` with:
|
|
251
257
|
|
|
252
|
-
| Property
|
|
253
|
-
|
|
254
|
-
| `name`
|
|
255
|
-
| `component`
|
|
256
|
-
| `route`
|
|
257
|
-
| `isWorkspace` | `component.isWorkspace`
|
|
258
|
-
| `routable`
|
|
259
|
-
| `permissions` | `component.permissions`
|
|
258
|
+
| Property | Source | Description |
|
|
259
|
+
| ------------- | ---------------------------------- | -------------------------------------------------- |
|
|
260
|
+
| `name` | `component.name` or the export key | Unique identifier in the registry |
|
|
261
|
+
| `component` | The Vue component itself | Used to render the blade |
|
|
262
|
+
| `route` | `component.url` | URL path for routable blades |
|
|
263
|
+
| `isWorkspace` | `component.isWorkspace` | `true` = top-level blade (fills the workspace) |
|
|
264
|
+
| `routable` | `component.routable` | `true` = gets a Vue Router route (default: `true`) |
|
|
265
|
+
| `permissions` | `component.permissions` | Required permissions to access the blade |
|
|
260
266
|
|
|
261
267
|
> **Tip:** The export key (e.g., `ProductsList` in `{ ProductsList }`) is used as a fallback name when `component.name` is not defined. Always set `defineOptions({ name: "..." })` for clarity.
|
|
262
268
|
|
|
@@ -285,9 +291,9 @@ defineOptions({
|
|
|
285
291
|
|
|
286
292
|
// Sidebar menu configuration. Only used if `url` is also set.
|
|
287
293
|
menuItem: {
|
|
288
|
-
title: "ORDERS.MENU.TITLE",
|
|
289
|
-
icon: "lucide-shopping-cart",
|
|
290
|
-
priority: 1,
|
|
294
|
+
title: "ORDERS.MENU.TITLE", // i18n key or plain string
|
|
295
|
+
icon: "lucide-shopping-cart", // Icon name (lucide or fas)
|
|
296
|
+
priority: 1, // Lower = higher in menu
|
|
291
297
|
permissions: ["seller:orders:view"], // Optional override
|
|
292
298
|
},
|
|
293
299
|
});
|
|
@@ -318,9 +324,9 @@ defineOptions({
|
|
|
318
324
|
url: "/products",
|
|
319
325
|
isWorkspace: true,
|
|
320
326
|
menuItem: {
|
|
321
|
-
title: "PRODUCTS.MENU.TITLE",
|
|
327
|
+
title: "PRODUCTS.MENU.TITLE", // Resolved via vue-i18n
|
|
322
328
|
icon: "lucide-package",
|
|
323
|
-
priority: 10,
|
|
329
|
+
priority: 10, // Sort order in the sidebar
|
|
324
330
|
},
|
|
325
331
|
permissions: ["seller:products:view"],
|
|
326
332
|
});
|
|
@@ -353,27 +359,27 @@ export default defineAppModule({
|
|
|
353
359
|
blades: { OrdersList },
|
|
354
360
|
notifications: {
|
|
355
361
|
// Simple: auto-show a toast when this event arrives
|
|
356
|
-
|
|
362
|
+
OrderCreatedEvent: {
|
|
357
363
|
toast: { mode: "auto" },
|
|
358
364
|
},
|
|
359
365
|
|
|
360
366
|
// With custom template and severity
|
|
361
|
-
|
|
367
|
+
OrderFailedEvent: {
|
|
362
368
|
template: OrderNotification,
|
|
363
369
|
toast: { mode: "auto", severity: "error" },
|
|
364
370
|
},
|
|
365
371
|
|
|
366
372
|
// Progress-style toast (e.g., long-running export)
|
|
367
|
-
|
|
373
|
+
ExportProgressEvent: {
|
|
368
374
|
toast: {
|
|
369
375
|
mode: "progress",
|
|
370
376
|
isComplete: (msg) => msg.finished === true,
|
|
371
|
-
completedType: (msg) => msg.errorCount > 0 ? "error" : "success",
|
|
377
|
+
completedType: (msg) => (msg.errorCount > 0 ? "error" : "success"),
|
|
372
378
|
},
|
|
373
379
|
},
|
|
374
380
|
|
|
375
381
|
// Silent: stored in history, no toast
|
|
376
|
-
|
|
382
|
+
AuditLogEvent: {
|
|
377
383
|
toast: false,
|
|
378
384
|
},
|
|
379
385
|
},
|
|
@@ -382,21 +388,21 @@ export default defineAppModule({
|
|
|
382
388
|
|
|
383
389
|
**`NotificationTypeConfig` options:**
|
|
384
390
|
|
|
385
|
-
| Field
|
|
386
|
-
|
|
387
|
-
| `toast`
|
|
388
|
-
| `template` | `Component`
|
|
389
|
-
| `groupBy`
|
|
391
|
+
| Field | Type | Description |
|
|
392
|
+
| ---------- | ---------------------- | ------------------------------------------------------------ |
|
|
393
|
+
| `toast` | `ToastConfig \| false` | Toast display behavior. `false` = no toast (silent). |
|
|
394
|
+
| `template` | `Component` | Custom Vue component for rendering in the notification panel |
|
|
395
|
+
| `groupBy` | `string` | Group notifications by this field value |
|
|
390
396
|
|
|
391
397
|
**`ToastConfig` options:**
|
|
392
398
|
|
|
393
|
-
| Field
|
|
394
|
-
|
|
395
|
-
| `mode`
|
|
396
|
-
| `severity`
|
|
397
|
-
| `timeout`
|
|
398
|
-
| `isComplete`
|
|
399
|
-
| `completedType` | `(msg) => "success" \| "error"`
|
|
399
|
+
| Field | Type | Default | Description |
|
|
400
|
+
| --------------- | ---------------------------------- | ----------------- | ------------------------------------------------------------------------------------- |
|
|
401
|
+
| `mode` | `"auto" \| "progress" \| "silent"` | required | `auto` = show and auto-dismiss; `progress` = stay until complete; `silent` = no toast |
|
|
402
|
+
| `severity` | `Severity \| (msg) => Severity` | `"info"` | Toast type: `"info"`, `"success"`, `"warning"`, `"error"` |
|
|
403
|
+
| `timeout` | `number` | varies | Auto-dismiss timeout in milliseconds |
|
|
404
|
+
| `isComplete` | `(msg) => boolean` | `msg.finished` | For `progress` mode: when to close the toast |
|
|
405
|
+
| `completedType` | `(msg) => "success" \| "error"` | `() => "success"` | For `progress` mode: final toast type |
|
|
400
406
|
|
|
401
407
|
### Adding Locales
|
|
402
408
|
|
|
@@ -483,15 +489,15 @@ export default defineAppModule({ blades: pages, locales });
|
|
|
483
489
|
|
|
484
490
|
**`DashboardWidget` options:**
|
|
485
491
|
|
|
486
|
-
| Field
|
|
487
|
-
|
|
488
|
-
| `id`
|
|
489
|
-
| `name`
|
|
490
|
-
| `component`
|
|
491
|
-
| `size`
|
|
492
|
-
| `position`
|
|
493
|
-
| `permissions` | `string[]`
|
|
494
|
-
| `props`
|
|
492
|
+
| Field | Type | Description |
|
|
493
|
+
| ------------- | ----------------------------------- | ---------------------------------------- |
|
|
494
|
+
| `id` | `string` | Unique widget identifier |
|
|
495
|
+
| `name` | `string` | Display name |
|
|
496
|
+
| `component` | `Component` | Vue component to render |
|
|
497
|
+
| `size` | `{ width: number; height: number }` | Grid size |
|
|
498
|
+
| `position` | `{ x: number; y: number }` | Initial grid position (optional) |
|
|
499
|
+
| `permissions` | `string[]` | Required permissions (optional) |
|
|
500
|
+
| `props` | `Record<string, unknown>` | Props passed to the component (optional) |
|
|
495
501
|
|
|
496
502
|
### Module Version Compatibility
|
|
497
503
|
|
|
@@ -770,7 +776,9 @@ export default createAppModule(pages, locales, notificationTemplates);
|
|
|
770
776
|
export default defineAppModule({
|
|
771
777
|
blades: pages,
|
|
772
778
|
locales,
|
|
773
|
-
notifications: {
|
|
779
|
+
notifications: {
|
|
780
|
+
/* ... */
|
|
781
|
+
},
|
|
774
782
|
});
|
|
775
783
|
```
|
|
776
784
|
|
|
@@ -857,12 +865,12 @@ interface DefineAppModuleOptions {
|
|
|
857
865
|
|
|
858
866
|
**Parameters:**
|
|
859
867
|
|
|
860
|
-
| #
|
|
861
|
-
|
|
862
|
-
| 1
|
|
863
|
-
| 2
|
|
864
|
-
| 3
|
|
865
|
-
| 4
|
|
868
|
+
| # | Parameter | Type | Description |
|
|
869
|
+
| --- | ----------------------- | ------------------------------------------ | ------------------------------------------------- |
|
|
870
|
+
| 1 | `pages` | `Record<string, BladeInstanceConstructor>` | Blade components |
|
|
871
|
+
| 2 | `locales` | `Record<string, object>` | Locale objects (optional) |
|
|
872
|
+
| 3 | `notificationTemplates` | `Record<string, Component>` | Legacy notification templates (optional) |
|
|
873
|
+
| 4 | `components` | `Record<string, Component>` | Global components (optional, ignored in new impl) |
|
|
866
874
|
|
|
867
875
|
---
|
|
868
876
|
|
|
@@ -886,22 +894,22 @@ interface DashboardWidget {
|
|
|
886
894
|
|
|
887
895
|
### Blade Static Properties (defineOptions)
|
|
888
896
|
|
|
889
|
-
| Property
|
|
890
|
-
|
|
891
|
-
| `name`
|
|
892
|
-
| `url`
|
|
893
|
-
| `isWorkspace` | `boolean`
|
|
894
|
-
| `routable`
|
|
895
|
-
| `permissions` | `string[]`
|
|
896
|
-
| `menuItem`
|
|
897
|
+
| Property | Type | Default | Description |
|
|
898
|
+
| ------------- | ---------------- | ----------- | ------------------------------------- |
|
|
899
|
+
| `name` | `string` | export key | Unique blade identifier |
|
|
900
|
+
| `url` | `string` | `undefined` | URL path for routing |
|
|
901
|
+
| `isWorkspace` | `boolean` | `false` | Top-level workspace blade |
|
|
902
|
+
| `routable` | `boolean` | `true` | Whether a Vue Router route is created |
|
|
903
|
+
| `permissions` | `string[]` | `undefined` | Required access permissions |
|
|
904
|
+
| `menuItem` | `MenuItemConfig` | `undefined` | Sidebar menu configuration |
|
|
897
905
|
|
|
898
906
|
**`MenuItemConfig`:**
|
|
899
907
|
|
|
900
|
-
| Field
|
|
901
|
-
|
|
902
|
-
| `title`
|
|
903
|
-
| `icon`
|
|
904
|
-
| `priority`
|
|
908
|
+
| Field | Type | Description |
|
|
909
|
+
| ------------- | ---------- | --------------------------------------------------------------- |
|
|
910
|
+
| `title` | `string` | Display text or i18n key |
|
|
911
|
+
| `icon` | `string` | Icon name (lucide-_ or fas fa-_) |
|
|
912
|
+
| `priority` | `number` | Sort order (lower = higher in menu) |
|
|
905
913
|
| `permissions` | `string[]` | Permission override (optional, falls back to blade permissions) |
|
|
906
914
|
|
|
907
915
|
---
|
|
@@ -937,13 +945,13 @@ interface ToastConfig {
|
|
|
937
945
|
|
|
938
946
|
## Related
|
|
939
947
|
|
|
940
|
-
| Resource
|
|
941
|
-
|
|
942
|
-
| Extension Points Plugin | `core/plugins/extension-points/`
|
|
943
|
-
| BladeRegistry
|
|
944
|
-
| useMenuService
|
|
945
|
-
| useDashboard
|
|
946
|
-
| NotificationStore
|
|
947
|
-
| i18n Plugin
|
|
948
|
-
| mf-host
|
|
949
|
-
| Blade Navigation
|
|
948
|
+
| Resource | Path | Description |
|
|
949
|
+
| ----------------------- | ------------------------------------- | ------------------------------------------------ |
|
|
950
|
+
| Extension Points Plugin | `core/plugins/extension-points/` | Cross-module UI extension system |
|
|
951
|
+
| BladeRegistry | `core/composables/useBladeRegistry/` | Where blades are stored and looked up |
|
|
952
|
+
| useMenuService | `core/composables/useMenuService/` | `addMenuItem()` for sidebar navigation |
|
|
953
|
+
| useDashboard | `core/composables/useDashboard/` | Dashboard widget management |
|
|
954
|
+
| NotificationStore | `core/notifications/` | Notification type registration and dispatch |
|
|
955
|
+
| i18n Plugin | `core/plugins/i18n/` | vue-i18n singleton for locale merging |
|
|
956
|
+
| mf-host | `packages/mf-host/` | Module Federation host that loads remote modules |
|
|
957
|
+
| Blade Navigation | `shared/components/blade-navigation/` | Blade stack rendering and navigation |
|
|
@@ -39,14 +39,14 @@ Module developers use the composable or global property directly -- no registrat
|
|
|
39
39
|
|
|
40
40
|
### Global Property
|
|
41
41
|
|
|
42
|
-
| Property
|
|
43
|
-
|
|
42
|
+
| Property | Type | Description |
|
|
43
|
+
| ------------ | ----------------------------------------------------------- | --------------------------------------------------------- |
|
|
44
44
|
| `$hasAccess` | `(permissions: string \| string[] \| undefined) => boolean` | Checks if the current user has the required permission(s) |
|
|
45
45
|
|
|
46
46
|
### Composable: `usePermissions()`
|
|
47
47
|
|
|
48
|
-
| Export
|
|
49
|
-
|
|
48
|
+
| Export | Type | Description |
|
|
49
|
+
| ----------- | ----------------------------------------------------------- | ------------------------------------- |
|
|
50
50
|
| `hasAccess` | `(permissions: string \| string[] \| undefined) => boolean` | Returns `true` if the user has access |
|
|
51
51
|
|
|
52
52
|
#### `hasAccess` Logic
|
|
@@ -63,19 +63,13 @@ Module developers use the composable or global property directly -- no registrat
|
|
|
63
63
|
```vue
|
|
64
64
|
<template>
|
|
65
65
|
<!-- Single permission check -->
|
|
66
|
-
<VcButton v-if="$hasAccess('order:create')">
|
|
67
|
-
Create Order
|
|
68
|
-
</VcButton>
|
|
66
|
+
<VcButton v-if="$hasAccess('order:create')"> Create Order </VcButton>
|
|
69
67
|
|
|
70
68
|
<!-- Multiple permissions (OR logic: any one is enough) -->
|
|
71
|
-
<VcButton v-if="$hasAccess(['order:update', 'order:manage'])">
|
|
72
|
-
Edit Order
|
|
73
|
-
</VcButton>
|
|
69
|
+
<VcButton v-if="$hasAccess(['order:update', 'order:manage'])"> Edit Order </VcButton>
|
|
74
70
|
|
|
75
71
|
<!-- No permission required (undefined = always visible) -->
|
|
76
|
-
<VcButton v-if="$hasAccess(undefined)">
|
|
77
|
-
View Dashboard
|
|
78
|
-
</VcButton>
|
|
72
|
+
<VcButton v-if="$hasAccess(undefined)"> View Dashboard </VcButton>
|
|
79
73
|
</template>
|
|
80
74
|
```
|
|
81
75
|
|
|
@@ -109,11 +103,11 @@ export default defineAppModule({
|
|
|
109
103
|
OrdersList: {
|
|
110
104
|
component: OrdersListBlade,
|
|
111
105
|
route: "orders",
|
|
112
|
-
permissions: ["order:read"],
|
|
106
|
+
permissions: ["order:read"], // Required to access this blade
|
|
113
107
|
},
|
|
114
108
|
OrderDetails: {
|
|
115
109
|
component: OrderDetailsBlade,
|
|
116
|
-
permissions: ["order:read", "order:manage"],
|
|
110
|
+
permissions: ["order:read", "order:manage"], // OR logic
|
|
117
111
|
},
|
|
118
112
|
},
|
|
119
113
|
});
|
|
@@ -129,7 +123,7 @@ const toolbar = useToolbar([
|
|
|
129
123
|
id: "save",
|
|
130
124
|
title: "Save",
|
|
131
125
|
icon: "lucide-save",
|
|
132
|
-
permissions: "order:update",
|
|
126
|
+
permissions: "order:update", // Only shown if user has this permission
|
|
133
127
|
clickHandler: () => saveOrder(),
|
|
134
128
|
},
|
|
135
129
|
{
|
|
@@ -35,27 +35,27 @@ Module developers do not install this plugin. It is registered once by the frame
|
|
|
35
35
|
|
|
36
36
|
### Plugin Options
|
|
37
37
|
|
|
38
|
-
| Option
|
|
39
|
-
|
|
38
|
+
| Option | Type | Description |
|
|
39
|
+
| --------- | --------------------- | -------------------------------------------------------------------------- |
|
|
40
40
|
| `creator` | `string \| undefined` | Filters `SendSystemEvents` messages to only those matching this creator ID |
|
|
41
41
|
|
|
42
42
|
### Exports
|
|
43
43
|
|
|
44
|
-
| Export
|
|
45
|
-
|
|
46
|
-
| `signalR`
|
|
44
|
+
| Export | Type | Description |
|
|
45
|
+
| ---------------------------- | -------------- | --------------------------------------------- |
|
|
46
|
+
| `signalR` | `Plugin` | Vue plugin object with `install()` method |
|
|
47
47
|
| `updateSignalRCreatorSymbol` | `InjectionKey` | Injection key for the creator update function |
|
|
48
48
|
|
|
49
49
|
### Provided Injectables
|
|
50
50
|
|
|
51
|
-
| Key
|
|
52
|
-
|
|
51
|
+
| Key | Type | Description |
|
|
52
|
+
| ---------------------------- | ---------------------------------------- | --------------------------------------------- |
|
|
53
53
|
| `updateSignalRCreatorSymbol` | `(creator: string \| undefined) => void` | Updates the SignalR creator filter at runtime |
|
|
54
54
|
|
|
55
55
|
### Global Properties
|
|
56
56
|
|
|
57
|
-
| Property
|
|
58
|
-
|
|
57
|
+
| Property | Type | Description |
|
|
58
|
+
| ----------------------- | ---------------------------------------- | ------------------------------------------------------------------- |
|
|
59
59
|
| `$updateSignalRCreator` | `(creator: string \| undefined) => void` | Same as the injectable, accessible via `this.$updateSignalRCreator` |
|
|
60
60
|
|
|
61
61
|
## Connection Lifecycle
|
|
@@ -32,11 +32,11 @@ Object.entries(allRules).forEach(([name, rule]) => {
|
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
// Then register custom vc-shell rules
|
|
35
|
-
defineRule("mindimensions"
|
|
36
|
-
defineRule("fileWeight"
|
|
37
|
-
defineRule("before"
|
|
38
|
-
defineRule("after"
|
|
39
|
-
defineRule("bigint"
|
|
35
|
+
defineRule("mindimensions" /* ... */);
|
|
36
|
+
defineRule("fileWeight" /* ... */);
|
|
37
|
+
defineRule("before" /* ... */);
|
|
38
|
+
defineRule("after" /* ... */);
|
|
39
|
+
defineRule("bigint" /* ... */);
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
## API
|
|
@@ -47,13 +47,13 @@ All rules from `@vee-validate/rules` are registered: `required`, `email`, `min`,
|
|
|
47
47
|
|
|
48
48
|
### Custom Rules
|
|
49
49
|
|
|
50
|
-
| Rule
|
|
51
|
-
|
|
52
|
-
| `mindimensions` | `[width, height]` | Validates image files meet minimum pixel dimensions
|
|
53
|
-
| `fileWeight`
|
|
54
|
-
| `before`
|
|
55
|
-
| `after`
|
|
56
|
-
| `bigint`
|
|
50
|
+
| Rule | Params | Description |
|
|
51
|
+
| --------------- | ----------------- | -------------------------------------------------------------- |
|
|
52
|
+
| `mindimensions` | `[width, height]` | Validates image files meet minimum pixel dimensions |
|
|
53
|
+
| `fileWeight` | `[sizeInKB]` | Validates file size does not exceed the limit (in kilobytes) |
|
|
54
|
+
| `before` | `[targetDate]` | Validates date is before the target date |
|
|
55
|
+
| `after` | `[targetDate]` | Validates date is after the target date |
|
|
56
|
+
| `bigint` | -- | Validates the value is a safe integer (`Number.isSafeInteger`) |
|
|
57
57
|
|
|
58
58
|
## Usage
|
|
59
59
|
|
|
@@ -63,16 +63,40 @@ The simplest approach for inline rule declarations:
|
|
|
63
63
|
|
|
64
64
|
```vue
|
|
65
65
|
<template>
|
|
66
|
-
<VcField
|
|
67
|
-
|
|
66
|
+
<VcField
|
|
67
|
+
name="email"
|
|
68
|
+
rules="required|email"
|
|
69
|
+
v-slot="{ field, errors }"
|
|
70
|
+
>
|
|
71
|
+
<VcInput
|
|
72
|
+
v-bind="field"
|
|
73
|
+
:error-message="errors[0]"
|
|
74
|
+
label="Email"
|
|
75
|
+
/>
|
|
68
76
|
</VcField>
|
|
69
77
|
|
|
70
|
-
<VcField
|
|
71
|
-
|
|
78
|
+
<VcField
|
|
79
|
+
name="username"
|
|
80
|
+
rules="required|min:3|max:50"
|
|
81
|
+
v-slot="{ field, errors }"
|
|
82
|
+
>
|
|
83
|
+
<VcInput
|
|
84
|
+
v-bind="field"
|
|
85
|
+
:error-message="errors[0]"
|
|
86
|
+
label="Username"
|
|
87
|
+
/>
|
|
72
88
|
</VcField>
|
|
73
89
|
|
|
74
|
-
<VcField
|
|
75
|
-
|
|
90
|
+
<VcField
|
|
91
|
+
name="age"
|
|
92
|
+
rules="required|numeric|between:18,120"
|
|
93
|
+
v-slot="{ field, errors }"
|
|
94
|
+
>
|
|
95
|
+
<VcInput
|
|
96
|
+
v-bind="field"
|
|
97
|
+
:error-message="errors[0]"
|
|
98
|
+
label="Age"
|
|
99
|
+
/>
|
|
76
100
|
</VcField>
|
|
77
101
|
</template>
|
|
78
102
|
```
|
|
@@ -105,12 +129,31 @@ const endDateRules = computed(() => `required|after:${startDate.value}`);
|
|
|
105
129
|
</script>
|
|
106
130
|
|
|
107
131
|
<template>
|
|
108
|
-
<VcField
|
|
109
|
-
|
|
132
|
+
<VcField
|
|
133
|
+
name="startDate"
|
|
134
|
+
rules="required"
|
|
135
|
+
v-slot="{ field, errors }"
|
|
136
|
+
>
|
|
137
|
+
<VcInput
|
|
138
|
+
type="date"
|
|
139
|
+
v-bind="field"
|
|
140
|
+
v-model="startDate"
|
|
141
|
+
:error-message="errors[0]"
|
|
142
|
+
label="Start Date"
|
|
143
|
+
/>
|
|
110
144
|
</VcField>
|
|
111
145
|
|
|
112
|
-
<VcField
|
|
113
|
-
|
|
146
|
+
<VcField
|
|
147
|
+
name="endDate"
|
|
148
|
+
:rules="endDateRules"
|
|
149
|
+
v-slot="{ field, errors }"
|
|
150
|
+
>
|
|
151
|
+
<VcInput
|
|
152
|
+
type="date"
|
|
153
|
+
v-bind="field"
|
|
154
|
+
:error-message="errors[0]"
|
|
155
|
+
label="End Date"
|
|
156
|
+
/>
|
|
114
157
|
</VcField>
|
|
115
158
|
</template>
|
|
116
159
|
```
|