@opendesign-plus-test/components 0.0.1-rc.41 → 0.0.1-rc.43

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 (56) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -1
  2. package/dist/chunk-OElCookieNotice.es.js +111 -111
  3. package/dist/components/OHeaderSearch.vue.d.ts +6 -10
  4. package/dist/components/OSourceCode.vue.d.ts +4 -6
  5. package/dist/components/activity/OActivityApproval.vue.d.ts +6 -10
  6. package/dist/components/activity/OActivityForm.vue.d.ts +3 -5
  7. package/dist/components/activity/OMyActivityCalendar.vue.d.ts +18 -26
  8. package/dist/components/activity/index.d.ts +15 -23
  9. package/dist/components/activity/types.d.ts +8 -1
  10. package/dist/components/events/config.d.ts +5 -18
  11. package/dist/components/events/types.d.ts +4 -1
  12. package/dist/components/header/OHeaderMobile.vue.d.ts +18 -11
  13. package/dist/components/header/components/HeaderNavMobile.vue.d.ts +4 -1
  14. package/dist/components/header/index.d.ts +12 -5
  15. package/dist/components/header/types.d.ts +4 -0
  16. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +10 -14
  17. package/dist/components/meeting/OMeetingForm.vue.d.ts +3 -5
  18. package/dist/components/meeting/OMeetingPlayback.vue.d.ts +45 -0
  19. package/dist/components/meeting/OMyMeetingCalendar.vue.d.ts +18 -26
  20. package/dist/components/meeting/components/OMeetingCalendarList.vue.d.ts +1 -1
  21. package/dist/components/meeting/components/OMeetingDetail.vue.d.ts +2 -1
  22. package/dist/components/meeting/index.d.ts +786 -0
  23. package/dist/components/meeting/types.d.ts +83 -18
  24. package/dist/components/meeting/utils.d.ts +1 -1
  25. package/dist/components.cjs.js +38 -38
  26. package/dist/components.css +1 -1
  27. package/dist/components.es.js +12466 -12392
  28. package/package.json +3 -3
  29. package/src/components/OSourceCode.vue +8 -10
  30. package/src/components/activity/OActivityApproval.vue +35 -34
  31. package/src/components/activity/OActivityForm.vue +4 -4
  32. package/src/components/activity/OMyActivityCalendar.vue +44 -27
  33. package/src/components/activity/types.ts +8 -1
  34. package/src/components/common/MoreText.vue +1 -1
  35. package/src/components/common/ThFilter.vue +7 -7
  36. package/src/components/element-plus/OElCookieNotice.vue +1 -1
  37. package/src/components/events/OEventsList.vue +45 -10
  38. package/src/components/events/config.ts +1 -1
  39. package/src/components/events/types.ts +4 -1
  40. package/src/components/header/OHeaderMobile.vue +8 -1
  41. package/src/components/header/components/HeaderContent.vue +7 -3
  42. package/src/components/header/components/HeaderNavMobile.vue +5 -2
  43. package/src/components/header/types.ts +4 -0
  44. package/src/components/meeting/OMeetingCalendar.vue +42 -48
  45. package/src/components/meeting/OMeetingForm.vue +75 -37
  46. package/src/components/meeting/OMeetingPlayback.vue +4 -4
  47. package/src/components/meeting/OMyMeetingCalendar.vue +33 -27
  48. package/src/components/meeting/OSigMeetingCalendar.vue +29 -26
  49. package/src/components/meeting/components/OMeetingCalendarList.vue +107 -88
  50. package/src/components/meeting/components/OMeetingCalendarSelector.vue +10 -6
  51. package/src/components/meeting/components/OMeetingDetail.vue +32 -16
  52. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +7 -7
  53. package/src/components/meeting/components/OSigMeetingAside.vue +2 -3
  54. package/src/components/meeting/config.ts +1 -12
  55. package/src/components/meeting/types.ts +89 -18
  56. package/vite.config.ts +3 -2
@@ -1,10 +1,10 @@
1
1
  <script setup lang="ts">
2
2
  import { ref, onMounted, computed, nextTick, watch } from 'vue';
3
- import { ODivider, OPopover, OIcon, OTabPane, OTab } from '@opensig/opendesign';
3
+ import { ODivider, OPopover, OIcon, OTabPane, OTab, OScroller } from '@opensig/opendesign';
4
4
  import dayjs from 'dayjs';
5
5
  import IconTips from '~icons/components/icon-tips.svg';
6
6
  import OSigMeetingAside from './components/OSigMeetingAside.vue';
7
- import { CalendarDataType, MeetingItemT } from './types.ts';
7
+ import { CalendarDataType, MeetingEventsItemT, MeetingItemT } from './types.ts';
8
8
  import { useScreen } from '@opendesign-plus/composables';
9
9
  import { useMeetingConfig } from './composables/useMeetingConfig';
10
10
  import OMeetingCalendarList from '@/components/meeting/components/OMeetingCalendarList.vue';
@@ -21,22 +21,22 @@ const { lePadV } = useScreen();
21
21
  const selectDate = ref<string>('');
22
22
 
23
23
  const loading = ref(false); // 数据加载状态
24
- const list = ref<MeetingItemT[]>([]); // 某天的会议列表
24
+ const list = ref<(MeetingItemT | MeetingEventsItemT)[]>([]); // 某天的会议列表
25
25
  const calendarRows = computed(() => (lePadV.value ? 100 : 5)); // 日历行数
26
26
 
27
27
  const latestDate = ref<string>('');
28
28
  const meetingDates = ref<string[]>([]);
29
29
  const eventsDates = ref<string[]>([]);
30
- const eventsData = ref([]);
30
+ const eventsData = ref<MeetingEventsItemT[]>([]);
31
31
  const monthIdx = ref(-1);
32
- const clickDateCell2 = (date) => {
32
+ const clickDateCell2 = (date: string) => {
33
33
  clickDateCell(date);
34
34
  };
35
- const changeSelect = (v) => {
35
+ const changeSelect = (v: string) => {
36
36
  clickDateCell(v);
37
37
  };
38
38
  // 获取所选日期的会议列表
39
- const clickDateCell = async (date) => {
39
+ const clickDateCell = async (date: string) => {
40
40
  if (!props.getMeetingListRequest) {
41
41
  return;
42
42
  }
@@ -44,7 +44,7 @@ const clickDateCell = async (date) => {
44
44
  loading.value = true;
45
45
  selectDate.value = dayjs(date).format('YYYY-MM-DD');
46
46
  const res = await props.getMeetingListRequest(selectDate.value, props.sigName);
47
- list.value = res.map((v) => {
47
+ list.value = res.map((v: MeetingItemT) => {
48
48
  return {
49
49
  ...v,
50
50
  time: `${ v.start }-${ v.end }`,
@@ -55,7 +55,7 @@ const clickDateCell = async (date) => {
55
55
  } finally {
56
56
  loading.value = false;
57
57
  eventsData.value.forEach((v) => {
58
- if (v.dates.includes(selectDate.value)) {
58
+ if (v.dates?.includes(selectDate.value)) {
59
59
  list.value.push(v);
60
60
  }
61
61
  });
@@ -69,7 +69,7 @@ const getDates = async () => {
69
69
  }
70
70
  if (props.getEventsListRequest) {
71
71
  eventsData.value = await props.getEventsListRequest();
72
- eventsDates.value = (eventsData.value || []).map(v => v.dates).flat();
72
+ eventsDates.value = (eventsData.value || []).map(v => v.dates || []).flat();
73
73
  }
74
74
  };
75
75
  const tabType = ref(CalendarDataType.ALL);
@@ -81,13 +81,14 @@ watch(
81
81
  () => lePadV.value,
82
82
  () => {
83
83
  if (lePadV.value) {
84
- selectTab(CalendarDataType.ALL);
84
+ tabType.value = CalendarDataType.ALL;
85
+ selectTab();
85
86
  }
86
87
  },
87
88
  );
88
89
  // -------------------- 获取有会议的日期 --------------------
89
90
 
90
- const getMonthAndDay = (date) => {
91
+ const getMonthAndDay = (date: string) => {
91
92
  const dateStr = dayjs(date).format('YYYY-MM-DD');
92
93
  return [dateStr.slice(0, 7), dateStr.slice(8, 10)];
93
94
  };
@@ -121,9 +122,8 @@ watch(() => dateList.value, (val) => {
121
122
  });
122
123
  }
123
124
  });
124
-
125
125
  const groupDateList = computed(() => {
126
- const obj = dateList.value.reduce((pre, cur) => {
126
+ const obj = dateList.value.reduce((pre: any, cur: any) => {
127
127
  const [month, day] = getMonthAndDay(cur);
128
128
  pre[month] = {
129
129
  count: (pre[month]?.count || 0) + 1,
@@ -139,11 +139,11 @@ const groupDateList = computed(() => {
139
139
  };
140
140
  });
141
141
  const list: any[] = [];
142
- let current = [];
142
+ let current: any[] = [];
143
143
  monthList.forEach((t) => {
144
144
  while (t.days.length) {
145
145
  if (!current.length) {
146
- t.days.splice(0, 6).forEach((day) => {
146
+ t.days.splice(0, 6).forEach((day: string) => {
147
147
  current.push({
148
148
  month: t.month,
149
149
  day: day,
@@ -160,7 +160,7 @@ const groupDateList = computed(() => {
160
160
  count += 1;
161
161
  }
162
162
  if (t.days.length + current.length <= 6) {
163
- t.days.splice(0, 6).forEach((day) => {
163
+ t.days.splice(0, 6).forEach((day: string) => {
164
164
  current.push({
165
165
  month: t.month,
166
166
  day: day,
@@ -171,7 +171,7 @@ const groupDateList = computed(() => {
171
171
  current = [];
172
172
  }
173
173
  } else {
174
- t.days.splice(0, 6 - count).forEach((day) => {
174
+ t.days.splice(0, 6 - count).forEach((day: string) => {
175
175
  current.push({
176
176
  month: t.month,
177
177
  day: day,
@@ -196,7 +196,7 @@ const groupDateList = computed(() => {
196
196
 
197
197
  const dateMapList = computed(() => {
198
198
  return groupDateList.value.map((group) => {
199
- const obj = group.reduce((prev, cur) => {
199
+ const obj = group.reduce((prev: any, cur: any) => {
200
200
  prev[cur.month] = prev[cur.month] || [];
201
201
  prev[cur.month].push(cur.day);
202
202
  return prev;
@@ -212,9 +212,9 @@ const dateMapList = computed(() => {
212
212
 
213
213
  const getMonthIdx = () => {
214
214
  if (groupDateList.value.length) {
215
- monthIdx.value = groupDateList.value.findIndex((v) => v.some((t) => latestDate.value === `${ t.month }-${ t.day }`));
215
+ monthIdx.value = groupDateList.value.findIndex((v) => v.some((t: any) => latestDate.value === `${ t.month }-${ t.day }`));
216
216
  if (monthIdx.value === -1) {
217
- monthIdx.value = groupDateList.value.findIndex((v) => v.some((t) => latestDate.value.includes(t.month)));
217
+ monthIdx.value = groupDateList.value.findIndex((v) => v.some((t: any) => latestDate.value.includes(t.month)));
218
218
  }
219
219
  } else {
220
220
  monthIdx.value = -1;
@@ -228,7 +228,7 @@ watch(
228
228
  { deep: true },
229
229
  );
230
230
 
231
- const changeMonthIdx = (step) => {
231
+ const changeMonthIdx = (step: number) => {
232
232
  monthIdx.value += step;
233
233
  };
234
234
 
@@ -292,16 +292,16 @@ onMounted(() => {
292
292
  :active="selectDate"
293
293
  />
294
294
  </template>
295
- <div class="list-content">
295
+ <OScroller class="list-content" show-type="hover" size="small">
296
296
  <OMeetingCalendarList
297
- :list="list"
297
+ :list="list as unknown as MeetingItemT[]"
298
298
  :rows="calendarRows"
299
299
  >
300
300
  <template #empty>
301
301
  <slot name="empty"></slot>
302
302
  </template>
303
303
  </OMeetingCalendarList>
304
- </div>
304
+ </OScroller>
305
305
  </div>
306
306
  </div>
307
307
  </template>
@@ -404,7 +404,10 @@ onMounted(() => {
404
404
 
405
405
  .list-content {
406
406
  flex-grow: 1;
407
- height: calc(100% - 70px);
407
+ height: 400px;
408
+ @include respond-to('<=pad_v') {
409
+ height: auto;
410
+ }
408
411
  }
409
412
  }
410
413
  </style>
@@ -3,7 +3,7 @@ import { OCollapse, OCollapseItem, ODivider, OIcon, OLink, OTag, useMessage } fr
3
3
  import OMeetingDetail from './OMeetingDetail.vue';
4
4
  import { computed, nextTick, ref, watch } from 'vue';
5
5
  import IconCopy from '~icons/meeting/icon-copy.svg';
6
- import { MeetingGroupType, MeetingItemT } from '../types.ts';
6
+ import { CalendarDataType, CycleSubItemT, MeetingGroupType, MeetingItemT, ObsDataItemT } from '../types.ts';
7
7
  import IconChevronRight from '~icons/components/icon-chevron-right.svg';
8
8
  import { INTERVAL_DAY, INTERVAL_MONTH, INTERVAL_WEEK } from '../config.ts';
9
9
  import { formatDate } from '../utils.ts';
@@ -14,14 +14,14 @@ const { activityTypeMap } = useActivityConfig();
14
14
 
15
15
  const props = withDefaults(defineProps<{
16
16
  list: MeetingItemT[];
17
- groupType: MeetingGroupType;
17
+ groupType?: MeetingGroupType;
18
18
  }>(), {
19
19
  list: () => [],
20
20
  });
21
21
  const { t, locale, getConfig, getPointStr } = useMeetingConfig();
22
- const detailRefs = ref([]);
22
+ const detailRefs = ref<any[]>([]);
23
23
  const message = useMessage(null);
24
- const copyInfo = async (idx) => {
24
+ const copyInfo = async (idx: number) => {
25
25
  const instance = detailRefs.value[idx];
26
26
  await instance.copyInfo();
27
27
  message.success({
@@ -29,7 +29,7 @@ const copyInfo = async (idx) => {
29
29
  });
30
30
  };
31
31
 
32
- const collapseNames = ref([]);
32
+ const collapseNames = ref<number[]>([]);
33
33
  const i18n = computed(() => {
34
34
  return {
35
35
  SIG_GROUP: `${ props.groupType === MeetingGroupType.GROUP ? t('meeting.groups') : t('meeting.sigs') }: `,
@@ -43,7 +43,7 @@ const i18n = computed(() => {
43
43
  });
44
44
 
45
45
  // -------------------- 监听尺寸变化 --------------------
46
- const meetInfoRef = ref();
46
+ const meetInfoRef = ref<HTMLDivElement[]>();
47
47
  const resizeObserver = new ResizeObserver((entries) => {
48
48
  for (let entry of entries) {
49
49
  const { height } = entry.contentRect;
@@ -70,11 +70,11 @@ watch(
70
70
  },
71
71
  );
72
72
 
73
- const computedList = computed(() => {
74
- return props.list.map((v) => {
73
+ const computedList = computed<any[]>(() => {
74
+ return props.list.map((v: any) => {
75
75
  const type = v.type;
76
76
  let dateRange = '';
77
- if (type !== 'meeting') {
77
+ if (type !== CalendarDataType.MEETING) {
78
78
  let activity_type = activityTypeMap.value.get(v.activity_type)?.label;
79
79
  if (v.start && v.end) {
80
80
  if (v.end_date === v.start_date) {
@@ -113,7 +113,7 @@ const computedList = computed(() => {
113
113
  let timeRange = `${ start } - ${ end }`;
114
114
  let replay_url = null;
115
115
  let hasObsData = false;
116
- const obsData = v.obs_data?.filter((v) => v.text_video_url) || [];
116
+ const obsData = v.obs_data?.filter((v: ObsDataItemT) => v.text_video_url) || [];
117
117
 
118
118
  if (is_cycle) {
119
119
  let cycleType = '';
@@ -122,13 +122,13 @@ const computedList = computed(() => {
122
122
  }
123
123
  if (cycle_type === INTERVAL_WEEK) {
124
124
  if (cycle_interval > 1) {
125
- cycleType = t('meeting.cycleWeek.other', [getPointStr(cycle_type, cycle_point), cycle_interval]);
125
+ cycleType = t('meeting.cycleWeek.other', [getPointStr(cycle_type, cycle_point as unknown as number[]), cycle_interval]);
126
126
  } else {
127
- cycleType = t('meeting.cycleWeek.one', [getPointStr(cycle_type, cycle_point)]);
127
+ cycleType = t('meeting.cycleWeek.one', [getPointStr(cycle_type, cycle_point as unknown as number[])]);
128
128
  }
129
129
  }
130
130
  if (cycle_type === INTERVAL_MONTH) {
131
- cycleType = t('meeting.cycleMonth', [getPointStr(cycle_type, cycle_point)]);
131
+ cycleType = t('meeting.cycleMonth', [getPointStr(cycle_type, cycle_point as unknown as number[])]);
132
132
  }
133
133
  timeRange = t('meeting.cycleMeetingText2', {
134
134
  startDate: cycle_start_date,
@@ -137,7 +137,7 @@ const computedList = computed(() => {
137
137
  endTime: cycle_end,
138
138
  cycleType,
139
139
  });
140
- hasObsData = obsData.some((t) => t.sub_id === v.cycle_sub.find((z) => z.date === date)?.sub_id);
140
+ hasObsData = obsData.some((t: ObsDataItemT) => t.sub_id === v.cycle_sub.find((z: CycleSubItemT) => z.date === date)?.sub_id);
141
141
  } else {
142
142
  hasObsData = obsData.length > 0;
143
143
  }
@@ -161,63 +161,65 @@ const computedList = computed(() => {
161
161
  <OCollapse v-else v-model="collapseNames" :style="{ '--collapse-padding': '0' }">
162
162
  <OCollapseItem v-for="(item, index) in computedList" :key="item.id" :value="item.id">
163
163
  <template #title>
164
- <div class="meet-title" :title="item.topic || item.name">
165
- <OIcon
166
- :style="{
164
+ <div class="meet-title-left">
165
+ <div class="meet-title" :title="item.topic || item.name">
166
+ <OIcon
167
+ :style="{
167
168
  backgroundColor: `${getConfig(item.type, 'color')}`
168
169
  }"
169
- >
170
- <component :is="getConfig(item.type, 'icon')" />
171
- </OIcon>
172
- <div class="text">
173
- {{ item.topic || item.name || item.title }}
174
- </div>
175
- <div class="tag-wrapper" v-if="item.is_cycle">
176
- <OTag color="primary" variant="outline">{{ t('meeting.cycle') }}</OTag>
170
+ >
171
+ <component :is="getConfig(item.type, 'icon')" />
172
+ </OIcon>
173
+ <div class="text">
174
+ {{ item.topic || item.name || item.title }}
175
+ </div>
176
+ <div class="tag-wrapper" v-if="item.is_cycle">
177
+ <OTag color="primary" variant="outline">{{ t('meeting.cycle') }}</OTag>
178
+ </div>
177
179
  </div>
178
- </div>
179
- <div class="meet-info" ref="meetInfoRef">
180
+ <div class="meet-info" ref="meetInfoRef">
180
181
  <span class="start-time">
181
182
  <span>{{ item.dateRange }}</span>
182
183
  </span>
183
- <ODivider direction="v" />
184
- <div>
185
- <template v-if="item.group_name">{{ i18n.SIG_GROUP }} {{ item.group_name }}</template>
186
- <template v-if="item.activity_type">{{ item.activity_type }}</template>
184
+ <ODivider direction="v" />
185
+ <div>
186
+ <template v-if="item.group_name">{{ i18n.SIG_GROUP }} {{ item.group_name }}</template>
187
+ <template v-if="item.activity_type">{{ item.activity_type }}</template>
188
+ </div>
187
189
  </div>
190
+ <OLink v-if="item.url" :href="item.url" target="_blank" class="jump-detail-link">
191
+ <span>{{ i18n.LEARN_MORE }}</span>
192
+ <template #suffix>
193
+ <OIcon>
194
+ <IconChevronRight />
195
+ </OIcon>
196
+ </template>
197
+ </OLink>
198
+ <OLink v-if="item.join_url" :href="item.join_url" target="_blank" class="jump-detail-link">
199
+ <span>{{ i18n.JOIN_MEETING }}</span>
200
+ <template #suffix>
201
+ <OIcon>
202
+ <IconChevronRight />
203
+ </OIcon>
204
+ </template>
205
+ </OLink>
206
+ <OLink v-if="item.content_url" :href="item.content_url" target="_blank" class="jump-detail-link">
207
+ <span>{{ i18n.DETAILS }}</span>
208
+ <template #suffix>
209
+ <OIcon>
210
+ <IconChevronRight />
211
+ </OIcon>
212
+ </template>
213
+ </OLink>
214
+ <OLink v-if="item.register_url" :href="item.register_url" target="_blank" class="jump-detail-link">
215
+ <span>{{ i18n.SIGN }}</span>
216
+ <template #suffix>
217
+ <OIcon>
218
+ <IconChevronRight />
219
+ </OIcon>
220
+ </template>
221
+ </OLink>
188
222
  </div>
189
- <OLink v-if="item.url" :href="item.url" target="_blank" class="jump-detail-link">
190
- <span>{{ i18n.LEARN_MORE }}</span>
191
- <template #suffix>
192
- <OIcon>
193
- <IconChevronRight />
194
- </OIcon>
195
- </template>
196
- </OLink>
197
- <OLink v-if="item.join_url" :href="item.join_url" target="_blank" class="jump-detail-link">
198
- <span>{{ i18n.JOIN_MEETING }}</span>
199
- <template #suffix>
200
- <OIcon>
201
- <IconChevronRight />
202
- </OIcon>
203
- </template>
204
- </OLink>
205
- <OLink v-if="item.content_url" :href="item.content_url" target="_blank" class="jump-detail-link">
206
- <span>{{ i18n.DETAILS }}</span>
207
- <template #suffix>
208
- <OIcon>
209
- <IconChevronRight />
210
- </OIcon>
211
- </template>
212
- </OLink>
213
- <OLink v-if="item.register_url" :href="item.register_url" target="_blank" class="jump-detail-link">
214
- <span>{{ i18n.SIGN }}</span>
215
- <template #suffix>
216
- <OIcon>
217
- <IconChevronRight />
218
- </OIcon>
219
- </template>
220
- </OLink>
221
223
  <OIcon @click.stop="() => copyInfo(index)" class="copy-icon">
222
224
  <IconCopy />
223
225
  </OIcon>
@@ -295,9 +297,17 @@ const computedList = computed(() => {
295
297
  }
296
298
 
297
299
  &.o-collapse-item-expanded {
298
- .copy-icon {
299
- display: inline-flex;
300
+ .o-collapse-item-header {
301
+ padding-bottom: var(--o-gap-2);
302
+
303
+ .o-collapse-item-title {
304
+ .copy-icon {
305
+ opacity: 1;
306
+ visibility: visible;
307
+ }
308
+ }
300
309
  }
310
+
301
311
  }
302
312
  }
303
313
 
@@ -312,8 +322,11 @@ const computedList = computed(() => {
312
322
 
313
323
  @include respond-to('>pad_v') {
314
324
  &:hover {
315
- .copy-icon {
316
- display: inline-flex;
325
+ .o-collapse-item-title {
326
+ .copy-icon {
327
+ opacity: 1;
328
+ visibility: visible;
329
+ }
317
330
  }
318
331
  }
319
332
  }
@@ -324,6 +337,31 @@ const computedList = computed(() => {
324
337
  .o-collapse-item-title {
325
338
  flex-grow: 1;
326
339
  margin-bottom: 0;
340
+ display: flex;
341
+ align-items: center;
342
+ justify-content: center;
343
+ gap: var(--o-gap-4);
344
+ padding-right: var(--o-gap-4);
345
+
346
+ .meet-title-left {
347
+ flex-grow: 1;
348
+ min-width: 0;
349
+ }
350
+
351
+ .copy-icon {
352
+ flex-shrink: 0;
353
+ display: inline-flex;
354
+ opacity: 0;
355
+ visibility: hidden;
356
+
357
+ &:hover {
358
+ color: var(--o-color-primary1);
359
+ }
360
+
361
+ svg path {
362
+ fill: currentColor;
363
+ }
364
+ }
327
365
  }
328
366
 
329
367
 
@@ -349,7 +387,7 @@ const computedList = computed(() => {
349
387
  display: flex;
350
388
  color: var(--o-color-info3);
351
389
  flex-direction: column;
352
- background-color: color-mix(in srgb, var(--o-color-control2-light), transparent 60%);
390
+ background-color: color-mix(in srgb, var(--o-color-control2-light) 40%, transparent);
353
391
  padding: 16px 16px 16px calc(var(--icon-right) + var(--icon-size2) + var(--o-gap-5) - 12px);
354
392
  border-radius: var(--o-radius-xs);
355
393
  @include tip1;
@@ -405,7 +443,7 @@ const computedList = computed(() => {
405
443
  display: flex;
406
444
  align-items: center;
407
445
  width: calc(100% - 48px);
408
- color: var(--o-color-info1);
446
+ color: var(--o-color-info2);
409
447
  @include text2;
410
448
 
411
449
  @include respond-to('<=pad_v') {
@@ -469,26 +507,7 @@ const computedList = computed(() => {
469
507
  }
470
508
  }
471
509
 
472
- .copy-icon {
473
- position: absolute;
474
- top: 50%;
475
- transform: translateY(-50%);
476
- right: 56px;
477
- font-size: 18px;
478
- display: none;
479
510
 
480
- @include respond-to('phone') {
481
- right: 48px;
482
- }
483
-
484
- &:hover {
485
- color: var(--o-color-primary1);
486
- }
487
-
488
- svg path {
489
- fill: currentColor;
490
- }
491
- }
492
511
 
493
512
  }
494
513
  }
@@ -26,9 +26,9 @@ const getList = () => {
26
26
  };
27
27
 
28
28
  const list = computed(() => getList());
29
- const checked = ref([]);
30
- const temp = ref([]);
31
- const selectorRef = ref(null);
29
+ const checked = ref<number[]>([]);
30
+ const temp = ref<number[]>([]);
31
+ const selectorRef = ref<InstanceType<typeof ElSelect> | null>(null);
32
32
 
33
33
  const init = () => {
34
34
  checked.value = [...props.modelValue];
@@ -41,12 +41,16 @@ watchEffect(() => {
41
41
 
42
42
  const confirm = () => {
43
43
  emits('update:modelValue', temp.value);
44
- selectorRef.value.expanded = false;
44
+ if (selectorRef.value) {
45
+ selectorRef.value.expanded = false;
46
+ }
45
47
  };
46
48
 
47
49
  const cancel = () => {
48
50
  init();
49
- selectorRef.value.expanded = false;
51
+ if (selectorRef.value) {
52
+ selectorRef.value.expanded = false;
53
+ }
50
54
  };
51
55
 
52
56
  const clickItem = (val: number) => {
@@ -83,7 +87,7 @@ const removeTag = (val: number) => {
83
87
  size="large"
84
88
  multiple
85
89
  collapseTags
86
- maxCollapseTags="3"
90
+ :maxCollapseTags="3"
87
91
  :modelValue="checked"
88
92
  @remove-tag="removeTag"
89
93
  >
@@ -10,6 +10,7 @@ const props = defineProps<{
10
10
  data: MeetingItemT;
11
11
  from?: string;
12
12
  show: boolean;
13
+ page?: CalendarDataType
13
14
  }>();
14
15
  const { t, getPlatformLabel } = useMeetingConfig();
15
16
 
@@ -29,7 +30,7 @@ const infoList = computed(() =>
29
30
 
30
31
 
31
32
  const activityInfoList = computed(() => {
32
- const isLive = props.data.live_url?.length > 0;
33
+ const isLive = !!props.data.live_url?.length;
33
34
  return [
34
35
  { label: t('meeting.activityDetail2'), key: 'agenda', ellipsis: true },
35
36
  { label: t('meeting.startDate'), key: 'start_date_time' },
@@ -42,7 +43,7 @@ const activityInfoList = computed(() => {
42
43
  ].slice(0, props.from === 'home' ? 5 : 8);
43
44
  });
44
45
  const activityInfoApprovalList = computed(() => {
45
- const isLive = props.data.live_url?.length > 0;
46
+ const isLive = !!props.data.live_url?.length;
46
47
  return [
47
48
  { label: t('meeting.activityType'), key: 'activity_type', isType: true },
48
49
  { label: isLive ? t('meeting.livePlatform') : t('meeting.activityAddress'), key: isLive ? 'live_url' : 'address' },
@@ -56,13 +57,28 @@ const activityInfoApprovalList = computed(() => {
56
57
  ];
57
58
  });
58
59
 
59
- const columns = computed(() => {
60
+ interface ColumnItemT {
61
+ label: string;
62
+ key: string;
63
+ ellipsis?: boolean;
64
+ isLink?: boolean;
65
+ isRecord?: boolean;
66
+ isType?: boolean;
67
+ extra?: string;
68
+ }
69
+
70
+ const getField = (key: string) => (props.data as Record<string, any>)[key];
71
+
72
+ const columns = computed<ColumnItemT[]>(() => {
60
73
  if (props.data.type === CalendarDataType.EVENTS) {
61
74
  if (props.page === CalendarDataType.APPROVAL) {
62
75
  return activityInfoApprovalList.value;
63
76
  }
64
77
  return activityInfoList.value;
65
78
  }
79
+ if (props.data.type === CalendarDataType.SUMMIT) {
80
+ return activityInfoList.value;
81
+ }
66
82
  return infoList.value;
67
83
  });
68
84
 
@@ -71,7 +87,7 @@ const domRef = ref([]);
71
87
  const copyInfo = () => {
72
88
  try {
73
89
  let text = `${ t('meeting.meetingTopic') + props.data.topic }\n`;
74
- text += [...domRef.value].reduce((pre, cur) => `${ pre }${ cur.textContent }\n`, '');
90
+ text += [...domRef.value].reduce((pre, cur: HTMLDivElement) => `${ pre }${ cur.textContent }\n`, '');
75
91
  navigator.clipboard.writeText(text);
76
92
  return Promise.resolve();
77
93
  } catch (e) {
@@ -89,36 +105,36 @@ defineExpose({ copyInfo });
89
105
  v-for="(info, infoIdx) in columns"
90
106
  :key="infoIdx"
91
107
  :class="{
92
- 'record-item': info.isRecord && data[info.key]?.length,
108
+ 'record-item': info.isRecord && getField(info.key)?.length,
93
109
  'link-item': info.isLink,
94
- 'is-empty':!data[info.key]?.length,
110
+ 'is-empty':!getField(info.key)?.length,
95
111
  [`label-item_${data.id}`]: true,
96
112
  [`type_${data.type}`]: true,
97
113
  }"
98
114
  >
99
- <template v-if="data[info.key] && !info.isRecord">
115
+ <template v-if="getField(info.key) && !info.isRecord">
100
116
  <span class="label">{{ info.label }}</span>
101
- <MoreText :show="show" v-if="info.ellipsis" :text="data[info.key] || '-'" />
117
+ <MoreText :show="show" v-if="info.ellipsis" :text="getField(info.key) || '-'" />
102
118
  <OLink
103
119
  v-else-if="info.isLink"
104
120
  target="_blank"
105
121
  class="value"
106
122
  color="primary"
107
123
  hover-underline
108
- :href="data[info.key]"
124
+ :href="getField(info.key)"
109
125
  >
110
- {{ data[info.key] }}
126
+ {{ getField(info.key) }}
111
127
  </OLink>
112
- <span v-else-if="info.key === 'platform'">{{ getPlatformLabel(data[info.key]) }}</span>
128
+ <span v-else-if="info.key === 'platform'">{{ getPlatformLabel(getField(info.key)) }}</span>
113
129
  <span v-else class="value">
114
- <i v-if="info.extra" class="extra">{{ data[info.extra] }}</i>
115
- {{ data[info.key] || '-' }}
130
+ <i v-if="info.extra" class="extra">{{ getField(info.extra) }}</i>
131
+ {{ getField(info.key) || '-' }}
116
132
  </span>
117
133
  </template>
118
- <template v-if="info.isRecord && data[info.key]?.length">
134
+ <template v-if="info.isRecord && getField(info.key)?.length">
119
135
  <span class="label">{{ info.label }}</span>
120
136
  <div>
121
- <p v-for="re in data[info.key]" :key="re.create_time" class="value">
137
+ <p v-for="re in getField(info.key)" :key="re.create_time" class="value">
122
138
  {{ re.reason }}&nbsp;&nbsp;
123
139
  {{ formatDate(re.create_time, 'YYYY/MM/DD HH:mm:ss') }}
124
140
  {{ re.action === 1 ? t('meeting.approveReview') : t('meeting.rejectReview') }}
@@ -174,7 +190,7 @@ defineExpose({ copyInfo });
174
190
  }
175
191
  }
176
192
 
177
- &.type_activity {
193
+ &.type_events {
178
194
  .label {
179
195
  width: 6em;
180
196
  }