@opendesign-plus-test/components 0.0.1-rc.82 → 0.0.1-rc.84

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 (210) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -1
  2. package/dist/chunk-OElCookieNotice.es.js +10 -10
  3. package/dist/components/config-provider/OPlusConfigProvider.vue.d.ts +2 -2
  4. package/dist/components/config-provider/index.d.ts +3 -3
  5. package/dist/components/meeting/composables/useMeetingConfig.d.ts +1 -1
  6. package/dist/components.cjs.js +33 -33
  7. package/dist/components.css +1 -1
  8. package/dist/components.es.js +1511 -1504
  9. package/dist/treeshaking/components/banner/OBanner.css +37 -37
  10. package/dist/treeshaking/components/banner/OBanner.vue.mjs +1 -1
  11. package/dist/treeshaking/components/banner/OBanner.vue2.mjs +2 -1
  12. package/dist/treeshaking/components/banner/OBanner2.css +10 -10
  13. package/dist/treeshaking/components/config-provider/OPlusConfigProvider.vue.d.ts +2 -2
  14. package/dist/treeshaking/components/config-provider/index.d.ts +3 -3
  15. package/dist/treeshaking/components/cookie-notice/OCookieNotice.vue.mjs +1 -1
  16. package/dist/treeshaking/components/cookie-notice/OCookieNotice.vue2.mjs +1 -1
  17. package/dist/treeshaking/components/cookie-notice/OCookieNotice2.css +62 -62
  18. package/dist/treeshaking/components/events/OEventsApply.vue.mjs +1 -1
  19. package/dist/treeshaking/components/header/OHeader.css +12 -12
  20. package/dist/treeshaking/components/header/OHeader.vue.mjs +1 -1
  21. package/dist/treeshaking/components/header/OHeader.vue2.mjs +1 -1
  22. package/dist/treeshaking/components/header/components/HeaderContent.css +235 -235
  23. package/dist/treeshaking/components/header/components/HeaderContent.vue.mjs +1 -1
  24. package/dist/treeshaking/components/header/components/HeaderContent.vue2.mjs +3 -2
  25. package/dist/treeshaking/components/header/components/HeaderNav.css +26 -26
  26. package/dist/treeshaking/components/header/components/HeaderNav.vue.mjs +1 -1
  27. package/dist/treeshaking/components/header/components/HeaderNav.vue2.mjs +1 -1
  28. package/dist/treeshaking/components/meeting/composables/useMeetingConfig.d.ts +1 -1
  29. package/dist/treeshaking/i18n/index.mjs +1 -1
  30. package/dist/treeshaking/shared/theme.mjs +13 -0
  31. package/package.json +4 -1
  32. package/docs/design.md +0 -27
  33. package/docs/design_banner.md +0 -41
  34. package/docs/design_section.md +0 -27
  35. package/plugins/css-inject-plugin.ts +0 -37
  36. package/scripts/build.js +0 -17
  37. package/scripts/generate-components-index.js +0 -62
  38. package/src/assets/events/svg-icons/icon-checked.svg +0 -3
  39. package/src/assets/events/svg-icons/icon-competition.svg +0 -7
  40. package/src/assets/events/svg-icons/icon-events.svg +0 -4
  41. package/src/assets/events/svg-icons/icon-release.svg +0 -4
  42. package/src/assets/events/svg-icons/icon-summit.svg +0 -4
  43. package/src/assets/meeting/empty.png +0 -0
  44. package/src/assets/meeting/svg-icons/icon-all.svg +0 -4
  45. package/src/assets/meeting/svg-icons/icon-backward.svg +0 -4
  46. package/src/assets/meeting/svg-icons/icon-calendar.svg +0 -3
  47. package/src/assets/meeting/svg-icons/icon-cancel.svg +0 -4
  48. package/src/assets/meeting/svg-icons/icon-captions.svg +0 -4
  49. package/src/assets/meeting/svg-icons/icon-close-captions.svg +0 -6
  50. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +0 -6
  51. package/src/assets/meeting/svg-icons/icon-copy.svg +0 -4
  52. package/src/assets/meeting/svg-icons/icon-create.svg +0 -5
  53. package/src/assets/meeting/svg-icons/icon-delete.svg +0 -7
  54. package/src/assets/meeting/svg-icons/icon-empty.svg +0 -65
  55. package/src/assets/meeting/svg-icons/icon-event.svg +0 -4
  56. package/src/assets/meeting/svg-icons/icon-export.svg +0 -3
  57. package/src/assets/meeting/svg-icons/icon-forward.svg +0 -4
  58. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +0 -6
  59. package/src/assets/meeting/svg-icons/icon-help.svg +0 -3
  60. package/src/assets/meeting/svg-icons/icon-important.svg +0 -4
  61. package/src/assets/meeting/svg-icons/icon-info.svg +0 -3
  62. package/src/assets/meeting/svg-icons/icon-meet.svg +0 -4
  63. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +0 -5
  64. package/src/assets/meeting/svg-icons/icon-meeting.svg +0 -4
  65. package/src/assets/meeting/svg-icons/icon-play.svg +0 -5
  66. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +0 -7
  67. package/src/assets/meeting/svg-icons/icon-playing.svg +0 -5
  68. package/src/assets/meeting/svg-icons/icon-question.svg +0 -4
  69. package/src/assets/meeting/svg-icons/icon-sound.svg +0 -5
  70. package/src/assets/meeting/svg-icons/icon-speaker.svg +0 -3
  71. package/src/assets/meeting/svg-icons/icon-summit.svg +0 -4
  72. package/src/assets/meeting/svg-icons/icon-telligent.svg +0 -3
  73. package/src/assets/meeting/svg-icons/icon-tip.svg +0 -3
  74. package/src/assets/meeting/svg-icons/icon-todo.svg +0 -4
  75. package/src/assets/meeting/transparent.png +0 -0
  76. package/src/assets/styles/element-plus.scss +0 -283
  77. package/src/assets/svg-icons/icon-arrow-left.svg +0 -3
  78. package/src/assets/svg-icons/icon-avatar-line.svg +0 -3
  79. package/src/assets/svg-icons/icon-caret-left.svg +0 -3
  80. package/src/assets/svg-icons/icon-caret-right.svg +0 -3
  81. package/src/assets/svg-icons/icon-chevron-down.svg +0 -3
  82. package/src/assets/svg-icons/icon-chevron-right.svg +0 -3
  83. package/src/assets/svg-icons/icon-chevron-up.svg +0 -3
  84. package/src/assets/svg-icons/icon-close.svg +0 -3
  85. package/src/assets/svg-icons/icon-delete-hover.svg +0 -4
  86. package/src/assets/svg-icons/icon-delete.svg +0 -7
  87. package/src/assets/svg-icons/icon-filter.svg +0 -3
  88. package/src/assets/svg-icons/icon-header-back.svg +0 -3
  89. package/src/assets/svg-icons/icon-header-delete.svg +0 -3
  90. package/src/assets/svg-icons/icon-header-menu.svg +0 -3
  91. package/src/assets/svg-icons/icon-header-person.svg +0 -3
  92. package/src/assets/svg-icons/icon-header-search.svg +0 -4
  93. package/src/assets/svg-icons/icon-image-close.svg +0 -4
  94. package/src/assets/svg-icons/icon-image-upload.svg +0 -3
  95. package/src/assets/svg-icons/icon-image-zoomin.svg +0 -3
  96. package/src/assets/svg-icons/icon-loading.svg +0 -4
  97. package/src/assets/svg-icons/icon-locale.svg +0 -3
  98. package/src/assets/svg-icons/icon-log-off.svg +0 -3
  99. package/src/assets/svg-icons/icon-message.svg +0 -3
  100. package/src/assets/svg-icons/icon-moon.svg +0 -3
  101. package/src/assets/svg-icons/icon-outlink.svg +0 -3
  102. package/src/assets/svg-icons/icon-overview.svg +0 -3
  103. package/src/assets/svg-icons/icon-refresh.svg +0 -3
  104. package/src/assets/svg-icons/icon-search.svg +0 -3
  105. package/src/assets/svg-icons/icon-setting.svg +0 -3
  106. package/src/assets/svg-icons/icon-sun.svg +0 -3
  107. package/src/assets/svg-icons/icon-tips.svg +0 -3
  108. package/src/components/activity/OActivityApproval.vue +0 -868
  109. package/src/components/activity/OActivityForm.vue +0 -548
  110. package/src/components/activity/OActivityMyCalendar.vue +0 -1540
  111. package/src/components/activity/composables/useActivityConfig.ts +0 -141
  112. package/src/components/activity/config.ts +0 -1
  113. package/src/components/activity/index.ts +0 -24
  114. package/src/components/activity/types.ts +0 -95
  115. package/src/components/banner/OBanner.vue +0 -288
  116. package/src/components/banner/OBannerContent.vue +0 -175
  117. package/src/components/banner/index.ts +0 -18
  118. package/src/components/banner/types.ts +0 -39
  119. package/src/components/common/AppAvatar.vue +0 -83
  120. package/src/components/common/ClientOnly.vue +0 -13
  121. package/src/components/common/ContentWrapper.vue +0 -82
  122. package/src/components/common/MoreText.vue +0 -124
  123. package/src/components/common/ThFilter.vue +0 -330
  124. package/src/components/config-provider/OPlusConfigProvider.vue +0 -32
  125. package/src/components/config-provider/index.ts +0 -10
  126. package/src/components/cookie-notice/OCookieNotice.vue +0 -575
  127. package/src/components/cookie-notice/index.ts +0 -10
  128. package/src/components/element-plus/OElCookieNotice.vue +0 -603
  129. package/src/components/element-plus/index.ts +0 -3
  130. package/src/components/events/OEventsApply.vue +0 -509
  131. package/src/components/events/OEventsCalendar.vue +0 -600
  132. package/src/components/events/OEventsList.vue +0 -461
  133. package/src/components/events/config.ts +0 -35
  134. package/src/components/events/index.ts +0 -24
  135. package/src/components/events/types.ts +0 -84
  136. package/src/components/events/utils.ts +0 -9
  137. package/src/components/footer/OFooter.vue +0 -577
  138. package/src/components/footer/index.ts +0 -10
  139. package/src/components/header/OHeader.vue +0 -157
  140. package/src/components/header/OHeaderMobile.vue +0 -184
  141. package/src/components/header/components/HeaderContent.vue +0 -1125
  142. package/src/components/header/components/HeaderNav.vue +0 -278
  143. package/src/components/header/components/HeaderNavMobile.vue +0 -380
  144. package/src/components/header/index.ts +0 -18
  145. package/src/components/header/types.ts +0 -96
  146. package/src/components/header-language-switcher/OHeaderLanguageSwitcher.vue +0 -249
  147. package/src/components/header-language-switcher/index.ts +0 -10
  148. package/src/components/header-search/OHeaderSearch.vue +0 -628
  149. package/src/components/header-search/index.ts +0 -10
  150. package/src/components/header-source-code/OHeaderSourceCode.vue +0 -151
  151. package/src/components/header-source-code/index.ts +0 -10
  152. package/src/components/header-theme/OHeaderTheme.vue +0 -132
  153. package/src/components/header-theme/index.ts +0 -10
  154. package/src/components/header-user/OHeaderUser.vue +0 -249
  155. package/src/components/header-user/index.ts +0 -10
  156. package/src/components/meeting/OMeetingCalendar.vue +0 -943
  157. package/src/components/meeting/OMeetingForm.vue +0 -1131
  158. package/src/components/meeting/OMeetingMyCalendar.vue +0 -1628
  159. package/src/components/meeting/OMeetingPlayback.vue +0 -469
  160. package/src/components/meeting/OMeetingSigCalendar.vue +0 -500
  161. package/src/components/meeting/components/OMeetingCalendarList.vue +0 -626
  162. package/src/components/meeting/components/OMeetingCalendarSelector.vue +0 -213
  163. package/src/components/meeting/components/OMeetingDetail.vue +0 -285
  164. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +0 -615
  165. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +0 -741
  166. package/src/components/meeting/components/OMeetingSigAside.vue +0 -205
  167. package/src/components/meeting/composables/useMeetingConfig.ts +0 -108
  168. package/src/components/meeting/config.ts +0 -48
  169. package/src/components/meeting/index.ts +0 -45
  170. package/src/components/meeting/types.ts +0 -270
  171. package/src/components/meeting/utils.ts +0 -70
  172. package/src/components/search/OSearchInput.vue +0 -526
  173. package/src/components/search/composables/useImageSearch.ts +0 -157
  174. package/src/components/search/composables/useKeywordHighlight.ts +0 -30
  175. package/src/components/search/composables/useSearchHistory.ts +0 -75
  176. package/src/components/search/index.ts +0 -23
  177. package/src/components/search/internal/HighlightText.vue +0 -37
  178. package/src/components/search/internal/SearchImageInput.vue +0 -498
  179. package/src/components/search/internal/SearchPanel.vue +0 -431
  180. package/src/components/search/types.ts +0 -25
  181. package/src/components/section/OSection.vue +0 -178
  182. package/src/components/section/index.ts +0 -10
  183. package/src/draft/Banner.vue +0 -265
  184. package/src/draft/ButtonCards.vue +0 -106
  185. package/src/draft/Feature.vue +0 -134
  186. package/src/draft/Footer.vue +0 -519
  187. package/src/draft/HorizontalAnchor.vue +0 -165
  188. package/src/draft/ItemSwiper.vue +0 -133
  189. package/src/draft/Logo.vue +0 -141
  190. package/src/draft/LogoCard.vue +0 -75
  191. package/src/draft/LogoV2.vue +0 -19
  192. package/src/draft/MainCard.vue +0 -38
  193. package/src/draft/MultiCard.vue +0 -95
  194. package/src/draft/MultiIconCard.vue +0 -74
  195. package/src/draft/OInfoCard.vue +0 -176
  196. package/src/draft/Process.vue +0 -81
  197. package/src/draft/Section.vue +0 -167
  198. package/src/draft/SingleTabCard.vue +0 -85
  199. package/src/draft/SliderCard.vue +0 -111
  200. package/src/env.d.ts +0 -16
  201. package/src/i18n/en.ts +0 -278
  202. package/src/i18n/index.ts +0 -56
  203. package/src/i18n/zh.ts +0 -268
  204. package/src/index.ts +0 -18
  205. package/src/shared/provide.ts +0 -6
  206. package/src/shims-vue-dompurify-html.d.ts +0 -17
  207. package/src/vue.d.ts +0 -10
  208. package/tsconfig.json +0 -37
  209. package/vite.config.ts +0 -123
  210. package/vite.treeshaking.config.ts +0 -127
@@ -1,18 +0,0 @@
1
- import _OBanner from './OBanner.vue';
2
- import _OBannerContent from './OBannerContent.vue';
3
- import type { App } from 'vue';
4
-
5
-
6
- const OBanner = Object.assign(_OBanner, {
7
- install(app: App) {
8
- app.component('OBanner', _OBanner);
9
- },
10
- });
11
- const OBannerContent = Object.assign(_OBannerContent, {
12
- install(app: App) {
13
- app.component('OBannerContent', _OBannerContent);
14
- },
15
- });
16
-
17
- export { OBanner, OBannerContent };
18
- export * from './types';
@@ -1,39 +0,0 @@
1
- // Banner 项的类型定义
2
- export interface BannerItem {
3
- title?: string;
4
- subtitle?: string;
5
- bg: string;
6
- text_theme?: 'light' | 'dark';
7
- bg_text?: string;
8
- pc_text_width?: string;
9
- pc_text_height?: string;
10
- pad_text_width?: string;
11
- pad_text_height?: string;
12
- attach?: string;
13
- href?: string;
14
- btn?: string;
15
- withStickyBg?: boolean;
16
- pad_offset?: string;
17
- }
18
-
19
- // BannerContent 组件的 Props 类型
20
- export interface BannerContentProps {
21
- info: BannerItem;
22
- size?: 'large' | 'medium' | 'small' | 'tiny';
23
- contentJustifyCenter?: boolean;
24
- isPhone?: boolean;
25
- isLight?: boolean;
26
- }
27
-
28
- // Emits 事件类型
29
- export interface HomeBannerEmits {
30
- (e: 'before-change', index: number): void;
31
- (e: 'click', href: string | undefined): void;
32
- }
33
-
34
- export interface BannerContentEmits {
35
- (e: 'click', href: string | undefined): void;
36
- }
37
-
38
- // 组件尺寸类型
39
- export type ComponentSize = 'large' | 'medium' | 'small' | 'tiny';
@@ -1,83 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, type PropType } from 'vue';
3
-
4
- const props = defineProps({
5
- // 头像
6
- avatar: {
7
- type: String,
8
- default: '',
9
- },
10
- // 用户名
11
- name: {
12
- type: String,
13
- default: '',
14
- required: true,
15
- },
16
- // mini: 16 small: 24, medium: 40, large: 64
17
- size: {
18
- type: String as PropType<'mini' | 'small' | 'medium' | 'large'>,
19
- default: 'medium',
20
- },
21
- // 大小尺寸自定义,单位px
22
- customSize: {
23
- type: Number,
24
- default: 0,
25
- },
26
- // round--圆形 square--方形
27
- variant: {
28
- type: String as PropType<'round' | 'square'>,
29
- default: 'round',
30
- },
31
- });
32
-
33
- const bgColorArr = ['#058EF0', '#FA7305', '#03B5A5'];
34
-
35
- const avatarText = computed(() => props.name?.charAt(0).toUpperCase());
36
- const getAvatarStyle = computed(() => {
37
- const avatarStyle = {
38
- 'background-color': '',
39
- width: '32px',
40
- height: '32px',
41
- 'font-size': '20px',
42
- };
43
- avatarStyle['background-color'] = props.name ? bgColorArr[props.name?.length % bgColorArr.length] : 'transparent';
44
- let sizeNum = 0;
45
- if (props.customSize) {
46
- sizeNum = Number(props.customSize);
47
- } else {
48
- const sizeToNum = {
49
- mini: 16,
50
- small: 24,
51
- medium: 40,
52
- large: 64,
53
- };
54
- sizeNum = sizeToNum[props.size];
55
- }
56
- avatarStyle.height = `${sizeNum}px`;
57
- avatarStyle.width = `${sizeNum}px`;
58
- avatarStyle['font-size'] = `${sizeNum / 2}px`;
59
- return avatarStyle;
60
- });
61
- </script>
62
-
63
- <template>
64
- <img v-if="avatar && !avatar.includes('gitcode')" :src="avatar" class="img-avatar" :class="variant" :style="getAvatarStyle" alt="" />
65
- <div v-else class="word-avatar" :class="variant" :style="getAvatarStyle">
66
- {{ avatarText }}
67
- </div>
68
- </template>
69
-
70
- <style lang="scss" scoped>
71
- .img-avatar {
72
- background-color: transparent !important;
73
- }
74
- .word-avatar {
75
- display: flex;
76
- align-items: center;
77
- justify-content: center;
78
- color: var(--o-color-info1-inverse);
79
- }
80
- .round {
81
- border-radius: 50%;
82
- }
83
- </style>
@@ -1,13 +0,0 @@
1
- <script setup lang="ts">
2
- import { ref, onMounted } from 'vue';
3
-
4
- const isClient = ref(false);
5
-
6
- onMounted(() => {
7
- isClient.value = true;
8
- });
9
- </script>
10
-
11
- <template>
12
- <slot v-if="isClient" />
13
- </template>
@@ -1,82 +0,0 @@
1
- <script setup lang="ts">
2
- import { isBoolean, isString, isUndefined } from '@opensig/opendesign';
3
- import { computed } from 'vue';
4
-
5
- const DEFAULT = Symbol('default');
6
-
7
- interface ContentWrapperPropsT {
8
- verticalPadding?: boolean | string | Array<string>;
9
- }
10
-
11
- const props = withDefaults(defineProps<ContentWrapperPropsT>(), {
12
- verticalPadding: undefined,
13
- });
14
-
15
- const paddingTop = computed(() => {
16
- if (!props.verticalPadding) {
17
- return 0;
18
- }
19
-
20
- if (isBoolean(props.verticalPadding)) {
21
- return DEFAULT;
22
- } else if (isString(props.verticalPadding)) {
23
- return props.verticalPadding;
24
- } else {
25
- return props.verticalPadding[0];
26
- }
27
- });
28
-
29
- const paddingBottom = computed(() => {
30
- if (!props.verticalPadding) {
31
- return 0;
32
- }
33
-
34
- if (isBoolean(props.verticalPadding)) {
35
- return DEFAULT;
36
- } else if (isString(props.verticalPadding)) {
37
- return props.verticalPadding;
38
- } else {
39
- return !isUndefined(props.verticalPadding[1]) ? props.verticalPadding[1] : props.verticalPadding[0];
40
- }
41
- });
42
- </script>
43
-
44
- <template>
45
- <div
46
- class="content-wrapper"
47
- :style="{
48
- '--content-wrapper-vertical-paddingTop': paddingTop === DEFAULT ? undefined : paddingTop,
49
- '--content-wrapper-vertical-paddingBottom': paddingBottom === DEFAULT ? undefined : paddingBottom,
50
- }"
51
- >
52
- <slot></slot>
53
- </div>
54
- </template>
55
-
56
- <style lang="scss" scoped>
57
- .content-wrapper {
58
- --layout-content-max-width: 1544px;
59
- --layout-content-padding: 64px;
60
- --layout-header-height: 80px;
61
-
62
- @include respond('<=laptop') {
63
- --layout-content-max-width: 100%;
64
- --layout-content-padding: 40px;
65
- }
66
-
67
- @include respond('<=pad') {
68
- --layout-content-padding: 32px;
69
- }
70
-
71
- @include respond('phone') {
72
- --layout-content-padding: 24px;
73
- }
74
-
75
- max-width: var(--layout-content-max-width);
76
- margin: 0 auto;
77
-
78
- --content-wrapper-vertical-paddingTop: 72px;
79
- --content-wrapper-vertical-paddingBottom: 72px;
80
- padding: var(--content-wrapper-vertical-paddingTop) var(--layout-content-padding) var(--content-wrapper-vertical-paddingBottom);
81
- }
82
- </style>
@@ -1,124 +0,0 @@
1
- <script setup lang="ts">
2
- import { OIcon, OIconChevronDown, OIconChevronUp } from '@opensig/opendesign';
3
- import { nextTick, onMounted, ref, watch } from 'vue';
4
- import { useI18n } from '@/i18n';
5
-
6
- const props = withDefaults(
7
- defineProps<{
8
- text?: string;
9
- link?: boolean;
10
- lines?: number;
11
- show: boolean;
12
- }>(),
13
- {
14
- text: '',
15
- link: false,
16
- lines: 3,
17
- show: false,
18
- },
19
- );
20
-
21
- const { t } = useI18n();
22
-
23
- const expanded = ref(false); // 是否展开
24
- const showBtn = ref(false); // 受否显示展开按钮
25
- const offsetHeight = ref(0); // 内容高度
26
- const contentRef = ref<any>(null); // 内容节点
27
-
28
- onMounted(() => {
29
- determineHeight();
30
- });
31
- watch([() => props.text, () => props.show], () => {
32
- determineHeight();
33
- });
34
- const determineHeight = () => {
35
- nextTick(() => {
36
- const ele = contentRef.value;
37
- if (ele) {
38
- const range = document.createRange();
39
- range.setStart(ele, 0);
40
- range.setEnd(ele, ele.childNodes.length);
41
- showBtn.value = range.getBoundingClientRect().height > ele.offsetHeight + 10 || ele.scrollHeight > ele.offsetHeight + 10;
42
- offsetHeight.value = range.getBoundingClientRect().height || ele.scrollHeight;
43
- } else {
44
- showBtn.value = false;
45
- }
46
- });
47
- };
48
-
49
- const clickText = () => {
50
- if (props.link) {
51
- window.open(props.text)
52
- }
53
- };
54
- </script>
55
-
56
- <template>
57
- <div class="more-text-wrapper">
58
- <div
59
- :class="['more-text-content', link && 'is-link']"
60
- ref="contentRef"
61
- :style="{
62
- 'max-height': expanded ? offsetHeight + 'px' : '4.5em',
63
- '-webkit-line-clamp': expanded ? 'initial' : lines,
64
- }"
65
- @click="clickText"
66
- >
67
- {{ text }}
68
- </div>
69
- <div class="more-text-btn" v-if="showBtn" @click="expanded = !expanded">
70
- <div v-if="!expanded">
71
- <span>{{ t('common.expand') }}</span>
72
- <OIcon>
73
- <OIconChevronDown />
74
- </OIcon>
75
- </div>
76
- <div v-else>
77
- <span>{{ t('common.collapse') }}</span>
78
- <OIcon>
79
- <OIconChevronUp />
80
- </OIcon>
81
- </div>
82
- </div>
83
- </div>
84
- </template>
85
-
86
- <style lang="scss" scoped>
87
- .more-text-wrapper {
88
- .more-text-content {
89
- line-height: 1.5em;
90
- overflow: hidden;
91
- text-overflow: ellipsis;
92
- display: -webkit-box;
93
- -webkit-box-orient: vertical;
94
- white-space: pre-wrap;
95
- word-break: break-all;
96
- transition: height 0.1s;
97
-
98
- &.is-link {
99
- color: var(--o-color-primary1);
100
- cursor: pointer;
101
- @include hover {
102
- color: var(--o-color-primary2);
103
- }
104
- }
105
- }
106
-
107
- .more-text-btn {
108
- color: var(--o-color-primary1);
109
- @include hover {
110
- color: var(--o-color-primary2);
111
- }
112
-
113
- & > div {
114
- height: 1.5em;
115
- cursor: pointer;
116
- display: flex;
117
- align-items: center;
118
- column-gap: 4px;
119
- justify-content: flex-end;
120
- @include tip1;
121
- }
122
- }
123
- }
124
- </style>
@@ -1,330 +0,0 @@
1
- <script setup lang="ts">
2
- import {
3
- OCheckbox,
4
- OCheckboxGroup,
5
- ODivider,
6
- ODropdown,
7
- ODropdownItem,
8
- OIcon,
9
- OLink,
10
- OPopover,
11
- OScroller,
12
- } from '@opensig/opendesign';
13
- import { computed, h, nextTick, ref, watch } from 'vue';
14
- import IconFilter from '~icons/components/icon-filter.svg';
15
- import { useI18n } from '@/i18n';
16
- import { buildVueDompurifyHTMLDirective } from 'vue-dompurify-html';
17
-
18
- // 局部注册 v-dompurify-html 指令
19
- const vDompurifyHtml = buildVueDompurifyHTMLDirective();
20
-
21
- type TItem = { label: string; value: string | number; children?: TItem[] };
22
- const { t } = useI18n();
23
- const props = withDefaults(
24
- defineProps<{
25
- modelValue: string[] | number[] | string | number;
26
- list: TItem[];
27
- multiple?: boolean;
28
- tableWidth?: number;
29
- }>(),
30
- {
31
- list: () => [],
32
- multiple: false,
33
- },
34
- );
35
- const emits = defineEmits(['update:model-value', 'confirm']);
36
- /**
37
- * 根据options判断是否为级联选择器
38
- * 如果是级联选择器,需要注意子级是否存在相同value
39
- */
40
- const isCascader = computed(() => props.list.some((v: TItem) => v.children?.length));
41
- // 格式化数据
42
- const options = computed(() => {
43
- return props.list.map((v: TItem) => {
44
- const children = (v.children || []).map((t: TItem) => {
45
- return {
46
- label: t.label,
47
- value: t.value,
48
- };
49
- });
50
- return {
51
- label: v.label,
52
- value: v.value,
53
- children: isCascader.value ? children : undefined,
54
- };
55
- });
56
- });
57
- const visible = ref(false); // 控制浮窗展示
58
-
59
- watch(
60
- () => props.modelValue,
61
- (val: any) => {
62
- if (!props.multiple) {
63
- checked.value = val;
64
- } else {
65
- multiChecked.value = val;
66
- }
67
- },
68
- );
69
- // -------------------- 普通多选 --------------------
70
- const multiChecked = ref<any>([]); // 选中的值
71
-
72
- const change = (val: (string | number)[]) => {
73
- multiChecked.value = val;
74
- };
75
-
76
- // -------------------- 级联选择 --------------------
77
- const cascaderValue = ref([]);
78
- // -------------------- 单选 --------------------
79
- const checked = ref<any>(null); // 选中的值
80
- // 单选没有按钮,点击即是确认
81
- const handleCommand = (val: string | number) => {
82
- if (checked.value === val) {
83
- checked.value = null;
84
- } else {
85
- checked.value = val;
86
- }
87
- confirmFn();
88
- };
89
- // -------------------- 按钮操作 --------------------
90
- const reset = () => {
91
- multiChecked.value = [];
92
- cascaderValue.value = [];
93
- checked.value = null;
94
- confirmFn();
95
- };
96
- const confirmFn = () => {
97
- let finalValue = null;
98
- if (!props.multiple) {
99
- finalValue = checked.value;
100
- } else if (isCascader.value) {
101
- finalValue = cascaderValue.value;
102
- } else {
103
- finalValue = multiChecked.value;
104
- }
105
- emits('update:model-value', finalValue);
106
- visible.value = true;
107
- nextTick(() => {
108
- emits('confirm');
109
- visible.value = false;
110
- });
111
- };
112
-
113
- // 是否有选中值,用于切换图标
114
- const hasChecked = computed(() => {
115
- return multiChecked.value.length || cascaderValue.value.length || checked.value || props.modelValue;
116
- });
117
- // -------------------- 自定义级联选择器label --------------------
118
- const aref = ref<any>(null);
119
- const clickLabelSpan = async (e: any) => {
120
- const ele = e.target.parentElement.parentElement;
121
- await nextTick();
122
- const input = ele.querySelector('input');
123
- input.click();
124
- await nextTick();
125
- input.change?.(input);
126
- await nextTick();
127
- aref.value?.$forceUpdate();
128
- cascaderValue.value = JSON.parse(JSON.stringify(cascaderValue.value));
129
- };
130
- const renderLabel = ({ data }: any) => {
131
- return h('span', { onclick: clickLabelSpan }, data.label);
132
- };
133
- </script>
134
-
135
- <template>
136
- <div class="th-filter-wrapper" ref="filterRef">
137
- <span>
138
- <slot></slot>
139
- </span>
140
- <OPopover
141
- v-if="multiple"
142
- :visible="visible"
143
- position="bottom"
144
- wrapClass="th-filter-popover"
145
- trigger="click"
146
- :anchor="false">
147
- <template #target>
148
- <div class="filter-wrapper" :class="hasChecked && 'has-checked'">
149
- <OIcon class="filter-icon">
150
- <IconFilter />
151
- </OIcon>
152
- </div>
153
- </template>
154
- <OScroller class="content-wrapper" show-type="hover" disabled-x v-if="!isCascader">
155
- <OCheckboxGroup direction="v" @change="change" v-model="multiChecked">
156
- <OCheckbox v-for="item in options" :key="item.value" :value="item.value">
157
- <span v-dompurify-html="item.label"></span>
158
- </OCheckbox>
159
- </OCheckboxGroup>
160
- </OScroller>
161
- <div class="list-content-wrapper" v-else>
162
- <ElCascaderPanel
163
- ref="aref"
164
- expandTrigger="hover"
165
- :renderLabel="renderLabel"
166
- v-model="cascaderValue"
167
- style="width: fit-content"
168
- :options="options"
169
- :props="{ multiple: true, expandTrigger: 'hover' }"
170
- />
171
- </div>
172
- <ODivider />
173
- <div class="btn-wrapper">
174
- <OLink @click="reset">{{ t('common.reset') }}</OLink>
175
- <OLink @click="confirmFn">{{ t('common.confirm') }}</OLink>
176
- </div>
177
- </OPopover>
178
- <ODropdown v-else optionPosition="bottom" optionWrapClass="th-filter-dropdown" v-model="checked">
179
- <div class="filter-wrapper" :class="hasChecked && 'has-checked'">
180
- <OIcon class="filter-icon">
181
- <IconFilter />
182
- </OIcon>
183
- </div>
184
- <template #dropdown>
185
- <OScroller disabled-x style="max-height: 300px" show-type="always" v-if="options.length">
186
- <ODropdownItem
187
- :style="{
188
- '--table-width': tableWidth,
189
- }"
190
- :class="[{ 'is-active': modelValue === '' }]"
191
- value="''"
192
- :label="t('common.all')"
193
- @click="handleCommand('')"
194
- />
195
- <ODropdownItem
196
- :style="{
197
- '--table-width': tableWidth,
198
- }"
199
- :class="[{ 'is-active': item.value === modelValue }]"
200
- v-for="item in options"
201
- :key="item.value"
202
- :value="item.value"
203
- @click="handleCommand(item.value)"
204
- >
205
- <span v-dompurify-html="item.label"></span>
206
- </ODropdownItem>
207
- </OScroller>
208
- <slot name="empty" v-if="!options.length"></slot>
209
- </template>
210
- </ODropdown>
211
- </div>
212
- </template>
213
-
214
- <style lang="scss">
215
- .th-filter-wrapper {
216
- display: flex;
217
- column-gap: var(--o-gap-2);
218
- flex-wrap: nowrap;
219
- align-items: center;
220
-
221
- & > span:first-child {
222
- word-break: keep-all;
223
- }
224
- }
225
-
226
- .filter-wrapper {
227
- display: flex;
228
- align-items: center;
229
- justify-content: center;
230
- cursor: pointer;
231
-
232
- & > * {
233
- flex-shrink: 0;
234
- }
235
-
236
- .filter-hover-icon {
237
- display: none;
238
- }
239
-
240
- .filter-icon {
241
- @include h2;
242
- }
243
-
244
- &:hover,
245
- &.has-checked {
246
- .filter-icon {
247
- color: var(--o-color-primary1);
248
- }
249
-
250
- .o-icon {
251
- path {
252
- fill: currentColor;
253
- }
254
- }
255
- }
256
- }
257
-
258
- .th-filter-dropdown {
259
- .o-dropdown-item {
260
- min-width: 80px;
261
- max-width: calc(var(--table-width, 300) * 0.8px);
262
- --dropdown-item-justify: flex-start;
263
- --dropdown-item-padding: 7px 12px;
264
- }
265
-
266
- .o-dropdown-item.is-active {
267
- font-weight: 500;
268
- background-color: var(--dropdown-item-bg-color-hover);
269
- color: var(--dropdown-item-color-hover);
270
- }
271
- }
272
-
273
- .th-filter-popover {
274
- --popup-radius: var(--o-radius-xs);
275
-
276
- .o-popup-body {
277
- padding: var(--o-gap-2) 0 0 0;
278
- }
279
-
280
- .list-content-wrapper {
281
- display: flex;
282
-
283
- .o-scrollbar-wrapper:first-child {
284
- border-right: 1px solid rgb(224, 226, 230);
285
- }
286
- }
287
-
288
- .content-wrapper {
289
- padding: 0 var(--o-gap-4);
290
- overflow: auto;
291
- max-height: 300px;
292
-
293
- .o-checkbox-group {
294
- flex-shrink: 0;
295
- }
296
-
297
- .o-checkbox-label {
298
- flex-grow: 1;
299
-
300
- .label-wrapper {
301
- cursor: pointer;
302
- display: flex;
303
- align-items: center;
304
- justify-content: space-between;
305
-
306
- .o-svg-icon {
307
- font-size: 24px;
308
- }
309
- }
310
- }
311
- }
312
-
313
- .btn-wrapper {
314
- min-width: 158px;
315
- box-sizing: border-box;
316
- display: flex;
317
- align-items: center;
318
- justify-content: center;
319
- padding-bottom: var(--o-gap-3);
320
- @include text1;
321
-
322
- .o-link {
323
- width: 80px;
324
- display: flex;
325
- align-items: center;
326
- justify-content: center;
327
- }
328
- }
329
- }
330
- </style>