diff --git a/.changeset/four-readers-battle.md b/.changeset/four-readers-battle.md new file mode 100644 index 00000000..40de637d --- /dev/null +++ b/.changeset/four-readers-battle.md @@ -0,0 +1,5 @@ +--- +'@soramitsu-ui/ui': minor +--- + +**feat**(`SSelect`): add option groups with headers and select all buttons 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 92da7b2c..4b3f80fb 100644 --- a/packages/ui/etc/api/ui.api.md +++ b/packages/ui/etc/api/ui.api.md @@ -536,7 +536,7 @@ shortcuts: DatePickerOptions; // @public (undocumented) export const SDropdown: DefineComponent<__VLS_TypePropsToRuntimeProps_10<{ modelValue?: any; -options?: SelectOption[] | undefined; +options?: SelectOption[] | SelectOptionGroup[] | undefined; disabled?: boolean | undefined; multiple?: boolean | undefined; label?: string | undefined; @@ -545,7 +545,7 @@ inline?: boolean | undefined; noAutoClose?: boolean | undefined; }>, {}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, Record, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly[] | undefined; +options?: SelectOption[] | SelectOptionGroup[] | undefined; disabled?: boolean | undefined; multiple?: boolean | undefined; label?: string | undefined; @@ -560,7 +560,7 @@ export const SELECT_API_KEY: InjectionKey>; // Warning: (ae-forgotten-export) The symbol "UseSelectModelReturn" needs to be exported by the entry point lib.d.ts // // @public (undocumented) -export interface SelectApi extends DeepReadonly>> { +export interface SelectApi extends UnwrapRef> { // (undocumented) readonly disabled: boolean; // (undocumented) @@ -573,7 +573,7 @@ export interface SelectApi extends DeepReadonly>[]>; + readonly options: UnwrapRef[] | SelectOptionGroup[]>; // (undocumented) readonly size: SelectSize; } @@ -595,6 +595,16 @@ export interface SelectOption { value: T; } +// @public (undocumented) +export interface SelectOptionGroup { + // (undocumented) + header?: string; + // (undocumented) + items: SelectOption[]; + // (undocumented) + selectAllBtn?: boolean; +} + // @public (undocumented) export const SelectOptionType: { readonly RadioOrCheckbox: "rad-or-check"; @@ -903,6 +913,7 @@ hideDelay: { type: (StringConstructor | NumberConstructor)[]; default: number; }; +sameWidth: BooleanConstructor; }, () => (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; @@ -944,6 +956,7 @@ skidding: string | number; distance: string | number; showDelay: string | number; hideDelay: string | number; +sameWidth: boolean; }>; // @public (undocumented) @@ -953,15 +966,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 @@ -981,8 +1003,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 @@ -1038,7 +1060,7 @@ radioSelector: string; // @public (undocumented) export const SSelect: DefineComponent<__VLS_TypePropsToRuntimeProps_9<{ modelValue?: any; -options?: SelectOption[] | undefined; +options?: SelectOption[] | SelectOptionGroup[] | undefined; disabled?: boolean | undefined; multiple?: boolean | undefined; label?: string | undefined; @@ -1046,7 +1068,7 @@ size?: SelectSize | undefined; noAutoClose?: boolean | undefined; }>, {}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, Record, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly[] | undefined; +options?: SelectOption[] | SelectOptionGroup[] | undefined; disabled?: boolean | undefined; multiple?: boolean | undefined; label?: string | undefined; @@ -1062,12 +1084,13 @@ export const SSelectBase: DefineComponent<__VLS_WithDefaults_9<__VLS_TypePropsTo disabled?: boolean | undefined; multiple?: boolean | undefined; modelValue?: any; -options?: SelectOption[] | undefined; +options?: SelectOption[] | SelectOptionGroup[] | undefined; size?: SelectSize | undefined; label?: string | null | undefined; mandatory?: boolean | undefined; syncMenuAndInputWidths?: boolean | undefined; noAutoClose?: boolean | undefined; +sameWidthPopper?: boolean | undefined; }>, { size: "md"; options: () => never[]; @@ -1083,12 +1106,13 @@ label: null; disabled?: boolean | undefined; multiple?: boolean | undefined; modelValue?: any; -options?: SelectOption[] | undefined; +options?: SelectOption[] | SelectOptionGroup[] | undefined; size?: SelectSize | undefined; label?: string | null | undefined; mandatory?: boolean | undefined; syncMenuAndInputWidths?: boolean | undefined; noAutoClose?: boolean | undefined; +sameWidthPopper?: boolean | undefined; }>, { size: "md"; options: () => never[]; @@ -1105,10 +1129,10 @@ modelValue: any; multiple: boolean; size: SelectSize; disabled: boolean; -options: SelectOption[]; +options: SelectOption[] | SelectOptionGroup[]; label: string | null; -syncMenuAndInputWidths: boolean; noAutoClose: boolean; +syncMenuAndInputWidths: boolean; }>; // Warning: (ae-forgotten-export) The symbol "__VLS_WithDefaults" needs to be exported by the entry point lib.d.ts @@ -1378,11 +1402,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; @@ -1546,10 +1570,11 @@ default: boolean; }>>, { type: "default" | "details" | "selection" | "expand"; width: string; +minWidth: string; label: string; sortable: boolean | "custom"; +selectable: TableColumnRowSelectableFunc_2; prop: string; -minWidth: string; sortMethod: (a: T, b: T) => number; sortBy: TableColumnSortBy_2; sortOrders: TableColumnSortOrder_2[]; @@ -1559,7 +1584,6 @@ align: "left" | "right" | "center"; headerAlign: "left" | "right" | "center" | null; className: string; labelClassName: string; -selectable: TableColumnRowSelectableFunc_2; reserveSelection: boolean; }>; @@ -1741,9 +1765,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..652a397e 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,7 @@ export default /* @__PURE__ */ defineComponent({ type: [Number, String], default: 0, }, + sameWidth: Boolean, }, emits: ['update:show', 'click-outside'], setup(props, { slots, emit }) { @@ -162,6 +163,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/SDropdown.vue b/packages/ui/src/components/Select/SDropdown.vue index 1de48d9b..07915bfe 100644 --- a/packages/ui/src/components/Select/SDropdown.vue +++ b/packages/ui/src/components/Select/SDropdown.vue @@ -1,12 +1,12 @@