diff --git a/examples/sites/demos/apis/pager.js b/examples/sites/demos/apis/pager.js index f662d2ab00..57e70cad85 100644 --- a/examples/sites/demos/apis/pager.js +++ b/examples/sites/demos/apis/pager.js @@ -92,10 +92,10 @@ export default { }, { name: 'mode', - type: "'number' | 'simple' | 'complete' | 'fixed'", + type: "'number' | 'simple' | 'complete' | 'fixed' | 'simplest'", defaultValue: '', desc: { - 'zh-CN': '设置分页组件显示模式,此属性优先级大于 layout', + 'zh-CN': '设置分页组件显示模式,此属性优先级大于 layout, 3.19.0新增simplest', 'en-US': 'Set the display mode of pagination components, which takes priority over layout' }, mode: ['pc'], diff --git a/examples/sites/demos/pc/app/pager/disabled-and-size.spec.ts b/examples/sites/demos/pc/app/pager/disabled-and-size.spec.ts index 3656522bde..da7d032c06 100644 --- a/examples/sites/demos/pc/app/pager/disabled-and-size.spec.ts +++ b/examples/sites/demos/pc/app/pager/disabled-and-size.spec.ts @@ -12,8 +12,8 @@ test('禁用和尺寸', async ({ page }) => { const next = pager.locator('.tiny-pager__btn-next') await demo.locator('.tiny-switch').click() - await expect(sizeChange).toHaveCSS('color', 'rgb(138, 142, 153)') - await expect(sizeChange).toHaveCSS('border-top-color', 'rgba(0, 0, 0, 0)') + await expect(sizeChange).toHaveCSS('color', 'rgb(194, 194, 194)') + await expect(sizeChange).toHaveCSS('border-top-color', 'rgb(219, 219, 219)') await expect(prev).toBeDisabled() await expect(next).toBeDisabled() await expect(pageItem.first()).toHaveCSS('cursor', 'not-allowed') diff --git a/examples/sites/demos/pc/app/pager/pager-mode-composition-api.vue b/examples/sites/demos/pc/app/pager/pager-mode-composition-api.vue index 0e70d7dd95..7787a5b060 100644 --- a/examples/sites/demos/pc/app/pager/pager-mode-composition-api.vue +++ b/examples/sites/demos/pc/app/pager/pager-mode-composition-api.vue @@ -6,6 +6,7 @@ + diff --git a/examples/sites/demos/pc/app/pager/pager-mode.vue b/examples/sites/demos/pc/app/pager/pager-mode.vue index e3f0d05474..50f167976e 100644 --- a/examples/sites/demos/pc/app/pager/pager-mode.vue +++ b/examples/sites/demos/pc/app/pager/pager-mode.vue @@ -6,6 +6,7 @@ + diff --git a/packages/design/smb/src/pager/index.ts b/packages/design/smb/src/pager/index.ts index fc7dc499bb..f9c45149ec 100644 --- a/packages/design/smb/src/pager/index.ts +++ b/packages/design/smb/src/pager/index.ts @@ -1,7 +1,6 @@ export default { state: { pageSizeText: '', - align: 'right', - totalFixedLeft: true + align: 'right' } } diff --git a/packages/renderless/src/pager/index.ts b/packages/renderless/src/pager/index.ts index a13e99815c..ff135c9f2f 100644 --- a/packages/renderless/src/pager/index.ts +++ b/packages/renderless/src/pager/index.ts @@ -18,6 +18,7 @@ export const computedInternalLayout = props.mode === 'simple' && (layout = 'sizes, total, prev, current, next') props.mode === 'complete' && (layout = 'sizes, total, prev, pager, next, jumper') props.mode === 'fixed' && (layout = 'prev,pager,next') + props.mode === 'simplest' && (layout = 'total, prev, simplest-pager, next') } else if ((!props.mode && props.layout) || (props.mode && props.layout)) { layout = props.layout } else { @@ -67,6 +68,25 @@ export const computedInternalPageCount = return null } +export const computedSimplestPagerOption = + ({ props, state }: Pick) => + (): Array<{ value: number; label: string }> => { + const itemSizes = Math.max(1, Math.ceil(props.total / state.internalPageSize)) + return Array.from({ length: itemSizes }).map((item, index) => ({ + value: index + 1, + label: `${index + 1}/${itemSizes}` + })) + } + +export const computedSimplestPagerWidth = + ({ state }: Pick) => + (): number => { + const baseWidth = 60 + const num = String(state.internalCurrentPage).length + String(state.simplestPagerOption.length).length + // 输入框长度 = 基本宽度加数字长度 + return baseWidth + num * 8 + } + export const handleJumperFocus = ({ state }: Pick) => (e: Event): void => { diff --git a/packages/renderless/src/pager/vue.ts b/packages/renderless/src/pager/vue.ts index 1ebde02f72..d897f27930 100644 --- a/packages/renderless/src/pager/vue.ts +++ b/packages/renderless/src/pager/vue.ts @@ -10,6 +10,8 @@ import { computedInternalLayout, computedTotalText, computedInternalPageCount, + computedSimplestPagerOption, + computedSimplestPagerWidth, handleJumperFocus, handleSizeChange, handleJumperInput, @@ -83,6 +85,8 @@ export const renderless = ( internalTotal: props.total, jumperValue: '1', jumperBackup: '1', + simplestPagerOption: computed(() => api.computedSimplestPagerOption()), + simplestPagerWidth: computed(() => api.computedSimplestPagerWidth()), showPager: computed(() => api.computedShowPager()), internalLayout: computed(() => api.computedInternalLayout()), totalText: computed(() => api.computedTotalText()), @@ -90,7 +94,9 @@ export const renderless = ( showJumperSufix: designConfig?.state?.showJumperSufix ?? true, align: props.align || designConfig?.state?.align || 'left', totalI18n: designConfig?.state?.totalI18n || 'totals', - totalFixedLeft: props.totalFixedLeft ?? designConfig?.state?.totalFixedLeft ?? false, + totalFixedLeft: computed( + () => props.totalFixedLeft ?? designConfig?.state?.totalFixedLeft ?? props.mode !== 'simplest' ?? true + ), pageSizeText: props.pageSizeText ?? designConfig?.state?.pageSizeText }) @@ -100,6 +106,8 @@ export const renderless = ( computedInternalLayout: computedInternalLayout({ props }), computedTotalText: computedTotalText({ props, t }), computedInternalPageCount: computedInternalPageCount({ props, state }), + computedSimplestPagerOption: computedSimplestPagerOption({ props, state }), + computedSimplestPagerWidth: computedSimplestPagerWidth({ state }), getValidCurrentPage: getValidCurrentPage({ state }), handleJumperFocus: handleJumperFocus({ state }), handleSizeChange: handleSizeChange({ props, state, api, emit, vm }), diff --git a/packages/theme/src/base-select/vars.less b/packages/theme/src/base-select/vars.less index 30564bf75e..f8c3f6449a 100644 --- a/packages/theme/src/base-select/vars.less +++ b/packages/theme/src/base-select/vars.less @@ -24,7 +24,7 @@ // 小型选择器尾部图标距离输入框的垂直距离 --ti-select-input-icon-top-small: var(--ti-common-space-4x); // 迷你型选择器尾部图标距离输入框的垂直距离 - --ti-select-input-icon-top-mini: var(--ti-common-space-4x); + --ti-select-input-icon-top-mini: var(--ti-common-space-3x); // 选择器输入框尾部图标的颜色 --ti-select-input-caret-icon-color: var(--ti-common-color-icon-normal); // 选择器输入框尾部图标悬浮时的颜色 diff --git a/packages/theme/src/pager/index.less b/packages/theme/src/pager/index.less index 766ee8405f..1e7e876218 100644 --- a/packages/theme/src/pager/index.less +++ b/packages/theme/src/pager/index.less @@ -132,9 +132,6 @@ .@{pager-prefix-cls}__total-loading { width: 30px; } - .tiny-loading__spinner { - margin-top: 3px; - } } &__goto { @@ -169,9 +166,11 @@ border: 1px solid var(--ti-pager-primary-border-color); box-shadow: 0 0 0 rgba(0, 0, 0, 0); } + &[disabled] { color: var(--ti-pager-disabled-text-color); - border-color: var(--ti-pager-disabled-border-color); + border-color: var(--ti-pager-select-disabled-border-color); + background: var(--ti-pager-select-disabled-bg-color); cursor: not-allowed; } } @@ -182,6 +181,7 @@ padding-left: var(--ti-pager-normal-text-padding-left); margin-right: 8px; line-height: var(--ti-pager-input-height); + &-sufix { padding-left: 4px; } @@ -210,10 +210,12 @@ background 0.3s; outline: 0; .user-select(none); + &:hover { border: 1px solid var(--ti-pager-goto-btn-border-hover-color); color: var(--ti-pager-goto-btn-text-hover-color); } + &.is-disabled { color: var(--ti-pager-disabled-text-color); border-color: var(--ti-pager-disabled-border-color); @@ -316,11 +318,12 @@ .list-item { min-height: var(--ti-pager-poplist-item-min-height); padding: 0 8px; - line-height: 30px; + line-height: var(--ti-pager-poplist-item-min-height); max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + text-align: center; &:hover { cursor: pointer; @@ -512,8 +515,8 @@ .@{pager-prefix-cls}__page-size { color: var(--ti-pager-disabled-text-color); cursor: not-allowed; - border-color: var(--ti-pager-disabled-border-color); - background-color: var(--ti-base-color-bg-1); + border-color: var(--ti-pager-select-disabled-border-color); + background: var(--ti-pager-select-disabled-bg-color); } .@{pager-prefix-cls}__page-size-btn { @@ -528,6 +531,20 @@ color: var(--ti-pager-disabled-text-color); } } + + &__simplest-pager-popover { + .component-css-vars-pager(); + + .tiny-option-label { + text-align: center; + font-family: var(--ti-pager-number-font-family); + } + + .tiny-option.selected { + color: var(--ti-pager-poplist-item-selected-text-color); + background: var(--ti-pager-poplist-item-selected-bg-color); + } + } } @media (max-width: 768px) { diff --git a/packages/theme/src/pager/old-theme.js b/packages/theme/src/pager/old-theme.js index ff9e808e61..6e9823cd31 100644 --- a/packages/theme/src/pager/old-theme.js +++ b/packages/theme/src/pager/old-theme.js @@ -22,7 +22,6 @@ export const tinyPagerOldTheme = { 'ti-pager-prev-padding-left': '6px', 'ti-pager-goto-btn-text-hover-color': 'var(--ti-common-color-text-highlight, #526ecc)', 'ti-pager-poplist-item-min-height': '30px', - 'ti-pager-pop-body-margin-top': '4px', 'ti-pager-poplist-item-selected-bg-color': 'var(--ti-common-color-selected-background, #5e7ce0)', 'ti-pager-poplist-item-hover-text-color': 'var(--ti-common-color-text-highlight, #526ecc)', 'ti-pager-poplist-item-hover-bg-color': 'var(--ti-common-color-hover-background, #f2f5fc)', diff --git a/packages/theme/src/pager/vars.less b/packages/theme/src/pager/vars.less index 3b67f7f06a..4ffc585d6a 100644 --- a/packages/theme/src/pager/vars.less +++ b/packages/theme/src/pager/vars.less @@ -18,7 +18,7 @@ // 分页页码选中项文字色 --ti-pager-active-font-color: var(--ti-common-color-text-primary); // 分页页码选中项背景色 - --ti-pager-active-bg-color: #F5F5F5; + --ti-pager-active-bg-color: #f5f5f5; // 自定义上下页按钮文本色 --ti-pager-primary-text-color: var(--ti-common-color-text-link, #526ecc); // 分页跳转输入框激活颜色 @@ -31,6 +31,10 @@ --ti-pager-disabled-text-color: var(--ti-common-color-text-disabled, #adb0b8); // 分页禁用状态下边框颜色 --ti-pager-disabled-border-color: transparent; + // 分页禁用选择框边框颜色 + --ti-pager-select-disabled-border-color: #dbdbdb; + // 分页禁用选择框背景颜色 + --ti-pager-select-disabled-bg-color: var(--ti-common-color-bg-disabled); // 分页输入框和选项框边框色 --ti-pager-input-border-color: var(--ti-common-color-line-normal); @@ -85,11 +89,11 @@ --ti-pager-li-item-hover-font-weight: var(--ti-common-font-weight-6); // 分页项默认悬浮背景色 - --ti-pager-poplist-item-hover-bg-color: #F5F5F5; + --ti-pager-poplist-item-hover-bg-color: #f5f5f5; // 分页下拉框项|列表项悬浮文本色 --ti-pager-poplist-item-hover-text-color: var(--ti-common-color-text-primary); // 分页下拉框选中项默认背景色 - --ti-pager-poplist-item-selected-bg-color: #F5F5F5; + --ti-pager-poplist-item-selected-bg-color: #f5f5f5; // 分页下拉框项选中字体颜色 --ti-pager-poplist-item-selected-text-color: var(--ti-common-color-selected-text-color, #fff); // 分页页码项默认悬浮边框色 @@ -99,7 +103,7 @@ // 分页下拉框顶部外边距 --ti-pager-pop-body-margin-top: var(--ti-common-space-base); // 分页下拉项最小高度 - --ti-pager-poplist-item-min-height: var(--ti-common-line-height-6); + --ti-pager-poplist-item-min-height: 32px; // 分页下一页文字禁用色 --ti-pager-prev-next-text-color-disabled: var(--ti-common-color-text-disabled, #adb0b8); diff --git a/packages/vue/src/base-select/package.json b/packages/vue/src/base-select/package.json index 3c1d3ef456..072f938792 100644 --- a/packages/vue/src/base-select/package.json +++ b/packages/vue/src/base-select/package.json @@ -1,37 +1,35 @@ { "name": "@opentiny/vue-base-select", + "type": "module", "version": "3.18.0", "description": "", + "license": "MIT", + "sideEffects": false, "main": "lib/index.js", "module": "index.ts", - "sideEffects": false, - "type": "module", - "devDependencies": { - "@opentiny-internal/vue-test-utils": "workspace:*", - "vitest": "^0.31.0" - }, "scripts": { "build": "pnpm -w build:ui $npm_package_name", "//postversion": "pnpm build" }, "dependencies": { - "@opentiny/vue-renderless": "workspace:~", + "@opentiny/vue-button": "workspace:~", + "@opentiny/vue-checkbox": "workspace:~", "@opentiny/vue-common": "workspace:~", - "@opentiny/vue-locale": "workspace:~", - "@opentiny/vue-tag": "workspace:~", + "@opentiny/vue-filter-box": "workspace:~", + "@opentiny/vue-icon": "workspace:~", "@opentiny/vue-input": "workspace:~", + "@opentiny/vue-locale": "workspace:~", "@opentiny/vue-option": "workspace:~", + "@opentiny/vue-recycle-scroller": "workspace:~", + "@opentiny/vue-renderless": "workspace:~", "@opentiny/vue-scrollbar": "workspace:~", - "@opentiny/vue-icon": "workspace:~", "@opentiny/vue-select-dropdown": "workspace:~", - "@opentiny/vue-grid": "workspace:~", - "@opentiny/vue-tree": "workspace:~", - "@opentiny/vue-tooltip": "workspace:~", - "@opentiny/vue-filter-box": "workspace:~", - "@opentiny/vue-checkbox": "workspace:~", + "@opentiny/vue-tag": "workspace:~", "@opentiny/vue-theme": "workspace:~", - "@opentiny/vue-recycle-scroller": "workspace:~", - "@opentiny/vue-button": "workspace:~" + "@opentiny/vue-tooltip": "workspace:~" }, - "license": "MIT" -} \ No newline at end of file + "devDependencies": { + "@opentiny-internal/vue-test-utils": "workspace:*", + "vitest": "^0.31.0" + } +} diff --git a/packages/vue/src/base-select/src/pc.vue b/packages/vue/src/base-select/src/pc.vue index 2c09de6edd..db441fbcf6 100644 --- a/packages/vue/src/base-select/src/pc.vue +++ b/packages/vue/src/base-select/src/pc.vue @@ -540,8 +540,6 @@ import { IconEllipsis, IconChevronUp } from '@opentiny/vue-icon' -import Grid from '@opentiny/vue-grid' -import Tree from '@opentiny/vue-tree' import TinyTooltip from '@opentiny/vue-tooltip' import FilterBox from '@opentiny/vue-filter-box' import RecycleScroller from '@opentiny/vue-recycle-scroller' @@ -593,8 +591,6 @@ export default defineComponent({ TinyTag, TinyInput, TinyOption, - TinyGrid: Grid, - TinyTree: Tree, TinyButton, IconClose: IconClose(), TinyScrollbar, diff --git a/packages/vue/src/pager/package.json b/packages/vue/src/pager/package.json index 405a500dac..f2f1623a43 100644 --- a/packages/vue/src/pager/package.json +++ b/packages/vue/src/pager/package.json @@ -1,27 +1,28 @@ { "name": "@opentiny/vue-pager", + "type": "module", "version": "3.18.0", "description": "", + "license": "MIT", + "sideEffects": false, "main": "lib/index.js", "module": "index.ts", - "sideEffects": false, - "type": "module", - "devDependencies": { - "@opentiny-internal/vue-test-utils": "workspace:*", - "vitest": "^0.31.0" - }, "scripts": { "build": "pnpm -w build:ui $npm_package_name", "//postversion": "pnpm build" }, "dependencies": { - "@opentiny/vue-renderless": "workspace:~", + "@opentiny/vue-base-select": "workspace:~", + "@opentiny/vue-common": "workspace:~", "@opentiny/vue-icon": "workspace:~", - "@opentiny/vue-popover": "workspace:~", - "@opentiny/vue-pager-item": "workspace:~", "@opentiny/vue-loading": "workspace:~", - "@opentiny/vue-theme": "workspace:~", - "@opentiny/vue-common": "workspace:~" + "@opentiny/vue-pager-item": "workspace:~", + "@opentiny/vue-popover": "workspace:~", + "@opentiny/vue-renderless": "workspace:~", + "@opentiny/vue-theme": "workspace:~" }, - "license": "MIT" -} \ No newline at end of file + "devDependencies": { + "@opentiny-internal/vue-test-utils": "workspace:*", + "vitest": "^0.31.0" + } +} diff --git a/packages/vue/src/pager/src/pc.vue b/packages/vue/src/pager/src/pc.vue index 3a22a1da06..93ed835971 100644 --- a/packages/vue/src/pager/src/pc.vue +++ b/packages/vue/src/pager/src/pc.vue @@ -69,6 +69,20 @@ @before-page-change="beforePagerChangeHandler" > + + +