@rotki/ui-library 3.1.7 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
- package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/accordions/accordion/accordion-styles.d.ts +1 -0
- package/dist/components/accordions/accordion/accordion-styles.js +7 -0
- package/dist/components/accordions/accordion/accordion-styles.js.map +1 -0
- package/dist/components/alerts/RuiAlert.js.map +1 -1
- package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js +1 -65
- package/dist/components/alerts/RuiAlert.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/alerts/alert-styles.d.ts +145 -0
- package/dist/components/alerts/alert-styles.js +70 -0
- package/dist/components/alerts/alert-styles.js.map +1 -0
- package/dist/components/avatars/RuiAvatar.js.map +1 -1
- package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +1 -38
- 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 +1 -13
- package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/avatars/avatar-group-styles.d.ts +49 -0
- package/dist/components/avatars/avatar-group-styles.js +18 -0
- package/dist/components/avatars/avatar-group-styles.js.map +1 -0
- package/dist/components/avatars/avatar-styles.d.ts +181 -0
- package/dist/components/avatars/avatar-styles.js +43 -0
- package/dist/components/avatars/avatar-styles.js.map +1 -0
- 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 +2 -138
- package/dist/components/buttons/button-group/RuiButtonGroup.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/buttons/button-group/button-group-styles.d.ts +142 -0
- package/dist/components/buttons/button-group/button-group-styles.js +143 -0
- package/dist/components/buttons/button-group/button-group-styles.js.map +1 -0
- package/dist/components/calendar/RuiCalendar.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +1 -8
- 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 +2 -22
- package/dist/components/calendar/RuiCalendarGrid.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 +3 -14
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/calendar-grid-styles.d.ts +43 -0
- package/dist/components/calendar/calendar-grid-styles.js +26 -0
- package/dist/components/calendar/calendar-grid-styles.js.map +1 -0
- package/dist/components/calendar/calendar-menu-styles.d.ts +34 -0
- package/dist/components/calendar/calendar-menu-styles.js +17 -0
- package/dist/components/calendar/calendar-menu-styles.js.map +1 -0
- package/dist/components/calendar/calendar-styles.d.ts +16 -0
- package/dist/components/calendar/calendar-styles.js +13 -0
- package/dist/components/calendar/calendar-styles.js.map +1 -0
- package/dist/components/cards/RuiCard.js.map +1 -1
- package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +3 -58
- 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 +2 -20
- package/dist/components/cards/RuiCardHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/cards/card-header-styles.d.ts +46 -0
- package/dist/components/cards/card-header-styles.js +24 -0
- package/dist/components/cards/card-header-styles.js.map +1 -0
- package/dist/components/cards/card-styles.d.ts +175 -0
- package/dist/components/cards/card-styles.js +62 -0
- package/dist/components/cards/card-styles.js.map +1 -0
- package/dist/components/chips/RuiChip.js.map +1 -1
- package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js +2 -241
- package/dist/components/chips/RuiChip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/chips/chip-styles.d.ts +223 -0
- package/dist/components/chips/chip-styles.js +246 -0
- package/dist/components/chips/chip-styles.js.map +1 -0
- package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/color-picker/RuiColorBoard.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 +3 -3
- package/dist/components/color-picker/RuiColorHue.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 +3 -3
- package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/color-picker/color-board-styles.d.ts +1 -0
- package/dist/components/color-picker/color-board-styles.js +7 -0
- package/dist/components/color-picker/color-board-styles.js.map +1 -0
- package/dist/components/color-picker/color-hue-styles.d.ts +1 -0
- package/dist/components/color-picker/color-hue-styles.js +7 -0
- package/dist/components/color-picker/color-hue-styles.js.map +1 -0
- package/dist/components/color-picker/color-picker-styles.d.ts +1 -0
- package/dist/components/color-picker/color-picker-styles.js +7 -0
- package/dist/components/color-picker/color-picker-styles.js.map +1 -0
- 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 +1 -11
- package/dist/components/forms/field-label/RuiFieldLabel.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/field-label/field-label-styles.d.ts +43 -0
- package/dist/components/forms/field-label/field-label-styles.js +16 -0
- package/dist/components/forms/field-label/field-label-styles.js.map +1 -0
- package/dist/components/forms/select/RuiSimpleSelect.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js +2 -11
- package/dist/components/forms/select/RuiSimpleSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/select/simple-select-styles.d.ts +2 -0
- package/dist/components/forms/select/simple-select-styles.js +15 -0
- package/dist/components/forms/select/simple-select-styles.js.map +1 -0
- package/dist/components/forms/switch/RuiSwitch.js.map +1 -1
- package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js +1 -126
- package/dist/components/forms/switch/RuiSwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/switch/switch-styles.d.ts +151 -0
- package/dist/components/forms/switch/switch-styles.js +131 -0
- package/dist/components/forms/switch/switch-styles.js.map +1 -0
- package/dist/components/icons/RuiIcon.js.map +1 -1
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js +2 -28
- package/dist/components/icons/RuiIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/icons/icon-styles.d.ts +44 -0
- package/dist/components/icons/icon-styles.js +33 -0
- package/dist/components/icons/icon-styles.js.map +1 -0
- package/dist/components/loaders/RuiSkeletonBase.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonBase.vue_vue_type_script_setup_true_lang.js +2 -12
- 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_vue_type_script_setup_true_lang.js +3 -13
- package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/loaders/skeleton-base-styles.d.ts +25 -0
- package/dist/components/loaders/skeleton-base-styles.js +16 -0
- package/dist/components/loaders/skeleton-base-styles.js.map +1 -0
- package/dist/components/loaders/skeleton-loader-styles.d.ts +37 -0
- package/dist/components/loaders/skeleton-loader-styles.js +18 -0
- package/dist/components/loaders/skeleton-loader-styles.js.map +1 -0
- package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +1 -83
- package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/badge/badge-styles.d.ts +193 -0
- package/dist/components/overlays/badge/badge-styles.js +88 -0
- package/dist/components/overlays/badge/badge-styles.js.map +1 -0
- package/dist/components/overlays/dialog/RuiDialog.js.map +1 -1
- package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js +3 -14
- package/dist/components/overlays/dialog/RuiDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/dialog/dialog-styles.d.ts +40 -0
- package/dist/components/overlays/dialog/dialog-styles.js +18 -0
- package/dist/components/overlays/dialog/dialog-styles.js.map +1 -0
- package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue.d.ts +9 -0
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +113 -58
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/menu/menu-styles.d.ts +58 -0
- package/dist/components/overlays/menu/menu-styles.js +25 -0
- package/dist/components/overlays/menu/menu-styles.js.map +1 -0
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js +4 -69
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.d.ts +76 -0
- package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.js +72 -0
- package/dist/components/overlays/navigation-drawer/navigation-drawer-styles.js.map +1 -0
- package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
- package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/notification/notification-styles.d.ts +1 -0
- package/dist/components/overlays/notification/notification-styles.js +7 -0
- package/dist/components/overlays/notification/notification-styles.js.map +1 -0
- package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +4 -2
- package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +42 -25
- package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/overlays/tooltip/tooltip-styles.d.ts +2 -0
- package/dist/components/overlays/tooltip/tooltip-styles.js +3 -1
- package/dist/components/overlays/tooltip/tooltip-styles.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 +1 -133
- package/dist/components/progress/RuiProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/progress/progress-styles.d.ts +181 -0
- package/dist/components/progress/progress-styles.js +139 -0
- package/dist/components/progress/progress-styles.js.map +1 -0
- package/dist/components/steppers/RuiFooterStepper.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.vue_vue_type_script_setup_true_lang.js +3 -13
- 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_vue_type_script_setup_true_lang.js +4 -94
- 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 +2 -34
- package/dist/components/steppers/RuiStepperIcon.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/steppers/footer-stepper-styles.d.ts +28 -0
- package/dist/components/steppers/footer-stepper-styles.js +16 -0
- package/dist/components/steppers/footer-stepper-styles.js.map +1 -0
- package/dist/components/steppers/stepper-icon-styles.d.ts +60 -0
- package/dist/components/steppers/stepper-icon-styles.js +39 -0
- package/dist/components/steppers/stepper-icon-styles.js.map +1 -0
- package/dist/components/steppers/stepper-styles.d.ts +202 -0
- package/dist/components/steppers/stepper-styles.js +98 -0
- package/dist/components/steppers/stepper-styles.js.map +1 -0
- package/dist/components/tables/RuiTable.js.map +1 -1
- package/dist/components/tables/RuiTable.vue_vue_type_script_setup_true_lang.js +1 -32
- 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 +1 -15
- 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 +2 -5
- 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 +1 -34
- 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 +1 -8
- 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 +1 -30
- package/dist/components/tables/RuiTablePagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/table-empty-state-styles.d.ts +43 -0
- package/dist/components/tables/table-empty-state-styles.js +20 -0
- package/dist/components/tables/table-empty-state-styles.js.map +1 -0
- package/dist/components/tables/table-error-state-styles.d.ts +36 -0
- package/dist/components/tables/table-error-state-styles.js +15 -0
- package/dist/components/tables/table-error-state-styles.js.map +1 -0
- package/dist/components/tables/table-head-styles.d.ts +91 -0
- package/dist/components/tables/table-head-styles.js +39 -0
- package/dist/components/tables/table-head-styles.js.map +1 -0
- package/dist/components/tables/table-loading-state-styles.d.ts +34 -0
- package/dist/components/tables/table-loading-state-styles.js +13 -0
- package/dist/components/tables/table-loading-state-styles.js.map +1 -0
- package/dist/components/tables/table-pagination-styles.d.ts +82 -0
- package/dist/components/tables/table-pagination-styles.js +35 -0
- package/dist/components/tables/table-pagination-styles.js.map +1 -0
- package/dist/components/tables/table-styles.d.ts +62 -0
- package/dist/components/tables/table-styles.js +37 -0
- package/dist/components/tables/table-styles.js.map +1 -0
- package/dist/components/tabs/tab/RuiTab.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +3 -84
- package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tab/tab-styles.d.ts +153 -0
- package/dist/components/tabs/tab/tab-styles.js +89 -0
- package/dist/components/tabs/tab/tab-styles.js.map +1 -0
- package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +2 -137
- package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tabs/tabs/tabs-styles.d.ts +168 -0
- package/dist/components/tabs/tabs/tabs-styles.js +142 -0
- package/dist/components/tabs/tabs/tabs-styles.js.map +1 -0
- package/dist/composables/floating.d.ts +3 -1
- package/dist/composables/floating.js +8 -9
- package/dist/composables/floating.js.map +1 -1
- package/dist/icons/icons_1.d.ts +1 -1
- package/dist/icons/icons_1.js +10 -9
- package/dist/icons/icons_1.js.map +1 -1
- package/dist/icons/icons_2.d.ts +1 -1
- package/dist/icons/icons_2.js +9 -11
- package/dist/icons/icons_2.js.map +1 -1
- package/dist/icons/icons_3.d.ts +1 -1
- package/dist/icons/icons_3.js +11 -5
- package/dist/icons/icons_3.js.map +1 -1
- package/dist/icons/icons_4.d.ts +1 -1
- package/dist/icons/icons_4.js +5 -10
- package/dist/icons/icons_4.js.map +1 -1
- package/dist/icons/icons_5.d.ts +1 -0
- package/dist/icons/icons_5.js +10 -1
- package/dist/icons/icons_5.js.map +1 -1
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +7 -6
- package/dist/icons/index.js.map +1 -1
- package/dist/index.js +6 -6
- package/dist/utils/form-text-detail.d.ts +2 -0
- package/dist/utils/form-text-detail.js +5 -1
- package/dist/utils/form-text-detail.js.map +1 -1
- package/dist/web-types.json +11 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { tv } from "../../utils/tv.js";
|
|
2
1
|
import RuiTableEmptyState_default from "./RuiTableEmptyState.js";
|
|
3
2
|
import RuiTableErrorState_default from "./RuiTableErrorState.js";
|
|
4
3
|
import RuiTableLoadingState_default from "./RuiTableLoadingState.js";
|
|
4
|
+
import { tableStyles } from "./table-styles.js";
|
|
5
5
|
import { computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeProps, normalizeClass, openBlock, renderSlot } from "vue";
|
|
6
6
|
//#region src/components/tables/RuiTable.vue?vue&type=script&setup=true&lang.ts
|
|
7
7
|
var RuiTable_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
@@ -39,37 +39,6 @@ var RuiTable_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
|
|
|
39
39
|
if (__props.empty) return "empty";
|
|
40
40
|
});
|
|
41
41
|
const emptyProps = computed(() => typeof __props.empty === "object" ? __props.empty : {});
|
|
42
|
-
/**
|
|
43
|
-
* Every rule that lands on a `th` or a `td` wraps the `&` in `:where()`, which
|
|
44
|
-
* compiles to `:where(.generated-class) th` and so carries the specificity of
|
|
45
|
-
* the element alone. A consumer writing `class="p-0"` on one cell is a single
|
|
46
|
-
* class, which outranks that, so a one-off override needs no `!important` the
|
|
47
|
-
* way a plain `[&_th]:` rule would.
|
|
48
|
-
*/
|
|
49
|
-
const tableStyles = tv({
|
|
50
|
-
slots: {
|
|
51
|
-
root: "w-full overflow-y-auto",
|
|
52
|
-
table: [
|
|
53
|
-
"w-full text-rui-text",
|
|
54
|
-
"[:where(&)_thead]:border-b [:where(&)_thead]:border-rui-divider",
|
|
55
|
-
"[:where(&)_thead_th]:font-medium [:where(&)_thead_th]:text-rui-text-secondary [:where(&)_thead_th]:text-start",
|
|
56
|
-
"[:where(&)_thead_th]:text-[0.8125rem] [:where(&)_thead_th]:leading-5",
|
|
57
|
-
"[:where(&)_th]:px-4 [:where(&)_td]:px-4 [:where(&)_td]:text-body-2",
|
|
58
|
-
"[:where(&)_tbody>tr+tr]:border-t [:where(&)_tbody>tr+tr]:border-rui-divider",
|
|
59
|
-
"[:where(&)_tbody_td]:border-b-0"
|
|
60
|
-
]
|
|
61
|
-
},
|
|
62
|
-
variants: {
|
|
63
|
-
variant: {
|
|
64
|
-
default: {},
|
|
65
|
-
outlined: { root: "border rounded-rui-panel border-rui-divider" }
|
|
66
|
-
},
|
|
67
|
-
dense: {
|
|
68
|
-
true: { table: "[:where(&)_th]:py-0.5 [:where(&)_th]:h-8 [:where(&)_td]:py-1 [:where(&)_td]:h-9" },
|
|
69
|
-
false: { table: "[:where(&)_th]:py-1 [:where(&)_th]:h-10 [:where(&)_td]:py-1 [:where(&)_td]:h-11" }
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
42
|
const ui = computed(() => tableStyles({
|
|
74
43
|
dense: __props.dense,
|
|
75
44
|
variant: __props.variant
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTable.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_openBlock","_createElementBlock","_mergeProps","_createElementVNode","_normalizeClass","_renderSlot","_createVNode","RuiTableLoadingState","RuiTableErrorState","RuiTableEmptyState","_createCommentVNode"],"sources":["../../../src/components/tables/RuiTable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport RuiTableEmptyState from '@/components/tables/RuiTableEmptyState.vue';\nimport RuiTableErrorState from '@/components/tables/RuiTableErrorState.vue';\nimport RuiTableLoadingState from '@/components/tables/RuiTableLoadingState.vue';\nimport {
|
|
1
|
+
{"version":3,"file":"RuiTable.vue_vue_type_script_setup_true_lang.js","names":["$attrs","_openBlock","_createElementBlock","_mergeProps","_createElementVNode","_normalizeClass","_renderSlot","_createVNode","RuiTableLoadingState","RuiTableErrorState","RuiTableEmptyState","_createCommentVNode"],"sources":["../../../src/components/tables/RuiTable.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport RuiTableEmptyState from '@/components/tables/RuiTableEmptyState.vue';\nimport RuiTableErrorState from '@/components/tables/RuiTableErrorState.vue';\nimport RuiTableLoadingState from '@/components/tables/RuiTableLoadingState.vue';\nimport { tableStyles } from './table-styles';\n\nexport interface TableEmpty {\n label?: string;\n description?: string;\n}\n\nexport interface Props {\n variant?: 'default' | 'outlined';\n dense?: boolean;\n /** Shows a spinner under the header while a read is in flight. */\n loading?: boolean;\n /** Why the last read failed, which takes precedence over `empty`. */\n error?: string;\n /** Heading for that failure. */\n errorTitle?: string;\n /** Label for the retry control; without one, no control is offered. */\n retryText?: string;\n /**\n * Says the table is knowingly empty. A table whose rows simply have not\n * arrived should stay `loading` instead, so the two never read alike.\n */\n empty?: TableEmpty | boolean;\n}\n\ndefineOptions({\n name: 'RuiTable',\n inheritAttrs: false,\n});\n\nconst {\n variant = 'outlined',\n dense = false,\n loading = false,\n error = '',\n errorTitle = '',\n retryText = '',\n empty = false,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n retry: [];\n}>();\n\ndefineSlots<{\n default: () => any;\n loading?: () => any;\n error?: () => any;\n empty?: () => any;\n}>();\n\n/**\n * The three states are mutually exclusive, and a failed read outranks an empty\n * one: rows that did not arrive are not rows that are not there.\n */\nconst state = computed<'loading' | 'error' | 'empty' | undefined>(() => {\n if (loading)\n return 'loading';\n\n if (error)\n return 'error';\n\n if (empty)\n return 'empty';\n\n return undefined;\n});\n\nconst emptyProps = computed<TableEmpty>(() => (typeof empty === 'object' ? empty : {}));\n\nconst ui = computed<ReturnType<typeof tableStyles>>(() => tableStyles({ dense, variant }));\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n v-bind=\"$attrs\"\n >\n <table :class=\"ui.table()\">\n <slot />\n </table>\n\n <slot\n v-if=\"state === 'loading'\"\n name=\"loading\"\n >\n <RuiTableLoadingState compact />\n </slot>\n\n <slot\n v-else-if=\"state === 'error'\"\n name=\"error\"\n >\n <RuiTableErrorState\n :action-text=\"retryText\"\n :message=\"error\"\n :title=\"errorTitle\"\n @action=\"emit('retry')\"\n />\n </slot>\n\n <slot\n v-else-if=\"state === 'empty'\"\n name=\"empty\"\n >\n <RuiTableEmptyState\n compact\n :description=\"emptyProps.description\"\n :label=\"emptyProps.label\"\n />\n </slot>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,OAAO;;;;;EAeb,MAAM,QAAQ,eAA0D;GACtE,IAAI,QAAA,SACF,OAAO;GAET,IAAI,QAAA,OACF,OAAO;GAET,IAAI,QAAA,OACF,OAAO;EAGX,CAAC;EAED,MAAM,aAAa,eAA4B,OAAO,QAAA,UAAU,WAAW,QAAA,QAAQ,CAAC,CAAE;EAEtF,MAAM,KAAK,eAA+C,YAAY;GAAE,OAAI,QAAA;GAAG,SAAM,QAAA;EAAE,CAAC,CAAC;;GAIvF,OAAAC,UAAA,GAAAC,mBAqCM,OArCNC,WAqCM,EApCH,OAAO,GAAA,MAAG,KAAI,EACPH,GAAAA,KAAAA,MAAM,GAAA,CAEdI,mBAEQ,SAAA,EAFA,OAAKC,eAAE,GAAA,MAAG,MAAK,CAAA,EAAA,GAAA,CACrBC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA,GAIF,MAAA,UAAK,YADbA,WAKO,KAAA,QAAA,WAAA,CAAA,SAAA,CADLC,YAAgCC,8BAAA,EAAV,SAAA,GAAO,CAAA,CAAA,GAAA,KAAA,GAAA,CAAA,IAIlB,MAAA,UAAK,UADlBF,WAUO,KAAA,QAAA,SAAA,CAAA,SAAA,CANLC,YAKEE,4BAAA;IAJC,eAAa,QAAA;IACb,SAAS,QAAA;IACT,OAAO,QAAA;IACP,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,OAAA;;;;;GAKJ,CAAA,CAAA,GAAA,KAAA,GAAA,CAAA,IAAA,MAAA,UAAK,UADlBH,WASO,KAAA,QAAA,SAAA,CAAA,SAAA,CALLC,YAIEG,4BAAA;IAHA,SAAA;IACC,aAAa,WAAA,MAAW;IACxB,OAAO,WAAA,MAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTableEmptyState.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTableEmptyState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useRotkiTheme } from '@/composables/theme';\nimport {
|
|
1
|
+
{"version":3,"file":"RuiTableEmptyState.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTableEmptyState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useRotkiTheme } from '@/composables/theme';\nimport { emptyStyles } from './table-empty-state-styles';\nimport noDataPlaceholder from './table_no_data_placeholder.svg';\nimport noDataPlaceholderDark from './table_no_data_placeholder_dark.svg';\n\nexport interface TableEmptyStateProps {\n label?: string;\n description?: string;\n /**\n * Drops the illustration and the reserved height, for a table that only has\n * room to say the row count is zero.\n */\n compact?: boolean;\n}\n\ndefineOptions({\n name: 'RuiTableEmptyState',\n});\n\nconst { label, description, compact = false } = defineProps<TableEmptyStateProps>();\n\ndefineSlots<{\n description?: () => any;\n}>();\n\nconst { isDark } = useRotkiTheme();\n\nconst ui = computed<ReturnType<typeof emptyStyles>>(() => emptyStyles({ compact }));\n</script>\n\n<template>\n <div :class=\"ui.root()\">\n <img\n v-if=\"!compact\"\n :src=\"isDark ? noDataPlaceholderDark : noDataPlaceholder\"\n :alt=\"label\"\n class=\"h-32\"\n />\n <p\n v-if=\"label\"\n :class=\"ui.title()\"\n data-id=\"empty-label\"\n >\n {{ label }}\n </p>\n <slot name=\"description\">\n <p\n v-if=\"description\"\n :class=\"ui.subtitle()\"\n data-id=\"empty-description\"\n >\n {{ description }}\n </p>\n </slot>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useRotkiTheme } from "../../composables/theme.js";
|
|
2
|
-
import {
|
|
2
|
+
import { emptyStyles } from "./table-empty-state-styles.js";
|
|
3
3
|
import table_no_data_placeholder_default from "./table_no_data_placeholder.js";
|
|
4
4
|
import table_no_data_placeholder_dark_default from "./table_no_data_placeholder_dark.js";
|
|
5
5
|
import { computed, createCommentVNode, createElementBlock, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, unref } from "vue";
|
|
@@ -18,20 +18,6 @@ var RuiTableEmptyState_vue_vue_type_script_setup_true_lang_default = /*@__PURE__
|
|
|
18
18
|
},
|
|
19
19
|
setup(__props) {
|
|
20
20
|
const { isDark } = useRotkiTheme();
|
|
21
|
-
const emptyStyles = tv({
|
|
22
|
-
slots: {
|
|
23
|
-
root: "flex flex-col items-center justify-center flex-1",
|
|
24
|
-
title: "text-body-1 font-semibold text-center text-current pb-0 mb-0",
|
|
25
|
-
subtitle: "text-body-2 text-center text-rui-text-secondary pb-0 mb-0"
|
|
26
|
-
},
|
|
27
|
-
variants: { compact: {
|
|
28
|
-
true: {
|
|
29
|
-
root: "gap-1 py-6",
|
|
30
|
-
title: "font-normal text-rui-text-secondary"
|
|
31
|
-
},
|
|
32
|
-
false: { root: "gap-3 min-h-56 my-4" }
|
|
33
|
-
} }
|
|
34
|
-
});
|
|
35
21
|
const ui = computed(() => emptyStyles({ compact: __props.compact }));
|
|
36
22
|
return (_ctx, _cache) => {
|
|
37
23
|
return openBlock(), createElementBlock("div", { class: normalizeClass(unref(ui).root()) }, [
|
package/dist/components/tables/RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","noDataPlaceholderDark","noDataPlaceholder","_createCommentVNode","_toDisplayString","_renderSlot"],"sources":["../../../src/components/tables/RuiTableEmptyState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useRotkiTheme } from '@/composables/theme';\nimport {
|
|
1
|
+
{"version":3,"file":"RuiTableEmptyState.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","noDataPlaceholderDark","noDataPlaceholder","_createCommentVNode","_toDisplayString","_renderSlot"],"sources":["../../../src/components/tables/RuiTableEmptyState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { useRotkiTheme } from '@/composables/theme';\nimport { emptyStyles } from './table-empty-state-styles';\nimport noDataPlaceholder from './table_no_data_placeholder.svg';\nimport noDataPlaceholderDark from './table_no_data_placeholder_dark.svg';\n\nexport interface TableEmptyStateProps {\n label?: string;\n description?: string;\n /**\n * Drops the illustration and the reserved height, for a table that only has\n * room to say the row count is zero.\n */\n compact?: boolean;\n}\n\ndefineOptions({\n name: 'RuiTableEmptyState',\n});\n\nconst { label, description, compact = false } = defineProps<TableEmptyStateProps>();\n\ndefineSlots<{\n description?: () => any;\n}>();\n\nconst { isDark } = useRotkiTheme();\n\nconst ui = computed<ReturnType<typeof emptyStyles>>(() => emptyStyles({ compact }));\n</script>\n\n<template>\n <div :class=\"ui.root()\">\n <img\n v-if=\"!compact\"\n :src=\"isDark ? noDataPlaceholderDark : noDataPlaceholder\"\n :alt=\"label\"\n class=\"h-32\"\n />\n <p\n v-if=\"label\"\n :class=\"ui.title()\"\n data-id=\"empty-label\"\n >\n {{ label }}\n </p>\n <slot name=\"description\">\n <p\n v-if=\"description\"\n :class=\"ui.subtitle()\"\n data-id=\"empty-description\"\n >\n {{ description }}\n </p>\n </slot>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EA0BA,MAAM,EAAE,WAAW,cAAc;EAEjC,MAAM,KAAK,eAA+C,YAAY,EAAE,SAAM,QAAA,QAAE,CAAC,CAAC;;GAIhF,OAAAA,UAAA,GAAAC,mBAuBM,OAAA,EAvBA,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,KAAI,CAAA,EAAA,GAAA;IAET,CAAA,QAAA,WADTH,UAAA,GAAAC,mBAKE,OAAA;;KAHC,KAAKE,MAAA,MAAA,IAASA,MAAAC,sCAAA,IAAwBD,MAAAE,iCAAA;KACtC,KAAK,QAAA;KACN,OAAM;;IAGA,QAAA,SADRL,UAAA,GAAAC,mBAMI,KAAA;;KAJD,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;KAChB,WAAQ;IAEL,GAAAI,gBAAA,QAAA,KAAK,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;IAEVC,WAQO,KAAA,QAAA,eAAA,CAAA,SAAA,CANG,QAAA,eADRR,UAAA,GAAAC,mBAMI,KAAA;;KAJD,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,SAAQ,CAAA;KACnB,WAAQ;IAEL,GAAAI,gBAAA,QAAA,WAAW,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTableErrorState.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTableErrorState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport RuiAlert from '@/components/alerts/RuiAlert.vue';\nimport {
|
|
1
|
+
{"version":3,"file":"RuiTableErrorState.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTableErrorState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport RuiAlert from '@/components/alerts/RuiAlert.vue';\nimport { errorStyles } from './table-error-state-styles';\n\nexport interface TableErrorStateProps {\n /** Heading for the failure, such as which read it was. */\n title?: string;\n /** What went wrong, in the words the caller got back. */\n message?: string;\n /**\n * Label for the retry control. The library ships no translations, so a\n * caller that wants the control has to name it; leaving this empty renders\n * the reason on its own.\n */\n actionText?: string;\n}\n\ndefineOptions({\n name: 'RuiTableErrorState',\n});\n\nconst { title = '', message = '', actionText = '' } = defineProps<TableErrorStateProps>();\n\nconst emit = defineEmits<{\n action: [];\n}>();\n\ndefineSlots<{\n default?: () => any;\n}>();\n\nconst ui = errorStyles();\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n data-id=\"table-error\"\n >\n <RuiAlert\n :action-text=\"actionText\"\n :class=\"ui.alert()\"\n :title=\"title\"\n type=\"error\"\n @action=\"emit('action')\"\n >\n <slot>\n {{ message }}\n </slot>\n </RuiAlert>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { tv } from "../../utils/tv.js";
|
|
2
1
|
import RuiAlert_default from "../alerts/RuiAlert.js";
|
|
2
|
+
import { errorStyles } from "./table-error-state-styles.js";
|
|
3
3
|
import { createElementBlock, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderSlot, toDisplayString, unref, withCtx } from "vue";
|
|
4
4
|
//#region src/components/tables/RuiTableErrorState.vue?vue&type=script&setup=true&lang.ts
|
|
5
5
|
var RuiTableErrorState_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
@@ -13,10 +13,7 @@ var RuiTableErrorState_vue_vue_type_script_setup_true_lang_default = /*@__PURE__
|
|
|
13
13
|
emits: ["action"],
|
|
14
14
|
setup(__props, { emit: __emit }) {
|
|
15
15
|
const emit = __emit;
|
|
16
|
-
const ui =
|
|
17
|
-
root: "flex justify-center p-4",
|
|
18
|
-
alert: "w-full max-w-2xl"
|
|
19
|
-
} })();
|
|
16
|
+
const ui = errorStyles();
|
|
20
17
|
return (_ctx, _cache) => {
|
|
21
18
|
return openBlock(), createElementBlock("div", {
|
|
22
19
|
class: normalizeClass(unref(ui).root()),
|
package/dist/components/tables/RuiTableErrorState.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTableErrorState.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","RuiAlert","_withCtx","_renderSlot","_createTextVNode","_toDisplayString"],"sources":["../../../src/components/tables/RuiTableErrorState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport RuiAlert from '@/components/alerts/RuiAlert.vue';\nimport {
|
|
1
|
+
{"version":3,"file":"RuiTableErrorState.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","RuiAlert","_withCtx","_renderSlot","_createTextVNode","_toDisplayString"],"sources":["../../../src/components/tables/RuiTableErrorState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport RuiAlert from '@/components/alerts/RuiAlert.vue';\nimport { errorStyles } from './table-error-state-styles';\n\nexport interface TableErrorStateProps {\n /** Heading for the failure, such as which read it was. */\n title?: string;\n /** What went wrong, in the words the caller got back. */\n message?: string;\n /**\n * Label for the retry control. The library ships no translations, so a\n * caller that wants the control has to name it; leaving this empty renders\n * the reason on its own.\n */\n actionText?: string;\n}\n\ndefineOptions({\n name: 'RuiTableErrorState',\n});\n\nconst { title = '', message = '', actionText = '' } = defineProps<TableErrorStateProps>();\n\nconst emit = defineEmits<{\n action: [];\n}>();\n\ndefineSlots<{\n default?: () => any;\n}>();\n\nconst ui = errorStyles();\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n data-id=\"table-error\"\n >\n <RuiAlert\n :action-text=\"actionText\"\n :class=\"ui.alert()\"\n :title=\"title\"\n type=\"error\"\n @action=\"emit('action')\"\n >\n <slot>\n {{ message }}\n </slot>\n </RuiAlert>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;EAuBA,MAAM,OAAO;EAQb,MAAM,KAAK,YAAY;;GAIrB,OAAAA,UAAA,GAAAC,mBAeM,OAAA;IAdH,OAAKC,eAAEC,MAAA,EAAA,CAAE,CAAC,KAAI,CAAA;IACf,WAAQ;GAERC,GAAAA,CAAAA,YAUWC,kBAAA;IATR,eAAa,QAAA;IACb,OAAKH,eAAEC,MAAA,EAAA,CAAE,CAAC,MAAK,CAAA;IACf,OAAO,QAAA;IACR,MAAK;IACJ,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,QAAA;;IAEb,SAAAG,cAEO,CAFPC,WAEO,KAAA,QAAA,WAAA,CAAA,SAAA,CADFC,gBAAAC,gBAAA,QAAA,OAAO,GAAA,CAAA,CAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTableHead.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTableHead.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, K extends keyof T = keyof T\">\nimport type { RuiIcons } from '@/icons';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { NESTED_BAR } from '@/components/tables/data-table-styles';\nimport { getAlignClass, getSortButtonAlignClass, SortDirection, TableAlign } from '@/components/tables/table-props';\nimport { tv } from '@/utils/tv';\n\n/**\n * A sortable column name for `T`, the type of the data in the column: the name\n * must be a key of that object type.\n */\nexport type TableRowKey<T> = keyof T extends string ? keyof T : never;\n\nexport interface BaseTableColumn<T> {\n key: TableRowKey<T> | string;\n sortable?: boolean;\n direction?: SortDirection;\n align?: TableAlign;\n class?: string;\n cellClass?: string;\n tdClass?: string;\n colspan?: string | number;\n rowspan?: string | number;\n /**\n * hide this column when the table is rendered in its stacked mobile layout\n */\n mobileHidden?: boolean;\n /**\n * pin this column to the card header (top row) in the stacked mobile layout\n * instead of rendering it as a label/value pair. Intended for action columns\n * such as an overflow menu. Ignored on non-mobile layouts.\n */\n mobileHeader?: boolean;\n\n [key: string]: any;\n}\n\n/**\n * A sortable table column, which ties `sortable: true` to a key that is a real\n * property of `T`, the type of data in the table.\n */\nexport interface SortableTableColumn<T> extends BaseTableColumn<T> {\n sortable: true;\n}\n\n/**\n * An interface representing a column in a table that cannot be sorted.\n * This can be mapped to an actual property of the object or to a virtual column.\n *\n * @typeparam T - The type of data in the table.\n */\nexport interface NoneSortableTableColumn<T> extends BaseTableColumn<T> {\n sortable?: false;\n}\n\nexport type TableColumn<T> = SortableTableColumn<T> | NoneSortableTableColumn<T>;\n\nexport interface SortColumn<T> {\n column?: TableRowKey<T>;\n direction: SortDirection;\n}\n\nexport type TableSortData<T> = SortColumn<T> | SortColumn<T>[] | undefined;\n\nexport type TableRowKeyData<T> = TableRowKey<T> | TableRowKey<T>[] | undefined;\n\nexport interface GroupData<T> {\n key: string;\n value?: Partial<T>;\n}\n\nexport type GroupKey<T> = TableColumn<T>['key'];\n\nexport type GroupKeys<T> = GroupKey<T> | GroupKey<T>[] | undefined;\n\nexport interface Props<T> {\n loading?: boolean;\n stickyHeader?: boolean;\n stick?: boolean;\n selectable?: boolean;\n disableCheckAll?: boolean;\n colspan?: number;\n columns?: TableColumn<T>[];\n capitalizeHeaders?: boolean;\n isAllSelected?: boolean;\n indeterminate?: boolean;\n dense?: boolean;\n sortedMap?: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n sortData?: TableSortData<T>;\n columnAttr?: keyof TableColumn<T>;\n dataId?: string;\n}\n\nconst {\n loading = false,\n stickyHeader = false,\n stick = false,\n selectable = false,\n disableCheckAll = false,\n colspan = 0,\n columns,\n capitalizeHeaders = false,\n isAllSelected = false,\n indeterminate = false,\n dense = false,\n sortedMap = {} as Partial<Record<TableRowKey<T>, SortColumn<T>>>,\n columnAttr = 'label',\n sortData,\n dataId = 'head-main',\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'select:all': [value: boolean];\n 'sort': [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst tableHeadStyles = tv({\n slots: {\n thead: 'between:border-t between:border-b-0 between:border-rui-divider',\n checkbox: `px-2 w-14.5 max-w-14.5 [&_label]:ml-0 bg-rui-surface-muted ${NESTED_BAR}`,\n // tinted like the pagination bar, framing the body; opaque, so rows scroll behind a stuck header\n th: `[:where(&)]:px-4 bg-rui-surface-muted ${NESTED_BAR}`,\n // labels read as secondary to the data; the sorted column's label steps up to primary\n columnText: 'text-rui-text-secondary font-medium text-[0.8125rem] leading-5',\n // the negative margin cancels the button's own padding so the label lines up with the cells below\n sortButton: 'inline-flex group/sort -mx-1.5',\n // a resting icon marks sortable columns for keyboard and touch users, at 3:1 on a nested table's darker header\n sortIcon: 'transition opacity-75 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100',\n // tucked against the arrow, closer than the button's gap\n sortPosition: 'text-[0.6875rem] leading-none font-semibold tabular-nums text-rui-text-secondary',\n /*\n * The row is always there and only its bar comes and goes: a collapsed-border table gives even a\n * zero-height row half a pixel, so adding the row on load pushed the body down.\n */\n loaderRow: 'border-none',\n progress: 'p-0 h-0',\n progressWrapper: 'h-0 -mt-1',\n },\n variants: {\n position: {\n default: {},\n sticky: { thead: 'top-0 z-rui-raised absolute' },\n fixed: {\n thead: 'top-0 z-rui-raised fixed',\n th: 'border-b border-b-rui-divider',\n },\n },\n // a fixed height evens out rows with and without sort buttons; `:where()` lets a column's `class` win\n dense: {\n true: { th: '[:where(&)]:py-0.5 [:where(&)]:h-8' },\n false: { th: '[:where(&)]:py-1 [:where(&)]:h-10' },\n },\n },\n defaultVariants: {\n position: 'default',\n dense: false,\n },\n});\n\nconst headerPosition = computed<'default' | 'sticky' | 'fixed'>(() => {\n if (stickyHeader && stick)\n return 'fixed';\n if (stickyHeader)\n return 'sticky';\n return 'default';\n});\n\nconst ui = computed<ReturnType<typeof tableHeadStyles>>(() => tableHeadStyles({\n position: get(headerPosition),\n dense,\n}));\n\nfunction getSortIconClass(key: TableColumn<T>['key']): string | undefined {\n if (!isSortedBy(key))\n return undefined;\n const direction = getSortDirection(key);\n return `opacity-100! ${direction === SortDirection.asc ? 'rotate-180' : 'rotate-0'}`;\n}\n\n/**\n * An unsorted column shows a neutral up-down icon, so nothing reads as sorted\n * until it is; the sorted column shows its direction.\n */\nfunction getSortIconName(key: TableColumn<T>['key']): RuiIcons {\n return isSortedBy(key) ? 'lu-arrow-down' : 'lu-arrow-up-down';\n}\n\nfunction getColumnTextClass(key: TableColumn<T>['key']): string {\n return get(ui).columnText({ class: isSortedBy(key) ? 'text-rui-text' : undefined });\n}\n\nfunction onSort({ key, direction }: TableColumn<T>): void {\n return emit('sort', {\n key: key as TableRowKey<T>,\n direction: direction ?? SortDirection.asc,\n });\n}\n\nfunction onToggleAll(checked: boolean) {\n return emit('select:all', checked);\n}\n\nfunction isSortedBy(key: TableColumn<T>['key']): boolean {\n return key in sortedMap;\n}\n\nfunction getSortIndex(key: TableColumn<T>['key']): number {\n if (!sortData || !Array.isArray(sortData) || !isSortedBy(key))\n return -1;\n\n return sortData.findIndex(sort => sort.column === key);\n}\n\n/**\n * A column's place in a multi-column sort, shown beside its arrow. A lone sorted column shows none,\n * since its arrow already says everything.\n */\nfunction getSortPosition(key: TableColumn<T>['key']): number | undefined {\n if (!Array.isArray(sortData) || sortData.length < 2)\n return undefined;\n const index = getSortIndex(key);\n return index >= 0 ? index + 1 : undefined;\n}\n\nfunction getSortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key]?.direction;\n}\n\nfunction getAriaSort(column: TableColumn<T>): 'ascending' | 'descending' | 'none' | undefined {\n if (!column.sortable)\n return undefined;\n const direction = getSortDirection(column.key);\n if (direction === SortDirection.asc)\n return 'ascending';\n if (direction === SortDirection.desc)\n return 'descending';\n return 'none';\n}\n\n/**\n * The name a screen reader hears for a column drawn without a label, since an empty header cell\n * leaves the column unnamed: the built-in expand column is \"Details\", any other its key.\n *\n * @param column - the column whose label is empty\n * @returns Details or the column key\n */\nfunction getHiddenHeaderText(column: TableColumn<T>): string {\n return column.key === 'expand' ? 'Details' : column.key.toString();\n}\n</script>\n\n<template>\n <thead\n :data-id=\"dataId\"\n :class=\"ui.thead()\"\n >\n <tr>\n <th\n v-if=\"selectable\"\n :class=\"ui.checkbox()\"\n scope=\"col\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :disabled=\"disableCheckAll\"\n :indeterminate=\"indeterminate\"\n :model-value=\"isAllSelected\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n data-id=\"table-toggle-check-all\"\n aria-label=\"Select all rows\"\n details=\"hidden\"\n @update:model-value=\"onToggleAll($event)\"\n />\n </th>\n\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"[\n ui.th({ class: getAlignClass(column.align) }),\n column.class,\n // only labels the table made up from row keys; a label the consumer wrote is shown as written\n { capitalize: capitalizeHeaders },\n ]\"\n scope=\"col\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n :aria-sort=\"getAriaSort(column)\"\n :data-id=\"column.sortable ? 'column-sortable' : undefined\"\n >\n <slot\n :column=\"column\"\n :name=\"`header.${column.key.toString()}`\"\n >\n <RuiButton\n v-if=\"column.sortable\"\n :class=\"ui.sortButton({ class: getSortButtonAlignClass(column.align) })\"\n :data-sorted=\"isSortedBy(column.key) || undefined\"\n :data-direction=\"getSortDirection(column.key)\"\n size=\"sm\"\n variant=\"text\"\n @click=\"onSort(column)\"\n >\n <span\n :class=\"getColumnTextClass(column.key)\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n\n <template\n v-if=\"column.align === TableAlign.end\"\n #prepend\n >\n <span\n v-if=\"getSortPosition(column.key)\"\n :class=\"ui.sortPosition({ class: '-mr-1.5' })\"\n data-id=\"sort-position\"\n >\n {{ getSortPosition(column.key) }}\n </span>\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n :name=\"getSortIconName(column.key)\"\n size=\"18\"\n />\n </template>\n\n <template #append>\n <template v-if=\"column.align !== TableAlign.end\">\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n :name=\"getSortIconName(column.key)\"\n size=\"18\"\n />\n <span\n v-if=\"getSortPosition(column.key)\"\n :class=\"ui.sortPosition({ class: '-ml-1.5' })\"\n data-id=\"sort-position\"\n >\n {{ getSortPosition(column.key) }}\n </span>\n </template>\n </template>\n </RuiButton>\n <span\n v-else\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n <template v-if=\"column[columnAttr]\">{{ column[columnAttr] }}</template>\n <span\n v-else\n class=\"sr-only\"\n >\n {{ getHiddenHeaderText(column) }}\n </span>\n </slot>\n </span>\n </slot>\n </th>\n </tr>\n <tr\n :class=\"ui.loaderRow()\"\n :data-id=\"loading ? 'thead-loader' : undefined\"\n :aria-hidden=\"loading ? undefined : 'true'\"\n >\n <!-- a `td`, not a header cell, so it never counts as a column heading -->\n <td\n :class=\"ui.progress()\"\n :colspan=\"colspan\"\n >\n <div\n v-if=\"loading\"\n :class=\"ui.progressWrapper()\"\n >\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n />\n </div>\n </td>\n </tr>\n </thead>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"RuiTableHead.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTableHead.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, K extends keyof T = keyof T\">\nimport type { RuiIcons } from '@/icons';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { getAlignClass, getSortButtonAlignClass, SortDirection, TableAlign } from '@/components/tables/table-props';\nimport { tableHeadStyles } from './table-head-styles';\n\n/**\n * A sortable column name for `T`, the type of the data in the column: the name\n * must be a key of that object type.\n */\nexport type TableRowKey<T> = keyof T extends string ? keyof T : never;\n\nexport interface BaseTableColumn<T> {\n key: TableRowKey<T> | string;\n sortable?: boolean;\n direction?: SortDirection;\n align?: TableAlign;\n class?: string;\n cellClass?: string;\n tdClass?: string;\n colspan?: string | number;\n rowspan?: string | number;\n /**\n * hide this column when the table is rendered in its stacked mobile layout\n */\n mobileHidden?: boolean;\n /**\n * pin this column to the card header (top row) in the stacked mobile layout\n * instead of rendering it as a label/value pair. Intended for action columns\n * such as an overflow menu. Ignored on non-mobile layouts.\n */\n mobileHeader?: boolean;\n\n [key: string]: any;\n}\n\n/**\n * A sortable table column, which ties `sortable: true` to a key that is a real\n * property of `T`, the type of data in the table.\n */\nexport interface SortableTableColumn<T> extends BaseTableColumn<T> {\n sortable: true;\n}\n\n/**\n * An interface representing a column in a table that cannot be sorted.\n * This can be mapped to an actual property of the object or to a virtual column.\n *\n * @typeparam T - The type of data in the table.\n */\nexport interface NoneSortableTableColumn<T> extends BaseTableColumn<T> {\n sortable?: false;\n}\n\nexport type TableColumn<T> = SortableTableColumn<T> | NoneSortableTableColumn<T>;\n\nexport interface SortColumn<T> {\n column?: TableRowKey<T>;\n direction: SortDirection;\n}\n\nexport type TableSortData<T> = SortColumn<T> | SortColumn<T>[] | undefined;\n\nexport type TableRowKeyData<T> = TableRowKey<T> | TableRowKey<T>[] | undefined;\n\nexport interface GroupData<T> {\n key: string;\n value?: Partial<T>;\n}\n\nexport type GroupKey<T> = TableColumn<T>['key'];\n\nexport type GroupKeys<T> = GroupKey<T> | GroupKey<T>[] | undefined;\n\nexport interface Props<T> {\n loading?: boolean;\n stickyHeader?: boolean;\n stick?: boolean;\n selectable?: boolean;\n disableCheckAll?: boolean;\n colspan?: number;\n columns?: TableColumn<T>[];\n capitalizeHeaders?: boolean;\n isAllSelected?: boolean;\n indeterminate?: boolean;\n dense?: boolean;\n sortedMap?: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n sortData?: TableSortData<T>;\n columnAttr?: keyof TableColumn<T>;\n dataId?: string;\n}\n\nconst {\n loading = false,\n stickyHeader = false,\n stick = false,\n selectable = false,\n disableCheckAll = false,\n colspan = 0,\n columns,\n capitalizeHeaders = false,\n isAllSelected = false,\n indeterminate = false,\n dense = false,\n sortedMap = {} as Partial<Record<TableRowKey<T>, SortColumn<T>>>,\n columnAttr = 'label',\n sortData,\n dataId = 'head-main',\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'select:all': [value: boolean];\n 'sort': [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst headerPosition = computed<'default' | 'sticky' | 'fixed'>(() => {\n if (stickyHeader && stick)\n return 'fixed';\n if (stickyHeader)\n return 'sticky';\n return 'default';\n});\n\nconst ui = computed<ReturnType<typeof tableHeadStyles>>(() => tableHeadStyles({\n position: get(headerPosition),\n dense,\n}));\n\nfunction getSortIconClass(key: TableColumn<T>['key']): string | undefined {\n if (!isSortedBy(key))\n return undefined;\n const direction = getSortDirection(key);\n return `opacity-100! ${direction === SortDirection.asc ? 'rotate-180' : 'rotate-0'}`;\n}\n\n/**\n * An unsorted column shows a neutral up-down icon, so nothing reads as sorted\n * until it is; the sorted column shows its direction.\n */\nfunction getSortIconName(key: TableColumn<T>['key']): RuiIcons {\n return isSortedBy(key) ? 'lu-arrow-down' : 'lu-arrow-up-down';\n}\n\nfunction getColumnTextClass(key: TableColumn<T>['key']): string {\n return get(ui).columnText({ class: isSortedBy(key) ? 'text-rui-text' : undefined });\n}\n\nfunction onSort({ key, direction }: TableColumn<T>): void {\n return emit('sort', {\n key: key as TableRowKey<T>,\n direction: direction ?? SortDirection.asc,\n });\n}\n\nfunction onToggleAll(checked: boolean) {\n return emit('select:all', checked);\n}\n\nfunction isSortedBy(key: TableColumn<T>['key']): boolean {\n return key in sortedMap;\n}\n\nfunction getSortIndex(key: TableColumn<T>['key']): number {\n if (!sortData || !Array.isArray(sortData) || !isSortedBy(key))\n return -1;\n\n return sortData.findIndex(sort => sort.column === key);\n}\n\n/**\n * A column's place in a multi-column sort, shown beside its arrow. A lone sorted column shows none,\n * since its arrow already says everything.\n */\nfunction getSortPosition(key: TableColumn<T>['key']): number | undefined {\n if (!Array.isArray(sortData) || sortData.length < 2)\n return undefined;\n const index = getSortIndex(key);\n return index >= 0 ? index + 1 : undefined;\n}\n\nfunction getSortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key]?.direction;\n}\n\nfunction getAriaSort(column: TableColumn<T>): 'ascending' | 'descending' | 'none' | undefined {\n if (!column.sortable)\n return undefined;\n const direction = getSortDirection(column.key);\n if (direction === SortDirection.asc)\n return 'ascending';\n if (direction === SortDirection.desc)\n return 'descending';\n return 'none';\n}\n\n/**\n * The name a screen reader hears for a column drawn without a label, since an empty header cell\n * leaves the column unnamed: the built-in expand column is \"Details\", any other its key.\n *\n * @param column - the column whose label is empty\n * @returns Details or the column key\n */\nfunction getHiddenHeaderText(column: TableColumn<T>): string {\n return column.key === 'expand' ? 'Details' : column.key.toString();\n}\n</script>\n\n<template>\n <thead\n :data-id=\"dataId\"\n :class=\"ui.thead()\"\n >\n <tr>\n <th\n v-if=\"selectable\"\n :class=\"ui.checkbox()\"\n scope=\"col\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :disabled=\"disableCheckAll\"\n :indeterminate=\"indeterminate\"\n :model-value=\"isAllSelected\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n data-id=\"table-toggle-check-all\"\n aria-label=\"Select all rows\"\n details=\"hidden\"\n @update:model-value=\"onToggleAll($event)\"\n />\n </th>\n\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"[\n ui.th({ class: getAlignClass(column.align) }),\n column.class,\n // only labels the table made up from row keys; a label the consumer wrote is shown as written\n { capitalize: capitalizeHeaders },\n ]\"\n scope=\"col\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n :aria-sort=\"getAriaSort(column)\"\n :data-id=\"column.sortable ? 'column-sortable' : undefined\"\n >\n <slot\n :column=\"column\"\n :name=\"`header.${column.key.toString()}`\"\n >\n <RuiButton\n v-if=\"column.sortable\"\n :class=\"ui.sortButton({ class: getSortButtonAlignClass(column.align) })\"\n :data-sorted=\"isSortedBy(column.key) || undefined\"\n :data-direction=\"getSortDirection(column.key)\"\n size=\"sm\"\n variant=\"text\"\n @click=\"onSort(column)\"\n >\n <span\n :class=\"getColumnTextClass(column.key)\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n\n <template\n v-if=\"column.align === TableAlign.end\"\n #prepend\n >\n <span\n v-if=\"getSortPosition(column.key)\"\n :class=\"ui.sortPosition({ class: '-mr-1.5' })\"\n data-id=\"sort-position\"\n >\n {{ getSortPosition(column.key) }}\n </span>\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n :name=\"getSortIconName(column.key)\"\n size=\"18\"\n />\n </template>\n\n <template #append>\n <template v-if=\"column.align !== TableAlign.end\">\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n :name=\"getSortIconName(column.key)\"\n size=\"18\"\n />\n <span\n v-if=\"getSortPosition(column.key)\"\n :class=\"ui.sortPosition({ class: '-ml-1.5' })\"\n data-id=\"sort-position\"\n >\n {{ getSortPosition(column.key) }}\n </span>\n </template>\n </template>\n </RuiButton>\n <span\n v-else\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n <template v-if=\"column[columnAttr]\">{{ column[columnAttr] }}</template>\n <span\n v-else\n class=\"sr-only\"\n >\n {{ getHiddenHeaderText(column) }}\n </span>\n </slot>\n </span>\n </slot>\n </th>\n </tr>\n <tr\n :class=\"ui.loaderRow()\"\n :data-id=\"loading ? 'thead-loader' : undefined\"\n :aria-hidden=\"loading ? undefined : 'true'\"\n >\n <!-- a `td`, not a header cell, so it never counts as a column heading -->\n <td\n :class=\"ui.progress()\"\n :colspan=\"colspan\"\n >\n <div\n v-if=\"loading\"\n :class=\"ui.progressWrapper()\"\n >\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n />\n </div>\n </td>\n </tr>\n </thead>\n</template>\n"],"mappings":""}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { get } from "../../vendor/@vueuse/shared/dist/index.js";
|
|
2
|
-
import { tv } from "../../utils/tv.js";
|
|
3
2
|
import RuiIcon_default from "../icons/RuiIcon.js";
|
|
4
3
|
import RuiProgress_default from "../progress/RuiProgress.js";
|
|
5
4
|
import RuiButton_default from "../buttons/button/RuiButton.js";
|
|
6
5
|
import RuiCheckbox_default from "../forms/checkbox/RuiCheckbox.js";
|
|
7
|
-
import { NESTED_BAR } from "./data-table-styles.js";
|
|
8
6
|
import { SortDirection, TableAlign, getAlignClass, getSortButtonAlignClass } from "./table-props.js";
|
|
7
|
+
import { tableHeadStyles } from "./table-head-styles.js";
|
|
9
8
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderList, renderSlot, toDisplayString, unref, withCtx } from "vue";
|
|
10
9
|
//#region src/components/tables/RuiTableHead.vue?vue&type=script&setup=true&lang.ts
|
|
11
10
|
var _hoisted_1 = ["data-id"];
|
|
@@ -70,38 +69,6 @@ var RuiTableHead_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ def
|
|
|
70
69
|
emits: ["select:all", "sort"],
|
|
71
70
|
setup(__props, { emit: __emit }) {
|
|
72
71
|
const emit = __emit;
|
|
73
|
-
const tableHeadStyles = tv({
|
|
74
|
-
slots: {
|
|
75
|
-
thead: "between:border-t between:border-b-0 between:border-rui-divider",
|
|
76
|
-
checkbox: `px-2 w-14.5 max-w-14.5 [&_label]:ml-0 bg-rui-surface-muted ${NESTED_BAR}`,
|
|
77
|
-
th: `[:where(&)]:px-4 bg-rui-surface-muted ${NESTED_BAR}`,
|
|
78
|
-
columnText: "text-rui-text-secondary font-medium text-[0.8125rem] leading-5",
|
|
79
|
-
sortButton: "inline-flex group/sort -mx-1.5",
|
|
80
|
-
sortIcon: "transition opacity-75 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100",
|
|
81
|
-
sortPosition: "text-[0.6875rem] leading-none font-semibold tabular-nums text-rui-text-secondary",
|
|
82
|
-
loaderRow: "border-none",
|
|
83
|
-
progress: "p-0 h-0",
|
|
84
|
-
progressWrapper: "h-0 -mt-1"
|
|
85
|
-
},
|
|
86
|
-
variants: {
|
|
87
|
-
position: {
|
|
88
|
-
default: {},
|
|
89
|
-
sticky: { thead: "top-0 z-rui-raised absolute" },
|
|
90
|
-
fixed: {
|
|
91
|
-
thead: "top-0 z-rui-raised fixed",
|
|
92
|
-
th: "border-b border-b-rui-divider"
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
|
-
dense: {
|
|
96
|
-
true: { th: "[:where(&)]:py-0.5 [:where(&)]:h-8" },
|
|
97
|
-
false: { th: "[:where(&)]:py-1 [:where(&)]:h-10" }
|
|
98
|
-
}
|
|
99
|
-
},
|
|
100
|
-
defaultVariants: {
|
|
101
|
-
position: "default",
|
|
102
|
-
dense: false
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
72
|
const headerPosition = computed(() => {
|
|
106
73
|
if (__props.stickyHeader && __props.stick) return "fixed";
|
|
107
74
|
if (__props.stickyHeader) return "sticky";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTableHead.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","RuiCheckbox","_createCommentVNode","_Fragment","_renderList","_renderSlot","_createBlock","RuiButton","_createSlots","_withCtx","RuiIcon","_toDisplayString","_createTextVNode","RuiProgress"],"sources":["../../../src/components/tables/RuiTableHead.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, K extends keyof T = keyof T\">\nimport type { RuiIcons } from '@/icons';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { NESTED_BAR } from '@/components/tables/data-table-styles';\nimport { getAlignClass, getSortButtonAlignClass, SortDirection, TableAlign } from '@/components/tables/table-props';\nimport { tv } from '@/utils/tv';\n\n/**\n * A sortable column name for `T`, the type of the data in the column: the name\n * must be a key of that object type.\n */\nexport type TableRowKey<T> = keyof T extends string ? keyof T : never;\n\nexport interface BaseTableColumn<T> {\n key: TableRowKey<T> | string;\n sortable?: boolean;\n direction?: SortDirection;\n align?: TableAlign;\n class?: string;\n cellClass?: string;\n tdClass?: string;\n colspan?: string | number;\n rowspan?: string | number;\n /**\n * hide this column when the table is rendered in its stacked mobile layout\n */\n mobileHidden?: boolean;\n /**\n * pin this column to the card header (top row) in the stacked mobile layout\n * instead of rendering it as a label/value pair. Intended for action columns\n * such as an overflow menu. Ignored on non-mobile layouts.\n */\n mobileHeader?: boolean;\n\n [key: string]: any;\n}\n\n/**\n * A sortable table column, which ties `sortable: true` to a key that is a real\n * property of `T`, the type of data in the table.\n */\nexport interface SortableTableColumn<T> extends BaseTableColumn<T> {\n sortable: true;\n}\n\n/**\n * An interface representing a column in a table that cannot be sorted.\n * This can be mapped to an actual property of the object or to a virtual column.\n *\n * @typeparam T - The type of data in the table.\n */\nexport interface NoneSortableTableColumn<T> extends BaseTableColumn<T> {\n sortable?: false;\n}\n\nexport type TableColumn<T> = SortableTableColumn<T> | NoneSortableTableColumn<T>;\n\nexport interface SortColumn<T> {\n column?: TableRowKey<T>;\n direction: SortDirection;\n}\n\nexport type TableSortData<T> = SortColumn<T> | SortColumn<T>[] | undefined;\n\nexport type TableRowKeyData<T> = TableRowKey<T> | TableRowKey<T>[] | undefined;\n\nexport interface GroupData<T> {\n key: string;\n value?: Partial<T>;\n}\n\nexport type GroupKey<T> = TableColumn<T>['key'];\n\nexport type GroupKeys<T> = GroupKey<T> | GroupKey<T>[] | undefined;\n\nexport interface Props<T> {\n loading?: boolean;\n stickyHeader?: boolean;\n stick?: boolean;\n selectable?: boolean;\n disableCheckAll?: boolean;\n colspan?: number;\n columns?: TableColumn<T>[];\n capitalizeHeaders?: boolean;\n isAllSelected?: boolean;\n indeterminate?: boolean;\n dense?: boolean;\n sortedMap?: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n sortData?: TableSortData<T>;\n columnAttr?: keyof TableColumn<T>;\n dataId?: string;\n}\n\nconst {\n loading = false,\n stickyHeader = false,\n stick = false,\n selectable = false,\n disableCheckAll = false,\n colspan = 0,\n columns,\n capitalizeHeaders = false,\n isAllSelected = false,\n indeterminate = false,\n dense = false,\n sortedMap = {} as Partial<Record<TableRowKey<T>, SortColumn<T>>>,\n columnAttr = 'label',\n sortData,\n dataId = 'head-main',\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'select:all': [value: boolean];\n 'sort': [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst tableHeadStyles = tv({\n slots: {\n thead: 'between:border-t between:border-b-0 between:border-rui-divider',\n checkbox: `px-2 w-14.5 max-w-14.5 [&_label]:ml-0 bg-rui-surface-muted ${NESTED_BAR}`,\n // tinted like the pagination bar, framing the body; opaque, so rows scroll behind a stuck header\n th: `[:where(&)]:px-4 bg-rui-surface-muted ${NESTED_BAR}`,\n // labels read as secondary to the data; the sorted column's label steps up to primary\n columnText: 'text-rui-text-secondary font-medium text-[0.8125rem] leading-5',\n // the negative margin cancels the button's own padding so the label lines up with the cells below\n sortButton: 'inline-flex group/sort -mx-1.5',\n // a resting icon marks sortable columns for keyboard and touch users, at 3:1 on a nested table's darker header\n sortIcon: 'transition opacity-75 group-hover/sort:opacity-100 group-focus-visible/sort:opacity-100',\n // tucked against the arrow, closer than the button's gap\n sortPosition: 'text-[0.6875rem] leading-none font-semibold tabular-nums text-rui-text-secondary',\n /*\n * The row is always there and only its bar comes and goes: a collapsed-border table gives even a\n * zero-height row half a pixel, so adding the row on load pushed the body down.\n */\n loaderRow: 'border-none',\n progress: 'p-0 h-0',\n progressWrapper: 'h-0 -mt-1',\n },\n variants: {\n position: {\n default: {},\n sticky: { thead: 'top-0 z-rui-raised absolute' },\n fixed: {\n thead: 'top-0 z-rui-raised fixed',\n th: 'border-b border-b-rui-divider',\n },\n },\n // a fixed height evens out rows with and without sort buttons; `:where()` lets a column's `class` win\n dense: {\n true: { th: '[:where(&)]:py-0.5 [:where(&)]:h-8' },\n false: { th: '[:where(&)]:py-1 [:where(&)]:h-10' },\n },\n },\n defaultVariants: {\n position: 'default',\n dense: false,\n },\n});\n\nconst headerPosition = computed<'default' | 'sticky' | 'fixed'>(() => {\n if (stickyHeader && stick)\n return 'fixed';\n if (stickyHeader)\n return 'sticky';\n return 'default';\n});\n\nconst ui = computed<ReturnType<typeof tableHeadStyles>>(() => tableHeadStyles({\n position: get(headerPosition),\n dense,\n}));\n\nfunction getSortIconClass(key: TableColumn<T>['key']): string | undefined {\n if (!isSortedBy(key))\n return undefined;\n const direction = getSortDirection(key);\n return `opacity-100! ${direction === SortDirection.asc ? 'rotate-180' : 'rotate-0'}`;\n}\n\n/**\n * An unsorted column shows a neutral up-down icon, so nothing reads as sorted\n * until it is; the sorted column shows its direction.\n */\nfunction getSortIconName(key: TableColumn<T>['key']): RuiIcons {\n return isSortedBy(key) ? 'lu-arrow-down' : 'lu-arrow-up-down';\n}\n\nfunction getColumnTextClass(key: TableColumn<T>['key']): string {\n return get(ui).columnText({ class: isSortedBy(key) ? 'text-rui-text' : undefined });\n}\n\nfunction onSort({ key, direction }: TableColumn<T>): void {\n return emit('sort', {\n key: key as TableRowKey<T>,\n direction: direction ?? SortDirection.asc,\n });\n}\n\nfunction onToggleAll(checked: boolean) {\n return emit('select:all', checked);\n}\n\nfunction isSortedBy(key: TableColumn<T>['key']): boolean {\n return key in sortedMap;\n}\n\nfunction getSortIndex(key: TableColumn<T>['key']): number {\n if (!sortData || !Array.isArray(sortData) || !isSortedBy(key))\n return -1;\n\n return sortData.findIndex(sort => sort.column === key);\n}\n\n/**\n * A column's place in a multi-column sort, shown beside its arrow. A lone sorted column shows none,\n * since its arrow already says everything.\n */\nfunction getSortPosition(key: TableColumn<T>['key']): number | undefined {\n if (!Array.isArray(sortData) || sortData.length < 2)\n return undefined;\n const index = getSortIndex(key);\n return index >= 0 ? index + 1 : undefined;\n}\n\nfunction getSortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key]?.direction;\n}\n\nfunction getAriaSort(column: TableColumn<T>): 'ascending' | 'descending' | 'none' | undefined {\n if (!column.sortable)\n return undefined;\n const direction = getSortDirection(column.key);\n if (direction === SortDirection.asc)\n return 'ascending';\n if (direction === SortDirection.desc)\n return 'descending';\n return 'none';\n}\n\n/**\n * The name a screen reader hears for a column drawn without a label, since an empty header cell\n * leaves the column unnamed: the built-in expand column is \"Details\", any other its key.\n *\n * @param column - the column whose label is empty\n * @returns Details or the column key\n */\nfunction getHiddenHeaderText(column: TableColumn<T>): string {\n return column.key === 'expand' ? 'Details' : column.key.toString();\n}\n</script>\n\n<template>\n <thead\n :data-id=\"dataId\"\n :class=\"ui.thead()\"\n >\n <tr>\n <th\n v-if=\"selectable\"\n :class=\"ui.checkbox()\"\n scope=\"col\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :disabled=\"disableCheckAll\"\n :indeterminate=\"indeterminate\"\n :model-value=\"isAllSelected\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n data-id=\"table-toggle-check-all\"\n aria-label=\"Select all rows\"\n details=\"hidden\"\n @update:model-value=\"onToggleAll($event)\"\n />\n </th>\n\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"[\n ui.th({ class: getAlignClass(column.align) }),\n column.class,\n // only labels the table made up from row keys; a label the consumer wrote is shown as written\n { capitalize: capitalizeHeaders },\n ]\"\n scope=\"col\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n :aria-sort=\"getAriaSort(column)\"\n :data-id=\"column.sortable ? 'column-sortable' : undefined\"\n >\n <slot\n :column=\"column\"\n :name=\"`header.${column.key.toString()}`\"\n >\n <RuiButton\n v-if=\"column.sortable\"\n :class=\"ui.sortButton({ class: getSortButtonAlignClass(column.align) })\"\n :data-sorted=\"isSortedBy(column.key) || undefined\"\n :data-direction=\"getSortDirection(column.key)\"\n size=\"sm\"\n variant=\"text\"\n @click=\"onSort(column)\"\n >\n <span\n :class=\"getColumnTextClass(column.key)\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n\n <template\n v-if=\"column.align === TableAlign.end\"\n #prepend\n >\n <span\n v-if=\"getSortPosition(column.key)\"\n :class=\"ui.sortPosition({ class: '-mr-1.5' })\"\n data-id=\"sort-position\"\n >\n {{ getSortPosition(column.key) }}\n </span>\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n :name=\"getSortIconName(column.key)\"\n size=\"18\"\n />\n </template>\n\n <template #append>\n <template v-if=\"column.align !== TableAlign.end\">\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n :name=\"getSortIconName(column.key)\"\n size=\"18\"\n />\n <span\n v-if=\"getSortPosition(column.key)\"\n :class=\"ui.sortPosition({ class: '-ml-1.5' })\"\n data-id=\"sort-position\"\n >\n {{ getSortPosition(column.key) }}\n </span>\n </template>\n </template>\n </RuiButton>\n <span\n v-else\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n <template v-if=\"column[columnAttr]\">{{ column[columnAttr] }}</template>\n <span\n v-else\n class=\"sr-only\"\n >\n {{ getHiddenHeaderText(column) }}\n </span>\n </slot>\n </span>\n </slot>\n </th>\n </tr>\n <tr\n :class=\"ui.loaderRow()\"\n :data-id=\"loading ? 'thead-loader' : undefined\"\n :aria-hidden=\"loading ? undefined : 'true'\"\n >\n <!-- a `td`, not a header cell, so it never counts as a column heading -->\n <td\n :class=\"ui.progress()\"\n :colspan=\"colspan\"\n >\n <div\n v-if=\"loading\"\n :class=\"ui.progressWrapper()\"\n >\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n />\n </div>\n </td>\n </tr>\n </thead>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RuiTableHead.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","RuiCheckbox","_createCommentVNode","_Fragment","_renderList","_renderSlot","_createBlock","RuiButton","_createSlots","_withCtx","RuiIcon","_toDisplayString","_createTextVNode","RuiProgress"],"sources":["../../../src/components/tables/RuiTableHead.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, K extends keyof T = keyof T\">\nimport type { RuiIcons } from '@/icons';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { getAlignClass, getSortButtonAlignClass, SortDirection, TableAlign } from '@/components/tables/table-props';\nimport { tableHeadStyles } from './table-head-styles';\n\n/**\n * A sortable column name for `T`, the type of the data in the column: the name\n * must be a key of that object type.\n */\nexport type TableRowKey<T> = keyof T extends string ? keyof T : never;\n\nexport interface BaseTableColumn<T> {\n key: TableRowKey<T> | string;\n sortable?: boolean;\n direction?: SortDirection;\n align?: TableAlign;\n class?: string;\n cellClass?: string;\n tdClass?: string;\n colspan?: string | number;\n rowspan?: string | number;\n /**\n * hide this column when the table is rendered in its stacked mobile layout\n */\n mobileHidden?: boolean;\n /**\n * pin this column to the card header (top row) in the stacked mobile layout\n * instead of rendering it as a label/value pair. Intended for action columns\n * such as an overflow menu. Ignored on non-mobile layouts.\n */\n mobileHeader?: boolean;\n\n [key: string]: any;\n}\n\n/**\n * A sortable table column, which ties `sortable: true` to a key that is a real\n * property of `T`, the type of data in the table.\n */\nexport interface SortableTableColumn<T> extends BaseTableColumn<T> {\n sortable: true;\n}\n\n/**\n * An interface representing a column in a table that cannot be sorted.\n * This can be mapped to an actual property of the object or to a virtual column.\n *\n * @typeparam T - The type of data in the table.\n */\nexport interface NoneSortableTableColumn<T> extends BaseTableColumn<T> {\n sortable?: false;\n}\n\nexport type TableColumn<T> = SortableTableColumn<T> | NoneSortableTableColumn<T>;\n\nexport interface SortColumn<T> {\n column?: TableRowKey<T>;\n direction: SortDirection;\n}\n\nexport type TableSortData<T> = SortColumn<T> | SortColumn<T>[] | undefined;\n\nexport type TableRowKeyData<T> = TableRowKey<T> | TableRowKey<T>[] | undefined;\n\nexport interface GroupData<T> {\n key: string;\n value?: Partial<T>;\n}\n\nexport type GroupKey<T> = TableColumn<T>['key'];\n\nexport type GroupKeys<T> = GroupKey<T> | GroupKey<T>[] | undefined;\n\nexport interface Props<T> {\n loading?: boolean;\n stickyHeader?: boolean;\n stick?: boolean;\n selectable?: boolean;\n disableCheckAll?: boolean;\n colspan?: number;\n columns?: TableColumn<T>[];\n capitalizeHeaders?: boolean;\n isAllSelected?: boolean;\n indeterminate?: boolean;\n dense?: boolean;\n sortedMap?: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n sortData?: TableSortData<T>;\n columnAttr?: keyof TableColumn<T>;\n dataId?: string;\n}\n\nconst {\n loading = false,\n stickyHeader = false,\n stick = false,\n selectable = false,\n disableCheckAll = false,\n colspan = 0,\n columns,\n capitalizeHeaders = false,\n isAllSelected = false,\n indeterminate = false,\n dense = false,\n sortedMap = {} as Partial<Record<TableRowKey<T>, SortColumn<T>>>,\n columnAttr = 'label',\n sortData,\n dataId = 'head-main',\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'select:all': [value: boolean];\n 'sort': [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst headerPosition = computed<'default' | 'sticky' | 'fixed'>(() => {\n if (stickyHeader && stick)\n return 'fixed';\n if (stickyHeader)\n return 'sticky';\n return 'default';\n});\n\nconst ui = computed<ReturnType<typeof tableHeadStyles>>(() => tableHeadStyles({\n position: get(headerPosition),\n dense,\n}));\n\nfunction getSortIconClass(key: TableColumn<T>['key']): string | undefined {\n if (!isSortedBy(key))\n return undefined;\n const direction = getSortDirection(key);\n return `opacity-100! ${direction === SortDirection.asc ? 'rotate-180' : 'rotate-0'}`;\n}\n\n/**\n * An unsorted column shows a neutral up-down icon, so nothing reads as sorted\n * until it is; the sorted column shows its direction.\n */\nfunction getSortIconName(key: TableColumn<T>['key']): RuiIcons {\n return isSortedBy(key) ? 'lu-arrow-down' : 'lu-arrow-up-down';\n}\n\nfunction getColumnTextClass(key: TableColumn<T>['key']): string {\n return get(ui).columnText({ class: isSortedBy(key) ? 'text-rui-text' : undefined });\n}\n\nfunction onSort({ key, direction }: TableColumn<T>): void {\n return emit('sort', {\n key: key as TableRowKey<T>,\n direction: direction ?? SortDirection.asc,\n });\n}\n\nfunction onToggleAll(checked: boolean) {\n return emit('select:all', checked);\n}\n\nfunction isSortedBy(key: TableColumn<T>['key']): boolean {\n return key in sortedMap;\n}\n\nfunction getSortIndex(key: TableColumn<T>['key']): number {\n if (!sortData || !Array.isArray(sortData) || !isSortedBy(key))\n return -1;\n\n return sortData.findIndex(sort => sort.column === key);\n}\n\n/**\n * A column's place in a multi-column sort, shown beside its arrow. A lone sorted column shows none,\n * since its arrow already says everything.\n */\nfunction getSortPosition(key: TableColumn<T>['key']): number | undefined {\n if (!Array.isArray(sortData) || sortData.length < 2)\n return undefined;\n const index = getSortIndex(key);\n return index >= 0 ? index + 1 : undefined;\n}\n\nfunction getSortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key]?.direction;\n}\n\nfunction getAriaSort(column: TableColumn<T>): 'ascending' | 'descending' | 'none' | undefined {\n if (!column.sortable)\n return undefined;\n const direction = getSortDirection(column.key);\n if (direction === SortDirection.asc)\n return 'ascending';\n if (direction === SortDirection.desc)\n return 'descending';\n return 'none';\n}\n\n/**\n * The name a screen reader hears for a column drawn without a label, since an empty header cell\n * leaves the column unnamed: the built-in expand column is \"Details\", any other its key.\n *\n * @param column - the column whose label is empty\n * @returns Details or the column key\n */\nfunction getHiddenHeaderText(column: TableColumn<T>): string {\n return column.key === 'expand' ? 'Details' : column.key.toString();\n}\n</script>\n\n<template>\n <thead\n :data-id=\"dataId\"\n :class=\"ui.thead()\"\n >\n <tr>\n <th\n v-if=\"selectable\"\n :class=\"ui.checkbox()\"\n scope=\"col\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :disabled=\"disableCheckAll\"\n :indeterminate=\"indeterminate\"\n :model-value=\"isAllSelected\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n data-id=\"table-toggle-check-all\"\n aria-label=\"Select all rows\"\n details=\"hidden\"\n @update:model-value=\"onToggleAll($event)\"\n />\n </th>\n\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"[\n ui.th({ class: getAlignClass(column.align) }),\n column.class,\n // only labels the table made up from row keys; a label the consumer wrote is shown as written\n { capitalize: capitalizeHeaders },\n ]\"\n scope=\"col\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n :aria-sort=\"getAriaSort(column)\"\n :data-id=\"column.sortable ? 'column-sortable' : undefined\"\n >\n <slot\n :column=\"column\"\n :name=\"`header.${column.key.toString()}`\"\n >\n <RuiButton\n v-if=\"column.sortable\"\n :class=\"ui.sortButton({ class: getSortButtonAlignClass(column.align) })\"\n :data-sorted=\"isSortedBy(column.key) || undefined\"\n :data-direction=\"getSortDirection(column.key)\"\n size=\"sm\"\n variant=\"text\"\n @click=\"onSort(column)\"\n >\n <span\n :class=\"getColumnTextClass(column.key)\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n\n <template\n v-if=\"column.align === TableAlign.end\"\n #prepend\n >\n <span\n v-if=\"getSortPosition(column.key)\"\n :class=\"ui.sortPosition({ class: '-mr-1.5' })\"\n data-id=\"sort-position\"\n >\n {{ getSortPosition(column.key) }}\n </span>\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n :name=\"getSortIconName(column.key)\"\n size=\"18\"\n />\n </template>\n\n <template #append>\n <template v-if=\"column.align !== TableAlign.end\">\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n :name=\"getSortIconName(column.key)\"\n size=\"18\"\n />\n <span\n v-if=\"getSortPosition(column.key)\"\n :class=\"ui.sortPosition({ class: '-ml-1.5' })\"\n data-id=\"sort-position\"\n >\n {{ getSortPosition(column.key) }}\n </span>\n </template>\n </template>\n </RuiButton>\n <span\n v-else\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n <template v-if=\"column[columnAttr]\">{{ column[columnAttr] }}</template>\n <span\n v-else\n class=\"sr-only\"\n >\n {{ getHiddenHeaderText(column) }}\n </span>\n </slot>\n </span>\n </slot>\n </th>\n </tr>\n <tr\n :class=\"ui.loaderRow()\"\n :data-id=\"loading ? 'thead-loader' : undefined\"\n :aria-hidden=\"loading ? undefined : 'true'\"\n >\n <!-- a `td`, not a header cell, so it never counts as a column heading -->\n <td\n :class=\"ui.progress()\"\n :colspan=\"colspan\"\n >\n <div\n v-if=\"loading\"\n :class=\"ui.progressWrapper()\"\n >\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n />\n </div>\n </td>\n </tr>\n </thead>\n</template>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTableLoadingState.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTableLoadingState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport {
|
|
1
|
+
{"version":3,"file":"RuiTableLoadingState.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTableLoadingState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { loadingStyles } from './table-loading-state-styles';\n\nexport interface TableLoadingStateProps {\n /** Diameter of the spinner, in pixels. */\n size?: number | string;\n /**\n * Drops the reserved height, for a table that only has room to say a read is\n * in flight. Matches the same flag on RuiTableEmptyState, so the two states\n * do not resize the table as they swap.\n */\n compact?: boolean;\n}\n\ndefineOptions({\n name: 'RuiTableLoadingState',\n});\n\nconst { size = 40, compact = false } = defineProps<TableLoadingStateProps>();\n\nconst ui = computed<ReturnType<typeof loadingStyles>>(() => loadingStyles({ compact }));\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n data-id=\"table-loading\"\n >\n <RuiProgress\n circular\n color=\"primary\"\n :size=\"size\"\n variant=\"indeterminate\"\n />\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { tv } from "../../utils/tv.js";
|
|
2
1
|
import RuiProgress_default from "../progress/RuiProgress.js";
|
|
2
|
+
import { loadingStyles } from "./table-loading-state-styles.js";
|
|
3
3
|
import { computed, createElementBlock, createVNode, defineComponent, normalizeClass, openBlock } from "vue";
|
|
4
4
|
//#region src/components/tables/RuiTableLoadingState.vue?vue&type=script&setup=true&lang.ts
|
|
5
5
|
var RuiTableLoadingState_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
@@ -13,13 +13,6 @@ var RuiTableLoadingState_vue_vue_type_script_setup_true_lang_default = /*@__PURE
|
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
15
|
setup(__props) {
|
|
16
|
-
const loadingStyles = tv({
|
|
17
|
-
slots: { root: "flex items-center justify-center" },
|
|
18
|
-
variants: { compact: {
|
|
19
|
-
true: { root: "py-6" },
|
|
20
|
-
false: { root: "min-h-56 py-8" }
|
|
21
|
-
} }
|
|
22
|
-
});
|
|
23
16
|
const ui = computed(() => loadingStyles({ compact: __props.compact }));
|
|
24
17
|
return (_ctx, _cache) => {
|
|
25
18
|
return openBlock(), createElementBlock("div", {
|
package/dist/components/tables/RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_createVNode","RuiProgress"],"sources":["../../../src/components/tables/RuiTableLoadingState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport {
|
|
1
|
+
{"version":3,"file":"RuiTableLoadingState.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_createVNode","RuiProgress"],"sources":["../../../src/components/tables/RuiTableLoadingState.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { loadingStyles } from './table-loading-state-styles';\n\nexport interface TableLoadingStateProps {\n /** Diameter of the spinner, in pixels. */\n size?: number | string;\n /**\n * Drops the reserved height, for a table that only has room to say a read is\n * in flight. Matches the same flag on RuiTableEmptyState, so the two states\n * do not resize the table as they swap.\n */\n compact?: boolean;\n}\n\ndefineOptions({\n name: 'RuiTableLoadingState',\n});\n\nconst { size = 40, compact = false } = defineProps<TableLoadingStateProps>();\n\nconst ui = computed<ReturnType<typeof loadingStyles>>(() => loadingStyles({ compact }));\n</script>\n\n<template>\n <div\n :class=\"ui.root()\"\n data-id=\"table-loading\"\n >\n <RuiProgress\n circular\n color=\"primary\"\n :size=\"size\"\n variant=\"indeterminate\"\n />\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;EAsBA,MAAM,KAAK,eAAiD,cAAc,EAAE,SAAM,QAAA,QAAE,CAAC,CAAC;;GAIpF,OAAAA,UAAA,GAAAC,mBAUM,OAAA;IATH,OAAKC,eAAE,GAAA,MAAG,KAAI,CAAA;IACf,WAAQ;GAERC,GAAAA,CAAAA,YAKEC,qBAAA;IAJA,UAAA;IACA,OAAM;IACL,MAAM,QAAA;IACP,SAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuiTablePagination.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTablePagination.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiMenuSelect from '@/components/forms/select/RuiMenuSelect.vue';\nimport RuiTextField from '@/components/forms/text-field/RuiTextField.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { type TablePaginationData, usePaginationNavigation } from '@/components/tables/use-pagination-navigation';\nimport { useTable } from '@/composables/defaults/table';\nimport {
|
|
1
|
+
{"version":3,"file":"RuiTablePagination.js","names":["_sfc_main"],"sources":["../../../src/components/tables/RuiTablePagination.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiMenuSelect from '@/components/forms/select/RuiMenuSelect.vue';\nimport RuiTextField from '@/components/forms/text-field/RuiTextField.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { type TablePaginationData, usePaginationNavigation } from '@/components/tables/use-pagination-navigation';\nimport { useTable } from '@/composables/defaults/table';\nimport { paginationStyles } from './table-pagination-styles';\n\nexport type { TablePaginationData };\n\nexport interface Props {\n dense?: boolean;\n disablePerPage?: boolean;\n loading?: boolean;\n /**\n * Render a compact, touch-friendly layout: the sections spread across the\n * full width and the first/last jump buttons are dropped to save space.\n */\n mobile?: boolean;\n /**\n * Maximum number of pages before the jump-to-page dropdown is replaced\n * with a numeric input. Set to `1` to use the input whenever there is more\n * than one page, or `0` to always use the dropdown. Defaults to `500`, since\n * past that materialising the full range list stalls the main thread.\n */\n rangesThreshold?: number;\n}\n\nconst modelValue = defineModel<TablePaginationData>({ required: true });\n\nconst {\n dense = false,\n loading = false,\n disablePerPage = false,\n rangesThreshold = 500,\n mobile = false,\n} = defineProps<Props>();\n\nconst ui = computed<ReturnType<typeof paginationStyles>>(() => paginationStyles({ dense, mobile }));\n\nconst tableDefaults = useTable();\n\nconst {\n limits,\n currentLimit,\n pages,\n ranges,\n indicatorText,\n currentRange,\n useInputJump,\n hasPrev,\n hasNext,\n onPrev,\n onNext,\n onFirst,\n onLast,\n} = usePaginationNavigation(modelValue, tableDefaults, () => rangesThreshold);\n\n/**\n * With every row on one page the bar stays in place, as a summary, but the\n * page jump has nowhere to go, so it disables like the arrows beside it.\n */\nconst singlePage = computed<boolean>(() => get(pages) <= 1);\n\n/**\n * The rows-per-page select disables only once every option would fit all the\n * rows. Until then it stays live even on a single page: it is how a user\n * lowers a limit they raised past the row count.\n */\nconst everyLimitFits = computed<boolean>(() => {\n const { total } = get(modelValue);\n return get(singlePage) && get(limits).every(({ limit }) => limit >= total);\n});\n\nconst pageDraft = ref<string>(String(get(currentRange)));\n\nwatch(currentRange, (value) => {\n set(pageDraft, String(value));\n});\n\nfunction commitPageInput(): void {\n const parsed = Number.parseInt(get(pageDraft), 10);\n const maxPage = get(pages);\n if (!Number.isFinite(parsed) || maxPage === 0) {\n set(pageDraft, String(get(currentRange)));\n return;\n }\n const clamped = Math.min(Math.max(parsed, 1), maxPage);\n if (clamped !== get(currentRange))\n set(currentRange, clamped);\n set(pageDraft, String(clamped));\n}\n\nconst limitId = useId();\nconst rangesId = useId();\n</script>\n\n<template>\n <div :class=\"ui.wrapper()\">\n <div\n :class=\"ui.limit()\"\n data-id=\"table-pagination-limit-section\"\n >\n <label\n :for=\"limitId\"\n :class=\"ui.sectionLabel()\"\n >\n Rows per page:\n </label>\n <RuiMenuSelect\n :id=\"limitId\"\n v-model=\"currentLimit\"\n :options=\"limits\"\n :disabled=\"loading || disablePerPage || everyLimitFits\"\n :class-names=\"{ label: ui.select() }\"\n label=\"\"\n name=\"limit\"\n key-attr=\"limit\"\n text-attr=\"limit\"\n details=\"hidden\"\n dense\n data-id=\"table-pagination-limit\"\n />\n </div>\n <div\n :class=\"ui.ranges()\"\n data-id=\"table-pagination-ranges-section\"\n >\n <label\n :for=\"rangesId\"\n :class=\"ui.sectionLabel({ class: useInputJump ? undefined : 'sr-only' })\"\n >\n Page\n </label>\n <RuiTextField\n v-if=\"useInputJump\"\n :id=\"rangesId\"\n v-model=\"pageDraft\"\n :disabled=\"loading || singlePage\"\n :class=\"[ui.pageInput()]\"\n type=\"number\"\n min=\"1\"\n :max=\"pages\"\n inputmode=\"numeric\"\n details=\"hidden\"\n dense\n data-id=\"table-pagination-ranges-input\"\n @blur=\"commitPageInput()\"\n @keydown.enter=\"commitPageInput()\"\n />\n <RuiMenuSelect\n v-else-if=\"ranges.length > 0\"\n :id=\"rangesId\"\n v-model=\"currentRange\"\n :options=\"ranges\"\n :disabled=\"loading || singlePage\"\n :class-names=\"{ label: ui.select() }\"\n label=\"\"\n name=\"ranges\"\n key-attr=\"page\"\n text-attr=\"text\"\n details=\"hidden\"\n dense\n data-id=\"table-pagination-ranges\"\n />\n <span :class=\"ui.indicator()\">\n {{ indicatorText }}\n </span>\n </div>\n <div\n :class=\"ui.navigation()\"\n data-id=\"table-pagination-navigation\"\n >\n <RuiButton\n v-if=\"!mobile\"\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"!hasPrev || loading\"\n variant=\"text\"\n icon\n aria-label=\"First page\"\n data-id=\"table-pagination-first\"\n @click=\"onFirst()\"\n >\n <RuiIcon name=\"lu-chevrons-left\" />\n </RuiButton>\n <RuiButton\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"!hasPrev || loading\"\n variant=\"text\"\n icon\n aria-label=\"Previous page\"\n data-id=\"table-pagination-prev\"\n @click=\"onPrev()\"\n >\n <RuiIcon name=\"lu-chevron-left\" />\n </RuiButton>\n <RuiButton\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"!hasNext || loading\"\n variant=\"text\"\n icon\n aria-label=\"Next page\"\n data-id=\"table-pagination-next\"\n @click=\"onNext()\"\n >\n <RuiIcon name=\"lu-chevron-right\" />\n </RuiButton>\n <RuiButton\n v-if=\"!mobile\"\n :size=\"dense ? 'sm' : undefined\"\n :disabled=\"!hasNext || loading\"\n variant=\"text\"\n icon\n aria-label=\"Last page\"\n data-id=\"table-pagination-last\"\n @click=\"onLast()\"\n >\n <RuiIcon name=\"lu-chevrons-right\" />\n </RuiButton>\n </div>\n </div>\n</template>\n"],"mappings":""}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useTable } from "../../composables/defaults/table.js";
|
|
2
2
|
import { get, set } from "../../vendor/@vueuse/shared/dist/index.js";
|
|
3
|
-
import { tv } from "../../utils/tv.js";
|
|
4
3
|
import RuiIcon_default from "../icons/RuiIcon.js";
|
|
5
4
|
import RuiButton_default from "../buttons/button/RuiButton.js";
|
|
6
5
|
import RuiTextField_default from "../forms/text-field/RuiTextField.js";
|
|
7
6
|
import RuiMenuSelect_default from "../forms/select/RuiMenuSelect.js";
|
|
8
7
|
import { usePaginationNavigation } from "./use-pagination-navigation.js";
|
|
8
|
+
import { paginationStyles } from "./table-pagination-styles.js";
|
|
9
9
|
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, isRef, mergeModels, normalizeClass, openBlock, ref, toDisplayString, unref, useId, useModel, watch, withCtx, withKeys } from "vue";
|
|
10
10
|
//#region src/components/tables/RuiTablePagination.vue?vue&type=script&setup=true&lang.ts
|
|
11
11
|
var _hoisted_1 = ["for"];
|
|
@@ -37,35 +37,6 @@ var RuiTablePagination_vue_vue_type_script_setup_true_lang_default = /*@__PURE__
|
|
|
37
37
|
emits: ["update:modelValue"],
|
|
38
38
|
setup(__props) {
|
|
39
39
|
const modelValue = useModel(__props, "modelValue");
|
|
40
|
-
const paginationStyles = tv({
|
|
41
|
-
slots: {
|
|
42
|
-
wrapper: "relative flex flex-wrap items-center justify-end gap-x-4 gap-y-0",
|
|
43
|
-
limit: "flex items-center between:ml-2 between:mr-0 text-caption",
|
|
44
|
-
ranges: "flex items-center between:ml-2 between:mr-0 text-caption pr-2",
|
|
45
|
-
pageInput: "w-14 [&_input]:text-center [&_input]:px-1! [&_input]:text-xs! [&_input]:leading-5!",
|
|
46
|
-
sectionLabel: "text-rui-text-secondary whitespace-nowrap py-3",
|
|
47
|
-
select: "text-xs! pl-3!",
|
|
48
|
-
indicator: "text-rui-text text-caption whitespace-nowrap",
|
|
49
|
-
navigation: "flex items-center"
|
|
50
|
-
},
|
|
51
|
-
variants: {
|
|
52
|
-
dense: {
|
|
53
|
-
true: {
|
|
54
|
-
select: "min-h-7!",
|
|
55
|
-
pageInput: "[&_input]:py-1!"
|
|
56
|
-
},
|
|
57
|
-
false: {
|
|
58
|
-
select: "min-h-8!",
|
|
59
|
-
pageInput: "[&_input]:py-1.5!"
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
mobile: { true: {
|
|
63
|
-
wrapper: "flex-nowrap justify-between gap-x-2 gap-y-0",
|
|
64
|
-
ranges: "pr-0",
|
|
65
|
-
sectionLabel: "sr-only"
|
|
66
|
-
} }
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
40
|
const ui = computed(() => paginationStyles({
|
|
70
41
|
dense: __props.dense,
|
|
71
42
|
mobile: __props.mobile
|