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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -0
  2. package/dist/chunk-OElCookieNotice.es.js +862 -0
  3. package/dist/components/activity/OActivityApproval.vue.d.ts +273 -0
  4. package/dist/components/activity/OActivityForm.vue.d.ts +138 -0
  5. package/dist/components/activity/OActivityMyCalendar.vue.d.ts +636 -0
  6. package/dist/components/activity/composables/useActivityConfig.d.ts +17 -0
  7. package/dist/components/activity/config.d.ts +1 -0
  8. package/dist/components/activity/index.d.ts +648 -0
  9. package/dist/components/activity/types.d.ts +88 -0
  10. package/dist/components/banner/OBanner.vue.d.ts +13 -0
  11. package/dist/components/banner/OBannerContent.vue.d.ts +7 -0
  12. package/dist/components/banner/index.d.ts +68 -0
  13. package/dist/components/banner/types.d.ts +31 -0
  14. package/dist/components/config-provider/OPlusConfigProvider.vue.d.ts +24 -0
  15. package/dist/components/config-provider/index.d.ts +30 -0
  16. package/dist/components/cookie-notice/OCookieNotice.vue.d.ts +17 -0
  17. package/dist/components/cookie-notice/index.d.ts +53 -0
  18. package/dist/components/element-plus/OElCookieNotice.vue.d.ts +34 -0
  19. package/dist/components/element-plus/index.d.ts +2 -0
  20. package/dist/components/events/OEventsApply.vue.d.ts +16 -0
  21. package/dist/components/events/OEventsCalendar.vue.d.ts +5 -0
  22. package/dist/components/events/OEventsList.vue.d.ts +26 -0
  23. package/dist/components/events/config.d.ts +14 -0
  24. package/dist/components/events/index.d.ts +78 -0
  25. package/dist/components/events/types.d.ts +73 -0
  26. package/dist/components/events/utils.d.ts +7 -0
  27. package/dist/components/footer/OFooter.vue.d.ts +46 -0
  28. package/dist/components/footer/index.d.ts +89 -0
  29. package/dist/components/header/OHeader.vue.d.ts +30 -0
  30. package/dist/components/header/OHeaderMobile.vue.d.ts +178 -0
  31. package/dist/components/header/components/HeaderContent.vue.d.ts +13 -0
  32. package/dist/components/header/components/HeaderNav.vue.d.ts +19 -0
  33. package/dist/components/header/components/HeaderNavMobile.vue.d.ts +36 -0
  34. package/dist/components/header/index.d.ts +153 -0
  35. package/dist/components/header/types.d.ts +85 -0
  36. package/dist/components/header-language-switcher/OHeaderLanguageSwitcher.vue.d.ts +49 -0
  37. package/dist/components/header-language-switcher/index.d.ts +90 -0
  38. package/dist/components/header-search/OHeaderSearch.vue.d.ts +1032 -0
  39. package/dist/components/header-search/index.d.ts +607 -0
  40. package/dist/components/header-source-code/OHeaderSourceCode.vue.d.ts +18 -0
  41. package/dist/components/header-source-code/index.d.ts +23 -0
  42. package/dist/components/header-theme/OHeaderTheme.vue.d.ts +25 -0
  43. package/dist/components/header-theme/index.d.ts +50 -0
  44. package/dist/components/header-user/OHeaderUser.vue.d.ts +40 -0
  45. package/dist/components/header-user/index.d.ts +53 -0
  46. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +297 -0
  47. package/dist/components/meeting/OMeetingForm.vue.d.ts +141 -0
  48. package/dist/components/meeting/OMeetingMyCalendar.vue.d.ts +644 -0
  49. package/dist/components/meeting/OMeetingPlayback.vue.d.ts +94 -0
  50. package/dist/components/meeting/OMeetingSigCalendar.vue.d.ts +24 -0
  51. package/dist/components/meeting/components/OMeetingCalendarList.vue.d.ts +29 -0
  52. package/dist/components/meeting/components/OMeetingDetail.vue.d.ts +13 -0
  53. package/dist/components/meeting/components/OMeetingPlaybackSubtitles.vue.d.ts +20 -0
  54. package/dist/components/meeting/components/OMeetingPlaybackVideo.vue.d.ts +17 -0
  55. package/dist/components/meeting/components/OMeetingSigAside.vue.d.ts +16 -0
  56. package/dist/components/meeting/composables/useMeetingConfig.d.ts +14 -0
  57. package/dist/components/meeting/config.d.ts +12 -0
  58. package/dist/components/meeting/index.d.ts +823 -0
  59. package/dist/components/meeting/types.d.ts +235 -0
  60. package/dist/components/meeting/utils.d.ts +9 -0
  61. package/dist/components/search/OSearchInput.vue.d.ts +1025 -0
  62. package/dist/components/search/composables/useImageSearch.d.ts +48 -0
  63. package/dist/components/search/composables/useKeywordHighlight.d.ts +2 -0
  64. package/dist/components/search/composables/useSearchHistory.d.ts +14 -0
  65. package/dist/components/search/index.d.ts +600 -0
  66. package/dist/components/search/internal/HighlightText.vue.d.ts +9 -0
  67. package/dist/components/{OHeaderSearch.vue.d.ts → search/internal/SearchImageInput.vue.d.ts} +210 -166
  68. package/dist/components/search/internal/SearchPanel.vue.d.ts +100 -0
  69. package/dist/components/search/types.d.ts +20 -0
  70. package/dist/components/{OSection.vue.d.ts → section/OSection.vue.d.ts} +4 -4
  71. package/dist/components/section/index.d.ts +47 -0
  72. package/dist/components.cjs.js +224 -1
  73. package/dist/components.css +1 -1
  74. package/dist/components.element.cjs.js +1 -0
  75. package/dist/components.element.es.js +4 -0
  76. package/dist/components.es.js +46234 -1078
  77. package/dist/index.d.ts +16 -12
  78. package/docs/design.md +27 -27
  79. package/docs/design_banner.md +41 -41
  80. package/docs/design_section.md +27 -27
  81. package/package.json +18 -9
  82. package/scripts/generate-components-index.js +61 -80
  83. package/src/assets/events/svg-icons/icon-checked.svg +3 -0
  84. package/src/assets/events/svg-icons/icon-competition.svg +7 -0
  85. package/src/assets/events/svg-icons/icon-events.svg +4 -0
  86. package/src/assets/events/svg-icons/icon-release.svg +4 -0
  87. package/src/assets/events/svg-icons/icon-summit.svg +4 -0
  88. package/src/assets/meeting/svg-icons/icon-all.svg +4 -0
  89. package/src/assets/meeting/svg-icons/icon-backward.svg +4 -0
  90. package/src/assets/meeting/svg-icons/icon-calendar.svg +3 -0
  91. package/src/assets/meeting/svg-icons/icon-cancel.svg +4 -0
  92. package/src/assets/meeting/svg-icons/icon-captions.svg +4 -0
  93. package/src/assets/meeting/svg-icons/icon-close-captions.svg +6 -0
  94. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +6 -0
  95. package/src/assets/meeting/svg-icons/icon-copy.svg +3 -0
  96. package/src/assets/meeting/svg-icons/icon-create.svg +5 -0
  97. package/src/assets/meeting/svg-icons/icon-delete.svg +7 -0
  98. package/src/assets/meeting/svg-icons/icon-empty.svg +31 -0
  99. package/src/assets/meeting/svg-icons/icon-empty_dark.svg +49 -0
  100. package/src/assets/meeting/svg-icons/icon-event.svg +4 -0
  101. package/src/assets/meeting/svg-icons/icon-export.svg +3 -0
  102. package/src/assets/meeting/svg-icons/icon-forward.svg +4 -0
  103. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +6 -0
  104. package/src/assets/meeting/svg-icons/icon-help.svg +3 -0
  105. package/src/assets/meeting/svg-icons/icon-important.svg +4 -0
  106. package/src/assets/meeting/svg-icons/icon-info.svg +3 -0
  107. package/src/assets/meeting/svg-icons/icon-meet.svg +4 -0
  108. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +5 -0
  109. package/src/assets/meeting/svg-icons/icon-meeting.svg +4 -0
  110. package/src/assets/meeting/svg-icons/icon-play.svg +5 -0
  111. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +7 -0
  112. package/src/assets/meeting/svg-icons/icon-playing.svg +5 -0
  113. package/src/assets/meeting/svg-icons/icon-question.svg +4 -0
  114. package/src/assets/meeting/svg-icons/icon-sound.svg +5 -0
  115. package/src/assets/meeting/svg-icons/icon-speaker.svg +3 -0
  116. package/src/assets/meeting/svg-icons/icon-summit.svg +4 -0
  117. package/src/assets/meeting/svg-icons/icon-telligent.svg +3 -0
  118. package/src/assets/meeting/svg-icons/icon-tip.svg +3 -0
  119. package/src/assets/meeting/svg-icons/icon-todo.svg +4 -0
  120. package/src/assets/meeting/transparent.png +0 -0
  121. package/src/assets/styles/element-plus.scss +235 -0
  122. package/src/assets/svg-icons/icon-arrow-left.svg +3 -0
  123. package/src/assets/svg-icons/icon-avatar-line.svg +3 -0
  124. package/src/assets/svg-icons/icon-caret-left.svg +3 -0
  125. package/src/assets/svg-icons/icon-caret-right.svg +3 -0
  126. package/src/assets/svg-icons/icon-chevron-down.svg +3 -0
  127. package/src/assets/svg-icons/icon-chevron-right.svg +3 -3
  128. package/src/assets/svg-icons/icon-chevron-up.svg +3 -0
  129. package/src/assets/svg-icons/icon-close.svg +3 -3
  130. package/src/assets/svg-icons/icon-delete-hover.svg +4 -0
  131. package/src/assets/svg-icons/icon-delete.svg +7 -3
  132. package/src/assets/svg-icons/icon-filter.svg +3 -0
  133. package/src/assets/svg-icons/icon-header-back.svg +3 -3
  134. package/src/assets/svg-icons/icon-header-delete.svg +3 -3
  135. package/src/assets/svg-icons/icon-header-menu.svg +3 -0
  136. package/src/assets/svg-icons/icon-header-person.svg +3 -0
  137. package/src/assets/svg-icons/icon-header-search.svg +4 -4
  138. package/src/assets/svg-icons/icon-image-close.svg +4 -0
  139. package/src/assets/svg-icons/icon-image-upload.svg +3 -0
  140. package/src/assets/svg-icons/icon-image-zoomin.svg +3 -0
  141. package/src/assets/svg-icons/icon-loading.svg +4 -0
  142. package/src/assets/svg-icons/icon-locale.svg +3 -0
  143. package/src/assets/svg-icons/icon-log-off.svg +3 -0
  144. package/src/assets/svg-icons/icon-message.svg +3 -0
  145. package/src/assets/svg-icons/icon-moon.svg +3 -3
  146. package/src/assets/svg-icons/icon-outlink.svg +3 -0
  147. package/src/assets/svg-icons/icon-overview.svg +3 -0
  148. package/src/assets/svg-icons/icon-refresh.svg +3 -0
  149. package/src/assets/svg-icons/icon-search.svg +3 -0
  150. package/src/assets/svg-icons/icon-setting.svg +3 -0
  151. package/src/assets/svg-icons/icon-sun.svg +3 -3
  152. package/src/assets/svg-icons/icon-tips.svg +3 -0
  153. package/src/components/activity/OActivityApproval.vue +868 -0
  154. package/src/components/activity/OActivityForm.vue +548 -0
  155. package/src/components/activity/OActivityMyCalendar.vue +1540 -0
  156. package/src/components/activity/composables/useActivityConfig.ts +141 -0
  157. package/src/components/activity/config.ts +1 -0
  158. package/src/components/activity/index.ts +24 -0
  159. package/src/components/activity/types.ts +95 -0
  160. package/src/components/banner/OBanner.vue +288 -0
  161. package/src/components/banner/OBannerContent.vue +175 -0
  162. package/src/components/banner/index.ts +18 -0
  163. package/src/components/banner/types.ts +39 -0
  164. package/src/components/common/AppAvatar.vue +83 -0
  165. package/src/components/common/ClientOnly.vue +13 -0
  166. package/src/components/common/ContentWrapper.vue +85 -85
  167. package/src/components/common/MoreText.vue +124 -0
  168. package/src/components/common/ThFilter.vue +330 -0
  169. package/src/components/{OPlusConfigProvider.vue → config-provider/OPlusConfigProvider.vue} +32 -32
  170. package/src/components/config-provider/index.ts +10 -0
  171. package/src/components/cookie-notice/OCookieNotice.vue +575 -0
  172. package/src/components/cookie-notice/index.ts +10 -0
  173. package/src/components/element-plus/OElCookieNotice.vue +603 -0
  174. package/src/components/element-plus/index.ts +3 -0
  175. package/src/components/events/OEventsApply.vue +503 -0
  176. package/src/components/events/OEventsCalendar.vue +600 -0
  177. package/src/components/events/OEventsList.vue +463 -0
  178. package/src/components/events/config.ts +35 -0
  179. package/src/components/events/index.ts +24 -0
  180. package/src/components/events/types.ts +84 -0
  181. package/src/components/events/utils.ts +9 -0
  182. package/src/components/footer/OFooter.vue +577 -0
  183. package/src/components/footer/index.ts +10 -0
  184. package/src/components/header/OHeader.vue +157 -0
  185. package/src/components/header/OHeaderMobile.vue +184 -0
  186. package/src/components/header/components/HeaderContent.vue +1125 -0
  187. package/src/components/header/components/HeaderNav.vue +278 -0
  188. package/src/components/header/components/HeaderNavMobile.vue +380 -0
  189. package/src/components/header/index.ts +18 -0
  190. package/src/components/header/types.ts +96 -0
  191. package/src/components/header-language-switcher/OHeaderLanguageSwitcher.vue +211 -0
  192. package/src/components/header-language-switcher/index.ts +10 -0
  193. package/src/components/header-search/OHeaderSearch.vue +628 -0
  194. package/src/components/header-search/index.ts +10 -0
  195. package/src/components/header-source-code/OHeaderSourceCode.vue +151 -0
  196. package/src/components/header-source-code/index.ts +10 -0
  197. package/src/components/header-theme/OHeaderTheme.vue +132 -0
  198. package/src/components/header-theme/index.ts +10 -0
  199. package/src/components/header-user/OHeaderUser.vue +238 -0
  200. package/src/components/header-user/index.ts +10 -0
  201. package/src/components/meeting/OMeetingCalendar.vue +909 -0
  202. package/src/components/meeting/OMeetingForm.vue +1131 -0
  203. package/src/components/meeting/OMeetingMyCalendar.vue +1536 -0
  204. package/src/components/meeting/OMeetingPlayback.vue +469 -0
  205. package/src/components/meeting/OMeetingSigCalendar.vue +439 -0
  206. package/src/components/meeting/components/OMeetingCalendarList.vue +609 -0
  207. package/src/components/meeting/components/OMeetingCalendarSelector.vue +213 -0
  208. package/src/components/meeting/components/OMeetingDetail.vue +263 -0
  209. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +615 -0
  210. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +741 -0
  211. package/src/components/meeting/components/OMeetingSigAside.vue +204 -0
  212. package/src/components/meeting/composables/useMeetingConfig.ts +108 -0
  213. package/src/components/meeting/config.ts +48 -0
  214. package/src/components/meeting/index.ts +45 -0
  215. package/src/components/meeting/types.ts +268 -0
  216. package/src/components/meeting/utils.ts +70 -0
  217. package/src/components/search/OSearchInput.vue +526 -0
  218. package/src/components/search/composables/useImageSearch.ts +157 -0
  219. package/src/components/search/composables/useKeywordHighlight.ts +30 -0
  220. package/src/components/search/composables/useSearchHistory.ts +75 -0
  221. package/src/components/search/index.ts +23 -0
  222. package/src/components/search/internal/HighlightText.vue +37 -0
  223. package/src/components/search/internal/SearchImageInput.vue +498 -0
  224. package/src/components/search/internal/SearchPanel.vue +431 -0
  225. package/src/components/search/types.ts +25 -0
  226. package/src/components/{OSection.vue → section/OSection.vue} +178 -178
  227. package/src/components/section/index.ts +10 -0
  228. package/src/draft/Banner.vue +265 -265
  229. package/src/draft/ButtonCards.vue +105 -105
  230. package/src/draft/Feature.vue +133 -133
  231. package/src/draft/Footer.vue +519 -512
  232. package/src/draft/HorizontalAnchor.vue +165 -165
  233. package/src/draft/ItemSwiper.vue +133 -133
  234. package/src/draft/Logo.vue +141 -141
  235. package/src/draft/LogoCard.vue +74 -74
  236. package/src/draft/LogoV2.vue +19 -19
  237. package/src/draft/MainCard.vue +38 -38
  238. package/src/draft/MultiCard.vue +94 -94
  239. package/src/draft/MultiIconCard.vue +73 -73
  240. package/src/draft/OInfoCard.vue +176 -176
  241. package/src/draft/Process.vue +81 -81
  242. package/src/draft/Section.vue +167 -167
  243. package/src/draft/SingleTabCard.vue +84 -84
  244. package/src/draft/SliderCard.vue +111 -110
  245. package/src/env.d.ts +16 -1
  246. package/src/i18n/en.ts +276 -20
  247. package/src/i18n/index.ts +56 -42
  248. package/src/i18n/zh.ts +266 -9
  249. package/src/index.ts +16 -32
  250. package/src/shared/provide.ts +6 -6
  251. package/src/shims-vue-dompurify-html.d.ts +17 -0
  252. package/src/vue.d.ts +9 -9
  253. package/tsconfig.json +37 -33
  254. package/vite.config.ts +123 -94
  255. package/dist/components/OBanner.vue.d.ts +0 -2
  256. package/dist/components/OCookieNotice.vue.d.ts +0 -16
  257. package/dist/components/OElCookieNotice.vue.d.ts +0 -31
  258. package/dist/components/OPlusConfigProvider.vue.d.ts +0 -23
  259. package/dist/components/OThemeSwitcher.vue.d.ts +0 -28
  260. package/dist/components.umd.js +0 -1
  261. package/src/components/OBanner.vue +0 -390
  262. package/src/components/OCookieNotice.vue +0 -424
  263. package/src/components/OElCookieNotice.vue +0 -413
  264. package/src/components/OHeaderSearch.vue +0 -601
  265. package/src/components/OThemeSwitcher.vue +0 -108
  266. package/src/components/common/ClientOnlyWrapper.ts +0 -21
@@ -0,0 +1,868 @@
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
+ --activity-card-radius: var(--o-radius-xs);
573
+ --activity-input-radius: var(--o-radius-xs);
574
+ .table-wrapper {
575
+ .el-table {
576
+ border-top: none;
577
+ }
578
+
579
+ .el-table__header {
580
+ margin-bottom: 0;
581
+ }
582
+ }
583
+
584
+ .expand-detail {
585
+ padding: 16px 60px;
586
+ background-color: var(--o-color-fill3);
587
+ }
588
+
589
+ .activity-btn {
590
+ .o-btn + .o-btn {
591
+ margin-left: 24px;
592
+ }
593
+
594
+ @include respond('<=pad_v') {
595
+ .o-btn + .o-btn {
596
+ margin-left: 16px;
597
+ }
598
+ }
599
+ @include respond('phone') {
600
+ margin-top: 8px;
601
+ .o-btn + .o-btn {
602
+ margin-left: 12px;
603
+ }
604
+ }
605
+ }
606
+
607
+ .o-btn-text {
608
+ @include hover {
609
+ background-color: transparent;
610
+ color: var(--o-color-primary1);
611
+ }
612
+ }
613
+
614
+ .o-btn.o-btn-text {
615
+ padding-left: 0 !important;
616
+ padding-right: 0 !important;
617
+ min-width: auto;
618
+ }
619
+
620
+ .o-tag {
621
+ --tag-radius: 100px;
622
+ font-weight: 500;
623
+ padding: 0 8px;
624
+ height: 24px;
625
+ line-height: 24px !important;
626
+ @include tip1;
627
+
628
+ .o-tag-label {
629
+ transform: none !important;
630
+ }
631
+
632
+ &.o-tag-outline {
633
+ --tag-bd-color: transparent;
634
+ --tag-color: #fff;
635
+ }
636
+
637
+ &.tag-under-review {
638
+ --tag-bg-color: rgb(var(--o-blue-6));
639
+ }
640
+
641
+ &.tag-draft,
642
+ &.tag-cancel {
643
+ --tag-color: var(--o-color-info3);
644
+ --tag-bg-color: var(--o-color-control1-light);
645
+ }
646
+
647
+ &.tag-registration,
648
+ &.tag-in-progress,
649
+ &.tag-ended {
650
+ --tag-bg-color: var(--o-color-success1);
651
+ }
652
+
653
+ &.tag-reject {
654
+ --tag-bg-color: var(--o-color-warning1);
655
+ }
656
+ }
657
+
658
+
659
+
660
+ .sort-time {
661
+ display: flex;
662
+ align-items: center;
663
+ cursor: pointer;
664
+ }
665
+
666
+ .sort-btn {
667
+ margin-left: 4px;
668
+ }
669
+
670
+ .sort-item {
671
+ width: 0;
672
+ height: 0;
673
+ border: 5px solid transparent;
674
+ }
675
+
676
+ .sort-asc {
677
+ border-bottom-color: var(--o-color-info2);
678
+ margin-bottom: 2px;
679
+
680
+ &.active {
681
+ border-bottom-color: var(--o-color-primary1);
682
+ }
683
+ }
684
+
685
+ .sort-desc {
686
+ border-top-color: var(--o-color-info2);
687
+ margin-top: 2px;
688
+
689
+ &.active {
690
+ border-top-color: var(--o-color-primary1);
691
+ }
692
+ }
693
+
694
+ .el-table {
695
+ --el-table-header-bg-color: rgba(235, 241, 250, 1);
696
+ color: var(--o-color-info1);
697
+ @include text1;
698
+
699
+ .el-table__header-wrapper {
700
+ border-radius: var(--activity-card-radius) var(--activity-card-radius) 0 0;
701
+
702
+ .el-table__cell {
703
+ padding: 12px 0 11px;
704
+ }
705
+
706
+ .cell {
707
+ color: var(--o-color-info2);
708
+ font-weight: 600;
709
+ @include text1;
710
+ }
711
+ }
712
+
713
+ .el-table__expanded-cell {
714
+ padding: 0;
715
+ }
716
+
717
+ .cell {
718
+ white-space: nowrap;
719
+ }
720
+ }
721
+
722
+ .pagination, .pagination-wrapper {
723
+ margin-top: var(--o-gap-6);
724
+ display: flex;
725
+ align-items: center;
726
+ justify-content: flex-end;
727
+ }
728
+
729
+ .o-textarea {
730
+ --_box-radius: var(--activity-input-radius);
731
+ }
732
+
733
+ .dialog-footer {
734
+ display: flex;
735
+ justify-content: center;
736
+ align-items: center;
737
+
738
+ .o-btn + .o-btn {
739
+ margin-left: 16px;
740
+ }
741
+
742
+ @include respond('<=pad_v') {
743
+ .o-btn {
744
+ width: 140px;
745
+ color: var(--o-color-info1);
746
+ padding: 6px 24px !important;
747
+ }
748
+ .o-btn + .o-btn {
749
+ margin-left: 0;
750
+ }
751
+ }
752
+ }
753
+
754
+ .collapse-wrapper {
755
+ .o-tag {
756
+ height: 24px;
757
+ }
758
+
759
+ .o-collapse {
760
+ padding: 0;
761
+ border-radius: var(--activity-card-radius);
762
+
763
+ .o-collapse-item {
764
+ --collapse-item-header-padding: 8px 0 12px;
765
+
766
+ &:last-child {
767
+ padding-bottom: 16px;
768
+ }
769
+ }
770
+
771
+ .act-sponsor {
772
+ display: flex;
773
+ align-items: center;
774
+ color: var(--o-color-info3);
775
+ margin-right: 16px;
776
+ @include text1;
777
+ }
778
+
779
+ .sponsor {
780
+ margin-right: 12px;
781
+ @include text-truncate(1);
782
+ }
783
+
784
+ .o-collapse-item-icon {
785
+ transform: rotate(0deg);
786
+ width: 24px;
787
+ height: 24px;
788
+ }
789
+
790
+ .o-collapse-item-expanded .o-collapse-item-icon {
791
+ transform: rotate(90deg);
792
+ }
793
+
794
+ .o-collapse-item-header {
795
+ border-bottom: 1px solid var(--o-color-control4);
796
+ margin: 0 16px;
797
+ }
798
+ }
799
+
800
+ .activity-detail {
801
+ padding: 12px 16px;
802
+ background-color: rgba(243, 246, 250, 1);
803
+ }
804
+
805
+ .pagination {
806
+ justify-content: center;
807
+ margin-top: 24px;
808
+ }
809
+ }
810
+
811
+ .title-top {
812
+ display: flex;
813
+ align-items: center;
814
+ justify-content: space-between;
815
+ padding: 12px 16px 0;
816
+
817
+ .act-title {
818
+ color: var(--o-color-info1);
819
+ margin-right: 12px;
820
+ font-weight: 600;
821
+ @include text1;
822
+ @include text-truncate(1);
823
+ }
824
+ }
825
+ }
826
+
827
+ </style>
828
+
829
+ <style lang="scss">
830
+ .handle-dialog-approval {
831
+ --activity-card-radius: var(--o-radius-xs);
832
+ --dlg-width: 450px;
833
+ --dlg-radius: var(--activity-card-radius);
834
+ @include respond('<=pad_v') {
835
+ width: 100%;
836
+ --dlg-radius: var(--activity-card-radius) var(--activity-card-radius) 0 0;
837
+ }
838
+ }
839
+
840
+ .cancel-dialog {
841
+ .o-dlg-footer {
842
+ margin-top: var(--o-gap-5);
843
+ }
844
+ }
845
+ .review-dialog {
846
+ --dlg-width: 690px;
847
+ --activity-input-radius: var(--o-radius-xs);
848
+
849
+ .o-form {
850
+ width: 450px;
851
+ margin: 0 auto;
852
+
853
+ .o-form-item-label {
854
+ margin-bottom: var(--o-gap-2);
855
+ }
856
+
857
+ .o-textarea {
858
+ width: 100%;
859
+ --_box-radius: var(--activity-input-radius);
860
+ }
861
+ }
862
+
863
+ .o-dlg-footer {
864
+ margin-top: var(--o-gap-6);
865
+ }
866
+ }
867
+
868
+ </style>