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

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 (203) 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 +4 -4
  7. package/dist/components/OHeaderUser.vue.d.ts +40 -0
  8. package/dist/components/OSourceCode.vue.d.ts +20 -0
  9. package/dist/components/activity/OActivityApproval.vue.d.ts +277 -0
  10. package/dist/components/activity/OActivityForm.vue.d.ts +140 -0
  11. package/dist/components/activity/OMyActivityCalendar.vue.d.ts +578 -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 +623 -0
  15. package/dist/components/activity/types.d.ts +81 -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 +27 -0
  22. package/dist/components/events/index.d.ts +78 -0
  23. package/dist/components/events/types.d.ts +66 -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 +171 -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 +33 -0
  30. package/dist/components/header/index.d.ts +145 -0
  31. package/dist/components/header/types.d.ts +80 -0
  32. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +299 -0
  33. package/dist/components/meeting/OMeetingForm.vue.d.ts +145 -0
  34. package/dist/components/meeting/OMyMeetingCalendar.vue.d.ts +586 -0
  35. package/dist/components/meeting/OSigMeetingCalendar.vue.d.ts +24 -0
  36. package/dist/components/meeting/components/OMeetingCalendarList.vue.d.ts +28 -0
  37. package/dist/components/meeting/components/OMeetingCalendarSelector.vue.d.ts +664 -0
  38. package/dist/components/meeting/components/OMeetingDetail.vue.d.ts +13 -0
  39. package/dist/components/meeting/components/OMeetingPlaybackSubtitles.vue.d.ts +5 -0
  40. package/dist/components/meeting/components/OMeetingPlaybackVideo.vue.d.ts +17 -0
  41. package/dist/components/meeting/components/OSigMeetingAside.vue.d.ts +16 -0
  42. package/dist/components/meeting/composables/useMeetingConfig.d.ts +14 -0
  43. package/dist/components/meeting/config.d.ts +12 -0
  44. package/dist/components/meeting/types.d.ts +168 -0
  45. package/dist/components/meeting/utils.d.ts +8 -0
  46. package/dist/components.cjs.js +224 -1
  47. package/dist/components.css +1 -1
  48. package/dist/components.element.cjs.js +1 -0
  49. package/dist/components.element.es.js +4 -0
  50. package/dist/components.es.js +44348 -785
  51. package/dist/index.d.ts +9 -2
  52. package/docs/design.md +27 -27
  53. package/docs/design_banner.md +41 -41
  54. package/docs/design_section.md +27 -27
  55. package/package.json +12 -3
  56. package/scripts/generate-components-index.js +103 -80
  57. package/src/assets/events/svg-icons/icon-checked.svg +3 -0
  58. package/src/assets/events/svg-icons/icon-competition.svg +7 -0
  59. package/src/assets/events/svg-icons/icon-events.svg +4 -0
  60. package/src/assets/events/svg-icons/icon-release.svg +4 -0
  61. package/src/assets/events/svg-icons/icon-summit.svg +4 -0
  62. package/src/assets/meeting/svg-icons/icon-all.svg +3 -0
  63. package/src/assets/meeting/svg-icons/icon-backward.svg +4 -0
  64. package/src/assets/meeting/svg-icons/icon-calendar.svg +3 -0
  65. package/src/assets/meeting/svg-icons/icon-cancel.svg +4 -0
  66. package/src/assets/meeting/svg-icons/icon-captions.svg +4 -0
  67. package/src/assets/meeting/svg-icons/icon-close-captions.svg +6 -0
  68. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +6 -0
  69. package/src/assets/meeting/svg-icons/icon-copy.svg +3 -0
  70. package/src/assets/meeting/svg-icons/icon-create.svg +5 -0
  71. package/src/assets/meeting/svg-icons/icon-delete.svg +7 -0
  72. package/src/assets/meeting/svg-icons/icon-empty.svg +31 -0
  73. package/src/assets/meeting/svg-icons/icon-empty_dark.svg +49 -0
  74. package/src/assets/meeting/svg-icons/icon-event.svg +3 -0
  75. package/src/assets/meeting/svg-icons/icon-export.svg +3 -0
  76. package/src/assets/meeting/svg-icons/icon-forward.svg +4 -0
  77. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +6 -0
  78. package/src/assets/meeting/svg-icons/icon-help.svg +3 -0
  79. package/src/assets/meeting/svg-icons/icon-important.svg +4 -0
  80. package/src/assets/meeting/svg-icons/icon-info.svg +3 -0
  81. package/src/assets/meeting/svg-icons/icon-meet.svg +3 -0
  82. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +5 -0
  83. package/src/assets/meeting/svg-icons/icon-meeting.svg +4 -0
  84. package/src/assets/meeting/svg-icons/icon-play.svg +5 -0
  85. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +7 -0
  86. package/src/assets/meeting/svg-icons/icon-playing.svg +5 -0
  87. package/src/assets/meeting/svg-icons/icon-question.svg +4 -0
  88. package/src/assets/meeting/svg-icons/icon-sound.svg +5 -0
  89. package/src/assets/meeting/svg-icons/icon-speaker.svg +3 -0
  90. package/src/assets/meeting/svg-icons/icon-summit.svg +3 -0
  91. package/src/assets/meeting/svg-icons/icon-telligent.svg +3 -0
  92. package/src/assets/meeting/svg-icons/icon-tip.svg +3 -0
  93. package/src/assets/meeting/svg-icons/icon-todo.svg +4 -0
  94. package/src/assets/meeting/transparent.png +0 -0
  95. package/src/assets/svg-icons/icon-arrow-left.svg +3 -0
  96. package/src/assets/svg-icons/icon-avatar-line.svg +3 -0
  97. package/src/assets/svg-icons/icon-caret-left.svg +3 -0
  98. package/src/assets/svg-icons/icon-caret-right.svg +3 -0
  99. package/src/assets/svg-icons/icon-chevron-down.svg +3 -0
  100. package/src/assets/svg-icons/icon-chevron-right.svg +3 -3
  101. package/src/assets/svg-icons/icon-chevron-up.svg +3 -0
  102. package/src/assets/svg-icons/icon-close.svg +3 -3
  103. package/src/assets/svg-icons/icon-delete.svg +3 -3
  104. package/src/assets/svg-icons/icon-filter.svg +3 -0
  105. package/src/assets/svg-icons/icon-header-back.svg +3 -3
  106. package/src/assets/svg-icons/icon-header-delete.svg +3 -3
  107. package/src/assets/svg-icons/icon-header-menu.svg +3 -0
  108. package/src/assets/svg-icons/icon-header-person.svg +3 -0
  109. package/src/assets/svg-icons/icon-header-search.svg +4 -4
  110. package/src/assets/svg-icons/icon-loading.svg +4 -0
  111. package/src/assets/svg-icons/icon-locale.svg +3 -0
  112. package/src/assets/svg-icons/icon-log-off.svg +3 -0
  113. package/src/assets/svg-icons/icon-message.svg +3 -0
  114. package/src/assets/svg-icons/icon-moon.svg +3 -3
  115. package/src/assets/svg-icons/icon-outlink.svg +3 -0
  116. package/src/assets/svg-icons/icon-overview.svg +3 -0
  117. package/src/assets/svg-icons/icon-search.svg +3 -0
  118. package/src/assets/svg-icons/icon-setting.svg +3 -0
  119. package/src/assets/svg-icons/icon-sun.svg +3 -3
  120. package/src/assets/svg-icons/icon-tips.svg +3 -0
  121. package/src/components/OBanner.vue +398 -390
  122. package/src/components/OCookieNotice.vue +575 -424
  123. package/src/components/OFooter.vue +576 -0
  124. package/src/components/OHeaderSearch.vue +601 -601
  125. package/src/components/OHeaderUser.vue +237 -0
  126. package/src/components/OPlusConfigProvider.vue +32 -32
  127. package/src/components/OSection.vue +178 -178
  128. package/src/components/OSourceCode.vue +153 -0
  129. package/src/components/OThemeSwitcher.vue +108 -108
  130. package/src/components/activity/OActivityApproval.vue +864 -0
  131. package/src/components/activity/OActivityForm.vue +542 -0
  132. package/src/components/activity/OMyActivityCalendar.vue +1486 -0
  133. package/src/components/activity/composables/useActivityConfig.ts +141 -0
  134. package/src/components/activity/config.ts +1 -0
  135. package/src/components/activity/index.ts +24 -0
  136. package/src/components/activity/types.ts +88 -0
  137. package/src/components/common/AppAvatar.vue +83 -0
  138. package/src/components/common/ClientOnlyWrapper.ts +21 -21
  139. package/src/components/common/ContentWrapper.vue +85 -85
  140. package/src/components/common/MoreText.vue +124 -0
  141. package/src/components/common/ThFilter.vue +330 -0
  142. package/src/components/element-plus/OElCookieNotice.vue +603 -0
  143. package/src/components/element-plus/index.ts +3 -0
  144. package/src/components/events/OEventsApply.vue +418 -0
  145. package/src/components/events/OEventsCalendar.vue +598 -0
  146. package/src/components/events/OEventsList.vue +362 -0
  147. package/src/components/events/config.ts +35 -0
  148. package/src/components/events/index.ts +24 -0
  149. package/src/components/events/types.ts +80 -0
  150. package/src/components/events/utils.ts +9 -0
  151. package/src/components/header/OHeader.vue +157 -0
  152. package/src/components/header/OHeaderMobile.vue +177 -0
  153. package/src/components/header/components/HeaderContent.vue +1121 -0
  154. package/src/components/header/components/HeaderNav.vue +278 -0
  155. package/src/components/header/components/HeaderNavMobile.vue +377 -0
  156. package/src/components/header/index.ts +16 -0
  157. package/src/components/header/types.ts +91 -0
  158. package/src/components/meeting/OMeetingCalendar.vue +878 -0
  159. package/src/components/meeting/OMeetingForm.vue +1053 -0
  160. package/src/components/meeting/OMeetingPlayback.vue +439 -0
  161. package/src/components/meeting/OMyMeetingCalendar.vue +1497 -0
  162. package/src/components/meeting/OSigMeetingCalendar.vue +410 -0
  163. package/src/components/meeting/components/OMeetingCalendarList.vue +510 -0
  164. package/src/components/meeting/components/OMeetingCalendarSelector.vue +206 -0
  165. package/src/components/meeting/components/OMeetingDetail.vue +229 -0
  166. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +611 -0
  167. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +741 -0
  168. package/src/components/meeting/components/OSigMeetingAside.vue +200 -0
  169. package/src/components/meeting/composables/useMeetingConfig.ts +108 -0
  170. package/src/components/meeting/config.ts +48 -0
  171. package/src/components/meeting/index.ts +45 -0
  172. package/src/components/meeting/types.ts +195 -0
  173. package/src/components/meeting/utils.ts +70 -0
  174. package/src/draft/Banner.vue +265 -265
  175. package/src/draft/ButtonCards.vue +105 -105
  176. package/src/draft/Feature.vue +133 -133
  177. package/src/draft/Footer.vue +512 -512
  178. package/src/draft/HorizontalAnchor.vue +165 -165
  179. package/src/draft/ItemSwiper.vue +133 -133
  180. package/src/draft/Logo.vue +141 -141
  181. package/src/draft/LogoCard.vue +74 -74
  182. package/src/draft/LogoV2.vue +19 -19
  183. package/src/draft/MainCard.vue +38 -38
  184. package/src/draft/MultiCard.vue +94 -94
  185. package/src/draft/MultiIconCard.vue +73 -73
  186. package/src/draft/OInfoCard.vue +176 -176
  187. package/src/draft/Process.vue +81 -81
  188. package/src/draft/Section.vue +167 -167
  189. package/src/draft/SingleTabCard.vue +84 -84
  190. package/src/draft/SliderCard.vue +110 -110
  191. package/src/env.d.ts +16 -1
  192. package/src/i18n/en.ts +264 -20
  193. package/src/i18n/index.ts +56 -42
  194. package/src/i18n/zh.ts +253 -9
  195. package/src/index.ts +14 -3
  196. package/src/shared/provide.ts +6 -6
  197. package/src/shims-vue-dompurify-html.d.ts +17 -0
  198. package/src/vue.d.ts +9 -9
  199. package/tsconfig.json +37 -33
  200. package/vite.config.ts +118 -94
  201. package/dist/components/OCookieNoticeEl.vue.d.ts +0 -29
  202. package/dist/components.umd.js +0 -1
  203. package/src/components/OCookieNoticeEl.vue +0 -404
@@ -0,0 +1,200 @@
1
+ <script setup lang="ts">
2
+ import { OIcon, OIconArrowLeft, OIconArrowRight } from '@opensig/opendesign';
3
+ import IconMeetinging from '~icons/meeting/icon-meet.svg';
4
+ import { useMeetingConfig } from '@/components/meeting/composables/useMeetingConfig';
5
+ import { CalendarDataType } from '@/components/meeting';
6
+
7
+ const { getConfig } = useMeetingConfig();
8
+
9
+ const props = defineProps<{
10
+ data: any[];
11
+ current: number;
12
+ total: number;
13
+ active: string;
14
+ meetingDates: string[];// 会议日期列表
15
+ eventsDates: string[];// 活动日期列表
16
+ }>();
17
+
18
+ const STEP = 1;
19
+
20
+ const emits = defineEmits(['click-date', 'change-month']);
21
+ const clickDate = (date) => {
22
+ emits('click-date', date);
23
+ };
24
+
25
+ const changeMonth = (step) => {
26
+ if (props.current + step >= props.total || props.current + step < 0) return;
27
+ emits('change-month', step);
28
+ };
29
+ </script>
30
+
31
+ <template>
32
+ <div class="o-sig-meeting-aside">
33
+ <template v-for="(d, dIdx) in data" :key="dIdx">
34
+ <div v-for="m in d" :key="m.month" class="month-item">
35
+ <div class="month">{{ m.month.replace(/-/g, '/') }}</div>
36
+ <div class="days">
37
+ <div
38
+ class="day-item"
39
+ v-for="d in m.days"
40
+ :key="d"
41
+ @click="clickDate(`${m.month}-${d}`)"
42
+ :class="active === `${m.month}-${d}` && 'active'"
43
+ >
44
+ <div class="day-d">{{ d }}</div>
45
+ <div class="day-c">
46
+ <OIcon
47
+ v-if="meetingDates.includes(`${m.month}-${d}`)"
48
+ :style="{
49
+ zIndex: getConfig(CalendarDataType.MEETING, 'zIndex'),
50
+ backgroundColor: getConfig(CalendarDataType.MEETING, 'color'),
51
+ }"
52
+ >
53
+ <component :is="getConfig(CalendarDataType.MEETING, 'icon')" />
54
+ </OIcon>
55
+ <OIcon
56
+ v-if="eventsDates.includes(`${m.month}-${d}`)"
57
+ :style="{
58
+ zIndex: getConfig(CalendarDataType.EVENTS, 'zIndex'),
59
+ backgroundColor: getConfig(CalendarDataType.EVENTS, 'color'),
60
+ }"
61
+ >
62
+ <component :is="getConfig(CalendarDataType.EVENTS, 'icon')" />
63
+ </OIcon>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </template>
69
+ <div class="arrow-wrapper">
70
+ <OIcon @click="changeMonth(0 - STEP)" :class="current - STEP < 0 && 'disabled'">
71
+ <OIconArrowLeft />
72
+ </OIcon>
73
+ <OIcon @click="changeMonth(STEP)" :class="current + STEP >= total && 'disabled'">
74
+ <OIconArrowRight />
75
+ </OIcon>
76
+ </div>
77
+ </div>
78
+ </template>
79
+
80
+ <style lang="scss">
81
+ .o-sig-meeting-aside {
82
+ width: 35%;
83
+ flex-shrink: 0;
84
+ padding: var(--o-gap-4) var(--o-gap-6);
85
+ display: flex;
86
+ flex-direction: column;
87
+ border-right: 1px solid var(--o-color-control4);
88
+ @include respond-to('<=pad') {
89
+ padding: var(--o-gap-4);
90
+ border-right: none;
91
+ }
92
+ @include respond-to('phone') {
93
+ padding: 16px;
94
+ .title {
95
+ margin-bottom: var(--o-gap-2);
96
+ }
97
+ }
98
+ @include respond-to('<=pad_v') {
99
+ width: 100%;
100
+ }
101
+
102
+ .month-item {
103
+ margin-bottom: var(--o-gap-3);
104
+
105
+ .month {
106
+ color: var(--o-color-info3);
107
+ margin-bottom: var(--o-gap-2);
108
+ @include tip1;
109
+ }
110
+
111
+ .days {
112
+ gap: var(--o-gap-2);
113
+ display: grid;
114
+ grid-template-columns: repeat(2, 1fr);
115
+
116
+ @include respond-to('<=pad_v') {
117
+ display: flex;
118
+ }
119
+
120
+ .day-item {
121
+ height: 64px;
122
+ border-radius: 4px;
123
+ background-color: var(--o-color-control2-light);
124
+ padding: 8px 12px;
125
+ cursor: pointer;
126
+ border: 1px solid transparent;
127
+
128
+ &:hover,
129
+ &.active {
130
+ background-color: var(--o-color-control3-light);
131
+ border-color: var(--o-color-primary1);
132
+ }
133
+
134
+ .day-d {
135
+ font-weight: 500;
136
+ margin-bottom: var(--o-gap-1);
137
+ color: var(--o-color-info1);
138
+ }
139
+
140
+ .day-c {
141
+ color: rgb(var(--o-white));
142
+ display: flex;
143
+ flex-wrap: nowrap;
144
+
145
+ .o-icon {
146
+ width: 20px;
147
+ height: 20px;
148
+ font-size: 20px;
149
+ line-height: 1em;
150
+ position: relative;
151
+ border-radius: 50%;
152
+ margin-left: -6px;
153
+
154
+ &:first-child {
155
+ margin-left: 0;
156
+ }
157
+
158
+ svg path {
159
+ fill: currentColor;
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ }
166
+
167
+ .arrow-wrapper {
168
+ margin-top: auto;
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: space-between;
172
+ color: var(--o-color-primary1);
173
+
174
+ .o-icon {
175
+ font-size: 24px;
176
+ cursor: pointer;
177
+
178
+ &.disabled {
179
+ cursor: not-allowed;
180
+ color: var(--o-color-primary4);
181
+ }
182
+
183
+ &:not(.disabled):hover {
184
+ color: var(--o-color-primary2);
185
+ }
186
+ }
187
+ }
188
+
189
+ @include respond-to('<=pad_v') {
190
+ .day-item {
191
+ }
192
+ }
193
+ @include respond-to('<=pad_v') {
194
+ .day-item {
195
+ width: min(128px, calc((100% - var(--o-gap-2)) / 2));
196
+ }
197
+ }
198
+ }
199
+
200
+ </style>
@@ -0,0 +1,108 @@
1
+ import { computed } from 'vue';
2
+ import dayjs from 'dayjs';
3
+ import { useI18n } from '@/i18n';
4
+ import IconAll from '~icons/meeting/icon-all.svg';
5
+ import IconEvent from '~icons/meeting/icon-event.svg';
6
+ import IconMeeting from '~icons/meeting/icon-meet.svg';
7
+ import IconSummit from '~icons/meeting/icon-summit.svg';
8
+ import { CalendarDataType, meetingTabT, OptionItemT } from '../types';
9
+ import { INTERVAL_DAY, INTERVAL_MONTH, INTERVAL_WEEK, TYPE_COLOR_MAP } from '../config';
10
+
11
+ export const useMeetingConfig = () => {
12
+ const { t, locale } = useI18n();
13
+
14
+ const meetingTabs = computed<meetingTabT[]>(() => [
15
+ { label: t('meeting.meetingTypeAll'), value: CalendarDataType.ALL, icon: IconAll },
16
+ { label: t('meeting.meetingTypeMeet'), value: CalendarDataType.MEETING, icon: IconMeeting, color: TYPE_COLOR_MAP.meeting, zIndex: 3 },
17
+ { label: t('meeting.meetingTypeEvents'), value: CalendarDataType.EVENTS, icon: IconEvent, color: TYPE_COLOR_MAP.events, zIndex: 2 },
18
+ { label: t('meeting.meetingTypeSummit'), value: CalendarDataType.SUMMIT, icon: IconSummit, color: TYPE_COLOR_MAP.summit, zIndex: 1 },
19
+ ]);
20
+
21
+ const cycleTypeOptions0 = computed<OptionItemT[]>(() => [
22
+ { label: t('meeting.day0'), value: INTERVAL_DAY, max: 7 },
23
+ { label: t('meeting.week0'), value: INTERVAL_WEEK, max: 2 },
24
+ { label: t('meeting.month0'), value: INTERVAL_MONTH, max: 1 },
25
+ ]);
26
+
27
+ const cycleTypeOptions = computed<OptionItemT[]>(() => [
28
+ { label: t('meeting.day'), value: INTERVAL_DAY, max: 7 },
29
+ { label: t('meeting.week'), value: INTERVAL_WEEK, max: 2 },
30
+ { label: t('meeting.month'), value: INTERVAL_MONTH, max: 1 },
31
+ ]);
32
+
33
+ const weekDay = computed(() => [
34
+ t('meeting.sunday'),
35
+ t('meeting.monday'),
36
+ t('meeting.tuesday'),
37
+ t('meeting.wednesday'),
38
+ t('meeting.thursday'),
39
+ t('meeting.friday'),
40
+ t('meeting.saturday'),
41
+ ]);
42
+
43
+ const intervalWeekOptions = computed(() => {
44
+ const list: OptionItemT[] = [];
45
+ for (let i = 1; i <= 7; i++) {
46
+ const idx = i % 7;
47
+ list.push({ value: idx, label: weekDay.value[idx] });
48
+ }
49
+ return list;
50
+ });
51
+
52
+ const getPointStr = (cycleType: number, points: number[]) => {
53
+ if (cycleType === INTERVAL_WEEK) {
54
+ return points
55
+ .sort((a, b) => {
56
+ const aIdx = intervalWeekOptions.value.findIndex((v) => v.value === a);
57
+ const bIdx = intervalWeekOptions.value.findIndex((v) => v.value === b);
58
+ return aIdx - bIdx;
59
+ })
60
+ .map((point: number) => {
61
+ const opt = intervalWeekOptions.value.find((v) => v.value === point);
62
+ return opt?.label || String(point);
63
+ })
64
+ .join(t('meeting.cycleSplit'));
65
+ }
66
+ if (cycleType === INTERVAL_MONTH) {
67
+ return points.join(t('meeting.cycleSplit'));
68
+ }
69
+ return '';
70
+ };
71
+
72
+ const getConfig = (val: CalendarDataType, key: keyof meetingTabT): string => {
73
+ let value = val;
74
+ const find: meetingTabT | undefined = meetingTabs.value.find(v => v.value === value);
75
+ return find?.[key] || '';
76
+ };
77
+
78
+ const getPlatformLabel = (platform: string) => {
79
+ switch (platform) {
80
+ case 'WELINK':
81
+ return 'WeLink';
82
+ case 'ZOOM':
83
+ return 'Zoom';
84
+ case 'TENCENT':
85
+ return locale.value === 'zh' ? '腾讯会议' : 'Tencent';
86
+ default:
87
+ return platform;
88
+ }
89
+ };
90
+
91
+ const getWeekFromDate = (date: string | Date) => {
92
+ return weekDay.value[dayjs(date).day()];
93
+ };
94
+
95
+ return {
96
+ t,
97
+ locale,
98
+ meetingTabs,
99
+ cycleTypeOptions0,
100
+ cycleTypeOptions,
101
+ weekDay,
102
+ intervalWeekOptions,
103
+ getPointStr,
104
+ getConfig,
105
+ getPlatformLabel,
106
+ getWeekFromDate,
107
+ };
108
+ };
@@ -0,0 +1,48 @@
1
+ import { CalendarDataType, meetingTabT } from './types.ts';
2
+ import IconAll from '~icons/meeting/icon-all.svg';
3
+ import IconEvent from '~icons/meeting/icon-event.svg';
4
+ import IconMeeting from '~icons/meeting/icon-meet.svg';
5
+ import IconSummit from '~icons/meeting/icon-summit.svg';
6
+
7
+ export const TYPE_COLOR_MAP = {
8
+ summit: 'rgba(var(--o-orange-6))',
9
+ events: 'rgba(var(--o-cyan-6))',
10
+ meeting: 'rgba(var(--o-deep-blue-6))',
11
+ };
12
+
13
+ export const INTERVAL_DAY = 0;
14
+ export const INTERVAL_WEEK = 1;
15
+ export const INTERVAL_MONTH = 2;
16
+
17
+ export const EMAIL_REGEX = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
18
+
19
+ export const PROGRESS_COLORS = ['var(--o-color-primary1)', 'var(--o-color-warning1)', 'var(--o-color-success1)'];
20
+
21
+ export const getMeetingTabs = (t: (key: string) => string): meetingTabT[] => [
22
+ {
23
+ label: t('meeting.meetingTypeAll'),
24
+ value: CalendarDataType.ALL,
25
+ icon: IconAll,
26
+ },
27
+ {
28
+ label: t('meeting.meetingTypeMeet'),
29
+ value: CalendarDataType.MEETING,
30
+ icon: IconMeeting,
31
+ color: TYPE_COLOR_MAP.meeting,
32
+ zIndex: 3,
33
+ },
34
+ {
35
+ label: t('meeting.meetingTypeEvents'),
36
+ value: CalendarDataType.EVENTS,
37
+ icon: IconEvent,
38
+ color: TYPE_COLOR_MAP.events,
39
+ zIndex: 2,
40
+ },
41
+ {
42
+ label: t('meeting.meetingTypeSummit'),
43
+ value: CalendarDataType.SUMMIT,
44
+ icon: IconSummit,
45
+ color: TYPE_COLOR_MAP.summit,
46
+ zIndex: 1,
47
+ },
48
+ ];
@@ -0,0 +1,45 @@
1
+ import type { App } from 'vue';
2
+ import _OMeetingCalendar from './OMeetingCalendar.vue';
3
+ import _OMeetingForm from './OMeetingForm.vue';
4
+ import _OMeetingPlayback from './OMeetingPlayback.vue';
5
+ import _OSigMeetingCalendar from './OSigMeetingCalendar.vue';
6
+ import _OMyMeetingCalendar from './OMyMeetingCalendar.vue';
7
+
8
+ const OMeetingCalendar = Object.assign(_OMeetingCalendar, {
9
+ install(app: App) {
10
+ app.component('OMeetingCalendar', _OMeetingCalendar);
11
+ },
12
+ });
13
+ const OMeetingForm = Object.assign(_OMeetingForm, {
14
+ install(app: App) {
15
+ app.component('OMeetingForm', _OMeetingForm);
16
+ },
17
+ });
18
+
19
+ const OMeetingPlayback = Object.assign(_OMeetingPlayback, {
20
+ install(app: App) {
21
+ app.component('OMeetingPlayback', _OMeetingPlayback);
22
+ },
23
+ });
24
+
25
+ const OSigMeetingCalendar = Object.assign(_OSigMeetingCalendar, {
26
+ install(app: App) {
27
+ app.component('OSigMeetingCalendar', _OSigMeetingCalendar);
28
+ },
29
+ });
30
+
31
+ const OMyMeetingCalendar = Object.assign(_OMyMeetingCalendar, {
32
+ install(app: App) {
33
+ app.component('OMyMeetingCalendar', _OMyMeetingCalendar);
34
+ },
35
+ });
36
+
37
+ export {
38
+ OMeetingCalendar,
39
+ OMeetingForm,
40
+ OMeetingPlayback,
41
+ OSigMeetingCalendar,
42
+ OMyMeetingCalendar,
43
+ };
44
+
45
+ export * from './types';
@@ -0,0 +1,195 @@
1
+ // sig组列表
2
+ import { INTERVAL_DAY, INTERVAL_MONTH, INTERVAL_WEEK } from '@/components/meeting/config.ts';
3
+
4
+ export interface GroupItemT {
5
+ id?: number;
6
+ group_name: string;
7
+ maillist?: string;
8
+ }
9
+
10
+ // 会议日历上额外的数据,活动或者峰会
11
+ export enum CalendarDataType {
12
+ ALL = 'all',
13
+ MEETING = 'meeting',
14
+ EVENTS = 'events',
15
+ SUMMIT = 'summit',
16
+ APPROVAL = 'approval'
17
+ }
18
+
19
+ export interface CalendarOtherDataT {
20
+ id: string;
21
+ name: string;
22
+ url: string;
23
+ dates: string[];
24
+ location?: string;
25
+ address?: string;
26
+ start_date: string;
27
+ end_date: string;
28
+ activity_type: string;
29
+ type: CalendarDataType.EVENTS | CalendarDataType.SUMMIT;
30
+ }
31
+
32
+ export interface OptionItemT {
33
+ label: string;
34
+ value: string | number;
35
+ }
36
+
37
+
38
+ export type PlatformT = 'welink' | 'tencent';
39
+
40
+ export enum MeetingGroupType {
41
+ SIG = 'sig',
42
+ GROUP = 'group',
43
+ }
44
+
45
+ export interface MeetingCalendarPropsT {
46
+ getDateListRequest: any;
47
+ getMeetingListRequest: any;
48
+ getSummitListRequest: any;
49
+ getSummitDatesRequest: any;
50
+ getEventsListRequest: any;
51
+ getEventsDatesRequest: any;
52
+ hiddenEvents?: boolean;
53
+ hiddenSummit?: boolean;
54
+ groupType: MeetingGroupType;
55
+ groups: string[];
56
+ }
57
+ // 会议新增、修改
58
+ export interface MeetingPostT {
59
+ id?: number; // 会议id
60
+ topic: string; // 会议主题 128
61
+ sponsor: string; // 会议发起人 20
62
+ group_name: string; // 所属SIG 64
63
+ platform: PlatformT; // 会议平台
64
+ date: string; // 会议日期
65
+ date_range?: string[]; // 日期返回
66
+ time: string; // 会议时间
67
+ start: string; // 会议开始时间
68
+ end: string; // 会议结束时间
69
+ etherpad: string; // etherpad链接
70
+ agenda: string; // 会议议程
71
+ email_list: string; // 通知邮件列表 1020
72
+ is_record: boolean; // 会议录制
73
+ is_cycle: boolean; // 是否重复
74
+ cycle_start_date: string;
75
+ cycle_end_date: string;
76
+ cycle_start: string;
77
+ cycle_end: string;
78
+ cycle_interval: number; // 重复周期, 当intervalType为month时固定为1
79
+ cycle_type: typeof INTERVAL_DAY | typeof INTERVAL_WEEK | typeof INTERVAL_MONTH; // 重复类型,默认为INTERVAL_DAY
80
+ cycle_point: number[]; // 重复节点,当intervalType为week|month时存在值
81
+ is_notify?: boolean;
82
+ }
83
+
84
+ export interface MeetingFormPropsT {
85
+ data?: MeetingItemT;
86
+ isSub?: boolean;
87
+ isEdit?: boolean;
88
+ subId?: string;
89
+ createMeetingRequest: any,
90
+ editMeetingRequest: any;
91
+ editSubMeetingRequest: any;
92
+ getPlatformsRequest: any;
93
+ getGroupsRequest: any;
94
+ showBtns?: boolean;
95
+ groupType: MeetingGroupType;
96
+ bookText?: string
97
+ }
98
+
99
+ // 会议详情
100
+ export interface MeetingItemT extends MeetingPostT {
101
+ id: number;
102
+ community: string;
103
+ mid: string;
104
+ m_mid: string;
105
+ join_url: string; // 会议链接
106
+ create_time: string; // 创建时间
107
+ isEnd: boolean; // 是否结束
108
+ is_delete: boolean; // 是否取消
109
+ update_time: string;
110
+ time: string; // 处理一下时间范围
111
+ cycle_sub: any[];
112
+ live_url?: string;
113
+ type: CalendarDataType;
114
+ }
115
+
116
+ export interface PageParamsT {
117
+ page: number;
118
+ size: number;
119
+ }
120
+
121
+ export interface OptionItemT {
122
+ label: string;
123
+ value: string | number;
124
+ }
125
+
126
+ export interface meetingTabT {
127
+ label: string;
128
+ value: string;
129
+ icon: any;
130
+ color?: string;
131
+ zIndex?: number;
132
+ }
133
+
134
+
135
+ // -------------------- 会议回放 --------------------
136
+ interface MeetingPlaybackPropsDetailT {
137
+ topic: string; // 会议主题
138
+ date: string; // 会议日期
139
+ start: string; // 会议开始时间
140
+ end: string; // 会议结束时间
141
+ agenda: string; // 会议详情
142
+ sponsor: string; // 会议创建人
143
+ groupName: string; // 会议所属sig组
144
+ }
145
+
146
+ interface MeetingPlaybackPropsDataT {
147
+ mid: string; // 会议ID
148
+ subId?: string; //子会议ID
149
+ textJson: string; // 字幕json文件
150
+ poster: string; // 封面
151
+ video: string; // 录屏
152
+ textVtt: string; // 字幕文件
153
+ topicJson: string; // 议题分段
154
+ }
155
+
156
+ export interface MeetingPlaybackPropsT {
157
+ dates: string[]; // 如果是周期会议,传入可选的日期
158
+ detail: MeetingPlaybackPropsDetailT; // 会议信息
159
+ data: MeetingPlaybackPropsDataT; // 回放信息
160
+ }
161
+
162
+ export interface SubjectItemT {
163
+ title: string; // 议题
164
+ startTime: string | number; // 议题开始时间 时:分:秒格式
165
+ endTime: string | number; // 议题结束时间 时:分:秒格式
166
+ }
167
+
168
+
169
+ export interface CaptionItemT {
170
+ ID: number; // 字幕id
171
+ start_time: string; // 字幕开始时间
172
+ end_time: string; // 字幕结束时间
173
+ speaker: string; // 发言人
174
+ content: string; // 发言内容
175
+ contentHtml: string; // 发言内容转html
176
+ speakerIdx: number; // 当前发言人索引
177
+ speakerLabel: string; // 发言人文案
178
+ }
179
+
180
+
181
+ export interface MeetingPlaybackVideoPropsT {
182
+ src: string; // 视频资源
183
+ vtt?: string; // 字幕资源
184
+ captions?: CaptionItemT[]; // 语言转文字json
185
+ poster?: string | null; // 封面图片
186
+ posterTitle?: string | null; // 封面文案
187
+ instance?: any; // 播放器实例
188
+ trackIdx: number; // 当前字幕索引
189
+ }
190
+
191
+ export interface MeetingPlaybackSubtitlesPropsT {
192
+ captions?: CaptionItemT[]; // 语言转文字json
193
+ instance?: any; // 播放器实例
194
+ trackIdx: number; // 当前字幕索引
195
+ }
@@ -0,0 +1,70 @@
1
+ import dayjs from 'dayjs';
2
+ import { OptionItemT } from './types';
3
+
4
+ export const formatDate = (date: string | Date = new Date(), format: string = 'YYYY-MM-DD'): string => {
5
+ let dateStr = date;
6
+ if (!dateStr) {
7
+ dateStr = new Date();
8
+ }
9
+ if (!dayjs(new Date(dateStr)).isValid()) {
10
+ return dateStr as string;
11
+ }
12
+ return dayjs(new Date(dateStr)).format(format);
13
+ };
14
+
15
+ export const findLabelFromOptions = (value: string | number, options: OptionItemT[], labelKey: keyof OptionItemT = 'label', valueKey: keyof OptionItemT = 'value') => {
16
+ const find = options.find((o) => o[valueKey] === value);
17
+ return find?.[labelKey] || value;
18
+ };
19
+
20
+ export const speakerNum = (val: string) => {
21
+ const regex = /\d+/g;
22
+ const match = val.match(regex) || '';
23
+
24
+ return parseInt(match[0]);
25
+ };
26
+
27
+ export const getDateNumber = (date: string) => {
28
+ const arr: string[] = date.split(':');
29
+ if (arr.length > 3 || !arr.length) {
30
+ return 0;
31
+ }
32
+ let res = 0;
33
+ let base = 1;
34
+ while (arr.length > 0) {
35
+ const current = arr.pop();
36
+ res += parseInt(current!) * base;
37
+ base *= 60;
38
+ }
39
+ return res;
40
+ };
41
+
42
+ const formatNumber = (num: number) => {
43
+ if (num < 0) return 'Invalid number';
44
+ if (num >= 10) return `${ num }`;
45
+ return `0${ num }`;
46
+ };
47
+
48
+ export const formatDateNumber = (num: number) => {
49
+ if (num > 24 * 60 * 60) return 'Invalid date';
50
+ const h = Math.floor(num / 60 / 60);
51
+ const m = Math.floor((num - h * 60 * 60) / 60);
52
+ const s = num % 60;
53
+ return `${ formatNumber(h) }:${ formatNumber(m) }:${ formatNumber(s) }`;
54
+ };
55
+
56
+ export const transformTime = (time: string) => {
57
+ const arr = time.split(':');
58
+ const hh = arr[arr.length - 3] ? parseInt(arr[arr.length - 3]) : 0;
59
+ const mm = parseInt(arr[arr.length - 2]);
60
+ const ss = parseFloat(arr[arr.length - 1]);
61
+
62
+ return hh * 60 * 60 + mm * 60 + ss;
63
+ };
64
+
65
+ export const transformSeconds = (seconds: number) => {
66
+ const hh = Math.floor(seconds / 3600);
67
+ const mm = Math.floor((seconds - hh * 3600) / 60);
68
+ const ss = Math.floor(seconds - hh * 3600 - mm * 60);
69
+ return `${ hh ? `${ hh.toString().padStart(2, '0') }:` : '' }${ mm.toString().padStart(2, '0') }:${ ss.toString().padStart(2, '0') }`;
70
+ };