From bc7406b41fb75bf0043fb0c8039730d8417e7bf0 Mon Sep 17 00:00:00 2001 From: Stepan Date: Tue, 27 Dec 2022 14:35:02 +0300 Subject: [PATCH 1/6] WDS-125 make select option menu same width as trigger's one --- .changeset/thin-mirrors-fly.md | 5 ++++ packages/ui/etc/api/ui.api.md | 28 ++++++++++++++++--- .../ui/src/components/Popover/SPopover.ts | 20 ++++++++++++- .../Popover/SPopoverWrappedTransition.vue | 5 ++++ packages/ui/src/components/Select/SSelect.vue | 5 +++- .../ui/src/components/Select/SSelectBase.vue | 7 +++++ 6 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 .changeset/thin-mirrors-fly.md diff --git a/.changeset/thin-mirrors-fly.md b/.changeset/thin-mirrors-fly.md new file mode 100644 index 00000000..e81742b6 --- /dev/null +++ b/.changeset/thin-mirrors-fly.md @@ -0,0 +1,5 @@ +--- +'@soramitsu-ui/ui': patch +--- + +**fix**(`SSelect`): make select options menu width same as trigger's one diff --git a/packages/ui/etc/api/ui.api.md b/packages/ui/etc/api/ui.api.md index b0101a36..d1c2c64a 100644 --- a/packages/ui/etc/api/ui.api.md +++ b/packages/ui/etc/api/ui.api.md @@ -823,6 +823,10 @@ hideDelay: { type: (StringConstructor | NumberConstructor)[]; default: number; }; +sameWidth: { +type: BooleanConstructor; +default: boolean; +}; }, () => (VNode | null)[], unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, ("update:show" | "click-outside")[], "update:show" | "click-outside", VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly> & { "onUpdate:show"?: ((...args: any[]) => any) | undefined; "onClick-outside"?: ((...args: any[]) => any) | undefined; @@ -864,6 +872,7 @@ skidding: string | number; distance: string | number; showDelay: string | number; hideDelay: string | number; +sameWidth: boolean; }>; // @public (undocumented) @@ -873,15 +882,24 @@ wrapperAttrs: { type: ObjectConstructor; default: null; }; +innerWrapperAttrs: { +type: ObjectConstructor; +default: null; +}; }, {}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, Record, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly>, { eager: boolean; wrapperAttrs: Record; +innerWrapperAttrs: Record; }>; // Warning: (ae-forgotten-export) The symbol "__VLS_WithDefaults" needs to be exported by the entry point lib.d.ts @@ -901,8 +919,8 @@ lineHeight?: number | undefined; percent: number; lineHeight: number; }>>>, { -percent: number; lineHeight: number; +percent: number; }>; // Warning: (ae-forgotten-export) The symbol "__VLS_WithDefaults" needs to be exported by the entry point lib.d.ts @@ -988,6 +1006,7 @@ label?: string | null | undefined; mandatory?: boolean | undefined; syncMenuAndInputWidths?: boolean | undefined; noAutoClose?: boolean | undefined; +sameWidthPopper?: boolean | undefined; }>, { size: "md"; options: () => never[]; @@ -1009,6 +1028,7 @@ label?: string | null | undefined; mandatory?: boolean | undefined; syncMenuAndInputWidths?: boolean | undefined; noAutoClose?: boolean | undefined; +sameWidthPopper?: boolean | undefined; }>, { size: "md"; options: () => never[]; @@ -1298,11 +1318,11 @@ onSelect?: ((args_0: TableRow[], args_1: TableRow) => any) | undefined; }, { data: TableRow[]; height: string | number; +maxHeight: string | number; defaultSort: { prop: string; order: TableColumnSortOrder; } | null; -maxHeight: string | number; fit: boolean; showHeader: boolean; highlightCurrentRow: boolean; @@ -1467,9 +1487,9 @@ default: boolean; type: "default" | "details" | "selection" | "expand"; width: string; label: string; +minWidth: string; sortable: boolean | "custom"; prop: string; -minWidth: string; sortMethod: (a: T, b: T) => number; sortBy: TableColumnSortBy_2; sortOrders: TableColumnSortOrder_2[]; @@ -1651,9 +1671,9 @@ secondaryButtonText: string; "onClick:secondary-button"?: ((...args: any[]) => any) | undefined; }, { placement: BasePlacement; +content: string; header: string; wrapperTag: string | object; -content: string; primaryButtonText: string; secondaryButtonText: string; }>; diff --git a/packages/ui/src/components/Popover/SPopover.ts b/packages/ui/src/components/Popover/SPopover.ts index a9ac05cf..70b2624b 100644 --- a/packages/ui/src/components/Popover/SPopover.ts +++ b/packages/ui/src/components/Popover/SPopover.ts @@ -1,5 +1,5 @@ import { Ref, cloneVNode, PropType } from 'vue' -import { Placement, placements, Instance } from '@popperjs/core' +import { Placement, placements, Instance, State } from '@popperjs/core' import { not, or } from '@vueuse/core' import { usePopper } from '@/composables/popper' import { PopoverApi, POPOVER_API_KEY } from './api' @@ -129,6 +129,10 @@ export default /* @__PURE__ */ defineComponent({ type: [Number, String], default: 0, }, + sameWidth: { + type: Boolean, + default: false, + }, }, emits: ['update:show', 'click-outside'], setup(props, { slots, emit }) { @@ -162,6 +166,20 @@ export default /* @__PURE__ */ defineComponent({ name: 'offset', options: { offset: computed(() => [skidding.value, distance.value]) }, }, + shallowReactive({ + name: 'sameWidth', + enabled: props.sameWidth, + phase: 'beforeWrite' as const, + requires: ['computeStyles'], + fn: ({ state }: { state: State }) => { + state.styles.popper.width = `${state.rects.reference.width}px` + }, + effect: ({ state }: { state: State }) => { + if (state.elements.reference instanceof HTMLElement) { + state.elements.popper.style.width = `${state.elements.reference.offsetWidth}px` + } + }, + }), ], }), }) diff --git a/packages/ui/src/components/Popover/SPopoverWrappedTransition.vue b/packages/ui/src/components/Popover/SPopoverWrappedTransition.vue index 5c7c71eb..af091cd4 100644 --- a/packages/ui/src/components/Popover/SPopoverWrappedTransition.vue +++ b/packages/ui/src/components/Popover/SPopoverWrappedTransition.vue @@ -15,6 +15,10 @@ const props = defineProps({ type: Object, default: null, }, + innerWrapperAttrs: { + type: Object, + default: null, + }, }) const api = usePopoverApi() @@ -55,6 +59,7 @@ onScopeDispose(() => { diff --git a/packages/ui/src/components/Select/SSelect.vue b/packages/ui/src/components/Select/SSelect.vue index 3b9a6b18..7b719fb6 100644 --- a/packages/ui/src/components/Select/SSelect.vue +++ b/packages/ui/src/components/Select/SSelect.vue @@ -16,7 +16,10 @@ defineProps<{