@rotki/ui-library 3.0.0-beta.2 → 3.0.0-beta.4
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/README.md +27 -14
- package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
- package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +1 -1
- package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/accordions/accordions/RuiAccordions.js.map +1 -1
- package/dist/components/accordions/accordions/RuiAccordions.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/alerts/RuiAlert.js.map +1 -1
- package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/RuiAvatar.js.map +1 -1
- package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/RuiAvatarGroup.js.map +1 -1
- package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.js.map +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarHeader.js.map +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cards/RuiCard.js.map +1 -1
- package/dist/components/cards/RuiCard.vue.d.ts +1 -1
- package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cards/RuiCardHeader.js.map +1 -1
- package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chips/RuiChip.js.map +1 -1
- package/dist/components/chips/RuiChip.vue.d.ts +1 -1
- package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorDisplay.js.map +1 -1
- package/dist/components/color-picker/RuiColorDisplay.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorHue.js.map +1 -1
- package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorInput.js.map +1 -1
- package/dist/components/color-picker/RuiColorInput.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/RuiColorPicker.js.map +1 -1
- package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.d.ts +1 -1
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiTimezoneSelect.js.map +1 -1
- package/dist/components/date-time-picker/RuiTimezoneSelect.vue.d.ts +2 -2
- package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/divider/RuiDivider.js.map +1 -1
- package/dist/components/divider/RuiDivider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOption.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue.d.ts +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteOptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoCompleteSelection.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/auto-complete/auto-complete-props.d.ts +2 -2
- package/dist/components/forms/auto-complete/auto-complete-styles.d.ts +3 -53
- package/dist/components/forms/auto-complete/auto-complete-styles.js +2 -1
- package/dist/components/forms/auto-complete/auto-complete-styles.js.map +1 -1
- package/dist/components/forms/category-picker/RuiCategoryPicker.js.map +1 -1
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +2 -2
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.js.map +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.js.map +1 -1
- package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/field-defaults/RuiFieldDefaults.js.map +1 -1
- package/dist/components/forms/field-defaults/RuiFieldDefaults.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/field-label/RuiFieldLabel.js.map +1 -1
- package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -1
- package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +4 -1
- package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +17 -8
- package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.js.map +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.js.map +1 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.js.map +1 -1
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +1 -1
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
- package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +2 -2
- package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/slider/RuiSlider.js.map +1 -1
- package/dist/components/forms/slider/RuiSlider.vue.d.ts +1 -1
- package/dist/components/forms/slider/RuiSlider.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/slider/RuiSliderTicks.js.map +1 -1
- package/dist/components/forms/slider/RuiSliderTicks.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
- package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-area/RuiTextArea.js.map +1 -1
- package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-input-styles.js +1 -1
- package/dist/components/forms/text-input-styles.js.map +1 -1
- package/dist/components/helpers/RuiFormTextDetail.js.map +1 -1
- package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/helpers/RuiFormTextDetail.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/icons/RuiIcon.js.map +1 -1
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +11 -10
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/index.d.ts +57 -57
- package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/logos/RuiLogo.js.map +1 -1
- package/dist/components/logos/RuiLogo.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.js.map +1 -1
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
- package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +1 -1
- package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue.d.ts +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
- package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/progress/RuiProgress.js.map +1 -1
- package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +6 -2
- package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiStepper.js.map +1 -1
- package/dist/components/steppers/RuiStepper.vue.d.ts +1 -1
- package/dist/components/steppers/RuiStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/RuiStepperIcon.js.map +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiDataTable.js.map +1 -1
- package/dist/components/tables/RuiDataTable.vue.d.ts +11 -2
- package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +8 -3
- package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiExpandButton.js.map +1 -1
- package/dist/components/tables/RuiExpandButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTable.js.map +1 -1
- package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableEmptyState.js.map +1 -1
- package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableErrorState.js.map +1 -1
- package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableHead.js.map +1 -1
- package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTableLoadingState.js.map +1 -1
- package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiTablePagination.js.map +1 -1
- package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableAppendRow.js +7 -0
- package/dist/components/tables/data-table/RuiDataTableAppendRow.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableAppendRow.vue.d.ts +26 -0
- package/dist/components/tables/data-table/RuiDataTableAppendRow.vue_vue_type_script_setup_true_lang.js +39 -0
- package/dist/components/tables/data-table/RuiDataTableAppendRow.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tables/data-table/RuiDataTableBody.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableBody.vue.d.ts +5 -1
- package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js +18 -10
- package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableCell.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableCell.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableCell.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableEmptyRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableEmptyRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableErrorRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableErrorRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableGroupRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableMobileSort.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableRow.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableRow.vue.d.ts +5 -1
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +144 -88
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/context.d.ts +1 -1
- package/dist/components/tables/data-table-styles.js +1 -1
- package/dist/components/tables/data-table-styles.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.vue.d.ts +1 -1
- package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.js.map +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/time-picker/RuiTimePicker.js.map +1 -1
- package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js +12 -8
- package/dist/components/time-picker/RuiTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/composables/floating.d.ts +1 -1
- package/dist/composables/icons.d.ts +1 -1
- package/dist/composables/icons.js +1 -7
- package/dist/composables/icons.js.map +1 -1
- package/dist/composables/tables/data-table/columns.d.ts +1 -1
- package/dist/composables/tables/data-table/grouping.d.ts +1 -1
- package/dist/composables/tables/data-table/page-scroll.d.ts +1 -1
- package/dist/composables/tables/data-table/pagination.d.ts +2 -2
- package/dist/composables/tables/data-table/sort.d.ts +2 -2
- package/dist/composables/tables/data-table/types.d.ts +2 -2
- package/dist/i18n/keys.d.ts +9 -0
- package/dist/i18n/keys.js +9 -0
- package/dist/i18n/keys.js.map +1 -1
- package/dist/icons/icons_1.d.ts +26 -26
- package/dist/icons/icons_1.js +348 -365
- package/dist/icons/icons_1.js.map +1 -1
- package/dist/icons/icons_2.d.ts +28 -28
- package/dist/icons/icons_2.js +434 -323
- package/dist/icons/icons_2.js.map +1 -1
- package/dist/icons/icons_3.d.ts +32 -32
- package/dist/icons/icons_3.js +334 -364
- package/dist/icons/icons_3.js.map +1 -1
- package/dist/icons/icons_4.d.ts +64 -64
- package/dist/icons/icons_4.js +769 -669
- package/dist/icons/icons_4.js.map +1 -1
- package/dist/icons/icons_5.d.ts +66 -9
- package/dist/icons/icons_5.js +693 -83
- package/dist/icons/icons_5.js.map +1 -1
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +108 -51
- package/dist/icons/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -6
- package/dist/style.css +26 -4
- package/dist/types/theme.d.ts +1 -1
- package/dist/utils/tv.d.ts +1 -1
- package/dist/vendor/@vueuse/core/dist/index.js +63 -55
- package/dist/vendor/@vueuse/core/dist/index.js.map +1 -1
- package/dist/vendor/@vueuse/shared/dist/index.js +4 -4
- package/dist/vendor/@vueuse/shared/dist/index.js.map +1 -1
- package/dist/web-types.json +88 -4
- package/package.json +26 -26
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/tables/data-table/RuiDataTableGroupRow.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { GroupHeader } from '@/composables/tables/data-table/types';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiTooltip from '@/components/overlays/tooltip/RuiTooltip.vue';\nimport { useDataTableGrouping, useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\nimport { GroupExpandButtonPosition } from '@/components/tables/table-props';\n\nconst { row } = defineProps<{\n row: GroupHeader<T>;\n}>();\n\ndefineSlots<{\n 'group.header'?: (props: {\n colspan: number;\n header: GroupHeader<T>;\n isOpen: boolean;\n toggle: () => void;\n }) => any;\n 'group.header.content'?: (props: { header: GroupHeader<T>; groupKey: string }) => any;\n}>();\n\nconst { classes, colspan, isMobile } = useDataTableStyling();\n\n/**\n * On mobile the group header reads as a rounded section label, separated from\n * the previous group's cards above and its own below, aligned to the card\n * content padding.\n */\nconst mobileGroupClass = 'mt-6 first:mt-0 mb-2 rounded-rui-card';\nconst {\n getGroupSize,\n groupExpandButtonPosition,\n groupKey,\n groupLabels,\n isExpandedGroup,\n onCopyGroup,\n onToggleExpandGroup,\n onUngroup,\n} = useDataTableGrouping<T>();\n\nconst isOpen = computed<boolean>(() => isExpandedGroup(row.group));\nconst groupSize = computed<number>(() => getGroupSize(row.identifier));\n\n/** One label/value pair per grouped column, e.g. `Username: amartin`. */\nconst groupParts = computed<{ key: string; label: string; value: string }[]>(() => {\n const values = new Map<string, unknown>(Object.entries(row.group));\n return get(groupLabels).map(({ key, label }) => {\n const value = values.get(key);\n return { key, label, value: value === undefined || value === null ? '' : String(value) };\n });\n});\n</script>\n\n<template>\n <tr\n :class=\"[classes.trGroup, isMobile ? mobileGroupClass : '']\"\n data-id=\"row-group\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"group.header\"\n :colspan=\"colspan\"\n :header=\"row\"\n :is-open=\"isOpen\"\n :toggle=\"() => onToggleExpandGroup(row.group, row.identifier)\"\n >\n <td\n class=\"px-4! py-2!\"\n :class=\"[classes.td, { 'h-auto': !isMobile }]\"\n :colspan=\"colspan\"\n >\n <div class=\"flex items-center gap-2\">\n <!-- the edge controls pull in by their own padding so their icons sit on the cell grid -->\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === GroupExpandButtonPosition.start\"\n class=\"-ml-1.5\"\n aria-label=\"Expand group\"\n :expanded=\"isOpen\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n :group-key=\"groupKey ?? ''\"\n name=\"group.header.content\"\n :header=\"row\"\n >\n <span\n class=\"flex flex-wrap items-baseline gap-x-3\"\n data-id=\"group-label\"\n >\n <span\n v-for=\"part in groupParts\"\n :key=\"part.key\"\n >\n <span class=\"text-rui-text-secondary\">{{ part.label }}:</span>\n <span class=\"font-medium ml-1\">{{ part.value }}</span>\n </span>\n </span>\n <span\n class=\"rounded-full bg-rui-hover px-2 text-caption text-rui-text-secondary\"\n data-id=\"group-size\"\n >\n {{ groupSize }}\n </span>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-copy-button\"\n aria-label=\"Copy group\"\n @click=\"onCopyGroup(row)\"\n >\n <RuiIcon\n name=\"lu-copy\"\n size=\"16\"\n />\n </RuiButton>\n </slot>\n <RuiTooltip\n :options=\"{ placement: 'top' }\"\n class=\"ml-auto\"\n :class=\"{ '-mr-1.5': groupExpandButtonPosition !== GroupExpandButtonPosition.end }\"\n >\n <template #activator>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-ungroup-button\"\n aria-label=\"Ungroup\"\n @click=\"onUngroup()\"\n >\n <RuiIcon\n name=\"lu-ungroup\"\n size=\"16\"\n />\n </RuiButton>\n </template>\n Ungroup\n </RuiTooltip>\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === GroupExpandButtonPosition.end\"\n class=\"-mr-1.5\"\n aria-label=\"Expand group\"\n :expanded=\"isOpen\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n </div>\n </td>\n </slot>\n </tr>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8BA,IAAM,mBAAmB;;;;;EAPzB,MAAM,EAAE,SAAS,SAAS,aAAa,oBAAoB;;;;;;EAQ3D,MAAM,EACJ,cACA,2BACA,UACA,aACA,iBACA,aACA,qBACA,cACE,qBAAwB;EAE5B,MAAM,SAAS,eAAwB,gBAAgB,QAAA,IAAI,KAAK,CAAC;EACjE,MAAM,YAAY,eAAuB,aAAa,QAAA,IAAI,UAAU,CAAC;;EAGrE,MAAM,aAAa,eAAgE;GACjF,MAAM,SAAS,IAAI,IAAqB,OAAO,QAAQ,QAAA,IAAI,KAAK,CAAC;GACjE,OAAO,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,KAAK,YAAY;IAC9C,MAAM,QAAQ,OAAO,IAAI,GAAG;IAC5B,OAAO;KAAE;KAAK;KAAO,OAAO,UAAU,KAAA,KAAa,UAAU,OAAO,KAAK,OAAO,KAAK;IAAE;GACzF,CAAC;EACH,CAAC;;GAIC,
|
|
1
|
+
{"version":3,"file":"RuiDataTableGroupRow.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot","_createElementVNode","_createBlock","RuiExpandButton","_createCommentVNode","_Fragment","_renderList","_toDisplayString","_createVNode","RuiButton","_withCtx","RuiIcon","RuiTooltip","_createTextVNode"],"sources":["../../../../src/components/tables/data-table/RuiDataTableGroupRow.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { GroupHeader } from '@/composables/tables/data-table/types';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiTooltip from '@/components/overlays/tooltip/RuiTooltip.vue';\nimport { useDataTableGrouping, useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\nimport { GroupExpandButtonPosition } from '@/components/tables/table-props';\n\nconst { row } = defineProps<{\n row: GroupHeader<T>;\n}>();\n\ndefineSlots<{\n 'group.header'?: (props: {\n colspan: number;\n header: GroupHeader<T>;\n isOpen: boolean;\n toggle: () => void;\n }) => any;\n 'group.header.content'?: (props: { header: GroupHeader<T>; groupKey: string }) => any;\n}>();\n\nconst { classes, colspan, isMobile } = useDataTableStyling();\n\n/**\n * On mobile the group header reads as a rounded section label, separated from\n * the previous group's cards above and its own below, aligned to the card\n * content padding.\n */\nconst mobileGroupClass = 'mt-6 first:mt-0 mb-2 rounded-rui-card';\nconst {\n getGroupSize,\n groupExpandButtonPosition,\n groupKey,\n groupLabels,\n isExpandedGroup,\n onCopyGroup,\n onToggleExpandGroup,\n onUngroup,\n} = useDataTableGrouping<T>();\n\nconst isOpen = computed<boolean>(() => isExpandedGroup(row.group));\nconst groupSize = computed<number>(() => getGroupSize(row.identifier));\n\n/** One label/value pair per grouped column, e.g. `Username: amartin`. */\nconst groupParts = computed<{ key: string; label: string; value: string }[]>(() => {\n const values = new Map<string, unknown>(Object.entries(row.group));\n return get(groupLabels).map(({ key, label }) => {\n const value = values.get(key);\n return { key, label, value: value === undefined || value === null ? '' : String(value) };\n });\n});\n</script>\n\n<template>\n <tr\n :class=\"[classes.trGroup, isMobile ? mobileGroupClass : '']\"\n data-id=\"row-group\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"group.header\"\n :colspan=\"colspan\"\n :header=\"row\"\n :is-open=\"isOpen\"\n :toggle=\"() => onToggleExpandGroup(row.group, row.identifier)\"\n >\n <td\n class=\"px-4! py-2!\"\n :class=\"[classes.td, { 'h-auto': !isMobile }]\"\n :colspan=\"colspan\"\n >\n <div class=\"flex items-center gap-2\">\n <!-- the edge controls pull in by their own padding so their icons sit on the cell grid -->\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === GroupExpandButtonPosition.start\"\n class=\"-ml-1.5\"\n aria-label=\"Expand group\"\n :expanded=\"isOpen\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n :group-key=\"groupKey ?? ''\"\n name=\"group.header.content\"\n :header=\"row\"\n >\n <span\n class=\"flex flex-wrap items-baseline gap-x-3\"\n data-id=\"group-label\"\n >\n <span\n v-for=\"part in groupParts\"\n :key=\"part.key\"\n >\n <span class=\"text-rui-text-secondary\">{{ part.label }}:</span>\n <span class=\"font-medium ml-1\">{{ part.value }}</span>\n </span>\n </span>\n <span\n class=\"rounded-full bg-rui-hover px-2 text-caption text-rui-text-secondary\"\n data-id=\"group-size\"\n >\n {{ groupSize }}\n </span>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-copy-button\"\n aria-label=\"Copy group\"\n @click=\"onCopyGroup(row)\"\n >\n <RuiIcon\n name=\"lu-copy\"\n size=\"16\"\n />\n </RuiButton>\n </slot>\n <RuiTooltip\n :options=\"{ placement: 'top' }\"\n class=\"ml-auto\"\n :class=\"{ '-mr-1.5': groupExpandButtonPosition !== GroupExpandButtonPosition.end }\"\n >\n <template #activator>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-ungroup-button\"\n aria-label=\"Ungroup\"\n @click=\"onUngroup()\"\n >\n <RuiIcon\n name=\"lu-ungroup\"\n size=\"16\"\n />\n </RuiButton>\n </template>\n Ungroup\n </RuiTooltip>\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === GroupExpandButtonPosition.end\"\n class=\"-mr-1.5\"\n aria-label=\"Expand group\"\n :expanded=\"isOpen\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n </div>\n </td>\n </slot>\n </tr>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiDataTableLoadingRow.js","names":[],"sources":["../../../../src/components/tables/data-table/RuiDataTableLoadingRow.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiTableLoadingState from '@/components/tables/RuiTableLoadingState.vue';\n\nconst { classes, colspan } = useDataTableStyling();\n</script>\n\n<template>\n <tr>\n <td\n :class=\"classes.tbodyLoader\"\n :colspan=\"colspan\"\n data-id=\"tbody-loader\"\n >\n <RuiTableLoadingState />\n </td>\n </tr>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"RuiDataTableLoadingRow.js","names":["_sfc_main"],"sources":["../../../../src/components/tables/data-table/RuiDataTableLoadingRow.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiTableLoadingState from '@/components/tables/RuiTableLoadingState.vue';\n\nconst { classes, colspan } = useDataTableStyling();\n</script>\n\n<template>\n <tr>\n <td\n :class=\"classes.tbodyLoader\"\n :colspan=\"colspan\"\n data-id=\"tbody-loader\"\n >\n <RuiTableLoadingState />\n </td>\n </tr>\n</template>\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/tables/data-table/RuiDataTableLoadingRow.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiTableLoadingState from '@/components/tables/RuiTableLoadingState.vue';\n\nconst { classes, colspan } = useDataTableStyling();\n</script>\n\n<template>\n <tr>\n <td\n :class=\"classes.tbodyLoader\"\n :colspan=\"colspan\"\n data-id=\"tbody-loader\"\n >\n <RuiTableLoadingState />\n </td>\n </tr>\n</template>\n"],"mappings":";;;;;;;;EAIA,MAAM,EAAE,SAAS,YAAY,oBAAoB;;GAI/C,
|
|
1
|
+
{"version":3,"file":"RuiDataTableLoadingRow.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createElementVNode","_normalizeClass","_unref","_createVNode","RuiTableLoadingState"],"sources":["../../../../src/components/tables/data-table/RuiDataTableLoadingRow.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiTableLoadingState from '@/components/tables/RuiTableLoadingState.vue';\n\nconst { classes, colspan } = useDataTableStyling();\n</script>\n\n<template>\n <tr>\n <td\n :class=\"classes.tbodyLoader\"\n :colspan=\"colspan\"\n data-id=\"tbody-loader\"\n >\n <RuiTableLoadingState />\n </td>\n </tr>\n</template>\n"],"mappings":";;;;;;;;EAIA,MAAM,EAAE,SAAS,YAAY,oBAAoB;;GAI/C,OAAAA,UAAA,GAAAC,mBAQK,MAAA,MAAA,CAPHC,mBAMK,MAAA;IALF,OAAKC,eAAEC,MAAA,OAAA,CAAO,CAAC,WAAW;IAC1B,SAASA,MAAA,OAAA;IACV,WAAQ;GAERC,GAAAA,CAAAA,YAAwBC,4BAAA,CAAA,GAAA,IAAA,UAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiDataTableMobileSort.js","names":[],"sources":["../../../../src/components/tables/data-table/RuiDataTableMobileSort.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { SortColumn, TableColumn, TableRowKey } from '@/components/tables/RuiTableHead.vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport { SortDirection } from '@/components/tables/table-props';\n\nconst {\n columns,\n columnAttr = 'label',\n sortedMap,\n dense = false,\n} = defineProps<{\n columns: TableColumn<T>[];\n columnAttr?: keyof TableColumn<T>;\n sortedMap: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n dense?: boolean;\n}>();\n\nconst emit = defineEmits<{\n sort: [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst sortableColumns = computed<TableColumn<T>[]>(() => columns.filter(column => column.sortable));\n\nfunction columnLabel(column: TableColumn<T>): string {\n const label = column[columnAttr];\n return label === undefined || label === null ? String(column.key) : String(label);\n}\n\nfunction sortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key as TableRowKey<T>]?.direction;\n}\n\nfunction isActive(key: TableColumn<T>['key']): boolean {\n return (key as TableRowKey<T>) in sortedMap;\n}\n\nconst activeLabel = computed<string>(() => {\n const active = get(sortableColumns).filter(column => isActive(column.key));\n if (active.length === 0)\n return 'Sort';\n if (active.length === 1)\n return columnLabel(active[0]!);\n return `${active.length} sorts`;\n});\n\n/**\n * Emits the column's configured default direction, as RuiTableHead does, so\n * the sort composable runs the same asc, desc, none cycle on repeat taps.\n */\nfunction onSelect(column: TableColumn<T>): void {\n emit('sort', {\n key: column.key as TableRowKey<T>,\n direction: (column.direction as SortDirection | undefined) ?? SortDirection.asc,\n });\n}\n</script>\n\n<template>\n <RuiMenu\n :dense=\"dense\"\n :options=\"{ placement: 'bottom-end' }\"\n data-id=\"table-mobile-sort\"\n >\n <template #activator=\"{ attrs }\">\n <RuiButton\n :size=\"dense ? 'sm' : undefined\"\n variant=\"outlined\"\n v-bind=\"attrs\"\n data-id=\"table-mobile-sort-activator\"\n >\n <template #prepend>\n <RuiIcon\n name=\"lu-arrow-up-down\"\n size=\"18\"\n />\n </template>\n {{ activeLabel }}\n </RuiButton>\n </template>\n <div class=\"py-1 min-w-40\">\n <RuiButton\n v-for=\"column in sortableColumns\"\n :key=\"column.key.toString()\"\n variant=\"text\"\n size=\"sm\"\n class=\"justify-between! w-full rounded-none!\"\n :data-id=\"`table-mobile-sort-option-${column.key}`\"\n :data-active=\"isActive(column.key)\"\n :data-direction=\"sortDirection(column.key)\"\n @click=\"onSelect(column)\"\n >\n {{ columnLabel(column) }}\n <template #append>\n <RuiIcon\n v-if=\"isActive(column.key)\"\n name=\"lu-arrow-down\"\n :class=\"sortDirection(column.key) === 'asc' ? 'rotate-180' : ''\"\n size=\"16\"\n />\n <span\n v-else\n class=\"w-4\"\n />\n </template>\n </RuiButton>\n </div>\n </RuiMenu>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"RuiDataTableMobileSort.js","names":["_sfc_main"],"sources":["../../../../src/components/tables/data-table/RuiDataTableMobileSort.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { SortColumn, TableColumn, TableRowKey } from '@/components/tables/RuiTableHead.vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport { SortDirection } from '@/components/tables/table-props';\n\nconst {\n columns,\n columnAttr = 'label',\n sortedMap,\n dense = false,\n} = defineProps<{\n columns: TableColumn<T>[];\n columnAttr?: keyof TableColumn<T>;\n sortedMap: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n dense?: boolean;\n}>();\n\nconst emit = defineEmits<{\n sort: [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst sortableColumns = computed<TableColumn<T>[]>(() => columns.filter(column => column.sortable));\n\nfunction columnLabel(column: TableColumn<T>): string {\n const label = column[columnAttr];\n return label === undefined || label === null ? String(column.key) : String(label);\n}\n\nfunction sortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key as TableRowKey<T>]?.direction;\n}\n\nfunction isActive(key: TableColumn<T>['key']): boolean {\n return (key as TableRowKey<T>) in sortedMap;\n}\n\nconst activeLabel = computed<string>(() => {\n const active = get(sortableColumns).filter(column => isActive(column.key));\n if (active.length === 0)\n return 'Sort';\n if (active.length === 1)\n return columnLabel(active[0]!);\n return `${active.length} sorts`;\n});\n\n/**\n * Emits the column's configured default direction, as RuiTableHead does, so\n * the sort composable runs the same asc, desc, none cycle on repeat taps.\n */\nfunction onSelect(column: TableColumn<T>): void {\n emit('sort', {\n key: column.key as TableRowKey<T>,\n direction: (column.direction as SortDirection | undefined) ?? SortDirection.asc,\n });\n}\n</script>\n\n<template>\n <RuiMenu\n :dense=\"dense\"\n :options=\"{ placement: 'bottom-end' }\"\n data-id=\"table-mobile-sort\"\n >\n <template #activator=\"{ attrs }\">\n <RuiButton\n :size=\"dense ? 'sm' : undefined\"\n variant=\"outlined\"\n v-bind=\"attrs\"\n data-id=\"table-mobile-sort-activator\"\n >\n <template #prepend>\n <RuiIcon\n name=\"lu-arrow-up-down\"\n size=\"18\"\n />\n </template>\n {{ activeLabel }}\n </RuiButton>\n </template>\n <div class=\"py-1 min-w-40\">\n <RuiButton\n v-for=\"column in sortableColumns\"\n :key=\"column.key.toString()\"\n variant=\"text\"\n size=\"sm\"\n class=\"justify-between! w-full rounded-none!\"\n :data-id=\"`table-mobile-sort-option-${column.key}`\"\n :data-active=\"isActive(column.key)\"\n :data-direction=\"sortDirection(column.key)\"\n @click=\"onSelect(column)\"\n >\n {{ columnLabel(column) }}\n <template #append>\n <RuiIcon\n v-if=\"isActive(column.key)\"\n name=\"lu-arrow-down\"\n :class=\"sortDirection(column.key) === 'asc' ? 'rotate-180' : ''\"\n size=\"16\"\n />\n <span\n v-else\n class=\"w-4\"\n />\n </template>\n </RuiButton>\n </div>\n </RuiMenu>\n</template>\n"],"mappings":""}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SortColumn, TableColumn, TableRowKey } from '../RuiTableHead.vue';
|
|
1
|
+
import type { SortColumn, TableColumn, TableRowKey } from '../RuiTableHead.vue.js';
|
|
2
2
|
import { SortDirection } from '../table-props.js';
|
|
3
3
|
declare const __VLS_export: <T extends object>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
4
4
|
props: import("vue").PublicProps & __VLS_PrettifyLocal<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/tables/data-table/RuiDataTableMobileSort.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { SortColumn, TableColumn, TableRowKey } from '@/components/tables/RuiTableHead.vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport { SortDirection } from '@/components/tables/table-props';\n\nconst {\n columns,\n columnAttr = 'label',\n sortedMap,\n dense = false,\n} = defineProps<{\n columns: TableColumn<T>[];\n columnAttr?: keyof TableColumn<T>;\n sortedMap: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n dense?: boolean;\n}>();\n\nconst emit = defineEmits<{\n sort: [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst sortableColumns = computed<TableColumn<T>[]>(() => columns.filter(column => column.sortable));\n\nfunction columnLabel(column: TableColumn<T>): string {\n const label = column[columnAttr];\n return label === undefined || label === null ? String(column.key) : String(label);\n}\n\nfunction sortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key as TableRowKey<T>]?.direction;\n}\n\nfunction isActive(key: TableColumn<T>['key']): boolean {\n return (key as TableRowKey<T>) in sortedMap;\n}\n\nconst activeLabel = computed<string>(() => {\n const active = get(sortableColumns).filter(column => isActive(column.key));\n if (active.length === 0)\n return 'Sort';\n if (active.length === 1)\n return columnLabel(active[0]!);\n return `${active.length} sorts`;\n});\n\n/**\n * Emits the column's configured default direction, as RuiTableHead does, so\n * the sort composable runs the same asc, desc, none cycle on repeat taps.\n */\nfunction onSelect(column: TableColumn<T>): void {\n emit('sort', {\n key: column.key as TableRowKey<T>,\n direction: (column.direction as SortDirection | undefined) ?? SortDirection.asc,\n });\n}\n</script>\n\n<template>\n <RuiMenu\n :dense=\"dense\"\n :options=\"{ placement: 'bottom-end' }\"\n data-id=\"table-mobile-sort\"\n >\n <template #activator=\"{ attrs }\">\n <RuiButton\n :size=\"dense ? 'sm' : undefined\"\n variant=\"outlined\"\n v-bind=\"attrs\"\n data-id=\"table-mobile-sort-activator\"\n >\n <template #prepend>\n <RuiIcon\n name=\"lu-arrow-up-down\"\n size=\"18\"\n />\n </template>\n {{ activeLabel }}\n </RuiButton>\n </template>\n <div class=\"py-1 min-w-40\">\n <RuiButton\n v-for=\"column in sortableColumns\"\n :key=\"column.key.toString()\"\n variant=\"text\"\n size=\"sm\"\n class=\"justify-between! w-full rounded-none!\"\n :data-id=\"`table-mobile-sort-option-${column.key}`\"\n :data-active=\"isActive(column.key)\"\n :data-direction=\"sortDirection(column.key)\"\n @click=\"onSelect(column)\"\n >\n {{ columnLabel(column) }}\n <template #append>\n <RuiIcon\n v-if=\"isActive(column.key)\"\n name=\"lu-arrow-down\"\n :class=\"sortDirection(column.key) === 'asc' ? 'rotate-180' : ''\"\n size=\"16\"\n />\n <span\n v-else\n class=\"w-4\"\n />\n </template>\n </RuiButton>\n </div>\n </RuiMenu>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,OAAO;EAIb,MAAM,kBAAkB,eAAiC,QAAA,QAAQ,QAAO,WAAU,OAAO,QAAQ,CAAC;EAElG,SAAS,YAAY,QAAgC;GACnD,MAAM,QAAQ,OAAO,QAAA;GACrB,OAAO,UAAU,KAAA,KAAa,UAAU,OAAO,OAAO,OAAO,GAAG,IAAI,OAAO,KAAK;EAClF;EAEA,SAAS,cAAc,KAAuD;GAC5E,OAAO,QAAA,UAAU,IAAsB,EAAE;EAC3C;EAEA,SAAS,SAAS,KAAqC;GACrD,OAAQ,OAA0B,QAAA;EACpC;EAEA,MAAM,cAAc,eAAuB;GACzC,MAAM,SAAS,IAAI,eAAe,CAAC,CAAC,QAAO,WAAU,SAAS,OAAO,GAAG,CAAC;GACzE,IAAI,OAAO,WAAW,GACpB,OAAO;GACT,IAAI,OAAO,WAAW,GACpB,OAAO,YAAY,OAAO,EAAG;GAC/B,OAAO,GAAG,OAAO,OAAO;EAC1B,CAAC;;;;;EAMD,SAAS,SAAS,QAA8B;GAC9C,KAAK,QAAQ;IACX,KAAK,OAAO;IACZ,WAAY,OAAO,aAA2C,cAAc;GAC9E,CAAC;EACH;;GAIE,
|
|
1
|
+
{"version":3,"file":"RuiDataTableMobileSort.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createBlock","RuiMenu","_withCtx","_createVNode","RuiButton","_mergeProps","RuiIcon","_createTextVNode","_toDisplayString","_unref","_createElementVNode","_createElementBlock","_Fragment","_renderList","_normalizeClass"],"sources":["../../../../src/components/tables/data-table/RuiDataTableMobileSort.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { SortColumn, TableColumn, TableRowKey } from '@/components/tables/RuiTableHead.vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport { SortDirection } from '@/components/tables/table-props';\n\nconst {\n columns,\n columnAttr = 'label',\n sortedMap,\n dense = false,\n} = defineProps<{\n columns: TableColumn<T>[];\n columnAttr?: keyof TableColumn<T>;\n sortedMap: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n dense?: boolean;\n}>();\n\nconst emit = defineEmits<{\n sort: [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst sortableColumns = computed<TableColumn<T>[]>(() => columns.filter(column => column.sortable));\n\nfunction columnLabel(column: TableColumn<T>): string {\n const label = column[columnAttr];\n return label === undefined || label === null ? String(column.key) : String(label);\n}\n\nfunction sortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key as TableRowKey<T>]?.direction;\n}\n\nfunction isActive(key: TableColumn<T>['key']): boolean {\n return (key as TableRowKey<T>) in sortedMap;\n}\n\nconst activeLabel = computed<string>(() => {\n const active = get(sortableColumns).filter(column => isActive(column.key));\n if (active.length === 0)\n return 'Sort';\n if (active.length === 1)\n return columnLabel(active[0]!);\n return `${active.length} sorts`;\n});\n\n/**\n * Emits the column's configured default direction, as RuiTableHead does, so\n * the sort composable runs the same asc, desc, none cycle on repeat taps.\n */\nfunction onSelect(column: TableColumn<T>): void {\n emit('sort', {\n key: column.key as TableRowKey<T>,\n direction: (column.direction as SortDirection | undefined) ?? SortDirection.asc,\n });\n}\n</script>\n\n<template>\n <RuiMenu\n :dense=\"dense\"\n :options=\"{ placement: 'bottom-end' }\"\n data-id=\"table-mobile-sort\"\n >\n <template #activator=\"{ attrs }\">\n <RuiButton\n :size=\"dense ? 'sm' : undefined\"\n variant=\"outlined\"\n v-bind=\"attrs\"\n data-id=\"table-mobile-sort-activator\"\n >\n <template #prepend>\n <RuiIcon\n name=\"lu-arrow-up-down\"\n size=\"18\"\n />\n </template>\n {{ activeLabel }}\n </RuiButton>\n </template>\n <div class=\"py-1 min-w-40\">\n <RuiButton\n v-for=\"column in sortableColumns\"\n :key=\"column.key.toString()\"\n variant=\"text\"\n size=\"sm\"\n class=\"justify-between! w-full rounded-none!\"\n :data-id=\"`table-mobile-sort-option-${column.key}`\"\n :data-active=\"isActive(column.key)\"\n :data-direction=\"sortDirection(column.key)\"\n @click=\"onSelect(column)\"\n >\n {{ columnLabel(column) }}\n <template #append>\n <RuiIcon\n v-if=\"isActive(column.key)\"\n name=\"lu-arrow-down\"\n :class=\"sortDirection(column.key) === 'asc' ? 'rotate-180' : ''\"\n size=\"16\"\n />\n <span\n v-else\n class=\"w-4\"\n />\n </template>\n </RuiButton>\n </div>\n </RuiMenu>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,OAAO;EAIb,MAAM,kBAAkB,eAAiC,QAAA,QAAQ,QAAO,WAAU,OAAO,QAAQ,CAAC;EAElG,SAAS,YAAY,QAAgC;GACnD,MAAM,QAAQ,OAAO,QAAA;GACrB,OAAO,UAAU,KAAA,KAAa,UAAU,OAAO,OAAO,OAAO,GAAG,IAAI,OAAO,KAAK;EAClF;EAEA,SAAS,cAAc,KAAuD;GAC5E,OAAO,QAAA,UAAU,IAAsB,EAAE;EAC3C;EAEA,SAAS,SAAS,KAAqC;GACrD,OAAQ,OAA0B,QAAA;EACpC;EAEA,MAAM,cAAc,eAAuB;GACzC,MAAM,SAAS,IAAI,eAAe,CAAC,CAAC,QAAO,WAAU,SAAS,OAAO,GAAG,CAAC;GACzE,IAAI,OAAO,WAAW,GACpB,OAAO;GACT,IAAI,OAAO,WAAW,GACpB,OAAO,YAAY,OAAO,EAAG;GAC/B,OAAO,GAAG,OAAO,OAAO;EAC1B,CAAC;;;;;EAMD,SAAS,SAAS,QAA8B;GAC9C,KAAK,QAAQ;IACX,KAAK,OAAO;IACZ,WAAY,OAAO,aAA2C,cAAc;GAC9E,CAAC;EACH;;GAIE,OAAAA,UAAA,GAAAC,YAgDUC,iBAAA;IA/CP,OAAO,QAAA;IACP,SAAS,EAAA,WAAA,aAAA;IACV,WAAQ;;IAEG,WAASC,SAcN,EAdU,YAAK,CAC3BC,YAaYC,mBAbZC,WAaY;KAZT,MAAM,QAAA,QAAK,OAAU,KAAA;KACtB,SAAQ;IACA,GAAA,OAAK,EACb,WAAQ,8BAA6B,CAAA,GAAA;KAE1B,SAAOH,cAId,CAHFC,YAGEG,iBAAA;MAFA,MAAK;MACL,MAAK;;KAEE,SAAAJ,cACX,CADWK,gBAAA,MACXC,gBAAGC,MAAA,WAAA,CAAW,GAAA,CAAA,CAAA,CAAA;;;IAGlB,SAAAP,cA0BM,CA1BNQ,mBA0BM,OA1BN,YA0BM,EAzBJX,UAAA,IAAA,GAAAY,mBAwBYC,UAAA,MAAAC,WAvBOJ,MAAA,eAAA,IAAV,WAAM;KADf,OAAAV,UAAA,GAAAC,YAwBYI,mBAAA;MAtBT,KAAK,OAAO,IAAI,SAAQ;MACzB,SAAQ;MACR,MAAK;MACL,OAAM;MACL,WAAO,4BAA8B,OAAO;MAC5C,eAAa,SAAS,OAAO,GAAG;MAChC,kBAAgB,cAAc,OAAO,GAAG;MACxC,UAAK,WAAE,SAAS,MAAM;;MAGZ,QAAMF,cAMb,CAJM,SAAS,OAAO,GAAG,KAD3BH,UAAA,GAAAC,YAKEM,iBAAA;;OAHA,MAAK;OACJ,OAAKQ,eAAE,cAAc,OAAO,GAAG,MAAA,QAAA,eAAA,EAAA;OAChC,MAAK;MAEPf,GAAAA,MAAAA,GAAAA,CAAAA,OAAAA,CAAAA,MAAAA,UAAA,GAAAY,mBAGE,QAHF,UAGE,EAAA,CAAA;MAXJ,SAAAT,cAAyB,CAAtBK,gBAAAC,gBAAA,YAAY,MAAM,CAAA,IAAI,KACzB,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiDataTableRow.js","names":[],"sources":["../../../../src/components/tables/data-table/RuiDataTableRow.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { TableColumn } from '@/components/tables/RuiTableHead.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport { useDataTableColumns, useDataTableExpansion, useDataTableRowIdentity, useDataTableSelection, useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiDataTableCell from '@/components/tables/data-table/RuiDataTableCell.vue';\nimport RuiDataTableExpandedRow from '@/components/tables/data-table/RuiDataTableExpandedRow.vue';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\n\nconst {\n row,\n index,\n} = defineProps<{\n row: T;\n index: number;\n}>();\n\nconst slots = defineSlots<Partial<\n Record<`item.${string}`, (props: { column: TableColumn<T>; row: T; index: number }) => any> & {\n 'expanded-item'?: (props: { row: T; index: number }) => any;\n }\n>>();\n\nconst { classes, dense, isMobile } = useDataTableStyling();\nconst { cellValue, columns, itemSlotKeys } = useDataTableColumns<T>();\nconst { isDisabledRow, isSelected, onCheckboxClick, onSelect, selectedData } = useDataTableSelection<T>();\nconst { expandable, isExpanded, onToggleExpand } = useDataTableExpansion<T>();\nconst { getRowId, itemClass } = useDataTableRowIdentity<T>();\n\nconst rowId = computed<T[keyof T]>(() => getRowId(row));\nconst selected = computed<boolean>(() => isSelected(get(rowId)));\nconst disabled = computed<boolean>(() => isDisabledRow(get(rowId)));\nconst expanded = computed<boolean>(() => get(expandable) && !!slots['expanded-item'] && isExpanded(get(rowId)));\n\n/** How long a closing panel stays to fade out; matches its `duration-100`. */\nconst PANEL_LEAVE_MS = 100;\n\nconst reducedMotion = usePreferredReducedMotion();\n\n/**\n * Whether the panel is in the DOM, which outlasts `expanded` by its fade-out.\n *\n * @remarks\n * Not a `<Transition>`: test utilities stub that with an element, which lands inside the consumer's\n * `<tbody>` and shifts every `tr:nth-child` its specs count. The fade-in is CSS `@starting-style`.\n */\nconst panelShown = ref<boolean>(get(expanded));\nconst panelClosing = ref<boolean>(false);\n\nconst { start: finishClosing, stop: cancelClosing } = useTimeoutFn(() => {\n set(panelShown, false);\n set(panelClosing, false);\n}, PANEL_LEAVE_MS, { immediate: false });\n\nwatch(expanded, (open) => {\n if (open) {\n cancelClosing();\n set(panelClosing, false);\n set(panelShown, true);\n return;\n }\n if (!get(panelShown))\n return;\n if (get(reducedMotion) === 'reduce') {\n set(panelShown, false);\n return;\n }\n set(panelClosing, true);\n finishClosing();\n});\n\nconst rowClass = computed<string>(() => typeof itemClass === 'string' ? itemClass : itemClass(row));\n\n/** Selection wins over the open-panel shade, so a selected row still reads as selected. */\nconst stateClass = computed<string>(() => {\n if (get(selected))\n return get(classes).trSelected;\n if (get(expanded))\n return get(classes).trExpandedParent;\n return get(classes).tr;\n});\n\n/**\n * A column is pinned to the mobile card header when it is flagged\n * `mobileHeader`, typically an action column, or when it is the\n * auto-generated expand column.\n */\nfunction isMobileHeaderColumn(column: TableColumn<T>): boolean {\n return !!column.mobileHeader || column.key === 'expand';\n}\n\n/**\n * A pinned column only earns a spot in the header if it renders something: the\n * expand toggle, a provided item slot, or a non-empty cell value. Without this,\n * a pinned column with no content, such as an action column whose\n * `#item.action` slot a nested table does not provide, leaves an empty header\n * bar with just its divider line.\n */\nfunction mobileHeaderColumnHasContent(column: TableColumn<T>): boolean {\n if (column.key === 'expand')\n return true;\n if (itemSlotKeys.has(column.key.toString()))\n return true;\n const value = cellValue(row, column.key);\n return value !== undefined && value !== null && value !== '';\n}\n\n/**\n * In the stacked mobile layout, header columns render in the card header row\n * instead of as a label/value pair. Everything else stacks below in the body.\n */\nconst mobileHeaderColumns = computed<TableColumn<T>[]>(() =>\n get(isMobile) ? get(columns).filter(column => isMobileHeaderColumn(column) && mobileHeaderColumnHasContent(column)) : [],\n);\nconst bodyColumns = computed<TableColumn<T>[]>(() =>\n get(isMobile) ? get(columns).filter(column => !isMobileHeaderColumn(column)) : get(columns),\n);\nconst showMobileHeader = computed<boolean>(() =>\n get(isMobile) && (!!get(selectedData) || get(mobileHeaderColumns).length > 0),\n);\n\n/**\n * Without a selection checkbox the header bar would hold only the pinned\n * actions, so they float in the card's top-right corner instead and the first\n * field row makes room for them.\n */\nconst compactMobileHeader = computed<boolean>(() =>\n get(showMobileHeader) && !get(selectedData) && get(bodyColumns).length > 0,\n);\n\n/** Room for each floating action, about one small icon button wide. */\nconst firstRowInset = computed<Record<string, string> | undefined>(() =>\n get(compactMobileHeader) ? { paddingRight: `${get(mobileHeaderColumns).length * 2 + 1}rem` } : undefined,\n);\n\n/**\n * `border-y!` defeats the `divide-y-0` on the mobile tbody, which otherwise\n * zeroes the top and bottom border on every card except the first. An expanded\n * card flattens its bottom edge so the expanded panel attaches flush beneath\n * it.\n *\n * These bindings do not run through the class merger, so each state picks its\n * own utilities rather than emitting conflicting ones.\n */\nconst mobileCardClass = computed<string>(() => {\n const shared = 'relative flex flex-col border border-y! border-rui-divider overflow-hidden';\n return get(expanded)\n ? `${shared} rounded-t-rui-card mb-0`\n : `${shared} rounded-rui-card mb-3 last:mb-0`;\n});\n</script>\n\n<template>\n <tr\n :class=\"[stateClass, rowClass, isMobile ? mobileCardClass : '']\"\n :aria-selected=\"selectedData ? selected : undefined\"\n data-id=\"row\"\n >\n <!-- Mobile card header: checkbox on the left, pinned action columns on the right -->\n <td\n v-if=\"showMobileHeader\"\n :class=\"compactMobileHeader\n ? 'absolute top-0 right-0 z-1 flex items-center gap-1 px-2 py-1'\n : 'flex items-center justify-between gap-2 px-4 py-2 border-b border-rui-divider'\"\n data-id=\"mobile-card-header\"\n >\n <RuiCheckbox\n v-if=\"selectedData\"\n :data-id=\"`table-toggle-check-${index}`\"\n aria-label=\"Select row\"\n :model-value=\"selected\"\n :disabled=\"disabled\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, rowId, true)\"\n @click=\"onCheckboxClick($event, rowId, index)\"\n />\n <span v-else-if=\"!compactMobileHeader\" />\n\n <div\n v-if=\"mobileHeaderColumns.length > 0\"\n class=\"flex items-center gap-1 min-w-0\"\n >\n <template\n v-for=\"(column, headerIndex) in mobileHeaderColumns\"\n :key=\"`header-${headerIndex}`\"\n >\n <slot\n v-if=\"itemSlotKeys.has(column.key.toString())\"\n :name=\"`item.${column.key.toString()}`\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n />\n <RuiExpandButton\n v-else-if=\"column.key === 'expand'\"\n :expanded=\"isExpanded(rowId)\"\n @click=\"onToggleExpand(row)\"\n />\n <template v-else>\n {{ cellValue(row, column.key) }}\n </template>\n </template>\n </div>\n </td>\n\n <!-- Desktop checkbox cell -->\n <td\n v-else-if=\"selectedData && !isMobile\"\n :class=\"classes.checkbox\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :data-id=\"`table-toggle-check-${index}`\"\n aria-label=\"Select row\"\n :model-value=\"selected\"\n :disabled=\"disabled\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, rowId, true)\"\n @click=\"onCheckboxClick($event, rowId, index)\"\n />\n </td>\n\n <RuiDataTableCell\n v-for=\"(column, subIndex) in bodyColumns\"\n :key=\"subIndex\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n :row-id=\"rowId\"\n :style=\"subIndex === 0 ? firstRowInset : undefined\"\n >\n <template\n v-if=\"itemSlotKeys.has(column.key.toString())\"\n #default=\"slotData\"\n >\n <slot\n :name=\"`item.${column.key.toString()}`\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableCell>\n </tr>\n\n <!-- opacity only: the rows below move once, at once, rather than sliding with a growing height -->\n <RuiDataTableExpandedRow\n v-if=\"panelShown\"\n class=\"transition-opacity starting:opacity-0 motion-reduce:transition-none\"\n :class=\"panelClosing ? 'opacity-0 duration-100 ease-in' : 'duration-150 ease-out'\"\n :row=\"row\"\n :index=\"index\"\n >\n <template\n v-if=\"slots['expanded-item']\"\n #expanded-item=\"slotData\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"expanded-item\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableExpandedRow>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"RuiDataTableRow.js","names":["_sfc_main"],"sources":["../../../../src/components/tables/data-table/RuiDataTableRow.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { TableColumn } from '@/components/tables/RuiTableHead.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport { useDataTableColumns, useDataTableExpansion, useDataTableRowIdentity, useDataTableSelection, useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiDataTableAppendRow from '@/components/tables/data-table/RuiDataTableAppendRow.vue';\nimport RuiDataTableCell from '@/components/tables/data-table/RuiDataTableCell.vue';\nimport RuiDataTableExpandedRow from '@/components/tables/data-table/RuiDataTableExpandedRow.vue';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\n\nconst {\n row,\n index,\n} = defineProps<{\n row: T;\n index: number;\n}>();\n\nconst slots = defineSlots<Partial<\n Record<`item.${string}`, (props: { column: TableColumn<T>; row: T; index: number }) => any> & {\n 'expanded-item'?: (props: { row: T; index: number }) => any;\n 'row-append'?: (props: { row: T; index: number }) => any;\n }\n>>();\n\nconst { classes, dense, isMobile } = useDataTableStyling();\nconst { cellValue, columns, itemSlotKeys } = useDataTableColumns<T>();\nconst { isDisabledRow, isSelected, onCheckboxClick, onSelect, selectedData } = useDataTableSelection<T>();\nconst { expandable, isExpanded, onToggleExpand } = useDataTableExpansion<T>();\nconst { getRowId, itemClass } = useDataTableRowIdentity<T>();\n\nconst rowId = computed<T[keyof T]>(() => getRowId(row));\nconst selected = computed<boolean>(() => isSelected(get(rowId)));\nconst disabled = computed<boolean>(() => isDisabledRow(get(rowId)));\nconst expanded = computed<boolean>(() => get(expandable) && !!slots['expanded-item'] && isExpanded(get(rowId)));\n\n/** How long a closing panel stays to fade out; matches its `duration-100`. */\nconst PANEL_LEAVE_MS = 100;\n\nconst reducedMotion = usePreferredReducedMotion();\n\n/**\n * Whether the panel is in the DOM, which outlasts `expanded` by its fade-out.\n *\n * @remarks\n * Not a `<Transition>`: test utilities stub that with an element, which lands inside the consumer's\n * `<tbody>` and shifts every `tr:nth-child` its specs count. The fade-in is CSS `@starting-style`.\n */\nconst panelShown = ref<boolean>(get(expanded));\nconst panelClosing = ref<boolean>(false);\n\nconst { start: finishClosing, stop: cancelClosing } = useTimeoutFn(() => {\n set(panelShown, false);\n set(panelClosing, false);\n}, PANEL_LEAVE_MS, { immediate: false });\n\nwatch(expanded, (open) => {\n if (open) {\n cancelClosing();\n set(panelClosing, false);\n set(panelShown, true);\n return;\n }\n if (!get(panelShown))\n return;\n if (get(reducedMotion) === 'reduce') {\n set(panelShown, false);\n return;\n }\n set(panelClosing, true);\n finishClosing();\n});\n\nconst rowClass = computed<string>(() => typeof itemClass === 'string' ? itemClass : itemClass(row));\n\n/** Selection wins over the open-panel shade, so a selected row still reads as selected. */\nconst stateClass = computed<string>(() => {\n if (get(selected))\n return get(classes).trSelected;\n if (get(expanded))\n return get(classes).trExpandedParent;\n return get(classes).tr;\n});\n\n/** Whether the row has a follow-up row, which reads as the second half of the same item. */\nconst appended = computed<boolean>(() => !!slots['row-append']);\n\n/**\n * The stripe follows the item, not the `<tr>`: counting rows would shade an item and its follow-up\n * differently, and an open panel would flip every stripe below it. The table's `striped` variant\n * shades the marked rows.\n */\nconst stripe = computed<'' | undefined>(() => (index % 2 === 1 ? '' : undefined));\n\n/**\n * The two rows of an item highlight together, whichever one the pointer is over. An open row keeps\n * its band rather than taking the hover, as it does without a follow-up.\n */\nconst pairHoverClass = computed<string>(() => {\n if (!get(appended) || get(expanded) || get(isMobile))\n return '';\n return 'has-[+[data-id=row-append]:hover]:bg-rui-hover';\n});\nconst appendHoverClass = computed<string>(() => {\n if (get(expanded) || get(isMobile))\n return '';\n return '[[data-id=row]:hover+&]:bg-rui-hover';\n});\n\n/**\n * On mobile the follow-up is the bottom of the item's card: square on top, against the card, and\n * rounded below unless an open panel follows it.\n */\nconst mobileAppendClass = computed<string>(() => {\n const shared = 'block border-x border-b! border-rui-divider overflow-hidden';\n return get(expanded) ? shared : `${shared} rounded-b-rui-card mb-3`;\n});\n\n/**\n * A column is pinned to the mobile card header when it is flagged\n * `mobileHeader`, typically an action column, or when it is the\n * auto-generated expand column.\n */\nfunction isMobileHeaderColumn(column: TableColumn<T>): boolean {\n return !!column.mobileHeader || column.key === 'expand';\n}\n\n/**\n * A pinned column only earns a spot in the header if it renders something: the\n * expand toggle, a provided item slot, or a non-empty cell value. Without this,\n * a pinned column with no content, such as an action column whose\n * `#item.action` slot a nested table does not provide, leaves an empty header\n * bar with just its divider line.\n */\nfunction mobileHeaderColumnHasContent(column: TableColumn<T>): boolean {\n if (column.key === 'expand')\n return true;\n if (itemSlotKeys.has(column.key.toString()))\n return true;\n const value = cellValue(row, column.key);\n return value !== undefined && value !== null && value !== '';\n}\n\n/**\n * In the stacked mobile layout, header columns render in the card header row\n * instead of as a label/value pair. Everything else stacks below in the body.\n */\nconst mobileHeaderColumns = computed<TableColumn<T>[]>(() =>\n get(isMobile) ? get(columns).filter(column => isMobileHeaderColumn(column) && mobileHeaderColumnHasContent(column)) : [],\n);\nconst bodyColumns = computed<TableColumn<T>[]>(() =>\n get(isMobile) ? get(columns).filter(column => !isMobileHeaderColumn(column)) : get(columns),\n);\nconst showMobileHeader = computed<boolean>(() =>\n get(isMobile) && (!!get(selectedData) || get(mobileHeaderColumns).length > 0),\n);\n\n/**\n * Without a selection checkbox the header bar would hold only the pinned\n * actions, so they float in the card's top-right corner instead and the first\n * field row makes room for them.\n */\nconst compactMobileHeader = computed<boolean>(() =>\n get(showMobileHeader) && !get(selectedData) && get(bodyColumns).length > 0,\n);\n\n/** Room for each floating action, about one small icon button wide. */\nconst firstRowInset = computed<Record<string, string> | undefined>(() =>\n get(compactMobileHeader) ? { paddingRight: `${get(mobileHeaderColumns).length * 2 + 1}rem` } : undefined,\n);\n\n/**\n * `border-y!` defeats the `divide-y-0` on the mobile tbody, which otherwise\n * zeroes the top and bottom border on every card except the first. An expanded\n * card flattens its bottom edge so the expanded panel attaches flush beneath\n * it. A card with a follow-up row drops its bottom border too, so the\n * follow-up continues it with no line between them, as on desktop.\n *\n * These bindings do not run through the class merger, so each state picks its\n * own utilities rather than emitting conflicting ones.\n */\nconst mobileCardClass = computed<string>(() => {\n if (get(appended))\n return 'relative flex flex-col border-x border-t! border-rui-divider overflow-hidden rounded-t-rui-card mb-0';\n const shared = 'relative flex flex-col border border-y! border-rui-divider overflow-hidden';\n return get(expanded)\n ? `${shared} rounded-t-rui-card mb-0`\n : `${shared} rounded-rui-card mb-3 last:mb-0`;\n});\n</script>\n\n<template>\n <tr\n :class=\"[stateClass, rowClass, pairHoverClass, isMobile ? mobileCardClass : '']\"\n :aria-selected=\"selectedData ? selected : undefined\"\n :data-stripe=\"stripe\"\n data-id=\"row\"\n >\n <!-- Mobile card header: checkbox on the left, pinned action columns on the right -->\n <td\n v-if=\"showMobileHeader\"\n :class=\"compactMobileHeader\n ? 'absolute top-0 right-0 z-1 flex items-center gap-1 px-2 py-1'\n : 'flex items-center justify-between gap-2 px-4 py-2 border-b border-rui-divider'\"\n data-id=\"mobile-card-header\"\n >\n <RuiCheckbox\n v-if=\"selectedData\"\n :data-id=\"`table-toggle-check-${index}`\"\n aria-label=\"Select row\"\n :model-value=\"selected\"\n :disabled=\"disabled\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, rowId, true)\"\n @click=\"onCheckboxClick($event, rowId, index)\"\n />\n <span v-else-if=\"!compactMobileHeader\" />\n\n <div\n v-if=\"mobileHeaderColumns.length > 0\"\n class=\"flex items-center gap-1 min-w-0\"\n >\n <template\n v-for=\"(column, headerIndex) in mobileHeaderColumns\"\n :key=\"`header-${headerIndex}`\"\n >\n <slot\n v-if=\"itemSlotKeys.has(column.key.toString())\"\n :name=\"`item.${column.key.toString()}`\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n />\n <RuiExpandButton\n v-else-if=\"column.key === 'expand'\"\n :expanded=\"isExpanded(rowId)\"\n @click=\"onToggleExpand(row)\"\n />\n <template v-else>\n {{ cellValue(row, column.key) }}\n </template>\n </template>\n </div>\n </td>\n\n <!-- Desktop checkbox cell -->\n <td\n v-else-if=\"selectedData && !isMobile\"\n :class=\"classes.checkbox\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :data-id=\"`table-toggle-check-${index}`\"\n aria-label=\"Select row\"\n :model-value=\"selected\"\n :disabled=\"disabled\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, rowId, true)\"\n @click=\"onCheckboxClick($event, rowId, index)\"\n />\n </td>\n\n <RuiDataTableCell\n v-for=\"(column, subIndex) in bodyColumns\"\n :key=\"subIndex\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n :row-id=\"rowId\"\n :style=\"subIndex === 0 ? firstRowInset : undefined\"\n >\n <template\n v-if=\"itemSlotKeys.has(column.key.toString())\"\n #default=\"slotData\"\n >\n <slot\n :name=\"`item.${column.key.toString()}`\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableCell>\n </tr>\n\n <!-- no divider above: with its row it is one item, sharing the row's state, stripe and hover -->\n <RuiDataTableAppendRow\n v-if=\"slots['row-append']\"\n class=\"border-t-0!\"\n :class=\"[stateClass, rowClass, appendHoverClass, isMobile ? mobileAppendClass : '']\"\n :data-stripe=\"stripe\"\n :row=\"row\"\n :index=\"index\"\n >\n <template #row-append=\"slotData\">\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"row-append\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableAppendRow>\n\n <!-- opacity only: the rows below move once, at once, rather than sliding with a growing height -->\n <RuiDataTableExpandedRow\n v-if=\"panelShown\"\n class=\"transition-opacity starting:opacity-0 motion-reduce:transition-none\"\n :class=\"panelClosing ? 'opacity-0 duration-100 ease-in' : 'duration-150 ease-out'\"\n :row=\"row\"\n :index=\"index\"\n >\n <template\n v-if=\"slots['expanded-item']\"\n #expanded-item=\"slotData\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"expanded-item\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableExpandedRow>\n</template>\n"],"mappings":""}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TableColumn } from '../RuiTableHead.vue';
|
|
1
|
+
import type { TableColumn } from '../RuiTableHead.vue.js';
|
|
2
2
|
declare const __VLS_export: <T extends object>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
|
|
3
3
|
props: import("vue").PublicProps & __VLS_PrettifyLocal<{
|
|
4
4
|
row: T;
|
|
@@ -17,6 +17,10 @@ declare const __VLS_export: <T extends object>(__VLS_props: NonNullable<Awaited<
|
|
|
17
17
|
row: T;
|
|
18
18
|
index: number;
|
|
19
19
|
}) => any;
|
|
20
|
+
'row-append'?: (props: {
|
|
21
|
+
row: T;
|
|
22
|
+
index: number;
|
|
23
|
+
}) => any;
|
|
20
24
|
}>;
|
|
21
25
|
emit: {};
|
|
22
26
|
}>) => import("vue").VNode & {
|
package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js
CHANGED
|
@@ -3,11 +3,12 @@ import { usePreferredReducedMotion } from "../../../vendor/@vueuse/core/dist/ind
|
|
|
3
3
|
import RuiCheckbox_default from "../../forms/checkbox/RuiCheckbox.js";
|
|
4
4
|
import { useDataTableColumns, useDataTableExpansion, useDataTableRowIdentity, useDataTableSelection, useDataTableStyling } from "./context.js";
|
|
5
5
|
import RuiExpandButton_default from "../RuiExpandButton.js";
|
|
6
|
+
import RuiDataTableAppendRow_default from "./RuiDataTableAppendRow.js";
|
|
6
7
|
import RuiDataTableCell_default from "./RuiDataTableCell.js";
|
|
7
8
|
import RuiDataTableExpandedRow_default from "./RuiDataTableExpandedRow.js";
|
|
8
9
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, guardReactiveProps, mergeProps, normalizeClass, normalizeProps, normalizeStyle, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useSlots, watch, withCtx } from "vue";
|
|
9
10
|
//#region src/components/tables/data-table/RuiDataTableRow.vue?vue&type=script&setup=true&lang.ts
|
|
10
|
-
var _hoisted_1 = ["aria-selected"];
|
|
11
|
+
var _hoisted_1 = ["aria-selected", "data-stripe"];
|
|
11
12
|
var _hoisted_2 = { key: 1 };
|
|
12
13
|
var _hoisted_3 = {
|
|
13
14
|
key: 2,
|
|
@@ -68,6 +69,34 @@ var RuiDataTableRow_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
68
69
|
if (get(expanded)) return get(classes).trExpandedParent;
|
|
69
70
|
return get(classes).tr;
|
|
70
71
|
});
|
|
72
|
+
/** Whether the row has a follow-up row, which reads as the second half of the same item. */
|
|
73
|
+
const appended = computed(() => !!slots["row-append"]);
|
|
74
|
+
/**
|
|
75
|
+
* The stripe follows the item, not the `<tr>`: counting rows would shade an item and its follow-up
|
|
76
|
+
* differently, and an open panel would flip every stripe below it. The table's `striped` variant
|
|
77
|
+
* shades the marked rows.
|
|
78
|
+
*/
|
|
79
|
+
const stripe = computed(() => __props.index % 2 === 1 ? "" : void 0);
|
|
80
|
+
/**
|
|
81
|
+
* The two rows of an item highlight together, whichever one the pointer is over. An open row keeps
|
|
82
|
+
* its band rather than taking the hover, as it does without a follow-up.
|
|
83
|
+
*/
|
|
84
|
+
const pairHoverClass = computed(() => {
|
|
85
|
+
if (!get(appended) || get(expanded) || get(isMobile)) return "";
|
|
86
|
+
return "has-[+[data-id=row-append]:hover]:bg-rui-hover";
|
|
87
|
+
});
|
|
88
|
+
const appendHoverClass = computed(() => {
|
|
89
|
+
if (get(expanded) || get(isMobile)) return "";
|
|
90
|
+
return "[[data-id=row]:hover+&]:bg-rui-hover";
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* On mobile the follow-up is the bottom of the item's card: square on top, against the card, and
|
|
94
|
+
* rounded below unless an open panel follows it.
|
|
95
|
+
*/
|
|
96
|
+
const mobileAppendClass = computed(() => {
|
|
97
|
+
const shared = "block border-x border-b! border-rui-divider overflow-hidden";
|
|
98
|
+
return get(expanded) ? shared : `${shared} rounded-b-rui-card mb-3`;
|
|
99
|
+
});
|
|
71
100
|
/**
|
|
72
101
|
* A column is pinned to the mobile card header when it is flagged
|
|
73
102
|
* `mobileHeader`, typically an action column, or when it is the
|
|
@@ -108,109 +137,136 @@ var RuiDataTableRow_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/
|
|
|
108
137
|
* `border-y!` defeats the `divide-y-0` on the mobile tbody, which otherwise
|
|
109
138
|
* zeroes the top and bottom border on every card except the first. An expanded
|
|
110
139
|
* card flattens its bottom edge so the expanded panel attaches flush beneath
|
|
111
|
-
* it.
|
|
140
|
+
* it. A card with a follow-up row drops its bottom border too, so the
|
|
141
|
+
* follow-up continues it with no line between them, as on desktop.
|
|
112
142
|
*
|
|
113
143
|
* These bindings do not run through the class merger, so each state picks its
|
|
114
144
|
* own utilities rather than emitting conflicting ones.
|
|
115
145
|
*/
|
|
116
146
|
const mobileCardClass = computed(() => {
|
|
147
|
+
if (get(appended)) return "relative flex flex-col border-x border-t! border-rui-divider overflow-hidden rounded-t-rui-card mb-0";
|
|
117
148
|
const shared = "relative flex flex-col border border-y! border-rui-divider overflow-hidden";
|
|
118
149
|
return get(expanded) ? `${shared} rounded-t-rui-card mb-0` : `${shared} rounded-rui-card mb-3 last:mb-0`;
|
|
119
150
|
});
|
|
120
151
|
return (_ctx, _cache) => {
|
|
121
|
-
return openBlock(), createElementBlock(Fragment, null, [
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
"
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
return openBlock(), createElementBlock(Fragment, null, [
|
|
153
|
+
createElementVNode("tr", {
|
|
154
|
+
class: normalizeClass([
|
|
155
|
+
unref(stateClass),
|
|
156
|
+
unref(rowClass),
|
|
157
|
+
unref(pairHoverClass),
|
|
158
|
+
unref(isMobile) ? unref(mobileCardClass) : ""
|
|
159
|
+
]),
|
|
160
|
+
"aria-selected": unref(selectedData) ? unref(selected) : void 0,
|
|
161
|
+
"data-stripe": unref(stripe),
|
|
162
|
+
"data-id": "row"
|
|
163
|
+
}, [unref(showMobileHeader) ? (openBlock(), createElementBlock("td", {
|
|
164
|
+
key: 0,
|
|
165
|
+
class: normalizeClass(unref(compactMobileHeader) ? "absolute top-0 right-0 z-1 flex items-center gap-1 px-2 py-1" : "flex items-center justify-between gap-2 px-4 py-2 border-b border-rui-divider"),
|
|
166
|
+
"data-id": "mobile-card-header"
|
|
167
|
+
}, [unref(selectedData) ? (openBlock(), createBlock(RuiCheckbox_default, {
|
|
168
|
+
key: 0,
|
|
169
|
+
"data-id": `table-toggle-check-${__props.index}`,
|
|
170
|
+
"aria-label": "Select row",
|
|
171
|
+
"model-value": unref(selected),
|
|
172
|
+
disabled: unref(disabled),
|
|
173
|
+
size: unref(dense) ? "sm" : void 0,
|
|
174
|
+
color: "primary",
|
|
175
|
+
class: "select-none",
|
|
176
|
+
"hide-details": "",
|
|
177
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => unref(onSelect)($event, unref(rowId), true)),
|
|
178
|
+
onClick: _cache[1] || (_cache[1] = ($event) => unref(onCheckboxClick)($event, unref(rowId), __props.index))
|
|
179
|
+
}, null, 8, [
|
|
180
|
+
"data-id",
|
|
181
|
+
"model-value",
|
|
182
|
+
"disabled",
|
|
183
|
+
"size"
|
|
184
|
+
])) : !unref(compactMobileHeader) ? (openBlock(), createElementBlock("span", _hoisted_2)) : createCommentVNode("", true), unref(mobileHeaderColumns).length > 0 ? (openBlock(), createElementBlock("div", _hoisted_3, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(mobileHeaderColumns), (column, headerIndex) => {
|
|
185
|
+
return openBlock(), createElementBlock(Fragment, { key: `header-${headerIndex}` }, [unref(itemSlotKeys).has(column.key.toString()) ? renderSlot(_ctx.$slots, `item.${column.key.toString()}`, {
|
|
186
|
+
column,
|
|
187
|
+
row: __props.row,
|
|
188
|
+
index: __props.index
|
|
189
|
+
}, void 0, void 0, 0) : column.key === "expand" ? (openBlock(), createBlock(RuiExpandButton_default, {
|
|
190
|
+
key: 1,
|
|
191
|
+
expanded: unref(isExpanded)(unref(rowId)),
|
|
192
|
+
onClick: _cache[2] || (_cache[2] = ($event) => unref(onToggleExpand)(__props.row))
|
|
193
|
+
}, null, 8, ["expanded"])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [createTextVNode(toDisplayString(unref(cellValue)(__props.row, column.key)), 1)], 64))], 64);
|
|
194
|
+
}), 128))])) : createCommentVNode("", true)], 2)) : unref(selectedData) && !unref(isMobile) ? (openBlock(), createElementBlock("td", {
|
|
195
|
+
key: 1,
|
|
196
|
+
class: normalizeClass(unref(classes).checkbox),
|
|
197
|
+
colspan: "1",
|
|
198
|
+
rowspan: "1"
|
|
199
|
+
}, [createVNode(RuiCheckbox_default, {
|
|
200
|
+
"data-id": `table-toggle-check-${__props.index}`,
|
|
201
|
+
"aria-label": "Select row",
|
|
202
|
+
"model-value": unref(selected),
|
|
203
|
+
disabled: unref(disabled),
|
|
204
|
+
size: unref(dense) ? "sm" : void 0,
|
|
205
|
+
color: "primary",
|
|
206
|
+
class: "select-none",
|
|
207
|
+
"hide-details": "",
|
|
208
|
+
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => unref(onSelect)($event, unref(rowId), true)),
|
|
209
|
+
onClick: _cache[4] || (_cache[4] = ($event) => unref(onCheckboxClick)($event, unref(rowId), __props.index))
|
|
210
|
+
}, null, 8, [
|
|
211
|
+
"data-id",
|
|
212
|
+
"model-value",
|
|
213
|
+
"disabled",
|
|
214
|
+
"size"
|
|
215
|
+
])], 2)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(unref(bodyColumns), (column, subIndex) => {
|
|
216
|
+
return openBlock(), createBlock(RuiDataTableCell_default, {
|
|
217
|
+
key: subIndex,
|
|
218
|
+
column,
|
|
219
|
+
row: __props.row,
|
|
220
|
+
index: __props.index,
|
|
221
|
+
"row-id": unref(rowId),
|
|
222
|
+
style: normalizeStyle(subIndex === 0 ? unref(firstRowInset) : void 0)
|
|
223
|
+
}, createSlots({ _: 2 }, [unref(itemSlotKeys).has(column.key.toString()) ? {
|
|
224
|
+
name: "default",
|
|
225
|
+
fn: withCtx((slotData) => [renderSlot(_ctx.$slots, `item.${column.key.toString()}`, mergeProps({ ref_for: true }, slotData))]),
|
|
226
|
+
key: "0"
|
|
227
|
+
} : void 0]), 1032, [
|
|
228
|
+
"column",
|
|
229
|
+
"row",
|
|
230
|
+
"index",
|
|
231
|
+
"row-id",
|
|
232
|
+
"style"
|
|
233
|
+
]);
|
|
234
|
+
}), 128))], 10, _hoisted_1),
|
|
235
|
+
slots["row-append"] ? (openBlock(), createBlock(RuiDataTableAppendRow_default, {
|
|
236
|
+
key: 0,
|
|
237
|
+
class: normalizeClass(["border-t-0!", [
|
|
238
|
+
unref(stateClass),
|
|
239
|
+
unref(rowClass),
|
|
240
|
+
unref(appendHoverClass),
|
|
241
|
+
unref(isMobile) ? unref(mobileAppendClass) : ""
|
|
242
|
+
]]),
|
|
243
|
+
"data-stripe": unref(stripe),
|
|
153
244
|
row: __props.row,
|
|
154
245
|
index: __props.index
|
|
155
|
-
},
|
|
246
|
+
}, {
|
|
247
|
+
"row-append": withCtx((slotData) => [renderSlot(_ctx.$slots, "row-append", normalizeProps(guardReactiveProps(slotData)))]),
|
|
248
|
+
_: 3
|
|
249
|
+
}, 8, [
|
|
250
|
+
"class",
|
|
251
|
+
"data-stripe",
|
|
252
|
+
"row",
|
|
253
|
+
"index"
|
|
254
|
+
])) : createCommentVNode("", true),
|
|
255
|
+
unref(panelShown) ? (openBlock(), createBlock(RuiDataTableExpandedRow_default, {
|
|
156
256
|
key: 1,
|
|
157
|
-
|
|
158
|
-
onClick: _cache[2] || (_cache[2] = ($event) => unref(onToggleExpand)(__props.row))
|
|
159
|
-
}, null, 8, ["expanded"])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [createTextVNode(toDisplayString(unref(cellValue)(__props.row, column.key)), 1)], 64))], 64);
|
|
160
|
-
}), 128))])) : createCommentVNode("", true)], 2)) : unref(selectedData) && !unref(isMobile) ? (openBlock(), createElementBlock("td", {
|
|
161
|
-
key: 1,
|
|
162
|
-
class: normalizeClass(unref(classes).checkbox),
|
|
163
|
-
colspan: "1",
|
|
164
|
-
rowspan: "1"
|
|
165
|
-
}, [createVNode(RuiCheckbox_default, {
|
|
166
|
-
"data-id": `table-toggle-check-${__props.index}`,
|
|
167
|
-
"aria-label": "Select row",
|
|
168
|
-
"model-value": unref(selected),
|
|
169
|
-
disabled: unref(disabled),
|
|
170
|
-
size: unref(dense) ? "sm" : void 0,
|
|
171
|
-
color: "primary",
|
|
172
|
-
class: "select-none",
|
|
173
|
-
"hide-details": "",
|
|
174
|
-
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => unref(onSelect)($event, unref(rowId), true)),
|
|
175
|
-
onClick: _cache[4] || (_cache[4] = ($event) => unref(onCheckboxClick)($event, unref(rowId), __props.index))
|
|
176
|
-
}, null, 8, [
|
|
177
|
-
"data-id",
|
|
178
|
-
"model-value",
|
|
179
|
-
"disabled",
|
|
180
|
-
"size"
|
|
181
|
-
])], 2)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(unref(bodyColumns), (column, subIndex) => {
|
|
182
|
-
return openBlock(), createBlock(RuiDataTableCell_default, {
|
|
183
|
-
key: subIndex,
|
|
184
|
-
column,
|
|
257
|
+
class: normalizeClass(["transition-opacity starting:opacity-0 motion-reduce:transition-none", unref(panelClosing) ? "opacity-0 duration-100 ease-in" : "duration-150 ease-out"]),
|
|
185
258
|
row: __props.row,
|
|
186
|
-
index: __props.index
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
name: "default",
|
|
191
|
-
fn: withCtx((slotData) => [renderSlot(_ctx.$slots, `item.${column.key.toString()}`, mergeProps({ ref_for: true }, slotData))]),
|
|
259
|
+
index: __props.index
|
|
260
|
+
}, createSlots({ _: 2 }, [slots["expanded-item"] ? {
|
|
261
|
+
name: "expanded-item",
|
|
262
|
+
fn: withCtx((slotData) => [renderSlot(_ctx.$slots, "expanded-item", normalizeProps(guardReactiveProps(slotData)))]),
|
|
192
263
|
key: "0"
|
|
193
264
|
} : void 0]), 1032, [
|
|
194
|
-
"
|
|
265
|
+
"class",
|
|
195
266
|
"row",
|
|
196
|
-
"index"
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
]);
|
|
200
|
-
}), 128))], 10, _hoisted_1), unref(panelShown) ? (openBlock(), createBlock(RuiDataTableExpandedRow_default, {
|
|
201
|
-
key: 0,
|
|
202
|
-
class: normalizeClass(["transition-opacity starting:opacity-0 motion-reduce:transition-none", unref(panelClosing) ? "opacity-0 duration-100 ease-in" : "duration-150 ease-out"]),
|
|
203
|
-
row: __props.row,
|
|
204
|
-
index: __props.index
|
|
205
|
-
}, createSlots({ _: 2 }, [slots["expanded-item"] ? {
|
|
206
|
-
name: "expanded-item",
|
|
207
|
-
fn: withCtx((slotData) => [renderSlot(_ctx.$slots, "expanded-item", normalizeProps(guardReactiveProps(slotData)))]),
|
|
208
|
-
key: "0"
|
|
209
|
-
} : void 0]), 1032, [
|
|
210
|
-
"class",
|
|
211
|
-
"row",
|
|
212
|
-
"index"
|
|
213
|
-
])) : createCommentVNode("", true)], 64);
|
|
267
|
+
"index"
|
|
268
|
+
])) : createCommentVNode("", true)
|
|
269
|
+
], 64);
|
|
214
270
|
};
|
|
215
271
|
}
|
|
216
272
|
});
|
package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiDataTableRow.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../../src/components/tables/data-table/RuiDataTableRow.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { TableColumn } from '@/components/tables/RuiTableHead.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport { useDataTableColumns, useDataTableExpansion, useDataTableRowIdentity, useDataTableSelection, useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiDataTableCell from '@/components/tables/data-table/RuiDataTableCell.vue';\nimport RuiDataTableExpandedRow from '@/components/tables/data-table/RuiDataTableExpandedRow.vue';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\n\nconst {\n row,\n index,\n} = defineProps<{\n row: T;\n index: number;\n}>();\n\nconst slots = defineSlots<Partial<\n Record<`item.${string}`, (props: { column: TableColumn<T>; row: T; index: number }) => any> & {\n 'expanded-item'?: (props: { row: T; index: number }) => any;\n }\n>>();\n\nconst { classes, dense, isMobile } = useDataTableStyling();\nconst { cellValue, columns, itemSlotKeys } = useDataTableColumns<T>();\nconst { isDisabledRow, isSelected, onCheckboxClick, onSelect, selectedData } = useDataTableSelection<T>();\nconst { expandable, isExpanded, onToggleExpand } = useDataTableExpansion<T>();\nconst { getRowId, itemClass } = useDataTableRowIdentity<T>();\n\nconst rowId = computed<T[keyof T]>(() => getRowId(row));\nconst selected = computed<boolean>(() => isSelected(get(rowId)));\nconst disabled = computed<boolean>(() => isDisabledRow(get(rowId)));\nconst expanded = computed<boolean>(() => get(expandable) && !!slots['expanded-item'] && isExpanded(get(rowId)));\n\n/** How long a closing panel stays to fade out; matches its `duration-100`. */\nconst PANEL_LEAVE_MS = 100;\n\nconst reducedMotion = usePreferredReducedMotion();\n\n/**\n * Whether the panel is in the DOM, which outlasts `expanded` by its fade-out.\n *\n * @remarks\n * Not a `<Transition>`: test utilities stub that with an element, which lands inside the consumer's\n * `<tbody>` and shifts every `tr:nth-child` its specs count. The fade-in is CSS `@starting-style`.\n */\nconst panelShown = ref<boolean>(get(expanded));\nconst panelClosing = ref<boolean>(false);\n\nconst { start: finishClosing, stop: cancelClosing } = useTimeoutFn(() => {\n set(panelShown, false);\n set(panelClosing, false);\n}, PANEL_LEAVE_MS, { immediate: false });\n\nwatch(expanded, (open) => {\n if (open) {\n cancelClosing();\n set(panelClosing, false);\n set(panelShown, true);\n return;\n }\n if (!get(panelShown))\n return;\n if (get(reducedMotion) === 'reduce') {\n set(panelShown, false);\n return;\n }\n set(panelClosing, true);\n finishClosing();\n});\n\nconst rowClass = computed<string>(() => typeof itemClass === 'string' ? itemClass : itemClass(row));\n\n/** Selection wins over the open-panel shade, so a selected row still reads as selected. */\nconst stateClass = computed<string>(() => {\n if (get(selected))\n return get(classes).trSelected;\n if (get(expanded))\n return get(classes).trExpandedParent;\n return get(classes).tr;\n});\n\n/**\n * A column is pinned to the mobile card header when it is flagged\n * `mobileHeader`, typically an action column, or when it is the\n * auto-generated expand column.\n */\nfunction isMobileHeaderColumn(column: TableColumn<T>): boolean {\n return !!column.mobileHeader || column.key === 'expand';\n}\n\n/**\n * A pinned column only earns a spot in the header if it renders something: the\n * expand toggle, a provided item slot, or a non-empty cell value. Without this,\n * a pinned column with no content, such as an action column whose\n * `#item.action` slot a nested table does not provide, leaves an empty header\n * bar with just its divider line.\n */\nfunction mobileHeaderColumnHasContent(column: TableColumn<T>): boolean {\n if (column.key === 'expand')\n return true;\n if (itemSlotKeys.has(column.key.toString()))\n return true;\n const value = cellValue(row, column.key);\n return value !== undefined && value !== null && value !== '';\n}\n\n/**\n * In the stacked mobile layout, header columns render in the card header row\n * instead of as a label/value pair. Everything else stacks below in the body.\n */\nconst mobileHeaderColumns = computed<TableColumn<T>[]>(() =>\n get(isMobile) ? get(columns).filter(column => isMobileHeaderColumn(column) && mobileHeaderColumnHasContent(column)) : [],\n);\nconst bodyColumns = computed<TableColumn<T>[]>(() =>\n get(isMobile) ? get(columns).filter(column => !isMobileHeaderColumn(column)) : get(columns),\n);\nconst showMobileHeader = computed<boolean>(() =>\n get(isMobile) && (!!get(selectedData) || get(mobileHeaderColumns).length > 0),\n);\n\n/**\n * Without a selection checkbox the header bar would hold only the pinned\n * actions, so they float in the card's top-right corner instead and the first\n * field row makes room for them.\n */\nconst compactMobileHeader = computed<boolean>(() =>\n get(showMobileHeader) && !get(selectedData) && get(bodyColumns).length > 0,\n);\n\n/** Room for each floating action, about one small icon button wide. */\nconst firstRowInset = computed<Record<string, string> | undefined>(() =>\n get(compactMobileHeader) ? { paddingRight: `${get(mobileHeaderColumns).length * 2 + 1}rem` } : undefined,\n);\n\n/**\n * `border-y!` defeats the `divide-y-0` on the mobile tbody, which otherwise\n * zeroes the top and bottom border on every card except the first. An expanded\n * card flattens its bottom edge so the expanded panel attaches flush beneath\n * it.\n *\n * These bindings do not run through the class merger, so each state picks its\n * own utilities rather than emitting conflicting ones.\n */\nconst mobileCardClass = computed<string>(() => {\n const shared = 'relative flex flex-col border border-y! border-rui-divider overflow-hidden';\n return get(expanded)\n ? `${shared} rounded-t-rui-card mb-0`\n : `${shared} rounded-rui-card mb-3 last:mb-0`;\n});\n</script>\n\n<template>\n <tr\n :class=\"[stateClass, rowClass, isMobile ? mobileCardClass : '']\"\n :aria-selected=\"selectedData ? selected : undefined\"\n data-id=\"row\"\n >\n <!-- Mobile card header: checkbox on the left, pinned action columns on the right -->\n <td\n v-if=\"showMobileHeader\"\n :class=\"compactMobileHeader\n ? 'absolute top-0 right-0 z-1 flex items-center gap-1 px-2 py-1'\n : 'flex items-center justify-between gap-2 px-4 py-2 border-b border-rui-divider'\"\n data-id=\"mobile-card-header\"\n >\n <RuiCheckbox\n v-if=\"selectedData\"\n :data-id=\"`table-toggle-check-${index}`\"\n aria-label=\"Select row\"\n :model-value=\"selected\"\n :disabled=\"disabled\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, rowId, true)\"\n @click=\"onCheckboxClick($event, rowId, index)\"\n />\n <span v-else-if=\"!compactMobileHeader\" />\n\n <div\n v-if=\"mobileHeaderColumns.length > 0\"\n class=\"flex items-center gap-1 min-w-0\"\n >\n <template\n v-for=\"(column, headerIndex) in mobileHeaderColumns\"\n :key=\"`header-${headerIndex}`\"\n >\n <slot\n v-if=\"itemSlotKeys.has(column.key.toString())\"\n :name=\"`item.${column.key.toString()}`\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n />\n <RuiExpandButton\n v-else-if=\"column.key === 'expand'\"\n :expanded=\"isExpanded(rowId)\"\n @click=\"onToggleExpand(row)\"\n />\n <template v-else>\n {{ cellValue(row, column.key) }}\n </template>\n </template>\n </div>\n </td>\n\n <!-- Desktop checkbox cell -->\n <td\n v-else-if=\"selectedData && !isMobile\"\n :class=\"classes.checkbox\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :data-id=\"`table-toggle-check-${index}`\"\n aria-label=\"Select row\"\n :model-value=\"selected\"\n :disabled=\"disabled\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, rowId, true)\"\n @click=\"onCheckboxClick($event, rowId, index)\"\n />\n </td>\n\n <RuiDataTableCell\n v-for=\"(column, subIndex) in bodyColumns\"\n :key=\"subIndex\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n :row-id=\"rowId\"\n :style=\"subIndex === 0 ? firstRowInset : undefined\"\n >\n <template\n v-if=\"itemSlotKeys.has(column.key.toString())\"\n #default=\"slotData\"\n >\n <slot\n :name=\"`item.${column.key.toString()}`\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableCell>\n </tr>\n\n <!-- opacity only: the rows below move once, at once, rather than sliding with a growing height -->\n <RuiDataTableExpandedRow\n v-if=\"panelShown\"\n class=\"transition-opacity starting:opacity-0 motion-reduce:transition-none\"\n :class=\"panelClosing ? 'opacity-0 duration-100 ease-in' : 'duration-150 ease-out'\"\n :row=\"row\"\n :index=\"index\"\n >\n <template\n v-if=\"slots['expanded-item']\"\n #expanded-item=\"slotData\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"expanded-item\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableExpandedRow>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RuiDataTableRow.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_Fragment","_createElementVNode","_normalizeClass","_unref","_createBlock","RuiCheckbox","_createCommentVNode","_renderList","_renderSlot","RuiExpandButton","_createTextVNode","_toDisplayString","_createVNode","RuiDataTableCell","_normalizeStyle","_createSlots","_withCtx","_mergeProps","RuiDataTableAppendRow","_normalizeProps","_guardReactiveProps","RuiDataTableExpandedRow"],"sources":["../../../../src/components/tables/data-table/RuiDataTableRow.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object\">\nimport type { TableColumn } from '@/components/tables/RuiTableHead.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport { useDataTableColumns, useDataTableExpansion, useDataTableRowIdentity, useDataTableSelection, useDataTableStyling } from '@/components/tables/data-table/context';\nimport RuiDataTableAppendRow from '@/components/tables/data-table/RuiDataTableAppendRow.vue';\nimport RuiDataTableCell from '@/components/tables/data-table/RuiDataTableCell.vue';\nimport RuiDataTableExpandedRow from '@/components/tables/data-table/RuiDataTableExpandedRow.vue';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\n\nconst {\n row,\n index,\n} = defineProps<{\n row: T;\n index: number;\n}>();\n\nconst slots = defineSlots<Partial<\n Record<`item.${string}`, (props: { column: TableColumn<T>; row: T; index: number }) => any> & {\n 'expanded-item'?: (props: { row: T; index: number }) => any;\n 'row-append'?: (props: { row: T; index: number }) => any;\n }\n>>();\n\nconst { classes, dense, isMobile } = useDataTableStyling();\nconst { cellValue, columns, itemSlotKeys } = useDataTableColumns<T>();\nconst { isDisabledRow, isSelected, onCheckboxClick, onSelect, selectedData } = useDataTableSelection<T>();\nconst { expandable, isExpanded, onToggleExpand } = useDataTableExpansion<T>();\nconst { getRowId, itemClass } = useDataTableRowIdentity<T>();\n\nconst rowId = computed<T[keyof T]>(() => getRowId(row));\nconst selected = computed<boolean>(() => isSelected(get(rowId)));\nconst disabled = computed<boolean>(() => isDisabledRow(get(rowId)));\nconst expanded = computed<boolean>(() => get(expandable) && !!slots['expanded-item'] && isExpanded(get(rowId)));\n\n/** How long a closing panel stays to fade out; matches its `duration-100`. */\nconst PANEL_LEAVE_MS = 100;\n\nconst reducedMotion = usePreferredReducedMotion();\n\n/**\n * Whether the panel is in the DOM, which outlasts `expanded` by its fade-out.\n *\n * @remarks\n * Not a `<Transition>`: test utilities stub that with an element, which lands inside the consumer's\n * `<tbody>` and shifts every `tr:nth-child` its specs count. The fade-in is CSS `@starting-style`.\n */\nconst panelShown = ref<boolean>(get(expanded));\nconst panelClosing = ref<boolean>(false);\n\nconst { start: finishClosing, stop: cancelClosing } = useTimeoutFn(() => {\n set(panelShown, false);\n set(panelClosing, false);\n}, PANEL_LEAVE_MS, { immediate: false });\n\nwatch(expanded, (open) => {\n if (open) {\n cancelClosing();\n set(panelClosing, false);\n set(panelShown, true);\n return;\n }\n if (!get(panelShown))\n return;\n if (get(reducedMotion) === 'reduce') {\n set(panelShown, false);\n return;\n }\n set(panelClosing, true);\n finishClosing();\n});\n\nconst rowClass = computed<string>(() => typeof itemClass === 'string' ? itemClass : itemClass(row));\n\n/** Selection wins over the open-panel shade, so a selected row still reads as selected. */\nconst stateClass = computed<string>(() => {\n if (get(selected))\n return get(classes).trSelected;\n if (get(expanded))\n return get(classes).trExpandedParent;\n return get(classes).tr;\n});\n\n/** Whether the row has a follow-up row, which reads as the second half of the same item. */\nconst appended = computed<boolean>(() => !!slots['row-append']);\n\n/**\n * The stripe follows the item, not the `<tr>`: counting rows would shade an item and its follow-up\n * differently, and an open panel would flip every stripe below it. The table's `striped` variant\n * shades the marked rows.\n */\nconst stripe = computed<'' | undefined>(() => (index % 2 === 1 ? '' : undefined));\n\n/**\n * The two rows of an item highlight together, whichever one the pointer is over. An open row keeps\n * its band rather than taking the hover, as it does without a follow-up.\n */\nconst pairHoverClass = computed<string>(() => {\n if (!get(appended) || get(expanded) || get(isMobile))\n return '';\n return 'has-[+[data-id=row-append]:hover]:bg-rui-hover';\n});\nconst appendHoverClass = computed<string>(() => {\n if (get(expanded) || get(isMobile))\n return '';\n return '[[data-id=row]:hover+&]:bg-rui-hover';\n});\n\n/**\n * On mobile the follow-up is the bottom of the item's card: square on top, against the card, and\n * rounded below unless an open panel follows it.\n */\nconst mobileAppendClass = computed<string>(() => {\n const shared = 'block border-x border-b! border-rui-divider overflow-hidden';\n return get(expanded) ? shared : `${shared} rounded-b-rui-card mb-3`;\n});\n\n/**\n * A column is pinned to the mobile card header when it is flagged\n * `mobileHeader`, typically an action column, or when it is the\n * auto-generated expand column.\n */\nfunction isMobileHeaderColumn(column: TableColumn<T>): boolean {\n return !!column.mobileHeader || column.key === 'expand';\n}\n\n/**\n * A pinned column only earns a spot in the header if it renders something: the\n * expand toggle, a provided item slot, or a non-empty cell value. Without this,\n * a pinned column with no content, such as an action column whose\n * `#item.action` slot a nested table does not provide, leaves an empty header\n * bar with just its divider line.\n */\nfunction mobileHeaderColumnHasContent(column: TableColumn<T>): boolean {\n if (column.key === 'expand')\n return true;\n if (itemSlotKeys.has(column.key.toString()))\n return true;\n const value = cellValue(row, column.key);\n return value !== undefined && value !== null && value !== '';\n}\n\n/**\n * In the stacked mobile layout, header columns render in the card header row\n * instead of as a label/value pair. Everything else stacks below in the body.\n */\nconst mobileHeaderColumns = computed<TableColumn<T>[]>(() =>\n get(isMobile) ? get(columns).filter(column => isMobileHeaderColumn(column) && mobileHeaderColumnHasContent(column)) : [],\n);\nconst bodyColumns = computed<TableColumn<T>[]>(() =>\n get(isMobile) ? get(columns).filter(column => !isMobileHeaderColumn(column)) : get(columns),\n);\nconst showMobileHeader = computed<boolean>(() =>\n get(isMobile) && (!!get(selectedData) || get(mobileHeaderColumns).length > 0),\n);\n\n/**\n * Without a selection checkbox the header bar would hold only the pinned\n * actions, so they float in the card's top-right corner instead and the first\n * field row makes room for them.\n */\nconst compactMobileHeader = computed<boolean>(() =>\n get(showMobileHeader) && !get(selectedData) && get(bodyColumns).length > 0,\n);\n\n/** Room for each floating action, about one small icon button wide. */\nconst firstRowInset = computed<Record<string, string> | undefined>(() =>\n get(compactMobileHeader) ? { paddingRight: `${get(mobileHeaderColumns).length * 2 + 1}rem` } : undefined,\n);\n\n/**\n * `border-y!` defeats the `divide-y-0` on the mobile tbody, which otherwise\n * zeroes the top and bottom border on every card except the first. An expanded\n * card flattens its bottom edge so the expanded panel attaches flush beneath\n * it. A card with a follow-up row drops its bottom border too, so the\n * follow-up continues it with no line between them, as on desktop.\n *\n * These bindings do not run through the class merger, so each state picks its\n * own utilities rather than emitting conflicting ones.\n */\nconst mobileCardClass = computed<string>(() => {\n if (get(appended))\n return 'relative flex flex-col border-x border-t! border-rui-divider overflow-hidden rounded-t-rui-card mb-0';\n const shared = 'relative flex flex-col border border-y! border-rui-divider overflow-hidden';\n return get(expanded)\n ? `${shared} rounded-t-rui-card mb-0`\n : `${shared} rounded-rui-card mb-3 last:mb-0`;\n});\n</script>\n\n<template>\n <tr\n :class=\"[stateClass, rowClass, pairHoverClass, isMobile ? mobileCardClass : '']\"\n :aria-selected=\"selectedData ? selected : undefined\"\n :data-stripe=\"stripe\"\n data-id=\"row\"\n >\n <!-- Mobile card header: checkbox on the left, pinned action columns on the right -->\n <td\n v-if=\"showMobileHeader\"\n :class=\"compactMobileHeader\n ? 'absolute top-0 right-0 z-1 flex items-center gap-1 px-2 py-1'\n : 'flex items-center justify-between gap-2 px-4 py-2 border-b border-rui-divider'\"\n data-id=\"mobile-card-header\"\n >\n <RuiCheckbox\n v-if=\"selectedData\"\n :data-id=\"`table-toggle-check-${index}`\"\n aria-label=\"Select row\"\n :model-value=\"selected\"\n :disabled=\"disabled\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, rowId, true)\"\n @click=\"onCheckboxClick($event, rowId, index)\"\n />\n <span v-else-if=\"!compactMobileHeader\" />\n\n <div\n v-if=\"mobileHeaderColumns.length > 0\"\n class=\"flex items-center gap-1 min-w-0\"\n >\n <template\n v-for=\"(column, headerIndex) in mobileHeaderColumns\"\n :key=\"`header-${headerIndex}`\"\n >\n <slot\n v-if=\"itemSlotKeys.has(column.key.toString())\"\n :name=\"`item.${column.key.toString()}`\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n />\n <RuiExpandButton\n v-else-if=\"column.key === 'expand'\"\n :expanded=\"isExpanded(rowId)\"\n @click=\"onToggleExpand(row)\"\n />\n <template v-else>\n {{ cellValue(row, column.key) }}\n </template>\n </template>\n </div>\n </td>\n\n <!-- Desktop checkbox cell -->\n <td\n v-else-if=\"selectedData && !isMobile\"\n :class=\"classes.checkbox\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :data-id=\"`table-toggle-check-${index}`\"\n aria-label=\"Select row\"\n :model-value=\"selected\"\n :disabled=\"disabled\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, rowId, true)\"\n @click=\"onCheckboxClick($event, rowId, index)\"\n />\n </td>\n\n <RuiDataTableCell\n v-for=\"(column, subIndex) in bodyColumns\"\n :key=\"subIndex\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n :row-id=\"rowId\"\n :style=\"subIndex === 0 ? firstRowInset : undefined\"\n >\n <template\n v-if=\"itemSlotKeys.has(column.key.toString())\"\n #default=\"slotData\"\n >\n <slot\n :name=\"`item.${column.key.toString()}`\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableCell>\n </tr>\n\n <!-- no divider above: with its row it is one item, sharing the row's state, stripe and hover -->\n <RuiDataTableAppendRow\n v-if=\"slots['row-append']\"\n class=\"border-t-0!\"\n :class=\"[stateClass, rowClass, appendHoverClass, isMobile ? mobileAppendClass : '']\"\n :data-stripe=\"stripe\"\n :row=\"row\"\n :index=\"index\"\n >\n <template #row-append=\"slotData\">\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"row-append\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableAppendRow>\n\n <!-- opacity only: the rows below move once, at once, rather than sliding with a growing height -->\n <RuiDataTableExpandedRow\n v-if=\"panelShown\"\n class=\"transition-opacity starting:opacity-0 motion-reduce:transition-none\"\n :class=\"panelClosing ? 'opacity-0 duration-100 ease-in' : 'duration-150 ease-out'\"\n :row=\"row\"\n :index=\"index\"\n >\n <template\n v-if=\"slots['expanded-item']\"\n #expanded-item=\"slotData\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"expanded-item\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiDataTableExpandedRow>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;AAoCA,IAAM,iBAAiB;;;;;;;;EAnBvB,MAAM,QAAQA,SAAA;EAOd,MAAM,EAAE,SAAS,OAAO,aAAa,oBAAoB;EACzD,MAAM,EAAE,WAAW,SAAS,iBAAiB,oBAAuB;EACpE,MAAM,EAAE,eAAe,YAAY,iBAAiB,UAAU,iBAAiB,sBAAyB;EACxG,MAAM,EAAE,YAAY,YAAY,mBAAmB,sBAAyB;EAC5E,MAAM,EAAE,UAAU,cAAc,wBAA2B;EAE3D,MAAM,QAAQ,eAA2B,SAAS,QAAA,GAAG,CAAC;EACtD,MAAM,WAAW,eAAwB,WAAW,IAAI,KAAK,CAAC,CAAC;EAC/D,MAAM,WAAW,eAAwB,cAAc,IAAI,KAAK,CAAC,CAAC;EAClE,MAAM,WAAW,eAAwB,IAAI,UAAU,KAAK,CAAC,CAAC,MAAM,oBAAoB,WAAW,IAAI,KAAK,CAAC,CAAC;;EAK9G,MAAM,gBAAgB,0BAA0B;;;;;;;;EAShD,MAAM,aAAa,IAAa,IAAI,QAAQ,CAAC;EAC7C,MAAM,eAAe,IAAa,KAAK;EAEvC,MAAM,EAAE,OAAO,eAAe,MAAM,kBAAkB,mBAAmB;GACvE,IAAI,YAAY,KAAK;GACrB,IAAI,cAAc,KAAK;EACzB,GAAG,gBAAgB,EAAE,WAAW,MAAM,CAAC;EAEvC,MAAM,WAAW,SAAS;GACxB,IAAI,MAAM;IACR,cAAc;IACd,IAAI,cAAc,KAAK;IACvB,IAAI,YAAY,IAAI;IACpB;GACF;GACA,IAAI,CAAC,IAAI,UAAU,GACjB;GACF,IAAI,IAAI,aAAa,MAAM,UAAU;IACnC,IAAI,YAAY,KAAK;IACrB;GACF;GACA,IAAI,cAAc,IAAI;GACtB,cAAc;EAChB,CAAC;EAED,MAAM,WAAW,eAAuB,OAAO,cAAc,WAAW,YAAY,UAAU,QAAA,GAAG,CAAC;;EAGlG,MAAM,aAAa,eAAuB;GACxC,IAAI,IAAI,QAAQ,GACd,OAAO,IAAI,OAAO,CAAC,CAAC;GACtB,IAAI,IAAI,QAAQ,GACd,OAAO,IAAI,OAAO,CAAC,CAAC;GACtB,OAAO,IAAI,OAAO,CAAC,CAAC;EACtB,CAAC;;EAGD,MAAM,WAAW,eAAwB,CAAC,CAAC,MAAM,aAAa;;;;;;EAO9D,MAAM,SAAS,eAAgC,QAAA,QAAQ,MAAM,IAAI,KAAK,KAAA,CAAU;;;;;EAMhF,MAAM,iBAAiB,eAAuB;GAC5C,IAAI,CAAC,IAAI,QAAQ,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,GACjD,OAAO;GACT,OAAO;EACT,CAAC;EACD,MAAM,mBAAmB,eAAuB;GAC9C,IAAI,IAAI,QAAQ,KAAK,IAAI,QAAQ,GAC/B,OAAO;GACT,OAAO;EACT,CAAC;;;;;EAMD,MAAM,oBAAoB,eAAuB;GAC/C,MAAM,SAAS;GACf,OAAO,IAAI,QAAQ,IAAI,SAAS,GAAG,OAAO;EAC5C,CAAC;;;;;;EAOD,SAAS,qBAAqB,QAAiC;GAC7D,OAAO,CAAC,CAAC,OAAO,gBAAgB,OAAO,QAAQ;EACjD;;;;;;;;EASA,SAAS,6BAA6B,QAAiC;GACrE,IAAI,OAAO,QAAQ,UACjB,OAAO;GACT,IAAI,aAAa,IAAI,OAAO,IAAI,SAAS,CAAC,GACxC,OAAO;GACT,MAAM,QAAQ,UAAU,QAAA,KAAK,OAAO,GAAG;GACvC,OAAO,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU;EAC5D;;;;;EAMA,MAAM,sBAAsB,eAC1B,IAAI,QAAQ,IAAI,IAAI,OAAO,CAAC,CAAC,QAAO,WAAU,qBAAqB,MAAM,KAAK,6BAA6B,MAAM,CAAC,IAAI,CAAC,CACzH;EACA,MAAM,cAAc,eAClB,IAAI,QAAQ,IAAI,IAAI,OAAO,CAAC,CAAC,QAAO,WAAU,CAAC,qBAAqB,MAAM,CAAC,IAAI,IAAI,OAAO,CAC5F;EACA,MAAM,mBAAmB,eACvB,IAAI,QAAQ,MAAM,CAAC,CAAC,IAAI,YAAY,KAAK,IAAI,mBAAmB,CAAC,CAAC,SAAS,EAC7E;;;;;;EAOA,MAAM,sBAAsB,eAC1B,IAAI,gBAAgB,KAAK,CAAC,IAAI,YAAY,KAAK,IAAI,WAAW,CAAC,CAAC,SAAS,CAC3E;;EAGA,MAAM,gBAAgB,eACpB,IAAI,mBAAmB,IAAI,EAAE,cAAc,GAAG,IAAI,mBAAmB,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,IAAI,KAAA,CACjG;;;;;;;;;;;EAYA,MAAM,kBAAkB,eAAuB;GAC7C,IAAI,IAAI,QAAQ,GACd,OAAO;GACT,MAAM,SAAS;GACf,OAAO,IAAI,QAAQ,IACf,GAAG,OAAO,4BACV,GAAG,OAAO;EAChB,CAAC;;;IAICI,mBAgGK,MAAA;KA/FF,OAAKC,eAAA;MAAGC,MAAA,UAAA;MAAYA,MAAA,QAAA;MAAUA,MAAA,cAAA;MAAgBA,MAAA,QAAA,IAAWA,MAAA,eAAA,IAAe;KAAA,CAAA;KACxE,iBAAeA,MAAA,YAAA,IAAeA,MAAA,QAAA,IAAW,KAAA;KACzC,eAAaA,MAAA,MAAA;KACd,WAAQ;IAIAA,GAAAA,CAAAA,MAAA,gBAAA,KADRL,UAAA,GAAAC,mBA+CK,MAAA;;KA7CF,OAAKG,eAAEC,MAAA,mBAAA,IAAA,iEAAA,+EAAA;KAGR,WAAQ;IAGAA,GAAAA,CAAAA,MAAA,YAAA,KADRL,UAAA,GAAAM,YAYEC,qBAAA;;KAVC,WAAO,sBAAwB,QAAA;KAChC,cAAW;KACV,eAAaF,MAAA,QAAA;KACb,UAAUA,MAAA,QAAA;KACV,MAAMA,MAAA,KAAA,IAAK,OAAU,KAAA;KACtB,OAAM;KACN,OAAM;KACN,gBAAA;KACC,uBAAkB,OAAA,OAAA,OAAA,MAAA,WAAEA,MAAA,QAAA,CAAQ,CAAC,QAAQA,MAAA,KAAA,GAAK,IAAA;KAC1C,SAAK,OAAA,OAAA,OAAA,MAAA,WAAEA,MAAA,eAAA,CAAe,CAAC,QAAQA,MAAA,KAAA,GAAO,QAAA,KAAK;;;;;;IAE5B,CAAA,KAAA,CAAAA,MAAA,mBAAA,KAAlBL,UAAA,GAAAC,mBAAyC,QAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,GAGjCI,MAAA,mBAAA,CAAmB,CAAC,SAAM,KADlCL,UAAA,GAAAC,mBAwBM,OAxBN,YAwBM,EApBJD,UAAA,IAAA,GAAAC,mBAmBWC,UAAA,MAAAO,WAlBuBJ,MAAA,mBAAA,IAAxB,QAAQ,gBAAW;KACX,OAAA,UAAA,GAAA,mBAAA,UAAA,EAAA,KAAA,UAAA,cAAA,GAAA,CAGRA,MAAA,YAAA,CAAY,CAAC,IAAI,OAAO,IAAI,SAAQ,CAAA,IAD5CK,WAME,KAAA,QAAA,QAJe,OAAO,IAAI,SAAQ,KAAA;MACzB;MACR,KAAK,QAAA;MACL,OAAO,QAAA;KAGG,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,IAAA,OAAO,QAAG,YADvBV,UAAA,GAAAM,YAIEK,yBAAA;;MAFC,UAAUN,MAAA,UAAA,CAAU,CAACA,MAAA,KAAA,CAAK;MAC1B,SAAK,OAAA,OAAA,OAAA,MAAA,WAAEA,MAAA,cAAA,CAAc,CAAC,QAAA,GAAG;KAE5BL,GAAAA,MAAAA,GAAAA,CAAAA,UAAAA,CAAAA,MAAAA,UAAA,GAAAC,mBAEWC,UAAA,EAAA,KAAA,EAAA,GAAA,CADNU,gBAAAC,gBAAAR,MAAA,SAAA,CAAS,CAAC,QAAA,KAAK,OAAO,GAAG,CAAA,GAAA,CAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA;IAQvBA,CAAAA,GAAAA,GAAAA,EAAAA,CAAAA,KAAAA,mBAAAA,IAAAA,IAAAA,CAAAA,GAAAA,CAAAA,KAAAA,MAAA,YAAA,KAAY,CAAKA,MAAA,QAAA,KAD9BL,UAAA,GAAAC,mBAkBK,MAAA;;KAhBF,OAAKG,eAAEC,MAAA,OAAA,CAAO,CAAC,QAAQ;KACxB,SAAQ;KACR,SAAQ;IAERS,GAAAA,CAAAA,YAWEP,qBAAA;KAVC,WAAO,sBAAwB,QAAA;KAChC,cAAW;KACV,eAAaF,MAAA,QAAA;KACb,UAAUA,MAAA,QAAA;KACV,MAAMA,MAAA,KAAA,IAAK,OAAU,KAAA;KACtB,OAAM;KACN,OAAM;KACN,gBAAA;KACC,uBAAkB,OAAA,OAAA,OAAA,MAAA,WAAEA,MAAA,QAAA,CAAQ,CAAC,QAAQA,MAAA,KAAA,GAAK,IAAA;KAC1C,SAAK,OAAA,OAAA,OAAA,MAAA,WAAEA,MAAA,eAAA,CAAe,CAAC,QAAQA,MAAA,KAAA,GAAO,QAAA,KAAK;;;;;;IAIhDL,CAAAA,CAAAA,GAAAA,CAAAA,KAAAA,mBAAAA,IAAAA,IAAAA,IAAAA,UAAA,IAAA,GAAAC,mBAkBmBC,UAAA,MAAAO,WAjBYJ,MAAA,WAAA,IAArB,QAAQ,aAAQ;KAD1B,OAAAL,UAAA,GAAAM,YAkBmBS,0BAAA;MAhBhB,KAAK;MACG;MACR,KAAK,QAAA;MACL,OAAO,QAAA;MACP,UAAQV,MAAA,KAAA;MACR,OAAKW,eAAE,aAAQ,IAASX,MAAA,aAAA,IAAgB,KAAA,CAAS;KAG1CA,GAAAA,YAAAA,EAAAA,GAAAA,EAAAA,GAAAA,CAAAA,MAAA,YAAA,CAAY,CAAC,IAAI,OAAO,IAAI,SAAQ,CAAA,IAAA;MACzC,MAAA;MAED,IAAAa,SAFU,aAAQ,CAElBR,WAGE,KAAA,QAAA,QAFe,OAAO,IAAI,SAAQ,KADpCS,WAGE,EAAA,SAAA,KAAA,GADQ,QAAQ,CAAA,CAAA,CAAA;;;;;;;;;;IAQhB,MAAK,iBADbnB,UAAA,GAAAM,YAewBc,+BAAA;;KAbtB,OAAKhB,eAAA,CAAC,eAAa;MACVC,MAAA,UAAA;MAAYA,MAAA,QAAA;MAAUA,MAAA,gBAAA;MAAkBA,MAAA,QAAA,IAAWA,MAAA,iBAAA,IAAiB;KAAA,CAAA,CAAA;KAC5E,eAAaA,MAAA,MAAA;KACb,KAAK,QAAA;KACL,OAAO,QAAA;;KAEG,cAAUa,SAAE,aAAQ,CAE7BR,WAGE,KAAA,QAAA,cAAAW,eAAAC,mBADQ,QAAQ,CAAA,CAAA,CAAA,CAAA;;;;;;;;IAOdjB,MAAA,UAAA,KADRL,UAAA,GAAAM,YAiB0BiB,iCAAA;;KAfxB,OAAKnB,eAAA,CAAC,uEACEC,MAAA,YAAA,IAAY,mCAAA,uBAAA,CAAA;KACnB,KAAK,QAAA;KACL,OAAO,QAAA;IAGA,GAAA,YAAA,EAAA,GAAA,EAAA,GAAA,CAAA,MAAK,mBAAA;KACV,MAAA;KAGD,IAAAa,SAHgB,aAAQ,CAGxBR,WAGE,KAAA,QAAA,iBAAAW,eAAAC,mBADQ,QAAQ,CAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ComputedRef, Ref } from 'vue';
|
|
2
|
-
import type { TableColumn } from '../RuiTableHead.vue';
|
|
2
|
+
import type { TableColumn } from '../RuiTableHead.vue.js';
|
|
3
3
|
import type { GroupExpandButtonPosition } from '../table-props.js';
|
|
4
4
|
import type { GroupHeader } from '../../../composables/tables/data-table/types.js';
|
|
5
5
|
export interface DataTableClasses {
|
|
@@ -37,7 +37,7 @@ var dataTableStyles = tv({
|
|
|
37
37
|
true: {},
|
|
38
38
|
false: {}
|
|
39
39
|
},
|
|
40
|
-
striped: { true: { tbody: "[:where(&>tr
|
|
40
|
+
striped: { true: { tbody: "[:where(&>tr[data-stripe])]:bg-rui-neutral-950/[0.03] dark:[:where(&>tr[data-stripe])]:bg-white/[0.04]" } },
|
|
41
41
|
rowVariant: {
|
|
42
42
|
selected: { tr: "bg-rui-primary-soft" },
|
|
43
43
|
empty: { tr: "hover:bg-transparent" },
|