@opendesign-plus/components 0.0.1-rc.17 → 0.0.1-rc.19

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 (50) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -1
  2. package/dist/chunk-OElCookieNotice.es.js +18 -18
  3. package/dist/components/OHeaderUser.vue.d.ts +2 -0
  4. package/dist/components/header/OHeader.vue.d.ts +8 -2
  5. package/dist/components/header/OHeaderMobile.vue.d.ts +171 -0
  6. package/dist/components/header/components/HeaderContent.vue.d.ts +8 -1
  7. package/dist/components/header/components/HeaderNav.vue.d.ts +13 -1
  8. package/dist/components/header/components/HeaderNavMobile.vue.d.ts +33 -0
  9. package/dist/components/header/index.d.ts +128 -5
  10. package/dist/components/header/types.d.ts +80 -0
  11. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +1 -0
  12. package/dist/components/meeting/types.d.ts +1 -0
  13. package/dist/components.cjs.js +36 -36
  14. package/dist/components.css +1 -1
  15. package/dist/components.es.js +8683 -8955
  16. package/package.json +1 -1
  17. package/src/components/OHeaderUser.vue +4 -4
  18. package/src/components/OSourceCode.vue +1 -1
  19. package/src/components/activity/OActivityApproval.vue +3 -10
  20. package/src/components/activity/OActivityForm.vue +1 -8
  21. package/src/components/activity/OMyActivityCalendar.vue +0 -15
  22. package/src/components/activity/composables/useActivityConfig.ts +140 -140
  23. package/src/components/events/OEventsApply.vue +1 -2
  24. package/src/components/events/OEventsCalendar.vue +10 -0
  25. package/src/components/header/OHeader.vue +6 -24
  26. package/src/components/header/OHeaderMobile.vue +177 -0
  27. package/src/components/header/components/HeaderContent.vue +190 -11
  28. package/src/components/header/components/HeaderNav.vue +3 -5
  29. package/src/components/header/components/HeaderNavMobile.vue +377 -0
  30. package/src/components/header/index.ts +5 -5
  31. package/src/components/header/types.ts +91 -0
  32. package/src/components/meeting/OMeetingCalendar.vue +35 -37
  33. package/src/components/meeting/OMyMeetingCalendar.vue +5 -1
  34. package/src/components/meeting/OSigMeetingCalendar.vue +2 -1
  35. package/src/components/meeting/components/OMeetingCalendarList.vue +21 -29
  36. package/src/components/meeting/components/OMeetingDetail.vue +2 -2
  37. package/src/components/meeting/components/OSigMeetingAside.vue +1 -0
  38. package/src/components/meeting/composables/useMeetingConfig.ts +0 -3
  39. package/src/components/meeting/config.ts +58 -58
  40. package/src/components/meeting/index.ts +1 -1
  41. package/src/components/meeting/types.ts +1 -0
  42. package/src/components/meeting/utils.ts +69 -69
  43. package/src/i18n/en.ts +2 -2
  44. package/src/i18n/zh.ts +2 -2
  45. package/dist/components/header/OHeaderMoblie.vue.d.ts +0 -33
  46. package/dist/components/header/components/HeaderNavMoblie.vue.d.ts +0 -17
  47. package/dist/components/header/components/HeaderUbmcNav.vue.d.ts +0 -2
  48. package/src/components/header/OHeaderMoblie.vue +0 -152
  49. package/src/components/header/components/HeaderNavMoblie.vue +0 -346
  50. package/src/components/header/components/HeaderUbmcNav.vue +0 -540
@@ -1,540 +0,0 @@
1
- <script setup lang="ts">
2
- import { ref, onMounted, watch, computed, nextTick, onUnmounted } from 'vue';
3
-
4
- import { OIcon, OIconChevronRight, OTag } from '@opensig/opendesign';
5
-
6
- import { ElCascaderPanel } from 'element-plus';
7
-
8
- import { useLocale, useScreen } from '@opendesign-plus/composables';
9
-
10
- const props = defineProps({
11
- navData: undefined,
12
- hasPerm: undefined,
13
- tagMap: undefined,
14
- currentPath: undefined,
15
- });
16
-
17
- const { locale } = useLocale();
18
- const { lePadV } = useScreen();
19
- const route = {};
20
-
21
- const MORE_ID = 'more';
22
- // -------------------- hover事件 --------------------
23
- const cascaderRef = ref({});
24
- const activeIndex = ref(-1);
25
- const onMouseEnter = (idx: number) => {
26
- activeIndex.value = idx;
27
- };
28
- const onMouseLeave = (idx) => {
29
- activeIndex.value = -1;
30
- cascaderRef.value[idx]?.clearCheckedNodes();
31
- };
32
- // -------------------- 选中事件 --------------------
33
- const selectedIndex = ref(-1);
34
-
35
- const getSelectedIndex = () => {
36
- const path = route?.fullPath?.split('/').slice(0, 3).join('/');
37
- selectedIndex.value = [...navs.value, moreItem.value].findIndex((nav) => {
38
- const sharpIdx = path?.indexOf('#');
39
- if (visibleIds.value.length && !visibleIds.value.includes(nav.id) && nav.id !== MORE_ID) {
40
- return false;
41
- }
42
- return (
43
- handelHref(nav.href) === path ||
44
- nav.children?.some((item) => {
45
- if (item.children?.length) {
46
- return item.children.some((v) => {
47
- return handelHref(v.href) === path;
48
- });
49
- }
50
- return handelHref(item.href) === path;
51
- }) ||
52
- nav.keys?.includes(path?.slice(1, sharpIdx !== -1 ? sharpIdx : path?.length))
53
- );
54
- });
55
- };
56
-
57
- onMounted(() => {
58
- getSelectedIndex();
59
- });
60
-
61
- watch(
62
- () => route.path,
63
- () => {
64
- getSelectedIndex();
65
- }
66
- );
67
-
68
- const checkVisible = (date: string, lang: 'zh' | 'en'): boolean => {
69
- let flag = true;
70
- if (date) {
71
- flag = flag && new Date(date).getTime() >= Date.now();
72
- }
73
- if (lang) {
74
- flag = flag && locale.value === lang;
75
- }
76
- return flag;
77
- };
78
-
79
- const filterPerm = (navItem: any, permMap: any) => {
80
- if (navItem.checkPermKey) {
81
- return permMap[navItem.checkPermKey];
82
- }
83
- return true;
84
- };
85
-
86
- const moreItem = computed(() => {
87
- return {
88
- id: MORE_ID,
89
- label: '更多',
90
- children: navs.value.filter((v) => !visibleIds.value.includes(v.id)) || [],
91
- };
92
- });
93
- const navs = computed(() => {
94
- const path = [] as string[];
95
- let currentNavs = [] as any[];
96
- const permMap = {
97
- meeting: props.hasPerm,
98
- };
99
- try {
100
- currentNavs = props.navData
101
- .filter((navItem) => filterPerm(navItem, permMap))
102
- .map(function fn(navItem: any) {
103
- path.push(navItem.label);
104
- const res = {
105
- ...navItem,
106
- _path: [...path],
107
- };
108
- if (navItem.children) {
109
- res.children = navItem.children.filter((navItem) => filterPerm(navItem, permMap)).map(fn);
110
- }
111
- path.pop();
112
- return res;
113
- });
114
- } catch {
115
- currentNavs = props.navData;
116
- }
117
- return currentNavs;
118
- });
119
-
120
- // ----------------埋点----------------
121
- // 导航埋点
122
- let lastHoverTime = 0;
123
- let steps = 0; // 触发初始导航到最终完成跳转所用步数
124
-
125
- const onRedirect = (navItem: any) => {
126
- const timeUsed = Date.now() - lastHoverTime;
127
- const _steps = steps + 1;
128
- lastHoverTime = 0;
129
- steps = 0;
130
- if (navItem._path) {
131
- const levels = {} as Record<string, string>;
132
- navItem._path.forEach((name: string, idx: number) => {
133
- levels[`level${idx + 1}`] = name;
134
- });
135
- return {
136
- properties: {
137
- module: 'navigation',
138
- timeUsed,
139
- steps: _steps,
140
- ...levels,
141
- },
142
- };
143
- }
144
- };
145
-
146
- const onNavHover = (navItem: any) => {
147
- steps++;
148
- if (lastHoverTime) {
149
- return;
150
- }
151
- lastHoverTime = Date.now();
152
- return {
153
- event: 'hover',
154
- properties: {
155
- module: 'navigation',
156
- target: navItem.label,
157
- },
158
- };
159
- };
160
-
161
- const onCancelNav = () => {
162
- lastHoverTime = 0;
163
- steps = 0;
164
- };
165
-
166
- const isHttpUrl = (url: string) => {
167
- return url ? url.startsWith('http') : false;
168
- };
169
-
170
- const wrapperRef = ref(null);
171
- const listRef = ref(null);
172
- const visibleIds = ref([]);
173
- const resizeTimer = ref(null);
174
- const leftWidth = ref(0);
175
-
176
- const calculateLayout = () => {
177
- if (!wrapperRef.value) {
178
- return;
179
- }
180
- visibleIds.value = [];
181
- leftWidth.value = wrapperRef.value.clientWidth;
182
- if (lePadV.value) {
183
- visibleIds.value = navs.value.map((v) => v.id);
184
- }
185
- // 计算可用宽度
186
- if (wrapperRef.value.clientWidth >= listRef.value.clientWidth) {
187
- // 重置
188
- visibleIds.value = navs.value.map((v) => v.id);
189
- return;
190
- }
191
- leftWidth.value = 0;
192
- const moreEle = listRef.value.querySelector(`li.nav-item#${MORE_ID}`);
193
- let availableWidth = wrapperRef.value.clientWidth - moreEle.clientWidth;
194
- const allItems = listRef.value.querySelectorAll('li.nav-item');
195
- let done = false;
196
- [...allItems].forEach((item, idx) => {
197
- if (item.id !== MORE_ID && availableWidth > item.clientWidth && !done) {
198
- availableWidth -= item.clientWidth;
199
- visibleIds.value.push(navs.value[idx].id);
200
- leftWidth.value += item.clientWidth;
201
- } else {
202
- done = true;
203
- }
204
- });
205
- };
206
-
207
- onMounted(() => {
208
- window.addEventListener('resize', calculateLayout);
209
- // 确保 DOM 完全渲染后再计算
210
- nextTick(() => {
211
- calculateLayout();
212
- resizeTimer.value = setTimeout(() => {
213
- calculateLayout();
214
- }, 1000);
215
- });
216
- });
217
-
218
- // 清理
219
- onUnmounted(() => {
220
- window.removeEventListener('resize', calculateLayout);
221
- clearTimeout(resizeTimer.value);
222
- });
223
- // 监听 items 变化
224
- watch(
225
- () => navs.value,
226
- () => {
227
- nextTick(() => {
228
- calculateLayout();
229
- });
230
- },
231
- { deep: true }
232
- );
233
-
234
- const handelHref = (href: string) => {
235
- if (href === '/') {
236
- href = '';
237
- }
238
- if (isHttpUrl(href)) {
239
- return href;
240
- }
241
- return `/${locale.value}${href}`;
242
- };
243
- </script>
244
-
245
- <template>
246
- <nav class="header-nav-ubmc" ref="wrapperRef">
247
- <ul
248
- class="nav-list"
249
- ref="listRef"
250
- :style="{
251
- '--more-left': leftWidth,
252
- }"
253
- @mouseleave="onCancelNav"
254
- >
255
- <li
256
- v-for="(item, idx) in [...navs, moreItem]"
257
- :key="item.id"
258
- :id="item.id"
259
- class="nav-item"
260
- :class="{
261
- 'is-selected': selectedIndex === idx,
262
- 'is-active': activeIndex === idx,
263
- hidden: (!visibleIds.includes(item.id) && item.id !== MORE_ID) || (item.id === MORE_ID && item.children.length === 0),
264
- }"
265
- @mouseenter="onMouseEnter(idx)"
266
- @mouseleave="onMouseLeave(idx)"
267
- v-analytics:mouseenter="() => onNavHover(item)"
268
- >
269
- <a class="info-wrap clickable" v-if="!item.children?.length && item.href" :href="handelHref(item.href)">
270
- <span>
271
- <span>{{ item.label }}</span>
272
- </span>
273
- </a>
274
- <div class="info-wrap" v-else>
275
- <span>
276
- <span>{{ item.label }}</span>
277
- </span>
278
- <div class="dropdown-wrapper">
279
- <el-cascader-panel :options="item.children" value="id" expandTrigger="hover" :ref="(ref) => (cascaderRef[idx] = ref)">
280
- <template #default="{ data: childTab }">
281
- <template v-if="childTab.disabled">
282
- <div class="tab-disabled">
283
- <span>{{ childTab.label }}</span>
284
- <span class="disabled-tag">{{ locale === 'zh' ? '待上线' : 'Coming soon' }}</span>
285
- </div>
286
- </template>
287
- <template v-else-if="childTab?.children">
288
- <div class="tab-expand">
289
- <span>{{ childTab.label }}</span>
290
- <OIcon>
291
- <OIconChevronRight />
292
- </OIcon>
293
- </div>
294
- </template>
295
- <template v-else>
296
- <a
297
- :href="handelHref(childTab.href)"
298
- class="dropdown-link"
299
- :target="isHttpUrl(childTab.href) ? '_blank' : '_self'"
300
- :rel="isHttpUrl(childTab.href) ? 'noopener noreferrer' : ''"
301
- v-analytics="() => onRedirect(childTab)"
302
- >
303
- <span>{{ childTab.label }}</span>
304
- <OTag
305
- v-if="(tagMap[childTab?.href?.slice(1)] || childTab.tag) && checkVisible(childTab.tagExpire, childTab.tagLang)"
306
- color="danger"
307
- size="small"
308
- round="pill"
309
- >
310
- {{ tagMap[childTab?.href?.slice(1)] || childTab.tag }}
311
- </OTag>
312
- <OIcon v-if="childTab.icon" class="jump-out-icon">
313
- <component :is="childTab.icon" class="icon" />
314
- </OIcon>
315
- </a>
316
- </template>
317
- </template>
318
- </el-cascader-panel>
319
- </div>
320
- </div>
321
- </li>
322
- </ul>
323
- </nav>
324
- </template>
325
-
326
- <style lang="scss" scoped>
327
- .header-nav-ubmc {
328
- height: 100%;
329
- min-width: 0;
330
- flex: 1;
331
- position: relative;
332
- }
333
- .nav-list {
334
- display: flex;
335
- height: 100%;
336
- width: fit-content;
337
- flex-wrap: nowrap;
338
- list-style: none;
339
- }
340
- .nav-item {
341
- position: relative;
342
- height: 100%;
343
- color: var(--o-color-info1);
344
- pointer-events: auto;
345
- transition: color var(--o-duration-s) var(--o-easing-standard);
346
- @include text1;
347
- &.hidden {
348
- opacity: 0;
349
- }
350
- &#more {
351
- position: absolute;
352
- left: calc(var(--more-left) * 1px);
353
- }
354
-
355
- a {
356
- color: var(--o-color-info2);
357
- display: flex;
358
- align-items: center;
359
- transition: color var(--o-duration-s) var(--o-easing-standard);
360
- text-decoration: none;
361
- }
362
- &::after {
363
- content: '';
364
- position: absolute;
365
- bottom: 0;
366
- left: var(--o-gap-4);
367
- width: calc(100% - var(--o-gap-4) * 2);
368
- height: 2px;
369
- border-radius: 2px;
370
- background-color: var(--o-color-primary1);
371
- transition: opacity var(--o-duration-m2) var(--o-easing-standard);
372
- opacity: 0;
373
- @include respond-to('pad_h') {
374
- left: var(--o-gap-3);
375
- }
376
- }
377
- &.is-active,
378
- &.is-selected {
379
- .info-wrap {
380
- color: var(--o-color-primary1);
381
- font-weight: 500;
382
- cursor: default;
383
- }
384
- &::after {
385
- opacity: 1;
386
- }
387
- }
388
- }
389
-
390
- .info-wrap {
391
- display: flex;
392
- align-items: center;
393
- height: 100%;
394
- padding: 0 var(--o-gap-4);
395
- color: var(--o-color-info1);
396
- word-break: keep-all;
397
- position: relative;
398
- font-weight: normal;
399
- &:hover {
400
- color: var(--o-color-primary1);
401
- }
402
- & > span {
403
- display: flex;
404
- align-items: flex-end;
405
- white-space: nowrap;
406
- @include respond-to('pad_h') {
407
- height: 28px;
408
- }
409
- }
410
- &.clickable {
411
- cursor: pointer;
412
- }
413
- @include respond-to('pad_h') {
414
- padding: 0 var(--o-gap-3);
415
- }
416
- .dropdown-wrapper {
417
- font-weight: 400;
418
- position: absolute;
419
- top: calc(100% - 4px);
420
- left: 0;
421
- display: none;
422
- padding-top: 8px;
423
- transition: opacity var(--o-duration-s) var(--o-easing-standard);
424
- :deep(.el-cascader-panel) {
425
- box-shadow: var(--o-shadow-2);
426
- border: none;
427
- background-color: var(--o-color-fill2);
428
- display: flex;
429
- .el-cascader-menu {
430
- min-width: 100px;
431
- border-right: none;
432
- }
433
- .el-cascader-menu + .el-cascader-menu {
434
- border-left: 1px solid var(--o-color-control4);
435
- height: auto;
436
- }
437
- .el-cascader-node {
438
- .el-icon {
439
- display: none;
440
- }
441
- &.is-active {
442
- color: inherit;
443
- font-weight: normal;
444
- }
445
- &.in-active-path {
446
- font-weight: normal;
447
- color: var(--o-color-primary1);
448
- }
449
- }
450
-
451
- .tab-expand {
452
- display: flex;
453
- align-items: center;
454
- justify-content: space-between;
455
- gap: 12px;
456
- .o-icon {
457
- font-size: 16px;
458
- }
459
- }
460
- .el-cascader-menu__wrap {
461
- height: fit-content;
462
- }
463
- .el-cascader-menu__list {
464
- padding: 6px;
465
- li {
466
- padding: 6px 12px;
467
- border-radius: 4px;
468
- cursor: pointer;
469
- &:hover {
470
- background-color: var(--o-color-control2-light);
471
- color: var(--o-color-primary1);
472
- }
473
- & > span {
474
- padding: 0;
475
- &:not(.o-tag) {
476
- color: var(--o-color-info1);
477
- }
478
- }
479
- }
480
- }
481
- }
482
-
483
- .dropdown-link {
484
- color: inherit;
485
- display: flex;
486
- align-items: center;
487
- width: 100%;
488
- .o-tag {
489
- margin-left: var(--o-gap-2);
490
- transform: scale(0.75);
491
- transform-origin: left center;
492
- --layout-pkg-radius: 100vh;
493
- }
494
- }
495
- :deep(.jump-out-icon) {
496
- font-size: 16px;
497
- margin-left: 4px;
498
- path {
499
- fill: currentColor;
500
- stroke: transparent;
501
- }
502
- path[fill='none'] {
503
- display: none;
504
- }
505
- }
506
- }
507
- }
508
- .nav-item {
509
- @include hover {
510
- .dropdown-wrapper {
511
- display: block;
512
- }
513
- }
514
- }
515
- .tab-disabled {
516
- color: var(--o-color-info4);
517
- display: flex;
518
- align-items: center;
519
- cursor: not-allowed;
520
-
521
- .disabled-tag {
522
- margin-left: var(--o-gap-1);
523
- border: 1px solid rgba(224, 226, 230, 1);
524
- border-radius: var(--o-radius-xs);
525
- font-size: 10px;
526
- color: var(--o-color-info3);
527
- height: 16px;
528
- width: 38px;
529
- display: flex;
530
- align-items: center;
531
- justify-content: center;
532
- }
533
- }
534
- </style>
535
-
536
- <style lang="scss">
537
- .navs-dropdown {
538
- border-radius: 4px;
539
- }
540
- </style>