npmapps 1.0.24 → 1.0.26

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/app/.codegraph/daemon.pid +6 -0
  2. package/app/.eslintrc.js +19 -0
  3. package/app/README.md +24 -0
  4. package/app/babel.config.js +5 -0
  5. package/app/devtool-windows-amd64.zip +0 -0
  6. package/app/docs/superpowers/plans/2026-05-29-quill-editor.md +836 -0
  7. package/app/docs/superpowers/specs/2026-05-29-quill-editor-design.md +210 -0
  8. package/app/docs/superpowers/specs/2026-06-06-lazy-cascader-design.md +400 -0
  9. package/app/jsconfig.json +19 -0
  10. package/app/package-lock.json +21347 -0
  11. package/app/package.json +63 -0
  12. package/app/postcss.config.js +10 -0
  13. package/app/public/favicon.ico +0 -0
  14. package/app/public/index.html +17 -0
  15. package/app/public//344/270/200/351/224/256/351/273/221/346/232/227.html +136 -0
  16. package/app/src/App.vue +110 -0
  17. package/app/src/assets/bpmn-camunda.jpg +0 -0
  18. package/app/src/assets/css/diagram.less +17 -0
  19. package/app/src/assets/icon/Icon.less +31 -0
  20. package/app/src/assets/icon/font/app-codes.css +26 -0
  21. package/app/src/assets/icon/font/app.eot +0 -0
  22. package/app/src/assets/icon/font/app.svg +60 -0
  23. package/app/src/assets/icon/font/app.ttf +0 -0
  24. package/app/src/assets/icon/font/app.woff +0 -0
  25. package/app/src/assets/icon/font/app.woff2 +0 -0
  26. package/app/src/assets/icon/font/config.json +248 -0
  27. package/app/src/assets/icon/font/source/raw/align-bottom-tool.svg +30 -0
  28. package/app/src/assets/icon/font/source/raw/align-horizontal-center-tool.svg +85 -0
  29. package/app/src/assets/icon/font/source/raw/align-left-tool.svg +84 -0
  30. package/app/src/assets/icon/font/source/raw/align-right-tool.svg +80 -0
  31. package/app/src/assets/icon/font/source/raw/align-top-tool.svg +84 -0
  32. package/app/src/assets/icon/font/source/raw/align-vertical-center-tool.svg +89 -0
  33. package/app/src/assets/icon/font/source/raw/distribute-horizontally-tool.svg +95 -0
  34. package/app/src/assets/icon/font/source/raw/distribute-vertically-tool.svg +99 -0
  35. package/app/src/assets/icon/font/source/raw/set-color-tool.svg +111 -0
  36. package/app/src/assets/icon/font/source/symbols/align-bottom-tool.svg +30 -0
  37. package/app/src/assets/icon/font/source/symbols/align-horizontal-center-tool.svg +30 -0
  38. package/app/src/assets/icon/font/source/symbols/align-left-tool.svg +30 -0
  39. package/app/src/assets/icon/font/source/symbols/align-right-tool.svg +30 -0
  40. package/app/src/assets/icon/font/source/symbols/align-top-tool.svg +30 -0
  41. package/app/src/assets/icon/font/source/symbols/align-vertical-center-tool.svg +30 -0
  42. package/app/src/assets/icon/font/source/symbols/distribute-horizontally-tool.svg +30 -0
  43. package/app/src/assets/icon/font/source/symbols/distribute-vertically-tool.svg +30 -0
  44. package/app/src/assets/icon/font/source/symbols/set-color-tool.svg +63 -0
  45. package/app/src/assets/logo.png +0 -0
  46. package/app/src/components/EllTable/README.md +70 -0
  47. package/app/src/components/EllTable/article.md +184 -0
  48. package/app/src/components/EllTable/index.js +213 -0
  49. package/app/src/components/FormulaEditor/FunctionSelector.vue +123 -0
  50. package/app/src/components/FormulaEditor/OperatorSelector.vue +184 -0
  51. package/app/src/components/FormulaEditor/ParameterSelector.vue +123 -0
  52. package/app/src/components/FormulaEditor/api.js +69 -0
  53. package/app/src/components/FormulaEditor/index.vue +435 -0
  54. package/app/src/components/HelloWorld.vue +58 -0
  55. package/app/src/components/PageHeader/index.vue +158 -0
  56. package/app/src/components/Splitter/README.md +144 -0
  57. package/app/src/components/Splitter/example.vue +88 -0
  58. package/app/src/components/Splitter/index.vue +203 -0
  59. package/app/src/components/diagram/ToolBar.vue +357 -0
  60. package/app/src/components/diagram/customTranslate/customTranslate.js +12 -0
  61. package/app/src/components/diagram/customTranslate/translationsGerman.js +241 -0
  62. package/app/src/components/diagram/index.vue +261 -0
  63. package/app/src/components/diagram/xmlData.js +29 -0
  64. package/app/src/directives/filldown.js +155 -0
  65. package/app/src/directives/filldownTable.js +291 -0
  66. package/app/src/main.js +40 -0
  67. package/app/src/router/index.js +63 -0
  68. package/app/src/store/index.js +23 -0
  69. package/app/src/utils/winBox.js +23 -0
  70. package/app/src/views/Extend/A.vue +12 -0
  71. package/app/src/views/Extend/B.vue +10 -0
  72. package/app/src/views/Extend/MagicalComponentsForELFormItem.vue +87 -0
  73. package/app/src/views/Extend/index.vue +59 -0
  74. package/app/src/views/Extend/tableMouseHorizontalWheel.vue +193 -0
  75. package/app/src/views/Home.vue +37 -0
  76. package/app/src/views/RouterJump.vue +155 -0
  77. package/app/src/views/css.vue +57 -0
  78. package/app/src/views/cssComponents/EllipsisText.vue +83 -0
  79. package/app/src/views/cssComponents/HoverCard.vue +79 -0
  80. package/app/src/views/cssComponents/TableHover.vue +140 -0
  81. package/app/src/views/cssComponents/inputSlo.vue +52 -0
  82. package/app/src/views/cssComponents/tableFixed.vue +158 -0
  83. package/app/src/views/echarts/echart-dome.vue +82 -0
  84. package/app/src/views/echarts/index.vue +118 -0
  85. package/app/src/views/echarts/pei3d.vue +667 -0
  86. package/app/src/views/element/bpmn/index.vue +18 -0
  87. package/app/src/views/element/components/attendanceCycle/index.vue +131 -0
  88. package/app/src/views/element/components/attendanceGroup/index.vue +147 -0
  89. package/app/src/views/element/components/attendancePersonnel/index.vue +158 -0
  90. package/app/src/views/element/components/companyCalendar/index.vue +147 -0
  91. package/app/src/views/element/components/shift/index.vue +147 -0
  92. package/app/src/views/element/components/shiftRotationSystem/index.vue +147 -0
  93. package/app/src/views/element/elTableJsx/columnManagement.vue +340 -0
  94. package/app/src/views/element/elTableJsx/dialogInput.vue +71 -0
  95. package/app/src/views/element/elTableJsx/elTableJsx.vue +1826 -0
  96. package/app/src/views/element/elTableJsx/formTable.vue +598 -0
  97. package/app/src/views/element/elTableJsx/index.vue +29 -0
  98. package/app/src/views/element/elTableJsx/simpleTable.vue +192 -0
  99. package/app/src/views/element/elTableJsx.zip +0 -0
  100. package/app/src/views/element/index.vue +44 -0
  101. package/app/src/views/element/lazyCascader/LazyCascader.vue +302 -0
  102. package/app/src/views/element/lazyCascader/data.js +205 -0
  103. package/app/src/views/element/lazyCascader/index.vue +315 -0
  104. package/app/src/views/element/quillEditor/README.md +163 -0
  105. package/app/src/views/element/quillEditor/example.vue +314 -0
  106. package/app/src/views/element/quillEditor/index.vue +409 -0
  107. package/app/src/views/element/quillEditor/toolbar.js +122 -0
  108. package/app/vue.config.js +15 -0
  109. package/package.json +1 -1
  110. package/app/wujie-vue3-child/.claude/settings.local.json +0 -8
  111. package/app/wujie-vue3-child/.vscode/extensions.json +0 -3
  112. package/app/wujie-vue3-child/PROJECT_MEMORY.md +0 -427
  113. package/app/wujie-vue3-child/README.md +0 -5
  114. package/app/wujie-vue3-child/index.html +0 -13
  115. package/app/wujie-vue3-child/package-lock.json +0 -5744
  116. package/app/wujie-vue3-child/package.json +0 -28
  117. package/app/wujie-vue3-child/public/vite.svg +0 -1
  118. package/app/wujie-vue3-child/src/App.vue +0 -130
  119. package/app/wujie-vue3-child/src/assets/vue.svg +0 -1
  120. package/app/wujie-vue3-child/src/components/HelloWorld.vue +0 -43
  121. package/app/wujie-vue3-child/src/components/tags-view.vue +0 -193
  122. package/app/wujie-vue3-child/src/components/tags-view1.vue +0 -131
  123. package/app/wujie-vue3-child/src/directives/aiLoading.js +0 -182
  124. package/app/wujie-vue3-child/src/hooks/useClickOutside.js +0 -11
  125. package/app/wujie-vue3-child/src/hooks/useTableDragSort.js +0 -28
  126. package/app/wujie-vue3-child/src/main.js +0 -18
  127. package/app/wujie-vue3-child/src/router/index.js +0 -104
  128. package/app/wujie-vue3-child/src/store/tagsViewStroe.js +0 -34
  129. package/app/wujie-vue3-child/src/style.css +0 -171
  130. package/app/wujie-vue3-child/src/views/aiCoach/collapseExpand/index.jsx +0 -108
  131. package/app/wujie-vue3-child/src/views/aiCoach/collapseExpand/index.module.scss +0 -97
  132. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/README.md +0 -836
  133. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/REFLEX_EXAMPLES.md +0 -728
  134. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.jsx +0 -687
  135. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentPersonnelSelector.module.scss +0 -560
  136. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.jsx +0 -570
  137. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelector.module.scss +0 -330
  138. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.jsx +0 -378
  139. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/DepartmentSelectorV2.module.scss +0 -228
  140. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.jsx +0 -399
  141. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/OptionsSelector.module.scss +0 -252
  142. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.jsx +0 -585
  143. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PersonnelSelector.module.scss +0 -331
  144. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.jsx +0 -392
  145. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/PopoverSelector.module.scss +0 -39
  146. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/README.md +0 -248
  147. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/components/SelectorTrigger.jsx +0 -194
  148. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/index.jsx +0 -1459
  149. package/app/wujie-vue3-child/src/views/aiCoach/departmentPersonnel/mockData.js +0 -301
  150. package/app/wujie-vue3-child/src/views/aiCoach/dialogueSegment/index.jsx +0 -182
  151. package/app/wujie-vue3-child/src/views/aiCoach/dialogueSegment/index.module.scss +0 -28
  152. package/app/wujie-vue3-child/src/views/aiCoach/index.jsx +0 -293
  153. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.jsx +0 -121
  154. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ChartsPanel/index.module.scss +0 -76
  155. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/DonutChart/index.jsx +0 -104
  156. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.jsx +0 -75
  157. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/PracticeTable/index.module.scss +0 -12
  158. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.jsx +0 -62
  159. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankBarChart/index.module.scss +0 -43
  160. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.jsx +0 -29
  161. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingGroup/index.module.scss +0 -5
  162. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.jsx +0 -58
  163. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/RankingList/index.module.scss +0 -85
  164. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.jsx +0 -92
  165. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/ScriptStatsPanel/index.module.scss +0 -56
  166. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.jsx +0 -40
  167. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/StatCardsRow/index.module.scss +0 -53
  168. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsDonut.jsx +0 -106
  169. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/components/echarts/EchartsRankBar.jsx +0 -132
  170. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.jsx +0 -176
  171. package/app/wujie-vue3-child/src/views/aiCoach/practiceStatus/index.module.scss +0 -96
  172. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.jsx +0 -162
  173. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/CoachReport/index.module.scss +0 -16
  174. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.jsx +0 -29
  175. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ComprehensiveEvaluation/index.module.scss +0 -25
  176. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.jsx +0 -106
  177. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueBubble/index.module.scss +0 -164
  178. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.jsx +0 -182
  179. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DialogueRecord/index.module.scss +0 -203
  180. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.jsx +0 -145
  181. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionDetail/index.module.scss +0 -126
  182. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.jsx +0 -67
  183. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/DimensionScores/index.module.scss +0 -105
  184. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.jsx +0 -81
  185. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ReportHeader/index.module.scss +0 -47
  186. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.jsx +0 -64
  187. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/RoleInfo/index.module.scss +0 -85
  188. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.jsx +0 -39
  189. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/ScoreBadge/index.module.scss +0 -44
  190. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.jsx +0 -83
  191. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/components/SubDimensionItem/index.module.scss +0 -101
  192. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.jsx +0 -50
  193. package/app/wujie-vue3-child/src/views/aiCoach/reportDetail/index.module.scss +0 -25
  194. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/index.jsx +0 -196
  195. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/index.module.scss +0 -41
  196. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/inputColumn/index.jsx +0 -183
  197. package/app/wujie-vue3-child/src/views/aiCoach/scriptTable/inputColumn/index.module.scss +0 -115
  198. package/app/wujie-vue3-child/src/views/child-to-parent.vue +0 -117
  199. package/app/wujie-vue3-child/src/views/home.vue +0 -53
  200. package/app/wujie-vue3-child/src/views/jsx/btnSelect/btnSelect.vue +0 -169
  201. package/app/wujie-vue3-child/src/views/jsx/btnSelect/index.vue +0 -69
  202. package/app/wujie-vue3-child/src/views/jsx/com.vue +0 -44
  203. package/app/wujie-vue3-child/src/views/jsx/dialog.jsx +0 -66
  204. package/app/wujie-vue3-child/src/views/jsx/index.vue +0 -72
  205. package/app/wujie-vue3-child/src/views/jsx/props.vue +0 -33
  206. package/app/wujie-vue3-child/src/views/parent-to-child.vue +0 -225
  207. package/app/wujie-vue3-child/src/views/phone-code.vue +0 -318
  208. package/app/wujie-vue3-child/src/views/router-jump.vue +0 -123
  209. package/app/wujie-vue3-child/src/views/test.vue +0 -192
  210. package/app/wujie-vue3-child/vite.config.js +0 -15
@@ -1,331 +0,0 @@
1
- // 人员选择器样式
2
- .personnelSelector {
3
- position: relative;
4
- width: 100%;
5
- }
6
-
7
- // 自定义输入框
8
- .customInput {
9
- display: flex;
10
- align-items: center;
11
- width: 100%;
12
- min-height: 32px;
13
- padding: 1px 11px;
14
- background: #fff;
15
- border: 1px solid #dcdfe6;
16
- border-radius: 4px;
17
- cursor: pointer;
18
- transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
19
- outline: none;
20
- box-sizing: border-box;
21
-
22
- &:hover {
23
- border-color: #c0c4cc;
24
- }
25
-
26
- &.focused {
27
- border-color: #409eff;
28
- }
29
-
30
- &.disabled {
31
- background-color: #f5f7fa;
32
- border-color: #e4e7ed;
33
- color: #c0c4cc;
34
- cursor: not-allowed;
35
- }
36
- }
37
-
38
- // 输入框内容区域
39
- .inputContent {
40
- flex: 1;
41
- display: flex;
42
- align-items: center;
43
- min-width: 0;
44
- min-height: 30px;
45
- padding: 2px 0;
46
- }
47
-
48
- // 占位符
49
- .placeholder {
50
- color: #c0c4cc;
51
- font-size: 14px;
52
- }
53
-
54
- // 前置标签
55
- .label {
56
- color: #606266;
57
- font-size: 14px;
58
- margin-right: 4px;
59
- flex-shrink: 0;
60
- }
61
-
62
- // 单选文本
63
- .text {
64
- color: #606266;
65
- font-size: 14px;
66
- overflow: hidden;
67
- text-overflow: ellipsis;
68
- white-space: nowrap;
69
- }
70
-
71
- // 标签容器
72
- .tagsWrapper {
73
- display: flex;
74
- align-items: center;
75
- flex-wrap: wrap;
76
- gap: 4px;
77
- }
78
-
79
- // 标签
80
- .tag {
81
- margin: 0;
82
- max-width: 100%;
83
-
84
- :global(.el-tag__content) {
85
- overflow: hidden;
86
- text-overflow: ellipsis;
87
- white-space: nowrap;
88
- }
89
- }
90
-
91
- // 按钮模式包装器
92
- .buttonWrapper {
93
- // width: 100%;
94
- }
95
-
96
- // 按钮内部容器
97
- .buttonInner {
98
- display: flex;
99
- align-items: center;
100
- justify-content: space-between;
101
- width: 100%;
102
- gap: 8px;
103
- }
104
-
105
- // 按钮内容区域
106
- .buttonContent {
107
- flex: 1;
108
- display: flex;
109
- align-items: center;
110
- min-width: 0;
111
- text-align: left;
112
- overflow: hidden;
113
- }
114
-
115
- // 按钮文字包装器(用于显示文字+徽章)
116
- .buttonTextWrapper {
117
- display: flex;
118
- align-items: center;
119
- gap: 8px;
120
- }
121
-
122
- // 数量徽章(圆圈显示 +N)
123
- .countBadge {
124
- display: inline-flex;
125
- align-items: center;
126
- justify-content: center;
127
- min-width: 20px;
128
- height: 20px;
129
- padding: 0 4px;
130
- background-color: #ecf5ff;
131
- color: #409eff;
132
- font-size: 12px;
133
- font-weight: 500;
134
- border-radius: 10px;
135
- white-space: nowrap;
136
- flex-shrink: 0;
137
- }
138
-
139
- // 右侧图标区域
140
- .suffixIcons {
141
- display: flex;
142
- align-items: center;
143
- gap: 4px;
144
- margin-left: 8px;
145
- flex-shrink: 0;
146
- }
147
-
148
- // 清除图标
149
- .clearIcon {
150
- font-size: 14px;
151
- color: #c0c4cc;
152
- cursor: pointer;
153
- transition: color 0.2s;
154
-
155
- &:hover {
156
- color: #909399;
157
- }
158
- }
159
-
160
- // 下拉箭头图标
161
- .arrowIcon {
162
- font-size: 14px;
163
- color: #c0c4cc;
164
- transition: transform 0.3s;
165
-
166
- &.reverse {
167
- transform: rotate(180deg);
168
- }
169
- }
170
-
171
- .disabled {
172
- .clearIcon,
173
- .arrowIcon {
174
- cursor: not-allowed;
175
- }
176
- }
177
-
178
- // 下拉框容器
179
- .dropdown {
180
- position: fixed;
181
- background: #fff;
182
- border: 1px solid #e4e7ed;
183
- border-radius: 4px;
184
- box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
185
- z-index: 2000;
186
- display: flex;
187
- flex-direction: column;
188
- overflow: hidden;
189
- }
190
-
191
- // 悬浮窗内容
192
- .dropdownContent {
193
- display: flex;
194
- flex-direction: column;
195
- height: 100%;
196
- max-height: inherit; // 继承父容器的 maxHeight
197
- overflow: hidden; // 防止内容溢出到悬浮窗外
198
- }
199
-
200
- // 搜索框区域
201
- .searchBox {
202
- padding: 8px;
203
- border-bottom: 1px solid #e4e7ed;
204
- background: #fff;
205
- }
206
-
207
- // 列表容器
208
- .listWrapper {
209
- flex: 1;
210
- overflow-y: auto;
211
-
212
- // 自定义滚动条样式
213
- &::-webkit-scrollbar {
214
- width: 6px;
215
- }
216
-
217
- &::-webkit-scrollbar-track {
218
- background: #f1f1f1;
219
- border-radius: 3px;
220
- }
221
-
222
- &::-webkit-scrollbar-thumb {
223
- background: #c1c1c1;
224
- border-radius: 3px;
225
-
226
- &:hover {
227
- background: #a8a8a8;
228
- }
229
- }
230
- }
231
-
232
- // 人员列表
233
- .personnelList {
234
- padding: 4px 0;
235
- }
236
-
237
- // 人员列表项
238
- .personnelItem {
239
- display: flex;
240
- align-items: center;
241
- padding: 8px 12px;
242
- cursor: pointer;
243
- transition: background-color 0.2s;
244
-
245
- &:hover {
246
- background-color: #f5f7fa;
247
- }
248
-
249
- &.selected {
250
- background-color: #ecf5ff;
251
-
252
- .personName {
253
- color: #409eff;
254
- font-weight: 500;
255
- }
256
- }
257
- }
258
-
259
- // 复选框
260
- .checkbox {
261
- margin-right: 8px;
262
- pointer-events: none;
263
- }
264
-
265
- // 人员信息
266
- .personInfo {
267
- flex: 1;
268
- min-width: 0;
269
- }
270
-
271
- // 人员姓名
272
- .personName {
273
- font-size: 14px;
274
- color: #606266;
275
- margin-bottom: 4px;
276
- overflow: hidden;
277
- text-overflow: ellipsis;
278
- white-space: nowrap;
279
- }
280
-
281
- // 人员元数据
282
- .personMeta {
283
- display: flex;
284
- align-items: center;
285
- font-size: 12px;
286
- color: #909399;
287
- }
288
-
289
- // 职位
290
- .position {
291
- overflow: hidden;
292
- text-overflow: ellipsis;
293
- white-space: nowrap;
294
- }
295
-
296
- // 分隔符
297
- .divider {
298
- margin: 0 6px;
299
- color: #dcdfe6;
300
- }
301
-
302
- // 电话
303
- .phone {
304
- overflow: hidden;
305
- text-overflow: ellipsis;
306
- white-space: nowrap;
307
- }
308
-
309
- // 空状态
310
- .empty {
311
- padding: 40px 16px;
312
- text-align: center;
313
- color: #909399;
314
- font-size: 14px;
315
- }
316
-
317
- // 加载状态
318
- .loading {
319
- display: flex;
320
- flex-direction: column;
321
- align-items: center;
322
- justify-content: center;
323
- padding: 40px 16px;
324
- color: #909399;
325
- font-size: 14px;
326
-
327
- .el-icon {
328
- font-size: 24px;
329
- margin-bottom: 8px;
330
- }
331
- }
@@ -1,392 +0,0 @@
1
- import { defineComponent, ref, onMounted, onBeforeUnmount, nextTick } from 'vue'
2
- import styles from './PopoverSelector.module.scss'
3
-
4
- /**
5
- * 通用悬浮窗选择器组件
6
- * @component PopoverSelector
7
- * @description 提供触发器和悬浮窗两个插槽,实现解耦的选择器组件
8
- *
9
- * @example
10
- * <PopoverSelector width={400} maxHeight={500}>
11
- * {{
12
- * trigger: ({ open, visible }) => (
13
- * <el-button onClick={open}>选择部门</el-button>
14
- * ),
15
- * default: ({ close }) => (
16
- * <div>悬浮窗内容</div>
17
- * )
18
- * }}
19
- * </PopoverSelector>
20
- */
21
- export default defineComponent({
22
- name: 'PopoverSelector',
23
-
24
- props: {
25
- /**
26
- * 悬浮窗宽度
27
- * @type {number|string}
28
- */
29
- width: {
30
- type: [Number, String],
31
- default: 400,
32
- },
33
- /**
34
- * 悬浮窗高度(不设置则自适应)
35
- * @type {number|string}
36
- */
37
- height: {
38
- type: [Number, String],
39
- default: null,
40
- },
41
- /**
42
- * 悬浮窗最大高度
43
- * @type {number}
44
- */
45
- maxHeight: {
46
- type: Number,
47
- default: 400,
48
- },
49
- /**
50
- * 悬浮窗自定义 class
51
- * @type {string|Array|Object}
52
- */
53
- dropdownClass: {
54
- type: [String, Array, Object],
55
- default: '',
56
- },
57
- /**
58
- * 悬浮窗自定义 style
59
- * @type {Object}
60
- */
61
- dropdownStyle: {
62
- type: Object,
63
- default: () => ({}),
64
- },
65
- /**
66
- * 是否禁用
67
- * @type {boolean}
68
- */
69
- disabled: {
70
- type: Boolean,
71
- default: false,
72
- },
73
- /**
74
- * 悬浮窗位置:auto 自动 | top 上方 | bottom 下方
75
- * @type {string}
76
- */
77
- placement: {
78
- type: String,
79
- default: 'auto',
80
- validator: (value) => ['auto', 'top', 'bottom'].includes(value),
81
- },
82
- /**
83
- * 悬浮窗与触发器的间距
84
- * @type {number}
85
- */
86
- offset: {
87
- type: Number,
88
- default: 4,
89
- },
90
- /**
91
- * 是否显示动画
92
- * @type {boolean}
93
- */
94
- animated: {
95
- type: Boolean,
96
- default: true,
97
- },
98
- /**
99
- * 触发方式:click 点击 | hover 悬浮
100
- * @type {string}
101
- */
102
- triggerEvent: {
103
- type: String,
104
- default: 'click',
105
- validator: (value) => ['click', 'hover'].includes(value),
106
- },
107
- /**
108
- * hover 触发时的延迟(毫秒)
109
- * @type {number}
110
- */
111
- hoverDelay: {
112
- type: Number,
113
- default: 200,
114
- },
115
- },
116
-
117
- emits: ['open', 'close', 'update:visible'],
118
-
119
- setup(props, { emit, slots }) {
120
- // 是否显示悬浮窗
121
- const visible = ref(false)
122
-
123
- // 触发器 ref
124
- const triggerRef = ref(null)
125
-
126
- // 悬浮窗 ref
127
- const dropdownRef = ref(null)
128
-
129
- // 悬浮窗动态样式
130
- const computedDropdownStyle = ref({})
131
-
132
- // hover 延迟定时器
133
- let hoverTimer = null
134
-
135
- /**
136
- * 计算悬浮窗位置
137
- */
138
- const calculatePosition = () => {
139
- if (!triggerRef.value || !dropdownRef.value) return
140
-
141
- // 获取真正的 DOM 元素(处理 el-button 等组件实例)
142
- const triggerEl = triggerRef.value.$el || triggerRef.value
143
- const rect = triggerEl.getBoundingClientRect()
144
-
145
- // 悬浮窗尺寸
146
- const dropdownWidth = typeof props.width === 'number' ? props.width : parseInt(props.width)
147
- const dropdownHeight = props.height
148
- ? (typeof props.height === 'number' ? props.height : parseInt(props.height))
149
- : null
150
-
151
- // 计算可用空间
152
- const spaceBelow = window.innerHeight - rect.bottom
153
- const spaceAbove = rect.top
154
-
155
- // 判断显示位置
156
- let showAbove = false
157
- if (props.placement === 'top') {
158
- showAbove = true
159
- } else if (props.placement === 'bottom') {
160
- showAbove = false
161
- } else {
162
- // auto 模式:根据空间自动判断
163
- showAbove = spaceBelow < props.maxHeight && spaceAbove > spaceBelow
164
- }
165
-
166
- // 基础样式
167
- const baseStyle = {
168
- position: 'fixed',
169
- left: `${rect.left}px`,
170
- width: `${dropdownWidth}px`,
171
- }
172
-
173
- // 根据位置计算样式
174
- if (showAbove) {
175
- // 显示在上方
176
- const availableHeight = Math.min(props.maxHeight, spaceAbove - props.offset)
177
- computedDropdownStyle.value = {
178
- ...baseStyle,
179
- bottom: `${window.innerHeight - rect.top + props.offset}px`,
180
- maxHeight: dropdownHeight ? 'none' : `${availableHeight}px`,
181
- height: dropdownHeight ? `${Math.min(dropdownHeight, availableHeight)}px` : 'auto',
182
- }
183
- } else {
184
- // 显示在下方
185
- const availableHeight = Math.min(props.maxHeight, spaceBelow - props.offset)
186
- computedDropdownStyle.value = {
187
- ...baseStyle,
188
- top: `${rect.bottom + props.offset}px`,
189
- maxHeight: dropdownHeight ? 'none' : `${availableHeight}px`,
190
- height: dropdownHeight ? `${Math.min(dropdownHeight, availableHeight)}px` : 'auto',
191
- }
192
- }
193
-
194
- // 合并用户自定义样式
195
- computedDropdownStyle.value = {
196
- ...computedDropdownStyle.value,
197
- ...props.dropdownStyle,
198
- }
199
- }
200
-
201
- /**
202
- * 打开悬浮窗
203
- */
204
- const open = async () => {
205
- if (props.disabled) return
206
-
207
- visible.value = true
208
- emit('update:visible', true)
209
- emit('open')
210
-
211
- // 等待 DOM 更新后计算位置
212
- await nextTick()
213
- calculatePosition()
214
- }
215
-
216
- /**
217
- * 关闭悬浮窗
218
- */
219
- const close = () => {
220
- visible.value = false
221
- emit('update:visible', false)
222
- emit('close')
223
- }
224
-
225
- /**
226
- * 切换悬浮窗
227
- */
228
- const toggle = () => {
229
- if (visible.value) {
230
- close()
231
- } else {
232
- open()
233
- }
234
- }
235
-
236
- /**
237
- * 处理 hover 进入
238
- */
239
- const handleMouseEnter = () => {
240
- if (props.triggerEvent !== 'hover' || props.disabled) return
241
-
242
- // 清除之前的定时器
243
- if (hoverTimer) {
244
- clearTimeout(hoverTimer)
245
- }
246
-
247
- // 延迟打开
248
- hoverTimer = setTimeout(() => {
249
- open()
250
- }, props.hoverDelay)
251
- }
252
-
253
- /**
254
- * 处理 hover 离开
255
- */
256
- const handleMouseLeave = () => {
257
- if (props.triggerEvent !== 'hover') return
258
-
259
- // 清除定时器
260
- if (hoverTimer) {
261
- clearTimeout(hoverTimer)
262
- }
263
-
264
- // 延迟关闭
265
- hoverTimer = setTimeout(() => {
266
- close()
267
- }, props.hoverDelay)
268
- }
269
-
270
- /**
271
- * 取消关闭(鼠标进入悬浮窗时)
272
- */
273
- const cancelClose = () => {
274
- if (hoverTimer) {
275
- clearTimeout(hoverTimer)
276
- }
277
- }
278
-
279
- /**
280
- * 点击外部关闭
281
- */
282
- const handleClickOutside = (e) => {
283
- if (!visible.value) return
284
-
285
- const triggerEl = triggerRef.value?.$el || triggerRef.value
286
- const dropdownEl = dropdownRef.value
287
-
288
- if (
289
- triggerEl &&
290
- dropdownEl &&
291
- !triggerEl.contains(e.target) &&
292
- !dropdownEl.contains(e.target)
293
- ) {
294
- close()
295
- }
296
- }
297
-
298
- /**
299
- * 窗口大小改变时重新计算位置
300
- */
301
- const handleResize = () => {
302
- if (visible.value) {
303
- calculatePosition()
304
- }
305
- }
306
-
307
- // 生命周期
308
- onMounted(() => {
309
- document.addEventListener('click', handleClickOutside)
310
- window.addEventListener('resize', handleResize)
311
- window.addEventListener('scroll', handleResize, true)
312
- })
313
-
314
- onBeforeUnmount(() => {
315
- document.removeEventListener('click', handleClickOutside)
316
- window.removeEventListener('resize', handleResize)
317
- window.removeEventListener('scroll', handleResize, true)
318
-
319
- // 清除定时器
320
- if (hoverTimer) {
321
- clearTimeout(hoverTimer)
322
- }
323
- })
324
-
325
- return () => {
326
- // 检查是否提供了必需的插槽
327
- if (!slots.trigger) {
328
- console.warn('PopoverSelector: trigger 插槽是必需的')
329
- return null
330
- }
331
-
332
- // 构建触发器事件
333
- const triggerEvents = {}
334
- if (props.triggerEvent === 'hover') {
335
- triggerEvents.onMouseenter = handleMouseEnter
336
- triggerEvents.onMouseleave = handleMouseLeave
337
- }
338
-
339
- // 渲染触发器插槽
340
- const triggerSlot = slots.trigger?.({
341
- open,
342
- close,
343
- toggle,
344
- visible: visible.value,
345
- // 传递事件给插槽,让用户可以自定义
346
- events: triggerEvents,
347
- })
348
-
349
- // 渲染悬浮窗内容插槽
350
- const dropdownContent = slots.default?.({
351
- close,
352
- visible: visible.value,
353
- })
354
-
355
- // 悬浮窗的 hover 事件(用于 hover 模式)
356
- const dropdownEvents = {}
357
- if (props.triggerEvent === 'hover') {
358
- dropdownEvents.onMouseenter = cancelClose
359
- dropdownEvents.onMouseleave = handleMouseLeave
360
- }
361
-
362
- return (
363
- <div class={styles.popoverSelector}>
364
- {/* 触发器 */}
365
- <div
366
- ref={triggerRef}
367
- class={styles.trigger}
368
- {...triggerEvents}
369
- >
370
- {triggerSlot}
371
- </div>
372
-
373
- {/* 悬浮窗 */}
374
- {visible.value && (
375
- <div
376
- ref={dropdownRef}
377
- class={[
378
- styles.dropdown,
379
- props.animated && styles.animated,
380
- props.dropdownClass,
381
- ]}
382
- style={computedDropdownStyle.value}
383
- {...dropdownEvents}
384
- >
385
- {dropdownContent}
386
- </div>
387
- )}
388
- </div>
389
- )
390
- }
391
- },
392
- })