@vc-shell/framework 1.1.0-alpha.6 → 1.1.0-alpha.7
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/useGlobalSearch/index.ts +4 -4
- package/core/constants/index.ts +2 -0
- package/core/plugins/modularity/index.ts +1 -1
- package/core/services/menu-service.ts +292 -28
- package/core/types/index.ts +13 -0
- package/dist/core/composables/useGlobalSearch/index.d.ts +2 -2
- package/dist/core/constants/index.d.ts +1 -0
- package/dist/core/constants/index.d.ts.map +1 -1
- package/dist/core/services/menu-service.d.ts +36 -3
- package/dist/core/services/menu-service.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +13 -0
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/framework.js +198 -197
- package/dist/{index-LjqdX6jw.js → index-4fNoXD3u.js} +1 -1
- package/dist/{index-CyuFXG83.js → index-7YHBATKO.js} +1 -1
- package/dist/{index-D1rpRTKf.js → index-7gQRbSrG.js} +1 -1
- package/dist/{index-B-nvqNbp.js → index-B1NfXGpu.js} +1 -1
- package/dist/{index-DZAq0B3U.js → index-B42ra4oQ.js} +21078 -21001
- package/dist/{index-EDF1MDtU.js → index-Bixm_Atu.js} +1 -1
- package/dist/{index-DvGVm1rK.js → index-C9NLyptv.js} +1 -1
- package/dist/{index-C7P-aBjd.js → index-CPjPhNQr.js} +1 -1
- package/dist/{index-CfyFpaKq.js → index-CR62_U0-.js} +1 -1
- package/dist/{index-DLxTAT7x.js → index-DHUS6fMi.js} +1 -1
- package/dist/{index-BXlxP2d2.js → index-DKMXMXmO.js} +1 -1
- package/dist/{index-Ci23AX3j.js → index-DxhPupsj.js} +1 -1
- package/dist/{index-DtkJ7xTB.js → index-DyDl-e3b.js} +1 -1
- package/dist/{index-DOVhosAY.js → index-IdAZC2W6.js} +1 -1
- package/dist/{index-BQF2-UMe.js → index-QiYxGOfR.js} +1 -1
- package/dist/{index-CO_2IshF.js → index-qjW_Kc_I.js} +1 -1
- package/dist/{index-3ySdd-mG.js → index-tHx2asQS.js} +1 -1
- package/dist/index.css +1 -1
- package/dist/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.d.ts.map +1 -1
- package/dist/shared/components/notification-dropdown/notification-dropdown.vue.d.ts.map +1 -1
- package/dist/shared/components/sidebar/sidebar.vue.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-badge/vc-badge.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarOverlay.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.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-header/vc-blade-header.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.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-table/_internal/vc-table-base-header/vc-table-base-header.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue.d.ts.map +1 -1
- package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
- package/dist/ui/composables/useVisibleElements.d.ts.map +1 -1
- package/package.json +4 -4
- package/shared/components/blade-navigation/components/vc-blade-view/vc-blade-view.ts +2 -2
- package/shared/components/blade-navigation/types/index.ts +117 -117
- package/shared/components/draggable-dashboard/DraggableDashboard.vue +2 -5
- package/shared/components/draggable-dashboard/_internal/DashboardWidget.vue +16 -32
- package/shared/components/notification-dropdown/notification-dropdown.vue +11 -1
- package/shared/components/sidebar/sidebar.vue +36 -34
- package/shared/pages/LoginPage/components/login/Login.vue +0 -2
- package/ui/components/atoms/vc-badge/vc-badge.vue +26 -10
- package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +2 -2
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarHeader.vue +31 -2
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/_internal/AppBarOverlay.vue +15 -13
- package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +26 -15
- package/ui/components/organisms/vc-app/vc-app.vue +14 -2
- package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +4 -5
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/_internal/vc-blade-toolbar-button/vc-blade-toolbar-circle-button.vue +2 -2
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-buttons/mobile/vc-blade-toolbar-mobile.vue +1 -1
- package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +0 -3
- package/ui/components/organisms/vc-blade/vc-blade.vue +7 -2
- package/ui/components/organisms/vc-login-form/vc-login-form.vue +99 -99
- package/ui/components/organisms/vc-table/_internal/vc-table-base-header/vc-table-base-header.vue +5 -5
- package/ui/components/organisms/vc-table/_internal/vc-table-desktop-view/_internal/vc-table-columns-header/vc-table-columns-header.vue +1 -0
- package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +40 -28
- package/ui/components/organisms/vc-table/_internal/vc-table-header/vc-table-header.vue +1 -1
- package/ui/components/organisms/vc-table/vc-table.vue +5 -4
- package/ui/composables/useVisibleElements.ts +2 -0
|
@@ -154,7 +154,6 @@
|
|
|
154
154
|
<VcHint
|
|
155
155
|
v-if="!signInResult.succeeded"
|
|
156
156
|
class="vc-login-page__error-hint"
|
|
157
|
-
style="color: #f14e4e"
|
|
158
157
|
>
|
|
159
158
|
<!-- TODO: stylizing-->
|
|
160
159
|
{{ signInResult.error }}
|
|
@@ -162,7 +161,6 @@
|
|
|
162
161
|
<VcHint
|
|
163
162
|
v-if="!requestPassResult.succeeded"
|
|
164
163
|
class="vc-login-page__error-hint"
|
|
165
|
-
style="color: #f14e4e"
|
|
166
164
|
>
|
|
167
165
|
<!-- TODO: stylizing-->
|
|
168
166
|
{{ requestPassResult.error }}
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
'vc-badge__badge--active': active,
|
|
18
18
|
'vc-badge__badge--clickable': clickable,
|
|
19
19
|
'vc-badge__badge--disabled': disabled,
|
|
20
|
+
'vc-badge__badge--content-long': String(content).length > 1,
|
|
21
|
+
'vc-badge__badge--content-very-long': String(content).length > 2,
|
|
20
22
|
}"
|
|
21
23
|
@click="onClick"
|
|
22
24
|
>
|
|
@@ -78,11 +80,8 @@ function onClick(): void {
|
|
|
78
80
|
--badge-border-color-active: var(--primary-300);
|
|
79
81
|
--badge-border-color-disabled: var(--primary-200);
|
|
80
82
|
|
|
81
|
-
--badge-
|
|
82
|
-
--badge-
|
|
83
|
-
|
|
84
|
-
--badge-padding-small: 0px 4px;
|
|
85
|
-
--badge-padding-medium: 0 4px;
|
|
83
|
+
--badge-size-small: 17px;
|
|
84
|
+
--badge-size-medium: 20px;
|
|
86
85
|
|
|
87
86
|
--badge-distance-top-small: -8px;
|
|
88
87
|
--badge-distance-right-small: -10px;
|
|
@@ -97,12 +96,11 @@ $sizes: small, medium;
|
|
|
97
96
|
.vc-badge {
|
|
98
97
|
&--#{$size} {
|
|
99
98
|
.vc-badge__badge {
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
height: var(--badge-size-#{$size});
|
|
100
|
+
min-width: var(--badge-size-#{$size});
|
|
102
101
|
top: var(--badge-distance-top-#{$size});
|
|
103
102
|
right: var(--badge-distance-right-#{$size});
|
|
104
|
-
|
|
105
|
-
@apply tw-text-xs tw-leading-snug;
|
|
103
|
+
@apply tw-text-xxs tw-leading-snug;
|
|
106
104
|
}
|
|
107
105
|
}
|
|
108
106
|
}
|
|
@@ -113,7 +111,25 @@ $sizes: small, medium;
|
|
|
113
111
|
}
|
|
114
112
|
|
|
115
113
|
.vc-badge__badge {
|
|
116
|
-
@apply tw-absolute tw-inline-flex tw-justify-center tw-items-center tw-text-center tw-indent-0 tw-rounded-full tw-font-semibold tw-
|
|
114
|
+
@apply tw-absolute tw-inline-flex tw-justify-center tw-items-center tw-text-center tw-indent-0 tw-rounded-full tw-font-semibold tw-bg-[color:var(--badge-background-color)] tw-text-[color:var(--badge-text-color)] tw-border tw-border-solid tw-border-[color:var(--badge-border-color)] tw-transition tw-duration-200;
|
|
115
|
+
aspect-ratio: 1 / 1;
|
|
116
|
+
box-sizing: border-box;
|
|
117
|
+
white-space: nowrap;
|
|
118
|
+
line-height: 1;
|
|
119
|
+
display: flex;
|
|
120
|
+
justify-content: center;
|
|
121
|
+
align-items: center;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.vc-badge__badge--content-long {
|
|
125
|
+
aspect-ratio: auto;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.vc-badge__badge--content-very-long {
|
|
129
|
+
aspect-ratio: auto;
|
|
130
|
+
max-width: 40px;
|
|
131
|
+
text-overflow: ellipsis;
|
|
132
|
+
overflow: hidden;
|
|
117
133
|
}
|
|
118
134
|
|
|
119
135
|
.vc-badge__badge--active {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
<script lang="ts" setup>
|
|
29
29
|
import { useFloating, shift, Placement, offset as floatingOffset } from "@floating-ui/vue";
|
|
30
|
-
import { getCurrentInstance, ref } from "vue";
|
|
30
|
+
import { getCurrentInstance, ref, computed } from "vue";
|
|
31
31
|
|
|
32
32
|
export interface Props {
|
|
33
33
|
placement?: Placement;
|
|
@@ -59,7 +59,7 @@ const target = ref(null);
|
|
|
59
59
|
let showTimeout: NodeJS.Timeout | null = null;
|
|
60
60
|
|
|
61
61
|
const instance = getCurrentInstance();
|
|
62
|
-
const appContainer = instance?.appContext.app._container
|
|
62
|
+
const appContainer = computed(() => instance?.appContext.app._container?.id);
|
|
63
63
|
|
|
64
64
|
const { floatingStyles } = useFloating(tooltipCompRef, tooltipRef, {
|
|
65
65
|
placement: props.placement,
|
|
@@ -45,7 +45,9 @@
|
|
|
45
45
|
text
|
|
46
46
|
:icon="SearchIcon"
|
|
47
47
|
icon-size="l"
|
|
48
|
-
|
|
48
|
+
class="app-bar-header__actions-button"
|
|
49
|
+
:class="{ 'app-bar-header__actions-button--active': isSearchVisible }"
|
|
50
|
+
@click="globalSearch.toggleSearch(bladeId)"
|
|
49
51
|
/>
|
|
50
52
|
</div>
|
|
51
53
|
<slot name="notifications" />
|
|
@@ -74,11 +76,12 @@
|
|
|
74
76
|
<script lang="ts" setup>
|
|
75
77
|
import { VcIcon } from "../../../../../";
|
|
76
78
|
import { MenuBurgerIcon, SearchIcon } from "../../../../../atoms/vc-icon/icons";
|
|
77
|
-
import { computed, Ref, ref, watchEffect } from "vue";
|
|
79
|
+
import { computed, Ref, ref, watch, watchEffect } from "vue";
|
|
78
80
|
import { useNotifications } from "../../../../../../../core/composables";
|
|
79
81
|
import { watchDebounced } from "@vueuse/core";
|
|
80
82
|
import { useBladeNavigation } from "./../../../../../../../shared";
|
|
81
83
|
import { useGlobalSearch } from "../../../../../../../core/composables/useGlobalSearch";
|
|
84
|
+
import { FALLBACK_BLADE_ID } from "../../../../../../../core/constants";
|
|
82
85
|
|
|
83
86
|
defineProps<{
|
|
84
87
|
logo?: string;
|
|
@@ -99,6 +102,17 @@ const { notifications } = useNotifications();
|
|
|
99
102
|
const { blades, currentBladeNavigationData } = useBladeNavigation();
|
|
100
103
|
const globalSearch = useGlobalSearch();
|
|
101
104
|
|
|
105
|
+
watch(
|
|
106
|
+
() => globalSearch.isSearchVisible.value,
|
|
107
|
+
(value) => {
|
|
108
|
+
console.log(value);
|
|
109
|
+
},
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
const bladeId = computed(() => {
|
|
113
|
+
return blades.value[blades.value.length - 1]?.type.name || FALLBACK_BLADE_ID;
|
|
114
|
+
});
|
|
115
|
+
|
|
102
116
|
const viewTitle = ref("");
|
|
103
117
|
const currentBladeId = ref(0);
|
|
104
118
|
|
|
@@ -115,6 +129,10 @@ watchEffect(
|
|
|
115
129
|
const hasUnread = computed(() => {
|
|
116
130
|
return notifications.value.some((item) => item.isNew);
|
|
117
131
|
});
|
|
132
|
+
|
|
133
|
+
const isSearchVisible = computed(() => {
|
|
134
|
+
return globalSearch.isSearchVisible.value[bladeId.value];
|
|
135
|
+
});
|
|
118
136
|
</script>
|
|
119
137
|
|
|
120
138
|
<style lang="scss">
|
|
@@ -122,6 +140,9 @@ const hasUnread = computed(() => {
|
|
|
122
140
|
--app-bar-header-padding-top: 18px;
|
|
123
141
|
--app-bar-header-blade-title: var(--neutrals-950);
|
|
124
142
|
--app-bar-accent-color: var(--danger-500);
|
|
143
|
+
|
|
144
|
+
--app-bar-header-actions-button-color: var(--neutrals-500);
|
|
145
|
+
--app-bar-header-actions-button-active-color: var(--primary-500);
|
|
125
146
|
}
|
|
126
147
|
|
|
127
148
|
.app-bar-header {
|
|
@@ -174,5 +195,13 @@ const hasUnread = computed(() => {
|
|
|
174
195
|
&__logo-append {
|
|
175
196
|
@apply tw-flex tw-items-center;
|
|
176
197
|
}
|
|
198
|
+
|
|
199
|
+
&__actions-button {
|
|
200
|
+
@apply tw-cursor-pointer tw-text-[var(--app-bar-header-actions-button-color)] #{!important};
|
|
201
|
+
|
|
202
|
+
&--active {
|
|
203
|
+
@apply tw-text-[var(--app-bar-header-actions-button-active-color)] #{!important};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
177
206
|
}
|
|
178
207
|
</style>
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
<
|
|
2
|
+
<Teleport to="body">
|
|
3
|
+
<div
|
|
4
|
+
class="app-bar-overlay"
|
|
5
|
+
:class="{
|
|
6
|
+
'app-bar-overlay--mobile': $isMobile.value,
|
|
7
|
+
'app-bar-overlay--desktop': $isDesktop.value,
|
|
8
|
+
'app-bar-overlay--sidebar': isSidebarMode,
|
|
9
|
+
'app-bar-overlay--standalone-mobile': $isMobile.value && !isSidebarMode,
|
|
10
|
+
'app-bar-overlay--collapsed': !expanded && !$isMobile.value,
|
|
11
|
+
}"
|
|
12
|
+
>
|
|
13
|
+
<div class="app-bar-overlay__content app-bar-overlay__dropdowns">
|
|
14
|
+
<slot />
|
|
15
|
+
</div>
|
|
14
16
|
</div>
|
|
15
|
-
</
|
|
17
|
+
</Teleport>
|
|
16
18
|
</template>
|
|
17
19
|
|
|
18
20
|
<script lang="ts" setup>
|
|
@@ -8,25 +8,13 @@
|
|
|
8
8
|
></div>
|
|
9
9
|
<div
|
|
10
10
|
class="vc-app-bar"
|
|
11
|
-
:class="
|
|
12
|
-
'vc-app-bar--mobile': $isMobile.value,
|
|
13
|
-
'vc-app-bar--desktop': $isDesktop.value,
|
|
14
|
-
'vc-app-bar--collapsed': !state.isSidebarExpanded && $isDesktop.value,
|
|
15
|
-
'vc-app-bar--hover-expanded': $isDesktop.value && isHoverExpanded,
|
|
16
|
-
'vc-app-bar--hover-collapsed': $isDesktop.value && !state.isSidebarExpanded && !isHoverExpanded,
|
|
17
|
-
}"
|
|
11
|
+
:class="appBarClasses"
|
|
18
12
|
@mouseenter="$isDesktop.value && !state.isSidebarExpanded && handleHoverExpand(true)"
|
|
19
13
|
@mouseleave="$isDesktop.value && !state.isSidebarExpanded && handleHoverExpand(false)"
|
|
20
14
|
>
|
|
21
15
|
<div
|
|
22
16
|
class="vc-app-bar__wrap"
|
|
23
|
-
:class="
|
|
24
|
-
'vc-app-bar__wrap--mobile-expanded': $isMobile.value && state.isSidebarExpanded,
|
|
25
|
-
'vc-app-bar__wrap--desktop-collapsed': $isDesktop.value && !state.isSidebarExpanded,
|
|
26
|
-
'vc-app-bar__wrap--desktop-expanded': $isDesktop.value && state.isSidebarExpanded,
|
|
27
|
-
'vc-app-bar__wrap--hover-expanded': $isDesktop.value && isHoverExpanded && !state.isSidebarExpanded,
|
|
28
|
-
'vc-app-bar__wrap--hover-collapsed': $isDesktop.value && !isHoverExpanded && !state.isSidebarExpanded,
|
|
29
|
-
}"
|
|
17
|
+
:class="wrapClasses"
|
|
30
18
|
>
|
|
31
19
|
<div
|
|
32
20
|
v-if="!$isMobile.value"
|
|
@@ -139,7 +127,7 @@ import AppBarHeader from "./_internal/AppBarHeader.vue";
|
|
|
139
127
|
import AppBarOverlay from "./_internal/AppBarOverlay.vue";
|
|
140
128
|
import MenuSidebar from "./_internal/MenuSidebar.vue";
|
|
141
129
|
import AppBarContent from "./_internal/AppBarContent.vue";
|
|
142
|
-
import { ref, computed, provide } from "vue";
|
|
130
|
+
import { ref, computed, provide, inject } from "vue";
|
|
143
131
|
import { vOnClickOutside } from "@vueuse/components";
|
|
144
132
|
|
|
145
133
|
export interface Props {
|
|
@@ -175,6 +163,9 @@ const {
|
|
|
175
163
|
} = useAppMenuState();
|
|
176
164
|
const { overlayContent, overlayProps, hideContent, isOverlayed } = useAppBarOverlay();
|
|
177
165
|
|
|
166
|
+
const isMobile = inject("isMobile", ref(false));
|
|
167
|
+
const isDesktop = inject("isDesktop", ref(true));
|
|
168
|
+
|
|
178
169
|
// Provide appMenuState для дочерних компонентов
|
|
179
170
|
provide("appMenuState", { closeAll });
|
|
180
171
|
|
|
@@ -204,6 +195,26 @@ const shouldShowOverlay = computed(() => {
|
|
|
204
195
|
const shouldShowInMenu = computed(() => {
|
|
205
196
|
return overlayContent.value && !isOverlayed.value && state.value.isMenuOpen;
|
|
206
197
|
});
|
|
198
|
+
|
|
199
|
+
const appBarClasses = computed(() => {
|
|
200
|
+
return {
|
|
201
|
+
"vc-app-bar--mobile": isMobile.value,
|
|
202
|
+
"vc-app-bar--desktop": isDesktop.value,
|
|
203
|
+
"vc-app-bar--collapsed": !state.value.isSidebarExpanded && isDesktop.value,
|
|
204
|
+
"vc-app-bar--hover-expanded": isDesktop.value && isHoverExpanded.value,
|
|
205
|
+
"vc-app-bar--hover-collapsed": isDesktop.value && !state.value.isSidebarExpanded && !isHoverExpanded.value,
|
|
206
|
+
};
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
const wrapClasses = computed(() => {
|
|
210
|
+
return {
|
|
211
|
+
"vc-app-bar__wrap--mobile-expanded": isMobile.value && state.value.isSidebarExpanded,
|
|
212
|
+
"vc-app-bar__wrap--desktop-collapsed": isDesktop.value && !state.value.isSidebarExpanded,
|
|
213
|
+
"vc-app-bar__wrap--desktop-expanded": isDesktop.value && state.value.isSidebarExpanded,
|
|
214
|
+
"vc-app-bar__wrap--hover-expanded": isDesktop.value && isHoverExpanded.value && !state.value.isSidebarExpanded,
|
|
215
|
+
"vc-app-bar__wrap--hover-collapsed": isDesktop.value && !isHoverExpanded.value && !state.value.isSidebarExpanded,
|
|
216
|
+
};
|
|
217
|
+
});
|
|
207
218
|
</script>
|
|
208
219
|
|
|
209
220
|
<style lang="scss">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<VcLoading
|
|
3
|
-
v-if="!
|
|
3
|
+
v-if="!isAppReady"
|
|
4
4
|
active
|
|
5
5
|
class="vc-app__loader"
|
|
6
6
|
/>
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
</template>
|
|
84
84
|
|
|
85
85
|
<script lang="ts" setup>
|
|
86
|
-
import { h, inject, provide, computed, useAttrs } from "vue";
|
|
86
|
+
import { h, inject, provide, computed, useAttrs, watch, toRef, ref, onBeforeUnmount, onUnmounted } from "vue";
|
|
87
87
|
import VcAppBar from "./_internal/vc-app-bar/vc-app-bar.vue";
|
|
88
88
|
import VcAppMenu from "./_internal/vc-app-menu/vc-app-menu.vue";
|
|
89
89
|
import {
|
|
@@ -142,6 +142,9 @@ console.debug("vc-app: Init vc-app");
|
|
|
142
142
|
|
|
143
143
|
const internalRoutes = inject("bladeRoutes") as BladeRoutesRecord[];
|
|
144
144
|
const dynamicModules = inject(DynamicModulesKey, undefined);
|
|
145
|
+
|
|
146
|
+
const isAppReady = ref(props.isReady);
|
|
147
|
+
|
|
145
148
|
const router = useRouter();
|
|
146
149
|
|
|
147
150
|
const { openBlade, closeBlade, resolveBladeByName, blades, goToRoot } = useBladeNavigation();
|
|
@@ -221,6 +224,7 @@ const openRoot = async () => {
|
|
|
221
224
|
watchOnce(
|
|
222
225
|
() => props.isReady,
|
|
223
226
|
async (newVal) => {
|
|
227
|
+
isAppReady.value = newVal;
|
|
224
228
|
if (isAuthenticated.value && newVal) {
|
|
225
229
|
await loadFromHistory();
|
|
226
230
|
await getApps();
|
|
@@ -228,11 +232,19 @@ watchOnce(
|
|
|
228
232
|
},
|
|
229
233
|
);
|
|
230
234
|
|
|
235
|
+
watch(isAuthenticated, (newVal) => {
|
|
236
|
+
isAppReady.value = newVal;
|
|
237
|
+
});
|
|
238
|
+
|
|
231
239
|
provide("internalRoutes", internalRoutes);
|
|
232
240
|
provide(DynamicModulesKey, dynamicModules);
|
|
233
241
|
provideDashboardService();
|
|
234
242
|
provideMenuService();
|
|
235
243
|
createGlobalSearch();
|
|
244
|
+
|
|
245
|
+
onUnmounted(() => {
|
|
246
|
+
isAppReady.value = false;
|
|
247
|
+
});
|
|
236
248
|
</script>
|
|
237
249
|
|
|
238
250
|
<style lang="scss">
|
|
@@ -111,12 +111,11 @@
|
|
|
111
111
|
|
|
112
112
|
<script lang="ts" setup>
|
|
113
113
|
import { VcIcon } from "./../../../../";
|
|
114
|
-
import {
|
|
114
|
+
import { computed, inject, ref } from "vue";
|
|
115
115
|
import { useFloating, shift } from "@floating-ui/vue";
|
|
116
116
|
import { CrossSignIcon, AppWindowIcon } from "../../../../atoms/vc-icon/icons";
|
|
117
117
|
import { BladeInstance } from "../../../../../../injection-keys";
|
|
118
|
-
import {
|
|
119
|
-
import VertDotsIcon from "../../../../atoms/vc-icon/icons/VertDotsIcon.vue";
|
|
118
|
+
import { FALLBACK_BLADE_ID } from "../../../../../../core/constants";
|
|
120
119
|
|
|
121
120
|
export interface Props {
|
|
122
121
|
closable?: boolean;
|
|
@@ -132,7 +131,7 @@ const emit = defineEmits(["close", "expand", "collapse"]);
|
|
|
132
131
|
const blade = inject(
|
|
133
132
|
BladeInstance,
|
|
134
133
|
computed(() => ({
|
|
135
|
-
id:
|
|
134
|
+
id: FALLBACK_BLADE_ID,
|
|
136
135
|
error: undefined,
|
|
137
136
|
expandable: false,
|
|
138
137
|
maximized: false,
|
|
@@ -219,7 +218,7 @@ function onClose(): void {
|
|
|
219
218
|
}
|
|
220
219
|
|
|
221
220
|
&__status {
|
|
222
|
-
@apply tw-block tw-w-2 tw-h-2 tw-rounded-full tw-z-[1] tw-mr-[
|
|
221
|
+
@apply tw-block tw-w-2 tw-h-2 tw-rounded-full tw-z-[1] tw-mr-[10px];
|
|
223
222
|
}
|
|
224
223
|
|
|
225
224
|
&__status-container {
|
|
@@ -78,7 +78,7 @@ const titleClassName = computed(() => {
|
|
|
78
78
|
@apply tw-w-9 tw-h-9 tw-bg-[var(--blade-toolbar-circle-button-bg-color)] tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-[var(--blade-toolbar-circle-button-text-color)];
|
|
79
79
|
|
|
80
80
|
&--main {
|
|
81
|
-
@apply tw-flex tw-w-auto tw-bg-[var(--blade-toolbar-circle-button-main-bg-color)]
|
|
81
|
+
@apply tw-flex tw-w-auto tw-bg-[var(--blade-toolbar-circle-button-main-bg-color)];
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
&--main-expanded {
|
|
@@ -95,7 +95,7 @@ const titleClassName = computed(() => {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
&--main {
|
|
98
|
-
@apply tw-px-
|
|
98
|
+
@apply tw-px-4;
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
</style>
|
|
@@ -115,7 +115,7 @@ function handleItemClick(item: IBladeToolbar) {
|
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
&__menu {
|
|
118
|
-
@apply tw-fixed tw-bottom-[167px] tw-right-[33px] tw-z-[60] tw-flex tw-flex-col tw-gap-2 tw-items-end;
|
|
118
|
+
@apply tw-fixed tw-bottom-[167px] tw-right-[33px] tw-z-[60] tw-flex tw-flex-col tw-gap-2 tw-items-end tw-px-2;
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
|
-
v-if="isToolbarVisible"
|
|
4
3
|
class="vc-blade-toolbar"
|
|
5
4
|
:class="{
|
|
6
5
|
'vc-blade-toolbar--mobile': $isMobile.value,
|
|
@@ -44,8 +43,6 @@ const visibleItems = computed(() => {
|
|
|
44
43
|
(item) => hasAccess(item.permissions) && (item.isVisible === undefined || item.isVisible) && !item.disabled,
|
|
45
44
|
);
|
|
46
45
|
});
|
|
47
|
-
|
|
48
|
-
const isToolbarVisible = computed(() => visibleItems.value.length > 0);
|
|
49
46
|
</script>
|
|
50
47
|
|
|
51
48
|
<style lang="scss">
|
|
@@ -136,6 +136,7 @@ import vcPopupError from "../../../../shared/components/common/popup/vc-popup-er
|
|
|
136
136
|
import { BladeInstance, BLADE_BACK_BUTTON } from "../../../../injection-keys";
|
|
137
137
|
import { default as VcWidgetContainer } from "./_internal/vc-blade-widget-container/vc-widget-container.vue";
|
|
138
138
|
import VertDotsIcon from "../../atoms/vc-icon/icons/VertDotsIcon.vue";
|
|
139
|
+
import { FALLBACK_BLADE_ID } from "../../../../core/constants";
|
|
139
140
|
|
|
140
141
|
export interface Props {
|
|
141
142
|
icon?: string;
|
|
@@ -205,7 +206,7 @@ const emit = defineEmits<Emits>();
|
|
|
205
206
|
const blade = inject(
|
|
206
207
|
BladeInstance,
|
|
207
208
|
computed(() => ({
|
|
208
|
-
id:
|
|
209
|
+
id: FALLBACK_BLADE_ID,
|
|
209
210
|
error: undefined,
|
|
210
211
|
expandable: false,
|
|
211
212
|
maximized: false,
|
|
@@ -356,7 +357,7 @@ const { open } = usePopup({
|
|
|
356
357
|
}
|
|
357
358
|
|
|
358
359
|
&__breadcrumbs {
|
|
359
|
-
@apply tw-mr-
|
|
360
|
+
@apply tw-mr-[10px];
|
|
360
361
|
|
|
361
362
|
&-button {
|
|
362
363
|
@apply tw-text-[color:var(--blade-header-breadcrumbs-button-color)] tw-cursor-pointer hover:tw-text-[color:var(--blade-header-breadcrumbs-button-color-hover)] #{!important};
|
|
@@ -430,6 +431,10 @@ const { open } = usePopup({
|
|
|
430
431
|
@apply tw-hidden;
|
|
431
432
|
}
|
|
432
433
|
}
|
|
434
|
+
|
|
435
|
+
&__breadcrumbs-button {
|
|
436
|
+
@apply tw-p-0 #{!important};
|
|
437
|
+
}
|
|
433
438
|
}
|
|
434
439
|
|
|
435
440
|
.vc-app_mobile .vc-blade {
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div
|
|
3
|
-
class="vc-login-form__container"
|
|
4
|
-
:style="backgroundImageHandler"
|
|
5
|
-
>
|
|
6
|
-
<div
|
|
7
|
-
class="vc-login-form__logo"
|
|
8
|
-
:style="logoImageHandler"
|
|
9
|
-
></div>
|
|
10
|
-
<div class="vc-login-form__box">
|
|
11
|
-
<div class="vc-login-form__header">
|
|
12
|
-
{{ title }}
|
|
13
|
-
</div>
|
|
14
|
-
<div class="vc-login-form__content">
|
|
15
|
-
<slot></slot>
|
|
16
|
-
</div>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="vc-login-form__version">
|
|
19
|
-
{{ version }}
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
</template>
|
|
23
|
-
|
|
24
|
-
<script lang="ts" setup>
|
|
25
|
-
import { computed } from "vue";
|
|
26
|
-
import { useRouter } from "vue-router";
|
|
27
|
-
|
|
28
|
-
export interface Props {
|
|
29
|
-
logo?: string;
|
|
30
|
-
background?: string;
|
|
31
|
-
title?: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const props = withDefaults(defineProps<Props>(), {
|
|
35
|
-
title: "Login",
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
defineSlots<{
|
|
39
|
-
default: void;
|
|
40
|
-
}>();
|
|
41
|
-
|
|
42
|
-
const router = useRouter();
|
|
43
|
-
|
|
44
|
-
const backgroundImageHandler = computed(() => {
|
|
45
|
-
if (props.background) {
|
|
46
|
-
return `background: url(${CSS.escape(props.background)}) center / cover no-repeat`;
|
|
47
|
-
}
|
|
48
|
-
return undefined;
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
const logoImageHandler = computed(() => {
|
|
52
|
-
if (props.logo) {
|
|
53
|
-
return `background: url(${CSS.escape(props.logo)}) center / contain no-repeat`;
|
|
54
|
-
}
|
|
55
|
-
return undefined;
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const version = router.currentRoute.value.meta?.appVersion;
|
|
59
|
-
|
|
60
|
-
console.debug("Init vc-login-form");
|
|
61
|
-
</script>
|
|
62
|
-
|
|
63
|
-
<style lang="scss">
|
|
64
|
-
:root {
|
|
65
|
-
--login-version-color: var(--neutrals-400);
|
|
66
|
-
--login-header-bg-color: var(--secondary-700);
|
|
67
|
-
--login-box-shadow-color: var(--additional-950);
|
|
68
|
-
--login-box-shadow: rgb(from var(--login-box-shadow-color) r g b / 5%);
|
|
69
|
-
--login-bg-color: var(--additional-50);
|
|
70
|
-
--login-title-color: var(--additional-50);
|
|
71
|
-
--login-title-bg: var(--secondary-700);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
.vc-login-form {
|
|
75
|
-
&__container {
|
|
76
|
-
@apply tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
&__logo {
|
|
80
|
-
@apply tw-h-20 tw-w-[516px] tw-max-w-[90%] tw-mb-12 -tw-mt-24;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
&__box {
|
|
84
|
-
@apply tw-w-[516px] tw-max-w-[90%] tw-bg-[var(--login-bg-color)] tw-rounded-md tw-overflow-hidden [box-shadow:var(--login-box-shadow)];
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
&__header {
|
|
88
|
-
@apply tw-uppercase tw-text-[var(--login-title-color)] tw-bg-[var(--login-title-bg)] tw-h-12 tw-px-7 tw-text-lg tw-flex tw-items-center;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
&__content {
|
|
92
|
-
@apply tw-pt-4 tw-px-7 tw-pb-6;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
&__version {
|
|
96
|
-
@apply tw-absolute tw-bottom-0.5 tw-left-[93px] tw-text-[var(--login-version-color)] tw-text-xs tw-mt-auto tw-self-center tw-p-1;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
</style>
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
class="vc-login-form__container"
|
|
4
|
+
:style="backgroundImageHandler"
|
|
5
|
+
>
|
|
6
|
+
<div
|
|
7
|
+
class="vc-login-form__logo"
|
|
8
|
+
:style="logoImageHandler"
|
|
9
|
+
></div>
|
|
10
|
+
<div class="vc-login-form__box">
|
|
11
|
+
<div class="vc-login-form__header">
|
|
12
|
+
{{ title }}
|
|
13
|
+
</div>
|
|
14
|
+
<div class="vc-login-form__content">
|
|
15
|
+
<slot></slot>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="vc-login-form__version">
|
|
19
|
+
{{ version }}
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</template>
|
|
23
|
+
|
|
24
|
+
<script lang="ts" setup>
|
|
25
|
+
import { computed } from "vue";
|
|
26
|
+
import { useRouter } from "vue-router";
|
|
27
|
+
|
|
28
|
+
export interface Props {
|
|
29
|
+
logo?: string;
|
|
30
|
+
background?: string;
|
|
31
|
+
title?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
35
|
+
title: "Login",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
defineSlots<{
|
|
39
|
+
default: void;
|
|
40
|
+
}>();
|
|
41
|
+
|
|
42
|
+
const router = useRouter();
|
|
43
|
+
|
|
44
|
+
const backgroundImageHandler = computed(() => {
|
|
45
|
+
if (props.background) {
|
|
46
|
+
return `background: url(${CSS.escape(props.background)}) center / cover no-repeat`;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const logoImageHandler = computed(() => {
|
|
52
|
+
if (props.logo) {
|
|
53
|
+
return `background: url(${CSS.escape(props.logo)}) center / contain no-repeat`;
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const version = router.currentRoute.value.meta?.appVersion;
|
|
59
|
+
|
|
60
|
+
console.debug("Init vc-login-form");
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<style lang="scss">
|
|
64
|
+
:root {
|
|
65
|
+
--login-version-color: var(--neutrals-400);
|
|
66
|
+
--login-header-bg-color: var(--secondary-700);
|
|
67
|
+
--login-box-shadow-color: var(--additional-950);
|
|
68
|
+
--login-box-shadow: rgb(from var(--login-box-shadow-color) r g b / 5%);
|
|
69
|
+
--login-bg-color: var(--additional-50);
|
|
70
|
+
--login-title-color: var(--additional-50);
|
|
71
|
+
--login-title-bg: var(--secondary-700);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.vc-login-form {
|
|
75
|
+
&__container {
|
|
76
|
+
@apply tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
&__logo {
|
|
80
|
+
@apply tw-h-20 tw-w-[516px] tw-max-w-[90%] tw-mb-12 -tw-mt-24;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&__box {
|
|
84
|
+
@apply tw-w-[516px] tw-max-w-[90%] tw-bg-[var(--login-bg-color)] tw-rounded-md tw-overflow-hidden [box-shadow:var(--login-box-shadow)];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
&__header {
|
|
88
|
+
@apply tw-uppercase tw-text-[var(--login-title-color)] tw-bg-[var(--login-title-bg)] tw-h-12 tw-px-7 tw-text-lg tw-flex tw-items-center;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
&__content {
|
|
92
|
+
@apply tw-pt-4 tw-px-7 tw-pb-6;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&__version {
|
|
96
|
+
@apply tw-absolute tw-bottom-0.5 tw-left-[93px] tw-text-[var(--login-version-color)] tw-text-xs tw-mt-auto tw-self-center tw-p-1;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
</style>
|