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

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