@opendesign-plus/components 0.0.1-rc.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -0
  2. package/dist/chunk-OElCookieNotice.es.js +833 -0
  3. package/dist/components/OBanner.vue.d.ts +11 -0
  4. package/dist/components/OCookieNotice.vue.d.ts +17 -0
  5. package/dist/components/OFooter.vue.d.ts +46 -0
  6. package/dist/components/OHeaderSearch.vue.d.ts +692 -0
  7. package/dist/components/OHeaderUser.vue.d.ts +38 -0
  8. package/dist/components/OPlusConfigProvider.vue.d.ts +23 -0
  9. package/dist/components/OSection.vue.d.ts +37 -0
  10. package/dist/components/OSourceCode.vue.d.ts +20 -0
  11. package/dist/components/OThemeSwitcher.vue.d.ts +28 -0
  12. package/dist/components/activity/OActivityApproval.vue.d.ts +277 -0
  13. package/dist/components/activity/OActivityForm.vue.d.ts +140 -0
  14. package/dist/components/activity/OMyActivityCalendar.vue.d.ts +578 -0
  15. package/dist/components/activity/config.d.ts +15 -0
  16. package/dist/components/activity/index.d.ts +623 -0
  17. package/dist/components/activity/types.d.ts +81 -0
  18. package/dist/components/element-plus/OElCookieNotice.vue.d.ts +34 -0
  19. package/dist/components/element-plus/index.d.ts +2 -0
  20. package/dist/components/events/OEventsApply.vue.d.ts +16 -0
  21. package/dist/components/events/OEventsCalendar.vue.d.ts +5 -0
  22. package/dist/components/events/OEventsList.vue.d.ts +26 -0
  23. package/dist/components/events/config.d.ts +27 -0
  24. package/dist/components/events/index.d.ts +78 -0
  25. package/dist/components/events/types.d.ts +66 -0
  26. package/dist/components/events/utils.d.ts +7 -0
  27. package/dist/components/header/OHeader.vue.d.ts +24 -0
  28. package/dist/components/header/OHeaderMoblie.vue.d.ts +33 -0
  29. package/dist/components/header/components/HeaderContent.vue.d.ts +6 -0
  30. package/dist/components/header/components/HeaderNav.vue.d.ts +7 -0
  31. package/dist/components/header/components/HeaderNavMoblie.vue.d.ts +17 -0
  32. package/dist/components/header/components/HeaderUbmcNav.vue.d.ts +2 -0
  33. package/dist/components/header/index.d.ts +22 -0
  34. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +298 -0
  35. package/dist/components/meeting/OMeetingForm.vue.d.ts +145 -0
  36. package/dist/components/meeting/OMyMeetingCalendar.vue.d.ts +586 -0
  37. package/dist/components/meeting/OSigMeetingCalendar.vue.d.ts +24 -0
  38. package/dist/components/meeting/components/OMeetingCalendarList.vue.d.ts +28 -0
  39. package/dist/components/meeting/components/OMeetingCalendarSelector.vue.d.ts +664 -0
  40. package/dist/components/meeting/components/OMeetingDetail.vue.d.ts +12 -0
  41. package/dist/components/meeting/components/OMeetingPlaybackSubtitles.vue.d.ts +5 -0
  42. package/dist/components/meeting/components/OMeetingPlaybackVideo.vue.d.ts +17 -0
  43. package/dist/components/meeting/components/OSigMeetingAside.vue.d.ts +16 -0
  44. package/dist/components/meeting/config.d.ts +27 -0
  45. package/dist/components/meeting/types.d.ts +166 -0
  46. package/dist/components/meeting/utils.d.ts +22 -0
  47. package/dist/components.cjs.js +224 -0
  48. package/dist/components.css +1 -0
  49. package/dist/components.element.cjs.js +1 -0
  50. package/dist/components.element.es.js +4 -0
  51. package/dist/components.es.js +45054 -0
  52. package/dist/index.d.ts +19 -0
  53. package/docs/design.md +27 -0
  54. package/docs/design_banner.md +41 -0
  55. package/docs/design_section.md +27 -0
  56. package/package.json +56 -0
  57. package/scripts/generate-components-index.js +104 -0
  58. package/src/assets/events/svg-icons/icon-checked.svg +3 -0
  59. package/src/assets/events/svg-icons/icon-competition.svg +7 -0
  60. package/src/assets/events/svg-icons/icon-events.svg +4 -0
  61. package/src/assets/events/svg-icons/icon-release.svg +4 -0
  62. package/src/assets/events/svg-icons/icon-summit.svg +4 -0
  63. package/src/assets/meeting/svg-icons/icon-all.svg +3 -0
  64. package/src/assets/meeting/svg-icons/icon-backward.svg +4 -0
  65. package/src/assets/meeting/svg-icons/icon-calendar.svg +3 -0
  66. package/src/assets/meeting/svg-icons/icon-cancel.svg +4 -0
  67. package/src/assets/meeting/svg-icons/icon-captions.svg +4 -0
  68. package/src/assets/meeting/svg-icons/icon-close-captions.svg +6 -0
  69. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +6 -0
  70. package/src/assets/meeting/svg-icons/icon-copy.svg +3 -0
  71. package/src/assets/meeting/svg-icons/icon-create.svg +5 -0
  72. package/src/assets/meeting/svg-icons/icon-delete.svg +7 -0
  73. package/src/assets/meeting/svg-icons/icon-empty.svg +31 -0
  74. package/src/assets/meeting/svg-icons/icon-empty_dark.svg +49 -0
  75. package/src/assets/meeting/svg-icons/icon-event.svg +3 -0
  76. package/src/assets/meeting/svg-icons/icon-export.svg +3 -0
  77. package/src/assets/meeting/svg-icons/icon-forward.svg +4 -0
  78. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +6 -0
  79. package/src/assets/meeting/svg-icons/icon-help.svg +3 -0
  80. package/src/assets/meeting/svg-icons/icon-important.svg +4 -0
  81. package/src/assets/meeting/svg-icons/icon-info.svg +3 -0
  82. package/src/assets/meeting/svg-icons/icon-meet.svg +3 -0
  83. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +5 -0
  84. package/src/assets/meeting/svg-icons/icon-meeting.svg +4 -0
  85. package/src/assets/meeting/svg-icons/icon-play.svg +5 -0
  86. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +7 -0
  87. package/src/assets/meeting/svg-icons/icon-playing.svg +5 -0
  88. package/src/assets/meeting/svg-icons/icon-question.svg +4 -0
  89. package/src/assets/meeting/svg-icons/icon-sound.svg +5 -0
  90. package/src/assets/meeting/svg-icons/icon-speaker.svg +3 -0
  91. package/src/assets/meeting/svg-icons/icon-summit.svg +3 -0
  92. package/src/assets/meeting/svg-icons/icon-telligent.svg +3 -0
  93. package/src/assets/meeting/svg-icons/icon-tip.svg +3 -0
  94. package/src/assets/meeting/svg-icons/icon-todo.svg +4 -0
  95. package/src/assets/meeting/transparent.png +0 -0
  96. package/src/assets/svg-icons/icon-arrow-left.svg +3 -0
  97. package/src/assets/svg-icons/icon-avatar-line.svg +3 -0
  98. package/src/assets/svg-icons/icon-caret-left.svg +3 -0
  99. package/src/assets/svg-icons/icon-caret-right.svg +3 -0
  100. package/src/assets/svg-icons/icon-chevron-down.svg +3 -0
  101. package/src/assets/svg-icons/icon-chevron-right.svg +3 -0
  102. package/src/assets/svg-icons/icon-chevron-up.svg +3 -0
  103. package/src/assets/svg-icons/icon-close.svg +3 -0
  104. package/src/assets/svg-icons/icon-delete.svg +3 -0
  105. package/src/assets/svg-icons/icon-filter.svg +3 -0
  106. package/src/assets/svg-icons/icon-header-back.svg +3 -0
  107. package/src/assets/svg-icons/icon-header-delete.svg +3 -0
  108. package/src/assets/svg-icons/icon-header-menu.svg +3 -0
  109. package/src/assets/svg-icons/icon-header-person.svg +3 -0
  110. package/src/assets/svg-icons/icon-header-search.svg +4 -0
  111. package/src/assets/svg-icons/icon-loading.svg +4 -0
  112. package/src/assets/svg-icons/icon-locale.svg +3 -0
  113. package/src/assets/svg-icons/icon-log-off.svg +3 -0
  114. package/src/assets/svg-icons/icon-message.svg +3 -0
  115. package/src/assets/svg-icons/icon-moon.svg +3 -0
  116. package/src/assets/svg-icons/icon-outlink.svg +3 -0
  117. package/src/assets/svg-icons/icon-overview.svg +3 -0
  118. package/src/assets/svg-icons/icon-search.svg +3 -0
  119. package/src/assets/svg-icons/icon-setting.svg +3 -0
  120. package/src/assets/svg-icons/icon-sun.svg +3 -0
  121. package/src/assets/svg-icons/icon-tips.svg +3 -0
  122. package/src/components/OBanner.vue +398 -0
  123. package/src/components/OCookieNotice.vue +575 -0
  124. package/src/components/OFooter.vue +576 -0
  125. package/src/components/OHeaderSearch.vue +601 -0
  126. package/src/components/OHeaderUser.vue +237 -0
  127. package/src/components/OPlusConfigProvider.vue +32 -0
  128. package/src/components/OSection.vue +178 -0
  129. package/src/components/OSourceCode.vue +153 -0
  130. package/src/components/OThemeSwitcher.vue +108 -0
  131. package/src/components/activity/OActivityApproval.vue +871 -0
  132. package/src/components/activity/OActivityForm.vue +548 -0
  133. package/src/components/activity/OMyActivityCalendar.vue +1501 -0
  134. package/src/components/activity/config.ts +141 -0
  135. package/src/components/activity/index.ts +24 -0
  136. package/src/components/activity/types.ts +88 -0
  137. package/src/components/common/AppAvatar.vue +83 -0
  138. package/src/components/common/ClientOnlyWrapper.ts +21 -0
  139. package/src/components/common/ContentWrapper.vue +85 -0
  140. package/src/components/common/MoreText.vue +124 -0
  141. package/src/components/common/ThFilter.vue +330 -0
  142. package/src/components/element-plus/OElCookieNotice.vue +603 -0
  143. package/src/components/element-plus/index.ts +3 -0
  144. package/src/components/events/OEventsApply.vue +419 -0
  145. package/src/components/events/OEventsCalendar.vue +588 -0
  146. package/src/components/events/OEventsList.vue +354 -0
  147. package/src/components/events/config.ts +35 -0
  148. package/src/components/events/index.ts +24 -0
  149. package/src/components/events/types.ts +80 -0
  150. package/src/components/events/utils.ts +9 -0
  151. package/src/components/header/OHeader.vue +175 -0
  152. package/src/components/header/OHeaderMoblie.vue +152 -0
  153. package/src/components/header/components/HeaderContent.vue +942 -0
  154. package/src/components/header/components/HeaderNav.vue +280 -0
  155. package/src/components/header/components/HeaderNavMoblie.vue +346 -0
  156. package/src/components/header/components/HeaderUbmcNav.vue +540 -0
  157. package/src/components/header/index.ts +16 -0
  158. package/src/components/meeting/OMeetingCalendar.vue +900 -0
  159. package/src/components/meeting/OMeetingForm.vue +1041 -0
  160. package/src/components/meeting/OMeetingPlayback.vue +439 -0
  161. package/src/components/meeting/OMyMeetingCalendar.vue +1502 -0
  162. package/src/components/meeting/OSigMeetingCalendar.vue +411 -0
  163. package/src/components/meeting/components/OMeetingCalendarList.vue +505 -0
  164. package/src/components/meeting/components/OMeetingCalendarSelector.vue +206 -0
  165. package/src/components/meeting/components/OMeetingDetail.vue +227 -0
  166. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +611 -0
  167. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +741 -0
  168. package/src/components/meeting/components/OSigMeetingAside.vue +197 -0
  169. package/src/components/meeting/config.ts +121 -0
  170. package/src/components/meeting/index.ts +45 -0
  171. package/src/components/meeting/types.ts +193 -0
  172. package/src/components/meeting/utils.ts +123 -0
  173. package/src/draft/Banner.vue +265 -0
  174. package/src/draft/ButtonCards.vue +106 -0
  175. package/src/draft/Feature.vue +134 -0
  176. package/src/draft/Footer.vue +512 -0
  177. package/src/draft/HorizontalAnchor.vue +165 -0
  178. package/src/draft/ItemSwiper.vue +133 -0
  179. package/src/draft/Logo.vue +141 -0
  180. package/src/draft/LogoCard.vue +75 -0
  181. package/src/draft/LogoV2.vue +19 -0
  182. package/src/draft/MainCard.vue +38 -0
  183. package/src/draft/MultiCard.vue +95 -0
  184. package/src/draft/MultiIconCard.vue +74 -0
  185. package/src/draft/OInfoCard.vue +176 -0
  186. package/src/draft/Process.vue +81 -0
  187. package/src/draft/Section.vue +167 -0
  188. package/src/draft/SingleTabCard.vue +85 -0
  189. package/src/draft/SliderCard.vue +110 -0
  190. package/src/env.d.ts +16 -0
  191. package/src/i18n/en.ts +261 -0
  192. package/src/i18n/index.ts +56 -0
  193. package/src/i18n/zh.ts +250 -0
  194. package/src/index.ts +45 -0
  195. package/src/shared/provide.ts +6 -0
  196. package/src/shims-vue-dompurify-html.d.ts +17 -0
  197. package/src/vue.d.ts +10 -0
  198. package/tsconfig.json +37 -0
  199. package/vite.config.ts +118 -0
@@ -0,0 +1,548 @@
1
+ <script setup lang="ts">
2
+
3
+ import {
4
+ OButton,
5
+ OForm,
6
+ OFormItem,
7
+ OInput,
8
+ OOption,
9
+ OSelect,
10
+ OTextarea,
11
+ RulesT, SelectValueT,
12
+ useMessage,
13
+ } from '@opensig/opendesign';
14
+ import { computed, ref, watch } from 'vue';
15
+ import { ActivityFormPropsT, ParamsItemT } from './types';
16
+ import { useScreen } from '@opendesign-plus/composables';
17
+ import { dayjs, ElDatePicker } from 'element-plus';
18
+ import { getActicityTypeMap, WEBSITE_REGEXP } from './config';
19
+ import { EMAIL_REGEX } from '@/components/meeting/config.ts';
20
+ import { useI18n } from '@/i18n';
21
+
22
+ const emits = defineEmits(['confirm', 'close']);
23
+
24
+ const message = useMessage(null);
25
+ const { lePadV } = useScreen();
26
+ const { t } = useI18n();
27
+ const $t = t;
28
+ const acticityTypeMap = getActicityTypeMap();
29
+
30
+ interface TypeOptionT {
31
+ label: string;
32
+ value: number;
33
+ }
34
+
35
+ const props = withDefaults(defineProps<ActivityFormPropsT>(), {});
36
+ const isEdit = computed(() => !!props.data);
37
+ const form = ref<ParamsItemT>({
38
+ title: '',
39
+ organizer: '',
40
+ start_date: '',
41
+ end_date: '',
42
+ register_end_date: '',
43
+ activity_type: '',
44
+ synopsis: '',
45
+ register_url: '',
46
+ content_url: '',
47
+ address: '',
48
+ start: '',
49
+ end: '',
50
+ is_publish: 'true',
51
+ email_list: '',
52
+ approver: '',
53
+ });
54
+
55
+ const formRef = ref(); // 表单实例
56
+ const loading = ref(false); // 提交状态
57
+
58
+
59
+ // 表单校验规则
60
+ const rules = ref<Record<string, RulesT[]>>({
61
+ title: [
62
+ { required: true, message: t('meeting.enterActivityName') },
63
+ {
64
+ validator: (value: string) => {
65
+ if (value.length > 50) {
66
+ return {
67
+ type: 'danger',
68
+ message: t('meeting.activityNameMaxLength'),
69
+ };
70
+ }
71
+ },
72
+ },
73
+ ],
74
+ activity_type: [{ required: true, message: t('meeting.selectActivityType') }],
75
+ organizer: [{ required: true, message: t('meeting.selectActivityOrganizer') }],
76
+ start_date: [
77
+ { required: true, message: t('meeting.selectActivityTime') },
78
+ {
79
+ validator: () => {
80
+ const { start_date, end_date } = form.value;
81
+ const startDate = start_date.split(' ');
82
+ const endDate = end_date.split(' ');
83
+ if (!start_date || !end_date) {
84
+ return {
85
+ type: 'danger',
86
+ message: t('meeting.selectActivityDate'),
87
+ };
88
+ }
89
+
90
+ const startArr = startDate[1].split(':').map(Number);
91
+ const endArr = endDate[1].split(':').map(Number);
92
+ if (startArr[0] < 8 || startArr[0] > 21 || endArr[0] < 8 || endArr[0] > 21) {
93
+ return {
94
+ type: 'danger',
95
+ message: t('meeting.activityTimeRange'),
96
+ };
97
+ }
98
+
99
+ if (dayjs(start_date).valueOf() > dayjs(end_date).valueOf()) {
100
+ return {
101
+ type: 'danger',
102
+ message: t('meeting.endDateAfterStartDate'),
103
+ };
104
+ }
105
+
106
+ form.value.start_date = startDate[0];
107
+ form.value.end_date = endDate[0];
108
+ form.value.start = startDate[1];
109
+ form.value.end = endDate[1];
110
+ },
111
+ triggers: ['blur', 'change'],
112
+ },
113
+ ],
114
+ register_end_date: [
115
+ {
116
+ validator: () => {
117
+ const { register_end_date, end_date, end } = form.value;
118
+ if (register_end_date && dayjs(`${ end_date } ${ end }`).valueOf() < dayjs(register_end_date).valueOf()) {
119
+ return {
120
+ type: 'danger',
121
+ message: t('meeting.registerDeadlineBeforeEnd'),
122
+ };
123
+ }
124
+ },
125
+ triggers: ['blur', 'change'],
126
+ },
127
+ ],
128
+ address: [
129
+ { required: true, message: t('meeting.enterActivityAddress') },
130
+ {
131
+ validator: (value: string) => {
132
+ if (value.length > 255) {
133
+ return {
134
+ type: 'danger',
135
+ message: t('meeting.activityAddressMaxLength'),
136
+ };
137
+ }
138
+ },
139
+ },
140
+ ],
141
+ register_url: [
142
+ {
143
+ validator: (value: string) => {
144
+ const str = value.replaceAll(' ', '') || '';
145
+ if (str.length) {
146
+ const list = str.split(';') || [];
147
+ if (list.some((v) => !WEBSITE_REGEXP.test(v))) {
148
+ return {
149
+ type: 'danger',
150
+ message: t('meeting.invalidRegistrationUrl'),
151
+ };
152
+ }
153
+ }
154
+ },
155
+ triggers: ['blur', 'change'],
156
+ },
157
+ ],
158
+ content_url: [
159
+ {
160
+ validator: (value: string) => {
161
+ const str = value.replaceAll(' ', '') || '';
162
+ if (str.length) {
163
+ const list = str.split(';') || [];
164
+ if (list.some((v) => !WEBSITE_REGEXP.test(v))) {
165
+ return {
166
+ type: 'danger',
167
+ message: t('meeting.invalidActivityDetailUrl'),
168
+ };
169
+ }
170
+ }
171
+ },
172
+ triggers: ['blur', 'change'],
173
+ },
174
+ ],
175
+ synopsis: [{
176
+ validator: (value: string) => {
177
+ if (value.length > 1000) {
178
+ return {
179
+ type: 'danger',
180
+ message: t('meeting.activityContentMaxLength'),
181
+ };
182
+ }
183
+ },
184
+ }],
185
+ email_list: [{
186
+ validator: (value: string) => {
187
+ const str = value.replaceAll(' ', '').replaceAll(',', ';') || '';
188
+ if (str.length) {
189
+ if (str.length > 1020) {
190
+ return {
191
+ type: 'danger',
192
+ message: t('meeting.emailTooLong'),
193
+ };
194
+ }
195
+ const list = str.split(';') || [];
196
+ if (list.some((v) => !EMAIL_REGEX.test(v))) {
197
+ return {
198
+ type: 'danger',
199
+ message: t('meeting.emailInvalid'),
200
+ };
201
+ }
202
+ if (list.some((v) => v.length > 50)) {
203
+ return {
204
+ type: 'danger',
205
+ message: t('meeting.singleEmailTooLong'),
206
+ };
207
+ }
208
+ if (list.length > 20) {
209
+ return {
210
+ type: 'danger',
211
+ message: t('meeting.emailCountTooLong'),
212
+ };
213
+ }
214
+ }
215
+ },
216
+ triggers: ['blur', 'change'],
217
+ }],
218
+ approver: [{ required: true, message: t('meeting.selectActivityApprover') }],
219
+ });
220
+
221
+
222
+ // -------------------- 活动管理员 ---------------------
223
+ const approverList = computed(() => {
224
+ return props.admins || [];
225
+ });
226
+
227
+ const typeValue = ref<string>('');
228
+ const typeOptions = ref<TypeOptionT[]>([]); // 活动类型
229
+ acticityTypeMap.forEach((item) => {
230
+ typeOptions.value.push(item);
231
+ });
232
+ const changeType = (val: SelectValueT) => {
233
+ const item = typeOptions.value.find((v) => v.label === val);
234
+ form.value.activity_type = item?.value as number;
235
+ };
236
+
237
+ const disabledDate = (date: Date) => {
238
+ return date.getTime() < Date.now() - 24 * 60 * 60 * 1000;
239
+ };
240
+
241
+ watch(
242
+ () => props.data,
243
+ (val) => {
244
+ if (val) {
245
+ const {
246
+ title,
247
+ start_date,
248
+ end_date,
249
+ register_end_date,
250
+ activity_type,
251
+ register_url,
252
+ content_url,
253
+ address,
254
+ start,
255
+ end,
256
+ is_publish,
257
+ approver,
258
+ update_activity_id,
259
+ synopsis,
260
+ email_list,
261
+ organizer,
262
+ } = val;
263
+ let params = {
264
+ title,
265
+ start_date,
266
+ end_date,
267
+ register_end_date,
268
+ activity_type,
269
+ register_url,
270
+ content_url,
271
+ address,
272
+ start,
273
+ end,
274
+ is_publish,
275
+ approver,
276
+ update_activity_id,
277
+ synopsis,
278
+ email_list,
279
+ organizer,
280
+ } as ParamsItemT;
281
+ form.value = { ...params };
282
+ typeValue.value = acticityTypeMap.get(val.activity_type)?.label;
283
+ form.value.start_date = `${ form.value.start_date } ${ form.value.start }`;
284
+ form.value.end_date = `${ form.value.end_date } ${ form.value.end }`;
285
+ }
286
+ },
287
+ { immediate: true, deep: true },
288
+ );
289
+
290
+ const confirm = async (val: boolean) => {
291
+ let type = isEdit.value ? t('meeting.modifyActivity') : val ? t('meeting.create') : t('meeting.saveDraft');
292
+ try {
293
+ const valid = await formRef.value?.validate();
294
+ if (valid.some((v) => !!v)) {
295
+ return;
296
+ }
297
+ loading.value = true;
298
+ form.value.is_publish = `${ val }`;
299
+ if (isEdit.value && props.data?.status === 3) {
300
+ form.value.update_activity_id = props.data?.id;
301
+ await props.creatActivity?.(form.value);
302
+ } else if (isEdit.value) {
303
+ await props.editActivity?.(props.data?.id, form.value);
304
+ } else {
305
+ await props.creatActivity?.(form.value);
306
+ }
307
+ message.success({
308
+ content: t('meeting.activityActionSuccess', [form.value.title, type.toLowerCase]),
309
+ });
310
+ close();
311
+ emits('confirm');
312
+ } catch {
313
+ loading.value = false;
314
+ form.value.start_date = `${ form.value.start_date } ${ form.value.start }`;
315
+ form.value.end_date = `${ form.value.end_date } ${ form.value.end }`;
316
+ message.danger({
317
+ content: t('meeting.activityActionFail', [form.value.title, type.toLowerCase]),
318
+ });
319
+ } finally {
320
+ loading.value = false;
321
+ }
322
+ };
323
+ const close = () => {
324
+ form.value = {} as ParamsItemT;
325
+ emits('close');
326
+ };
327
+
328
+
329
+ defineExpose({
330
+ confirm,
331
+ });
332
+ </script>
333
+
334
+ <template>
335
+ <div class="o-activity-form">
336
+ <OForm
337
+ :model="form"
338
+ ref="formRef"
339
+ has-required
340
+ label-width="108px"
341
+ :layout="lePadV ? 'v' : 'h'"
342
+ class="form-wrapper"
343
+ >
344
+ <OFormItem :rules="rules.title" :label="t('meeting.activityName')" field="title">
345
+ <OInput size="large" :placeholder="t('meeting.enterActivityName')" v-model="form.title" />
346
+ </OFormItem>
347
+ <OFormItem :rules="rules.organizer" :label="t('meeting.activityOrganizer')" field="organizer">
348
+ <OSelect :placeholder="t('meeting.selectActivityOrganizer')" size="large" v-model="form.organizer">
349
+ <OOption v-for="t in organizers" :key="t.name" :value="t.name">{{ t.name }}</OOption>
350
+ </OSelect>
351
+ </OFormItem>
352
+ <OFormItem :rules="rules.activity_type" :label="t('meeting.activityType')" field="activity_type">
353
+ <OSelect :placeholder="t('meeting.selectActivityType')" size="large" v-model="typeValue" @change="changeType">
354
+ <OOption v-for="t in typeOptions" :key="t.value" :value="t.label">{{ t.label }}</OOption>
355
+ </OSelect>
356
+ </OFormItem>
357
+ <OFormItem
358
+ v-if="form.activity_type === 1 || form.activity_type === 3"
359
+ :rules="rules.address"
360
+ :label="t('meeting.activityAddress')"
361
+ field="address"
362
+ >
363
+ <OInput size="large" :placeholder="t('meeting.enterActivityAddress')" v-model="form.address" />
364
+ </OFormItem>
365
+ <OFormItem :rules="rules.start_date" :label="t('meeting.activityTime')" field="start_date" required>
366
+ <div class="time-config">
367
+ <OFormItem :label="t('meeting.startDate')" field="start_date">
368
+ <ElDatePicker
369
+ size="large"
370
+ v-model="form.start_date"
371
+ type="datetime"
372
+ :placeholder="t('meeting.selectDate')"
373
+ format="YYYY/MM/DD HH:mm"
374
+ value-format="YYYY-MM-DD HH:mm"
375
+ :disabled-date="disabledDate"
376
+ :clearable="false"
377
+ class="date-activity"
378
+ />
379
+ </OFormItem>
380
+ <OFormItem :label="t('meeting.endDate')" field="end_date">
381
+ <ElDatePicker
382
+ size="large"
383
+ v-model="form.end_date"
384
+ type="datetime"
385
+ :placeholder="t('meeting.selectDate')"
386
+ format="YYYY/MM/DD HH:mm"
387
+ value-format="YYYY-MM-DD HH:mm"
388
+ :disabled-date="disabledDate"
389
+ :clearable="false"
390
+ class="date-activity"
391
+ />
392
+ </OFormItem>
393
+ </div>
394
+ </OFormItem>
395
+ <OFormItem :rules="rules.register_end_date" :label="t('meeting.registrationDeadline')" field="register_end_date">
396
+ <ElDatePicker
397
+ size="large"
398
+ v-model="form.register_end_date"
399
+ type="datetime"
400
+ :placeholder="t('meeting.selectActivityDeadline')"
401
+ format="YYYY/MM/DD HH:mm"
402
+ value-format="YYYY-MM-DD HH:mm"
403
+ :clearable="false"
404
+ class="date-activity"
405
+ />
406
+ </OFormItem>
407
+ <OFormItem :rules="rules.register_url" :label="t('meeting.registrationUrl')" field="register_url">
408
+ <OInput size="large" :placeholder="t('meeting.enterActivityRegistrationUrl')" v-model="form.register_url" />
409
+ </OFormItem>
410
+ <OFormItem :rules="rules.content_url" :label="t('meeting.activityDetailUrl')" field="content_url">
411
+ <OInput size="large" :placeholder="t('meeting.enterActivityDetailUrl')" v-model="form.content_url" />
412
+ </OFormItem>
413
+ <OFormItem :rules="rules.synopsis" :label="t('meeting.activityContent')" field="synopsis">
414
+ <OTextarea size="large" :placeholder="t('meeting.enterActivityContent')" v-model="form.synopsis" />
415
+ </OFormItem>
416
+ <OFormItem field="email_list" :rules="rules.email_list" :label="t('meeting.email')">
417
+ <OTextarea
418
+ :disabled="isEdit"
419
+ size="large"
420
+ :placeholder="$t('meeting.enterEmail')"
421
+ :rows="4"
422
+ v-model="form.email_list" />
423
+ </OFormItem>
424
+ <OFormItem :rules="rules.approver" :label="t('meeting.activityApprover')" field="approver">
425
+ <OSelect :placeholder="t('meeting.selectActivityApprover')" size="large" v-model="form.approver">
426
+ <OOption v-for="t in approverList" :key="t" :value="t">{{ t }}</OOption>
427
+ </OSelect>
428
+ </OFormItem>
429
+ </OForm>
430
+ <div class="form-btns">
431
+ <OButton color="primary" variant="solid" size="large" round="pill" @click="confirm(true)" :loading="loading">
432
+ {{ isEdit ? t('common.save') : t('meeting.create') }}
433
+ </OButton>
434
+ <OButton
435
+ v-if="!isEdit"
436
+ color="primary"
437
+ variant="outline"
438
+ round="pill"
439
+ size="large"
440
+ @click="confirm(false)"
441
+ :loading="loading"
442
+ >
443
+ {{ t('meeting.saveDraft') }}
444
+ </OButton>
445
+ <OButton color="primary" variant="outline" size="large" round="pill" @click="close">{{ t('meeting.cancelBtn') }}
446
+ </OButton>
447
+ </div>
448
+ </div>
449
+ </template>
450
+
451
+ <style lang="scss">
452
+ .o-activity-form {
453
+ .form-wrapper {
454
+ & > .o-form-item {
455
+ max-width: 620px;
456
+ }
457
+ }
458
+
459
+ .o-form {
460
+ --o-input-color: var(--o-color-info2);
461
+ --o-placeholder-color: var(--o-color-info4);
462
+
463
+ &.o-form-layout-h {
464
+ .o-form-item-label {
465
+ height: var(--o-control_size-l);
466
+ margin: 0;
467
+ }
468
+ }
469
+
470
+ &.o-form-layout-v {
471
+ .o-form-item-label {
472
+ margin-bottom: var(--o-gap-2);
473
+ }
474
+
475
+ .o-form-item-main {
476
+ margin-left: 0;
477
+ }
478
+ }
479
+
480
+ .o-select {
481
+ width: 100%;
482
+ }
483
+
484
+ .o-input {
485
+ width: 100%;
486
+ }
487
+
488
+ .o-textarea {
489
+ --_box-radius: var(--o-radius-xs);
490
+ width: 100%;
491
+ }
492
+
493
+ .el-input {
494
+ width: 100%;
495
+ }
496
+
497
+ .el-input__wrapper {
498
+ border-radius: var(--o-radius-xs);
499
+ }
500
+
501
+ .time-config {
502
+ width: 100%;
503
+ background-color: color-mix(in srgb, var(--o-color-control2-light), transparent 60%);
504
+ padding: var(--o-gap-5);
505
+ padding-right: calc(var(--o-gap-4) + var(--o-gap-5));
506
+ border-radius: var(--o-radius-xs);
507
+ @include respond-to('<=pad_v') {
508
+ padding: var(--o-gap-4);
509
+ }
510
+
511
+ .o-form-item {
512
+ align-items: center;
513
+ }
514
+
515
+ .o-form-item-label {
516
+ flex: 0 0 80px;
517
+ }
518
+ }
519
+ }
520
+ }
521
+
522
+ .form-btns {
523
+ margin-top: var(--o-gap-5);
524
+ display: flex;
525
+ align-items: center;
526
+
527
+ .o-btn + .o-btn {
528
+ margin-left: var(--o-gap-4);
529
+ }
530
+
531
+ @include respond-to('<=pad_v') {
532
+ .o-btn {
533
+ --btn-min-width: 74px;
534
+ }
535
+ }
536
+ }
537
+ </style>
538
+ <style lang="scss">
539
+ .date-activity {
540
+ .el-input__inner {
541
+ @include text1;
542
+ }
543
+
544
+ .el-input__inner::placeholder {
545
+ color: var(--o-color-info4);
546
+ }
547
+ }
548
+ </style>