@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,1072 @@
1
+ <script setup lang="ts">
2
+ import { ElDatePicker, ElInputNumber, ElTimeSelect } from 'element-plus';
3
+ import { computed, onMounted, ref, watch } from 'vue';
4
+ import {
5
+ OButton,
6
+ OForm,
7
+ OFormItem,
8
+ OIcon,
9
+ OIconTime,
10
+ OInput,
11
+ OOption,
12
+ OPopover,
13
+ ORadio,
14
+ ORadioGroup,
15
+ OSelect,
16
+ OSwitch,
17
+ OTextarea, RulesT,
18
+ useMessage,
19
+ } from '@opensig/opendesign';
20
+ import IconHelp from '~icons/meeting/icon-help.svg';
21
+ import IconTip from '~icons/meeting/icon-tip.svg';
22
+ import { CycleSubItemT, MeetingFormPropsT, MeetingGroupType, MeetingPostT, OptionItemT, PlatformT } from './types';
23
+ import dayjs from 'dayjs';
24
+ import { findLabelFromOptions, formatDateNumber, getDateNumber } from './utils';
25
+ import { EMAIL_REGEX, INTERVAL_DAY, INTERVAL_MONTH, INTERVAL_WEEK } from './config';
26
+ import OMeetingCalendarSelector from './components/OMeetingCalendarSelector.vue';
27
+ import { useScreen } from '@opendesign-plus/composables';
28
+ import { useMeetingConfig } from './composables/useMeetingConfig';
29
+ import { ValidatorResultT } from '@opensig/opendesign/lib/form/types';
30
+
31
+ const { t, locale, cycleTypeOptions0, intervalWeekOptions, getPlatformLabel } = useMeetingConfig();
32
+
33
+ const props = withDefaults(defineProps<MeetingFormPropsT>(), {
34
+ isSub: false,
35
+ isEdit: false,
36
+ showBtns: true,
37
+ groupType: MeetingGroupType.SIG,
38
+ });
39
+ const message = useMessage(null);
40
+
41
+ const cycleTypeOptions = cycleTypeOptions0;
42
+ const weekOptions = intervalWeekOptions;
43
+
44
+ const intervalTypeMax = computed(() => {
45
+ return findLabelFromOptions(form.value.cycle_type, cycleTypeOptions.value, 'max');
46
+ });
47
+ const initForm: MeetingPostT = {
48
+ is_record: false,
49
+ agenda: '',
50
+ email_list: '',
51
+ platform: 'WELINK',
52
+ topic: '',
53
+ group_name: '',
54
+ etherpad: '',
55
+ date: '',
56
+ date_range: [],
57
+ start: '',
58
+ end: '',
59
+ time: '',
60
+ is_cycle: false,
61
+ cycle_interval: 1,
62
+ cycle_type: INTERVAL_DAY,
63
+ cycle_point: [],
64
+ };
65
+ const form = ref<MeetingPostT>(Object.assign({}, initForm) as unknown as MeetingPostT); // 表单数据
66
+ const formRef = ref<any>(null); // 表单实例
67
+ const loading = ref(false); // 提交状态
68
+ // 表单校验规则
69
+ const rules = computed<Record<string, RulesT[]>>(() => {
70
+ return {
71
+ topic: [
72
+ { required: true, message: t('meeting.enterMeetingName') },
73
+ {
74
+ validator: (value: string) => {
75
+ if (value.length > 128) {
76
+ return {
77
+ type: 'danger',
78
+ message: t('meeting.meetingNameTooLong'),
79
+ };
80
+ }
81
+ },
82
+ },
83
+ ],
84
+ agenda: [
85
+ {
86
+ validator: (value: string) => {
87
+ if (value.length > 4096) {
88
+ return {
89
+ type: 'danger',
90
+ message: t('meeting.meetingAgendaTooLong'),
91
+ };
92
+ }
93
+ },
94
+ },
95
+ ],
96
+ group_name: [{
97
+ required: true,
98
+ message: props.groupType === MeetingGroupType.GROUP ? t('meeting.selectGroup') : t('meeting.selectSig'),
99
+ }],
100
+ etherpad: [{ required: true, message: t('meeting.enterEtherpad') }],
101
+ date: [{ required: true, message: t('meeting.selectDate') }],
102
+ platform: [{ required: true, message: t('meeting.selectPlatform') }],
103
+ time: [
104
+ {
105
+ validator: (value: any) => {
106
+ const { is_cycle, cycle_type, cycle_interval, cycle_point, date, date_range } = form.value;
107
+ if (is_cycle) {
108
+ const msg = t('meeting.finishMeetingConfig');
109
+ if (cycle_type === INTERVAL_DAY) {
110
+ if (!cycle_interval) {
111
+ return {
112
+ type: 'danger',
113
+ message: msg,
114
+ };
115
+ }
116
+ }
117
+ if (cycle_type === INTERVAL_WEEK) {
118
+ if (!cycle_interval || !cycle_point?.length) {
119
+ return {
120
+ type: 'danger',
121
+ message: msg,
122
+ };
123
+ }
124
+ }
125
+ if (cycle_type === INTERVAL_MONTH) {
126
+ if (!cycle_interval || !cycle_point?.length) {
127
+ return {
128
+ type: 'danger',
129
+ message: msg,
130
+ };
131
+ }
132
+ }
133
+ if (!date_range?.length) {
134
+ return {
135
+ type: 'danger',
136
+ message: t('meeting.selectMeetingDate'),
137
+ };
138
+ }
139
+ const NONE_MSG = t('meeting.invalidMeetingDuration');
140
+ let start = date_range[0];
141
+ const end = date_range[1];
142
+ if (cycle_type === INTERVAL_WEEK) {
143
+ const weeks = new Set();
144
+ while (!dayjs(start).isAfter(dayjs(end))) {
145
+ weeks.add(dayjs(start).day());
146
+ start = dayjs(start).add(1, 'day').format('YYYY-MM-DD');
147
+ }
148
+ if (cycle_point.every((point) => !weeks.has(point))) {
149
+ return {
150
+ type: 'danger',
151
+ message: NONE_MSG,
152
+ };
153
+ }
154
+ }
155
+ if (cycle_type === INTERVAL_MONTH) {
156
+ const days = new Set();
157
+ while (!dayjs(start).isAfter(dayjs(end))) {
158
+ days.add(dayjs(start).date());
159
+ start = dayjs(start).add(1, 'day').format('YYYY-MM-DD');
160
+ }
161
+ if (cycle_point.every((point) => !days.has(point))) {
162
+ return {
163
+ type: 'danger',
164
+ message: NONE_MSG,
165
+ };
166
+ }
167
+ }
168
+ } else {
169
+ if (!date) {
170
+ return {
171
+ type: 'danger',
172
+ message: t('meeting.selectMeetingDate'),
173
+ };
174
+ }
175
+ }
176
+ if (!value?.trim()?.length) {
177
+ return {
178
+ type: 'danger',
179
+ message: t('meeting.selectMeetingTime'),
180
+ };
181
+ }
182
+ const arr = value.split('-').map((v: string) => v.split(':').map(Number));
183
+ if (arr[0][0] > arr[1][0] || (arr[0][0] === arr[1][0] && arr[0][1] >= arr[1][1])) {
184
+ return {
185
+ type: 'danger',
186
+ message: t('meeting.endTimeAfterStartTime'),
187
+ };
188
+ }
189
+ if (!form.value.is_cycle && form.value.date && form.value.start) {
190
+ const start = `${ form.value.date } ${ form.value.start }`;
191
+ if (dayjs(start).isBefore(dayjs())) {
192
+ return {
193
+ type: 'danger',
194
+ message: t('meeting.startTimeBeforeEndTime'),
195
+ };
196
+ }
197
+ }
198
+ },
199
+ triggers: ['blur', 'change'],
200
+ },
201
+ ],
202
+ email_list: [
203
+ {
204
+ validator: (value: any) => {
205
+ if (props.isEdit) {
206
+ return {} as unknown as ValidatorResultT;
207
+ }
208
+ const str = value.replaceAll(' ', '').replaceAll(',', ';') || '';
209
+ if (str.length) {
210
+ if (str.length > 1020) {
211
+ return {
212
+ type: 'danger',
213
+ message: t('meeting.emailTooLong'),
214
+ };
215
+ }
216
+ const list: string[] = str.split(';') || [];
217
+ if (list.some((v) => !EMAIL_REGEX.test(v))) {
218
+ return {
219
+ type: 'danger',
220
+ message: t('meeting.emailInvalid'),
221
+ };
222
+ }
223
+ if (list.some((v) => v.length > 50)) {
224
+ return {
225
+ type: 'danger',
226
+ message: t('meeting.singleEmailTooLong'),
227
+ };
228
+ }
229
+ if (list.length > 20) {
230
+ return {
231
+ type: 'danger',
232
+ message: t('meeting.emailCountTooLong'),
233
+ };
234
+ }
235
+ }
236
+ },
237
+ triggers: ['blur', 'change'],
238
+ },
239
+ ],
240
+ };
241
+ });
242
+
243
+ const sigOptions = ref<OptionItemT[]>([]); // sig组选项列表
244
+ const getSigOptions = async () => {
245
+ if (!props.getGroupsRequest) {
246
+ return;
247
+ }
248
+ const res = await props.getGroupsRequest();
249
+ sigOptions.value = res.map((v: OptionItemT) => ({ ...v, label: v.group_name, value: v.group_name }));
250
+ if (props.data) {
251
+ changeSig(form.value.group_name);
252
+ }
253
+ };
254
+ // 会议平台选项列表
255
+ const typeOptions = ref<OptionItemT[]>([]);
256
+ const getPlatformOptions = async () => {
257
+ if (!props.getPlatformsRequest) {
258
+ return;
259
+ }
260
+ const res = await props.getPlatformsRequest();
261
+ typeOptions.value = res.map((v: string) => ({ label: getPlatformLabel(v), value: v }));
262
+ if (!props.data) {
263
+ form.value.platform = typeOptions.value[0].value as unknown as PlatformT;
264
+ }
265
+ };
266
+
267
+ const emits = defineEmits(['confirm', 'cancel']);
268
+ watch(
269
+ () => props.data,
270
+ (data) => {
271
+ if (data) {
272
+ const sub = data?.cycle_sub?.find((v) => v.sub_id === props.subId) || {} as unknown as CycleSubItemT;
273
+ const { mid, date, start, end, sub_id } = sub;
274
+ Object.assign(
275
+ form.value,
276
+ data,
277
+ props.isSub
278
+ ? {
279
+ is_cycle: false,
280
+ mid,
281
+ date,
282
+ start,
283
+ end,
284
+ sub_id,
285
+ }
286
+ : {},
287
+ );
288
+ } else {
289
+ const today = dayjs().format('YYYY-MM-DD');
290
+ const now = dayjs().format('HH:mm');
291
+
292
+ let start = '';
293
+ let end = '';
294
+ const nowNum = getDateNumber(now);
295
+ if (nowNum <= getDateNumber('08:00')) {
296
+ start = '08:00';
297
+ end = '09:00';
298
+ } else if (getDateNumber('22:15') <= nowNum) {
299
+ start = '08:00';
300
+ end = '09:00';
301
+ } else {
302
+ let [h, m] = now.split(':').map(Number);
303
+ if (m >= 45) {
304
+ h++;
305
+ m = 0;
306
+ } else {
307
+ m = (Math.floor(m / 15) + 1) * 15;
308
+ }
309
+ start = formatDateNumber(h * 60 + m).slice(3);
310
+ end = formatDateNumber(h * 60 + m + 60).slice(3);
311
+ }
312
+ const date_range = [dayjs().format('YYYY-MM-DD'), dayjs().add(1, 'month').format('YYYY-MM-DD')];
313
+
314
+ Object.assign(form.value, {
315
+ date: today,
316
+ start,
317
+ end,
318
+ time: `${ start }-${ end }`,
319
+ date_range,
320
+ });
321
+ }
322
+ },
323
+ { immediate: true, deep: true },
324
+ );
325
+ const cancel = () => {
326
+ form.value = Object.assign({}, initForm);
327
+ formRef.value?.clearValidate?.();
328
+ formRef.value?.resetFields?.();
329
+ emits('cancel');
330
+ };
331
+
332
+ const changeIntervalType = () => {
333
+ form.value.cycle_point = [];
334
+ form.value.cycle_interval = 1;
335
+ };
336
+
337
+ const changeIsCycle = () => {
338
+ form.value.platform = 'WELINK';
339
+ };
340
+
341
+ const { lePadV } = useScreen();
342
+ const confirm = async () => {
343
+ let type = props.isEdit ? t('meeting.editSuccess') : t('meeting.booSuccess');
344
+ try {
345
+ loading.value = true;
346
+ const valid = await formRef.value.validate();
347
+ if (!valid || valid.some((v: any) => !!v)) {
348
+ return;
349
+ }
350
+ const {
351
+ topic,
352
+ etherpad,
353
+ group_name,
354
+ platform,
355
+ date,
356
+ start,
357
+ end,
358
+ agenda,
359
+ is_record,
360
+ is_cycle,
361
+ date_range,
362
+ cycle_type,
363
+ cycle_interval,
364
+ cycle_point,
365
+ } =
366
+ form.value;
367
+ let params = {
368
+ topic,
369
+ etherpad,
370
+ agenda,
371
+ is_record,
372
+ group_name,
373
+ platform,
374
+ is_cycle,
375
+ } as MeetingPostT as unknown as any;
376
+ if (is_cycle) {
377
+ params = {
378
+ ...params,
379
+ cycle_interval,
380
+ cycle_type,
381
+ cycle_start_date: date_range?.[0] || '',
382
+ cycle_end_date: date_range?.[1] || '',
383
+ cycle_start: start,
384
+ cycle_end: end,
385
+ };
386
+ if (cycle_type !== INTERVAL_DAY) {
387
+ params = {
388
+ ...params,
389
+ cycle_point: cycle_point.join(','),
390
+ };
391
+ }
392
+ } else {
393
+ params = {
394
+ ...params,
395
+ date: date?.split(' ')[0] || '',
396
+ start,
397
+ end,
398
+ };
399
+ }
400
+ if (props.isEdit) {
401
+ if (props.isSub) {
402
+ const { mid, sub_id } = form.value;
403
+ const { date, start, end } = params;
404
+ await props?.editSubMeetingRequest(sub_id, {
405
+ mid,
406
+ date,
407
+ start,
408
+ end,
409
+ is_notify: true,
410
+ });
411
+ } else {
412
+ const {
413
+ email_list: _email_list,
414
+ platform: _platform,
415
+ group_name: _group_name,
416
+ etherpad: _etherpad,
417
+ ...data
418
+ } = params;
419
+ await props?.editMeetingRequest(props.data?.id as unknown as number, {
420
+ ...data,
421
+ is_notify: true,
422
+ });
423
+ }
424
+ } else {
425
+ await props?.createMeetingRequest({
426
+ ...params,
427
+ email_list: form.value.email_list.replaceAll(' ', ''),
428
+ });
429
+ }
430
+ const msg = t('meeting.meetingHandleSuccess', [form.value.topic, type]);
431
+ message.success({
432
+ content: msg,
433
+ });
434
+
435
+ emits('confirm');
436
+ } finally {
437
+ loading.value = false;
438
+ }
439
+ };
440
+ onMounted(() => {
441
+ getSigOptions();
442
+ getPlatformOptions();
443
+ });
444
+
445
+ const changeSig = (sig: any) => {
446
+ const find = sigOptions.value.find((v) => v.value === sig);
447
+ if (!props.isEdit) {
448
+ form.value.etherpad = find?.etherpad || '';
449
+ form.value.email_list = find?.email_list || '';
450
+ }
451
+ };
452
+ const disabledDate = (date: Date) => {
453
+ return date.getTime() < Date.now() - 24 * 60 * 60 * 1000;
454
+ };
455
+ const changeTime = () => {
456
+ if (form.value.start && form.value.end) {
457
+ form.value.time = `${ form.value.start }-${ form.value.end }`;
458
+ } else {
459
+ form.value.time = '';
460
+ }
461
+ };
462
+
463
+ defineExpose({
464
+ confirm,
465
+ });
466
+ </script>
467
+
468
+ <template>
469
+ <div class="o-meeting-form">
470
+ <OForm :model="form" ref="formRef" has-required :layout="lePadV ? 'v' : 'h'" class="form-wrapper">
471
+ <OFormItem :rules="rules.topic" :label="t('meeting.meetingName')" field="topic">
472
+ <OInput
473
+ :disabled="isSub"
474
+ size="large"
475
+ :placeholder="t('meeting.enterMeetingName')"
476
+ style="width: 100%"
477
+ v-model="form.topic" />
478
+ </OFormItem>
479
+ <OFormItem
480
+ :rules="rules.group_name"
481
+ :label="groupType === MeetingGroupType.GROUP ? t('meeting.meetingGroup'):t('meeting.meetingSig')"
482
+ field="group_name">
483
+ <OSelect
484
+ :disabled="isEdit"
485
+ :placeholder="groupType === MeetingGroupType.GROUP ? t('meeting.selectGroup') : t('meeting.selectSig')"
486
+ size="large"
487
+ style="width: 100%"
488
+ v-model="form.group_name"
489
+ @change="changeSig"
490
+ >
491
+ <OOption v-for="t in sigOptions" :key="t.value" :value="t.value">{{ t.label }}</OOption>
492
+ </OSelect>
493
+ </OFormItem>
494
+ <OFormItem :rules="rules.etherpad" label="Etherpad" field="etherpad" v-if="form.group_name">
495
+ <template #label>
496
+ <div class="label-wrapper">
497
+ <span>{{ t('meeting.etherpad') }}&nbsp;</span>
498
+ <OPopover>
499
+ <div class="o-meeting-form-popover-content etherpad">{{ t('meeting.etherpadDesc') }}</div>
500
+ <template #target>
501
+ <OIcon>
502
+ <IconHelp />
503
+ </OIcon>
504
+ </template>
505
+ </OPopover>
506
+ </div>
507
+ </template>
508
+ <OInput
509
+ :disabled="isEdit"
510
+ size="large"
511
+ :placeholder="t('meeting.enterEtherpad')"
512
+ style="width: 100%"
513
+ v-model="form.etherpad"
514
+ />
515
+ </OFormItem>
516
+
517
+ <OFormItem :label="t('meeting.meetingTime')" field="time" :rules="rules.time" class="repeat-row" required>
518
+ <div class="repeat-config-wrapper">
519
+ <OFormItem field="repeat" class="repeat-item" v-if="!isSub">
520
+ <ORadioGroup v-model="form.is_cycle" @change="changeIsCycle" :disabled="isEdit">
521
+ <ORadio :value="false">{{ t('meeting.nonRepeat') }}</ORadio>
522
+ <ORadio :value="true">{{ t('meeting.isRepeat') }}</ORadio>
523
+ </ORadioGroup>
524
+ </OFormItem>
525
+ <div class="repeat-config">
526
+ <template v-if="form.is_cycle">
527
+ <OFormItem :label="t('meeting.every')" class="full-width-item">
528
+ <div class="repeat-config-item">
529
+ <OFormItem v-if="form.cycle_type !== INTERVAL_MONTH">
530
+ <ElInputNumber size="large" v-model="form.cycle_interval" :min="1" :max="intervalTypeMax" />
531
+ </OFormItem>
532
+ <OFormItem>
533
+ <OSelect
534
+ size="large"
535
+ v-model="form.cycle_type"
536
+ class="interval-select"
537
+ optionWrapClass="o-meeting-form-interval-select-options"
538
+ @change="changeIntervalType"
539
+ >
540
+ <OOption v-for="o in cycleTypeOptions" :key="o.value" :value="o.value" :label="o.label" />
541
+ </OSelect>
542
+ </OFormItem>
543
+ </div>
544
+ </OFormItem>
545
+ <OFormItem
546
+ :label="t('meeting.in')"
547
+ field="cycle_point"
548
+ class="point-item"
549
+ v-if="form.cycle_type !== INTERVAL_DAY"
550
+ >
551
+ <OSelect
552
+ v-if="form.cycle_type === INTERVAL_WEEK"
553
+ size="large"
554
+ multiple
555
+ v-model="form.cycle_point"
556
+ :placeholder="t('meeting.selectRepeatDate')"
557
+ :max-tag-count="1"
558
+ >
559
+ <OOption v-for="o in weekOptions" :key="o.value" :value="o.value" :label="o.label" />
560
+ </OSelect>
561
+ <OMeetingCalendarSelector v-if="form.cycle_type === INTERVAL_MONTH" v-model="form.cycle_point" />
562
+ </OFormItem>
563
+ <OFormItem :label="t('meeting.meetingDuration')" field="date_range">
564
+ <ElDatePicker
565
+ size="large"
566
+ v-model="form.date_range"
567
+ :start-placeholder="t('meeting.startDate')"
568
+ :end-placeholder="t('meeting.endDate')"
569
+ style="width: 100%"
570
+ value-format="YYYY-MM-DD"
571
+ :disabled-date="disabledDate"
572
+ :clearable="false"
573
+ type="daterange"
574
+ popper-class="o-meeting-form-date-picker-popper"
575
+ />
576
+ </OFormItem>
577
+ </template>
578
+ <template v-else>
579
+ <OFormItem :label="t('meeting.meetingDate')" field="date">
580
+ <ElDatePicker
581
+ popper-class="o-meeting-form-date-picker-popper"
582
+ size="large"
583
+ v-model="form.date"
584
+ :placeholder="t('meeting.selectDate')"
585
+ style="width: 100%"
586
+ value-format="YYYY-MM-DD"
587
+ :disabled-date="disabledDate"
588
+ :clearable="false"
589
+ />
590
+ </OFormItem>
591
+ </template>
592
+
593
+ <OFormItem :label="t('meeting.meetingTime')">
594
+ <div class="time-select-wrapper">
595
+ <OFormItem field="start">
596
+ <ElTimeSelect
597
+ popper-class="meeting-form-time-popover"
598
+ step="00:15"
599
+ start="08:00"
600
+ end="22:45"
601
+ :placeholder="t('meeting.startTime')"
602
+ v-model="form.start"
603
+ size="large"
604
+ :clearable="false"
605
+ @change="changeTime"
606
+ />
607
+ </OFormItem>
608
+ <span>-</span>
609
+ <OFormItem field="end">
610
+ <ElTimeSelect
611
+ popper-class="meeting-form-time-popover"
612
+ step="00:15"
613
+ start="08:00"
614
+ end="22:45"
615
+ :placeholder="t('meeting.endTime')"
616
+ v-model="form.end"
617
+ size="large"
618
+ :clearable="false"
619
+ @change="changeTime"
620
+ />
621
+ </OFormItem>
622
+ <OIconTime />
623
+ </div>
624
+ </OFormItem>
625
+ </div>
626
+ </div>
627
+ </OFormItem>
628
+ <OFormItem :label="t('meeting.meetingPlatform')" field="platform" :rules="rules.platform" class="platform-item">
629
+ <ORadioGroup v-model="form.platform" v-if="!data" :disabled="form.is_cycle">
630
+ <ORadio v-for="item in typeOptions" :key="item.value" :value="item.value">{{ getPlatformLabel(item.label) }}
631
+ </ORadio>
632
+ </ORadioGroup>
633
+ <span v-else>{{ getPlatformLabel(form.platform) }}</span>
634
+ </OFormItem>
635
+ <OFormItem field="agenda" :label="t('meeting.meetingAgenda')" :rules="rules.genda">
636
+ <OTextarea
637
+ :disabled="isSub"
638
+ size="large"
639
+ :placeholder="t('meeting.enterMeetingAgenda')"
640
+ style="width: 100%"
641
+ :rows="4" v-model="form.agenda" />
642
+ </OFormItem>
643
+ <OFormItem :label="t('meeting.meetingRecord')" field="is_record" class="record-item full-width-item">
644
+ <template v-if="lePadV">
645
+ <OSwitch v-model="form.is_record" :disabled="isSub" />
646
+ </template>
647
+ <template v-else>
648
+ <div class="switch-wrapper">
649
+ <OSwitch v-model="form.is_record" :disabled="isSub" />
650
+ <div class="switch-text">
651
+ <OIcon>
652
+ <IconTip />
653
+ </OIcon>
654
+ <span>{{ t('meeting.meetingRecordDesc', [getPlatformLabel(form.platform)]) }}</span>
655
+ </div>
656
+ </div>
657
+ </template>
658
+
659
+ </OFormItem>
660
+ <template v-if="lePadV">
661
+ <div class="switch-wrapper">
662
+ <div class="switch-text">
663
+ <OIcon>
664
+ <IconTip />
665
+ </OIcon>
666
+ <span>{{ t('meeting.meetingRecordDesc', [getPlatformLabel(form.platform)]) }}</span>
667
+ </div>
668
+ </div>
669
+ </template>
670
+ <OFormItem field="email_list" :rules="rules.email_list">
671
+ <template #label>
672
+ <div class="label-wrapper">
673
+ <span>{{ t('meeting.meetingEmail') }}&nbsp;</span>
674
+ <OPopover>
675
+ <div class="o-meeting-form-popover-content">
676
+ {{ t('meeting.meetingEmailDesc') }}
677
+ <a class="link-text" :href="`/${locale}/sig`">{{ t('meeting.sigGroupEmail') }}</a>
678
+ </div>
679
+ <template #target>
680
+ <OIcon>
681
+ <IconHelp />
682
+ </OIcon>
683
+ </template>
684
+ </OPopover>
685
+ </div>
686
+ </template>
687
+ <OTextarea
688
+ :disabled="isEdit"
689
+ size="large"
690
+ :placeholder="t('meeting.enterEmail')"
691
+ style="width: 100%"
692
+ :rows="4"
693
+ v-model="form.email_list" />
694
+ </OFormItem>
695
+ </OForm>
696
+ <div class="form-btns" v-if="showBtns">
697
+ <OButton color="primary" variant="solid" size="large" @click="confirm" :loading="loading">
698
+ {{ isEdit ? t('common.save') : (bookText || t('meeting.book')) }}
699
+ </OButton>
700
+ <OButton color="primary" variant="outline" size="large" @click="cancel">{{ t('common.cancel') }}</OButton>
701
+ </div>
702
+ </div>
703
+ </template>
704
+
705
+ <style lang="scss">
706
+ .o-meeting-form {
707
+ .form-wrapper {
708
+ & > .o-form-item {
709
+ max-width: 592px;
710
+ }
711
+
712
+ .repeat-row,
713
+ .full-width-item {
714
+ width: 100%;
715
+ }
716
+ }
717
+
718
+ .o-form {
719
+ --o-input-color: var(--o-color-info2);
720
+ --o-placeholder-color: var(--o-color-info4);
721
+
722
+
723
+ &.o-form-layout-v {
724
+ --form-item-gap: var(--o-gap-3);
725
+
726
+ .o-form-item-label {
727
+ margin-bottom: var(--o-gap-2);
728
+ }
729
+
730
+ .o-form-item-main {
731
+ margin-left: 0;
732
+ }
733
+ }
734
+
735
+ .o-textarea {
736
+ --_box-radius: var(--o-radius-xs);
737
+ }
738
+
739
+ input,
740
+ textarea {
741
+ color: var(--o-input-color);
742
+ @include text1;
743
+
744
+ &::placeholder {
745
+ color: var(--o-placeholder-color);
746
+ }
747
+ }
748
+
749
+ .o-select {
750
+ --select-bd-color: var(--o-color-control1);
751
+ --select-bd-color-hover: var(--o-color-primary2);
752
+ --select-bd-color-focus: var(--o-color-primary3);
753
+ --select-bd-color-disabled: var(--o-color-control4);
754
+ }
755
+
756
+ .o-form-item-label {
757
+ flex: 0 0 100px;
758
+ height: var(--o-control_size-l);
759
+ display: flex;
760
+ align-items: center;
761
+ --form-label-gap-top: 0;
762
+ color: var(--o-color-info2);
763
+ @include respond-to('<=pad_v') {
764
+ height: fit-content;
765
+ @include text2;
766
+ }
767
+ }
768
+
769
+ .o-form-item-main {
770
+ margin-left: var(--o-gap-3);
771
+ }
772
+
773
+ .platform-item {
774
+ align-items: center;
775
+
776
+ .o-form-item-main-wrap {
777
+ @include respond-to('<=pad_v') {
778
+ @include text2;
779
+ }
780
+ }
781
+ }
782
+ .record-item {
783
+ @include respond-to('<=pad_v') {
784
+ display: flex;
785
+ align-items: center;
786
+ justify-content: space-between;
787
+ --form-item-gap: var(--o-gap-2);
788
+ }
789
+
790
+ .o-form-item-label {
791
+ margin: 0;
792
+ align-items: flex-start;
793
+ }
794
+
795
+ .o-form-item-main {
796
+ @include respond-to('<=pad_v') {
797
+ flex-grow: 0;
798
+ }
799
+ }
800
+ }
801
+
802
+ .switch-wrapper {
803
+ display: flex;
804
+ align-items: flex-start;
805
+ column-gap: var(--o-gap-4);
806
+ row-gap: var(--o-gap-2);
807
+
808
+ @include respond-to('<=pad_v') {
809
+ margin-bottom: var(--o-gap-3);
810
+ flex-direction: column;
811
+ align-items: flex-start;
812
+ }
813
+
814
+ .switch-text {
815
+ display: flex;
816
+ align-items: flex-start;
817
+ column-gap: var(--o-gap-1);
818
+ color: var(--o-color-info3);
819
+ @include tip1;
820
+
821
+ .o-icon {
822
+ font-size: 16px;
823
+ position: relative;
824
+ top: 2px;
825
+
826
+ svg path {
827
+ fill: currentColor;
828
+ }
829
+ }
830
+ }
831
+ }
832
+
833
+ input::placeholder {
834
+ @include text1;
835
+ }
836
+
837
+ .label-wrapper {
838
+ display: flex;
839
+ align-items: center;
840
+
841
+ .o-svg-icon {
842
+ font-size: 1.5em;
843
+ }
844
+
845
+ svg path {
846
+ fill: currentColor;
847
+ }
848
+ }
849
+ }
850
+
851
+ .form-btns {
852
+ margin-top: var(--o-gap-5);
853
+ display: flex;
854
+ align-items: center;
855
+
856
+ .o-btn {
857
+ height: 40px !important;
858
+ font-size: 16px !important;
859
+ line-height: 24px !important;
860
+ border-radius: 20px !important;
861
+ --btn-min-width: 90px;
862
+ }
863
+ }
864
+
865
+ .time-select-wrapper {
866
+ width: 100%;
867
+ display: flex;
868
+ align-items: center;
869
+ border: 1px solid var(--o-color-control1);
870
+ border-radius: var(--o-radius-xs);
871
+ padding: 0 15px;
872
+ background-color: var(--o-color-fill2);
873
+
874
+ & > span {
875
+ padding: 0 var(--o-gap-2);
876
+ }
877
+
878
+ &:hover {
879
+ border-color: var(--o-color-primary2);
880
+ }
881
+
882
+ @include respond-to('phone') {
883
+ background-color: var(--o-color-fill2);
884
+ }
885
+
886
+ .o-form-item {
887
+ margin-bottom: 0;
888
+ flex-grow: 1;
889
+ --o-input-color: var(--o-color-info1);
890
+
891
+ .o-form-item-label {
892
+ display: none;
893
+ }
894
+
895
+ .el-select__wrapper {
896
+ box-shadow: none;
897
+ padding: calc((var(--o-control_size-l) - 24px) / 2) 0;
898
+ min-height: var(--o-control_size-l);
899
+ gap: 0;
900
+ }
901
+
902
+ .el-select__placeholder {
903
+ @include text1;
904
+ }
905
+
906
+ .el-select__caret,
907
+ .el-input__prefix-icon {
908
+ display: none;
909
+ }
910
+
911
+ div.o-form-item-main {
912
+ margin-left: 0;
913
+ @include respond-to('phone') {
914
+ margin-top: 0;
915
+ }
916
+ }
917
+ }
918
+
919
+ .o-svg-icon {
920
+ flex-shrink: 0;
921
+ font-size: 24px;
922
+ color: var(--o-color-info2);
923
+ }
924
+ }
925
+
926
+ @include respond-to('phone') {
927
+ width: auto;
928
+ .o-form {
929
+ .o-form-item-main {
930
+ margin-left: 0;
931
+ }
932
+ }
933
+ }
934
+
935
+ .repeat-config-wrapper {
936
+ width: 100%;
937
+
938
+ .repeat-item {
939
+ .o-form-item-label {
940
+ display: none;
941
+ }
942
+
943
+ .o-form-item-main {
944
+ margin-left: 0;
945
+ }
946
+
947
+ @include respond-to('pad_v') {
948
+ margin-bottom: var(--o-gap-4);
949
+ }
950
+ @include respond-to('phone') {
951
+ margin-bottom: var(--o-gap-3);
952
+ }
953
+ }
954
+
955
+ .repeat-config {
956
+ background-color: color-mix(in srgb, var(--o-color-control2-light) 40%, transparent);
957
+ padding: var(--o-gap-5);
958
+ border-radius: var(--o-radius-xs);
959
+ @include respond-to('<=pad_v') {
960
+ padding: var(--o-gap-4);
961
+ }
962
+
963
+ .o-form-item {
964
+ align-items: center;
965
+ }
966
+
967
+ .o-form-item-label {
968
+ .o-form-require-symbol {
969
+ display: none;
970
+ }
971
+
972
+ flex: 0 0 4em;
973
+ }
974
+
975
+ .o-form-item-main {
976
+ margin-left: var(--o-gap-6);
977
+ @include respond-to('pad_v') {
978
+ margin-left: 0;
979
+ }
980
+ @include respond-to('phone') {
981
+ margin-left: 0;
982
+ max-width: 100%;
983
+ }
984
+ }
985
+
986
+ .full-width-item {
987
+ .o-form-item-main {
988
+ max-width: 100%;
989
+ }
990
+ }
991
+
992
+ .repeat-config-item {
993
+ width: 100%;
994
+ display: flex;
995
+ flex-wrap: nowrap;
996
+ align-items: center;
997
+ gap: var(--o-gap-4);
998
+
999
+ .o-form-item {
1000
+ margin-bottom: 0;
1001
+ width: calc(50% - var(--o-gap-4) / 2);
1002
+
1003
+ .o-form-item-label {
1004
+ display: none;
1005
+ }
1006
+
1007
+ .o-form-item-main {
1008
+ margin-left: 0;
1009
+ }
1010
+ }
1011
+ }
1012
+
1013
+ .point-item {
1014
+ .o-select {
1015
+ width: 100%;
1016
+ }
1017
+ }
1018
+ }
1019
+ }
1020
+ }
1021
+ </style>
1022
+
1023
+ <style lang="scss">
1024
+ .meeting-form-time-popover, .o-meeting-form-date-picker-popper {
1025
+ --el-color-primary: var(--o-color-primary1);
1026
+ --el-datepicker-active-color: var(--o-color-primary1);
1027
+ --el-fill-color-light: var(--o-color-control2-light);
1028
+ --el-input-bg-color: var(--o-color-control-light);
1029
+ --el-fill-color-blank: var(--o-color-control-light);
1030
+ }
1031
+
1032
+ .o-meeting-form-popover-content {
1033
+ max-width: 256px;
1034
+ text-align: left;
1035
+ @include tip1;
1036
+
1037
+ &.etherpad {
1038
+ width: 191px;
1039
+ }
1040
+
1041
+ .link-text {
1042
+ color: var(--o-color-primary1);
1043
+ cursor: pointer;
1044
+ }
1045
+ }
1046
+
1047
+ .o-meeting-form-interval-select-options {
1048
+ .o-option-item {
1049
+ justify-content: center;
1050
+ }
1051
+ }
1052
+
1053
+ .o-meeting-form-date-picker-popper {
1054
+ @include respond-to('phone') {
1055
+ .el-picker-panel {
1056
+ width: min(var(--grid-content-width), 400px);
1057
+
1058
+ .el-picker-panel__body {
1059
+ display: flex;
1060
+ flex-direction: column;
1061
+ min-width: auto;
1062
+
1063
+ .el-picker-panel__content {
1064
+ border-right: none;
1065
+ width: 100%;
1066
+ padding: 12px 16px;
1067
+ }
1068
+ }
1069
+ }
1070
+ }
1071
+ }
1072
+ </style>