@opendesign-plus-test/components 0.0.1-rc.21 → 0.0.1-rc.23

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 (149) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -1
  2. package/dist/chunk-OElCookieNotice.es.js +428 -137
  3. package/dist/components/OBanner.vue.d.ts +10 -1
  4. package/dist/components/OFooter.vue.d.ts +1 -1
  5. package/dist/components/OHeaderSearch.vue.d.ts +4 -4
  6. package/dist/components/activity/OActivityApproval.vue.d.ts +277 -0
  7. package/dist/components/activity/OActivityForm.vue.d.ts +140 -0
  8. package/dist/components/activity/OMyActivityCalendar.vue.d.ts +578 -0
  9. package/dist/components/activity/config.d.ts +15 -0
  10. package/dist/components/activity/data.d.ts +51 -0
  11. package/dist/components/activity/index.d.ts +623 -0
  12. package/dist/components/activity/types.d.ts +76 -0
  13. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +309 -0
  14. package/dist/components/meeting/OMeetingForm.vue.d.ts +156 -0
  15. package/dist/components/meeting/OMyMeetingCalendar.vue.d.ts +582 -0
  16. package/dist/components/meeting/OSigMeetingCalendar.vue.d.ts +24 -0
  17. package/dist/components/meeting/components/OMeetingCalendarList.vue.d.ts +27 -0
  18. package/dist/components/meeting/components/OMeetingCalendarSelector.vue.d.ts +664 -0
  19. package/dist/components/meeting/components/OMeetingDetail.vue.d.ts +12 -0
  20. package/dist/components/meeting/components/OMeetingPlaybackSubtitles.vue.d.ts +5 -0
  21. package/dist/components/meeting/components/OMeetingPlaybackVideo.vue.d.ts +17 -0
  22. package/dist/components/meeting/components/OSigMeetingAside.vue.d.ts +16 -0
  23. package/dist/components/meeting/config.d.ts +27 -0
  24. package/dist/components/meeting/types.d.ts +140 -0
  25. package/dist/components/meeting/utils.d.ts +21 -0
  26. package/dist/components.cjs.js +224 -3
  27. package/dist/components.css +1 -1
  28. package/dist/components.es.js +43544 -2307
  29. package/dist/index.d.ts +2 -0
  30. package/package.json +6 -3
  31. package/scripts/generate-components-index.js +4 -0
  32. package/src/assets/meeting/svg-icons/icon-all.svg +3 -0
  33. package/src/assets/meeting/svg-icons/icon-backward.svg +4 -0
  34. package/src/assets/meeting/svg-icons/icon-calendar.svg +3 -0
  35. package/src/assets/meeting/svg-icons/icon-cancel.svg +4 -0
  36. package/src/assets/meeting/svg-icons/icon-captions.svg +4 -0
  37. package/src/assets/meeting/svg-icons/icon-close-captions.svg +6 -0
  38. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +6 -0
  39. package/src/assets/meeting/svg-icons/icon-copy.svg +3 -0
  40. package/src/assets/meeting/svg-icons/icon-create.svg +5 -0
  41. package/src/assets/meeting/svg-icons/icon-delete.svg +7 -0
  42. package/src/assets/meeting/svg-icons/icon-empty.svg +31 -0
  43. package/src/assets/meeting/svg-icons/icon-empty_dark.svg +49 -0
  44. package/src/assets/meeting/svg-icons/icon-event.svg +3 -0
  45. package/src/assets/meeting/svg-icons/icon-export.svg +3 -0
  46. package/src/assets/meeting/svg-icons/icon-forward.svg +4 -0
  47. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +6 -0
  48. package/src/assets/meeting/svg-icons/icon-help.svg +3 -0
  49. package/src/assets/meeting/svg-icons/icon-important.svg +4 -0
  50. package/src/assets/meeting/svg-icons/icon-info.svg +3 -0
  51. package/src/assets/meeting/svg-icons/icon-meet.svg +3 -0
  52. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +5 -0
  53. package/src/assets/meeting/svg-icons/icon-meeting.svg +4 -0
  54. package/src/assets/meeting/svg-icons/icon-play.svg +5 -0
  55. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +7 -0
  56. package/src/assets/meeting/svg-icons/icon-playing.svg +5 -0
  57. package/src/assets/meeting/svg-icons/icon-question.svg +4 -0
  58. package/src/assets/meeting/svg-icons/icon-sound.svg +5 -0
  59. package/src/assets/meeting/svg-icons/icon-speaker.svg +3 -0
  60. package/src/assets/meeting/svg-icons/icon-summit.svg +3 -0
  61. package/src/assets/meeting/svg-icons/icon-telligent.svg +3 -0
  62. package/src/assets/meeting/svg-icons/icon-tip.svg +3 -0
  63. package/src/assets/meeting/svg-icons/icon-todo.svg +4 -0
  64. package/src/assets/meeting/transparent.png +0 -0
  65. package/src/assets/svg-icons/icon-chevron-up.svg +3 -0
  66. package/src/assets/svg-icons/icon-filter.svg +3 -0
  67. package/src/assets/svg-icons/icon-loading.svg +4 -0
  68. package/src/assets/svg-icons/icon-search.svg +3 -0
  69. package/src/assets/svg-icons/icon-tips.svg +3 -0
  70. package/src/components/OBanner.vue +11 -3
  71. package/src/components/OFooter.vue +1 -1
  72. package/src/components/activity/OActivityApproval.vue +775 -0
  73. package/src/components/activity/OActivityForm.vue +465 -0
  74. package/src/components/activity/OMyActivityCalendar.vue +1342 -0
  75. package/src/components/activity/config.ts +130 -0
  76. package/src/components/activity/data.ts +365 -0
  77. package/src/components/activity/index.ts +24 -0
  78. package/src/components/activity/types.ts +83 -0
  79. package/src/components/common/MoreText.vue +119 -0
  80. package/src/components/common/ThFilter.vue +326 -0
  81. package/src/components/events/OEventsApply.vue +2 -86
  82. package/src/components/events/OEventsCalendar.vue +0 -25
  83. package/src/components/events/OEventsList.vue +0 -51
  84. package/src/components/events/index.ts +1 -0
  85. package/src/components/meeting/OMeetingCalendar.vue +865 -0
  86. package/src/components/meeting/OMeetingForm.vue +1035 -0
  87. package/src/components/meeting/OMeetingPlayback.vue +439 -0
  88. package/src/components/meeting/OMyMeetingCalendar.vue +1501 -0
  89. package/src/components/meeting/OSigMeetingCalendar.vue +411 -0
  90. package/src/components/meeting/components/OMeetingCalendarList.vue +462 -0
  91. package/src/components/meeting/components/OMeetingCalendarSelector.vue +206 -0
  92. package/src/components/meeting/components/OMeetingDetail.vue +189 -0
  93. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +611 -0
  94. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +741 -0
  95. package/src/components/meeting/components/OMyCalendarWrapper.vue +160 -0
  96. package/src/components/meeting/components/OSigMeetingAside.vue +197 -0
  97. package/src/components/meeting/config.ts +110 -0
  98. package/src/components/meeting/index.ts +45 -0
  99. package/src/components/meeting/types.ts +167 -0
  100. package/src/components/meeting/utils.ts +106 -0
  101. package/src/draft/Footer.vue +4 -4
  102. package/src/env.d.ts +15 -0
  103. package/src/i18n/en.ts +140 -0
  104. package/src/i18n/index.ts +18 -4
  105. package/src/i18n/zh.ts +140 -0
  106. package/src/index.ts +2 -0
  107. package/tsconfig.json +6 -2
  108. package/vite.config.ts +25 -9
  109. package/npmcachae/_cacache/content-v2/sha512/05/f7/dd881de8b21208ea65cfce17c65f29964c3897505819f81151b9798a3a6ab1a1114324192354ead15cd2c8d93f76cc9929af168066ec9cc7878d0fd87578 +0 -1
  110. package/npmcachae/_cacache/content-v2/sha512/08/b7/879230f8c2f3765920a6fd6113f4687141f1f645f96af7d95a0dee9113d1095d000fb78a5dd55c1860bbfb9b698ef6281b3874b03b2384222f61fe055fc4 +0 -1
  111. package/npmcachae/_cacache/content-v2/sha512/10/a0/a6626613c03ee052925a762e8675878efdf83dac64fafea43beb2a875f7d7c3907bb0ee30761253cd16021fd58911449594e1d3358675cbb7c48e62f220a +0 -1
  112. package/npmcachae/_cacache/content-v2/sha512/2e/a6/7cbcf55a98bbe2ca881d10e982ebf59211a0ec051eaf46eb1914df66cc35ae502ed6888850e51d8f45cd92695bac16961a642bc41508f8d5160a9ab617ab +0 -1
  113. package/npmcachae/_cacache/content-v2/sha512/92/8d/e5259c5d5cc2a625247f3c4d809192ca9482467e23683d74924a11e91a7997ad890b3d26adaf34df66d5329cc7a5fbde6713110cad05107a0b504e4fd4e8 +0 -1
  114. package/npmcachae/_cacache/content-v2/sha512/e9/45/9597d870127c35681155cec5fe52fde4e1aa0f778b996ee371e856aca850ee4c13aba74b0c3d3a89ff0ea4c9e1d33e64e53c31dc9cede0b31012695ee659 +0 -1
  115. package/npmcachae/_cacache/index-v5/16/4a/7195fcc6857299c4ab7e26014a8ae6e3c396507a2c8db3da1b74b005d574 +0 -3
  116. package/npmcachae/_cacache/index-v5/58/f0/4fe556f104b09be642895a82afa463fe560d9a0dc8f507efeef825a6905e +0 -3
  117. package/npmcachae/_cacache/index-v5/67/7d/0b50dc4c09555fc922ccf43c46994f1a0a5ff47dc0a5d5cf41437ac2d3e6 +0 -3
  118. package/npmcachae/_cacache/index-v5/8f/28/353f8839e030ab11aab3e7d9f1b8c053403e9f593cf6d4aa6ec8fdd7610d +0 -3
  119. package/npmcachae/_cacache/index-v5/97/10/0fcf20eb29d0726bd820822f6729718464b591b0e6901217c956740e943c +0 -3
  120. package/npmcachae/_cacache/index-v5/db/89/a0a4f35f593105624ab39339962d9e9b5cc65ed0c346b0732fb8dd73721d +0 -3
  121. package/npmcachae/_logs/2026-03-26T14_10_35_885Z-debug-0.log +0 -171
  122. package/npmcachae/_logs/2026-03-26T14_10_38_617Z-debug-0.log +0 -4227
  123. package/npmcachae/_logs/2026-03-26T14_10_45_316Z-debug-0.log +0 -4228
  124. package/npmcachae/_logs/2026-03-26T14_10_48_169Z-debug-0.log +0 -4228
  125. package/npmcachae/_logs/2026-03-26T14_10_51_306Z-debug-0.log +0 -464
  126. package/npmcachae/_logs/2026-03-26T14_10_53_911Z-debug-0.log +0 -464
  127. package/npmcachae/_logs/2026-03-26T14_10_56_398Z-debug-0.log +0 -464
  128. package/npmcachae/_logs/2026-03-26T14_10_58_861Z-debug-0.log +0 -464
  129. package/npmcachae/_logs/2026-03-26T14_11_01_337Z-debug-0.log +0 -464
  130. package/npmcachae/_logs/2026-03-26T14_11_03_851Z-debug-0.log +0 -464
  131. package/npmcachae/_logs/2026-03-26T14_11_08_024Z-debug-0.log +0 -464
  132. package/npmcachae/_update-notifier-last-checked +0 -0
  133. package/src/components/meeting/npmcachae/_cacache/content-v2/sha512/3e/17/1865217b9acb9f4921c53a09b5c76587cd2ab748beb2699ff6cfb1341d73b1aa56ed91ffc5ab2c9c9b3fbe626103b35d9a79ff29ff6b8cbb8d89755fe1a2 +0 -1
  134. package/src/components/meeting/npmcachae/_cacache/content-v2/sha512/a6/15/47bb7552ec9248079e839a5feecc1742d4de19524fdf041cf581701cf4760a5025106036145e279ba193b07c8fa5b07ae3d75f1b6032f0cb2219115b6167 +0 -1
  135. package/src/components/meeting/npmcachae/_cacache/content-v2/sha512/d1/4c/133b32e09c97101a27a07cc4432f94e470cff02d120d21babcea77c3f5cd436793516dc1a8e282ee1a568f923c148b1a48f4a43233462a530d35e8b41c67 +0 -1
  136. package/src/components/meeting/npmcachae/_cacache/index-v5/54/0d/a4909047714a0a7198bb9bd37020992464e47c79a791889919b84d90aab0 +0 -3
  137. package/src/components/meeting/npmcachae/_cacache/index-v5/8e/2b/21a79778e2ac08cf5663baf83cb35f951995a496007eb2e2f7fba54021a4 +0 -3
  138. package/src/components/meeting/npmcachae/_cacache/index-v5/eb/a0/b70c8132e5b57a0f1e129b8cc941796420a9c147c0baa680710083740898 +0 -2
  139. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_03_54_955Z-debug-0.log +0 -277
  140. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_03_57_842Z-debug-0.log +0 -277
  141. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_00_016Z-debug-0.log +0 -277
  142. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_02_191Z-debug-0.log +0 -277
  143. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_04_425Z-debug-0.log +0 -277
  144. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_06_642Z-debug-0.log +0 -277
  145. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_08_826Z-debug-0.log +0 -277
  146. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_25_36_140Z-debug-0.log +0 -433
  147. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_25_39_573Z-debug-0.log +0 -433
  148. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_25_42_134Z-debug-0.log +0 -212
  149. package/src/components/meeting/npmcachae/_update-notifier-last-checked +0 -0
@@ -0,0 +1,462 @@
1
+ <script setup lang="ts">
2
+ import { OCollapse, OCollapseItem, ODivider, OIcon, OLink, OTag, useMessage } from '@opensig/opendesign';
3
+ import OMeetingDetail from './OMeetingDetail.vue';
4
+ import { computed, nextTick, ref, watch } from 'vue';
5
+ import IconMeetinging from '~icons/meeting/icon-meet.svg';
6
+ import IconCopy from '~icons/meeting/icon-copy.svg';
7
+ import { CalendarDataType, MeetingItemT } from '../types.ts';
8
+
9
+ import IconAll from '~icons/meeting/icon-all.svg';
10
+ import IconEvent from '~icons/meeting/icon-event.svg';
11
+ import IconSummit from '~icons/meeting/icon-summit.svg';
12
+ import IconMeeting from '~icons/meeting/icon-meet.svg';
13
+ import IconChevronRight from '~icons/components/icon-chevron-right.svg';
14
+ import { CYCLE_TYPE_OPTIONS, INTERVAL_DAY, INTERVAL_MONTH, INTERVAL_WEEK } from '../config.ts';
15
+
16
+ import { formatDate, getConfig, getPointStr } from '../utils.ts';
17
+ import { useI18n } from '@/i18n';
18
+
19
+ const props = withDefaults(defineProps<{ list: MeetingItemT[] }>(), {
20
+ list: () => [],
21
+ });
22
+ const { t, locale } = useI18n();
23
+ const detailRefs = ref([]);
24
+ const message = useMessage();
25
+ const copyInfo = async (idx) => {
26
+ const instance = detailRefs.value[idx];
27
+ await instance.copyInfo();
28
+ message.success({
29
+ content: t('common.copySuccess'),
30
+ });
31
+ };
32
+
33
+ const collapseNames = ref([]);
34
+ const i18n = {
35
+ SIG_GROUP: `${ t('meeting.sigs') }: `,
36
+ NEW_DATE: t('meeting.latestMeeting'),
37
+ EMPTY_TEXT: t('meeting.meetingEmptyText'),
38
+ LEARN_MORE: t('common.seeMore'),
39
+ JOIN_MEETING: t('meeting.joinMeeting'),
40
+ SIGN: t('meeting.sign'),
41
+ };
42
+
43
+ const getCurrentIcon = (item) => {
44
+ if (item.type === 'summit') return IconSummit;
45
+ if (item.type === 'events') return IconEvent;
46
+ return IconMeeting;
47
+ };
48
+
49
+ // -------------------- 监听尺寸变化 --------------------
50
+ const meetInfoRef = ref();
51
+ const resizeObserver = new ResizeObserver((entries) => {
52
+ for (let entry of entries) {
53
+ const { height } = entry.contentRect;
54
+ entry.target.classList.remove('hidden-divider');
55
+ if (height >= 30) {
56
+ entry.target.classList.add('hidden-divider');
57
+ }
58
+ }
59
+ });
60
+
61
+ watch(
62
+ () => props.list,
63
+ () => {
64
+ if (props.list.length === 1) {
65
+ collapseNames.value = [props.list[0].id];
66
+ } else {
67
+ collapseNames.value = [];
68
+ }
69
+ nextTick(() => {
70
+ meetInfoRef.value?.forEach((targetDiv) => {
71
+ resizeObserver.observe(targetDiv);
72
+ });
73
+ });
74
+ },
75
+ );
76
+
77
+ const computedList = computed(() => {
78
+ return props.list.map((v) => {
79
+ const type = v.type;
80
+ let dateRange = '';
81
+ if (['events', 'summit'].includes(type)) {
82
+ dateRange = `${ formatDate(v.start_date, 'YYYY/MM/DD HH:mm') } ${ formatDate(v.end_date, 'YYYY/MM/DD HH:mm') }`;
83
+ return {
84
+ ...v,
85
+ dateRange,
86
+ };
87
+ }
88
+ const {
89
+ is_cycle,
90
+ date,
91
+ start,
92
+ end,
93
+ cycle_start_date,
94
+ cycle_end_date,
95
+ cycle_start,
96
+ cycle_end,
97
+ cycle_type,
98
+ cycle_interval,
99
+ cycle_point,
100
+ } = v;
101
+ dateRange = `${ formatDate(date) } ${ start } - ${ end }`;
102
+ if (is_cycle) {
103
+ dateRange = `${ formatDate(cycle_start_date) } - ${ formatDate(cycle_end_date) }`;
104
+ }
105
+
106
+ let timeRange = `${ start } - ${ end }`;
107
+ let replay_url = null;
108
+ let hasObsData = false;
109
+ const obsData = v.obs_data?.filter((v) => v.text_video_url) || [];
110
+
111
+ if (is_cycle) {
112
+ let cycleType = '';
113
+ if (cycle_type === INTERVAL_DAY) {
114
+ cycleType = t('meeting.cycleDay');
115
+ }
116
+ if (cycle_type === INTERVAL_WEEK) {
117
+ if (cycle_interval > 1) {
118
+ cycleType = t('meeting.cycleWeek.other', [getPointStr(cycle_type, cycle_point), cycle_interval]);
119
+ } else {
120
+ cycleType = t('meeting.cycleWeek.one', [getPointStr(cycle_type, cycle_point)]);
121
+ }
122
+ }
123
+ if (cycle_type === INTERVAL_MONTH) {
124
+ cycleType = t('meeting.cycleMonth', [getPointStr(cycle_type, cycle_point)]);
125
+ }
126
+ timeRange = t('meeting.cycleMeetingText2', {
127
+ startDate: cycle_start_date,
128
+ endDate: cycle_end_date,
129
+ startTime: cycle_start,
130
+ endTime: cycle_end,
131
+ cycleType,
132
+ });
133
+ hasObsData = obsData.some((t) => t.sub_id === v.cycle_sub.find((z) => z.date === date)?.sub_id);
134
+ } else {
135
+ hasObsData = obsData.length > 0;
136
+ }
137
+ if (hasObsData) {
138
+ replay_url = `${ location.origin }/${ locale.value }/video/${ v.group_name }/${ v.mid }/${ date }`;
139
+ }
140
+
141
+ return {
142
+ ...v,
143
+ dateRange,
144
+ timeRange,
145
+ replay_url,
146
+ };
147
+ });
148
+ });
149
+ </script>
150
+
151
+ <template>
152
+ <div class="o-meeting-calendar-list" :class="!computedList?.length ? 'is-empty':''">
153
+ <slot name="empty" v-if="!computedList?.length"></slot>
154
+ <OCollapse v-else v-model="collapseNames" :style="{ '--collapse-padding': '0' }">
155
+ <OCollapseItem v-for="(item, index) in computedList" :key="item.id" :value="item.id">
156
+ <template #title>
157
+ <div class="meet-title" :title="item.topic || item.name">
158
+ <OIcon
159
+ :style="{
160
+ backgroundColor: `${getConfig(item.type, 'color')}`
161
+ }"
162
+ >
163
+ <component :is="getConfig(item.type, 'icon')" />
164
+ </OIcon>
165
+ <div class="text">
166
+ {{ item.topic || item.name }}
167
+ </div>
168
+ <div class="tag-wrapper" v-if="item.is_cycle">
169
+ <OTag color="primary" variant="outline">{{ t('meeting.cycle') }}</OTag>
170
+ </div>
171
+ </div>
172
+ <div class="meet-info" ref="meetInfoRef">
173
+ <span class="start-time">
174
+ <span>{{ item.dateRange }}</span>
175
+ </span>
176
+ <ODivider direction="v" />
177
+ <div>
178
+ <template v-if="item.group_name">{{ i18n.SIG_GROUP }} {{ item.group_name }}</template>
179
+ <template v-if="item.activity_type">{{ item.activity_type }}</template>
180
+ </div>
181
+ </div>
182
+ <OLink v-if="item.url" :href="item.url" target="_blank" class="jump-detail-link">
183
+ <span>{{ i18n.LEARN_MORE }}</span>
184
+ <template #suffix>
185
+ <OIcon>
186
+ <IconChevronRight />
187
+ </OIcon>
188
+ </template>
189
+ </OLink>
190
+ <OLink v-if="item.join_url" :href="item.join_url" target="_blank" class="jump-detail-link">
191
+ <span>{{ i18n.JOIN_MEETING }}</span>
192
+ <template #suffix>
193
+ <OIcon>
194
+ <IconChevronRight />
195
+ </OIcon>
196
+ </template>
197
+ </OLink>
198
+ <OLink v-if="item.signUrl" :href="item.signUrl" target="_blank" class="jump-detail-link">
199
+ <span>{{ i18n.SIGN }}</span>
200
+ <template #suffix>
201
+ <OIcon>
202
+ <IconChevronRight />
203
+ </OIcon>
204
+ </template>
205
+ </OLink>
206
+ <OIcon @click.stop="() => copyInfo(index)" class="copy-icon">
207
+ <IconCopy />
208
+ </OIcon>
209
+ </template>
210
+ <div class="calendar-info">
211
+ <OMeetingDetail
212
+ :show="collapseNames.includes(item.id)" :data="item"
213
+ :ref="(insRef) => (detailRefs[index] = insRef)"
214
+ from="home"
215
+ />
216
+ </div>
217
+ </OCollapseItem>
218
+ </OCollapse>
219
+ </div>
220
+ </template>
221
+
222
+ <style lang="scss">
223
+ .o-meeting-calendar-list {
224
+
225
+
226
+ &.is-empty {
227
+ height: 100%;
228
+ display: flex;
229
+ align-items: center;
230
+ justify-content: center;
231
+ }
232
+
233
+
234
+ .o-collapse {
235
+ --icon-size2: 24px;
236
+ --icon-right: 12px;
237
+ @include respond-to('<=pad') {
238
+ --icon-size2: 20px;
239
+ }
240
+ @include respond-to('<=pad_v') {
241
+ --icon-right: 8px;
242
+ }
243
+ @include respond-to('phone') {
244
+ --icon-right: 4px;
245
+ }
246
+
247
+ .o-collapse-item {
248
+ position: relative;
249
+ border-top: none;
250
+
251
+ &::after {
252
+ position: absolute;
253
+ content: '';
254
+ bottom: 0;
255
+ left: 50%;
256
+ transform: translateX(-50%);
257
+ width: calc(100% - 2 * 24px);
258
+ height: 1px;
259
+ background-color: var(--collapse-division-color);
260
+ }
261
+
262
+ @include hover {
263
+ .text {
264
+ color: var(--o-color-primary1);
265
+ }
266
+ }
267
+ @include respond-to('<=pad_v') {
268
+ &::after {
269
+ width: calc(100% - 2 * 16px);
270
+ }
271
+ &:last-child {
272
+ &::after {
273
+ display: none;
274
+ }
275
+ }
276
+ }
277
+
278
+ &.o-collapse-item-expanded {
279
+ @include respond-to('<=pad_v') {
280
+
281
+ .copy-icon {
282
+ display: inline-flex;
283
+ }
284
+ }
285
+ }
286
+ }
287
+
288
+ .o-collapse-item-icon {
289
+ height: min-content;
290
+ }
291
+
292
+ .o-collapse-item-header {
293
+ align-items: center;
294
+ padding: var(--o-gap-4) var(--o-gap-5);
295
+ position: relative;
296
+
297
+ @include respond-to('>pad_v') {
298
+ &:hover {
299
+ .copy-icon {
300
+ display: inline-flex;
301
+ }
302
+ }
303
+ }
304
+ @include respond-to('<=pad_v') {
305
+ padding: 12px 16px;
306
+ }
307
+
308
+
309
+ .o-collapse-item-title {
310
+ flex-grow: 1;
311
+ }
312
+
313
+
314
+ .o-collapse-item-icon {
315
+ .o-svg-icon {
316
+ &:hover {
317
+ color: var(--o-color-primary1);
318
+ }
319
+ }
320
+ }
321
+
322
+ }
323
+
324
+ .o-collapse-item-body {
325
+ background-color: var(--o-color-control2-light);
326
+ margin-bottom: 0;
327
+
328
+ a {
329
+ word-break: break-all;
330
+ }
331
+ }
332
+
333
+ .jump-detail-link {
334
+ padding-left: calc(var(--icon-right) + var(--icon-size2));
335
+ margin-top: var(--o-gap-2);
336
+ @include text1;
337
+
338
+ .o-icon {
339
+ font-size: 16px;
340
+ }
341
+ }
342
+
343
+ .jump-detail-link + .jump-detail-link {
344
+ padding-left: 24px;
345
+ }
346
+
347
+ .meet-title {
348
+ display: flex;
349
+ align-items: center;
350
+ width: calc(100% - 48px);
351
+ color: var(--o-color-info1);
352
+ @include text2;
353
+
354
+ .tag-wrapper {
355
+ margin-left: var(--o-gap-2);
356
+
357
+ .o-tag {
358
+ background-color: var(--o-color-control2-light);
359
+ border: none;
360
+ }
361
+ }
362
+
363
+ .o-icon {
364
+ flex-shrink: 0;
365
+ padding: 2px;
366
+ border-radius: 50%;
367
+ overflow: hidden;
368
+ color: var(--o-color-white);
369
+ margin-right: var(--icon-right);
370
+ width: var(--icon-size2);
371
+ height: var(--icon-size2);
372
+ font-size: var(--icon-size2);
373
+
374
+ svg path {
375
+ fill: currentColor;
376
+ }
377
+ }
378
+
379
+ .text {
380
+ display: block;
381
+ @include text-truncate(1);
382
+ }
383
+ }
384
+
385
+ .meet-info {
386
+ margin-left: calc(var(--icon-right) + var(--icon-size2));
387
+ margin-top: var(--o-gap-2);
388
+ display: flex;
389
+ flex-wrap: wrap;
390
+ align-items: center;
391
+ color: var(--o-color-info3);
392
+ text-decoration: none;
393
+ @include tip1;
394
+
395
+ .o-divider {
396
+ @include tip1;
397
+ }
398
+
399
+ &.hidden-divider {
400
+ .start-time {
401
+ padding-right: 24px;
402
+ }
403
+
404
+ .o-divider {
405
+ display: none;
406
+ }
407
+ }
408
+ }
409
+
410
+ .copy-icon {
411
+ position: absolute;
412
+ top: 50%;
413
+ transform: translateY(-50%);
414
+ right: 56px;
415
+ font-size: 18px;
416
+ display: none;
417
+
418
+ @include respond-to('phone') {
419
+ right: 48px;
420
+ }
421
+
422
+ &:hover {
423
+ color: var(--o-color-primary1);
424
+ }
425
+
426
+ svg path {
427
+ fill: currentColor;
428
+ }
429
+ }
430
+
431
+ .calendar-info {
432
+ display: flex;
433
+ color: var(--o-color-info3);
434
+ flex-direction: column;
435
+ padding: 16px 16px 16px calc(var(--icon-right) + var(--icon-size2) + var(--o-gap-5));
436
+ @include tip1;
437
+
438
+ @include respond-to('<=pad_v') {
439
+ padding: 16px 16px 16px calc(var(--icon-right) + var(--icon-size2) + 16px);
440
+
441
+ }
442
+ @include respond-to('phone') {
443
+ padding: 12px 16px;
444
+ }
445
+
446
+ .info-item {
447
+ display: flex;
448
+ margin-top: 8px;
449
+
450
+ .item-title {
451
+ min-width: 110px;
452
+ }
453
+ }
454
+
455
+ .info-item:first-child {
456
+ margin-top: 0;
457
+ }
458
+ }
459
+ }
460
+ }
461
+
462
+ </style>
@@ -0,0 +1,206 @@
1
+ <script setup lang="ts">
2
+ import { OButton } from '@opensig/opendesign';
3
+ import { ElSelect, ElOption } from 'element-plus';
4
+ import { computed, ref, watchEffect } from 'vue';
5
+ import { useI18n } from '@/i18n';
6
+
7
+ const { t } = useI18n();
8
+ const props = withDefaults(
9
+ defineProps<{
10
+ modelValue: number[];
11
+ multiple?: boolean;
12
+ }>(),
13
+ {
14
+ modelValue: () => [],
15
+ multiple: false,
16
+ },
17
+ );
18
+ const emits = defineEmits(['update:modelValue']);
19
+ // 默认31天
20
+ const getList = () => {
21
+ let res = [];
22
+ for (let i = 1; i <= 31; i++) {
23
+ res.push(i);
24
+ }
25
+ return res;
26
+ };
27
+
28
+ const list = computed(() => getList());
29
+ const checked = ref([]);
30
+ const temp = ref([]);
31
+ const selectorRef = ref(null);
32
+
33
+ const init = () => {
34
+ checked.value = [...props.modelValue];
35
+ temp.value = [...props.modelValue];
36
+ };
37
+
38
+ watchEffect(() => {
39
+ init();
40
+ });
41
+
42
+ const confirm = () => {
43
+ emits('update:modelValue', temp.value);
44
+ selectorRef.value.expanded = false;
45
+ };
46
+
47
+ const cancel = () => {
48
+ init();
49
+ selectorRef.value.expanded = false;
50
+ };
51
+
52
+ const clickItem = (val: number) => {
53
+ if (props.multiple) {
54
+ const idx = temp.value.indexOf(val);
55
+ if (idx === -1) {
56
+ temp.value.push(val);
57
+ } else {
58
+ temp.value.splice(idx, 1);
59
+ }
60
+ temp.value.sort();
61
+ } else {
62
+ temp.value = [val];
63
+ confirm();
64
+ }
65
+ };
66
+
67
+ const removeTag = (val: number) => {
68
+ if (props.multiple) {
69
+ clickItem(val);
70
+ } else {
71
+ temp.value = [];
72
+ }
73
+ confirm();
74
+ };
75
+ </script>
76
+
77
+ <template>
78
+ <div class="calendar-selector" :class="!multiple && 'is-single'">
79
+ <ElSelect
80
+ ref="selectorRef"
81
+ popper-class="calendar-selector-popper"
82
+ :placeholder="t('meeting.selectRepeatDate')"
83
+ size="large"
84
+ multiple
85
+ collapseTags
86
+ maxCollapseTags="3"
87
+ :modelValue="checked"
88
+ @remove-tag="removeTag"
89
+ >
90
+ <ElOption
91
+ v-for="t in list"
92
+ :key="t"
93
+ :label="t"
94
+ :value="t"
95
+ @click="clickItem(t)"
96
+ :class="temp.includes(t) && 'is-checked'" />
97
+ <template #footer v-if="multiple">
98
+ <OButton round="pill" color="primary" variant="outline" @click="confirm">{{ t('common.confirm') }}</OButton>
99
+ <OButton variant="text" @click="cancel">{{ t('common.cancel') }}</OButton>
100
+ </template>
101
+ </ElSelect>
102
+ </div>
103
+ </template>
104
+
105
+ <style scoped lang="scss">
106
+ .calendar-selector {
107
+ width: 100%;
108
+
109
+ :deep(.el-select) {
110
+ .el-select__placeholder {
111
+ @include text1;
112
+ }
113
+
114
+ .el-select__icon {
115
+ height: 24px;
116
+ font-size: 24px;
117
+ margin-right: 2px;
118
+ color: var(--o-color-info1);
119
+ background-color: var(--o-color-info2);
120
+ mask: url(@/assets/meeting/svg-icons/icon-calendar.svg) no-repeat center;
121
+ background-size: 24px;
122
+ background-repeat: no-repeat;
123
+ background-position: center center;
124
+ transform: rotateZ(0deg);
125
+
126
+ svg {
127
+ display: none;
128
+ }
129
+ }
130
+ }
131
+
132
+ &.is-single {
133
+ :deep(.el-select) {
134
+ .el-select__selection {
135
+ margin-left: 0;
136
+ }
137
+
138
+ .el-tag {
139
+ padding: 0;
140
+ background-color: transparent;
141
+ color: var(--o-color-info1);
142
+ @include text1;
143
+
144
+ .el-tag__close {
145
+ display: none;
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ </style>
152
+ <style lang="scss">
153
+ .calendar-selector-popper {
154
+ padding: 0 24px;
155
+
156
+ .el-select-dropdown__list {
157
+ padding: 16px 0;
158
+ display: flex;
159
+ gap: 12px 8px;
160
+ flex-wrap: wrap;
161
+ width: 272px;
162
+
163
+ .el-select-dropdown__item {
164
+ padding: 0;
165
+ width: 32px;
166
+ height: 24px;
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: center;
170
+ background-color: var(--o-color-fill2);
171
+ color: var(--o-color-info1);
172
+ border-radius: var(--o-radius-xs);
173
+
174
+ &:hover,
175
+ &.is-checked {
176
+ background-color: var(--o-color-primary1);
177
+ color: #fff;
178
+ font-weight: inherit;
179
+ }
180
+
181
+ &.is-selected {
182
+ font-weight: inherit;
183
+
184
+ &::after {
185
+ content: none;
186
+ }
187
+ }
188
+ }
189
+ }
190
+
191
+ .el-select-dropdown__footer {
192
+ padding: 16px 0;
193
+ display: flex;
194
+ align-items: center;
195
+ justify-content: space-between;
196
+
197
+ .o-btn {
198
+ min-width: fit-content;
199
+
200
+ &:last-child {
201
+ padding: 0;
202
+ }
203
+ }
204
+ }
205
+ }
206
+ </style>