@opendesign-plus/components 0.0.1-rc.3 → 0.0.1-rc.31

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