hrp-ui-base 1.0.2 → 1.0.4

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.
Files changed (85) hide show
  1. package/dist/components.cjs +1 -1
  2. package/dist/components.es.js +3595 -1224
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.es.js +86 -69
  5. package/dist/style.css +1 -1
  6. package/package.json +2 -1
  7. package/src/api/notice/NoticeController.ts +73 -0
  8. package/src/api/notice/bo/NoticePageBO.ts +24 -0
  9. package/src/api/notice/bo/NoticeVO.ts +31 -0
  10. package/src/assets/layout/avatar-default.svg +6 -0
  11. package/src/assets/layout/collect-active.svg +7 -0
  12. package/src/assets/layout/collect-default.svg +7 -0
  13. package/src/assets/layout/download-active.svg +8 -0
  14. package/src/assets/layout/download-default.svg +8 -0
  15. package/src/assets/layout/export-dark.svg +7 -0
  16. package/src/assets/layout/export-default.svg +7 -0
  17. package/src/assets/layout/font-active.svg +6 -0
  18. package/src/assets/layout/font-default.svg +6 -0
  19. package/src/assets/layout/help-active.svg +10 -0
  20. package/src/assets/layout/help-default.svg +10 -0
  21. package/src/assets/layout/home-active.svg +6 -0
  22. package/src/assets/layout/home.svg +6 -0
  23. package/src/assets/layout/menu-expand.svg +6 -0
  24. package/src/assets/layout/menu-icon.png +0 -0
  25. package/src/assets/layout/menu-position-active.svg +6 -0
  26. package/src/assets/layout/menu-position-default.svg +6 -0
  27. package/src/assets/layout/message-active.svg +9 -0
  28. package/src/assets/layout/message-default.svg +9 -0
  29. package/src/assets/layout/moon.svg +8 -0
  30. package/src/assets/layout/router-all-dark.svg +11 -0
  31. package/src/assets/layout/router-all-default.svg +17 -0
  32. package/src/assets/layout/search-active.svg +20 -0
  33. package/src/assets/layout/search-default.svg +20 -0
  34. package/src/assets/layout/star-active.svg +1 -0
  35. package/src/assets/layout/star-default.svg +3 -0
  36. package/src/assets/layout/sun-active.svg +6 -0
  37. package/src/assets/layout/sun-default.svg +6 -0
  38. package/src/assets/layout/switch-moon.svg +3 -0
  39. package/src/assets/layout/switch-sun.svg +41 -0
  40. package/src/assets/layout/todo-active.svg +12 -0
  41. package/src/assets/layout/todo-default.svg +12 -0
  42. package/src/assets/layout/user-dark.svg +13 -0
  43. package/src/assets/layout/user-default.svg +13 -0
  44. package/src/components/base-layout/index.vue +198 -0
  45. package/src/components/layout/SysHeader.vue +90 -0
  46. package/src/components/layout/SysHeaderLeft.vue +116 -0
  47. package/src/components/layout/SysHeaderRight.vue +112 -0
  48. package/src/components/layout/SysHeaderTabs.vue +289 -0
  49. package/src/components/layout/components/avatar-component.vue +77 -0
  50. package/src/components/layout/components/dark-component.vue +82 -0
  51. package/src/components/layout/components/download-component.vue +49 -0
  52. package/src/components/layout/components/font-size-component.vue +66 -0
  53. package/src/components/layout/components/menu-position-component.vue +97 -0
  54. package/src/components/layout/components/message-component.vue +64 -0
  55. package/src/components/layout/components/todo-component.vue +55 -0
  56. package/src/components/layout/index.ts +24 -0
  57. package/src/components/layout/message/message-dictionary.ts +27 -0
  58. package/src/components/layout/message/message-icon//345/205/250/351/203/250/351/200/232/347/237/245-/350/223/235.svg +8 -0
  59. package/src/components/layout/message/message-icon//345/205/250/351/203/250/351/200/232/347/237/245-/351/273/221.svg +8 -0
  60. package/src/components/layout/message/message-icon//345/205/250/351/203/250/351/200/232/347/237/245.svg +8 -0
  61. package/src/components/layout/message/message-icon//345/205/254/345/221/212/351/200/232/347/237/245-/350/223/235.svg +12 -0
  62. package/src/components/layout/message/message-icon//345/205/254/345/221/212/351/200/232/347/237/245-/351/273/221.svg +12 -0
  63. package/src/components/layout/message/message-icon//345/205/254/345/221/212/351/200/232/347/237/245.svg +12 -0
  64. package/src/components/layout/message/message-icon//345/256/241/346/211/271/351/200/232/347/237/245-/350/223/235.svg +8 -0
  65. package/src/components/layout/message/message-icon//345/256/241/346/211/271/351/200/232/347/237/245-/351/273/221.svg +8 -0
  66. package/src/components/layout/message/message-icon//345/256/241/346/211/271/351/200/232/347/237/245.svg +8 -0
  67. package/src/components/layout/message/message-icon//345/257/274/345/207/272/351/200/232/347/237/245-/350/223/235.svg +13 -0
  68. package/src/components/layout/message/message-icon//345/257/274/345/207/272/351/200/232/347/237/245-/351/273/221.svg +13 -0
  69. package/src/components/layout/message/message-icon//345/257/274/345/207/272/351/200/232/347/237/245.svg +13 -0
  70. package/src/components/layout/message/message-icon//346/234/252/350/257/273/351/200/232/347/237/245-/350/223/235.svg +11 -0
  71. package/src/components/layout/message/message-icon//346/234/252/350/257/273/351/200/232/347/237/245-/351/273/221.svg +11 -0
  72. package/src/components/layout/message/message-icon//346/234/252/350/257/273/351/200/232/347/237/245.svg +11 -0
  73. package/src/components/layout/message/message-icon//347/251/272/347/212/266/346/200/201.svg +17 -0
  74. package/src/components/layout/message/message-icon//347/263/273/347/273/237/351/200/232/347/237/245-/350/223/235.svg +13 -0
  75. package/src/components/layout/message/message-icon//347/263/273/347/273/237/351/200/232/347/237/245-/351/273/221.svg +13 -0
  76. package/src/components/layout/message/message-icon//347/263/273/347/273/237/351/200/232/347/237/245.svg +13 -0
  77. package/src/components/layout/message/message-notification-drawer.vue +529 -0
  78. package/src/components/layout/personalization-guide-dialog.vue +255 -0
  79. package/src/components/layout/sideMenu-global.scss +115 -0
  80. package/src/components/layout/sideMenu.scss +312 -0
  81. package/src/components/layout/sideMenu.vue +542 -0
  82. package/src/components/layout/sideMenuSonList.vue +185 -0
  83. package/src/components/layout/styles/icon.scss +72 -0
  84. package/src/components/layout/types.ts +98 -0
  85. package/src/components.ts +19 -4
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="29" height="29" viewBox="0 0 29 29">
2
+ <defs>
3
+ <style>
4
+ .cls-1 {
5
+ fill: #909399;
6
+ }
7
+ </style>
8
+ </defs>
9
+ <g id="组_60" data-name="组 60" transform="translate(-1878 -19)">
10
+ <rect id="头像_男孩" data-name="头像 男孩" class="cls-1" width="29" height="29" rx="5" transform="translate(1878 19)"/>
11
+ <image id="个人中心" width="17" height="17" transform="translate(1884 25)" xlink:href="data:image/png;base64,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"/>
12
+ </g>
13
+ </svg>
@@ -0,0 +1,198 @@
1
+ <template>
2
+ <div class="big-box-outer">
3
+ <el-container id="common-layout">
4
+ <!-- 顶部导航栏插槽 -->
5
+ <slot name="header"></slot>
6
+ <!-- 额外内容插槽(如个性化引导弹窗等) -->
7
+ <slot name="extra"></slot>
8
+
9
+ <!-- 左侧菜单布局 -->
10
+ <div v-if="isLeftMenu" class="layout-content is-left-menu">
11
+ <slot name="side-menu"></slot>
12
+ <div class="layout-main-column">
13
+ <slot name="tabs"></slot>
14
+ <transition name="width-change">
15
+ <el-main
16
+ class="common-layout-main"
17
+ style="padding: 6px 10px; background: var(--custom-main-bg-fill)"
18
+ >
19
+ <el-main
20
+ class="common-workbench-main hide-scroll-bar"
21
+ style="border-radius: 12px"
22
+ >
23
+ <slot></slot>
24
+ </el-main>
25
+ </el-main>
26
+ </transition>
27
+ </div>
28
+ </div>
29
+
30
+ <!-- 顶部菜单布局 -->
31
+ <template v-else>
32
+ <slot name="tabs"></slot>
33
+ <div class="layout-content">
34
+ <transition name="width-change">
35
+ <el-main
36
+ class="common-layout-main"
37
+ style="padding: 6px 10px; background: var(--custom-main-bg-fill)"
38
+ >
39
+ <el-main
40
+ class="common-workbench-main hide-scroll-bar"
41
+ style="border-radius: 12px"
42
+ >
43
+ <slot></slot>
44
+ </el-main>
45
+ </el-main>
46
+ </transition>
47
+ </div>
48
+ </template>
49
+ </el-container>
50
+ </div>
51
+ </template>
52
+
53
+ <script lang="ts" setup>
54
+ defineOptions({
55
+ name: "BaseLayout",
56
+ });
57
+
58
+ defineProps({
59
+ /**
60
+ * 是否使用左侧菜单布局
61
+ */
62
+ isLeftMenu: {
63
+ type: Boolean,
64
+ default: false,
65
+ },
66
+ });
67
+ </script>
68
+
69
+ <style lang="scss" scoped>
70
+ .big-box-outer {
71
+ width: 100%;
72
+ min-width: 850px;
73
+ overflow: auto;
74
+ }
75
+
76
+ /** 隐藏滚动条 */
77
+ #common-layout,
78
+ .common-layout-main {
79
+ overflow: hidden;
80
+ scrollbar-width: none;
81
+ -ms-overflow-style: none;
82
+ background: var(--custom-theme-fill-7);
83
+ }
84
+
85
+ #common-layout::-webkit-scrollbar,
86
+ .common-layout-main::-webkit-scrollbar {
87
+ display: none;
88
+ }
89
+
90
+ #common-layout {
91
+ height: 100%;
92
+ width: 100%;
93
+ min-width: 600px;
94
+ display: flex;
95
+ flex-direction: column;
96
+ flex-wrap: nowrap;
97
+ flex-grow: 1;
98
+ flex-shrink: 1;
99
+
100
+ .common-layout {
101
+ .common-layout-header {
102
+ width: 100%;
103
+ }
104
+
105
+ .common-layout-main {
106
+ width: 100%;
107
+ box-sizing: border-box;
108
+ height: calc(100% - 78px) !important;
109
+ display: flex;
110
+ flex-direction: row;
111
+ justify-content: flex-start;
112
+ align-items: flex-start;
113
+ flex-wrap: nowrap;
114
+ flex-grow: 0;
115
+ flex-shrink: 0;
116
+ }
117
+ }
118
+ }
119
+
120
+ .layout-content {
121
+ flex: 1;
122
+ min-height: 0;
123
+ display: flex;
124
+ flex-direction: row;
125
+ overflow: hidden;
126
+ background: var(--custom-theme-fill-7);
127
+
128
+ .common-layout-main {
129
+ flex: 1;
130
+ min-width: 0;
131
+ }
132
+ }
133
+
134
+ .layout-main-column {
135
+ flex: 1;
136
+ min-width: 0;
137
+ min-height: 0;
138
+ display: flex;
139
+ flex-direction: column;
140
+ }
141
+
142
+ .layout-content.is-left-menu {
143
+ .common-workbench-main {
144
+ border-left: none;
145
+ }
146
+
147
+ .common-layout-main {
148
+ flex: 1;
149
+ min-height: 0;
150
+ }
151
+ }
152
+
153
+ .common-workbench-main {
154
+ height: calc(100%);
155
+ box-sizing: border-box;
156
+ padding: 0;
157
+ background: var(--custom-theme-fill-4);
158
+ border-left: 1px solid var(--el-border-color);
159
+ }
160
+
161
+ .common-workbench-main-rv {
162
+ height: calc(100% - 24px);
163
+ width: 100%;
164
+ }
165
+
166
+ /* 移动端 */
167
+ @media only screen and (max-device-width: 640px) {
168
+ .common-layout-header {
169
+ display: none;
170
+ }
171
+
172
+ #common-layout {
173
+ height: 100%;
174
+ width: 100%;
175
+ min-width: 100%;
176
+ }
177
+
178
+ .common-layout-main {
179
+ height: 100% !important;
180
+ display: flex !important;
181
+ flex-direction: column !important;
182
+ overflow: hidden;
183
+ }
184
+
185
+ .common-workbench-main {
186
+ height: 100%;
187
+ width: 100%;
188
+ }
189
+
190
+ .el-main {
191
+ padding: 0 !important;
192
+ }
193
+ }
194
+
195
+ /* pad端 */
196
+ @media screen and (min-device-width: 640px) and (max-device-width: 1000px) {
197
+ }
198
+ </style>
@@ -0,0 +1,90 @@
1
+ <template>
2
+ <div class="system-header flex-row-between">
3
+ <SysHeaderLeft
4
+ :menuList="menuList"
5
+ :currentApplication="currentApplication"
6
+ :menuPosition="userConfig.menuPosition"
7
+ :currentPath="currentPath"
8
+ :navigationBar="userConfig.navigationBar"
9
+ :showSubmenuDrawer="showSubmenuDrawer"
10
+ @menu-item-click="(item) => emit('menu-item-click', item)"
11
+ @parent-click="(item, index) => emit('parent-click', item, index)"
12
+ @logo-click="emit('logo-click')"
13
+ @collapse-change="(val) => emit('collapse-change', val)"
14
+ />
15
+ <SysHeaderRight
16
+ :userConfig="userConfig"
17
+ :noticeCount="noticeCount"
18
+ :approvalCount="approvalCount"
19
+ :avatar="userConfig.avatar"
20
+ :downloadActive="downloadActive"
21
+ :todoActive="todoActive"
22
+ @change-dark="(val, ref) => emit('change-dark', val, ref)"
23
+ @change-follow-system="(val) => emit('change-follow-system', val)"
24
+ @change-font-size="(val) => emit('change-font-size', val)"
25
+ @change-menu-position="(val) => emit('change-menu-position', val)"
26
+ @download-click="emit('download-click')"
27
+ @todo-click="emit('todo-click')"
28
+ @message-click="(val) => emit('message-click', val)"
29
+ @message-navigate="(notice) => emit('message-navigate', notice)"
30
+ @message-download="(notice) => emit('message-download', notice)"
31
+ @message-update-count="emit('message-update-count')"
32
+ @personal-sign="emit('personal-sign')"
33
+ @clean-cache="emit('clean-cache')"
34
+ @logout="emit('logout')"
35
+ />
36
+ </div>
37
+ </template>
38
+ <script lang="ts" setup>
39
+ import { PropType } from "vue";
40
+ import SysHeaderRight from "./SysHeaderRight.vue";
41
+ import SysHeaderLeft from "./SysHeaderLeft.vue";
42
+ import type HomeMenu from "../../api/bms/home/bo/HomeMenu";
43
+ import type NoticeVO from "../../api/notice/bo/NoticeVO";
44
+ import type { UserConfig, DomainInfo } from "./types";
45
+
46
+ defineProps({
47
+ userConfig: { type: Object as PropType<UserConfig>, required: true },
48
+ menuList: { type: Array as PropType<HomeMenu[]>, default: () => [] },
49
+ currentApplication: { type: Object as PropType<DomainInfo>, default: () => ({ domainName: '-' }) },
50
+ currentPath: { type: String, default: '' },
51
+ showSubmenuDrawer: { type: Boolean, default: true },
52
+ noticeCount: { type: Number, default: 0 },
53
+ approvalCount: { type: Number, default: 0 },
54
+ downloadActive: { type: Boolean, default: false },
55
+ todoActive: { type: Boolean, default: false },
56
+ });
57
+
58
+ const emit = defineEmits<{
59
+ (e: 'menu-item-click', item: HomeMenu): void
60
+ (e: 'parent-click', item: HomeMenu, index: number): void
61
+ (e: 'logo-click'): void
62
+ (e: 'collapse-change', collapsed: boolean): void
63
+ (e: 'change-dark', value: string, ref?: HTMLElement): void
64
+ (e: 'change-follow-system', value: boolean): void
65
+ (e: 'change-font-size', value: string): void
66
+ (e: 'change-menu-position', value: string): void
67
+ (e: 'download-click'): void
68
+ (e: 'todo-click'): void
69
+ (e: 'message-click', isOpen: boolean): void
70
+ (e: 'message-navigate', notice: NoticeVO): void
71
+ (e: 'message-download', notice: NoticeVO): void
72
+ (e: 'message-update-count'): void
73
+ (e: 'personal-sign'): void
74
+ (e: 'clean-cache'): void
75
+ (e: 'logout'): void
76
+ }>();
77
+ </script>
78
+ <style scoped lang="scss">
79
+ .system-header {
80
+ width: 100%;
81
+ height: 50px;
82
+ background: var(--custom-theme-bg-0);
83
+ border-radius: 0;
84
+ border-bottom: 1px solid var(--el-border-color);
85
+ user-select: none;
86
+ display: flex;
87
+ justify-content: space-between;
88
+ align-items: center;
89
+ }
90
+ </style>
@@ -0,0 +1,116 @@
1
+ <template>
2
+ <div class="sys-header-left" ref="headerLeftRef">
3
+ <img
4
+ ref="logoRef"
5
+ src="../../assets/layout/avatar-default.svg"
6
+ style="width: 30px;height: 30px;cursor: pointer;"
7
+ @click="emit('logo-click')"
8
+ />
9
+ <span class="sys-left-area-title" ref="titleRef">
10
+ {{ currentApplication.domainName || "-" }}
11
+ </span>
12
+ <div
13
+ class="second-menu-list"
14
+ ref="secondMenuRef"
15
+ :style="{ width: secondMenuWidth + 'px' }"
16
+ v-if="Array.isArray(menuList) && menuList.length > 0"
17
+ >
18
+ <SideMenu
19
+ :menuList="menuList"
20
+ :menuPosition="menuPosition"
21
+ :show-submenu-drawer="showSubmenuDrawer"
22
+ :currentPath="currentPath"
23
+ :navigationBar="navigationBar"
24
+ @parent-click="(item, index) => emit('parent-click', item, index)"
25
+ @menu-item-click="(item) => emit('menu-item-click', item)"
26
+ @collapse-change="(val) => emit('collapse-change', val)"
27
+ />
28
+ </div>
29
+ </div>
30
+ </template>
31
+
32
+ <script lang="ts" setup>
33
+ import { computed, onMounted, onUnmounted, ref, nextTick, watch, PropType } from "vue";
34
+ import SideMenu from "./sideMenu.vue";
35
+ import type HomeMenu from "../../api/bms/home/bo/HomeMenu";
36
+ import type { DomainInfo } from "./types";
37
+
38
+ const props = defineProps({
39
+ menuList: { type: Array as PropType<HomeMenu[]>, default: () => [] },
40
+ currentApplication: { type: Object as PropType<DomainInfo>, default: () => ({ domainName: '-' }) },
41
+ menuPosition: { type: String as PropType<"top" | "left">, default: "top" },
42
+ currentPath: { type: String, default: '' },
43
+ showSubmenuDrawer: { type: Boolean, default: true },
44
+ navigationBar: { type: Boolean, default: false },
45
+ });
46
+
47
+ const emit = defineEmits<{
48
+ (e: 'parent-click', item: HomeMenu, index: number): void
49
+ (e: 'menu-item-click', item: HomeMenu): void
50
+ (e: 'logo-click'): void
51
+ (e: 'collapse-change', collapsed: boolean): void
52
+ }>();
53
+
54
+ const headerLeftRef = ref<HTMLElement | null>(null);
55
+ const logoRef = ref<HTMLImageElement | null>(null);
56
+ const titleRef = ref<HTMLElement | null>(null);
57
+ const secondMenuRef = ref<HTMLElement | null>(null);
58
+ const secondMenuWidth = ref<number>(0);
59
+
60
+ const calculateSecondMenuWidth = () => {
61
+ if (!headerLeftRef.value || !logoRef.value || !titleRef.value) return;
62
+ const headerLeftWidth = headerLeftRef.value.offsetWidth;
63
+ const logoWidth = logoRef.value.offsetWidth;
64
+ const titleWidth = titleRef.value.offsetWidth;
65
+ const marginOffset = 16;
66
+ secondMenuWidth.value = Math.max(headerLeftWidth - logoWidth - titleWidth - marginOffset, 0);
67
+ };
68
+
69
+ const handleResize = () => { calculateSecondMenuWidth(); };
70
+
71
+ onMounted(async () => {
72
+ await nextTick();
73
+ calculateSecondMenuWidth();
74
+ window.addEventListener('resize', handleResize);
75
+ });
76
+
77
+ watch(() => props.menuPosition, async () => {
78
+ await nextTick();
79
+ calculateSecondMenuWidth();
80
+ });
81
+
82
+ onUnmounted(() => {
83
+ window.removeEventListener('resize', handleResize);
84
+ });
85
+ </script>
86
+ <style scoped lang="scss">
87
+ .sys-header-left {
88
+ display: flex;
89
+ align-items: center;
90
+ user-select: none;
91
+ flex-direction: row;
92
+ margin-left: 19px;
93
+ height: 100%;
94
+ flex: 1;
95
+ min-width: 0;
96
+ }
97
+
98
+ .second-menu-list {
99
+ margin-left: 10px;
100
+ padding: 4px;
101
+ overflow-x: auto;
102
+ overflow-y: hidden;
103
+ }
104
+
105
+ .sys-left-area-title {
106
+ color: var(--custom-theme-text-1);
107
+ font-size: 18px;
108
+ font-weight: 500;
109
+ margin-left: 6px;
110
+ width: auto;
111
+ color: var(--header-system-big-title);
112
+ white-space: nowrap;
113
+ flex-shrink: 0;
114
+ cursor: pointer;
115
+ }
116
+ </style>
@@ -0,0 +1,112 @@
1
+ <template>
2
+ <div class="sys-header-right">
3
+ <!-- 下载中心 -->
4
+ <DownloadComponent :active="downloadActive" @click="emit('download-click')" />
5
+ <!-- 审批中心 -->
6
+ <TodoComponent :approvalCount="approvalCount" :active="todoActive" @click="emit('todo-click')" />
7
+ <!-- 消息 -->
8
+ <MessageComponent
9
+ :noticeCount="noticeCount"
10
+ ref="messageComponentRef"
11
+ @click="handleMessageClick"
12
+ />
13
+ <!-- 昼夜模式 -->
14
+ <DarkComponent
15
+ :dayOrNight="userConfig.dayOrNight"
16
+ :followSystem="userConfig.followSystem"
17
+ @change-dark="(val, ref) => emit('change-dark', val, ref)"
18
+ @change-follow-system="(val) => emit('change-follow-system', val)"
19
+ />
20
+ <!-- 菜单栏位置 -->
21
+ <MenuPositionComponent
22
+ :menuPosition="userConfig.menuPosition"
23
+ @change="(val) => emit('change-menu-position', val)"
24
+ />
25
+ <!-- 修改字体 -->
26
+ <FontSizeComponent
27
+ :fontSize="userConfig.fontSize"
28
+ @change="(val) => emit('change-font-size', val)"
29
+ />
30
+ <!-- 个人信息 -->
31
+ <AvatarComponent
32
+ :avatar="avatar"
33
+ @personal-sign="emit('personal-sign')"
34
+ @clean-cache="emit('clean-cache')"
35
+ @logout="emit('logout')"
36
+ />
37
+ <!-- 消息通知抽屉 -->
38
+ <MessageNotificationDrawer
39
+ ref="messageDrawerRef"
40
+ @close="handleMessageClose"
41
+ @update-count="emit('message-update-count')"
42
+ @navigate="(notice) => emit('message-navigate', notice)"
43
+ @download="(notice) => emit('message-download', notice)"
44
+ />
45
+ </div>
46
+ </template>
47
+
48
+ <script lang="ts" setup>
49
+ import { ref, PropType } from "vue";
50
+ import TodoComponent from './components/todo-component.vue'
51
+ import MessageComponent from './components/message-component.vue'
52
+ import DownloadComponent from './components/download-component.vue'
53
+ import DarkComponent from './components/dark-component.vue'
54
+ import FontSizeComponent from './components/font-size-component.vue'
55
+ import MenuPositionComponent from './components/menu-position-component.vue'
56
+ import AvatarComponent from './components/avatar-component.vue'
57
+ import MessageNotificationDrawer from './message/message-notification-drawer.vue'
58
+ import type { UserConfig } from "./types";
59
+ import type NoticeVO from "../../api/notice/bo/NoticeVO";
60
+
61
+ defineProps({
62
+ userConfig: { type: Object as PropType<UserConfig>, required: true },
63
+ noticeCount: { type: Number, default: 0 },
64
+ approvalCount: { type: Number, default: 0 },
65
+ avatar: { type: String, default: '' },
66
+ downloadActive: { type: Boolean, default: false },
67
+ todoActive: { type: Boolean, default: false },
68
+ });
69
+
70
+ const emit = defineEmits<{
71
+ (e: 'change-dark', value: string, ref?: HTMLElement): void
72
+ (e: 'change-follow-system', value: boolean): void
73
+ (e: 'change-font-size', value: string): void
74
+ (e: 'change-menu-position', value: string): void
75
+ (e: 'download-click'): void
76
+ (e: 'todo-click'): void
77
+ (e: 'message-click', isOpen: boolean): void
78
+ (e: 'message-navigate', notice: NoticeVO): void
79
+ (e: 'message-download', notice: NoticeVO): void
80
+ (e: 'message-update-count'): void
81
+ (e: 'personal-sign'): void
82
+ (e: 'clean-cache'): void
83
+ (e: 'logout'): void
84
+ }>();
85
+
86
+ const messageComponentRef = ref()
87
+ const messageDrawerRef = ref()
88
+
89
+ const handleMessageClick = (isOpen: boolean) => {
90
+ emit('message-click', isOpen)
91
+ if (isOpen) {
92
+ messageDrawerRef.value?.open()
93
+ } else {
94
+ messageDrawerRef.value?.close()
95
+ }
96
+ }
97
+
98
+ const handleMessageClose = () => {
99
+ messageComponentRef.value?.close()
100
+ }
101
+ </script>
102
+ <style scoped lang="scss">
103
+ .sys-header-right {
104
+ width: auto;
105
+ flex-shrink: 0;
106
+ display: flex;
107
+ align-items: center;
108
+ user-select: none;
109
+ flex-direction: row;
110
+ margin-right: 9px;
111
+ }
112
+ </style>