@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,871 @@
1
+ <script setup lang="ts">
2
+ import { ElTable, ElTableColumn, dayjs } from 'element-plus';
3
+ import {
4
+ DialogActionT,
5
+ OCollapse,
6
+ OCollapseItem,
7
+ ODialog,
8
+ OForm,
9
+ OFormItem, OLink,
10
+ OPagination,
11
+ OTag,
12
+ OTextarea,
13
+ useMessage,
14
+ } from '@opensig/opendesign';
15
+ import { useScreen } from '@opendesign-plus/composables';
16
+ import { onMounted, watch, ref, reactive, computed } from 'vue';
17
+ import { ActivityItemT, ActivityTablePropsT, ReviewParamsT, TypeOptionT } from './types';
18
+ import { getApprovalStatusMap, getStatusMap } from './config';
19
+ import ThFilter from '../common/ThFilter.vue';
20
+ import OMeetingDetail from '@/components/meeting/components/OMeetingDetail.vue';
21
+ import { useI18n } from '@/i18n';
22
+
23
+ const { t, locale } = useI18n();
24
+ const isZh = computed(() => locale.value === 'zh');
25
+ const approvalStatusMap = getApprovalStatusMap();
26
+ const statusMap = getStatusMap();
27
+
28
+
29
+ const message = useMessage(null);
30
+ const { isPhone, lePadV } = useScreen();
31
+ const props = defineProps<ActivityTablePropsT>();
32
+ const params = reactive<ReviewParamsT>({
33
+ page: 1,
34
+ size: 10,
35
+ status: '',
36
+ is_delete: 0,
37
+ search: '',
38
+ sponsor: '',
39
+ order_by: '',
40
+ });
41
+
42
+ // -------------------- 申请人 --------------------
43
+ const applicantValue = ref('');
44
+ const applicantOptions = computed(() => props.applicantList.map(v => ({ value: v, label: v })));
45
+
46
+ const filterApplicantList = () => {
47
+ params.sponsor = applicantValue.value.join(',');
48
+ };
49
+
50
+ // -------------------- 时间排序 --------------------
51
+ const order_by = ref('desc');
52
+ const sortTime = () => {
53
+ order_by.value = order_by.value === 'asc' ? 'desc' : 'asc';
54
+ params.order_by = order_by.value;
55
+ };
56
+
57
+ // -------------------- 状态 --------------------
58
+ const statusValue = ref();
59
+ const statusOptions = computed<TypeOptionT[]>(() => {
60
+ let list: TypeOptionT[] | { label: string; value: string; }[] = [];
61
+ approvalStatusMap.forEach((item) => {
62
+ list.push(item);
63
+ });
64
+ return list.slice(1);
65
+
66
+ });
67
+ const filterStatusList = () => {
68
+ params.status = statusValue.value;
69
+ if (statusValue.value === 'cancel') {
70
+ params.is_delete = 1;
71
+ } else {
72
+ params.is_delete = 0;
73
+ }
74
+ };
75
+
76
+ const tableData = ref([]);
77
+ const total = ref(0);
78
+
79
+ const COUNT_PER_PAGE = [10, 20, 30, 40];
80
+
81
+ const getData = async () => {
82
+ const { page, size, status, sponsor, order_by, search, is_delete } = params;
83
+ let paramsData = { page, size, sponsor, order_by, search } as ReviewParamsT;
84
+ if (status !== 'all' && status !== '') {
85
+ paramsData.is_delete = is_delete;
86
+ }
87
+ if (status === 'cancel') {
88
+ paramsData.status = '';
89
+ } else {
90
+ paramsData.status = status;
91
+ }
92
+ if (!props.getTableDataRequest) {
93
+ return;
94
+ }
95
+ const res = await props.getTableDataRequest(paramsData);
96
+ tableData.value = (res.data || [])
97
+ .map((item) => {
98
+ const { start_date, end_date, start, end } = item;
99
+ return [
100
+ {
101
+ ...item,
102
+ time: `${ start_date }-${ end }`,
103
+ start_date_time: `${ start_date } ${ start }`,
104
+ end_date_time: `${ end_date } ${ end }`,
105
+ type: 'activity',
106
+ dateRange: `${ start_date } ${ start }-${ end_date } ${ end }`,
107
+ },
108
+ ];
109
+ })
110
+ .flat();
111
+ total.value = res.total;
112
+ };
113
+
114
+ const onPaginationChange = (val: { page: number; pageSize: number }) => {
115
+ if (val.pageSize !== params.size) {
116
+ params.page = 1;
117
+ } else {
118
+ params.page = val.page;
119
+ }
120
+ params.size = val.pageSize;
121
+ getData();
122
+ };
123
+
124
+ // -------------------- 活动审核弹窗 --------------------
125
+ const form = ref({
126
+ reason: '',
127
+ });
128
+ const formRef = ref(); // 表单实例
129
+ const loading = ref(false); // 提交状态
130
+ const currentRow = ref<ActivityItemT | null>(null); // 当前活动详情
131
+ const digTitle = ref('');
132
+ const reviewStatus = ref(0);
133
+ const reviewVisible = ref(false);
134
+
135
+ // 表单校验规则
136
+ const rules = ref({
137
+ reason: [{ required: true, message: t('meeting.enterReviewNotes') }],
138
+ });
139
+
140
+ const confirm = async () => {
141
+ if (!props.approveActivityRequest || !props.rejectActivityRequest) {
142
+ return;
143
+ }
144
+ const msg = reviewStatus.value === 1 ? t('meeting.approveReview') : t('meeting.rejectReview');
145
+ try {
146
+ loading.value = true;
147
+ const valid = await formRef.value?.validate();
148
+ if (valid.some((v) => !!v)) {
149
+ loading.value = false;
150
+ return;
151
+ }
152
+ if (reviewStatus.value === 1) {
153
+ await props.approveActivityRequest(currentRow.value.id, form.value);
154
+ } else {
155
+ await props.rejectActivityRequest(currentRow.value.id, form.value);
156
+ }
157
+ getData();
158
+ cancel();
159
+ message.success({
160
+ content: t('meeting.reviewSuccess', [currentRow.value?.title]),
161
+ });
162
+ } catch {
163
+ reviewVisible.value = false;
164
+ loading.value = false;
165
+ message.danger({
166
+ content: t('meeting.reviewFail', [currentRow.value?.title]),
167
+ });
168
+ }
169
+ };
170
+ const cancel = () => {
171
+ reviewVisible.value = false;
172
+ cancelVisible.value = false;
173
+ loading.value = false;
174
+ form.value.reason = '';
175
+ };
176
+
177
+ const confirmCancel = async () => {
178
+ if (props.deleteActivityRequest && props.cancelActivityRequest) {
179
+ try {
180
+ loading.value = true;
181
+ if (cancelStatus.value === 1) {
182
+ await props.cancelActivityRequest(currentRow.value.id, form.value);
183
+ } else {
184
+ await props.deleteActivityRequest(currentRow.value.id, form.value);
185
+ }
186
+ getData();
187
+ cancel();
188
+ message.success({
189
+ content: t('meeting.activityActionSuccess', [currentRow.value?.title, cancelText.value]),
190
+ });
191
+ } catch (err) {
192
+ loading.value = false;
193
+ cancelVisible.value = false;
194
+ message.danger({
195
+ content: t('meeting.activityActionFail', [currentRow.value?.title, cancelText.value]),
196
+ });
197
+ }
198
+ }
199
+ };
200
+
201
+ // -------------------- 审核操作 --------------------
202
+ const cancelVisible = ref(false);
203
+ const cancelTitle = ref('');
204
+ const cancelText = ref('');
205
+ const cancelStatus = ref(0);
206
+
207
+ const deleteItem = (row: ActivityItemT) => {
208
+ cancelTitle.value = t('meeting.deleteActivity');
209
+ cancelText.value = t('meeting.deleteActivity').toLowerCase();
210
+ currentRow.value = row;
211
+ cancelStatus.value = 0;
212
+ cancelVisible.value = true;
213
+ };
214
+ const cancelItem = (row: ActivityItemT) => {
215
+ cancelTitle.value = t('meeting.cancelActivity');
216
+ cancelText.value = t('common.cancel').toLowerCase();
217
+ currentRow.value = row;
218
+ cancelStatus.value = 1;
219
+ cancelVisible.value = true;
220
+ };
221
+ const passItem = (row: ActivityItemT) => {
222
+ currentRow.value = row;
223
+ digTitle.value = t('meeting.approveReview');
224
+ reviewStatus.value = 1;
225
+ reviewVisible.value = true;
226
+ };
227
+ const rejectItem = (row: ActivityItemT) => {
228
+ currentRow.value = row;
229
+ digTitle.value = t('meeting.rejectReview');
230
+ reviewStatus.value = 0;
231
+ reviewVisible.value = true;
232
+ };
233
+
234
+ const expandList = ref([]);
235
+ const expandedRows = ref([]);
236
+
237
+ const getActivityDetail = (val: number) => {
238
+ if (!props.getActivityDetailRequest) {
239
+ return;
240
+ }
241
+ if (!expandList.value.includes(val)) {
242
+ expandList.value.push(val);
243
+ props.getActivityDetailRequest(val).then((res) => {
244
+ tableData.value?.forEach((item) => {
245
+ if (item.id === res.id) {
246
+ item.approve_record = res.approve_record;
247
+ item.approver = res.approver;
248
+ }
249
+ });
250
+ });
251
+ }
252
+ const index = expandedRows.value.indexOf(val);
253
+ if (!expandedRows.value.includes(val)) {
254
+ expandedRows.value.push(val);
255
+ } else {
256
+ expandedRows.value.splice(index, 1); // 收起
257
+ }
258
+ };
259
+
260
+ const expandChange = (val) => {
261
+ getActivityDetail(val.id);
262
+ };
263
+
264
+ const getRowKey = (row) => {
265
+ return row.id;
266
+ };
267
+
268
+ // -------------------- 移动端 ---------------------
269
+ const expanded = ref([]); // 展开的数据,id
270
+ const change = (val: number[]) => {
271
+ if (val.length) {
272
+ val.forEach((item: number) => {
273
+ getActivityDetail(item);
274
+ });
275
+ }
276
+ };
277
+
278
+ const detailRefs = ref({});
279
+ const getDetailRefs = (insRef, id) => {
280
+ if (insRef && id) {
281
+ detailRefs.value[id] = insRef;
282
+ }
283
+ };
284
+
285
+ onMounted(() => {
286
+ getData();
287
+ });
288
+
289
+ // -------------------- 监听查询参数变化,更新数据 ---------------------
290
+ watch(
291
+ () => [params.status, params.sponsor, params.order_by, params.search, params.is_delete],
292
+ () => {
293
+ getData();
294
+ },
295
+ { deep: true },
296
+ );
297
+
298
+ const cancelActions = computed<DialogActionT[]>(() => {
299
+ return [{
300
+ id: 'confirm',
301
+ loading: loading.value,
302
+ color: 'primary',
303
+ variant: lePadV.value ? 'text' : 'solid',
304
+ round: 'pill',
305
+ size: 'large',
306
+ label: t('meeting.confirmBtn'),
307
+ onClick: () => {
308
+ confirmCancel();
309
+ },
310
+ }, {
311
+ id: 'cancel',
312
+ color: 'primary',
313
+ variant: lePadV.value ? 'text' : 'outline',
314
+ round: 'pill',
315
+ size: 'large',
316
+ label: t('meeting.cancelBtn'),
317
+ onClick: () => {
318
+ cancel();
319
+ },
320
+ }];
321
+ });
322
+ const reviewActions = computed<DialogActionT[]>(() => {
323
+ return [{
324
+ id: 'confirm',
325
+ loading: loading.value,
326
+ color: 'primary',
327
+ variant: lePadV.value ? 'text' : 'solid',
328
+ round: 'pill',
329
+ size: 'large',
330
+ label: t('meeting.confirmBtn'),
331
+ onClick: () => {
332
+ confirm();
333
+ },
334
+ }, {
335
+ id: 'cancel',
336
+ color: 'primary',
337
+ variant: lePadV.value ? 'text' : 'outline',
338
+ round: 'pill',
339
+ size: 'large',
340
+ label: t('meeting.cancelBtn'),
341
+ onClick: () => {
342
+ cancel();
343
+ },
344
+ }];
345
+ });
346
+ </script>
347
+
348
+ <template>
349
+ <div class="o-activity-table">
350
+ <div class="table-wrapper" v-if="!isPhone">
351
+ <ElTable :data="tableData" @expand-change="expandChange" :row-key="getRowKey" :expand-row-keys="expandedRows">
352
+ <ElTableColumn type="expand">
353
+ <template #default="props">
354
+ <div class="expand-detail">
355
+ <OMeetingDetail :data="props.row" page="approval" show />
356
+ </div>
357
+ </template>
358
+ </ElTableColumn>
359
+ <ElTableColumn :label="t('meeting.activityName')" prop="title" />
360
+ <ElTableColumn prop="sponsor">
361
+ <template #header>
362
+ <ThFilter
363
+ v-model="applicantValue"
364
+ @confirm="filterApplicantList"
365
+ :list="applicantOptions"
366
+ :multiple="true"
367
+ >
368
+
369
+ <template #empty>
370
+ <slot name="filter-empty"></slot>
371
+ </template>
372
+ {{ t('meeting.applicant') }}
373
+ </ThFilter>
374
+ </template>
375
+ </ElTableColumn>
376
+ <ElTableColumn prop="create_time">
377
+ <template #header>
378
+ <div class="sort-time" @click="sortTime">
379
+ <span>{{ t('meeting.submissionTime') }}</span>
380
+ <div class="sort-btn">
381
+ <div class="sort-asc sort-item" :class="{ active: order_by === 'asc' }"></div>
382
+ <div class="sort-desc sort-item" :class="{ active: order_by === 'desc' }"></div>
383
+ </div>
384
+ </div>
385
+ </template>
386
+ <template #default="scope">
387
+ {{ dayjs(scope.row.create_time).format('YYYY/MM/DD HH:mm:ss') }}
388
+ </template>
389
+ </ElTableColumn>
390
+ <ElTableColumn prop="status" width="90px">
391
+ <template #header>
392
+ <ThFilter
393
+ v-model="statusValue"
394
+ @confirm="filterStatusList"
395
+ :list="statusOptions"
396
+ >
397
+ <template #empty>
398
+ <slot name="filter-empty"></slot>
399
+ </template>
400
+ {{ t('meeting.status') }}
401
+ </ThFilter>
402
+ </template>
403
+ <template #default="scope">
404
+ <OTag
405
+ v-if="scope.row.is_delete !== 1"
406
+ color="primary"
407
+ variant="outline"
408
+ :class="[`tag-${statusMap.get(scope.row.status)?.id}`]"
409
+ >
410
+ {{
411
+ statusMap.get(scope.row.status)?.text
412
+ }}
413
+ </OTag>
414
+ <OTag v-else color="primary" variant="outline" class="tag-cancel">{{ t('meeting.statusCanceled') }}</OTag>
415
+ </template>
416
+ </ElTableColumn>
417
+ <ElTableColumn :label="t('meeting.action')">
418
+ <template #default="scope">
419
+ <div class="activity-btn">
420
+ <OLink
421
+ v-if="scope.row.status === 7 || scope.row.is_delete"
422
+ color="danger"
423
+ @click="deleteItem(scope.row)">
424
+ {{ t('meeting.deleteActivity') }}
425
+ </OLink>
426
+ <OLink
427
+ v-if="(scope.row.status === 3 || scope.row.status === 4) && scope.row.is_delete !== 1"
428
+ color="danger"
429
+ @click="cancelItem(scope.row)"
430
+ >
431
+ {{ t('meeting.cancelActivity') }}
432
+ </OLink>
433
+ <OLink v-if="scope.row.status === 2" color="primary" @click="passItem(scope.row)">
434
+ {{ t('meeting.approve') }}
435
+ </OLink>
436
+ <OLink v-if="scope.row.status === 2" color="primary" @click="rejectItem(scope.row)">
437
+ {{ t('meeting.reject') }}
438
+ </OLink>
439
+ </div>
440
+ </template>
441
+ </ElTableColumn>
442
+ </ElTable>
443
+ <div v-if="total > COUNT_PER_PAGE[0]" class="pagination-wrapper">
444
+ <OPagination
445
+ :total="total"
446
+ :page="params.page"
447
+ :page-size="params.size"
448
+ :page-sizes="COUNT_PER_PAGE"
449
+ :layout="['total', 'jumper', 'pager', 'pagesize']"
450
+ :show-more="false"
451
+ @change="onPaginationChange"
452
+ />
453
+ </div>
454
+ </div>
455
+ <div v-else class="collapse-wrapper">
456
+ <OCollapse v-model="expanded" :accordion="isPhone" @change="change">
457
+ <template v-for="(act, idx) in tableData" :key="act.id">
458
+ <div class="title-top">
459
+ <p class="act-title">{{ act.title }}</p>
460
+ <OTag v-if="act.is_delete !== 1" color="primary" variant="outline"
461
+ :class="[`tag-${statusMap.get(act.status)?.id}`]">
462
+ {{
463
+ statusMap.get(act.status)?.text
464
+ }}
465
+ </OTag>
466
+ <OTag v-else color="primary" variant="outline" class="tag-cancel">{{ t('meeting.statusCanceled') }}</OTag>
467
+ </div>
468
+ <OCollapseItem :value="act.id">
469
+ <template #title>
470
+ <div class="act-sponsor">
471
+ <p class="sponsor">{{ act.sponsor }}</p>
472
+ <p>{{ dayjs(act.create_time).format('YYYY/MM/DD HH:mm:ss') }}</p>
473
+ </div>
474
+ <div class="activity-btn">
475
+ <OLink
476
+ v-if="act.status === 7 || act.is_delete"
477
+ color="danger"
478
+ variant="text"
479
+ @click.stop="deleteItem(act)"
480
+ >
481
+ {{ t('meeting.deleteActivity') }}
482
+ </OLink>
483
+ <OLink
484
+ v-if="(act.status === 3 || act.status === 4) && act.is_delete !== 1"
485
+ color="danger"
486
+ variant="text"
487
+ @click.stop="cancelItem(act)"
488
+ >
489
+ {{ t('meeting.cancelActivity') }}
490
+ </OLink>
491
+ <OLink
492
+ v-if="act.status === 2"
493
+ color="primary"
494
+ variant="text"
495
+ @click.stop="passItem(act)"
496
+ >
497
+ {{ t('meeting.approve') }}
498
+ </OLink>
499
+ <OLink
500
+ v-if="act.status === 2"
501
+ color="primary"
502
+ variant="text"
503
+ @click.stop="rejectItem(act)"
504
+ >
505
+ {{ t('meeting.reject') }}
506
+ </OLink>
507
+ </div>
508
+ </template>
509
+ <div class="activity-detail">
510
+ <OMeetingDetail
511
+ :show="expanded.includes(act.id)"
512
+ :data="act"
513
+ :ref="(insRef) => getDetailRefs(insRef, act.id)"
514
+ page="approval"
515
+ />
516
+ </div>
517
+ </OCollapseItem>
518
+ </template>
519
+ </OCollapse>
520
+ <!-- 分页 -->
521
+ <div v-if="total > COUNT_PER_PAGE[0]" class="pagination">
522
+ <OPagination
523
+ :total="total"
524
+ :page="params.page"
525
+ :page-size="params.size"
526
+ :page-sizes="COUNT_PER_PAGE"
527
+ :layout="['total', 'jumper', 'pager', 'pagesize']"
528
+ :show-more="false"
529
+ :simple="true"
530
+ @change="onPaginationChange"
531
+ />
532
+ </div>
533
+ </div>
534
+ <ODialog
535
+ v-model:visible="reviewVisible"
536
+ :phone-half-full="lePadV"
537
+ main-class="handle-dialog-approval review-dialog"
538
+ :actions="reviewActions"
539
+ >
540
+ <template #header>{{ digTitle }}</template>
541
+ <div class="dialog-content">
542
+ <OForm :model="form" ref="formRef" has-required layout="v" class="form-wrapper">
543
+ <OFormItem
544
+ :rules="rules.reason"
545
+ :label="`${t('meeting.reviewNotesLabel')}${isZh ? ':' : ': '}`"
546
+ field="reason"
547
+ >
548
+ <OTextarea
549
+ size="large"
550
+ :placeholder="t('meeting.enterReviewNotes')"
551
+ :rows="4"
552
+ resize="none"
553
+ :max-length="1000"
554
+ :input-on-outlimit="false"
555
+ v-model="form.reason"
556
+ />
557
+ </OFormItem>
558
+ </OForm>
559
+ </div>
560
+ </ODialog>
561
+ <!-- 取消活动弹窗 -->
562
+ <ODialog
563
+ v-model:visible="cancelVisible"
564
+ :phone-half-full="lePadV"
565
+ main-class="handle-dialog-approval cancel-dialog"
566
+ :actions="cancelActions"
567
+ >
568
+ <template #header>{{ cancelTitle }}</template>
569
+ <div class="dialog-content">
570
+ {{ cancelStatus === 1 ? t('meeting.confirmCancelActivity', [currentRow?.title]) : t('meeting.confirmDeleteActivity', [currentRow?.title])
571
+ }}
572
+ </div>
573
+ </ODialog>
574
+ </div>
575
+ </template>
576
+
577
+ <style lang="scss">
578
+ .o-activity-table {
579
+ .table-wrapper {
580
+ .el-table {
581
+ border-top: none;
582
+ }
583
+
584
+ .el-table__header {
585
+ margin-bottom: 0;
586
+ }
587
+ }
588
+
589
+ .expand-detail {
590
+ padding: 16px 60px;
591
+ background-color: var(--o-color-fill3);
592
+ }
593
+
594
+ .activity-btn {
595
+ .o-btn + .o-btn {
596
+ margin-left: 24px;
597
+ }
598
+
599
+ @include respond-to('<=pad_v') {
600
+ .o-btn + .o-btn {
601
+ margin-left: 16px;
602
+ }
603
+ }
604
+ @include respond-to('phone') {
605
+ margin-top: 8px;
606
+ .o-btn + .o-btn {
607
+ margin-left: 12px;
608
+ }
609
+ }
610
+ }
611
+
612
+ .o-btn-text {
613
+ @include hover {
614
+ background-color: transparent;
615
+ color: var(--o-color-primary1);
616
+ }
617
+ }
618
+
619
+ .o-btn.o-btn-text {
620
+ padding-left: 0 !important;
621
+ padding-right: 0 !important;
622
+ min-width: auto;
623
+ }
624
+
625
+ .o-tag {
626
+ --tag-radius: 100px;
627
+ font-weight: 500;
628
+ padding: 0 8px;
629
+ height: 24px;
630
+ line-height: 24px !important;
631
+ @include tip1;
632
+
633
+ .o-tag-label {
634
+ transform: none !important;
635
+ }
636
+
637
+ &.o-tag-outline {
638
+ --tag-bd-color: transparent;
639
+ --tag-color: #fff;
640
+ }
641
+
642
+ &.tag-under-review {
643
+ --tag-bg-color: rgb(var(--o-blue-6));
644
+ }
645
+
646
+ &.tag-draft,
647
+ &.tag-cancel {
648
+ --tag-color: var(--o-color-info3);
649
+ --tag-bg-color: var(--o-color-control1-light);
650
+ }
651
+
652
+ &.tag-registration,
653
+ &.tag-in-progress,
654
+ &.tag-ended {
655
+ --tag-bg-color: var(--o-color-success1);
656
+ }
657
+
658
+ &.tag-reject {
659
+ --tag-bg-color: var(--o-color-warning1);
660
+ }
661
+ }
662
+
663
+
664
+
665
+ .sort-time {
666
+ display: flex;
667
+ align-items: center;
668
+ cursor: pointer;
669
+ }
670
+
671
+ .sort-btn {
672
+ margin-left: 4px;
673
+ }
674
+
675
+ .sort-item {
676
+ width: 0;
677
+ height: 0;
678
+ border: 5px solid transparent;
679
+ }
680
+
681
+ .sort-asc {
682
+ border-bottom-color: var(--o-color-info2);
683
+ margin-bottom: 2px;
684
+
685
+ &.active {
686
+ border-bottom-color: var(--o-color-primary1);
687
+ }
688
+ }
689
+
690
+ .sort-desc {
691
+ border-top-color: var(--o-color-info2);
692
+ margin-top: 2px;
693
+
694
+ &.active {
695
+ border-top-color: var(--o-color-primary1);
696
+ }
697
+ }
698
+
699
+ .el-table {
700
+ --el-table-header-bg-color: rgba(235, 241, 250, 1);
701
+ color: var(--o-color-info1);
702
+ @include text1;
703
+
704
+ .el-table__header-wrapper {
705
+ border-radius: 12px 12px 0 0;
706
+
707
+ .el-table__cell {
708
+ padding: 12px 0 11px;
709
+ }
710
+
711
+ .cell {
712
+ color: var(--o-color-info2);
713
+ font-weight: 600;
714
+ @include text1;
715
+ }
716
+ }
717
+
718
+ .el-table__expanded-cell {
719
+ padding: 0;
720
+ }
721
+
722
+ .cell {
723
+ white-space: nowrap;
724
+ }
725
+ }
726
+
727
+ .pagination {
728
+ margin-top: 32px;
729
+ display: flex;
730
+ align-items: center;
731
+ justify-content: flex-end;
732
+ }
733
+
734
+ .o-textarea {
735
+ --_box-radius: 16px;
736
+ }
737
+
738
+ .dialog-footer {
739
+ display: flex;
740
+ justify-content: center;
741
+ align-items: center;
742
+
743
+ .o-btn + .o-btn {
744
+ margin-left: 16px;
745
+ }
746
+
747
+ @include respond-to('<=pad_v') {
748
+ .o-btn {
749
+ width: 140px;
750
+ color: var(--o-color-info1);
751
+ padding: 6px 24px !important;
752
+ }
753
+ .o-btn + .o-btn {
754
+ margin-left: 0;
755
+ }
756
+ }
757
+ }
758
+
759
+ .collapse-wrapper {
760
+ .o-tag {
761
+ height: 24px;
762
+ }
763
+
764
+ .o-collapse {
765
+ padding: 0;
766
+ border-radius: 12px;
767
+
768
+ .o-collapse-item {
769
+ --collapse-item-header-padding: 8px 0 12px;
770
+
771
+ &:last-child {
772
+ padding-bottom: 16px;
773
+ }
774
+ }
775
+
776
+ .act-sponsor {
777
+ display: flex;
778
+ align-items: center;
779
+ color: var(--o-color-info3);
780
+ margin-right: 16px;
781
+ @include text1;
782
+ }
783
+
784
+ .sponsor {
785
+ margin-right: 12px;
786
+ @include text-truncate(1);
787
+ }
788
+
789
+ .o-collapse-item-icon {
790
+ transform: rotate(0deg);
791
+ width: 24px;
792
+ height: 24px;
793
+ }
794
+
795
+ .o-collapse-item-expanded .o-collapse-item-icon {
796
+ transform: rotate(90deg);
797
+ }
798
+
799
+ .o-collapse-item-header {
800
+ border-bottom: 1px solid var(--o-color-control4);
801
+ margin: 0 16px;
802
+ }
803
+ }
804
+
805
+ .activity-detail {
806
+ padding: 12px 16px;
807
+ background-color: rgba(243, 246, 250, 1);
808
+ }
809
+
810
+ .pagination {
811
+ justify-content: center;
812
+ margin-top: 24px;
813
+ }
814
+ }
815
+
816
+ .title-top {
817
+ display: flex;
818
+ align-items: center;
819
+ justify-content: space-between;
820
+ padding: 12px 16px 0;
821
+
822
+ .act-title {
823
+ color: var(--o-color-info1);
824
+ margin-right: 12px;
825
+ font-weight: 600;
826
+ @include text1;
827
+ @include text-truncate(1);
828
+ }
829
+ }
830
+ }
831
+
832
+ </style>
833
+
834
+ <style lang="scss">
835
+ .handle-dialog-approval {
836
+ --dlg-width: 450px;
837
+ --dlg-radius: var(--o-radius-xs);
838
+ @include respond-to('<=pad_v') {
839
+ width: 100%;
840
+ --dlg-radius: var(--o-radius-xs) var(--o-radius-xs) 0 0;
841
+ }
842
+ }
843
+
844
+ .cancel-dialog {
845
+ .o-dlg-footer {
846
+ margin-top: var(--o-gap-5);
847
+ }
848
+ }
849
+ .review-dialog {
850
+ --dlg-width: 690px;
851
+
852
+ .o-form {
853
+ width: 450px;
854
+ margin: 0 auto;
855
+
856
+ .o-form-item-label {
857
+ margin-bottom: var(--o-gap-2);
858
+ }
859
+
860
+ .o-textarea {
861
+ width: 100%;
862
+ --_box-radius: var(--o-radius-xs);
863
+ }
864
+ }
865
+
866
+ .o-dlg-footer {
867
+ margin-top: var(--o-gap-6);
868
+ }
869
+ }
870
+
871
+ </style>