@opentiny/vue-docs 3.24.6 → 3.26.0

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 (249) hide show
  1. package/.stylelintrc.js +2 -2
  2. package/demos/apis/button.js +15 -0
  3. package/demos/apis/calendar-view.js +3 -2
  4. package/demos/apis/chart-demo.js +1 -1
  5. package/demos/apis/chart-docs.js +1 -1
  6. package/demos/apis/chart-events.js +1 -1
  7. package/demos/apis/chart-question.js +1 -1
  8. package/demos/apis/chart.js +1 -1
  9. package/demos/apis/form.js +3 -0
  10. package/demos/apis/grid.js +76 -16
  11. package/demos/apis/modal.js +1 -1
  12. package/demos/apis/numeric.js +3 -3
  13. package/demos/apis/search.js +28 -0
  14. package/demos/apis/slider-button.js +22 -0
  15. package/demos/apis/split.js +11 -0
  16. package/demos/apis/steps.js +3 -3
  17. package/demos/apis/tabs.js +12 -0
  18. package/demos/apis/time-line.js +20 -0
  19. package/demos/mobile-first/app/button/type.vue +1 -1
  20. package/demos/mobile-first/app/button/webdoc/button.js +2 -2
  21. package/demos/mobile-first/app/slider-button/basic-usage.vue +5 -5
  22. package/demos/mobile-first/app/slider-button/webdoc/slider-button.js +1 -1
  23. package/demos/mobile-first/app/steps/advanced-steps.vue +8 -1
  24. package/demos/mobile-first/menus.js +16 -9
  25. package/demos/pc/app/action-menu/basic-usage-composition-api.vue +1 -1
  26. package/demos/pc/app/action-menu/basic-usage.vue +1 -1
  27. package/demos/pc/app/action-menu/card-mode-composition-api.vue +1 -1
  28. package/demos/pc/app/action-menu/card-mode.vue +1 -1
  29. package/demos/pc/app/action-menu/disabled-composition-api.vue +2 -2
  30. package/demos/pc/app/action-menu/disabled.vue +2 -2
  31. package/demos/pc/app/action-menu/events-composition-api.vue +1 -1
  32. package/demos/pc/app/action-menu/events.vue +1 -1
  33. package/demos/pc/app/action-menu/icon-composition-api.vue +2 -2
  34. package/demos/pc/app/action-menu/icon.vue +2 -2
  35. package/demos/pc/app/action-menu/max-show-num-composition-api.vue +1 -1
  36. package/demos/pc/app/action-menu/max-show-num.vue +1 -1
  37. package/demos/pc/app/action-menu/more-text-composition-api.vue +1 -1
  38. package/demos/pc/app/action-menu/more-text.vue +1 -1
  39. package/demos/pc/app/action-menu/popper-class-composition-api.vue +1 -1
  40. package/demos/pc/app/action-menu/popper-class.vue +1 -1
  41. package/demos/pc/app/action-menu/slot-item-composition-api.vue +1 -1
  42. package/demos/pc/app/action-menu/slot-item.vue +1 -1
  43. package/demos/pc/app/action-menu/spacing-composition-api.vue +1 -1
  44. package/demos/pc/app/action-menu/spacing.vue +1 -1
  45. package/demos/pc/app/action-menu/text-field-composition-api.vue +1 -1
  46. package/demos/pc/app/action-menu/text-field.spec.ts +1 -1
  47. package/demos/pc/app/action-menu/text-field.vue +1 -1
  48. package/demos/pc/app/amount/custom-service.spec.js +4 -4
  49. package/demos/pc/app/base-select/slot-reference.spec.ts +1 -1
  50. package/demos/pc/app/button/icon-composition-api.vue +3 -1
  51. package/demos/pc/app/button/icon.vue +3 -1
  52. package/demos/pc/app/button/webdoc/button.js +3 -2
  53. package/demos/pc/app/calendar-view/calendar-mode-composition-api.vue +7 -1
  54. package/demos/pc/app/calendar-view/calendar-mode.spec.ts +3 -0
  55. package/demos/pc/app/calendar-view/calendar-mode.vue +7 -1
  56. package/demos/pc/app/carousel/webdoc/carousel.js +0 -18
  57. package/demos/pc/app/color-picker/alpha-composition-api.vue +1 -1
  58. package/demos/pc/app/color-picker/alpha.spec.ts +2 -2
  59. package/demos/pc/app/color-picker/alpha.vue +1 -1
  60. package/demos/pc/app/color-picker/base.spec.ts +2 -2
  61. package/demos/pc/app/color-picker/default-visible.spec.ts +1 -1
  62. package/demos/pc/app/color-picker/event-composition-api.vue +2 -2
  63. package/demos/pc/app/color-picker/event.spec.ts +4 -4
  64. package/demos/pc/app/color-picker/event.vue +1 -1
  65. package/demos/pc/app/color-picker/format.spec.ts +6 -6
  66. package/demos/pc/app/color-picker/history.spec.ts +1 -7
  67. package/demos/pc/app/color-picker/predefine.spec.ts +3 -10
  68. package/demos/pc/app/color-picker/size.spec.ts +4 -4
  69. package/demos/pc/app/color-select-panel/format.spec.ts +2 -8
  70. package/demos/pc/app/color-select-panel/history.spec.ts +0 -2
  71. package/demos/pc/app/color-select-panel/predefine.spec.ts +0 -3
  72. package/demos/pc/app/container/basic-usage-composition-api.vue +10 -10
  73. package/demos/pc/app/container/basic-usage.vue +10 -10
  74. package/demos/pc/app/container/custom-with-height-composition-api.vue +8 -8
  75. package/demos/pc/app/container/custom-with-height.vue +10 -10
  76. package/demos/pc/app/date-panel/custom-week.spec.ts +2 -2
  77. package/demos/pc/app/dialog-select/nest-grid-single.spec.ts +40 -0
  78. package/demos/pc/app/dialog-select/nest-tree-multi.spec.ts +53 -0
  79. package/demos/pc/app/dialog-select/nest-tree-single.spec.ts +25 -0
  80. package/demos/pc/app/dialog-select/set-selection.spec.ts +20 -0
  81. package/demos/pc/app/file-upload/before-upload-limit-composition-api.vue +1 -1
  82. package/demos/pc/app/file-upload/before-upload-limit.spec.ts +1 -1
  83. package/demos/pc/app/file-upload/before-upload-limit.vue +1 -1
  84. package/demos/pc/app/file-upload/custom-trigger-composition-api.vue +1 -1
  85. package/demos/pc/app/file-upload/custom-trigger.spec.ts +1 -1
  86. package/demos/pc/app/file-upload/custom-trigger.vue +1 -1
  87. package/demos/pc/app/file-upload/custom-upload-tip-composition-api.vue +1 -1
  88. package/demos/pc/app/file-upload/custom-upload-tip.vue +1 -1
  89. package/demos/pc/app/file-upload/form-validation-composition-api.vue +1 -1
  90. package/demos/pc/app/file-upload/form-validation.vue +1 -1
  91. package/demos/pc/app/file-upload/image-size-composition-api.vue +1 -1
  92. package/demos/pc/app/file-upload/image-size.spec.ts +1 -1
  93. package/demos/pc/app/file-upload/image-size.vue +1 -1
  94. package/demos/pc/app/file-upload/multiple-file-composition-api.vue +1 -1
  95. package/demos/pc/app/file-upload/multiple-file.spec.ts +1 -1
  96. package/demos/pc/app/file-upload/multiple-file.vue +1 -1
  97. package/demos/pc/app/file-upload/prevent-delete-file-composition-api.vue +1 -1
  98. package/demos/pc/app/file-upload/prevent-delete-file.vue +1 -1
  99. package/demos/pc/app/file-upload/upload-request-composition-api.vue +1 -1
  100. package/demos/pc/app/file-upload/upload-request.spec.ts +2 -2
  101. package/demos/pc/app/file-upload/upload-request.vue +1 -1
  102. package/demos/pc/app/grid/base/basic-usage-composition-api.vue +1 -17
  103. package/demos/pc/app/grid/custom/column-fixed.spec.js +2 -1
  104. package/demos/pc/app/grid/custom/page-size.spec.js +1 -1
  105. package/demos/pc/app/grid/data-source/auto-load.spec.js +0 -1
  106. package/demos/pc/app/grid/data-source/request-service.spec.js +1 -1
  107. package/demos/pc/app/grid/data-source/static-data.spec.js +1 -1
  108. package/demos/pc/app/grid/dynamically-columns/dynamically-columns.spec.js +2 -1
  109. package/demos/pc/app/grid/edit/scrollbar-not-blur-composition-api.vue +119 -0
  110. package/demos/pc/app/grid/edit/scrollbar-not-blur.spec.ts +28 -0
  111. package/demos/pc/app/grid/edit/scrollbar-not-blur.vue +129 -0
  112. package/demos/pc/app/grid/editor/custom-edit.spec.js +7 -2
  113. package/demos/pc/app/grid/empty/empty-data-iscenter.spec.js +1 -1
  114. package/demos/pc/app/grid/event/toolbar-button-click-event.spec.js +1 -1
  115. package/demos/pc/app/grid/expand/expand-trigger-slot-composition-api.vue +85 -0
  116. package/demos/pc/app/grid/expand/expand-trigger-slot.spec.ts +11 -0
  117. package/demos/pc/app/grid/expand/expand-trigger-slot.vue +95 -0
  118. package/demos/pc/app/grid/expand/set-row-expansion.spec.js +4 -0
  119. package/demos/pc/app/grid/filter/custom-filter.spec.js +3 -3
  120. package/demos/pc/app/grid/filter/default-filter-composition-api.vue +6 -0
  121. package/demos/pc/app/grid/filter/default-filter.vue +6 -0
  122. package/demos/pc/app/grid/filter/default-relation.spec.js +1 -1
  123. package/demos/pc/app/grid/filter/server-filter.spec.js +1 -1
  124. package/demos/pc/app/grid/filter/simple-filter.spec.ts +5 -4
  125. package/demos/pc/app/grid/fixed/right-fixed-composition-api.vue +4 -4
  126. package/demos/pc/app/grid/fixed/right-fixed.vue +4 -4
  127. package/demos/pc/app/grid/footer/footer-summation-empty.spec.js +0 -1
  128. package/demos/pc/app/grid/large-data/full-data-loading.spec.js +10 -3
  129. package/demos/pc/app/grid/large-data/virtual-rolling.spec.js +9 -2
  130. package/demos/pc/app/grid/mouse-keyboard/keyboard-navigation.spec.js +4 -1
  131. package/demos/pc/app/grid/renderer/inner-renderer-date-composition-api.vue +4 -3
  132. package/demos/pc/app/grid/renderer/inner-renderer-date.spec.js +2 -2
  133. package/demos/pc/app/grid/renderer/inner-renderer-date.vue +3 -3
  134. package/demos/pc/app/grid/renderer/inner-renderer.spec.js +4 -0
  135. package/demos/pc/app/grid/size/max-min-grid-height.spec.js +2 -2
  136. package/demos/pc/app/grid/slot/slot-conf-composition-api.vue +141 -0
  137. package/demos/pc/app/grid/slot/slot-conf.spec.js +12 -0
  138. package/demos/pc/app/grid/slot/slot-conf.vue +151 -0
  139. package/demos/pc/app/grid/sort/combinations-sort.spec.js +2 -2
  140. package/demos/pc/app/grid/webdoc/grid-edit.js +12 -0
  141. package/demos/pc/app/grid/webdoc/grid-empty.js +1 -1
  142. package/demos/pc/app/grid/webdoc/grid-expand.js +11 -0
  143. package/demos/pc/app/grid/webdoc/grid-slot.js +9 -0
  144. package/demos/pc/app/icon/iconGroups.js +8 -2
  145. package/demos/pc/app/input/basic-usage.spec.ts +1 -1
  146. package/demos/pc/app/loading/background.spec.ts +3 -1
  147. package/demos/pc/app/loading/custom-class.spec.ts +4 -2
  148. package/demos/pc/app/loading/fullscreen.spec.ts +6 -4
  149. package/demos/pc/app/loading/loading-tip-text.spec.ts +3 -1
  150. package/demos/pc/app/loading/size.spec.ts +5 -3
  151. package/demos/pc/app/locales/custom-service-composition-api.vue +3 -3
  152. package/demos/pc/app/locales/custom-service.spec.ts +1 -1
  153. package/demos/pc/app/locales/custom-service.vue +3 -3
  154. package/demos/pc/app/modal/basic-usage.spec.ts +2 -1
  155. package/demos/pc/app/modal/message-close.spec.ts +2 -2
  156. package/demos/pc/app/modal/message-id.spec.ts +2 -2
  157. package/demos/pc/app/modal/modal-fn-slots.spec.ts +5 -7
  158. package/demos/pc/app/modal/modal-header.spec.ts +2 -1
  159. package/demos/pc/app/numeric/input-event-composition-api.vue +26 -0
  160. package/demos/pc/app/numeric/input-event.spec.ts +15 -0
  161. package/demos/pc/app/numeric/input-event.vue +34 -0
  162. package/demos/pc/app/numeric/webdoc/numeric.js +12 -0
  163. package/demos/pc/app/pager/align-composition-api.vue +10 -13
  164. package/demos/pc/app/pager/align.spec.ts +8 -3
  165. package/demos/pc/app/pager/align.vue +11 -5
  166. package/demos/pc/app/pager/page-size-composition-api.vue +2 -2
  167. package/demos/pc/app/pager/page-size.spec.ts +1 -1
  168. package/demos/pc/app/pager/page-size.vue +2 -2
  169. package/demos/pc/app/pager/pager-in-grid-composition-api.vue +0 -1
  170. package/demos/pc/app/pager/pager-in-grid.vue +0 -1
  171. package/demos/pc/app/pager/popper-append-to-body-composition-api.vue +1 -7
  172. package/demos/pc/app/pager/popper-append-to-body.vue +1 -7
  173. package/demos/pc/app/pager/popper-class-composition-api.vue +1 -7
  174. package/demos/pc/app/pager/popper-class.vue +1 -7
  175. package/demos/pc/app/popeditor/conditions.spec.ts +1 -1
  176. package/demos/pc/app/popeditor/suggest.spec.ts +1 -1
  177. package/demos/pc/app/qr-code/icon-composition-api.vue +17 -3
  178. package/demos/pc/app/qr-code/icon.spec.ts +19 -0
  179. package/demos/pc/app/qr-code/icon.vue +25 -4
  180. package/demos/pc/app/qr-code/style-composition-api.vue +2 -9
  181. package/demos/pc/app/qr-code/style.spec.ts +18 -1
  182. package/demos/pc/app/qr-code/style.vue +11 -8
  183. package/demos/pc/app/query-builder/webdoc/query-builder.js +5 -3
  184. package/demos/pc/app/search/events.spec.ts +1 -1
  185. package/demos/pc/app/search/events.vue +9 -0
  186. package/demos/pc/app/search/slot-prefix-suffix.spec.ts +1 -1
  187. package/demos/pc/app/search/webdoc/search.js +12 -4
  188. package/demos/pc/app/select/nest-grid-remote.spec.ts +3 -3
  189. package/demos/pc/app/select/nest-grid.spec.ts +1 -1
  190. package/demos/pc/app/select/nest-radio-grid-much-data.spec.ts +5 -7
  191. package/demos/pc/app/tabs/basic-usage.spec.ts +2 -2
  192. package/demos/pc/app/tabs/header-only.vue +56 -0
  193. package/demos/pc/app/tabs/size.spec.ts +2 -2
  194. package/demos/pc/app/tabs/webdoc/tabs.js +12 -0
  195. package/demos/pc/app/time-line/slot-default-composition-api.vue +81 -0
  196. package/demos/pc/app/time-line/slot-default.spec.ts +13 -0
  197. package/demos/pc/app/time-line/slot-default.vue +95 -0
  198. package/demos/pc/app/time-line/webdoc/time-line.js +12 -0
  199. package/demos/pc/menus.js +20 -10
  200. package/demos/pc/webdoc/changelog-en.md +224 -197
  201. package/demos/pc/webdoc/changelog.md +167 -387
  202. package/demos/pc/webdoc/faq.md +14 -0
  203. package/demos/saas/menus.js +2 -14
  204. package/env/.env +3 -0
  205. package/package.json +25 -24
  206. package/playground/App.vue +2 -2
  207. package/postcss.config.cjs +1 -0
  208. package/src/App.vue +26 -59
  209. package/src/components/anchor.vue +5 -1
  210. package/src/components/demo.vue +18 -7
  211. package/src/components/design-token.vue +90 -0
  212. package/src/components/float-settings.vue +4 -23
  213. package/src/components/mcp-docs.vue +4 -26
  214. package/src/components/version-tip.vue +1 -1
  215. package/src/composable/useTinyRemoter.ts +176 -0
  216. package/src/composable/utils.ts +2 -166
  217. package/src/const.ts +6 -1
  218. package/src/i18n/en.json +2 -0
  219. package/src/i18n/es.json +47 -0
  220. package/src/i18n/index.js +24 -5
  221. package/src/i18n/pt.json +47 -0
  222. package/src/i18n/zh.json +2 -0
  223. package/src/main.js +17 -13
  224. package/src/{menus.jsx → menus.js} +0 -1
  225. package/src/router.js +3 -18
  226. package/src/tools/appData.js +6 -16
  227. package/src/tools/storage.js +5 -3
  228. package/src/tools/useApiMode.js +11 -3
  229. package/src/tools/useBulletin.jsx +9 -8
  230. package/src/tools/useStyleSettings.js +8 -0
  231. package/src/tools/useTemplateMode.js +5 -1
  232. package/src/tools/utils.js +32 -1
  233. package/src/views/components-doc/cmp-config.js +13 -1
  234. package/src/views/components-doc/common.vue +42 -15
  235. package/src/views/layout/layout.vue +5 -8
  236. package/src/views/overview.vue +1 -1
  237. package/tsconfig.node.json +2 -4
  238. package/src/components/MessageCard.vue +0 -117
  239. package/src/components/tiny-robot-chat.vue +0 -128
  240. package/src/composable/DifyModelProvider.ts +0 -65
  241. package/src/composable/useTinyRobot.ts +0 -167
  242. package/src/tools/useAllTaskFinish.ts +0 -0
  243. package/src/views/comprehensive/Demo.vue +0 -212
  244. package/src/views/comprehensive/index.vue +0 -380
  245. package/src/views/comprehensive/products.json +0 -98
  246. package/src/views/comprehensive/types/index.ts +0 -37
  247. package/src/views/remoter/index.vue +0 -63
  248. package/src/views/remoter/sound.vue +0 -349
  249. /package/demos/pc/app/grid/expand/{expand-config.spec.js → expand-config.spec.ts} +0 -0
@@ -0,0 +1,119 @@
1
+ <template>
2
+ <div>
3
+ <tiny-grid
4
+ ref="grid"
5
+ :data="tableData"
6
+ seq-serial
7
+ :edit-config="{ trigger: 'click', mode: 'row', showStatus: true, blurOutside }"
8
+ >
9
+ <tiny-grid-column type="index" width="60"></tiny-grid-column>
10
+ <tiny-grid-column
11
+ field="name"
12
+ title="名称"
13
+ width="500"
14
+ :show-icon="false"
15
+ :editor="{ component: 'input', autoselect: true }"
16
+ ></tiny-grid-column>
17
+ <tiny-grid-column
18
+ field="area"
19
+ title="区域"
20
+ width="500"
21
+ :show-icon="false"
22
+ :editor="{ component: 'select', options }"
23
+ ></tiny-grid-column>
24
+ <tiny-grid-column
25
+ field="address"
26
+ title="地址"
27
+ width="500"
28
+ :show-icon="false"
29
+ :editor="{ component: 'input', autoselect: true }"
30
+ ></tiny-grid-column>
31
+ <tiny-grid-column
32
+ field="introduction"
33
+ title="公司简介"
34
+ width="500"
35
+ :show-icon="false"
36
+ :editor="{ component: 'input', autoselect: true }"
37
+ show-overflow="ellipsis"
38
+ ></tiny-grid-column>
39
+ </tiny-grid>
40
+ </div>
41
+ </template>
42
+
43
+ <script setup>
44
+ import { TinyGrid, TinyGridColumn } from '@opentiny/vue'
45
+ import { ref } from 'vue'
46
+
47
+ const options = ref([
48
+ { label: '华北区', value: '华北区' },
49
+ { label: '华东区', value: '华东区' },
50
+ { label: '华南区', value: '华南区' }
51
+ ])
52
+ const tableData = ref([
53
+ {
54
+ id: '1',
55
+ name: 'GFD 科技 YX 公司',
56
+ area: '华东区',
57
+ address: '福州',
58
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
59
+ },
60
+ {
61
+ id: '2',
62
+ name: 'WWWW 科技 YX 公司',
63
+ area: '华南区',
64
+ address: '深圳福田区',
65
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
66
+ },
67
+ {
68
+ id: '3',
69
+ name: 'RFV 有限责任公司',
70
+ area: '华南区',
71
+ address: '中山市',
72
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
73
+ }
74
+ ])
75
+
76
+ function blurOutside({ cell, event, $table }) {
77
+ const { getEventTargetNode, $el } = $table
78
+ const isClickRow = getEventTargetNode(event, $el, 'tiny-grid-body__row').flag
79
+ return isClickRow || isScrollBar(event, $el)
80
+ }
81
+ function isScrollBar(event, tableElm) {
82
+ const element = event.target
83
+
84
+ // 判断是否表格body
85
+ if (element !== tableElm.querySelector('.tiny-grid__body-wrapper')) {
86
+ return false
87
+ }
88
+
89
+ const rect = element.getBoundingClientRect()
90
+ const clickX = event.clientX
91
+ const clickY = event.clientY
92
+ // 检查垂直滚动条
93
+ if (element.scrollHeight > element.clientHeight) {
94
+ const scrollbarWidth = element.offsetWidth - element.clientWidth
95
+ if (clickX >= rect.right - scrollbarWidth && clickX <= rect.right) {
96
+ return true // 点击了垂直滚动条
97
+ }
98
+ }
99
+
100
+ // 检查水平滚动条
101
+ if (element.scrollWidth > element.clientWidth) {
102
+ const scrollbarHeight = element.offsetHeight - element.clientHeight
103
+ if (clickY >= rect.bottom - scrollbarHeight && clickY <= rect.bottom) {
104
+ return true // 点击了水平滚动条
105
+ }
106
+ }
107
+
108
+ return false
109
+ }
110
+ </script>
111
+
112
+ <style scoped>
113
+ .title {
114
+ font-size: 16px;
115
+ padding: 15px;
116
+ font-weight: bolder;
117
+ color: var(--tv-color-text, #191919);
118
+ }
119
+ </style>
@@ -0,0 +1,28 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ test('行编辑滚动不失焦', async ({ page }) => {
4
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
5
+
6
+ await page.goto('grid-edit#scrollbar-not-blur')
7
+ page.setViewportSize({
8
+ width: 1400,
9
+ height: 1200
10
+ })
11
+
12
+ const demo = page.locator('#scrollbar-not-blur')
13
+ // 单元格编辑
14
+ await demo.getByRole('cell', { name: 'GFD 科技 YX 公司' }).first().click()
15
+ await expect(demo.locator('.tiny-grid-default-input').first()).toBeVisible()
16
+
17
+ // 点击滚动条
18
+ const bodyWrapper = demo.locator('.tiny-grid__body-wrapper')
19
+ const { x, y, height } = await bodyWrapper.boundingBox()
20
+ await page.mouse.move(x + 10, y + height - 3)
21
+ await page.waitForTimeout(200)
22
+ await page.mouse.down()
23
+ await page.waitForTimeout(200)
24
+ await page.mouse.move(x + 200, y + height - 3)
25
+ await page.waitForTimeout(200)
26
+ await page.mouse.up()
27
+ await expect(demo.locator('.tiny-grid-default-input').first()).toBeVisible()
28
+ })
@@ -0,0 +1,129 @@
1
+ <template>
2
+ <div>
3
+ <tiny-grid
4
+ ref="grid"
5
+ :data="tableData"
6
+ seq-serial
7
+ :edit-config="{ trigger: 'click', mode: 'row', showStatus: true, blurOutside }"
8
+ >
9
+ <tiny-grid-column type="index" width="60"></tiny-grid-column>
10
+ <tiny-grid-column
11
+ field="name"
12
+ title="名称"
13
+ width="500"
14
+ :show-icon="false"
15
+ :editor="{ component: 'input', autoselect: true }"
16
+ ></tiny-grid-column>
17
+ <tiny-grid-column
18
+ field="area"
19
+ title="区域"
20
+ width="500"
21
+ :show-icon="false"
22
+ :editor="{ component: 'select', options }"
23
+ ></tiny-grid-column>
24
+ <tiny-grid-column
25
+ field="address"
26
+ title="地址"
27
+ width="500"
28
+ :show-icon="false"
29
+ :editor="{ component: 'input', autoselect: true }"
30
+ ></tiny-grid-column>
31
+ <tiny-grid-column
32
+ field="introduction"
33
+ title="公司简介"
34
+ width="500"
35
+ :show-icon="false"
36
+ :editor="{ component: 'input', autoselect: true }"
37
+ show-overflow="ellipsis"
38
+ ></tiny-grid-column>
39
+ </tiny-grid>
40
+ </div>
41
+ </template>
42
+
43
+ <script>
44
+ import { TinyGrid, TinyGridColumn } from '@opentiny/vue'
45
+
46
+ export default {
47
+ components: {
48
+ TinyGrid,
49
+ TinyGridColumn
50
+ },
51
+ data() {
52
+ return {
53
+ options: [
54
+ { label: '华北区', value: '华北区' },
55
+ { label: '华东区', value: '华东区' },
56
+ { label: '华南区', value: '华南区' }
57
+ ],
58
+ tableData: [
59
+ {
60
+ id: '1',
61
+ name: 'GFD 科技 YX 公司',
62
+ area: '华东区',
63
+ address: '福州',
64
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
65
+ },
66
+ {
67
+ id: '2',
68
+ name: 'WWWW 科技 YX 公司',
69
+ area: '华南区',
70
+ address: '深圳福田区',
71
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
72
+ },
73
+ {
74
+ id: '3',
75
+ name: 'RFV 有限责任公司',
76
+ area: '华南区',
77
+ address: '中山市',
78
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
79
+ }
80
+ ]
81
+ }
82
+ },
83
+ methods: {
84
+ blurOutside({ cell, event, $table }) {
85
+ const { getEventTargetNode, $el } = $table
86
+ const isClickRow = getEventTargetNode(event, $el, 'tiny-grid-body__row').flag
87
+ return isClickRow || this.isScrollBar(event, $el)
88
+ },
89
+ isScrollBar(event, tableElm) {
90
+ const element = event.target
91
+
92
+ // 判断是否表格body
93
+ if (element !== tableElm.querySelector('.tiny-grid__body-wrapper')) {
94
+ return false
95
+ }
96
+
97
+ const rect = element.getBoundingClientRect()
98
+ const clickX = event.clientX
99
+ const clickY = event.clientY
100
+ // 检查垂直滚动条
101
+ if (element.scrollHeight > element.clientHeight) {
102
+ const scrollbarWidth = element.offsetWidth - element.clientWidth
103
+ if (clickX >= rect.right - scrollbarWidth && clickX <= rect.right) {
104
+ return true // 点击了垂直滚动条
105
+ }
106
+ }
107
+
108
+ // 检查水平滚动条
109
+ if (element.scrollWidth > element.clientWidth) {
110
+ const scrollbarHeight = element.offsetHeight - element.clientHeight
111
+ if (clickY >= rect.bottom - scrollbarHeight && clickY <= rect.bottom) {
112
+ return true // 点击了水平滚动条
113
+ }
114
+ }
115
+
116
+ return false
117
+ }
118
+ }
119
+ }
120
+ </script>
121
+
122
+ <style scoped>
123
+ .title {
124
+ font-size: 16px;
125
+ padding: 15px;
126
+ font-weight: bolder;
127
+ color: var(--tv-color-text, #191919);
128
+ }
129
+ </style>
@@ -3,6 +3,11 @@ import { test, expect } from '@playwright/test'
3
3
  test('多行编辑', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('grid-editor#editor-custom-edit')
6
- await expect(page.getByRole('cell', { name: 'GFD 科技有限公司' }).getByRole('textbox')).toBeVisible()
7
- await expect(page.getByRole('cell', { name: 'WWWW 科技有限公司' }).getByRole('textbox')).toBeVisible()
6
+ const demo = page.locator('#editor-custom-edit')
7
+ await expect(
8
+ demo.locator('.tiny-grid-body__row').nth(0).locator('td').nth(1).locator('.tiny-input__inner')
9
+ ).toBeVisible()
10
+ await expect(
11
+ demo.locator('.tiny-grid-body__row').nth(1).locator('td').nth(1).locator('.tiny-input__inner')
12
+ ).toBeVisible()
8
13
  })
@@ -8,5 +8,5 @@ test('固定居中', async ({ page }) => {
8
8
  await expect(page.getByText('暂无数据').first()).toBeVisible()
9
9
 
10
10
  // 判断是否居中
11
- await expect(page.locator('.empty-center-block')).toHaveCSS('justify-content', 'center')
11
+ await expect(page.locator('.tiny-grid__empty-block')).toHaveCSS('justify-content', 'center')
12
12
  })
@@ -15,5 +15,5 @@ test('工具栏点击事件', async ({ page }) => {
15
15
 
16
16
  await page.getByRole('button', { name: '删除', exact: true }).click()
17
17
 
18
- await expect(page.locator('.tiny-grid-body__row')).toHaveCount(6)
18
+ await expect(page.locator('.tiny-grid-body__row:visible')).toHaveCount(6)
19
19
  })
@@ -0,0 +1,85 @@
1
+ <template>
2
+ <div>
3
+ <tiny-grid ref="expandGridRef" :data="tableData" @toggle-expand-change="handleExpand">
4
+ <tiny-grid-column type="index" width="60"></tiny-grid-column>
5
+ <tiny-grid-column type="expand" width="120">
6
+ <template #expand-trigger="{ row, $table }">
7
+ <tiny-button>{{ $table.hasRowExpand(row) ? '收起' : '展开' }}</tiny-button>
8
+ </template>
9
+ <template #default="data">
10
+ <ul>
11
+ <li>
12
+ <span>公司名称:</span>
13
+ <span>{{ data.row.name }}</span>
14
+ </li>
15
+ <li>
16
+ <span>区域:</span>
17
+ <span>{{ data.row.area }}</span>
18
+ </li>
19
+ <li>
20
+ <span>员工数:</span>
21
+ <span>{{ data.row.employees }}</span>
22
+ </li>
23
+ <li>
24
+ <span>公司简介:</span>
25
+ <span>{{ data.row.introduction }}</span>
26
+ </li>
27
+ </ul>
28
+ </template>
29
+ </tiny-grid-column>
30
+ <tiny-grid-column field="name" title="公司名称"></tiny-grid-column>
31
+ <tiny-grid-column field="area" title="区域"></tiny-grid-column>
32
+ <tiny-grid-column field="employees" title="员工数"></tiny-grid-column>
33
+ </tiny-grid>
34
+ </div>
35
+ </template>
36
+
37
+ <script setup lang="jsx">
38
+ import { ref } from 'vue'
39
+ import { TinyGrid, TinyGridColumn, TinyModal, TinyButton } from '@opentiny/vue'
40
+
41
+ const tableData = ref([
42
+ {
43
+ id: '1',
44
+ pid: '0',
45
+ name: 'GFD 科技 YX 公司',
46
+ area: '华东区',
47
+ employees: '800',
48
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
49
+ },
50
+ {
51
+ id: '2',
52
+ pid: '0',
53
+ name: 'WWWW 科技 YX 公司',
54
+ area: '华南区',
55
+ employees: '500',
56
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
57
+ },
58
+ {
59
+ id: '4',
60
+ pid: '0',
61
+ name: 'TGBYX 公司',
62
+ area: '华南区',
63
+ employees: '360',
64
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
65
+ },
66
+ {
67
+ id: '7',
68
+ pid: '0',
69
+ name: '康康物业 YX 公司',
70
+ area: '华南区',
71
+ employees: '400',
72
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
73
+ }
74
+ ])
75
+ const expandGridRef = ref()
76
+
77
+ function handleExpand({ row, rowIndex }) {
78
+ if (expandGridRef.value.hasRowExpand(row)) {
79
+ TinyModal.message({
80
+ message: `当前展开行:${JSON.stringify(rowIndex + 1)}`,
81
+ status: 'info'
82
+ })
83
+ }
84
+ }
85
+ </script>
@@ -0,0 +1,11 @@
1
+ import { test, expect } from '@playwright/test'
2
+
3
+ test('检查当前行是否展开', async ({ page }) => {
4
+ page.on('pageerror', (exception) => expect(exception).toBeNull())
5
+ await page.goto('grid-expand#expand-trigger-slot')
6
+ await page.locator('#expand-trigger-slot .tiny-grid-body__row').first().locator('.tiny-button').click()
7
+ await expect(page.locator('div').filter({ hasText: '当前展开行:1' }).nth(1)).toBeVisible()
8
+ await expect(page.locator('.tiny-grid-body__expanded-cell')).toHaveText(
9
+ '公司名称:GFD 科技 YX 公司区域:华东区员工数:800公司简介:公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
10
+ )
11
+ })
@@ -0,0 +1,95 @@
1
+ <template>
2
+ <div>
3
+ <tiny-grid ref="expandGrid" :data="tableData" @toggle-expand-change="handleExpand">
4
+ <tiny-grid-column type="index" width="60"></tiny-grid-column>
5
+ <tiny-grid-column type="expand" width="120">
6
+ <template #expand-trigger="{ row, $table }">
7
+ <tiny-button>{{ $table.hasRowExpand(row) ? '收起' : '展开' }}</tiny-button>
8
+ </template>
9
+ <template #default="data">
10
+ <ul>
11
+ <li>
12
+ <span>公司名称:</span>
13
+ <span>{{ data.row.name }}</span>
14
+ </li>
15
+ <li>
16
+ <span>区域:</span>
17
+ <span>{{ data.row.area }}</span>
18
+ </li>
19
+ <li>
20
+ <span>员工数:</span>
21
+ <span>{{ data.row.employees }}</span>
22
+ </li>
23
+ <li>
24
+ <span>公司简介:</span>
25
+ <span>{{ data.row.introduction }}</span>
26
+ </li>
27
+ </ul>
28
+ </template>
29
+ </tiny-grid-column>
30
+ <tiny-grid-column field="name" title="公司名称"></tiny-grid-column>
31
+ <tiny-grid-column field="area" title="区域"></tiny-grid-column>
32
+ <tiny-grid-column field="employees" title="员工数"></tiny-grid-column>
33
+ </tiny-grid>
34
+ </div>
35
+ </template>
36
+
37
+ <script lang="jsx">
38
+ import { TinyGrid, TinyGridColumn, TinyModal, TinyButton } from '@opentiny/vue'
39
+
40
+ export default {
41
+ components: {
42
+ TinyGrid,
43
+ TinyGridColumn,
44
+ TinyButton
45
+ },
46
+ data() {
47
+ return {
48
+ tableData: [
49
+ {
50
+ id: '1',
51
+ pid: '0',
52
+ name: 'GFD 科技 YX 公司',
53
+ area: '华东区',
54
+ employees: '800',
55
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
56
+ },
57
+ {
58
+ id: '2',
59
+ pid: '0',
60
+ name: 'WWWW 科技 YX 公司',
61
+ area: '华南区',
62
+ employees: '500',
63
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
64
+ },
65
+ {
66
+ id: '4',
67
+ pid: '0',
68
+ name: 'TGBYX 公司',
69
+ area: '华南区',
70
+ employees: '360',
71
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
72
+ },
73
+ {
74
+ id: '7',
75
+ pid: '0',
76
+ name: '康康物业 YX 公司',
77
+ area: '华南区',
78
+ employees: '400',
79
+ introduction: '公司技术和研发实力雄厚,是国家 863 项目的参与者,并被政府认定为“高新技术企业”。'
80
+ }
81
+ ]
82
+ }
83
+ },
84
+ methods: {
85
+ handleExpand({ row, rowIndex }) {
86
+ if (this.$refs.expandGrid.hasRowExpand(row)) {
87
+ TinyModal.message({
88
+ message: `当前展开行:${JSON.stringify(rowIndex + 1)}`,
89
+ status: 'info'
90
+ })
91
+ }
92
+ }
93
+ }
94
+ }
95
+ </script>
@@ -2,6 +2,10 @@ import { test, expect } from '@playwright/test'
2
2
 
3
3
  test('设置指定展开行', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
+ await page.setViewportSize({
6
+ width: 1400,
7
+ height: 2500
8
+ })
5
9
  await page.goto('grid-expand#expand-set-row-expansion')
6
10
  await page.getByRole('button', { name: '展开指定行' }).click()
7
11
  await expect(page.getByText('GFD 科技 YX 公司')).toHaveCount(2)
@@ -4,9 +4,9 @@ test('列筛选规则', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('grid-filter#filter-custom-filter')
6
6
  await page.getByRole('cell', { name: '名称' }).getByRole('img').click()
7
- await page.getByRole('textbox').nth(1).click()
8
- await page.getByRole('textbox').nth(1).press('CapsLock')
9
- await page.getByRole('textbox').nth(1).fill('WWW')
7
+ await page.locator('.tiny-grid__filter-wrapper.filter__active input').click()
8
+ await page.locator('.tiny-grid__filter-wrapper.filter__active input').press('CapsLock')
9
+ await page.locator('.tiny-grid__filter-wrapper.filter__active input').fill('WWW')
10
10
  await page.getByRole('button', { name: 'confirm' }).click()
11
11
  await expect(page.getByRole('cell', { name: 'WWW 科技 YX 公司' })).toBeVisible()
12
12
  })
@@ -103,6 +103,9 @@ const tableData = ref([
103
103
  }
104
104
  ])
105
105
  const cityFilter = ref({
106
+ attrs: {
107
+ id: 'city-filter'
108
+ },
106
109
  multi: true,
107
110
  enumable: true,
108
111
  defaultFilter: false,
@@ -110,6 +113,9 @@ const cityFilter = ref({
110
113
  values: filteData
111
114
  })
112
115
  const nameFilter = ref({
116
+ attrs: {
117
+ id: 'name-filter'
118
+ },
113
119
  multi: true,
114
120
  enumable: true,
115
121
  defaultFilter: false,
@@ -110,6 +110,9 @@ export default {
110
110
  }
111
111
  ],
112
112
  cityFilter: {
113
+ attrs: {
114
+ id: 'city-filter' // 给根节点设置id
115
+ },
113
116
  multi: true,
114
117
  enumable: true,
115
118
  defaultFilter: false,
@@ -117,6 +120,9 @@ export default {
117
120
  values: filteData
118
121
  },
119
122
  nameFilter: {
123
+ attrs: {
124
+ id: 'name-filter'
125
+ },
120
126
  multi: true,
121
127
  enumable: true,
122
128
  defaultFilter: false,
@@ -7,5 +7,5 @@ test('输入过滤的默认选项', async ({ page }) => {
7
7
  await page.getByRole('spinbutton').click()
8
8
  await page.getByRole('spinbutton').fill('800')
9
9
  await page.getByRole('button', { name: '确定' }).click()
10
- await expect(page.locator('.tiny-grid-body__row')).toHaveCount(2)
10
+ await expect(page.locator('.tiny-grid-body__row:visible')).toHaveCount(2)
11
11
  })
@@ -7,5 +7,5 @@ test('服务端过滤', async ({ page }) => {
7
7
  await page.getByRole('cell', { name: '城市' }).getByRole('img').first().click()
8
8
  await page.locator('li').filter({ hasText: '深圳' }).click()
9
9
  await page.getByRole('button', { name: '确定' }).click()
10
- await expect(page.locator('.tiny-grid-body__row')).toHaveCount(2)
10
+ await expect(page.locator('.tiny-grid-body__row:visible')).toHaveCount(2)
11
11
  })
@@ -6,11 +6,12 @@ test('简化版筛选面板 - 单选/多选菜单', async ({ page }) => {
6
6
  await page.getByRole('cell', { name: '公司名称' }).getByRole('img').click()
7
7
 
8
8
  // 筛选面板搜索功能
9
- await page.getByRole('textbox').nth(1).click()
10
- await page.getByRole('textbox').nth(1).fill('a')
9
+ const filterInput = page.locator('.tiny-grid__filter-wrapper.filter__active input')
10
+ await filterInput.click()
11
+ await filterInput.fill('a')
11
12
  await expect(page.getByRole('listitem').filter({ hasText: '暂无数据' })).toBeVisible()
12
- await page.getByRole('textbox').nth(1).click()
13
- await page.getByRole('textbox').nth(1).fill('')
13
+ await filterInput.click()
14
+ await filterInput.fill('')
14
15
  await page.getByTitle('GFD 科技 YX 公司').click()
15
16
  await page.getByTitle('WWW 科技 YX 公司').click()
16
17
 
@@ -2,10 +2,10 @@
2
2
  <tiny-grid height="300" :data="tableData" :show-overflow="true">
3
3
  <tiny-grid-column type="index" width="60"></tiny-grid-column>
4
4
  <tiny-grid-column type="selection" width="60"></tiny-grid-column>
5
- <tiny-grid-column field="name" title="公司名称" width="500"></tiny-grid-column>
6
- <tiny-grid-column field="employees" title="员工数" width="500"></tiny-grid-column>
7
- <tiny-grid-column field="createdDate" title="创建日期" width="500"></tiny-grid-column>
8
- <tiny-grid-column field="city" title="城市右冻结" width="200" fixed="right"></tiny-grid-column>
5
+ <tiny-grid-column field="name" title="公司名称" width="600"></tiny-grid-column>
6
+ <tiny-grid-column field="employees" title="员工数" width="600"></tiny-grid-column>
7
+ <tiny-grid-column field="createdDate" title="创建日期" width="600"></tiny-grid-column>
8
+ <tiny-grid-column field="city" title="城市右冻结" width="600" fixed="right"></tiny-grid-column>
9
9
  </tiny-grid>
10
10
  </template>
11
11
 
@@ -2,10 +2,10 @@
2
2
  <tiny-grid height="300" :data="tableData" :show-overflow="true">
3
3
  <tiny-grid-column type="index" width="60"></tiny-grid-column>
4
4
  <tiny-grid-column type="selection" width="60"></tiny-grid-column>
5
- <tiny-grid-column field="name" title="公司名称" width="500"></tiny-grid-column>
6
- <tiny-grid-column field="employees" title="员工数" width="500"></tiny-grid-column>
7
- <tiny-grid-column field="createdDate" title="创建日期" width="500"></tiny-grid-column>
8
- <tiny-grid-column field="city" title="城市右冻结" width="200" fixed="right"></tiny-grid-column>
5
+ <tiny-grid-column field="name" title="公司名称" width="600"></tiny-grid-column>
6
+ <tiny-grid-column field="employees" title="员工数" width="600"></tiny-grid-column>
7
+ <tiny-grid-column field="createdDate" title="创建日期" width="600"></tiny-grid-column>
8
+ <tiny-grid-column field="city" title="城市右冻结" width="600" fixed="right"></tiny-grid-column>
9
9
  </tiny-grid>
10
10
  </template>
11
11
 
@@ -3,7 +3,6 @@ import { test, expect } from '@playwright/test'
3
3
  test('表尾统计(空数据)', async ({ page }) => {
4
4
  page.on('pageerror', (exception) => expect(exception).toBeNull())
5
5
  await page.goto('grid-footer#footer-footer-summation-empty')
6
- await expect(page.getByRole('row', { name: '平均 0' }).getByRole('cell', { name: '0' })).toBeVisible()
7
6
  await page.getByRole('button', { name: '加载数据' }).click()
8
7
  await expect(page.getByRole('cell', { name: '663' })).toBeVisible()
9
8
  })