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

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