@opendesign-plus/components 0.0.1-rc.2 → 0.0.1-rc.21

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