@vc-shell/framework 1.2.1 → 1.2.3-beta.0
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/core/composables/index.ts +2 -0
- package/core/composables/useAssets/index.ts +72 -28
- package/core/composables/useAsync/index.ts +4 -1
- package/core/composables/useBladeRegistry/index.ts +6 -5
- package/core/composables/useBreadcrumbs/index.ts +4 -1
- package/core/composables/useErrorHandler/index.ts +4 -1
- package/core/composables/useFunctions/debounce.ts +0 -1
- package/core/composables/useFunctions/delay.ts +0 -1
- package/core/composables/useFunctions/index.ts +0 -1
- package/core/composables/useFunctions/once.ts +0 -1
- package/core/composables/useFunctions/sleep.ts +0 -1
- package/core/composables/useFunctions/throttle.ts +0 -1
- package/core/composables/useGlobalSearch/index.ts +3 -3
- package/core/composables/useMenuService/index.ts +5 -2
- package/core/composables/useNotifications/index.ts +5 -2
- package/core/composables/useTheme/index.ts +4 -1
- package/core/composables/useUser/index.ts +189 -20
- package/core/composables/useWidgets/index.ts +5 -2
- package/core/constants/defaults.ts +76 -0
- package/core/constants/index.ts +2 -0
- package/core/constants/ui.ts +68 -0
- package/core/interceptors/index.ts +5 -2
- package/core/plugins/ai-agent/README.md +336 -0
- package/core/plugins/ai-agent/components/VcAiAgentPanel.vue +125 -0
- package/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue +182 -0
- package/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue +77 -0
- package/core/plugins/ai-agent/components/index.ts +1 -0
- package/core/plugins/ai-agent/composables/index.ts +4 -0
- package/core/plugins/ai-agent/composables/useAiAgent.ts +231 -0
- package/core/plugins/ai-agent/composables/useAiAgentContext.ts +280 -0
- package/core/plugins/ai-agent/constants.ts +89 -0
- package/core/plugins/ai-agent/index.ts +91 -0
- package/core/plugins/ai-agent/services/ai-agent-service.ts +598 -0
- package/core/plugins/ai-agent/types.ts +310 -0
- package/core/plugins/modularity/index.ts +8 -6
- package/core/plugins/modularity/loader.ts +36 -33
- package/core/plugins/signalR/index.ts +6 -3
- package/core/services/app-bar-menu-service.ts +4 -1
- package/core/services/dashboard-service.ts +4 -1
- package/core/services/index.ts +2 -0
- package/core/services/menu-service.ts +4 -1
- package/core/services/settings-menu-service.ts +4 -1
- package/core/services/toolbar-service.ts +18 -3
- package/core/services/widget-service.ts +7 -4
- package/core/types/index.ts +3 -0
- package/core/types/services.ts +194 -0
- package/core/utilities/errorTypes.ts +126 -0
- package/core/utilities/index.ts +2 -0
- package/core/utilities/logger.ts +120 -0
- package/dist/core/composables/useAssets/index.d.ts.map +1 -1
- package/dist/core/composables/useAsync/index.d.ts.map +1 -1
- package/dist/core/composables/useBladeRegistry/index.d.ts.map +1 -1
- package/dist/core/composables/useBreadcrumbs/index.d.ts.map +1 -1
- package/dist/core/composables/useErrorHandler/index.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/debounce.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/delay.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/index.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/once.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/sleep.d.ts.map +1 -1
- package/dist/core/composables/useFunctions/throttle.d.ts.map +1 -1
- package/dist/core/composables/useGlobalSearch/index.d.ts.map +1 -1
- package/dist/core/composables/useMenuService/index.d.ts.map +1 -1
- package/dist/core/composables/useNotifications/index.d.ts.map +1 -1
- package/dist/core/composables/useTheme/index.d.ts.map +1 -1
- package/dist/core/composables/useUser/index.d.ts +8 -0
- package/dist/core/composables/useUser/index.d.ts.map +1 -1
- package/dist/core/composables/useWidgets/index.d.ts.map +1 -1
- package/dist/core/constants/defaults.d.ts +63 -0
- package/dist/core/constants/defaults.d.ts.map +1 -0
- package/dist/core/constants/index.d.ts +2 -0
- package/dist/core/constants/index.d.ts.map +1 -1
- package/dist/core/constants/ui.d.ts +50 -0
- package/dist/core/constants/ui.d.ts.map +1 -0
- package/dist/core/interceptors/index.d.ts.map +1 -1
- package/dist/core/plugins/ai-agent/components/VcAiAgentPanel.vue.d.ts +3 -0
- package/dist/core/plugins/ai-agent/components/VcAiAgentPanel.vue.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue.d.ts +15 -0
- package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue.d.ts +10 -0
- package/dist/core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/components/index.d.ts +2 -0
- package/dist/core/plugins/ai-agent/components/index.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/composables/index.d.ts +4 -0
- package/dist/core/plugins/ai-agent/composables/index.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/composables/useAiAgent.d.ts +95 -0
- package/dist/core/plugins/ai-agent/composables/useAiAgent.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/composables/useAiAgentContext.d.ts +55 -0
- package/dist/core/plugins/ai-agent/composables/useAiAgentContext.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/constants.d.ts +47 -0
- package/dist/core/plugins/ai-agent/constants.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/index.d.ts +48 -0
- package/dist/core/plugins/ai-agent/index.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/services/ai-agent-service.d.ts +45 -0
- package/dist/core/plugins/ai-agent/services/ai-agent-service.d.ts.map +1 -0
- package/dist/core/plugins/ai-agent/types.d.ts +258 -0
- package/dist/core/plugins/ai-agent/types.d.ts.map +1 -0
- package/dist/core/plugins/modularity/index.d.ts.map +1 -1
- package/dist/core/plugins/modularity/loader.d.ts.map +1 -1
- package/dist/core/plugins/signalR/index.d.ts.map +1 -1
- package/dist/core/services/app-bar-menu-service.d.ts.map +1 -1
- package/dist/core/services/dashboard-service.d.ts.map +1 -1
- package/dist/core/services/menu-service.d.ts.map +1 -1
- package/dist/core/services/settings-menu-service.d.ts.map +1 -1
- package/dist/core/services/toolbar-service.d.ts.map +1 -1
- package/dist/core/services/widget-service.d.ts.map +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/services.d.ts +169 -0
- package/dist/core/types/services.d.ts.map +1 -0
- package/dist/core/utilities/errorTypes.d.ts +61 -0
- package/dist/core/utilities/errorTypes.d.ts.map +1 -0
- package/dist/core/utilities/index.d.ts +2 -0
- package/dist/core/utilities/index.d.ts.map +1 -1
- package/dist/core/utilities/logger.d.ts +259 -0
- package/dist/core/utilities/logger.d.ts.map +1 -0
- package/dist/framework.js +9623 -8417
- package/dist/index.css +1 -1
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/injection-keys.d.ts +21 -6
- package/dist/injection-keys.d.ts.map +1 -1
- package/dist/shared/components/app-switcher/composables/useAppSwitcher/index.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.d.ts.map +1 -1
- package/dist/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.d.ts.map +1 -1
- package/dist/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.d.ts.map +1 -1
- package/dist/shared/components/draggable-dashboard/composables/useLayoutPersistence.d.ts.map +1 -1
- package/dist/shared/components/notifications/composables/useContainer/index.d.ts.map +1 -1
- package/dist/shared/components/notifications/composables/useInstance/index.d.ts.map +1 -1
- package/dist/shared/components/notifications/core/notification.d.ts.map +1 -1
- package/dist/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue.d.ts.map +1 -1
- package/dist/shared/components/sign-in/useExternalProvider.d.ts.map +1 -1
- package/dist/shared/composables/index.d.ts +1 -0
- package/dist/shared/composables/index.d.ts.map +1 -1
- package/dist/shared/composables/useExternalWidgets.d.ts.map +1 -1
- package/dist/shared/composables/useMenuExpanded.d.ts.map +1 -1
- package/dist/shared/composables/useTableSelection.d.ts +57 -0
- package/dist/shared/composables/useTableSelection.d.ts.map +1 -0
- package/dist/shared/composables/useTableSort.d.ts.map +1 -1
- package/dist/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts.map +1 -1
- package/dist/shared/pages/LoginPage/components/login/Login.vue.d.ts.map +1 -1
- package/dist/shared/utilities/colorUtils.d.ts +0 -6
- package/dist/shared/utilities/colorUtils.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-banner/vc-banner.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts +0 -15
- package/dist/ui/components/atoms/vc-button/vc-button.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-icon/vc-lucide-icon.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-image/vc-image.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-link/vc-link.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-loading/vc-loading.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts +0 -5
- package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-video/vc-video.vue.d.ts.map +1 -1
- package/dist/ui/components/atoms/vc-widget/vc-widget.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-pagination/vc-pagination.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-toast/vc-toast.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/vc-app.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-login-form/vc-login-form.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableActions.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableColumnResize.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableRowReorder.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableSelection.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/composables/useTableState.d.ts.map +1 -1
- package/dist/{vendor-lodash-es-BqkGj3Jl.js → vendor-lodash-es-SgOIjJF8.js} +2 -0
- package/package.json +5 -5
- package/shared/components/app-switcher/composables/useAppSwitcher/index.ts +4 -1
- package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +67 -4
- package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +13 -10
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeActions.ts +7 -4
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/bladeRouteResolver.ts +4 -1
- package/shared/components/blade-navigation/composables/useBladeNavigation/internal/routerUtils.ts +4 -1
- package/shared/components/change-password/change-password.vue +1 -1
- package/shared/components/draggable-dashboard/composables/useDashboardDragAndDrop.ts +14 -5
- package/shared/components/draggable-dashboard/composables/useLayoutPersistence.ts +5 -2
- package/shared/components/index.ts +2 -0
- package/shared/components/notifications/composables/useContainer/index.ts +8 -6
- package/shared/components/notifications/composables/useInstance/index.ts +4 -1
- package/shared/components/notifications/core/notification.ts +10 -7
- package/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue +20 -1
- package/shared/components/sign-in/useExternalProvider.ts +6 -4
- package/shared/composables/index.ts +1 -0
- package/shared/composables/useExternalWidgets.ts +7 -4
- package/shared/composables/useMenuExpanded.ts +15 -1
- package/shared/composables/useTableSelection.ts +151 -0
- package/shared/composables/useTableSort.ts +4 -4
- package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +6 -3
- package/shared/pages/LoginPage/components/login/Login.vue +4 -1
- package/shared/utilities/colorUtils.ts +5 -12
- package/ui/components/atoms/vc-banner/vc-banner.vue +4 -1
- package/ui/components/atoms/vc-button/vc-button.vue +2 -25
- package/ui/components/atoms/vc-container/vc-container.vue +12 -3
- package/ui/components/atoms/vc-icon/vc-icon.vue +0 -10
- package/ui/components/atoms/vc-icon/vc-lucide-icon.vue +5 -2
- package/ui/components/atoms/vc-image/vc-image.vue +4 -1
- package/ui/components/atoms/vc-link/vc-link.vue +59 -54
- package/ui/components/atoms/vc-loading/vc-loading.vue +4 -0
- package/ui/components/atoms/vc-status/vc-status.vue +0 -5
- package/ui/components/atoms/vc-status-icon/vc-status-icon.vue +4 -4
- package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +8 -1
- package/ui/components/atoms/vc-video/vc-video.vue +4 -2
- package/ui/components/atoms/vc-widget/vc-widget.vue +4 -1
- package/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue +7 -2
- package/ui/components/molecules/vc-input/vc-input.vue +0 -1
- package/ui/components/molecules/vc-pagination/vc-pagination.vue +6 -1
- package/ui/components/molecules/vc-rating/vc-rating.vue +1 -1
- package/ui/components/molecules/vc-textarea/vc-textarea.vue +1 -1
- package/ui/components/molecules/vc-toast/vc-toast.vue +11 -1
- package/ui/components/organisms/vc-app/vc-app.vue +22 -3
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +4 -1
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +14 -14
- package/ui/components/organisms/vc-blade/vc-blade.vue +3 -1
- package/ui/components/organisms/vc-login-form/vc-login-form.vue +3 -1
- package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +34 -2
- package/ui/components/organisms/vc-table/composables/useTableActions.ts +7 -10
- package/ui/components/organisms/vc-table/composables/useTableColumnResize.ts +4 -1
- package/ui/components/organisms/vc-table/composables/useTableRowReorder.ts +5 -2
- package/ui/components/organisms/vc-table/composables/useTableSelection.ts +26 -18
- package/ui/components/organisms/vc-table/composables/useTableState.ts +4 -1
- package/core/services/global-search-service.ts +0 -36
- package/dist/core/services/global-search-service.d.ts +0 -10
- package/dist/core/services/global-search-service.d.ts.map +0 -1
|
@@ -29,23 +29,8 @@ export interface Props {
|
|
|
29
29
|
variant?: "primary" | "secondary";
|
|
30
30
|
disabled?: boolean;
|
|
31
31
|
size?: "xs" | "sm" | "base";
|
|
32
|
-
/**
|
|
33
|
-
* @deprecated Use `size` instead
|
|
34
|
-
* Whether the button is small
|
|
35
|
-
* */
|
|
36
|
-
small?: boolean;
|
|
37
|
-
/**
|
|
38
|
-
* @deprecated Use `variant` instead
|
|
39
|
-
* Whether the button is outlined
|
|
40
|
-
* */
|
|
41
|
-
outline?: boolean;
|
|
42
32
|
selected?: boolean;
|
|
43
33
|
text?: boolean;
|
|
44
|
-
/**
|
|
45
|
-
* @deprecated Use `variant` instead
|
|
46
|
-
* Whether the button is raised
|
|
47
|
-
* */
|
|
48
|
-
raised?: boolean;
|
|
49
34
|
}
|
|
50
35
|
|
|
51
36
|
export interface Emits {
|
|
@@ -73,12 +58,9 @@ const buttonClass = computed(() => {
|
|
|
73
58
|
{
|
|
74
59
|
[`vc-button-${props.variant}`]: props.variant,
|
|
75
60
|
[`vc-button_${props.size}`]: props.size,
|
|
76
|
-
// "vc-button_small": props.small,
|
|
77
|
-
// "vc-button_outline": props.outline,
|
|
78
61
|
"vc-button_selected": props.selected,
|
|
79
62
|
"vc-button_text": props.text,
|
|
80
63
|
"vc-button_disabled": props.disabled,
|
|
81
|
-
// "vc-button_raised": props.raised,
|
|
82
64
|
},
|
|
83
65
|
];
|
|
84
66
|
});
|
|
@@ -156,17 +138,12 @@ $variants: primary, secondary;
|
|
|
156
138
|
@apply tw-text-[color:var(--button-#{$variant}-text-color-disabled)] tw-bg-[color:var(--button-#{$variant}-background-color-disabled)] tw-border-[color:var(--button-#{$variant}-border-color-disabled)] tw-cursor-not-allowed;
|
|
157
139
|
}
|
|
158
140
|
|
|
159
|
-
// TODO: remove this after the migration
|
|
160
|
-
// &.vc-button_small {
|
|
161
|
-
// @apply tw-py-[var(--button-padding-vert-extra-small)] tw-min-h-[var(--button-height-extra-small)] tw-px-[var(--button-padding-hor-extra-small)] tw-text-xxs #{!important};
|
|
162
|
-
// }
|
|
163
|
-
|
|
164
141
|
&.vc-button_text {
|
|
165
142
|
@apply tw-border-none tw-bg-transparent
|
|
166
143
|
tw-text-[color:var(--button-#{$variant}-background-color)]
|
|
167
144
|
hover:tw-text-[color:var(--button-#{$variant}-background-color-hover)]
|
|
168
145
|
focus:tw-text-[color:var(--button-#{$variant}-background-color-hover)]
|
|
169
|
-
disabled:tw-text-[color:
|
|
146
|
+
disabled:tw-text-[color:var(--button-#{$variant}-text-color-disabled)] disabled:tw-opacity-50;
|
|
170
147
|
|
|
171
148
|
@apply tw-p-0 tw-min-h-0 #{!important};
|
|
172
149
|
}
|
|
@@ -175,7 +152,7 @@ $variants: primary, secondary;
|
|
|
175
152
|
@apply tw-bg-[color:var(--button-#{$variant}-background-color-hover)];
|
|
176
153
|
|
|
177
154
|
&.vc-button_text {
|
|
178
|
-
@apply tw-bg-[color:
|
|
155
|
+
@apply tw-bg-[color:var(--button-#{$variant}-background-color-hover)] tw-bg-opacity-[0.07] tw-p-1;
|
|
179
156
|
}
|
|
180
157
|
}
|
|
181
158
|
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
</template>
|
|
43
43
|
|
|
44
44
|
<script lang="ts" setup>
|
|
45
|
-
import { ref, onMounted, computed, shallowRef, watch, inject, Ref } from "vue";
|
|
45
|
+
import { ref, onMounted, onBeforeUnmount, computed, shallowRef, watch, inject, Ref } from "vue";
|
|
46
46
|
import { VcIcon } from "./../vc-icon";
|
|
47
47
|
|
|
48
48
|
export interface Props {
|
|
@@ -70,6 +70,8 @@ const goingUp = shallowRef(false);
|
|
|
70
70
|
const touching = shallowRef(false);
|
|
71
71
|
const isMobile = inject("isMobile") as Ref<boolean>;
|
|
72
72
|
|
|
73
|
+
let resizeObserver: ResizeObserver | null = null;
|
|
74
|
+
|
|
73
75
|
const topOffset = computed(() => Math.max(0, Math.min(pullDist.value, touchDiff.value)));
|
|
74
76
|
const canRefresh = computed(() => touchDiff.value >= pullDist.value && !refreshing.value);
|
|
75
77
|
|
|
@@ -116,12 +118,19 @@ function onScroll(e: Event) {
|
|
|
116
118
|
}
|
|
117
119
|
|
|
118
120
|
onMounted(() => {
|
|
119
|
-
|
|
121
|
+
resizeObserver = new ResizeObserver(() => {
|
|
120
122
|
scroll.value = (component.value && component.value.clientHeight < component.value.scrollHeight) as boolean;
|
|
121
123
|
});
|
|
122
124
|
|
|
123
125
|
if (component.value) {
|
|
124
|
-
|
|
126
|
+
resizeObserver.observe(component.value);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
onBeforeUnmount(() => {
|
|
131
|
+
if (resizeObserver) {
|
|
132
|
+
resizeObserver.disconnect();
|
|
133
|
+
resizeObserver = null;
|
|
125
134
|
}
|
|
126
135
|
});
|
|
127
136
|
|
|
@@ -110,16 +110,6 @@ const sizeMap = {
|
|
|
110
110
|
xxxl: 64,
|
|
111
111
|
} as const;
|
|
112
112
|
|
|
113
|
-
// Scaling factors for different icon types to make them visually equal
|
|
114
|
-
const scalingFactors = {
|
|
115
|
-
fontawesome: 1, // base reference
|
|
116
|
-
material: 1.1,
|
|
117
|
-
bootstrap: 0.95,
|
|
118
|
-
lucide: 1.2,
|
|
119
|
-
custom: 1,
|
|
120
|
-
svg: 1,
|
|
121
|
-
};
|
|
122
|
-
|
|
123
113
|
// Function to detect icon type if not explicitly specified
|
|
124
114
|
const detectIconType = computed((): IconType => {
|
|
125
115
|
if (typeof props.icon !== "string") {
|
|
@@ -23,6 +23,9 @@ import { computed, markRaw, onMounted, ref } from "vue";
|
|
|
23
23
|
import type { IconSize, IconVariant } from "./types";
|
|
24
24
|
import type { Component } from "vue";
|
|
25
25
|
import { useIcon } from "./composables";
|
|
26
|
+
import { createLogger } from "../../../../core/utilities";
|
|
27
|
+
|
|
28
|
+
const logger = createLogger("vc-lucide-icon");
|
|
26
29
|
|
|
27
30
|
interface Props {
|
|
28
31
|
/**
|
|
@@ -125,10 +128,10 @@ onMounted(async () => {
|
|
|
125
128
|
if (module && typeof module === "object" && iconName in module) {
|
|
126
129
|
resolvedIconComponent.value = markRaw(module[iconName as keyof typeof module] as Component);
|
|
127
130
|
} else {
|
|
128
|
-
|
|
131
|
+
logger.warn(`Lucide icon not found: ${iconName}`);
|
|
129
132
|
}
|
|
130
133
|
} catch (error) {
|
|
131
|
-
|
|
134
|
+
logger.error(`Error loading Lucide icon: ${normalizedIconName.value}`, error);
|
|
132
135
|
}
|
|
133
136
|
});
|
|
134
137
|
</script>
|
|
@@ -32,6 +32,9 @@
|
|
|
32
32
|
<script lang="ts" setup>
|
|
33
33
|
import { VcIcon } from "./../vc-icon";
|
|
34
34
|
import { computed } from "vue";
|
|
35
|
+
import { createLogger } from "../../../../core/utilities";
|
|
36
|
+
|
|
37
|
+
const logger = createLogger("vc-image");
|
|
35
38
|
|
|
36
39
|
export interface Props {
|
|
37
40
|
aspect?: "1x1" | "16x9" | "4x3" | "3x2";
|
|
@@ -67,7 +70,7 @@ function ensureHttps(url: string): string {
|
|
|
67
70
|
return urlObject.href;
|
|
68
71
|
}
|
|
69
72
|
} catch (e) {
|
|
70
|
-
|
|
73
|
+
logger.warn("Invalid URL:", url);
|
|
71
74
|
}
|
|
72
75
|
return url;
|
|
73
76
|
}
|
|
@@ -1,54 +1,59 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
'vc-link--
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
--link-text-color
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
|
|
1
|
+
<template>
|
|
2
|
+
<button
|
|
3
|
+
type="button"
|
|
4
|
+
class="vc-link"
|
|
5
|
+
:class="{
|
|
6
|
+
'vc-link--active': active,
|
|
7
|
+
'vc-link--disabled': disabled,
|
|
8
|
+
}"
|
|
9
|
+
:disabled="disabled"
|
|
10
|
+
:aria-disabled="disabled"
|
|
11
|
+
@click="onClickFn"
|
|
12
|
+
>
|
|
13
|
+
<slot></slot>
|
|
14
|
+
</button>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script lang="ts" setup>
|
|
18
|
+
export interface Props {
|
|
19
|
+
active?: boolean;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
onClick?: () => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface Emits {
|
|
25
|
+
(event: "click"): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const props = defineProps<Props>();
|
|
29
|
+
const emit = defineEmits<Emits>();
|
|
30
|
+
|
|
31
|
+
function onClickFn(): void {
|
|
32
|
+
if (!props.disabled) {
|
|
33
|
+
emit("click");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<style lang="scss">
|
|
39
|
+
:root {
|
|
40
|
+
--link-text-color: var(--primary-500);
|
|
41
|
+
--link-text-color-hover: var(--primary-400);
|
|
42
|
+
--link-text-color-active: var(--primary-700);
|
|
43
|
+
--link-text-color-disabled: var(--neutrals-300);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.vc-link {
|
|
47
|
+
@apply tw-text-[color:var(--link-text-color)] tw-no-underline tw-cursor-pointer tw-transition tw-duration-200 tw-inline-block hover:tw-text-[color:var(--link-text-color-hover)] hover:tw-underline;
|
|
48
|
+
/* Reset button styles for link appearance */
|
|
49
|
+
@apply tw-bg-transparent tw-border-none tw-p-0 tw-font-[inherit] tw-text-[inherit];
|
|
50
|
+
|
|
51
|
+
&--active {
|
|
52
|
+
@apply tw-text-[color:var(--link-text-color-active)] tw-no-underline hover:tw-text-[color:var(--link-text-color-active)] hover:tw-no-underline;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
&--disabled {
|
|
56
|
+
@apply tw-cursor-not-allowed tw-text-[color:var(--link-text-color-disabled)] tw-no-underline hover:tw-text-[color:var(--link-text-color-disabled)] hover:tw-no-underline;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
</style>
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
:class="{
|
|
5
5
|
'vc-loading-overlay--active': active,
|
|
6
6
|
}"
|
|
7
|
+
role="status"
|
|
8
|
+
:aria-busy="active"
|
|
9
|
+
aria-live="polite"
|
|
7
10
|
>
|
|
8
11
|
<div class="vc-loading-overlay__content">
|
|
9
12
|
<span class="vc-loading-overlay__main-marker"></span>
|
|
@@ -14,6 +17,7 @@
|
|
|
14
17
|
class="vc-loading-overlay__marker"
|
|
15
18
|
></span>
|
|
16
19
|
</div>
|
|
20
|
+
<span class="tw-sr-only">{{ active ? 'Loading...' : '' }}</span>
|
|
17
21
|
</div>
|
|
18
22
|
</div>
|
|
19
23
|
</template>
|
|
@@ -18,17 +18,12 @@
|
|
|
18
18
|
<script lang="ts" setup>
|
|
19
19
|
export interface Props {
|
|
20
20
|
variant?: "info" | "warning" | "danger" | "success" | "light-danger" | "info-dark" | "primary";
|
|
21
|
-
/**
|
|
22
|
-
* @deprecated
|
|
23
|
-
*/
|
|
24
|
-
outline?: boolean;
|
|
25
21
|
extend?: boolean;
|
|
26
22
|
dot?: boolean;
|
|
27
23
|
}
|
|
28
24
|
|
|
29
25
|
withDefaults(defineProps<Props>(), {
|
|
30
26
|
variant: "info",
|
|
31
|
-
outline: false,
|
|
32
27
|
dot: false,
|
|
33
28
|
});
|
|
34
29
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<template v-else>
|
|
10
10
|
<VcIcon
|
|
11
11
|
icon="material-cancel"
|
|
12
|
-
class="vc-status-icon__icon vc-status-icon__icon--
|
|
12
|
+
class="vc-status-icon__icon vc-status-icon__icon--inactive"
|
|
13
13
|
></VcIcon>
|
|
14
14
|
</template>
|
|
15
15
|
</div>
|
|
@@ -27,7 +27,7 @@ defineProps<Props>();
|
|
|
27
27
|
<style lang="scss">
|
|
28
28
|
:root {
|
|
29
29
|
--status-success-main-color: var(--success-400);
|
|
30
|
-
--status-
|
|
30
|
+
--status-inactive-main-color: var(--info-300);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
.vc-status-icon {
|
|
@@ -35,8 +35,8 @@ defineProps<Props>();
|
|
|
35
35
|
@apply tw-text-[color:var(--status-success-main-color)];
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
&__icon--
|
|
39
|
-
@apply tw-text-[color:var(--status-
|
|
38
|
+
&__icon--inactive {
|
|
39
|
+
@apply tw-text-[color:var(--status-inactive-main-color)];
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
</style>
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
<!-- eslint-disable @typescript-eslint/no-explicit-any -->
|
|
28
28
|
<script lang="ts" setup>
|
|
29
29
|
import { useFloating, shift, Placement, offset as floatingOffset } from "@floating-ui/vue";
|
|
30
|
-
import { getCurrentInstance, ref, computed } from "vue";
|
|
30
|
+
import { getCurrentInstance, ref, computed, onBeforeUnmount } from "vue";
|
|
31
31
|
|
|
32
32
|
export interface Props {
|
|
33
33
|
placement?: "top" | "right" | "bottom" | "left" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end";
|
|
@@ -83,6 +83,13 @@ const hideTooltip = () => {
|
|
|
83
83
|
}
|
|
84
84
|
tooltipVisible.value = false;
|
|
85
85
|
};
|
|
86
|
+
|
|
87
|
+
onBeforeUnmount(() => {
|
|
88
|
+
if (showTimeout) {
|
|
89
|
+
clearTimeout(showTimeout);
|
|
90
|
+
showTimeout = null;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
86
93
|
</script>
|
|
87
94
|
|
|
88
95
|
<style lang="scss">
|
|
@@ -16,12 +16,14 @@
|
|
|
16
16
|
<div class="vc-video__container">
|
|
17
17
|
<div v-if="source">
|
|
18
18
|
<iframe
|
|
19
|
-
:src="
|
|
19
|
+
:src="source"
|
|
20
20
|
width="100%"
|
|
21
21
|
height="300px"
|
|
22
22
|
frameborder="0"
|
|
23
|
+
sandbox="allow-scripts allow-same-origin allow-presentation allow-popups"
|
|
23
24
|
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
24
|
-
allowfullscreen
|
|
25
|
+
allowfullscreen
|
|
26
|
+
loading="lazy"
|
|
25
27
|
>
|
|
26
28
|
</iframe>
|
|
27
29
|
</div>
|
|
@@ -41,6 +41,9 @@
|
|
|
41
41
|
import { computed, getCurrentInstance, useAttrs } from "vue";
|
|
42
42
|
import { VcIcon } from "./../vc-icon";
|
|
43
43
|
import { useWidgets } from "../../../../core/composables";
|
|
44
|
+
import { createLogger } from "../../../../core/utilities";
|
|
45
|
+
|
|
46
|
+
const logger = createLogger("vc-widget");
|
|
44
47
|
|
|
45
48
|
export interface Props {
|
|
46
49
|
icon?: string;
|
|
@@ -72,7 +75,7 @@ function onClick() {
|
|
|
72
75
|
widgetId: actualWidgetId.value,
|
|
73
76
|
});
|
|
74
77
|
} else if (!actualWidgetId.value) {
|
|
75
|
-
|
|
78
|
+
logger.warn("widgetId is missing from attrs. Widget activation might not work as expected.");
|
|
76
79
|
}
|
|
77
80
|
emit("click");
|
|
78
81
|
}
|
|
@@ -102,6 +102,11 @@ defineSlots<{
|
|
|
102
102
|
trigger: (props: { click: () => void; isActive: boolean }) => VNode;
|
|
103
103
|
}>();
|
|
104
104
|
|
|
105
|
+
/** Default width for the "more" button in pixels */
|
|
106
|
+
const MORE_BUTTON_WIDTH = 100;
|
|
107
|
+
/** Default initial item width for calculation in pixels */
|
|
108
|
+
const INITIAL_ITEM_WIDTH = 100;
|
|
109
|
+
|
|
105
110
|
const el = ref<HTMLElement | null>(null);
|
|
106
111
|
const showBreadcrumbs = ref(false);
|
|
107
112
|
|
|
@@ -109,9 +114,9 @@ const { visibleItems, hiddenItems, showMoreButton, recalculate } = useAdaptiveIt
|
|
|
109
114
|
containerRef: el,
|
|
110
115
|
items: toRef(props, "items"),
|
|
111
116
|
getItemKey: (item) => item.id!,
|
|
112
|
-
moreButtonWidth:
|
|
117
|
+
moreButtonWidth: MORE_BUTTON_WIDTH,
|
|
113
118
|
calculationStrategy: "reverse",
|
|
114
|
-
initialItemWidth:
|
|
119
|
+
initialItemWidth: INITIAL_ITEM_WIDTH,
|
|
115
120
|
});
|
|
116
121
|
|
|
117
122
|
function toggleBreadcrumbs() {
|
|
@@ -269,7 +269,6 @@ import VueDatePicker, { VueDatePickerProps, ModelValue } from "@vuepic/vue-datep
|
|
|
269
269
|
import "@vuepic/vue-datepicker/dist/main.css";
|
|
270
270
|
import {
|
|
271
271
|
convertColorNameToHex,
|
|
272
|
-
convertHexToColorName,
|
|
273
272
|
isValidHexColor,
|
|
274
273
|
normalizeHexColor,
|
|
275
274
|
} from "../../../../shared/utilities";
|
|
@@ -79,6 +79,11 @@ const emit = defineEmits<Emits>();
|
|
|
79
79
|
|
|
80
80
|
const isMobile = inject("isMobile") as Ref<boolean>;
|
|
81
81
|
|
|
82
|
+
/** Number of page buttons to show on mobile devices */
|
|
83
|
+
const MAX_PAGES_MOBILE = 3;
|
|
84
|
+
/** Number of page buttons to show on desktop devices */
|
|
85
|
+
const MAX_PAGES_DESKTOP = 5;
|
|
86
|
+
|
|
82
87
|
const { variant } = toRefs(props);
|
|
83
88
|
const localCurrentPage = ref(props.currentPage);
|
|
84
89
|
|
|
@@ -102,7 +107,7 @@ const pagesToShow = computed(() => {
|
|
|
102
107
|
const pages = [];
|
|
103
108
|
const totalPages = props.pages;
|
|
104
109
|
const current = localCurrentPage.value;
|
|
105
|
-
const maxPages = isMobile.value ?
|
|
110
|
+
const maxPages = isMobile.value ? MAX_PAGES_MOBILE : MAX_PAGES_DESKTOP;
|
|
106
111
|
|
|
107
112
|
if (totalPages <= maxPages) {
|
|
108
113
|
for (let i = 1; i <= totalPages; i++) {
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
<script lang="ts" setup>
|
|
38
38
|
import { Content, NotificationType, NotificationPosition } from "../../../../shared/components/notifications";
|
|
39
39
|
import { VcIcon } from "../..";
|
|
40
|
-
import { Ref, onMounted, ref, toRefs, watch } from "vue";
|
|
40
|
+
import { Ref, onMounted, onBeforeUnmount, ref, toRefs, watch } from "vue";
|
|
41
41
|
|
|
42
42
|
export interface Props {
|
|
43
43
|
content?: Content;
|
|
@@ -70,6 +70,7 @@ interface NotificationTimer {
|
|
|
70
70
|
pause: () => void;
|
|
71
71
|
resume: () => void;
|
|
72
72
|
start: () => void;
|
|
73
|
+
clear: () => void;
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
const timer = ref<NotificationTimer | null>(null);
|
|
@@ -120,13 +121,22 @@ function Timer(callback: (...args: unknown[]) => unknown, delay: number): Notifi
|
|
|
120
121
|
resume();
|
|
121
122
|
}
|
|
122
123
|
|
|
124
|
+
function clear() {
|
|
125
|
+
window.clearTimeout(timerId);
|
|
126
|
+
}
|
|
127
|
+
|
|
123
128
|
return {
|
|
124
129
|
pause,
|
|
125
130
|
resume,
|
|
126
131
|
start,
|
|
132
|
+
clear,
|
|
127
133
|
};
|
|
128
134
|
}
|
|
129
135
|
|
|
136
|
+
onBeforeUnmount(() => {
|
|
137
|
+
timer.value?.clear();
|
|
138
|
+
});
|
|
139
|
+
|
|
130
140
|
function onMouseEnter() {
|
|
131
141
|
if (props.timeout) {
|
|
132
142
|
timer.value?.pause();
|
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
class="vc-app__workspace"
|
|
31
31
|
>
|
|
32
32
|
<VcBladeNavigation />
|
|
33
|
+
<!-- AI Agent Panel (shown when plugin is installed) -->
|
|
34
|
+
<VcAiAgentPanel v-if="aiAgentConfig?.url" />
|
|
33
35
|
</div>
|
|
34
36
|
|
|
35
37
|
<!-- Popup container -->
|
|
@@ -49,6 +51,8 @@ import {
|
|
|
49
51
|
BladeRoutesRecord,
|
|
50
52
|
} from "./../../../../shared/components";
|
|
51
53
|
import { useAppSwitcher } from "../../../../shared/components/app-switcher/composables/useAppSwitcher";
|
|
54
|
+
import { VcAiAgentPanel, provideAiAgentService } from "../../../../core/plugins/ai-agent";
|
|
55
|
+
import type { IAiAgentConfig } from "../../../../core/plugins/ai-agent";
|
|
52
56
|
import { provideAppBarWidget, useNotifications } from "../../../../core/composables";
|
|
53
57
|
import { useRoute, useRouter } from "vue-router";
|
|
54
58
|
import { watchOnce } from "@vueuse/core";
|
|
@@ -64,6 +68,7 @@ import { DynamicModulesKey, EMBEDDED_MODE } from "../../../../injection-keys";
|
|
|
64
68
|
import { provideMenuService } from "../../../../core/composables/useMenuService";
|
|
65
69
|
import { provideAppBarMobileButtonsService } from "../../../../core/composables/useAppBarMobileButtons";
|
|
66
70
|
import { useUserManagement } from "../../../../core/composables/useUserManagement";
|
|
71
|
+
import { createLogger } from "../../../../core/utilities";
|
|
67
72
|
|
|
68
73
|
export interface Props {
|
|
69
74
|
isReady: boolean;
|
|
@@ -92,10 +97,13 @@ defineSlots<{
|
|
|
92
97
|
const props = defineProps<Props>();
|
|
93
98
|
const slots = useSlots();
|
|
94
99
|
|
|
95
|
-
|
|
100
|
+
const logger = createLogger("vc-app");
|
|
101
|
+
logger.debug("Init vc-app");
|
|
96
102
|
|
|
97
103
|
const internalRoutes = inject("bladeRoutes") as BladeRoutesRecord[];
|
|
98
104
|
const dynamicModules = inject(DynamicModulesKey, undefined);
|
|
105
|
+
const aiAgentConfig = inject<IAiAgentConfig | undefined>("aiAgentConfig", undefined);
|
|
106
|
+
const aiAgentAddGlobalToolbarButton = inject<boolean>("aiAgentAddGlobalToolbarButton", true);
|
|
99
107
|
|
|
100
108
|
const isAppReady = ref(props.isReady);
|
|
101
109
|
|
|
@@ -163,7 +171,7 @@ registerMobileButton({
|
|
|
163
171
|
});
|
|
164
172
|
|
|
165
173
|
const onMenuItemClick = function (item: MenuItem) {
|
|
166
|
-
|
|
174
|
+
logger.debug("onMenuItemClick() called");
|
|
167
175
|
|
|
168
176
|
if (item.routeId) {
|
|
169
177
|
const bladeComponent = resolveBladeByName(item.routeId);
|
|
@@ -175,7 +183,7 @@ const onMenuItemClick = function (item: MenuItem) {
|
|
|
175
183
|
true,
|
|
176
184
|
);
|
|
177
185
|
} else {
|
|
178
|
-
|
|
186
|
+
logger.error(`Blade component with routeId '${item.routeId}' not found.`);
|
|
179
187
|
}
|
|
180
188
|
} else if (!item.routeId && item.url) {
|
|
181
189
|
const menuRoute = routes.find((r) => {
|
|
@@ -218,6 +226,14 @@ provideDashboardService();
|
|
|
218
226
|
provideMenuService();
|
|
219
227
|
provideGlobalSearch();
|
|
220
228
|
provide(EMBEDDED_MODE, isEmbedded);
|
|
229
|
+
|
|
230
|
+
// Provide AI Agent service if config is available (via plugin)
|
|
231
|
+
if (aiAgentConfig?.url) {
|
|
232
|
+
provideAiAgentService({
|
|
233
|
+
config: aiAgentConfig,
|
|
234
|
+
addGlobalToolbarButton: aiAgentAddGlobalToolbarButton,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
221
237
|
// Provide slots to child components with all necessary props and handlers
|
|
222
238
|
provideAppSlots(
|
|
223
239
|
slots,
|
|
@@ -245,6 +261,9 @@ onUnmounted(() => {
|
|
|
245
261
|
<style lang="scss">
|
|
246
262
|
:root {
|
|
247
263
|
--app-background: var(--secondary-200);
|
|
264
|
+
// Shared transition timing for synchronized animations
|
|
265
|
+
--app-panel-transition-duration: 0.3s;
|
|
266
|
+
--app-panel-transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
|
|
248
267
|
}
|
|
249
268
|
|
|
250
269
|
.vc-app {
|
|
@@ -43,6 +43,9 @@
|
|
|
43
43
|
<script lang="ts" setup>
|
|
44
44
|
import { ref } from "vue";
|
|
45
45
|
import { VcIcon, VcTooltip } from "../../../../../../../../";
|
|
46
|
+
import { createLogger } from "../../../../../../../../../../core/utilities";
|
|
47
|
+
|
|
48
|
+
const logger = createLogger("vc-blade-toolbar-button");
|
|
46
49
|
|
|
47
50
|
export interface Props {
|
|
48
51
|
isExpanded: boolean;
|
|
@@ -81,7 +84,7 @@ const emit = defineEmits<Emits>();
|
|
|
81
84
|
const isWaiting = ref(false);
|
|
82
85
|
|
|
83
86
|
async function onClick(): Promise<void> {
|
|
84
|
-
|
|
87
|
+
logger.debug("onClick()");
|
|
85
88
|
|
|
86
89
|
if (!props.disabled && !isWaiting.value) {
|
|
87
90
|
if (props.clickHandler && typeof props.clickHandler === "function") {
|