@opentiny/vue-docs 3.28.0 → 3.30.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.
- package/demos/apis/action-menu.js +22 -0
- package/demos/apis/alert.js +19 -22
- package/demos/apis/button-group.js +15 -0
- package/demos/apis/calendar-view.js +5 -5
- package/demos/apis/cascader-view.js +5 -5
- package/demos/apis/dialog-box.js +39 -38
- package/demos/apis/drawer.js +31 -0
- package/demos/apis/dropdown.js +39 -1
- package/demos/apis/filter-panel.js +21 -1
- package/demos/apis/fluent-editor.js +30 -0
- package/demos/apis/form.js +11 -0
- package/demos/apis/fullscreen.js +10 -11
- package/demos/apis/grid.js +131 -16
- package/demos/apis/guide.js +14 -0
- package/demos/apis/link.js +11 -0
- package/demos/apis/message.js +48 -22
- package/demos/apis/modal.js +34 -31
- package/demos/apis/notify.js +13 -13
- package/demos/apis/rate.js +15 -0
- package/demos/apis/search-box.js +343 -0
- package/demos/apis/select.js +14 -2
- package/demos/apis/tag-input.js +182 -0
- package/demos/apis/tree.js +23 -23
- package/demos/mobile-first/app/button-group/display-mode.vue +31 -0
- package/demos/mobile-first/app/button-group/webdoc/button-group.js +13 -0
- package/demos/mobile-first/app/calendar-view/webdoc/calendar-view.js +5 -4
- package/demos/mobile-first/app/modal/webdoc/modal.js +2 -1
- package/demos/pc/app/alert/center.spec.ts +8 -0
- package/demos/pc/app/alert/custom-close.spec.ts +39 -9
- package/demos/pc/app/alert/icon.spec.ts +18 -7
- package/demos/pc/app/alert/show-icon.spec.ts +1 -1
- package/demos/pc/app/anchor/webdoc/anchor.js +1 -0
- package/demos/pc/app/base-select/copy-multi.spec.ts +1 -1
- package/demos/pc/app/button-group/display-mode-composition-api.vue +23 -0
- package/demos/pc/app/button-group/display-mode.spec.ts +0 -0
- package/demos/pc/app/button-group/display-mode.vue +31 -0
- package/demos/pc/app/button-group/sup-composition-api.vue +1 -0
- package/demos/pc/app/button-group/sup.vue +1 -0
- package/demos/pc/app/button-group/webdoc/button-group.js +14 -0
- package/demos/pc/app/calendar-view/calendar-event.spec.ts +1 -1
- package/demos/pc/app/calendar-view/custom-day-bg-color.vue +10 -0
- package/demos/pc/app/calendar-view/webdoc/calendar-view.js +4 -4
- package/demos/pc/app/cascader/filter-mode-composition-api.vue +2 -2
- package/demos/pc/app/checkbox/checked-composition-api.vue +3 -3
- package/demos/pc/app/checkbox/checked.vue +3 -3
- package/demos/pc/app/date-picker/align.spec.ts +10 -13
- package/demos/pc/app/date-picker/clear.spec.ts +3 -3
- package/demos/pc/app/date-picker/default-value.spec.ts +4 -4
- package/demos/pc/app/date-picker/events.spec.ts +2 -2
- package/demos/pc/app/date-picker/format.spec.ts +3 -3
- package/demos/pc/app/date-picker/now.spec.ts +4 -4
- package/demos/pc/app/date-picker/shortcuts.spec.ts +1 -1
- package/demos/pc/app/date-picker/slot.spec.ts +5 -5
- package/demos/pc/app/dialog-box/basic-usage.spec.ts +5 -5
- package/demos/pc/app/dialog-box/form-in-dialog.spec.ts +1 -2
- package/demos/pc/app/drawer/basic-usage.spec.ts +4 -3
- package/demos/pc/app/drawer/close-on-press-escape.spec.ts +4 -2
- package/demos/pc/app/drawer/placement.spec.ts +4 -4
- package/demos/pc/app/drawer/show-header.spec.ts +3 -2
- package/demos/pc/app/drawer/webdoc/drawer.js +3 -2
- package/demos/pc/app/dropdown/show-icon-composition-api.vue +1 -1
- package/demos/pc/app/dropdown/show-icon.vue +1 -1
- package/demos/pc/app/dropdown/tip-composition-api.vue +5 -2
- package/demos/pc/app/dropdown/tip.vue +5 -2
- package/demos/pc/app/dropdown/webdoc/dropdown.js +2 -2
- package/demos/pc/app/filter-panel/size-composition-api.vue +58 -0
- package/demos/pc/app/filter-panel/size.spec.ts +23 -0
- package/demos/pc/app/filter-panel/size.vue +68 -0
- package/demos/pc/app/filter-panel/webdoc/filter-panel.js +13 -0
- package/demos/pc/app/flowchart/basic-usage-composition-api.vue +10 -260
- package/demos/pc/app/flowchart/basic-usage.spec.ts +2 -1
- package/demos/pc/app/flowchart/basic-usage.vue +4 -249
- package/demos/pc/app/flowchart/slots-composition-api.vue +182 -0
- package/demos/pc/app/flowchart/slots.spec.ts +24 -0
- package/demos/pc/app/flowchart/slots.vue +193 -0
- package/demos/pc/app/flowchart/webdoc/flowchart.js +14 -2
- package/demos/pc/app/form/basic-usage.spec.ts +6 -4
- package/demos/pc/app/form/custom-validation-string-length-composition-api.vue +38 -0
- package/demos/pc/app/form/custom-validation-string-length.spec.ts +18 -0
- package/demos/pc/app/form/custom-validation-string-length.vue +28 -13
- package/demos/pc/app/form/group-form-composition-api.vue +2 -2
- package/demos/pc/app/form/group-form.vue +2 -2
- package/demos/pc/app/grid/filter/advanced-filter-composition-api.vue +1 -1
- package/demos/pc/app/grid/filter/advanced-filter.spec.js +1 -0
- package/demos/pc/app/grid/filter/advanced-filter.vue +1 -1
- package/demos/pc/app/grid/filter/custom-filter-composition-api.vue +46 -23
- package/demos/pc/app/grid/filter/custom-filter.spec.js +1 -1
- package/demos/pc/app/grid/filter/custom-filter.vue +47 -24
- package/demos/pc/app/grid/filter/default-filter-composition-api.vue +5 -1
- package/demos/pc/app/grid/filter/default-filter.spec.ts +1 -0
- package/demos/pc/app/grid/filter/default-filter.vue +4 -1
- package/demos/pc/app/grid/filter/filter-label-value-composition-api.vue +71 -0
- package/demos/pc/app/grid/filter/filter-label-value.spec.ts +27 -0
- package/demos/pc/app/grid/filter/filter-label-value.vue +78 -0
- package/demos/pc/app/grid/filter/input-filter-custom-component-composition-api.vue +116 -0
- package/demos/pc/app/grid/filter/input-filter-custom-component.spec.ts +20 -0
- package/demos/pc/app/grid/filter/input-filter-custom-component.vue +126 -0
- package/demos/pc/app/grid/filter/layout-order-filter-composition-api.vue +114 -0
- package/demos/pc/app/grid/filter/layout-order-filter.spec.ts +31 -0
- package/demos/pc/app/grid/filter/layout-order-filter.vue +123 -0
- package/demos/pc/app/grid/toolbar/custom-toolbar.spec.js +1 -1
- package/demos/pc/app/grid/webdoc/grid-filter.js +89 -40
- package/demos/pc/app/guide/show-close-composition-api.vue +77 -0
- package/demos/pc/app/guide/show-close.spec.ts +37 -0
- package/demos/pc/app/guide/show-close.vue +84 -0
- package/demos/pc/app/guide/webdoc/guide.js +12 -0
- package/demos/pc/app/icon/advance-icons.js +108 -2
- package/demos/pc/app/icon/advance-usage-composition-api.vue +26 -1
- package/demos/pc/app/icon/advance-usage.vue +27 -1
- package/demos/pc/app/icon/webdoc/icon.js +5 -3
- package/demos/pc/app/input/resize.spec.ts +2 -2
- package/demos/pc/app/link/custom-icon-composition-api.vue +1 -1
- package/demos/pc/app/link/custom-icon.vue +1 -1
- package/demos/pc/app/link/target-composition-api.vue +24 -0
- package/demos/pc/app/link/target.spec.ts +41 -0
- package/demos/pc/app/link/target.vue +30 -0
- package/demos/pc/app/link/webdoc/link.js +14 -0
- package/demos/pc/app/message/basic-usage-composition-api.vue +48 -0
- package/demos/pc/app/message/basic-usage.spec.ts +27 -0
- package/demos/pc/app/message/basic-usage.vue +50 -0
- package/demos/pc/app/message/message-close-composition-api.vue +25 -0
- package/demos/pc/app/message/message-close.spec.ts +9 -0
- package/demos/pc/app/message/message-close.vue +32 -0
- package/demos/pc/app/message/message-duration-composition-api.vue +25 -0
- package/demos/pc/app/message/message-duration.spec.ts +9 -0
- package/demos/pc/app/message/message-duration.vue +32 -0
- package/demos/pc/app/message/prevent-duplicate-composition-api.vue +25 -0
- package/demos/pc/app/message/prevent-duplicate.spec.ts +9 -0
- package/demos/pc/app/message/prevent-duplicate.vue +32 -0
- package/demos/pc/app/message/webdoc/message.cn.md +7 -0
- package/demos/pc/app/message/webdoc/message.en.md +7 -0
- package/demos/pc/app/message/webdoc/message.js +56 -0
- package/demos/pc/app/modal/basic-usage.spec.ts +3 -3
- package/demos/pc/app/modal/modal-footer-composition-api.vue +3 -3
- package/demos/pc/app/modal/modal-footer.spec.ts +9 -4
- package/demos/pc/app/modal/modal-footer.vue +3 -3
- package/demos/pc/app/modal/modal-header.spec.ts +2 -2
- package/demos/pc/app/modal/modal-size.spec.ts +2 -2
- package/demos/pc/app/modal/status.spec.ts +22 -15
- package/demos/pc/app/nav-menu/overflow.spec.ts +1 -1
- package/demos/pc/app/popconfirm/custom-class.spec.ts +0 -1
- package/demos/pc/app/popconfirm/slot-message.spec.ts +10 -2
- package/demos/pc/app/popconfirm/trigger.spec.ts +16 -12
- package/demos/pc/app/popover/basic-usage.spec.js +3 -8
- package/demos/pc/app/popover/custom-popper.spec.js +2 -2
- package/demos/pc/app/popover/delay.spec.js +2 -2
- package/demos/pc/app/popover/disabled.spec.js +2 -2
- package/demos/pc/app/popover/events.spec.js +1 -1
- package/demos/pc/app/popover/ignore-boundaries.spec.js +2 -3
- package/demos/pc/app/popover/offset.spec.js +17 -31
- package/demos/pc/app/radio/dynamic-disable-composition-api.vue +3 -3
- package/demos/pc/app/radio/dynamic-disable.vue +2 -2
- package/demos/pc/app/rate/clearable-composition-api.vue +20 -0
- package/demos/pc/app/rate/clearable.spec.js +74 -0
- package/demos/pc/app/rate/clearable.vue +28 -0
- package/demos/pc/app/rate/webdoc/rate.js +12 -0
- package/demos/pc/app/search/events.spec.ts +1 -1
- package/demos/pc/app/search-box/append-to-body-composition-api.vue +300 -0
- package/demos/pc/app/search-box/append-to-body.vue +308 -0
- package/demos/pc/app/search-box/auto-match-composition-api.vue +162 -0
- package/demos/pc/app/search-box/auto-match.vue +170 -0
- package/demos/pc/app/search-box/basic-usage-composition-api.vue +269 -0
- package/demos/pc/app/search-box/basic-usage.vue +277 -0
- package/demos/pc/app/search-box/custom-panel-composition-api.vue +63 -0
- package/demos/pc/app/search-box/custom-panel.vue +72 -0
- package/demos/pc/app/search-box/default-field-composition-api.vue +163 -0
- package/demos/pc/app/search-box/default-field.vue +171 -0
- package/demos/pc/app/search-box/editable-composition-api.vue +311 -0
- package/demos/pc/app/search-box/editable.vue +320 -0
- package/demos/pc/app/search-box/empty-placeholder-composition-api.vue +162 -0
- package/demos/pc/app/search-box/empty-placeholder.vue +170 -0
- package/demos/pc/app/search-box/events-composition-api.vue +169 -0
- package/demos/pc/app/search-box/events.vue +173 -0
- package/demos/pc/app/search-box/group-key-composition-api.vue +257 -0
- package/demos/pc/app/search-box/group-key.vue +266 -0
- package/demos/pc/app/search-box/help-composition-api.vue +166 -0
- package/demos/pc/app/search-box/help.vue +175 -0
- package/demos/pc/app/search-box/id-map-key-composition-api.vue +131 -0
- package/demos/pc/app/search-box/id-map-key.vue +140 -0
- package/demos/pc/app/search-box/item-placeholder-composition-api.vue +119 -0
- package/demos/pc/app/search-box/item-placeholder.vue +127 -0
- package/demos/pc/app/search-box/max-length-composition-api.vue +29 -0
- package/demos/pc/app/search-box/max-length.vue +38 -0
- package/demos/pc/app/search-box/max-time-length-composition-api.vue +53 -0
- package/demos/pc/app/search-box/max-time-length.vue +62 -0
- package/demos/pc/app/search-box/merge-tag-composition-api.vue +59 -0
- package/demos/pc/app/search-box/merge-tag.vue +68 -0
- package/demos/pc/app/search-box/panel-max-height-composition-api.vue +162 -0
- package/demos/pc/app/search-box/panel-max-height.vue +170 -0
- package/demos/pc/app/search-box/potential-match-composition-api.vue +193 -0
- package/demos/pc/app/search-box/potential-match.vue +201 -0
- package/demos/pc/app/search-box/settings-composition-api.vue +163 -0
- package/demos/pc/app/search-box/settings.vue +171 -0
- package/demos/pc/app/search-box/size-composition-api.vue +162 -0
- package/demos/pc/app/search-box/size.vue +170 -0
- package/demos/pc/app/search-box/split-input-value-composition-api.vue +162 -0
- package/demos/pc/app/search-box/split-input-value.vue +170 -0
- package/demos/pc/app/search-box/suffix-icon-composition-api.vue +209 -0
- package/demos/pc/app/search-box/suffix-icon.vue +219 -0
- package/demos/pc/app/search-box/v-model-composition-api.vue +174 -0
- package/demos/pc/app/search-box/v-model.vue +182 -0
- package/demos/pc/app/search-box/webdoc/search-box.cn.md +7 -0
- package/demos/pc/app/search-box/webdoc/search-box.en.md +7 -0
- package/demos/pc/app/search-box/webdoc/search-box.js +257 -0
- package/demos/pc/app/select/copy-multi.spec.ts +1 -1
- package/demos/pc/app/select-wrapper/copy-multi.spec.ts +2 -1
- package/demos/pc/app/tabs/basic-usage.spec.ts +2 -2
- package/demos/pc/app/tabs/more-show-all.spec.ts +2 -1
- package/demos/pc/app/tabs/tabs-events-close-composition-api.vue +8 -2
- package/demos/pc/app/tabs/tabs-events-close.vue +8 -2
- package/demos/pc/app/tabs/tooltip-composition-api.vue +1 -1
- package/demos/pc/app/tag/basic-usage.spec.ts +1 -1
- package/demos/pc/app/tag/color-border.spec.ts +2 -2
- package/demos/pc/app/tag/max-width.spec.ts +1 -1
- package/demos/pc/app/tag/size.spec.ts +3 -3
- package/demos/pc/app/tag/slot-default.spec.ts +3 -3
- package/demos/pc/app/tag-group/basic-usage.spec.js +5 -5
- package/demos/pc/app/tag-group/tag-group-effect.spec.js +10 -10
- package/demos/pc/app/tag-group/tag-group-event.spec.js +1 -1
- package/demos/pc/app/tag-input/basic-usage-composition-api.vue +29 -0
- package/demos/pc/app/tag-input/basic-usage.spec.ts +0 -0
- package/demos/pc/app/tag-input/basic-usage.vue +38 -0
- package/demos/pc/app/tag-input/clearable-tag-composition-api.vue +20 -0
- package/demos/pc/app/tag-input/clearable-tag.vue +27 -0
- package/demos/pc/app/tag-input/collapsed-tag-composition-api.vue +20 -0
- package/demos/pc/app/tag-input/collapsed-tag.vue +28 -0
- package/demos/pc/app/tag-input/disabled-readonly-composition-api.vue +20 -0
- package/demos/pc/app/tag-input/disabled-readonly.vue +29 -0
- package/demos/pc/app/tag-input/draggable-tag-composition-api.vue +12 -0
- package/demos/pc/app/tag-input/draggable-tag.spec.ts +0 -0
- package/demos/pc/app/tag-input/draggable-tag.vue +20 -0
- package/demos/pc/app/tag-input/max-composition-api.vue +20 -0
- package/demos/pc/app/tag-input/max.vue +28 -0
- package/demos/pc/app/tag-input/prefix-suffix-composition-api.vue +26 -0
- package/demos/pc/app/tag-input/prefix-suffix.vue +34 -0
- package/demos/pc/app/tag-input/separator-tag-composition-api.vue +20 -0
- package/demos/pc/app/tag-input/separator-tag.vue +28 -0
- package/demos/pc/app/tag-input/webdoc/tag-input.cn.md +7 -0
- package/demos/pc/app/tag-input/webdoc/tag-input.en.md +7 -0
- package/demos/pc/app/tag-input/webdoc/tag-input.js +107 -0
- package/demos/pc/app/time-picker/basic-usage.spec.ts +5 -4
- package/demos/pc/app/time-picker/clearable.spec.ts +5 -4
- package/demos/pc/app/time-picker/default-value.spec.ts +2 -2
- package/demos/pc/app/time-picker/disabled.spec.ts +4 -3
- package/demos/pc/app/time-picker/format.spec.ts +8 -11
- package/demos/pc/app/time-picker/is-range.spec.ts +4 -3
- package/demos/pc/app/time-picker/name.spec.ts +1 -1
- package/demos/pc/app/time-picker/placeholder.spec.ts +3 -3
- package/demos/pc/app/time-picker/popper-class.spec.ts +1 -1
- package/demos/pc/app/time-picker/size.spec.ts +2 -1
- package/demos/pc/app/time-select/basic-usage.spec.ts +1 -1
- package/demos/pc/app/time-select/clear-icon.spec.ts +1 -2
- package/demos/pc/app/time-select/focus.spec.ts +1 -1
- package/demos/pc/app/time-select/picker-options.spec.ts +2 -1
- package/demos/pc/app/time-select/range-placeholder.spec.ts +2 -2
- package/demos/pc/app/time-select/size-medium.spec.ts +3 -3
- package/demos/pc/app/tooltip/delay.spec.js +7 -9
- package/demos/pc/app/tooltip/offset.spec.js +0 -2
- package/demos/pc/app/tooltip/popper-options.spec.js +2 -1
- package/demos/pc/app/user-head/color-composition-api.vue +2 -1
- package/demos/pc/menus.js +6 -4
- package/demos/pc/webdoc/changelog-en.md +370 -176
- package/demos/pc/webdoc/changelog.md +177 -219
- package/demos/pc/webdoc/develop-demo-en.md +13 -13
- package/demos/pc/webdoc/import-components.md +1 -1
- package/demos/pc/webdoc/introduce.md +2 -0
- package/demos/pc/webdoc/skills-en.md +107 -0
- package/demos/pc/webdoc/skills.md +107 -0
- package/demos/pc/webdoc/theme-en.md +82 -79
- package/demos/pc/webdoc/v3.28.0-release-article.md +943 -0
- package/demos/saas/menus.js +1 -0
- package/package.json +21 -20
- package/playground/App.vue +12 -6
- package/playground/shims/vue-search-box.mjs +154 -0
- package/public/static/css/mobile-dark-theme.css +1 -0
- package/src/i18n/index.js +1 -2
- package/src/main.js +8 -5
- package/src/style.css +5 -0
- package/src/views/components-doc/common.vue +0 -25
- package/src/views/components-doc/mobile.vue +49 -2
- package/vite.config.ts +3 -2
- package/vite.extend.ts +65 -0
- package/demos/pc/app/grid/webdoc/grid-ai-agent.js +0 -23
- package/demos/pc/webdoc/mcp-en.md +0 -101
- package/demos/pc/webdoc/mcp.md +0 -101
- package/src/components/mcp-docs.vue +0 -33
- package/src/composable/useTinyRemoter.ts +0 -176
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<tiny-grid :data="tableData" @filter-change="filterChangeEvent">
|
|
3
|
+
<tiny-grid-column type="index" width="60"></tiny-grid-column>
|
|
4
|
+
<tiny-grid-column field="name" title="公司名称" :filter="nameFilter"></tiny-grid-column>
|
|
5
|
+
<tiny-grid-column field="city" title="城市" :filter="cityFilter"></tiny-grid-column>
|
|
6
|
+
<tiny-grid-column field="employees" title="员工数" :filter="employeesFilter"></tiny-grid-column>
|
|
7
|
+
</tiny-grid>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script setup>
|
|
11
|
+
import { ref } from 'vue'
|
|
12
|
+
import { TinyGrid, TinyGridColumn, TinyModal, TinyNumeric } from '@opentiny/vue'
|
|
13
|
+
|
|
14
|
+
const cityData = [
|
|
15
|
+
{ label: '福州', value: '福州' },
|
|
16
|
+
{ label: '深圳', value: '深圳' },
|
|
17
|
+
{ label: '中山', value: '中山' }
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
const tableData = ref([
|
|
21
|
+
{
|
|
22
|
+
id: '1',
|
|
23
|
+
name: 'GFD 科技 YX 公司',
|
|
24
|
+
city: '福州',
|
|
25
|
+
employees: 800,
|
|
26
|
+
createdDate: '2014-04-30 00:56:00'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: '2',
|
|
30
|
+
name: 'WWW 科技 YX 公司',
|
|
31
|
+
city: '深圳',
|
|
32
|
+
employees: 300,
|
|
33
|
+
createdDate: '2016-07-08 12:36:22'
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: '3',
|
|
37
|
+
name: 'RFV 有限责任公司',
|
|
38
|
+
city: '中山',
|
|
39
|
+
employees: 1300,
|
|
40
|
+
createdDate: '2014-02-14 14:14:14'
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: '4',
|
|
44
|
+
name: 'TGB 科技 YX 公司',
|
|
45
|
+
city: '龙岩',
|
|
46
|
+
employees: 360,
|
|
47
|
+
createdDate: '2013-01-13 13:13:13'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: '5',
|
|
51
|
+
name: 'YHN 科技 YX 公司',
|
|
52
|
+
city: '韶关',
|
|
53
|
+
employees: 810,
|
|
54
|
+
createdDate: '2012-12-12 12:12:12'
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: '6',
|
|
58
|
+
name: 'WSX 科技 YX 公司',
|
|
59
|
+
city: '黄冈',
|
|
60
|
+
employees: 800,
|
|
61
|
+
createdDate: '2011-11-11 11:11:11'
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: '7',
|
|
65
|
+
name: 'KBG 物业 YX 公司',
|
|
66
|
+
city: '赤壁',
|
|
67
|
+
employees: 400,
|
|
68
|
+
createdDate: '2016-04-30 23:56:00'
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: '8',
|
|
72
|
+
name: '深圳市福德宝网络技术 YX 公司',
|
|
73
|
+
city: '厦门',
|
|
74
|
+
employees: 540,
|
|
75
|
+
createdDate: '2016-06-03 13:53:25'
|
|
76
|
+
}
|
|
77
|
+
])
|
|
78
|
+
|
|
79
|
+
const cityFilter = ref({
|
|
80
|
+
multi: true,
|
|
81
|
+
enumable: true,
|
|
82
|
+
inputFilter: false,
|
|
83
|
+
defaultFilter: false,
|
|
84
|
+
values: cityData,
|
|
85
|
+
layout: 'enum,base'
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
const nameFilter = ref({
|
|
89
|
+
enumable: false,
|
|
90
|
+
inputFilter: true,
|
|
91
|
+
defaultFilter: false,
|
|
92
|
+
layout: 'input,base'
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
const employeesFilter = ref({
|
|
96
|
+
layout: 'extends,input,base',
|
|
97
|
+
inputFilter: {
|
|
98
|
+
component: TinyNumeric,
|
|
99
|
+
attrs: {},
|
|
100
|
+
relations: [
|
|
101
|
+
{ label: '小于', value: 'lessThan' },
|
|
102
|
+
{ label: '大于', value: 'greaterThan' }
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
extends: [
|
|
106
|
+
{ label: '大型企业(>500)', method: ({ value }) => value > 500 },
|
|
107
|
+
{ label: '小型企业(<500)', method: ({ value }) => value < 500 }
|
|
108
|
+
]
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
function filterChangeEvent({ filters }) {
|
|
112
|
+
TinyModal.message({ message: `筛选条件:${JSON.stringify(filters)}`, status: 'info' })
|
|
113
|
+
}
|
|
114
|
+
</script>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
test('自定义筛选项顺序 - 城市列 layout enum,base', async ({ page }) => {
|
|
4
|
+
page.on('pageerror', (exception) => expect(exception).toBeNull())
|
|
5
|
+
await page.goto('grid-filter#filter-layout-order-filter')
|
|
6
|
+
|
|
7
|
+
// 城市列:layout enum,base 仅显示枚举和清除
|
|
8
|
+
await page.getByRole('cell', { name: '城市' }).getByRole('img').first().click()
|
|
9
|
+
const filterPanel = page.locator('.tiny-grid__filter-wrapper.filter__active')
|
|
10
|
+
await filterPanel.waitFor({ state: 'visible' })
|
|
11
|
+
await filterPanel.getByTitle('福州').click()
|
|
12
|
+
await filterPanel.getByRole('button', { name: '确定' }).click()
|
|
13
|
+
|
|
14
|
+
// 筛选后应只显示福州的 1 条数据
|
|
15
|
+
await expect(page.getByRole('cell', { name: '福州' })).toHaveCount(1)
|
|
16
|
+
await expect(page.locator('.tiny-grid-body__row')).toHaveCount(1)
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
test('自定义筛选项顺序 - 员工数列 extends 快捷筛选', async ({ page }) => {
|
|
20
|
+
page.on('pageerror', (exception) => expect(exception).toBeNull())
|
|
21
|
+
await page.goto('grid-filter#filter-layout-order-filter')
|
|
22
|
+
|
|
23
|
+
// 员工数列:layout extends,input,base 点击扩展项 大型企业(>500)
|
|
24
|
+
await page.getByRole('cell', { name: '员工数' }).getByRole('img').first().click()
|
|
25
|
+
const filterPanel = page.locator('.tiny-grid__filter-wrapper.filter__active')
|
|
26
|
+
await filterPanel.waitFor({ state: 'visible' })
|
|
27
|
+
await filterPanel.getByText('大型企业(>500)').click()
|
|
28
|
+
|
|
29
|
+
// 筛选后应只显示员工数>500的行:800,1300,810,800,540 共 5 条
|
|
30
|
+
await expect(page.locator('.tiny-grid-body__row')).toHaveCount(5)
|
|
31
|
+
})
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<tiny-grid :data="tableData" @filter-change="filterChangeEvent">
|
|
3
|
+
<tiny-grid-column type="index" width="60"></tiny-grid-column>
|
|
4
|
+
<tiny-grid-column field="name" title="公司名称" :filter="nameFilter"></tiny-grid-column>
|
|
5
|
+
<tiny-grid-column field="city" title="城市" :filter="cityFilter"></tiny-grid-column>
|
|
6
|
+
<tiny-grid-column field="employees" title="员工数" :filter="employeesFilter"></tiny-grid-column>
|
|
7
|
+
</tiny-grid>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script>
|
|
11
|
+
import { TinyGrid, TinyGridColumn, TinyModal, TinyNumeric } from '@opentiny/vue'
|
|
12
|
+
|
|
13
|
+
const cityData = [
|
|
14
|
+
{ label: '福州', value: '福州' },
|
|
15
|
+
{ label: '深圳', value: '深圳' },
|
|
16
|
+
{ label: '中山', value: '中山' }
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
export default {
|
|
20
|
+
components: {
|
|
21
|
+
TinyGrid,
|
|
22
|
+
TinyGridColumn
|
|
23
|
+
},
|
|
24
|
+
data() {
|
|
25
|
+
return {
|
|
26
|
+
tableData: [
|
|
27
|
+
{
|
|
28
|
+
id: '1',
|
|
29
|
+
name: 'GFD 科技 YX 公司',
|
|
30
|
+
city: '福州',
|
|
31
|
+
employees: 800,
|
|
32
|
+
createdDate: '2014-04-30 00:56:00'
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: '2',
|
|
36
|
+
name: 'WWW 科技 YX 公司',
|
|
37
|
+
city: '深圳',
|
|
38
|
+
employees: 300,
|
|
39
|
+
createdDate: '2016-07-08 12:36:22'
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: '3',
|
|
43
|
+
name: 'RFV 有限责任公司',
|
|
44
|
+
city: '中山',
|
|
45
|
+
employees: 1300,
|
|
46
|
+
createdDate: '2014-02-14 14:14:14'
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
id: '4',
|
|
50
|
+
name: 'TGB 科技 YX 公司',
|
|
51
|
+
city: '龙岩',
|
|
52
|
+
employees: 360,
|
|
53
|
+
createdDate: '2013-01-13 13:13:13'
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: '5',
|
|
57
|
+
name: 'YHN 科技 YX 公司',
|
|
58
|
+
city: '韶关',
|
|
59
|
+
employees: 810,
|
|
60
|
+
createdDate: '2012-12-12 12:12:12'
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: '6',
|
|
64
|
+
name: 'WSX 科技 YX 公司',
|
|
65
|
+
city: '黄冈',
|
|
66
|
+
employees: 800,
|
|
67
|
+
createdDate: '2011-11-11 11:11:11'
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: '7',
|
|
71
|
+
name: 'KBG 物业 YX 公司',
|
|
72
|
+
city: '赤壁',
|
|
73
|
+
employees: 400,
|
|
74
|
+
createdDate: '2016-04-30 23:56:00'
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: '8',
|
|
78
|
+
name: '深圳市福德宝网络技术 YX 公司',
|
|
79
|
+
city: '厦门',
|
|
80
|
+
employees: 540,
|
|
81
|
+
createdDate: '2016-06-03 13:53:25'
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
// layout 自定义顺序:枚举优先,其次输入,最后清除
|
|
85
|
+
cityFilter: {
|
|
86
|
+
multi: true,
|
|
87
|
+
enumable: true,
|
|
88
|
+
inputFilter: false,
|
|
89
|
+
defaultFilter: false,
|
|
90
|
+
values: cityData,
|
|
91
|
+
layout: 'enum,base'
|
|
92
|
+
},
|
|
93
|
+
nameFilter: {
|
|
94
|
+
enumable: false,
|
|
95
|
+
inputFilter: true,
|
|
96
|
+
defaultFilter: false,
|
|
97
|
+
layout: 'input,base'
|
|
98
|
+
},
|
|
99
|
+
// layout 自定义顺序:扩展项 + 输入 + 清除
|
|
100
|
+
employeesFilter: {
|
|
101
|
+
layout: 'extends,input,base',
|
|
102
|
+
inputFilter: {
|
|
103
|
+
component: TinyNumeric,
|
|
104
|
+
attrs: {},
|
|
105
|
+
relations: [
|
|
106
|
+
{ label: '小于', value: 'lessThan' },
|
|
107
|
+
{ label: '大于', value: 'greaterThan' }
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
extends: [
|
|
111
|
+
{ label: '大型企业(>500)', method: ({ value }) => value > 500 },
|
|
112
|
+
{ label: '小型企业(<500)', method: ({ value }) => value < 500 }
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
methods: {
|
|
118
|
+
filterChangeEvent({ filters }) {
|
|
119
|
+
TinyModal.message({ message: `筛选条件:${JSON.stringify(filters)}`, status: 'info' })
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
</script>
|
|
@@ -3,6 +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-toolbar#toolbar-custom-toolbar')
|
|
6
|
-
await expect(page.getByRole('
|
|
6
|
+
await expect(page.getByRole('searchbox', { name: '请输入公司名称' })).toBeVisible()
|
|
7
7
|
await expect(page.getByRole('button', { name: '取消全选' })).toBeVisible()
|
|
8
8
|
})
|
|
@@ -4,126 +4,175 @@ export default {
|
|
|
4
4
|
demos: [
|
|
5
5
|
{
|
|
6
6
|
demoId: 'filter-default-filter',
|
|
7
|
-
name: { 'zh-CN': '
|
|
7
|
+
name: { 'zh-CN': '基础筛选', 'en-US': 'Basic Filter' },
|
|
8
8
|
desc: {
|
|
9
9
|
'zh-CN': `
|
|
10
10
|
<div class="tip custom-block">
|
|
11
11
|
<p class="custom-block-title">filter 配置</p>
|
|
12
|
-
<p
|
|
12
|
+
<p>通过 <code>filter</code> 属性配置列筛选。配置项及对应关系:
|
|
13
13
|
<ul>
|
|
14
|
-
<li>
|
|
15
|
-
<li>
|
|
16
|
-
<li>
|
|
17
|
-
<li>
|
|
18
|
-
<li>values
|
|
19
|
-
<li>label
|
|
20
|
-
<li>
|
|
14
|
+
<li><strong>layout</strong> 筛选项显示顺序,默认 <code>input,enum,default,extends,base</code>。各取值与下方配置一一对应:<code>input</code>→inputFilter,<code>enum</code>→enumable,<code>default</code>→defaultFilter,<code>extends</code>→extends,<code>base</code>→清除选项,<code>simple</code>→simpleFilter(与其它 layout 项互斥)。</li>
|
|
15
|
+
<li><strong>inputFilter</strong> 输入筛选。true 使用默认 input;传入对象可配置 <code>component</code>、<code>relations</code>、<code>relation</code>、<code>attrs</code>。</li>
|
|
16
|
+
<li><strong>enumable</strong> 是否显示枚举选项。需 layout 包含 enum 或 simple 时生效。</li>
|
|
17
|
+
<li><strong>multi</strong> 枚举是否为多选,仅在 enumable 为 true 时有效,默认 true。</li>
|
|
18
|
+
<li><strong>values</strong> 枚举数据源。数组或 <code>(params)=>Promise</code>;不传则从表格数据自动提取。</li>
|
|
19
|
+
<li><strong>label</strong> / <strong>value</strong> 枚举项显示值和实际值的字段名,默认 label、value。用于 values 数据结构的字段映射。</li>
|
|
20
|
+
<li><strong>defaultFilter</strong> 是否显示空/非空筛选。需 layout 包含 default。</li>
|
|
21
|
+
<li><strong>extends</strong> 扩展快捷筛选项数组,每项含 <code>label</code>、<code>value?</code>、<code>method</code>。需 layout 包含 extends。</li>
|
|
22
|
+
<li><strong>condition</strong> 初始筛选条件,如 <code>condition.value</code> 设置默认选中、<code>condition.relation</code> 设置默认关系。</li>
|
|
23
|
+
<li><strong>simpleFilter</strong> 简化版配置,需 <code>layout:'simple'</code>。含 <code>isDatetime</code>(日期范围)、<code>selectAll</code>(全选)、<code>datetimeConfig</code>(isDatetime 时必填)、<code>searchConfig</code>(非日期时可选,为枚举列表加搜索框)。</li>
|
|
24
|
+
<li><strong>method</strong> 自定义筛选方法,用于 <code>#filter</code> 插槽完全自定义时实现筛选逻辑。</li>
|
|
25
|
+
<li><strong>attrs</strong> 过滤面板根节点属性,如 id、class 等。</li>
|
|
26
|
+
<li><strong>dataset</strong> 数据源配置,用于异步获取枚举选项。</li>
|
|
27
|
+
<li><strong>filter-popper-options</strong> 设置过滤面板弹出层配置项。</li>
|
|
21
28
|
</ul>
|
|
22
29
|
</p>
|
|
23
30
|
</div>
|
|
24
31
|
`,
|
|
25
32
|
'en-US':
|
|
26
|
-
'<div class="tip custom-block"><p class="custom-block-title">filter Configuration</p
|
|
33
|
+
'<div class="tip custom-block"><p class="custom-block-title">filter Configuration</p><p>Configure column filtering via <code>filter</code> prop. Options and constraints: <code>layout</code> - filter order (default: input,enum,default,extends,base). Each value maps to: input→inputFilter, enum→enumable, default→defaultFilter, extends→extends, base→clear, simple→simpleFilter (exclusive). <code>inputFilter</code> - true or {component, relations, relation, attrs}. <code>enumable</code> - show enum options (requires enum or simple in layout). <code>multi</code> - enum multi-select when enumable. <code>values</code> - array or (params)=>Promise; auto-extract from table if omitted. <code>label</code>/<code>value</code> - field mapping for values. <code>defaultFilter</code> - empty/non-empty (requires default in layout). <code>extends</code> - shortcut items [{label, value?, method}]. <code>condition</code> - initial filter state. <code>simpleFilter</code> - for layout:simple (isDatetime, selectAll, datetimeConfig, searchConfig). <code>method</code> - custom filter logic for #filter slot. <code>attrs</code>, <code>dataset</code>.</p></div>'
|
|
27
34
|
},
|
|
28
35
|
codeFiles: ['filter/default-filter.vue']
|
|
29
36
|
},
|
|
37
|
+
{
|
|
38
|
+
demoId: 'filter-layout-order-filter',
|
|
39
|
+
name: { 'zh-CN': '自定义筛选项顺序', 'en-US': 'Custom Layout Order' },
|
|
40
|
+
desc: {
|
|
41
|
+
'zh-CN':
|
|
42
|
+
'<p>通过 <code>layout</code> 自定义筛选项的显示顺序和组合。默认值为 <code>input,enum,default,extends,base</code>。可选项:<code>input</code> 输入筛选、<code>enum</code> 枚举选择、<code>default</code> 空/非空、<code>extends</code> 扩展项、<code>base</code> 清除操作、<code>simple</code> 简化版。</p>',
|
|
43
|
+
'en-US':
|
|
44
|
+
'<p>Use <code>layout</code> to customize the display order and combination of filter items. Default value is <code>input,enum,default,extends,base</code>. Options: <code>input</code>, <code>enum</code>, <code>default</code>, <code>extends</code>, <code>base</code>, <code>simple</code>.</p>'
|
|
45
|
+
},
|
|
46
|
+
codeFiles: ['filter/layout-order-filter.vue']
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
demoId: 'filter-label-value-filter',
|
|
50
|
+
name: { 'zh-CN': 'label/value 字段映射', 'en-US': 'Label/Value Field Mapping' },
|
|
51
|
+
desc: {
|
|
52
|
+
'zh-CN':
|
|
53
|
+
'<p>通过 <code>label</code> 和 <code>value</code> 配置枚举数据的显示值和实际值字段,适配后端返回的 code/name 等不同字段结构。默认分别为 <code>label</code> 和 <code>value</code>。</p>',
|
|
54
|
+
'en-US':
|
|
55
|
+
'<p>Use <code>label</code> and <code>value</code> to configure the display and actual value fields for enum data, adapting to different field structures such as code/name from backend. Defaults are <code>label</code> and <code>value</code>.</p>'
|
|
56
|
+
},
|
|
57
|
+
codeFiles: ['filter/filter-label-value.vue']
|
|
58
|
+
},
|
|
30
59
|
{
|
|
31
60
|
demoId: 'filter-dynamic-filter',
|
|
32
|
-
name: { 'zh-CN': '动态改变筛选项', 'en-US': 'Filter' },
|
|
61
|
+
name: { 'zh-CN': '动态改变筛选项', 'en-US': 'Dynamic Filter Options' },
|
|
33
62
|
desc: {
|
|
34
|
-
'zh-CN':
|
|
35
|
-
|
|
63
|
+
'zh-CN':
|
|
64
|
+
'<p>通过修改 <code>filter.values</code> 数组或在 <code>values</code> 中传入函数,可动态改变或异步加载筛选项。</p>',
|
|
65
|
+
'en-US':
|
|
66
|
+
'<p>Dynamically update or async load filter options by mutating <code>filter.values</code> or passing a function that returns a Promise.</p>'
|
|
36
67
|
},
|
|
37
68
|
codeFiles: ['filter/dynamic-filter.vue']
|
|
38
69
|
},
|
|
39
70
|
{
|
|
40
71
|
demoId: 'filter-simple-filter',
|
|
41
|
-
name: { 'zh-CN': '简化版筛选 - 单选/多选菜单', 'en-US': '
|
|
72
|
+
name: { 'zh-CN': '简化版筛选 - 单选/多选菜单', 'en-US': 'Simple Filter - Single/Multi Select' },
|
|
42
73
|
desc: {
|
|
43
74
|
'zh-CN':
|
|
44
|
-
'<p
|
|
45
|
-
'en-US':
|
|
75
|
+
'<p>设置 <code>layout: "simple"</code> 启用简化版筛选。支持 <code>selectAll</code> 全选、<code>searchConfig</code> 搜索框。适用于管理侧规范的紧凑筛选面板。</p>',
|
|
76
|
+
'en-US':
|
|
77
|
+
'<p>Set <code>layout: "simple"</code> for compact filter panel. Supports <code>selectAll</code> and <code>searchConfig</code> for search box in enum list.</p>'
|
|
46
78
|
},
|
|
47
79
|
codeFiles: ['filter/simple-filter.vue']
|
|
48
80
|
},
|
|
49
81
|
{
|
|
50
82
|
demoId: 'filter-simple-date-filter',
|
|
51
|
-
name: { 'zh-CN': '简化版筛选 -
|
|
83
|
+
name: { 'zh-CN': '简化版筛选 - 日期范围', 'en-US': 'Simple Filter - Date Range' },
|
|
52
84
|
desc: {
|
|
53
85
|
'zh-CN':
|
|
54
|
-
'<p
|
|
86
|
+
'<p>设置 <code>layout: "simple"</code> 且 <code>simpleFilter.isDatetime: true</code>,使用 <code>datetimeConfig</code> 配置日期范围选择器,支持 min、max、startDate、endDate 等。</p>',
|
|
55
87
|
'en-US':
|
|
56
|
-
'<p>
|
|
88
|
+
'<p>Set <code>layout: "simple"</code> with <code>simpleFilter.isDatetime: true</code>. Configure date range picker via <code>datetimeConfig</code> (min, max, startDate, endDate).</p>'
|
|
57
89
|
},
|
|
58
90
|
codeFiles: ['filter/simple-date-filter.vue']
|
|
59
91
|
},
|
|
60
92
|
{
|
|
61
93
|
demoId: 'filter-simple-default-value-filter',
|
|
62
|
-
name: { 'zh-CN': '
|
|
94
|
+
name: { 'zh-CN': '筛选默认选中值', 'en-US': 'Filter Default Selected Value' },
|
|
63
95
|
desc: {
|
|
64
|
-
'zh-CN': '<p>通过 <code>condition.value</code
|
|
65
|
-
'en-US':
|
|
96
|
+
'zh-CN': '<p>通过 <code>filter.condition.value</code> 配置筛选的默认选中值,表格初始化时即应用该筛选条件。</p>',
|
|
97
|
+
'en-US':
|
|
98
|
+
'<p>Set default selected filter values via <code>filter.condition.value</code>. The filter is applied on table init.</p>'
|
|
66
99
|
},
|
|
67
100
|
codeFiles: ['filter/simple-default-value-filter.vue']
|
|
68
101
|
},
|
|
102
|
+
{
|
|
103
|
+
demoId: 'filter-input-custom-component',
|
|
104
|
+
name: { 'zh-CN': '自定义输入组件', 'en-US': 'Custom Input Component' },
|
|
105
|
+
desc: {
|
|
106
|
+
'zh-CN':
|
|
107
|
+
'<p>通过 <code>inputFilter.component</code> 传入自定义组件,实现非标准输入(如范围输入:左最小值、右最大值)。自定义组件需支持 <code>modelValue</code> + <code>update:modelValue</code>,或配置 <code>model</code> 指定字段名。配合 <code>relations[].method</code> 实现自定义筛选逻辑。</p>',
|
|
108
|
+
'en-US':
|
|
109
|
+
'<p>Pass custom component via <code>inputFilter.component</code> for non-standard input (e.g. range: min + max). Component must support <code>modelValue</code> + <code>update:modelValue</code>, or configure <code>model</code>. Use <code>relations[].method</code> for custom filter logic.</p>'
|
|
110
|
+
},
|
|
111
|
+
codeFiles: ['filter/input-filter-custom-component.vue']
|
|
112
|
+
},
|
|
69
113
|
{
|
|
70
114
|
demoId: 'filter-advanced-filter',
|
|
71
|
-
name: { 'zh-CN': '
|
|
115
|
+
name: { 'zh-CN': '高级筛选', 'en-US': 'Advanced Filter' },
|
|
72
116
|
desc: {
|
|
73
117
|
'zh-CN':
|
|
74
|
-
'<p>通过 <code>inputFilter</code>
|
|
75
|
-
'en-US':
|
|
118
|
+
'<p>通过 <code>inputFilter.component</code> 配置自定义输入组件(如 TinyNumeric、TinyDatePicker);<code>inputFilter.relations</code> 自定义筛选关系;<code>extends</code> 添加快捷筛选项。</p>',
|
|
119
|
+
'en-US':
|
|
120
|
+
'<p>Use <code>inputFilter.component</code> for custom input (e.g. TinyNumeric, TinyDatePicker); <code>inputFilter.relations</code> for filter relations; <code>extends</code> for shortcut filter items.</p>'
|
|
76
121
|
},
|
|
77
122
|
codeFiles: ['filter/advanced-filter.vue']
|
|
78
123
|
},
|
|
79
124
|
{
|
|
80
125
|
demoId: 'filter-custom-filter',
|
|
81
|
-
name: { 'zh-CN': '
|
|
126
|
+
name: { 'zh-CN': '自定义筛选插槽', 'en-US': 'Custom Filter Slot' },
|
|
82
127
|
desc: {
|
|
83
|
-
'zh-CN':
|
|
128
|
+
'zh-CN':
|
|
129
|
+
'<p>通过 <code>#filter</code> 插槽完全自定义筛选面板 UI。插槽参数提供 <code>context</code>,可调用 <code>commitFilter</code>、<code>resetFilter</code>、<code>clearFilter</code> 等方法。需配合 <code>filter.method</code> 实现筛选逻辑。</p>',
|
|
84
130
|
'en-US':
|
|
85
|
-
'<p>
|
|
131
|
+
'<p>Fully customize filter panel via <code>#filter</code> slot. Slot provides <code>context</code> with <code>commitFilter</code>, <code>resetFilter</code>, <code>clearFilter</code>. Configure <code>filter.method</code> for filter logic.</p>'
|
|
86
132
|
},
|
|
87
133
|
codeFiles: ['filter/custom-filter.vue']
|
|
88
134
|
},
|
|
89
135
|
{
|
|
90
136
|
demoId: 'filter-server-filter',
|
|
91
|
-
name: { 'zh-CN': '服务端过滤', 'en-US': '
|
|
137
|
+
name: { 'zh-CN': '服务端过滤', 'en-US': 'Server-side Filtering' },
|
|
92
138
|
desc: {
|
|
93
139
|
'zh-CN':
|
|
94
|
-
'<p>配置 remote-filter
|
|
140
|
+
'<p>配置 <code>remote-filter</code> 开启服务端过滤。筛选时会调用表格 <code>fetch-data</code> 的 api,并将 filters 参数传入,筛选完成后触发 <code>filter-change</code> 事件。</p>',
|
|
95
141
|
'en-US':
|
|
96
|
-
'<p>
|
|
142
|
+
'<p>Enable server-side filtering with <code>remote-filter</code>. Filter triggers <code>fetch-data</code> api with filters param, then fires <code>filter-change</code> event.</p>'
|
|
97
143
|
},
|
|
98
144
|
codeFiles: ['filter/server-filter.vue']
|
|
99
145
|
},
|
|
100
146
|
{
|
|
101
147
|
demoId: 'server-filter-default',
|
|
102
|
-
name: { 'zh-CN': '服务端过滤默认选中值', 'en-US': 'Server
|
|
148
|
+
name: { 'zh-CN': '服务端过滤默认选中值', 'en-US': 'Server Filter Default Value' },
|
|
103
149
|
desc: {
|
|
104
150
|
'zh-CN':
|
|
105
|
-
'<p
|
|
151
|
+
'<p>服务端过滤下,若需设置默认选中值,需将 <code>auto-load</code> 设为 false,在列初始化后手动调用 <code>handleFetch</code>。否则 <code>handleFetch</code> 在列初始化前执行,无法获取筛选参数。</p>',
|
|
106
152
|
'en-US':
|
|
107
|
-
'<p>
|
|
153
|
+
'<p>For server filter with default value, set <code>auto-load</code> to false and manually call <code>handleFetch</code> after init. Otherwise handleFetch runs before columns ready and cannot get filter params.</p>'
|
|
108
154
|
},
|
|
109
155
|
codeFiles: ['filter/server-filter-default.vue']
|
|
110
156
|
},
|
|
111
157
|
{
|
|
112
158
|
demoId: 'filter-default-relation',
|
|
113
|
-
name: { 'zh-CN': '
|
|
159
|
+
name: { 'zh-CN': '输入过滤默认选项', 'en-US': 'Input Filter Default Relation' },
|
|
114
160
|
desc: {
|
|
115
161
|
'zh-CN':
|
|
116
|
-
'<p
|
|
117
|
-
'en-US':
|
|
162
|
+
'<p>通过 <code>inputFilter.relation</code> 配置输入筛选的默认关系。内置值:<code>equals</code>、<code>contains</code>、<code>startwith</code>、<code>greaterThan</code> 等。自定义 <code>relations</code> 时,可通过 <code>method</code> 配置筛选逻辑。</p>',
|
|
163
|
+
'en-US':
|
|
164
|
+
'<p>Set default relation via <code>inputFilter.relation</code>. Built-in: equals, contains, startwith, greaterThan, etc. For custom relations, configure <code>method</code> for filter logic.</p>'
|
|
118
165
|
},
|
|
119
166
|
codeFiles: ['filter/default-relation.vue']
|
|
120
167
|
},
|
|
121
168
|
{
|
|
122
169
|
demoId: 'filter-request-service-reload-filter',
|
|
123
|
-
name: { 'zh-CN': '
|
|
170
|
+
name: { 'zh-CN': '重载时保持筛选', 'en-US': 'Keep Filter on Reload' },
|
|
124
171
|
desc: {
|
|
125
|
-
'zh-CN':
|
|
126
|
-
|
|
172
|
+
'zh-CN':
|
|
173
|
+
'<p>调用 <code>handleFetch("reload")</code> 时默认会清除筛选。设置 <code>fetchData.reloadConfig.filter: true</code> 可在重载后保留当前筛选条件。</p>',
|
|
174
|
+
'en-US':
|
|
175
|
+
'<p>By default, <code>handleFetch("reload")</code> clears filters. Set <code>fetchData.reloadConfig.filter: true</code> to preserve filters on reload.</p>'
|
|
127
176
|
},
|
|
128
177
|
codeFiles: ['filter/request-service-reload-filter.vue']
|
|
129
178
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<tiny-button plain class="show-close-btn" @click="stepStart">新手引导显示关闭按钮</tiny-button>
|
|
4
|
+
<tiny-guide :show-step="showStep" :dom-data="domData" :show-close="true"></tiny-guide>
|
|
5
|
+
|
|
6
|
+
<tiny-button plain class="hide-close-btn" style="margin-top: 20px" @click="stepStartWithoutClose"
|
|
7
|
+
>新手引导隐藏关闭按钮</tiny-button
|
|
8
|
+
>
|
|
9
|
+
<tiny-guide :show-step="showStepWithoutClose" :dom-data="domDataWithoutClose" :show-close="false"></tiny-guide>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script setup>
|
|
14
|
+
import { ref } from 'vue'
|
|
15
|
+
import { TinyGuide, TinyButton } from '@opentiny/vue'
|
|
16
|
+
|
|
17
|
+
const showStep = ref(false)
|
|
18
|
+
const showStepWithoutClose = ref(false)
|
|
19
|
+
|
|
20
|
+
const domData = ref([
|
|
21
|
+
{
|
|
22
|
+
title: '新手引导标题 1',
|
|
23
|
+
text: '这里是可以关闭的新手引导,点击右上角的关闭按钮可直接退出引导',
|
|
24
|
+
domElement: '.show-close-btn',
|
|
25
|
+
button: [
|
|
26
|
+
{
|
|
27
|
+
text: '下一步',
|
|
28
|
+
action: 'next'
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
title: '新手引导标题 2',
|
|
34
|
+
text: '这个引导步骤展示了关闭按钮功能',
|
|
35
|
+
domElement: '.show-close-btn',
|
|
36
|
+
button: [
|
|
37
|
+
{
|
|
38
|
+
text: '完成',
|
|
39
|
+
action: 'complete'
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
])
|
|
44
|
+
|
|
45
|
+
const domDataWithoutClose = ref([
|
|
46
|
+
{
|
|
47
|
+
title: '新手引导标题 1',
|
|
48
|
+
text: '这里是不显示关闭按钮的新手引导,无法通过关闭按钮退出引导',
|
|
49
|
+
domElement: '.hide-close-btn',
|
|
50
|
+
button: [
|
|
51
|
+
{
|
|
52
|
+
text: '下一步',
|
|
53
|
+
action: 'next'
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
title: '新手引导标题 2',
|
|
59
|
+
text: '这个引导没有关闭按钮,只能通过底部按钮操作',
|
|
60
|
+
domElement: '.hide-close-btn',
|
|
61
|
+
button: [
|
|
62
|
+
{
|
|
63
|
+
text: '完成',
|
|
64
|
+
action: 'complete'
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
])
|
|
69
|
+
|
|
70
|
+
function stepStart() {
|
|
71
|
+
showStep.value = !showStep.value
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function stepStartWithoutClose() {
|
|
75
|
+
showStepWithoutClose.value = !showStepWithoutClose.value
|
|
76
|
+
}
|
|
77
|
+
</script>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { test, expect } from '@playwright/test'
|
|
2
|
+
|
|
3
|
+
test('关闭按钮', async ({ page }) => {
|
|
4
|
+
page.on('pageerror', (exception) => expect(exception).toBeNull())
|
|
5
|
+
await page.goto('guide#show-close')
|
|
6
|
+
|
|
7
|
+
// 测试显示关闭按钮的引导
|
|
8
|
+
const showCloseBtn = page.locator('.show-close-btn')
|
|
9
|
+
const guideWithClose = page.locator('.shepherd-element').first()
|
|
10
|
+
|
|
11
|
+
await showCloseBtn.click()
|
|
12
|
+
await expect(guideWithClose).toBeVisible()
|
|
13
|
+
|
|
14
|
+
// 检查关闭按钮是否存在
|
|
15
|
+
const closeBtn = guideWithClose.locator('.shepherd-cancel-icon')
|
|
16
|
+
await expect(closeBtn).toBeVisible()
|
|
17
|
+
|
|
18
|
+
// 点击关闭按钮关闭引导
|
|
19
|
+
await closeBtn.click()
|
|
20
|
+
await expect(guideWithClose).toBeHidden()
|
|
21
|
+
|
|
22
|
+
// 测试隐藏关闭按钮的引导
|
|
23
|
+
const hideCloseBtn = page.locator('.hide-close-btn')
|
|
24
|
+
const guideWithoutClose = page.locator('.shepherd-element').first() // 第二个引导也是第一个shepherd-element
|
|
25
|
+
|
|
26
|
+
await hideCloseBtn.click()
|
|
27
|
+
await expect(guideWithoutClose).toBeVisible()
|
|
28
|
+
|
|
29
|
+
// 验证关闭按钮不存在
|
|
30
|
+
const closeBtnHidden = guideWithoutClose.locator('.shepherd-cancel-icon')
|
|
31
|
+
await expect(closeBtnHidden).toBeHidden()
|
|
32
|
+
|
|
33
|
+
// 通过完成按钮关闭引导
|
|
34
|
+
const completeBtn = page.getByRole('button', { name: '下一步' })
|
|
35
|
+
await completeBtn.click()
|
|
36
|
+
await expect(guideWithoutClose).toBeHidden()
|
|
37
|
+
})
|