@rotki/ui-library 2.12.2 → 2.13.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.vue.d.ts +6 -14
- package/dist/components/accordions/accordion/RuiAccordion.vue.js +3 -4
- package/dist/components/accordions/accordion/RuiAccordion.vue.js.map +1 -1
- package/dist/components/accordions/accordions/RuiAccordions.vue.d.ts +10 -9
- package/dist/components/accordions/accordions/RuiAccordions.vue.js +27 -26
- package/dist/components/accordions/accordions/RuiAccordions.vue.js.map +1 -1
- package/dist/components/alerts/RuiAlert.vue.d.ts +5 -15
- package/dist/components/alerts/RuiAlert.vue2.js +8 -16
- package/dist/components/alerts/RuiAlert.vue2.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.vue.d.ts +5 -7
- package/dist/components/buttons/button/RuiButton.vue2.js +19 -20
- package/dist/components/buttons/button/RuiButton.vue2.js.map +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +6 -5
- package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js +42 -41
- package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.vue.d.ts +1 -6
- package/dist/components/calendar/RuiCalendar.vue.js +6 -7
- package/dist/components/calendar/RuiCalendar.vue.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.vue.js +1 -1
- package/dist/components/calendar/RuiCalendarGrid.vue2.js +19 -17
- package/dist/components/calendar/RuiCalendarGrid.vue2.js.map +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue.js +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue2.js +2 -3
- package/dist/components/calendar/RuiCalendarHeader.vue2.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue.js +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue2.js +47 -39
- package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -1
- package/dist/components/cards/RuiCard.vue.d.ts +9 -24
- package/dist/components/cards/RuiCard.vue2.js +7 -7
- package/dist/components/cards/RuiCard.vue2.js.map +1 -1
- package/dist/components/cards/RuiCardHeader.vue.d.ts +5 -10
- package/dist/components/cards/RuiCardHeader.vue2.js.map +1 -1
- package/dist/components/chips/RuiChip.vue.d.ts +7 -21
- package/dist/components/chips/RuiChip.vue2.js +16 -21
- package/dist/components/chips/RuiChip.vue2.js.map +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue.d.ts +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue2.js +14 -18
- package/dist/components/color-picker/RuiColorBoard.vue2.js.map +1 -1
- package/dist/components/color-picker/RuiColorDisplay.vue.js +3 -5
- package/dist/components/color-picker/RuiColorDisplay.vue.js.map +1 -1
- package/dist/components/color-picker/RuiColorHue.vue2.js +10 -13
- package/dist/components/color-picker/RuiColorHue.vue2.js.map +1 -1
- package/dist/components/color-picker/RuiColorInput.vue.js +8 -6
- package/dist/components/color-picker/RuiColorInput.vue.js.map +1 -1
- package/dist/components/color-picker/RuiColorPicker.vue.d.ts +7 -9
- package/dist/components/color-picker/RuiColorPicker.vue.js +18 -13
- package/dist/components/color-picker/RuiColorPicker.vue.js.map +1 -1
- package/dist/components/color-picker/utils.js +22 -5
- package/dist/components/color-picker/utils.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +2 -44
- package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +73 -77
- package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
- package/dist/components/date-time-picker/dayjs-setup.d.ts +1 -0
- package/dist/components/date-time-picker/dayjs-setup.js +8 -0
- package/dist/components/date-time-picker/dayjs-setup.js.map +1 -0
- package/dist/components/date-time-picker/segment-config.d.ts +14 -0
- package/dist/components/date-time-picker/segment-config.js +23 -0
- package/dist/components/date-time-picker/segment-config.js.map +1 -0
- package/dist/components/date-time-picker/segment-utils.d.ts +5 -0
- package/dist/components/date-time-picker/segment-utils.js +36 -0
- package/dist/components/date-time-picker/segment-utils.js.map +1 -0
- package/dist/components/date-time-picker/use-date-time-selection.d.ts +1 -0
- package/dist/components/date-time-picker/use-date-time-selection.js +1 -0
- package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
- package/dist/components/date-time-picker/use-keyboard-handler.d.ts +4 -8
- package/dist/components/date-time-picker/use-keyboard-handler.js +9 -54
- package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
- package/dist/components/date-time-picker/utils.d.ts +1 -0
- package/dist/components/date-time-picker/utils.js +1 -0
- package/dist/components/date-time-picker/utils.js.map +1 -1
- package/dist/components/divider/RuiDivider.vue.d.ts +1 -3
- package/dist/components/divider/RuiDivider.vue.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +9 -1120
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +144 -160
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +15 -24
- package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +31 -31
- package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +18 -21
- package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +3 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js +12 -15
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js.map +1 -1
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +5 -11
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js +6 -7
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js.map +1 -1
- package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +9 -784
- package/dist/components/forms/select/RuiMenuSelect.vue2.js +48 -51
- package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +10 -11
- package/dist/components/forms/select/RuiSimpleSelect.vue2.js +15 -24
- package/dist/components/forms/select/RuiSimpleSelect.vue2.js.map +1 -1
- package/dist/components/forms/slider/RuiSlider.vue.d.ts +10 -26
- package/dist/components/forms/slider/RuiSlider.vue2.js +41 -46
- package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -1
- package/dist/components/forms/switch/RuiSwitch.vue.d.ts +12 -20
- package/dist/components/forms/switch/RuiSwitch.vue2.js +21 -20
- package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -1
- package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +5 -30
- package/dist/components/forms/text-area/RuiTextArea.vue2.js +43 -79
- package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.vue.d.ts +7 -27
- package/dist/components/forms/text-field/RuiTextField.vue2.js +35 -66
- package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -1
- package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +1 -5
- package/dist/components/helpers/RuiFormTextDetail.vue.js +5 -9
- package/dist/components/helpers/RuiFormTextDetail.vue.js.map +1 -1
- package/dist/components/icons/LazyIcon.vue.d.ts +1 -3
- package/dist/components/icons/RuiIcon.vue.d.ts +1 -4
- package/dist/components/icons/RuiIcon.vue2.js +8 -8
- package/dist/components/icons/RuiIcon.vue2.js.map +1 -1
- package/dist/components/index.d.ts +3 -3
- package/dist/components/loaders/RuiSkeletonBase.vue.d.ts +1 -3
- package/dist/components/loaders/RuiSkeletonBase.vue2.js +1 -1
- package/dist/components/loaders/RuiSkeletonBase.vue2.js.map +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +1 -4
- package/dist/components/loaders/RuiSkeletonLoader.vue2.js +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue2.js.map +1 -1
- package/dist/components/logos/RuiLogo.vue.d.ts +1 -7
- package/dist/components/logos/RuiLogo.vue.js +11 -13
- package/dist/components/logos/RuiLogo.vue.js.map +1 -1
- package/dist/components/overlays/badge/RuiBadge.vue.d.ts +5 -20
- package/dist/components/overlays/badge/RuiBadge.vue2.js +11 -13
- package/dist/components/overlays/badge/RuiBadge.vue2.js.map +1 -1
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +10 -5
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js +18 -7
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js.map +1 -1
- package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +21 -27
- package/dist/components/overlays/dialog/RuiDialog.vue2.js +80 -63
- package/dist/components/overlays/dialog/RuiDialog.vue2.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue.d.ts +24 -35
- package/dist/components/overlays/menu/RuiMenu.vue2.js +67 -76
- package/dist/components/overlays/menu/RuiMenu.vue2.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +22 -30
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js +71 -47
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js.map +1 -1
- package/dist/components/overlays/notification/RuiNotification.vue.d.ts +12 -12
- package/dist/components/overlays/notification/RuiNotification.vue.js +25 -22
- package/dist/components/overlays/notification/RuiNotification.vue.js.map +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +7 -18
- package/dist/components/overlays/tooltip/RuiTooltip.vue2.js +11 -8
- package/dist/components/overlays/tooltip/RuiTooltip.vue2.js.map +1 -1
- package/dist/components/progress/RuiProgress.vue.d.ts +8 -10
- package/dist/components/progress/RuiProgress.vue2.js +18 -24
- package/dist/components/progress/RuiProgress.vue2.js.map +1 -1
- package/dist/components/steppers/RuiFooterStepper.vue.d.ts +10 -11
- package/dist/components/steppers/RuiFooterStepper.vue2.js +21 -21
- package/dist/components/steppers/RuiFooterStepper.vue2.js.map +1 -1
- package/dist/components/steppers/RuiStepper.vue.d.ts +6 -15
- package/dist/components/steppers/RuiStepper.vue2.js +31 -33
- package/dist/components/steppers/RuiStepper.vue2.js.map +1 -1
- package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +1 -3
- package/dist/components/steppers/RuiStepperCustomIcon.vue2.js +1 -1
- package/dist/components/steppers/RuiStepperCustomIcon.vue2.js.map +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue.d.ts +1 -3
- package/dist/components/steppers/RuiStepperIcon.vue2.js +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue2.js.map +1 -1
- package/dist/components/tables/RuiDataTable.vue.d.ts +29 -81
- package/dist/components/tables/RuiDataTable.vue2.js +173 -582
- package/dist/components/tables/RuiDataTable.vue2.js.map +1 -1
- package/dist/components/tables/RuiDataTable.vue3.js +24 -27
- package/dist/components/tables/RuiDataTable.vue3.js.map +1 -1
- package/dist/components/tables/RuiExpandButton.vue.d.ts +3 -6
- package/dist/components/tables/RuiExpandButton.vue2.js +1 -0
- package/dist/components/tables/RuiExpandButton.vue2.js.map +1 -1
- package/dist/components/tables/RuiTableHead.vue.d.ts +4 -7
- package/dist/components/tables/RuiTableHead.vue2.js +19 -19
- package/dist/components/tables/RuiTableHead.vue2.js.map +1 -1
- package/dist/components/tables/RuiTablePagination.vue.d.ts +10 -10
- package/dist/components/tables/RuiTablePagination.vue2.js +17 -16
- package/dist/components/tables/RuiTablePagination.vue2.js.map +1 -1
- package/dist/components/tabs/tab/RuiTab.vue.d.ts +3 -18
- package/dist/components/tabs/tab/RuiTab.vue2.js +80 -51
- package/dist/components/tabs/tab/RuiTab.vue2.js.map +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +3 -11
- package/dist/components/tabs/tab-item/RuiTabItem.vue2.js +1 -1
- package/dist/components/tabs/tab-item/RuiTabItem.vue2.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +1 -4
- package/dist/components/tabs/tab-items/RuiTabItems.vue2.js +18 -18
- package/dist/components/tabs/tab-items/RuiTabItems.vue2.js.map +1 -1
- package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +10 -14
- package/dist/components/tabs/tabs/RuiTabs.vue2.js +101 -94
- package/dist/components/tabs/tabs/RuiTabs.vue2.js.map +1 -1
- package/dist/components/time-picker/RuiTimePicker.vue.d.ts +1 -4
- package/dist/components/time-picker/RuiTimePicker.vue2.js +68 -35
- package/dist/components/time-picker/RuiTimePicker.vue2.js.map +1 -1
- package/dist/composables/breakpoint.js +8 -13
- package/dist/composables/breakpoint.js.map +1 -1
- package/dist/composables/dropdown-menu.d.ts +7 -4
- package/dist/composables/dropdown-menu.js +73 -50
- package/dist/composables/dropdown-menu.js.map +1 -1
- package/dist/composables/forms/auto-complete/focus.d.ts +7 -5
- package/dist/composables/forms/auto-complete/focus.js +28 -17
- package/dist/composables/forms/auto-complete/focus.js.map +1 -1
- package/dist/composables/forms/auto-complete/index.d.ts +0 -9
- package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -3
- package/dist/composables/forms/auto-complete/keyboard-navigation.js +11 -5
- package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
- package/dist/composables/forms/auto-complete/search.d.ts +7 -0
- package/dist/composables/forms/auto-complete/search.js +10 -8
- package/dist/composables/forms/auto-complete/search.js.map +1 -1
- package/dist/composables/forms/auto-complete/value.d.ts +4 -0
- package/dist/composables/forms/auto-complete/value.js +24 -42
- package/dist/composables/forms/auto-complete/value.js.map +1 -1
- package/dist/composables/forms/use-label-with-quote.d.ts +2 -0
- package/dist/composables/forms/use-label-with-quote.js +14 -0
- package/dist/composables/forms/use-label-with-quote.js.map +1 -0
- package/dist/composables/forms/use-prepend-append-width.d.ts +6 -0
- package/dist/composables/forms/use-prepend-append-width.js +25 -0
- package/dist/composables/forms/use-prepend-append-width.js.map +1 -0
- package/dist/composables/popper.js +60 -46
- package/dist/composables/popper.js.map +1 -1
- package/dist/composables/sticky-header.d.ts +7 -5
- package/dist/composables/sticky-header.js +51 -41
- package/dist/composables/sticky-header.js.map +1 -1
- package/dist/composables/tables/data-table/columns.d.ts +25 -0
- package/dist/composables/tables/data-table/columns.js +54 -0
- package/dist/composables/tables/data-table/columns.js.map +1 -0
- package/dist/composables/tables/data-table/expansion.d.ts +17 -0
- package/dist/composables/tables/data-table/expansion.js +38 -0
- package/dist/composables/tables/data-table/expansion.js.map +1 -0
- package/dist/composables/tables/data-table/grouping.d.ts +29 -0
- package/dist/composables/tables/data-table/grouping.js +136 -0
- package/dist/composables/tables/data-table/grouping.js.map +1 -0
- package/dist/composables/tables/data-table/pagination.d.ts +33 -0
- package/dist/composables/tables/data-table/pagination.js +119 -0
- package/dist/composables/tables/data-table/pagination.js.map +1 -0
- package/dist/composables/tables/data-table/selection.d.ts +29 -0
- package/dist/composables/tables/data-table/selection.js +164 -0
- package/dist/composables/tables/data-table/selection.js.map +1 -0
- package/dist/composables/tables/data-table/sort.d.ts +32 -0
- package/dist/composables/tables/data-table/sort.js +136 -0
- package/dist/composables/tables/data-table/sort.js.map +1 -0
- package/dist/composables/tables/data-table/types.d.ts +14 -0
- package/dist/composables/tables/data-table/types.js +11 -0
- package/dist/composables/tables/data-table/types.js.map +1 -0
- package/dist/composables/theme.js +1 -20
- package/dist/composables/theme.js.map +1 -1
- package/dist/composables/timeout-manager.d.ts +4 -2
- package/dist/composables/timeout-manager.js +2 -1
- package/dist/composables/timeout-manager.js.map +1 -1
- package/dist/icons/icons_1.js +28 -28
- package/dist/icons/icons_1.js.map +1 -1
- package/dist/icons/icons_2.d.ts +8 -8
- package/dist/icons/icons_2.js +52 -52
- package/dist/icons/icons_2.js.map +1 -1
- package/dist/icons/icons_3.d.ts +18 -18
- package/dist/icons/icons_3.js +108 -108
- package/dist/icons/icons_3.js.map +1 -1
- package/dist/icons/icons_4.d.ts +35 -0
- package/dist/icons/icons_4.js +176 -1
- package/dist/icons/icons_4.js.map +1 -1
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +1 -1
- package/dist/icons/index.js.map +1 -1
- package/dist/index.js +43 -15
- package/dist/index.js.map +1 -1
- package/dist/style.css +189 -162
- package/dist/theme/index.js +15 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/utils/assert.d.ts +1 -1
- package/dist/utils/assert.js.map +1 -1
- package/dist/utils/form-text-detail.d.ts +9 -8
- package/dist/utils/form-text-detail.js +1 -2
- package/dist/utils/form-text-detail.js.map +1 -1
- package/dist/utils/helpers.d.ts +4 -32
- package/dist/utils/helpers.js +8 -9
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/is-equal.d.ts +1 -1
- package/dist/utils/is-equal.js +5 -3
- package/dist/utils/is-equal.js.map +1 -1
- package/dist/web-types.json +359 -359
- package/package.json +44 -35
- package/dist/utils/generate-id.d.ts +0 -5
- package/dist/utils/generate-id.js +0 -21
- package/dist/utils/generate-id.js.map +0 -1
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { isRow } from "./types.js";
|
|
2
|
+
import { assert } from "../../../utils/assert.js";
|
|
3
|
+
import { shallowRef, ref, computed, watch } from "vue";
|
|
4
|
+
import { get, set } from "@vueuse/shared";
|
|
5
|
+
function useTablePagination(options, deps) {
|
|
6
|
+
const { itemsPerPage, paginationModifiersExternal, globalItemsPerPage } = options;
|
|
7
|
+
const { pagination, grouped, isHiddenRow, sort, emitUpdateOptions, tableDefaults } = deps;
|
|
8
|
+
const itemsLength = shallowRef(0);
|
|
9
|
+
const internalPaginationState = ref();
|
|
10
|
+
const globalItemsPerPageSettings = computed(() => {
|
|
11
|
+
if (globalItemsPerPage !== void 0)
|
|
12
|
+
return globalItemsPerPage;
|
|
13
|
+
return get(tableDefaults.globalItemsPerPage);
|
|
14
|
+
});
|
|
15
|
+
const paginationData = computed({
|
|
16
|
+
get() {
|
|
17
|
+
const paginated = get(internalPaginationState);
|
|
18
|
+
if (!paginated) {
|
|
19
|
+
return {
|
|
20
|
+
total: get(itemsLength),
|
|
21
|
+
limit: itemsPerPage,
|
|
22
|
+
page: 1
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (paginationModifiersExternal)
|
|
26
|
+
return paginated;
|
|
27
|
+
return {
|
|
28
|
+
total: get(itemsLength),
|
|
29
|
+
limit: paginated.limit,
|
|
30
|
+
page: paginated.page,
|
|
31
|
+
limits: paginated.limits
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
set(value) {
|
|
35
|
+
set(internalPaginationState, value);
|
|
36
|
+
set(pagination, value);
|
|
37
|
+
emitUpdateOptions({
|
|
38
|
+
pagination: value,
|
|
39
|
+
sort: get(sort)
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
const filtered = computed(() => {
|
|
44
|
+
const result = get(grouped);
|
|
45
|
+
const paginated = get(paginationData);
|
|
46
|
+
const limit = paginated.limit;
|
|
47
|
+
if (!paginationModifiersExternal) {
|
|
48
|
+
const start = (paginated.page - 1) * limit;
|
|
49
|
+
const end = start + limit;
|
|
50
|
+
const preGroups = result.slice(0, start + 1).filter((item) => !isRow(item));
|
|
51
|
+
const postGroups = result.slice(start + 1, end + preGroups.length).filter((item) => !isRow(item));
|
|
52
|
+
const data = result.slice(
|
|
53
|
+
start + preGroups.length,
|
|
54
|
+
end + preGroups.length + postGroups.length
|
|
55
|
+
);
|
|
56
|
+
const nearestGroup = preGroups.at(-1);
|
|
57
|
+
if (data.length > 0) {
|
|
58
|
+
const firstItem = data[0];
|
|
59
|
+
assert(firstItem);
|
|
60
|
+
if (isRow(firstItem) && nearestGroup)
|
|
61
|
+
data.unshift(nearestGroup);
|
|
62
|
+
const lastItem = data.at(-1);
|
|
63
|
+
if (lastItem && !isRow(lastItem))
|
|
64
|
+
data.pop();
|
|
65
|
+
}
|
|
66
|
+
return data.filter((row) => !isHiddenRow(row));
|
|
67
|
+
}
|
|
68
|
+
return result.filter((row) => !isHiddenRow(row));
|
|
69
|
+
});
|
|
70
|
+
function setInternalTotal(items) {
|
|
71
|
+
if (!paginationModifiersExternal)
|
|
72
|
+
set(itemsLength, items.filter(isRow).length);
|
|
73
|
+
}
|
|
74
|
+
function resetPagination() {
|
|
75
|
+
set(paginationData, {
|
|
76
|
+
...get(paginationData),
|
|
77
|
+
page: 1
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
watch(pagination, (val) => set(internalPaginationState, val), { immediate: true });
|
|
81
|
+
watch(internalPaginationState, (paginationState) => {
|
|
82
|
+
if (paginationState?.limit && get(globalItemsPerPageSettings))
|
|
83
|
+
set(tableDefaults.itemsPerPage, paginationState.limit);
|
|
84
|
+
});
|
|
85
|
+
watch(
|
|
86
|
+
tableDefaults.itemsPerPage,
|
|
87
|
+
(perPage) => {
|
|
88
|
+
if (!get(globalItemsPerPageSettings))
|
|
89
|
+
return;
|
|
90
|
+
set(paginationData, {
|
|
91
|
+
...get(paginationData),
|
|
92
|
+
limit: perPage
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
{ immediate: true }
|
|
96
|
+
);
|
|
97
|
+
watch(paginationData, (paginationState) => {
|
|
98
|
+
const { total, limit, page } = paginationState;
|
|
99
|
+
const maxPages = Math.ceil(total / limit);
|
|
100
|
+
if (maxPages > 0 && page > maxPages) {
|
|
101
|
+
set(paginationData, {
|
|
102
|
+
...paginationState,
|
|
103
|
+
page: maxPages
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
return {
|
|
108
|
+
paginationData,
|
|
109
|
+
filtered,
|
|
110
|
+
itemsLength,
|
|
111
|
+
globalItemsPerPageSettings,
|
|
112
|
+
setInternalTotal,
|
|
113
|
+
resetPagination
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export {
|
|
117
|
+
useTablePagination
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sources":["../../../../src/composables/tables/data-table/pagination.ts"],"sourcesContent":["import type { ComputedRef, Ref } from 'vue';\nimport type { TableSortData } from '@/components/tables/RuiTableHead.vue';\nimport type { TablePaginationData } from '@/components/tables/RuiTablePagination.vue';\nimport type { TableOptions as TableDefaultOptions } from '@/composables/defaults/table';\nimport { type GroupedTableRow, isRow } from '@/composables/tables/data-table/types';\nimport { assert } from '@/utils/assert';\n\nexport interface UseTablePaginationOptions {\n /** The default number of items displayed per page. */\n itemsPerPage: number;\n /** Whether pagination is managed externally (e.g. server-side). */\n paginationModifiersExternal: boolean | undefined;\n /** Whether to share the items-per-page setting across all tables. */\n globalItemsPerPage: boolean | undefined;\n}\n\nexport interface UseTablePaginationDeps<T extends object> {\n pagination: Ref<TablePaginationData | undefined>;\n grouped: ComputedRef<GroupedTableRow<T>[]>;\n isHiddenRow: (row: GroupedTableRow<T>) => boolean;\n sort: Ref<TableSortData<T>>;\n emitUpdateOptions: (options: {\n sort?: TableSortData<T>;\n pagination?: TablePaginationData;\n }) => void;\n tableDefaults: TableDefaultOptions;\n}\n\nexport interface UseTablePaginationReturn<T extends object> {\n paginationData: Ref<TablePaginationData>;\n filtered: ComputedRef<GroupedTableRow<T>[]>;\n itemsLength: Ref<number>;\n globalItemsPerPageSettings: ComputedRef<boolean>;\n setInternalTotal: (items: GroupedTableRow<T>[]) => void;\n resetPagination: () => void;\n}\n\nexport function useTablePagination<T extends object>(\n options: UseTablePaginationOptions,\n deps: UseTablePaginationDeps<T>,\n): UseTablePaginationReturn<T> {\n const { itemsPerPage, paginationModifiersExternal, globalItemsPerPage } = options;\n const { pagination, grouped, isHiddenRow, sort, emitUpdateOptions, tableDefaults } = deps;\n\n const itemsLength = shallowRef<number>(0);\n const internalPaginationState: Ref<TablePaginationData | undefined> = ref();\n\n const globalItemsPerPageSettings = computed<boolean>(() => {\n if (globalItemsPerPage !== undefined)\n return globalItemsPerPage;\n\n return get(tableDefaults.globalItemsPerPage);\n });\n\n const paginationData: Ref<TablePaginationData> = computed({\n get(): TablePaginationData {\n const paginated = get(internalPaginationState);\n if (!paginated) {\n return {\n total: get(itemsLength),\n limit: itemsPerPage,\n page: 1,\n };\n }\n\n if (paginationModifiersExternal)\n return paginated;\n\n return {\n total: get(itemsLength),\n limit: paginated.limit,\n page: paginated.page,\n limits: paginated.limits,\n };\n },\n set(value: TablePaginationData) {\n set(internalPaginationState, value);\n set(pagination, value);\n emitUpdateOptions({\n pagination: value,\n sort: get(sort),\n });\n },\n });\n\n const filtered = computed<GroupedTableRow<T>[]>(() => {\n const result = get(grouped);\n\n const paginated = get(paginationData);\n const limit = paginated.limit;\n if (!paginationModifiersExternal) {\n const start = (paginated.page - 1) * limit;\n const end = start + limit;\n const preGroups = result.slice(0, start + 1).filter(item => !isRow(item));\n const postGroups = result\n .slice(start + 1, end + preGroups.length)\n .filter(item => !isRow(item));\n const data = result.slice(\n start + preGroups.length,\n end + preGroups.length + postGroups.length,\n );\n const nearestGroup = preGroups.at(-1);\n if (data.length > 0) {\n const firstItem = data[0];\n assert(firstItem);\n if (isRow(firstItem) && nearestGroup)\n data.unshift(nearestGroup);\n const lastItem = data.at(-1);\n if (lastItem && !isRow(lastItem))\n data.pop();\n }\n\n return data.filter(row => !isHiddenRow(row));\n }\n\n return result.filter(row => !isHiddenRow(row));\n });\n\n function setInternalTotal(items: GroupedTableRow<T>[]): void {\n if (!paginationModifiersExternal)\n set(itemsLength, items.filter(isRow).length);\n }\n\n function resetPagination(): void {\n set(paginationData, {\n ...get(paginationData),\n page: 1,\n });\n }\n\n // Sync external pagination model to internal state\n watch(pagination, val => set(internalPaginationState, val), { immediate: true });\n\n // Sync pagination limit to global table defaults\n watch(internalPaginationState, (paginationState) => {\n if (paginationState?.limit && get(globalItemsPerPageSettings))\n set(tableDefaults.itemsPerPage, paginationState.limit);\n });\n\n // Sync global table defaults to pagination limit\n watch(\n tableDefaults.itemsPerPage,\n (perPage) => {\n if (!get(globalItemsPerPageSettings))\n return;\n\n set(paginationData, {\n ...get(paginationData),\n limit: perPage,\n });\n },\n { immediate: true },\n );\n\n // Auto-adjust page when current page exceeds max available pages\n watch(paginationData, (paginationState) => {\n const { total, limit, page } = paginationState;\n const maxPages = Math.ceil(total / limit);\n\n if (maxPages > 0 && page > maxPages) {\n set(paginationData, {\n ...paginationState,\n page: maxPages,\n });\n }\n });\n\n return {\n paginationData,\n filtered,\n itemsLength,\n globalItemsPerPageSettings,\n setInternalTotal,\n resetPagination,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';
|
|
2
|
+
import { type GroupedTableRow } from '../../../composables/tables/data-table/types.js';
|
|
3
|
+
export interface UseTableSelectionOptions<T extends object, IdType extends keyof T> {
|
|
4
|
+
/** The property on each row used as the unique row identifier. */
|
|
5
|
+
rowAttr: IdType;
|
|
6
|
+
/** Whether selection persists across pages. */
|
|
7
|
+
multiPageSelect: boolean;
|
|
8
|
+
/** Rows that cannot be selected or deselected by the user. */
|
|
9
|
+
disabledRows: MaybeRefOrGetter<readonly T[] | undefined>;
|
|
10
|
+
}
|
|
11
|
+
export interface UseTableSelectionDeps<T extends object, IdType extends keyof T> {
|
|
12
|
+
selectedData: Ref<T[IdType][] | undefined>;
|
|
13
|
+
filtered: ComputedRef<GroupedTableRow<T>[]>;
|
|
14
|
+
}
|
|
15
|
+
export interface UseTableSelectionReturn<T extends object, IdType extends keyof T> {
|
|
16
|
+
visibleIdentifiers: ComputedRef<T[IdType][]>;
|
|
17
|
+
isAllSelected: ComputedRef<boolean>;
|
|
18
|
+
indeterminate: ComputedRef<boolean>;
|
|
19
|
+
isSelected: (identifier: T[IdType]) => boolean;
|
|
20
|
+
isDisabledRow: (rowKey: T[IdType]) => boolean;
|
|
21
|
+
isSelectable: (rowKey: T[IdType]) => boolean;
|
|
22
|
+
mustSelect: (rowKey: T[IdType]) => boolean;
|
|
23
|
+
onToggleAll: (checked: boolean) => void;
|
|
24
|
+
onSelect: (checked: boolean, value: T[IdType], userAction?: boolean) => void;
|
|
25
|
+
onCheckboxClick: (event: MouseEvent, value: T[IdType], index: number) => void;
|
|
26
|
+
deselectRemovedRows: () => void;
|
|
27
|
+
resetCheckboxShiftState: () => void;
|
|
28
|
+
}
|
|
29
|
+
export declare function useTableSelection<T extends object, IdType extends keyof T>(options: UseTableSelectionOptions<T, IdType>, deps: UseTableSelectionDeps<T, IdType>): UseTableSelectionReturn<T, IdType>;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { isRow } from "./types.js";
|
|
2
|
+
import { useTimeoutManager } from "../../timeout-manager.js";
|
|
3
|
+
import { assert } from "../../../utils/assert.js";
|
|
4
|
+
import { shallowRef, ref, watch, computed, toValue } from "vue";
|
|
5
|
+
import { set, get } from "@vueuse/shared";
|
|
6
|
+
import { isDefined } from "@vueuse/core";
|
|
7
|
+
function useTableSelection(options, deps) {
|
|
8
|
+
const { rowAttr, multiPageSelect, disabledRows } = options;
|
|
9
|
+
const { selectedData, filtered } = deps;
|
|
10
|
+
const shiftClicked = shallowRef(false);
|
|
11
|
+
const lastSelectedIndex = shallowRef(-1);
|
|
12
|
+
const internalSelectedData = ref([]);
|
|
13
|
+
const { create: scheduleShiftSelect } = useTimeoutManager();
|
|
14
|
+
watch(selectedData, (val) => set(internalSelectedData, val), { immediate: true });
|
|
15
|
+
const visibleIdentifiers = computed(
|
|
16
|
+
() => get(filtered).filter(isRow).map((row) => row[rowAttr])
|
|
17
|
+
);
|
|
18
|
+
const selectedSet = computed(() => new Set(get(selectedData) ?? []));
|
|
19
|
+
const disabledRowKeySet = computed(() => {
|
|
20
|
+
const currentDisabledRows = toValue(disabledRows);
|
|
21
|
+
if (!currentDisabledRows || !rowAttr)
|
|
22
|
+
return /* @__PURE__ */ new Set();
|
|
23
|
+
return new Set(currentDisabledRows.map((row) => row[rowAttr]));
|
|
24
|
+
});
|
|
25
|
+
const isAllSelected = computed(() => {
|
|
26
|
+
const selectedRows = get(selectedData);
|
|
27
|
+
if (!selectedRows || selectedRows.length === 0)
|
|
28
|
+
return false;
|
|
29
|
+
const selected = get(selectedSet);
|
|
30
|
+
return get(visibleIdentifiers).every((id) => selected.has(id));
|
|
31
|
+
});
|
|
32
|
+
const indeterminate = computed(() => {
|
|
33
|
+
const selectedRows = get(selectedData);
|
|
34
|
+
if (!selectedRows)
|
|
35
|
+
return false;
|
|
36
|
+
return selectedRows.length > 0 && !get(isAllSelected);
|
|
37
|
+
});
|
|
38
|
+
function isSelected(identifier) {
|
|
39
|
+
return get(selectedSet).has(identifier);
|
|
40
|
+
}
|
|
41
|
+
function isDisabledRow(rowKey) {
|
|
42
|
+
return get(disabledRowKeySet).has(rowKey);
|
|
43
|
+
}
|
|
44
|
+
function isSelectable(rowKey) {
|
|
45
|
+
return isSelected(rowKey) || !isDisabledRow(rowKey);
|
|
46
|
+
}
|
|
47
|
+
function mustSelect(rowKey) {
|
|
48
|
+
return isSelected(rowKey) && isDisabledRow(rowKey);
|
|
49
|
+
}
|
|
50
|
+
function resetCheckboxShiftState() {
|
|
51
|
+
set(shiftClicked, false);
|
|
52
|
+
set(lastSelectedIndex, -1);
|
|
53
|
+
}
|
|
54
|
+
function onToggleAll(checked) {
|
|
55
|
+
const selectedRows = get(selectedData);
|
|
56
|
+
if (!isDefined(selectedRows))
|
|
57
|
+
return;
|
|
58
|
+
if (!multiPageSelect) {
|
|
59
|
+
if (checked)
|
|
60
|
+
set(selectedData, get(visibleIdentifiers).filter(isSelectable));
|
|
61
|
+
else set(selectedData, get(visibleIdentifiers).filter(mustSelect));
|
|
62
|
+
} else {
|
|
63
|
+
if (checked) {
|
|
64
|
+
set(
|
|
65
|
+
selectedData,
|
|
66
|
+
Array.from(/* @__PURE__ */ new Set([...selectedRows, ...get(visibleIdentifiers).filter(isSelectable)]))
|
|
67
|
+
);
|
|
68
|
+
} else {
|
|
69
|
+
const visibleSet = new Set(get(visibleIdentifiers));
|
|
70
|
+
const mustSelectSet = new Set(get(visibleIdentifiers).filter(mustSelect));
|
|
71
|
+
set(
|
|
72
|
+
selectedData,
|
|
73
|
+
selectedRows.filter((rowKey) => !visibleSet.has(rowKey) || mustSelectSet.has(rowKey))
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function onSelect(checked, value, userAction = false) {
|
|
79
|
+
if (get(shiftClicked) && userAction)
|
|
80
|
+
return;
|
|
81
|
+
const selectedRows = get(internalSelectedData);
|
|
82
|
+
if (!selectedRows)
|
|
83
|
+
return;
|
|
84
|
+
const selected = isSelected(value);
|
|
85
|
+
if (checked && !selected) {
|
|
86
|
+
set(internalSelectedData, [...selectedRows, value]);
|
|
87
|
+
} else if (!checked && selected) {
|
|
88
|
+
set(
|
|
89
|
+
internalSelectedData,
|
|
90
|
+
[...selectedRows].filter((r) => r !== value)
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
if (userAction)
|
|
94
|
+
set(selectedData, get(internalSelectedData));
|
|
95
|
+
}
|
|
96
|
+
function onCheckboxClick(event, value, index) {
|
|
97
|
+
const currentTarget = event.currentTarget;
|
|
98
|
+
if (!(currentTarget instanceof HTMLElement))
|
|
99
|
+
return;
|
|
100
|
+
const input = currentTarget.querySelector("input");
|
|
101
|
+
const target = event.target;
|
|
102
|
+
const nodeName = target instanceof HTMLElement ? target.nodeName : void 0;
|
|
103
|
+
const shiftKey = event.shiftKey;
|
|
104
|
+
set(shiftClicked, shiftKey);
|
|
105
|
+
if (input && nodeName !== "INPUT") {
|
|
106
|
+
if (shiftKey) {
|
|
107
|
+
scheduleShiftSelect(() => {
|
|
108
|
+
let lastIndex = get(lastSelectedIndex);
|
|
109
|
+
if (lastIndex === -1)
|
|
110
|
+
lastIndex = index;
|
|
111
|
+
const tableData = get(filtered);
|
|
112
|
+
const lastSelectedData = tableData[lastIndex];
|
|
113
|
+
assert(lastSelectedData);
|
|
114
|
+
if (isRow(lastSelectedData)) {
|
|
115
|
+
const valueToApply = isSelected(lastSelectedData[rowAttr]);
|
|
116
|
+
if (lastIndex === index) {
|
|
117
|
+
onSelect(!valueToApply, value);
|
|
118
|
+
} else {
|
|
119
|
+
const from = Math.min(lastIndex, index);
|
|
120
|
+
const to = Math.max(lastIndex, index);
|
|
121
|
+
for (let i = from; i <= to; i++) {
|
|
122
|
+
const currSelectedData = tableData[i];
|
|
123
|
+
assert(currSelectedData);
|
|
124
|
+
if (isRow(currSelectedData) && !isDisabledRow(currSelectedData[rowAttr]))
|
|
125
|
+
onSelect(valueToApply, currSelectedData[rowAttr]);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
set(lastSelectedIndex, index);
|
|
129
|
+
set(selectedData, get(internalSelectedData));
|
|
130
|
+
}
|
|
131
|
+
}, 1);
|
|
132
|
+
} else {
|
|
133
|
+
set(lastSelectedIndex, index);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function deselectRemovedRows() {
|
|
138
|
+
const currentSelected = get(selectedData);
|
|
139
|
+
if (!currentSelected)
|
|
140
|
+
return;
|
|
141
|
+
const visibleSet = new Set(get(visibleIdentifiers));
|
|
142
|
+
const remaining = currentSelected.filter((key) => visibleSet.has(key));
|
|
143
|
+
if (remaining.length !== currentSelected.length)
|
|
144
|
+
set(selectedData, remaining);
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
visibleIdentifiers,
|
|
148
|
+
isAllSelected,
|
|
149
|
+
indeterminate,
|
|
150
|
+
isSelected,
|
|
151
|
+
isDisabledRow,
|
|
152
|
+
isSelectable,
|
|
153
|
+
mustSelect,
|
|
154
|
+
onToggleAll,
|
|
155
|
+
onSelect,
|
|
156
|
+
onCheckboxClick,
|
|
157
|
+
deselectRemovedRows,
|
|
158
|
+
resetCheckboxShiftState
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export {
|
|
162
|
+
useTableSelection
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sources":["../../../../src/composables/tables/data-table/selection.ts"],"sourcesContent":["import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';\nimport { type GroupedTableRow, isRow } from '@/composables/tables/data-table/types';\nimport { useTimeoutManager } from '@/composables/timeout-manager';\nimport { assert } from '@/utils/assert';\n\nexport interface UseTableSelectionOptions<T extends object, IdType extends keyof T> {\n /** The property on each row used as the unique row identifier. */\n rowAttr: IdType;\n /** Whether selection persists across pages. */\n multiPageSelect: boolean;\n /** Rows that cannot be selected or deselected by the user. */\n disabledRows: MaybeRefOrGetter<readonly T[] | undefined>;\n}\n\nexport interface UseTableSelectionDeps<T extends object, IdType extends keyof T> {\n selectedData: Ref<T[IdType][] | undefined>;\n filtered: ComputedRef<GroupedTableRow<T>[]>;\n}\n\nexport interface UseTableSelectionReturn<T extends object, IdType extends keyof T> {\n visibleIdentifiers: ComputedRef<T[IdType][]>;\n isAllSelected: ComputedRef<boolean>;\n indeterminate: ComputedRef<boolean>;\n isSelected: (identifier: T[IdType]) => boolean;\n isDisabledRow: (rowKey: T[IdType]) => boolean;\n isSelectable: (rowKey: T[IdType]) => boolean;\n mustSelect: (rowKey: T[IdType]) => boolean;\n onToggleAll: (checked: boolean) => void;\n onSelect: (checked: boolean, value: T[IdType], userAction?: boolean) => void;\n onCheckboxClick: (event: MouseEvent, value: T[IdType], index: number) => void;\n deselectRemovedRows: () => void;\n resetCheckboxShiftState: () => void;\n}\n\nexport function useTableSelection<T extends object, IdType extends keyof T>(\n options: UseTableSelectionOptions<T, IdType>,\n deps: UseTableSelectionDeps<T, IdType>,\n): UseTableSelectionReturn<T, IdType> {\n const { rowAttr, multiPageSelect, disabledRows } = options;\n const { selectedData, filtered } = deps;\n\n const shiftClicked: Ref<boolean> = shallowRef(false);\n const lastSelectedIndex: Ref<number> = shallowRef(-1);\n const internalSelectedData: Ref<T[IdType][]> = ref([]);\n const { create: scheduleShiftSelect } = useTimeoutManager();\n\n // Sync external selection model to internal state\n watch(selectedData, val => set(internalSelectedData, val), { immediate: true });\n\n const visibleIdentifiers = computed<T[IdType][]>(() =>\n get(filtered)\n .filter(isRow)\n .map(row => row[rowAttr]),\n );\n\n const selectedSet = computed<Set<T[IdType]>>(() => new Set(get(selectedData) ?? []));\n\n const disabledRowKeySet = computed<Set<T[IdType]>>(() => {\n const currentDisabledRows = toValue(disabledRows);\n if (!currentDisabledRows || !rowAttr)\n return new Set<T[IdType]>();\n return new Set<T[IdType]>(currentDisabledRows.map((row: T) => row[rowAttr]));\n });\n\n const isAllSelected = computed<boolean>(() => {\n const selectedRows = get(selectedData);\n if (!selectedRows || selectedRows.length === 0)\n return false;\n\n const selected = get(selectedSet);\n return get(visibleIdentifiers).every(id => selected.has(id));\n });\n\n const indeterminate = computed<boolean>(() => {\n const selectedRows = get(selectedData);\n if (!selectedRows)\n return false;\n\n return selectedRows.length > 0 && !get(isAllSelected);\n });\n\n function isSelected(identifier: T[IdType]): boolean {\n return get(selectedSet).has(identifier);\n }\n\n function isDisabledRow(rowKey: T[IdType]): boolean {\n return get(disabledRowKeySet).has(rowKey);\n }\n\n function isSelectable(rowKey: T[IdType]): boolean {\n return isSelected(rowKey) || !isDisabledRow(rowKey);\n }\n\n function mustSelect(rowKey: T[IdType]): boolean {\n return isSelected(rowKey) && isDisabledRow(rowKey);\n }\n\n function resetCheckboxShiftState(): void {\n set(shiftClicked, false);\n set(lastSelectedIndex, -1);\n }\n\n function onToggleAll(checked: boolean): void {\n const selectedRows = get(selectedData);\n\n if (!isDefined(selectedRows))\n return;\n\n if (!multiPageSelect) {\n if (checked)\n set(selectedData, get(visibleIdentifiers).filter(isSelectable));\n else set(selectedData, get(visibleIdentifiers).filter(mustSelect));\n }\n else {\n if (checked) {\n set(\n selectedData,\n Array.from(new Set([...selectedRows, ...get(visibleIdentifiers).filter(isSelectable)])),\n );\n }\n else {\n const visibleSet = new Set(get(visibleIdentifiers));\n const mustSelectSet = new Set(get(visibleIdentifiers).filter(mustSelect));\n set(\n selectedData,\n selectedRows.filter(rowKey => !visibleSet.has(rowKey) || mustSelectSet.has(rowKey)),\n );\n }\n }\n }\n\n function onSelect(checked: boolean, value: T[IdType], userAction: boolean = false): void {\n if (get(shiftClicked) && userAction)\n return;\n\n const selectedRows = get(internalSelectedData);\n if (!selectedRows)\n return;\n\n const selected = isSelected(value);\n\n if (checked && !selected) {\n set(internalSelectedData, [...selectedRows, value]);\n }\n else if (!checked && selected) {\n set(\n internalSelectedData,\n [...selectedRows].filter(r => r !== value),\n );\n }\n\n if (userAction)\n set(selectedData, get(internalSelectedData));\n }\n\n function onCheckboxClick(event: MouseEvent, value: T[IdType], index: number): void {\n const currentTarget = event.currentTarget;\n if (!(currentTarget instanceof HTMLElement))\n return;\n\n const input = currentTarget.querySelector('input');\n const target = event.target;\n const nodeName = target instanceof HTMLElement ? target.nodeName : undefined;\n\n const shiftKey = event.shiftKey;\n set(shiftClicked, shiftKey);\n\n if (input && nodeName !== 'INPUT') {\n if (shiftKey) {\n scheduleShiftSelect(() => {\n let lastIndex = get(lastSelectedIndex);\n if (lastIndex === -1)\n lastIndex = index;\n const tableData = get(filtered);\n const lastSelectedData = tableData[lastIndex];\n assert(lastSelectedData);\n\n if (isRow(lastSelectedData)) {\n const valueToApply = isSelected(lastSelectedData[rowAttr]);\n\n if (lastIndex === index) {\n onSelect(!valueToApply, value);\n }\n else {\n const from = Math.min(lastIndex, index);\n const to = Math.max(lastIndex, index);\n\n for (let i = from; i <= to; i++) {\n const currSelectedData = tableData[i];\n assert(currSelectedData);\n if (isRow(currSelectedData) && !isDisabledRow(currSelectedData[rowAttr]))\n onSelect(valueToApply, currSelectedData[rowAttr]);\n }\n }\n\n set(lastSelectedIndex, index);\n set(selectedData, get(internalSelectedData));\n }\n }, 1);\n }\n else {\n set(lastSelectedIndex, index);\n }\n }\n }\n\n function deselectRemovedRows(): void {\n const currentSelected = get(selectedData);\n if (!currentSelected)\n return;\n\n const visibleSet = new Set(get(visibleIdentifiers));\n const remaining = currentSelected.filter(key => visibleSet.has(key));\n\n if (remaining.length !== currentSelected.length)\n set(selectedData, remaining);\n }\n\n return {\n visibleIdentifiers,\n isAllSelected,\n indeterminate,\n isSelected,\n isDisabledRow,\n isSelectable,\n mustSelect,\n onToggleAll,\n onSelect,\n onCheckboxClick,\n deselectRemovedRows,\n resetCheckboxShiftState,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';
|
|
2
|
+
import type { SortColumn, TableRowKey, TableSortData } from '../../../components/tables/RuiTableHead.vue.js';
|
|
3
|
+
import type { TablePaginationData } from '../../../components/tables/RuiTablePagination.vue.js';
|
|
4
|
+
export interface UseTableSortOptions<T extends object> {
|
|
5
|
+
/** The data rows to sort. */
|
|
6
|
+
rows: MaybeRefOrGetter<readonly T[]>;
|
|
7
|
+
/** The current search query used to filter rows before sorting. */
|
|
8
|
+
search: MaybeRefOrGetter<string>;
|
|
9
|
+
/** Whether sorting is managed externally (e.g. server-side). */
|
|
10
|
+
sortModifiersExternal: boolean | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface UseTableSortDeps<T extends object> {
|
|
13
|
+
sort: Ref<TableSortData<T>>;
|
|
14
|
+
pagination: Ref<TablePaginationData | undefined>;
|
|
15
|
+
emitUpdateOptions: (options: {
|
|
16
|
+
sort?: TableSortData<T>;
|
|
17
|
+
pagination?: TablePaginationData;
|
|
18
|
+
}) => void;
|
|
19
|
+
}
|
|
20
|
+
export interface UseTableSortReturn<T extends object> {
|
|
21
|
+
sortData: ComputedRef<TableSortData<T>>;
|
|
22
|
+
sortedMap: ComputedRef<Partial<Record<TableRowKey<T>, SortColumn<T>>>>;
|
|
23
|
+
searchData: ComputedRef<T[]>;
|
|
24
|
+
sorted: ComputedRef<T[]>;
|
|
25
|
+
isSortedBy: (key: TableRowKey<T>) => boolean;
|
|
26
|
+
getSortIndex: (key: TableRowKey<T>) => number;
|
|
27
|
+
onSort: (payload: {
|
|
28
|
+
key: TableRowKey<T>;
|
|
29
|
+
direction?: 'asc' | 'desc';
|
|
30
|
+
}) => void;
|
|
31
|
+
}
|
|
32
|
+
export declare function useTableSort<T extends object>(options: UseTableSortOptions<T>, deps: UseTableSortDeps<T>): UseTableSortReturn<T>;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { assert } from "../../../utils/assert.js";
|
|
2
|
+
import { computed, toValue } from "vue";
|
|
3
|
+
import { set, get } from "@vueuse/shared";
|
|
4
|
+
const SORT_COLLATOR = new Intl.Collator(void 0, { sensitivity: "accent", usage: "sort" });
|
|
5
|
+
function useTableSort(options, deps) {
|
|
6
|
+
const { rows, search, sortModifiersExternal } = options;
|
|
7
|
+
const { sort, pagination, emitUpdateOptions } = deps;
|
|
8
|
+
const getKeys = (t) => Object.keys(t);
|
|
9
|
+
const sortData = computed({
|
|
10
|
+
get() {
|
|
11
|
+
return get(sort);
|
|
12
|
+
},
|
|
13
|
+
set(value) {
|
|
14
|
+
set(sort, value);
|
|
15
|
+
emitUpdateOptions({
|
|
16
|
+
sort: value,
|
|
17
|
+
pagination: get(pagination)
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const sortedMap = computed(() => {
|
|
22
|
+
const mapped = {};
|
|
23
|
+
const sortBy = get(sortData);
|
|
24
|
+
if (!sortBy)
|
|
25
|
+
return mapped;
|
|
26
|
+
if (!Array.isArray(sortBy)) {
|
|
27
|
+
if (sortBy.column)
|
|
28
|
+
mapped[sortBy.column] = sortBy;
|
|
29
|
+
return mapped;
|
|
30
|
+
}
|
|
31
|
+
return sortBy.reduce((acc, curr) => {
|
|
32
|
+
if (!curr.column)
|
|
33
|
+
return acc;
|
|
34
|
+
acc[curr.column] = curr;
|
|
35
|
+
return acc;
|
|
36
|
+
}, mapped);
|
|
37
|
+
});
|
|
38
|
+
const searchData = computed(() => {
|
|
39
|
+
const currentRows = toValue(rows);
|
|
40
|
+
const query = toValue(search)?.toLocaleLowerCase();
|
|
41
|
+
if (!query)
|
|
42
|
+
return [...currentRows];
|
|
43
|
+
return currentRows.filter(
|
|
44
|
+
(row) => getKeys(row).some((key) => `${row[key]}`.toLocaleLowerCase().includes(query))
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
const sorted = computed(() => {
|
|
48
|
+
const sortBy = get(sortData);
|
|
49
|
+
if (!sortBy || sortModifiersExternal)
|
|
50
|
+
return get(searchData);
|
|
51
|
+
const data = [...get(searchData)];
|
|
52
|
+
const sortFn = (by) => {
|
|
53
|
+
data.sort((a, b) => {
|
|
54
|
+
const column = by.column;
|
|
55
|
+
if (!column)
|
|
56
|
+
return 0;
|
|
57
|
+
let [aValue, bValue] = [a[column], b[column]];
|
|
58
|
+
if (by.direction === "desc")
|
|
59
|
+
[aValue, bValue] = [bValue, aValue];
|
|
60
|
+
const aNumber = Number(aValue);
|
|
61
|
+
const bNumber = Number(bValue);
|
|
62
|
+
if (!isNaN(aNumber) && !isNaN(bNumber))
|
|
63
|
+
return aNumber - bNumber;
|
|
64
|
+
return SORT_COLLATOR.compare(`${aValue}`, `${bValue}`);
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
if (!Array.isArray(sortBy))
|
|
68
|
+
sortFn(sortBy);
|
|
69
|
+
else [...sortBy].reverse().forEach(sortFn);
|
|
70
|
+
return data;
|
|
71
|
+
});
|
|
72
|
+
function isSortedBy(key) {
|
|
73
|
+
return key in get(sortedMap);
|
|
74
|
+
}
|
|
75
|
+
function getSortIndex(key) {
|
|
76
|
+
const sortBy = get(sortData);
|
|
77
|
+
if (!sortBy || !Array.isArray(sortBy) || !isSortedBy(key))
|
|
78
|
+
return -1;
|
|
79
|
+
return sortBy.findIndex((s) => s.column === key);
|
|
80
|
+
}
|
|
81
|
+
function onSort({ key, direction }) {
|
|
82
|
+
const sortBy = get(sortData);
|
|
83
|
+
if (!sortBy)
|
|
84
|
+
return;
|
|
85
|
+
if (!Array.isArray(sortBy)) {
|
|
86
|
+
if (isSortedBy(key)) {
|
|
87
|
+
const newDirection = !direction || direction === "asc" ? "desc" : "asc";
|
|
88
|
+
if (sortBy.direction === newDirection) {
|
|
89
|
+
set(sortData, { ...sortBy, column: void 0, direction: "asc" });
|
|
90
|
+
} else {
|
|
91
|
+
set(sortData, {
|
|
92
|
+
...sortBy,
|
|
93
|
+
direction: sortBy.direction === "asc" ? "desc" : "asc"
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
set(sortData, { column: key, direction: direction || "asc" });
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (isSortedBy(key)) {
|
|
102
|
+
const newDirection = !direction || direction === "asc" ? "desc" : "asc";
|
|
103
|
+
const index = getSortIndex(key);
|
|
104
|
+
const sortByCol = sortBy[index];
|
|
105
|
+
assert(sortByCol);
|
|
106
|
+
if (sortByCol.direction === newDirection) {
|
|
107
|
+
set(
|
|
108
|
+
sortData,
|
|
109
|
+
sortBy.filter((_, i) => i !== index)
|
|
110
|
+
);
|
|
111
|
+
} else {
|
|
112
|
+
set(
|
|
113
|
+
sortData,
|
|
114
|
+
sortBy.map(
|
|
115
|
+
(col, i) => i === index ? { ...col, direction: col.direction === "asc" ? "desc" : "asc" } : col
|
|
116
|
+
)
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
set(sortData, [...sortBy, { column: key, direction: direction || "asc" }]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
sortData,
|
|
125
|
+
sortedMap,
|
|
126
|
+
searchData,
|
|
127
|
+
sorted,
|
|
128
|
+
isSortedBy,
|
|
129
|
+
getSortIndex,
|
|
130
|
+
onSort
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export {
|
|
134
|
+
useTableSort
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=sort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort.js","sources":["../../../../src/composables/tables/data-table/sort.ts"],"sourcesContent":["import type { ComputedRef, MaybeRefOrGetter, Ref } from 'vue';\nimport type { SortColumn, TableRowKey, TableSortData } from '@/components/tables/RuiTableHead.vue';\nimport type { TablePaginationData } from '@/components/tables/RuiTablePagination.vue';\nimport { assert } from '@/utils/assert';\n\nconst SORT_COLLATOR = new Intl.Collator(undefined, { sensitivity: 'accent', usage: 'sort' });\n\nexport interface UseTableSortOptions<T extends object> {\n /** The data rows to sort. */\n rows: MaybeRefOrGetter<readonly T[]>;\n /** The current search query used to filter rows before sorting. */\n search: MaybeRefOrGetter<string>;\n /** Whether sorting is managed externally (e.g. server-side). */\n sortModifiersExternal: boolean | undefined;\n}\n\nexport interface UseTableSortDeps<T extends object> {\n sort: Ref<TableSortData<T>>;\n pagination: Ref<TablePaginationData | undefined>;\n emitUpdateOptions: (options: {\n sort?: TableSortData<T>;\n pagination?: TablePaginationData;\n }) => void;\n}\n\nexport interface UseTableSortReturn<T extends object> {\n sortData: ComputedRef<TableSortData<T>>;\n sortedMap: ComputedRef<Partial<Record<TableRowKey<T>, SortColumn<T>>>>;\n searchData: ComputedRef<T[]>;\n sorted: ComputedRef<T[]>;\n isSortedBy: (key: TableRowKey<T>) => boolean;\n getSortIndex: (key: TableRowKey<T>) => number;\n onSort: (payload: { key: TableRowKey<T>; direction?: 'asc' | 'desc' }) => void;\n}\n\nexport function useTableSort<T extends object>(\n options: UseTableSortOptions<T>,\n deps: UseTableSortDeps<T>,\n): UseTableSortReturn<T> {\n const { rows, search, sortModifiersExternal } = options;\n const { sort, pagination, emitUpdateOptions } = deps;\n\n const getKeys = <O extends object>(t: O): TableRowKey<O>[] => Object.keys(t) as TableRowKey<O>[];\n\n const sortData = computed<TableSortData<T>>({\n get(): TableSortData<T> {\n return get(sort);\n },\n set(value: TableSortData<T>) {\n set(sort, value);\n emitUpdateOptions({\n sort: value,\n pagination: get(pagination),\n });\n },\n });\n\n const sortedMap = computed<Partial<Record<TableRowKey<T>, SortColumn<T>>>>(() => {\n const mapped: Partial<Record<TableRowKey<T>, SortColumn<T>>> = {};\n const sortBy = get(sortData);\n if (!sortBy)\n return mapped;\n\n if (!Array.isArray(sortBy)) {\n if (sortBy.column)\n mapped[sortBy.column] = sortBy;\n\n return mapped;\n }\n\n return sortBy.reduce((acc, curr) => {\n if (!curr.column)\n return acc;\n\n acc[curr.column] = curr;\n return acc;\n }, mapped);\n });\n\n const searchData = computed<T[]>(() => {\n const currentRows = toValue(rows);\n const query = toValue(search)?.toLocaleLowerCase();\n if (!query)\n return [...currentRows];\n\n return currentRows.filter(row =>\n getKeys(row).some(key => `${row[key]}`.toLocaleLowerCase().includes(query)),\n );\n });\n\n const sorted: ComputedRef<T[]> = computed(() => {\n const sortBy = get(sortData);\n if (!sortBy || sortModifiersExternal)\n return get(searchData);\n\n const data = [...get(searchData)];\n\n const sortFn = (by: SortColumn<T>): void => {\n data.sort((a, b) => {\n const column = by.column;\n if (!column)\n return 0;\n\n let [aValue, bValue] = [a[column], b[column]];\n if (by.direction === 'desc')\n [aValue, bValue] = [bValue, aValue];\n\n const aNumber = Number(aValue);\n const bNumber = Number(bValue);\n if (!isNaN(aNumber) && !isNaN(bNumber))\n return aNumber - bNumber;\n\n return SORT_COLLATOR.compare(`${aValue}`, `${bValue}`);\n });\n };\n\n if (!Array.isArray(sortBy))\n sortFn(sortBy);\n else [...sortBy].reverse().forEach(sortFn);\n\n return data;\n });\n\n function isSortedBy(key: TableRowKey<T>): boolean {\n return key in get(sortedMap);\n }\n\n function getSortIndex(key: TableRowKey<T>): number {\n const sortBy = get(sortData);\n\n if (!sortBy || !Array.isArray(sortBy) || !isSortedBy(key))\n return -1;\n\n return sortBy.findIndex(s => s.column === key);\n }\n\n function onSort({ key, direction }: { key: TableRowKey<T>; direction?: 'asc' | 'desc' }): void {\n const sortBy = get(sortData);\n if (!sortBy)\n return;\n\n if (!Array.isArray(sortBy)) {\n if (isSortedBy(key)) {\n const newDirection = !direction || direction === 'asc' ? 'desc' : 'asc';\n\n if (sortBy.direction === newDirection) {\n set(sortData, { ...sortBy, column: undefined, direction: 'asc' });\n }\n else {\n set(sortData, {\n ...sortBy,\n direction: sortBy.direction === 'asc' ? 'desc' : 'asc',\n });\n }\n }\n else {\n set(sortData, { column: key, direction: direction || 'asc' });\n }\n return;\n }\n\n if (isSortedBy(key)) {\n const newDirection = !direction || direction === 'asc' ? 'desc' : 'asc';\n\n const index = getSortIndex(key);\n const sortByCol = sortBy[index];\n assert(sortByCol);\n\n if (sortByCol.direction === newDirection) {\n set(\n sortData,\n sortBy.filter((_, i) => i !== index),\n );\n }\n else {\n set(\n sortData,\n sortBy.map((col, i) =>\n i === index ? { ...col, direction: col.direction === 'asc' ? 'desc' : 'asc' } : col,\n ),\n );\n }\n }\n else {\n set(sortData, [...sortBy, { column: key, direction: direction || 'asc' }]);\n }\n }\n\n return {\n sortData,\n sortedMap,\n searchData,\n sorted,\n isSortedBy,\n getSortIndex,\n onSort,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TableSortData } from '../../../components/tables/RuiTableHead.vue.js';
|
|
2
|
+
import type { TablePaginationData } from '../../../components/tables/RuiTablePagination.vue.js';
|
|
3
|
+
export interface TableOptions<T> {
|
|
4
|
+
pagination?: TablePaginationData;
|
|
5
|
+
sort?: TableSortData<T>;
|
|
6
|
+
}
|
|
7
|
+
export interface GroupHeader<T> {
|
|
8
|
+
__header__: true;
|
|
9
|
+
identifier: string;
|
|
10
|
+
group: Partial<T>;
|
|
11
|
+
}
|
|
12
|
+
export type GroupedTableRow<T> = T | GroupHeader<T>;
|
|
13
|
+
export declare function isRow<T extends object>(item: GroupedTableRow<T>): item is T;
|
|
14
|
+
export declare function isHeaderSlot(slotName: string): slotName is `header.${string}`;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../../src/composables/tables/data-table/types.ts"],"sourcesContent":["import type { TableSortData } from '@/components/tables/RuiTableHead.vue';\nimport type { TablePaginationData } from '@/components/tables/RuiTablePagination.vue';\n\nexport interface TableOptions<T> {\n pagination?: TablePaginationData;\n sort?: TableSortData<T>;\n}\n\nexport interface GroupHeader<T> {\n __header__: true;\n identifier: string;\n group: Partial<T>;\n}\n\nexport type GroupedTableRow<T> = T | GroupHeader<T>;\n\nexport function isRow<T extends object>(item: GroupedTableRow<T>): item is T {\n return !('__header__' in item);\n}\n\nexport function isHeaderSlot(slotName: string): slotName is `header.${string}` {\n return slotName.startsWith('header.');\n}\n"],"names":[],"mappings":"AAgBO,SAAS,MAAwB,MAAqC;AAC3E,SAAO,EAAE,gBAAgB;AAC3B;AAEO,SAAS,aAAa,UAAkD;AAC7E,SAAO,SAAS,WAAW,SAAS;AACtC;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createSharedComposable, getSSRHandler, defaultWindow, useColorMode } from "@vueuse/core";
|
|
2
|
-
import { ref, computed
|
|
2
|
+
import { ref, computed } from "vue";
|
|
3
3
|
import { defaultTheme, ThemeMode } from "../types/theme.js";
|
|
4
4
|
import { get, set } from "@vueuse/shared";
|
|
5
5
|
const config = ref({ ...defaultTheme });
|
|
@@ -46,25 +46,6 @@ const useRotkiTheme = createSharedComposable(() => {
|
|
|
46
46
|
const init = (options) => {
|
|
47
47
|
switchThemeScheme(options.mode ?? ThemeMode.auto);
|
|
48
48
|
setThemeConfig(options.config ?? { ...defaultTheme });
|
|
49
|
-
const windowReference = defaultWindow;
|
|
50
|
-
if (windowReference) {
|
|
51
|
-
watch([isLight, theme], ([isLight2, theme2]) => {
|
|
52
|
-
const styleVariables = /* @__PURE__ */ new Map();
|
|
53
|
-
Object.entries(theme2).forEach(([context, contextObject]) => {
|
|
54
|
-
styleVariables.set(`--rui-${context}-darker`, contextObject.darker);
|
|
55
|
-
styleVariables.set(`--rui-${context}-lighter`, contextObject.lighter);
|
|
56
|
-
styleVariables.set(`--rui-${context}-main`, contextObject.DEFAULT);
|
|
57
|
-
});
|
|
58
|
-
const state2 = isLight2 ? ThemeMode.light : ThemeMode.dark;
|
|
59
|
-
styleVariables.set("--rui-text-disabled", `var(--rui-${state2}-text-disabled)`);
|
|
60
|
-
styleVariables.set("--rui-text-primary", `var(--rui-${state2}-text-primary)`);
|
|
61
|
-
styleVariables.set("--rui-text-secondary", `var(--rui-${state2}-text-secondary)`);
|
|
62
|
-
const rootStyle = windowReference.document.documentElement.style;
|
|
63
|
-
styleVariables.forEach((value, variableName) => {
|
|
64
|
-
rootStyle.setProperty(variableName, value);
|
|
65
|
-
});
|
|
66
|
-
}, { immediate: true });
|
|
67
|
-
}
|
|
68
49
|
};
|
|
69
50
|
return {
|
|
70
51
|
config,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sources":["../../src/composables/theme.ts"],"sourcesContent":["import { defaultWindow, getSSRHandler, useColorMode } from '@vueuse/core';\nimport { computed, type ComputedRef, type Ref, ref } from 'vue';\nimport {\n
|
|
1
|
+
{"version":3,"file":"theme.js","sources":["../../src/composables/theme.ts"],"sourcesContent":["import { defaultWindow, getSSRHandler, useColorMode } from '@vueuse/core';\nimport { computed, type ComputedRef, type Ref, ref } from 'vue';\nimport {\n defaultTheme,\n type InitThemeOptions,\n type ThemeConfig,\n type ThemeContent,\n type ThemeData,\n ThemeMode,\n} from '@/types/theme';\n\nconst config: Ref<ThemeConfig> = ref({ ...defaultTheme });\n\n/**\n * Theme manager\n * @returns {ThemeContent}\n */\nexport const useRotkiTheme = createSharedComposable<() => ThemeContent>(() => {\n const updateHTMLAttrs = getSSRHandler(\n 'updateHTMLAttrs',\n (selector, attribute, value) => {\n if (typeof selector !== 'string' || !defaultWindow)\n return;\n\n const el = defaultWindow.document.querySelector(selector);\n if (!el)\n return;\n\n el.setAttribute(attribute, value);\n },\n );\n\n const { state, store } = useColorMode<ThemeMode>({\n onChanged(mode, defaultHandler) {\n defaultHandler(mode);\n updateHTMLAttrs('html', 'data-theme', mode);\n },\n });\n\n /**\n * whether the current theme is controlled by system or user\n * @type {ComputedRef<boolean>}\n */\n const isAutoControlled: ComputedRef<boolean> = computed(() => get(store) === ThemeMode.auto);\n\n /**\n * truthy for light theme\n * @type {ComputedRef<boolean>}\n */\n const isLight: ComputedRef<boolean> = computed(() => get(state) === ThemeMode.light);\n\n /**\n * truthy for dark theme\n * @type {ComputedRef<boolean>}\n */\n const isDark: ComputedRef<boolean> = computed(() => get(state) === ThemeMode.dark);\n\n /**\n * current theme based on light or dark mode\n * @type {ComputedRef<ThemeData>}\n */\n const theme: ComputedRef<ThemeData> = computed(() => {\n if (get(isLight))\n return get(config).light;\n\n return get(config).dark;\n });\n\n /**\n * switch theme through dark/light/auto modes\n * @param {ThemeMode} mode\n */\n const switchThemeScheme = (mode: ThemeMode): void => {\n set(store, mode || ThemeMode.auto);\n };\n\n /**\n * toggle between auto|light|dark\n */\n const toggleThemeMode = (): void => {\n if (get(isAutoControlled))\n switchThemeScheme(ThemeMode.light);\n else if (get(isLight))\n switchThemeScheme(ThemeMode.dark);\n else if (get(isDark))\n switchThemeScheme(ThemeMode.auto);\n };\n\n /**\n * sets the configuration for the theme\n * @param {ThemeConfig} newConfig\n */\n const setThemeConfig = (newConfig: ThemeConfig): void => {\n set(config, newConfig);\n };\n\n /**\n * theme initializer, must be called once from the app's entry\n * @param {InitThemeOptions} options\n */\n const init = (options: InitThemeOptions): void => {\n switchThemeScheme(options.mode ?? ThemeMode.auto);\n setThemeConfig(options.config ?? { ...defaultTheme });\n };\n\n return {\n config,\n init,\n isAutoControlled,\n isDark,\n isLight,\n setThemeConfig,\n state,\n store,\n switchThemeScheme,\n theme,\n toggleThemeMode,\n };\n});\n"],"names":[],"mappings":";;;;AAWA,MAAM,SAA2B,IAAI,EAAE,GAAG,cAAc;AAMjD,MAAM,gBAAgB,uBAA2C,MAAM;AAC5E,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,CAAC,UAAU,WAAW,UAAU;AAC9B,UAAI,OAAO,aAAa,YAAY,CAAC;AACnC;AAEF,YAAM,KAAK,cAAc,SAAS,cAAc,QAAQ;AACxD,UAAI,CAAC;AACH;AAEF,SAAG,aAAa,WAAW,KAAK;AAAA,IAClC;AAAA,EAAA;AAGF,QAAM,EAAE,OAAO,MAAA,IAAU,aAAwB;AAAA,IAC/C,UAAU,MAAM,gBAAgB;AAC9B,qBAAe,IAAI;AACnB,sBAAgB,QAAQ,cAAc,IAAI;AAAA,IAC5C;AAAA,EAAA,CACD;AAMD,QAAM,mBAAyC,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AAM3F,QAAM,UAAgC,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,KAAK;AAMnF,QAAM,SAA+B,SAAS,MAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AAMjF,QAAM,QAAgC,SAAS,MAAM;AACnD,QAAI,IAAI,OAAO;AACb,aAAO,IAAI,MAAM,EAAE;AAErB,WAAO,IAAI,MAAM,EAAE;AAAA,EACrB,CAAC;AAMD,QAAM,oBAAoB,CAAC,SAA0B;AACnD,QAAI,OAAO,QAAQ,UAAU,IAAI;AAAA,EACnC;AAKA,QAAM,kBAAkB,MAAY;AAClC,QAAI,IAAI,gBAAgB;AACtB,wBAAkB,UAAU,KAAK;AAAA,aAC1B,IAAI,OAAO;AAClB,wBAAkB,UAAU,IAAI;AAAA,aACzB,IAAI,MAAM;AACjB,wBAAkB,UAAU,IAAI;AAAA,EACpC;AAMA,QAAM,iBAAiB,CAAC,cAAiC;AACvD,QAAI,QAAQ,SAAS;AAAA,EACvB;AAMA,QAAM,OAAO,CAAC,YAAoC;AAChD,sBAAkB,QAAQ,QAAQ,UAAU,IAAI;AAChD,mBAAe,QAAQ,UAAU,EAAE,GAAG,cAAc;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ,CAAC;"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
interface UseTimeoutManagerReturn {
|
|
2
2
|
clear: () => void;
|
|
3
3
|
create: (callback: () => void, delay: number) => void;
|
|
4
4
|
isActive: () => boolean;
|
|
5
|
-
}
|
|
5
|
+
}
|
|
6
|
+
export declare function useTimeoutManager(): UseTimeoutManagerReturn;
|
|
7
|
+
export {};
|