@opendesign-plus/components 0.0.1-rc.10

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 (199) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -0
  2. package/dist/chunk-OElCookieNotice.es.js +833 -0
  3. package/dist/components/OBanner.vue.d.ts +11 -0
  4. package/dist/components/OCookieNotice.vue.d.ts +17 -0
  5. package/dist/components/OFooter.vue.d.ts +46 -0
  6. package/dist/components/OHeaderSearch.vue.d.ts +692 -0
  7. package/dist/components/OHeaderUser.vue.d.ts +38 -0
  8. package/dist/components/OPlusConfigProvider.vue.d.ts +23 -0
  9. package/dist/components/OSection.vue.d.ts +37 -0
  10. package/dist/components/OSourceCode.vue.d.ts +20 -0
  11. package/dist/components/OThemeSwitcher.vue.d.ts +28 -0
  12. package/dist/components/activity/OActivityApproval.vue.d.ts +277 -0
  13. package/dist/components/activity/OActivityForm.vue.d.ts +140 -0
  14. package/dist/components/activity/OMyActivityCalendar.vue.d.ts +578 -0
  15. package/dist/components/activity/config.d.ts +15 -0
  16. package/dist/components/activity/index.d.ts +623 -0
  17. package/dist/components/activity/types.d.ts +81 -0
  18. package/dist/components/element-plus/OElCookieNotice.vue.d.ts +34 -0
  19. package/dist/components/element-plus/index.d.ts +2 -0
  20. package/dist/components/events/OEventsApply.vue.d.ts +16 -0
  21. package/dist/components/events/OEventsCalendar.vue.d.ts +5 -0
  22. package/dist/components/events/OEventsList.vue.d.ts +26 -0
  23. package/dist/components/events/config.d.ts +27 -0
  24. package/dist/components/events/index.d.ts +78 -0
  25. package/dist/components/events/types.d.ts +66 -0
  26. package/dist/components/events/utils.d.ts +7 -0
  27. package/dist/components/header/OHeader.vue.d.ts +24 -0
  28. package/dist/components/header/OHeaderMoblie.vue.d.ts +33 -0
  29. package/dist/components/header/components/HeaderContent.vue.d.ts +6 -0
  30. package/dist/components/header/components/HeaderNav.vue.d.ts +7 -0
  31. package/dist/components/header/components/HeaderNavMoblie.vue.d.ts +17 -0
  32. package/dist/components/header/components/HeaderUbmcNav.vue.d.ts +2 -0
  33. package/dist/components/header/index.d.ts +22 -0
  34. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +298 -0
  35. package/dist/components/meeting/OMeetingForm.vue.d.ts +145 -0
  36. package/dist/components/meeting/OMyMeetingCalendar.vue.d.ts +586 -0
  37. package/dist/components/meeting/OSigMeetingCalendar.vue.d.ts +24 -0
  38. package/dist/components/meeting/components/OMeetingCalendarList.vue.d.ts +28 -0
  39. package/dist/components/meeting/components/OMeetingCalendarSelector.vue.d.ts +664 -0
  40. package/dist/components/meeting/components/OMeetingDetail.vue.d.ts +12 -0
  41. package/dist/components/meeting/components/OMeetingPlaybackSubtitles.vue.d.ts +5 -0
  42. package/dist/components/meeting/components/OMeetingPlaybackVideo.vue.d.ts +17 -0
  43. package/dist/components/meeting/components/OSigMeetingAside.vue.d.ts +16 -0
  44. package/dist/components/meeting/config.d.ts +27 -0
  45. package/dist/components/meeting/types.d.ts +166 -0
  46. package/dist/components/meeting/utils.d.ts +22 -0
  47. package/dist/components.cjs.js +224 -0
  48. package/dist/components.css +1 -0
  49. package/dist/components.element.cjs.js +1 -0
  50. package/dist/components.element.es.js +4 -0
  51. package/dist/components.es.js +45054 -0
  52. package/dist/index.d.ts +19 -0
  53. package/docs/design.md +27 -0
  54. package/docs/design_banner.md +41 -0
  55. package/docs/design_section.md +27 -0
  56. package/package.json +56 -0
  57. package/scripts/generate-components-index.js +104 -0
  58. package/src/assets/events/svg-icons/icon-checked.svg +3 -0
  59. package/src/assets/events/svg-icons/icon-competition.svg +7 -0
  60. package/src/assets/events/svg-icons/icon-events.svg +4 -0
  61. package/src/assets/events/svg-icons/icon-release.svg +4 -0
  62. package/src/assets/events/svg-icons/icon-summit.svg +4 -0
  63. package/src/assets/meeting/svg-icons/icon-all.svg +3 -0
  64. package/src/assets/meeting/svg-icons/icon-backward.svg +4 -0
  65. package/src/assets/meeting/svg-icons/icon-calendar.svg +3 -0
  66. package/src/assets/meeting/svg-icons/icon-cancel.svg +4 -0
  67. package/src/assets/meeting/svg-icons/icon-captions.svg +4 -0
  68. package/src/assets/meeting/svg-icons/icon-close-captions.svg +6 -0
  69. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +6 -0
  70. package/src/assets/meeting/svg-icons/icon-copy.svg +3 -0
  71. package/src/assets/meeting/svg-icons/icon-create.svg +5 -0
  72. package/src/assets/meeting/svg-icons/icon-delete.svg +7 -0
  73. package/src/assets/meeting/svg-icons/icon-empty.svg +31 -0
  74. package/src/assets/meeting/svg-icons/icon-empty_dark.svg +49 -0
  75. package/src/assets/meeting/svg-icons/icon-event.svg +3 -0
  76. package/src/assets/meeting/svg-icons/icon-export.svg +3 -0
  77. package/src/assets/meeting/svg-icons/icon-forward.svg +4 -0
  78. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +6 -0
  79. package/src/assets/meeting/svg-icons/icon-help.svg +3 -0
  80. package/src/assets/meeting/svg-icons/icon-important.svg +4 -0
  81. package/src/assets/meeting/svg-icons/icon-info.svg +3 -0
  82. package/src/assets/meeting/svg-icons/icon-meet.svg +3 -0
  83. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +5 -0
  84. package/src/assets/meeting/svg-icons/icon-meeting.svg +4 -0
  85. package/src/assets/meeting/svg-icons/icon-play.svg +5 -0
  86. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +7 -0
  87. package/src/assets/meeting/svg-icons/icon-playing.svg +5 -0
  88. package/src/assets/meeting/svg-icons/icon-question.svg +4 -0
  89. package/src/assets/meeting/svg-icons/icon-sound.svg +5 -0
  90. package/src/assets/meeting/svg-icons/icon-speaker.svg +3 -0
  91. package/src/assets/meeting/svg-icons/icon-summit.svg +3 -0
  92. package/src/assets/meeting/svg-icons/icon-telligent.svg +3 -0
  93. package/src/assets/meeting/svg-icons/icon-tip.svg +3 -0
  94. package/src/assets/meeting/svg-icons/icon-todo.svg +4 -0
  95. package/src/assets/meeting/transparent.png +0 -0
  96. package/src/assets/svg-icons/icon-arrow-left.svg +3 -0
  97. package/src/assets/svg-icons/icon-avatar-line.svg +3 -0
  98. package/src/assets/svg-icons/icon-caret-left.svg +3 -0
  99. package/src/assets/svg-icons/icon-caret-right.svg +3 -0
  100. package/src/assets/svg-icons/icon-chevron-down.svg +3 -0
  101. package/src/assets/svg-icons/icon-chevron-right.svg +3 -0
  102. package/src/assets/svg-icons/icon-chevron-up.svg +3 -0
  103. package/src/assets/svg-icons/icon-close.svg +3 -0
  104. package/src/assets/svg-icons/icon-delete.svg +3 -0
  105. package/src/assets/svg-icons/icon-filter.svg +3 -0
  106. package/src/assets/svg-icons/icon-header-back.svg +3 -0
  107. package/src/assets/svg-icons/icon-header-delete.svg +3 -0
  108. package/src/assets/svg-icons/icon-header-menu.svg +3 -0
  109. package/src/assets/svg-icons/icon-header-person.svg +3 -0
  110. package/src/assets/svg-icons/icon-header-search.svg +4 -0
  111. package/src/assets/svg-icons/icon-loading.svg +4 -0
  112. package/src/assets/svg-icons/icon-locale.svg +3 -0
  113. package/src/assets/svg-icons/icon-log-off.svg +3 -0
  114. package/src/assets/svg-icons/icon-message.svg +3 -0
  115. package/src/assets/svg-icons/icon-moon.svg +3 -0
  116. package/src/assets/svg-icons/icon-outlink.svg +3 -0
  117. package/src/assets/svg-icons/icon-overview.svg +3 -0
  118. package/src/assets/svg-icons/icon-search.svg +3 -0
  119. package/src/assets/svg-icons/icon-setting.svg +3 -0
  120. package/src/assets/svg-icons/icon-sun.svg +3 -0
  121. package/src/assets/svg-icons/icon-tips.svg +3 -0
  122. package/src/components/OBanner.vue +398 -0
  123. package/src/components/OCookieNotice.vue +575 -0
  124. package/src/components/OFooter.vue +576 -0
  125. package/src/components/OHeaderSearch.vue +601 -0
  126. package/src/components/OHeaderUser.vue +237 -0
  127. package/src/components/OPlusConfigProvider.vue +32 -0
  128. package/src/components/OSection.vue +178 -0
  129. package/src/components/OSourceCode.vue +153 -0
  130. package/src/components/OThemeSwitcher.vue +108 -0
  131. package/src/components/activity/OActivityApproval.vue +871 -0
  132. package/src/components/activity/OActivityForm.vue +548 -0
  133. package/src/components/activity/OMyActivityCalendar.vue +1501 -0
  134. package/src/components/activity/config.ts +141 -0
  135. package/src/components/activity/index.ts +24 -0
  136. package/src/components/activity/types.ts +88 -0
  137. package/src/components/common/AppAvatar.vue +83 -0
  138. package/src/components/common/ClientOnlyWrapper.ts +21 -0
  139. package/src/components/common/ContentWrapper.vue +85 -0
  140. package/src/components/common/MoreText.vue +124 -0
  141. package/src/components/common/ThFilter.vue +330 -0
  142. package/src/components/element-plus/OElCookieNotice.vue +603 -0
  143. package/src/components/element-plus/index.ts +3 -0
  144. package/src/components/events/OEventsApply.vue +419 -0
  145. package/src/components/events/OEventsCalendar.vue +588 -0
  146. package/src/components/events/OEventsList.vue +354 -0
  147. package/src/components/events/config.ts +35 -0
  148. package/src/components/events/index.ts +24 -0
  149. package/src/components/events/types.ts +80 -0
  150. package/src/components/events/utils.ts +9 -0
  151. package/src/components/header/OHeader.vue +175 -0
  152. package/src/components/header/OHeaderMoblie.vue +152 -0
  153. package/src/components/header/components/HeaderContent.vue +942 -0
  154. package/src/components/header/components/HeaderNav.vue +280 -0
  155. package/src/components/header/components/HeaderNavMoblie.vue +346 -0
  156. package/src/components/header/components/HeaderUbmcNav.vue +540 -0
  157. package/src/components/header/index.ts +16 -0
  158. package/src/components/meeting/OMeetingCalendar.vue +900 -0
  159. package/src/components/meeting/OMeetingForm.vue +1041 -0
  160. package/src/components/meeting/OMeetingPlayback.vue +439 -0
  161. package/src/components/meeting/OMyMeetingCalendar.vue +1502 -0
  162. package/src/components/meeting/OSigMeetingCalendar.vue +411 -0
  163. package/src/components/meeting/components/OMeetingCalendarList.vue +505 -0
  164. package/src/components/meeting/components/OMeetingCalendarSelector.vue +206 -0
  165. package/src/components/meeting/components/OMeetingDetail.vue +227 -0
  166. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +611 -0
  167. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +741 -0
  168. package/src/components/meeting/components/OSigMeetingAside.vue +197 -0
  169. package/src/components/meeting/config.ts +121 -0
  170. package/src/components/meeting/index.ts +45 -0
  171. package/src/components/meeting/types.ts +193 -0
  172. package/src/components/meeting/utils.ts +123 -0
  173. package/src/draft/Banner.vue +265 -0
  174. package/src/draft/ButtonCards.vue +106 -0
  175. package/src/draft/Feature.vue +134 -0
  176. package/src/draft/Footer.vue +512 -0
  177. package/src/draft/HorizontalAnchor.vue +165 -0
  178. package/src/draft/ItemSwiper.vue +133 -0
  179. package/src/draft/Logo.vue +141 -0
  180. package/src/draft/LogoCard.vue +75 -0
  181. package/src/draft/LogoV2.vue +19 -0
  182. package/src/draft/MainCard.vue +38 -0
  183. package/src/draft/MultiCard.vue +95 -0
  184. package/src/draft/MultiIconCard.vue +74 -0
  185. package/src/draft/OInfoCard.vue +176 -0
  186. package/src/draft/Process.vue +81 -0
  187. package/src/draft/Section.vue +167 -0
  188. package/src/draft/SingleTabCard.vue +85 -0
  189. package/src/draft/SliderCard.vue +110 -0
  190. package/src/env.d.ts +16 -0
  191. package/src/i18n/en.ts +261 -0
  192. package/src/i18n/index.ts +56 -0
  193. package/src/i18n/zh.ts +250 -0
  194. package/src/index.ts +45 -0
  195. package/src/shared/provide.ts +6 -0
  196. package/src/shims-vue-dompurify-html.d.ts +17 -0
  197. package/src/vue.d.ts +10 -0
  198. package/tsconfig.json +37 -0
  199. package/vite.config.ts +118 -0
@@ -0,0 +1,505 @@
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, MeetingGroupType, 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
+ import { getActicityTypeMap } from '@/components/activity/config.ts';
19
+
20
+ const acticityTypeMap = getActicityTypeMap();
21
+
22
+ const props = withDefaults(defineProps<{
23
+ list: MeetingItemT[];
24
+ groupType: MeetingGroupType;
25
+ }>(), {
26
+ list: () => [],
27
+ });
28
+ const { t, locale } = useI18n();
29
+ const detailRefs = ref([]);
30
+ const message = useMessage();
31
+ const copyInfo = async (idx) => {
32
+ const instance = detailRefs.value[idx];
33
+ await instance.copyInfo();
34
+ message.success({
35
+ content: t('common.copySuccess'),
36
+ });
37
+ };
38
+
39
+ const collapseNames = ref([]);
40
+ const i18n = computed(() => {
41
+ return {
42
+ SIG_GROUP: `${ props.groupType === MeetingGroupType.GROUP ? t('meeting.groups') : t('meeting.sigs') }: `,
43
+ NEW_DATE: t('meeting.latestMeeting'),
44
+ EMPTY_TEXT: t('meeting.meetingEmptyText'),
45
+ LEARN_MORE: t('common.seeMore'),
46
+ JOIN_MEETING: t('meeting.joinMeeting'),
47
+ SIGN: t('meeting.sign'),
48
+ DETAILS: t('meeting.detail'),
49
+ };
50
+ });
51
+
52
+ const getCurrentIcon = (item) => {
53
+ if (item.type === 'summit') return IconSummit;
54
+ if (item.type === 'events') return IconEvent;
55
+ return IconMeeting;
56
+ };
57
+
58
+ // -------------------- 监听尺寸变化 --------------------
59
+ const meetInfoRef = ref();
60
+ const resizeObserver = new ResizeObserver((entries) => {
61
+ for (let entry of entries) {
62
+ const { height } = entry.contentRect;
63
+ entry.target.classList.remove('hidden-divider');
64
+ if (height >= 30) {
65
+ entry.target.classList.add('hidden-divider');
66
+ }
67
+ }
68
+ });
69
+
70
+ watch(
71
+ () => props.list,
72
+ () => {
73
+ if (props.list.length === 1) {
74
+ collapseNames.value = [props.list[0].id];
75
+ } else {
76
+ collapseNames.value = [];
77
+ }
78
+ nextTick(() => {
79
+ meetInfoRef.value?.forEach((targetDiv) => {
80
+ resizeObserver.observe(targetDiv);
81
+ });
82
+ });
83
+ },
84
+ );
85
+
86
+ const computedList = computed(() => {
87
+ return props.list.map((v) => {
88
+ const type = v.type;
89
+ let dateRange = '';
90
+ if (['activity'].includes(type)) {
91
+ let activity_type = acticityTypeMap.get(v.activity_type)?.label;
92
+ if (v.end_date === v.start_date) {
93
+ return {
94
+ ...v,
95
+ activity_type,
96
+ dateRange: `${ formatDate(v.start_date) } ${ v.start }-${ v.end }`,
97
+ };
98
+ }
99
+ return {
100
+ ...v,
101
+ activity_type,
102
+ dateRange: `${ formatDate(v.start_date) } ${ v.start }-${ formatDate(v.end_date) } ${ v.end }`,
103
+ };
104
+ }
105
+ if (['events', 'summit'].includes(type)) {
106
+ dateRange = `${ formatDate(v.start_date, 'YYYY/MM/DD HH:mm') } ${ formatDate(v.end_date, 'YYYY/MM/DD HH:mm') }`;
107
+ return {
108
+ ...v,
109
+ dateRange,
110
+ };
111
+ }
112
+ const {
113
+ is_cycle,
114
+ date,
115
+ start,
116
+ end,
117
+ cycle_start_date,
118
+ cycle_end_date,
119
+ cycle_start,
120
+ cycle_end,
121
+ cycle_type,
122
+ cycle_interval,
123
+ cycle_point,
124
+ } = v;
125
+ dateRange = `${ formatDate(date) } ${ start } - ${ end }`;
126
+ if (is_cycle) {
127
+ dateRange = `${ formatDate(cycle_start_date) } - ${ formatDate(cycle_end_date) }`;
128
+ }
129
+
130
+ let timeRange = `${ start } - ${ end }`;
131
+ let replay_url = null;
132
+ let hasObsData = false;
133
+ const obsData = v.obs_data?.filter((v) => v.text_video_url) || [];
134
+
135
+ if (is_cycle) {
136
+ let cycleType = '';
137
+ if (cycle_type === INTERVAL_DAY) {
138
+ cycleType = t('meeting.cycleDay');
139
+ }
140
+ if (cycle_type === INTERVAL_WEEK) {
141
+ if (cycle_interval > 1) {
142
+ cycleType = t('meeting.cycleWeek.other', [getPointStr(cycle_type, cycle_point), cycle_interval]);
143
+ } else {
144
+ cycleType = t('meeting.cycleWeek.one', [getPointStr(cycle_type, cycle_point)]);
145
+ }
146
+ }
147
+ if (cycle_type === INTERVAL_MONTH) {
148
+ cycleType = t('meeting.cycleMonth', [getPointStr(cycle_type, cycle_point)]);
149
+ }
150
+ timeRange = t('meeting.cycleMeetingText2', {
151
+ startDate: cycle_start_date,
152
+ endDate: cycle_end_date,
153
+ startTime: cycle_start,
154
+ endTime: cycle_end,
155
+ cycleType,
156
+ });
157
+ hasObsData = obsData.some((t) => t.sub_id === v.cycle_sub.find((z) => z.date === date)?.sub_id);
158
+ } else {
159
+ hasObsData = obsData.length > 0;
160
+ }
161
+ if (hasObsData) {
162
+ replay_url = `${ location.origin }/${ locale.value }/video/${ v.group_name }/${ v.mid }/${ date }`;
163
+ }
164
+
165
+ return {
166
+ ...v,
167
+ dateRange,
168
+ timeRange,
169
+ replay_url,
170
+ };
171
+ });
172
+ });
173
+ </script>
174
+
175
+ <template>
176
+ <div class="o-meeting-calendar-list" :class="!computedList?.length ? 'is-empty':''">
177
+ <slot name="empty" v-if="!computedList?.length"></slot>
178
+ <OCollapse v-else v-model="collapseNames" :style="{ '--collapse-padding': '0' }">
179
+ <OCollapseItem v-for="(item, index) in computedList" :key="item.id" :value="item.id">
180
+ <template #title>
181
+ <div class="meet-title" :title="item.topic || item.name">
182
+ <OIcon
183
+ :style="{
184
+ backgroundColor: `${getConfig(item.type, 'color')}`
185
+ }"
186
+ >
187
+ <component :is="getConfig(item.type, 'icon')" />
188
+ </OIcon>
189
+ <div class="text">
190
+ {{ item.topic || item.name || item.title }}
191
+ </div>
192
+ <div class="tag-wrapper" v-if="item.is_cycle">
193
+ <OTag color="primary" variant="outline">{{ t('meeting.cycle') }}</OTag>
194
+ </div>
195
+ </div>
196
+ <div class="meet-info" ref="meetInfoRef">
197
+ <span class="start-time">
198
+ <span>{{ item.dateRange }}</span>
199
+ </span>
200
+ <ODivider direction="v" />
201
+ <div>
202
+ <template v-if="item.group_name">{{ i18n.SIG_GROUP }} {{ item.group_name }}</template>
203
+ <template v-if="item.activity_type">{{ item.activity_type }}</template>
204
+ </div>
205
+ </div>
206
+ <OLink v-if="item.url" :href="item.url" target="_blank" class="jump-detail-link">
207
+ <span>{{ i18n.LEARN_MORE }}</span>
208
+ <template #suffix>
209
+ <OIcon>
210
+ <IconChevronRight />
211
+ </OIcon>
212
+ </template>
213
+ </OLink>
214
+ <OLink v-if="item.join_url" :href="item.join_url" target="_blank" class="jump-detail-link">
215
+ <span>{{ i18n.JOIN_MEETING }}</span>
216
+ <template #suffix>
217
+ <OIcon>
218
+ <IconChevronRight />
219
+ </OIcon>
220
+ </template>
221
+ </OLink>
222
+ <OLink v-if="item.content_url" :href="item.content_url" target="_blank" class="jump-detail-link">
223
+ <span>{{ i18n.DETAILS }}</span>
224
+ <template #suffix>
225
+ <OIcon>
226
+ <IconChevronRight />
227
+ </OIcon>
228
+ </template>
229
+ </OLink>
230
+ <OLink v-if="item.register_url" :href="item.register_url" target="_blank" class="jump-detail-link">
231
+ <span>{{ i18n.SIGN }}</span>
232
+ <template #suffix>
233
+ <OIcon>
234
+ <IconChevronRight />
235
+ </OIcon>
236
+ </template>
237
+ </OLink>
238
+ <OIcon @click.stop="() => copyInfo(index)" class="copy-icon">
239
+ <IconCopy />
240
+ </OIcon>
241
+ </template>
242
+ <div class="calendar-info">
243
+ <OMeetingDetail
244
+ :show="collapseNames.includes(item.id)" :data="item"
245
+ :ref="(insRef) => (detailRefs[index] = insRef)"
246
+ from="home"
247
+ />
248
+ </div>
249
+ </OCollapseItem>
250
+ </OCollapse>
251
+ </div>
252
+ </template>
253
+
254
+ <style lang="scss">
255
+ .o-meeting-calendar-list {
256
+
257
+
258
+ &.is-empty {
259
+ height: 100%;
260
+ display: flex;
261
+ align-items: center;
262
+ justify-content: center;
263
+ }
264
+
265
+
266
+ .o-collapse {
267
+ --icon-size2: 24px;
268
+ --icon-right: 12px;
269
+ @include respond-to('<=pad') {
270
+ --icon-size2: 20px;
271
+ }
272
+ @include respond-to('<=pad_v') {
273
+ --icon-right: 8px;
274
+ }
275
+ @include respond-to('phone') {
276
+ --icon-right: 4px;
277
+ }
278
+
279
+ .o-collapse-item {
280
+ position: relative;
281
+ border-top: none;
282
+
283
+ &::after {
284
+ position: absolute;
285
+ content: '';
286
+ bottom: 0;
287
+ left: 50%;
288
+ transform: translateX(-50%);
289
+ width: calc(100% - 2 * 24px);
290
+ height: 1px;
291
+ background-color: var(--collapse-division-color);
292
+ }
293
+
294
+ &:last-child::after {
295
+ display: none;
296
+ }
297
+
298
+ @include hover {
299
+ .text {
300
+ color: var(--o-color-primary1);
301
+ }
302
+ }
303
+ @include respond-to('<=pad_v') {
304
+ &::after {
305
+ width: calc(100% - 2 * 16px);
306
+ }
307
+ &:last-child {
308
+ &::after {
309
+ display: none;
310
+ }
311
+ }
312
+ }
313
+
314
+ &.o-collapse-item-expanded {
315
+ .copy-icon {
316
+ display: inline-flex;
317
+ }
318
+ }
319
+ }
320
+
321
+ .o-collapse-item-icon {
322
+ height: min-content;
323
+ }
324
+
325
+ .o-collapse-item-header {
326
+ align-items: center;
327
+ padding: var(--o-gap-4) var(--o-gap-5);
328
+ position: relative;
329
+
330
+ @include respond-to('>pad_v') {
331
+ &:hover {
332
+ .copy-icon {
333
+ display: inline-flex;
334
+ }
335
+ }
336
+ }
337
+ @include respond-to('<=pad_v') {
338
+ padding: 12px 16px;
339
+ }
340
+
341
+ .o-collapse-item-title {
342
+ flex-grow: 1;
343
+ margin-bottom: 0;
344
+ }
345
+
346
+
347
+ .o-collapse-item-icon {
348
+ .o-svg-icon {
349
+ &:hover {
350
+ color: var(--o-color-primary1);
351
+ }
352
+ }
353
+ }
354
+
355
+ }
356
+
357
+ .o-collapse-item-body {
358
+ margin-bottom: 0;
359
+ padding: 0 12px 16px 12px;
360
+
361
+ a {
362
+ word-break: break-all;
363
+ }
364
+
365
+ .calendar-info {
366
+ display: flex;
367
+ color: var(--o-color-info3);
368
+ flex-direction: column;
369
+ background-color: color-mix(in srgb, var(--o-color-control2-light), transparent 60%);
370
+ padding: 16px 16px 16px calc(var(--icon-right) + var(--icon-size2) + var(--o-gap-5) - 12px);
371
+ border-radius: var(--o-radius-xs);
372
+ @include tip1;
373
+
374
+ @include respond-to('<=pad_v') {
375
+ padding: 16px 16px 16px calc(var(--icon-right) + var(--icon-size2) + 16px - 12px);
376
+
377
+ }
378
+ @include respond-to('phone') {
379
+ padding: 12px 16px;
380
+ }
381
+
382
+ .info-item {
383
+ display: flex;
384
+ margin-top: 8px;
385
+
386
+ .item-title {
387
+ min-width: 110px;
388
+ }
389
+ }
390
+
391
+ .info-item:first-child {
392
+ margin-top: 0;
393
+ }
394
+ }
395
+
396
+ }
397
+
398
+ .jump-detail-link {
399
+ padding-left: calc(var(--icon-right) + var(--icon-size2));
400
+ margin-top: var(--o-gap-2);
401
+ color: var(--o-color-info2);
402
+ @include tip1;
403
+
404
+ &:hover {
405
+ color: var(--o-color-primary1);
406
+ }
407
+
408
+ .o-icon {
409
+ font-size: 16px;
410
+ }
411
+ }
412
+
413
+ .jump-detail-link + .jump-detail-link {
414
+ padding-left: 24px;
415
+ }
416
+
417
+ .meet-title {
418
+ display: flex;
419
+ align-items: center;
420
+ width: calc(100% - 48px);
421
+ color: var(--o-color-info1);
422
+ @include text2;
423
+
424
+ .tag-wrapper {
425
+ margin-left: var(--o-gap-2);
426
+
427
+ .o-tag {
428
+ background-color: var(--o-color-control2-light);
429
+ border: none;
430
+ }
431
+ }
432
+
433
+ .o-icon {
434
+ flex-shrink: 0;
435
+ border-radius: 50%;
436
+ overflow: hidden;
437
+ color: var(--o-color-white);
438
+ margin-right: var(--icon-right);
439
+ width: var(--icon-size2);
440
+ height: var(--icon-size2);
441
+ font-size: var(--icon-size2);
442
+
443
+ svg path {
444
+ fill: currentColor;
445
+ }
446
+ }
447
+
448
+ .text {
449
+ display: block;
450
+ font-weight: 600;
451
+ @include text-truncate(1);
452
+ }
453
+ }
454
+
455
+ .meet-info {
456
+ margin-left: calc(var(--icon-right) + var(--icon-size2));
457
+ margin-top: var(--o-gap-2);
458
+ display: flex;
459
+ flex-wrap: wrap;
460
+ align-items: center;
461
+ color: var(--o-color-info3);
462
+ text-decoration: none;
463
+ font-weight: 400;
464
+ @include tip1;
465
+
466
+ .o-divider {
467
+ @include tip1;
468
+ }
469
+
470
+ &.hidden-divider {
471
+ .start-time {
472
+ padding-right: 24px;
473
+ }
474
+
475
+ .o-divider {
476
+ display: none;
477
+ }
478
+ }
479
+ }
480
+
481
+ .copy-icon {
482
+ position: absolute;
483
+ top: 50%;
484
+ transform: translateY(-50%);
485
+ right: 56px;
486
+ font-size: 18px;
487
+ display: none;
488
+
489
+ @include respond-to('phone') {
490
+ right: 48px;
491
+ }
492
+
493
+ &:hover {
494
+ color: var(--o-color-primary1);
495
+ }
496
+
497
+ svg path {
498
+ fill: currentColor;
499
+ }
500
+ }
501
+
502
+ }
503
+ }
504
+
505
+ </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>