@rotki/ui-library 2.12.1 → 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 +7 -17
- 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 +7 -8
- 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 +20 -18
- 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 +3 -4
- 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 +48 -40
- 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 +1 -1
- 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 +19 -19
- 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 +17 -14
- package/dist/components/color-picker/RuiColorHue.vue2.js.map +1 -1
- package/dist/components/color-picker/RuiColorInput.vue.js +9 -7
- 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 +23 -14
- 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 +75 -79
- package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.js +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 +6 -3
- package/dist/components/divider/RuiDivider.vue.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +10 -1138
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +153 -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 +32 -32
- package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +2 -2
- package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +19 -22
- 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 +4 -2
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js +13 -16
- 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 +7 -13
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js +10 -9
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js.map +1 -1
- package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +10 -785
- package/dist/components/forms/select/RuiMenuSelect.vue2.js +60 -56
- package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
- package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +11 -10
- package/dist/components/forms/select/RuiSimpleSelect.vue2.js +21 -26
- 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 +45 -48
- 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 +22 -21
- 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 +47 -83
- package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.vue.d.ts +10 -30
- package/dist/components/forms/text-field/RuiTextField.vue2.js +36 -67
- 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 +11 -14
- package/dist/components/icons/RuiIcon.vue2.js.map +1 -1
- package/dist/components/index.d.ts +4 -4
- package/dist/components/loaders/RuiSkeletonBase.vue.d.ts +1 -3
- package/dist/components/loaders/RuiSkeletonBase.vue2.js +2 -2
- 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 +2 -2
- 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 +13 -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 +22 -27
- package/dist/components/overlays/dialog/RuiDialog.vue2.js +90 -67
- 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 +71 -78
- package/dist/components/overlays/menu/RuiMenu.vue2.js.map +1 -1
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +23 -30
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js +78 -49
- 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 +27 -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 +16 -9
- 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 +33 -26
- 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 +39 -36
- 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 +2 -2
- 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 +2 -2
- 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 +196 -601
- 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 +4 -2
- 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 +20 -20
- 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 +27 -19
- 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 +84 -52
- 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 +3 -2
- package/dist/components/tabs/tab-item/RuiTabItem.vue2.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +2 -5
- 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 +88 -38
- 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/icons.js +1 -1
- package/dist/composables/icons.js.map +1 -1
- package/dist/composables/popper.js +63 -49
- 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 +5 -21
- 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.d.ts +15 -15
- package/dist/icons/icons_1.js +123 -123
- package/dist/icons/icons_1.js.map +1 -1
- package/dist/icons/icons_2.d.ts +46 -46
- package/dist/icons/icons_2.js +301 -301
- package/dist/icons/icons_2.js.map +1 -1
- package/dist/icons/icons_3.d.ts +43 -43
- package/dist/icons/icons_3.js +252 -252
- package/dist/icons/icons_3.js.map +1 -1
- package/dist/icons/icons_4.d.ts +72 -2
- package/dist/icons/icons_4.js +368 -18
- 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 +105 -42
- 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/vite-plugin/index.js +4 -4
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/vite-plugin/scanner.js +3 -3
- package/dist/vite-plugin/scanner.js.map +1 -1
- package/dist/web-types.json +390 -371
- package/package.json +47 -44
- 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,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
|
-
import { createSharedComposable, getSSRHandler, useColorMode } from "@vueuse/core";
|
|
2
|
-
import { ref, computed
|
|
1
|
+
import { createSharedComposable, getSSRHandler, defaultWindow, useColorMode } from "@vueuse/core";
|
|
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 });
|
|
@@ -7,7 +7,9 @@ const useRotkiTheme = createSharedComposable(() => {
|
|
|
7
7
|
const updateHTMLAttrs = getSSRHandler(
|
|
8
8
|
"updateHTMLAttrs",
|
|
9
9
|
(selector, attribute, value) => {
|
|
10
|
-
|
|
10
|
+
if (typeof selector !== "string" || !defaultWindow)
|
|
11
|
+
return;
|
|
12
|
+
const el = defaultWindow.document.querySelector(selector);
|
|
11
13
|
if (!el)
|
|
12
14
|
return;
|
|
13
15
|
el.setAttribute(attribute, value);
|
|
@@ -44,24 +46,6 @@ const useRotkiTheme = createSharedComposable(() => {
|
|
|
44
46
|
const init = (options) => {
|
|
45
47
|
switchThemeScheme(options.mode ?? ThemeMode.auto);
|
|
46
48
|
setThemeConfig(options.config ?? { ...defaultTheme });
|
|
47
|
-
if (typeof window !== "undefined") {
|
|
48
|
-
watch([isLight, theme], ([isLight2, theme2]) => {
|
|
49
|
-
const styleVariables = /* @__PURE__ */ new Map();
|
|
50
|
-
Object.entries(theme2).forEach(([context, contextObject]) => {
|
|
51
|
-
styleVariables.set(`--rui-${context}-darker`, contextObject.darker);
|
|
52
|
-
styleVariables.set(`--rui-${context}-lighter`, contextObject.lighter);
|
|
53
|
-
styleVariables.set(`--rui-${context}-main`, contextObject.DEFAULT);
|
|
54
|
-
});
|
|
55
|
-
const state2 = isLight2 ? ThemeMode.light : ThemeMode.dark;
|
|
56
|
-
styleVariables.set("--rui-text-disabled", `var(--rui-${state2}-text-disabled)`);
|
|
57
|
-
styleVariables.set("--rui-text-primary", `var(--rui-${state2}-text-primary)`);
|
|
58
|
-
styleVariables.set("--rui-text-secondary", `var(--rui-${state2}-text-secondary)`);
|
|
59
|
-
const rootStyle = document.documentElement.style;
|
|
60
|
-
styleVariables.forEach((value, variableName) => {
|
|
61
|
-
rootStyle.setProperty(variableName, value);
|
|
62
|
-
});
|
|
63
|
-
}, { immediate: true });
|
|
64
|
-
}
|
|
65
49
|
};
|
|
66
50
|
return {
|
|
67
51
|
config,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sources":["../../src/composables/theme.ts"],"sourcesContent":["import { 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 {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { get, set } from "@vueuse/shared";
|
|
2
|
-
import { ref } from "vue";
|
|
2
|
+
import { ref, onScopeDispose } from "vue";
|
|
3
3
|
function useTimeoutManager() {
|
|
4
4
|
const timeout = ref();
|
|
5
5
|
const clear = () => {
|
|
@@ -13,6 +13,7 @@ function useTimeoutManager() {
|
|
|
13
13
|
set(timeout, setTimeout(callback, delay));
|
|
14
14
|
};
|
|
15
15
|
const isActive = () => !!get(timeout);
|
|
16
|
+
onScopeDispose(clear);
|
|
16
17
|
return { clear, create, isActive };
|
|
17
18
|
}
|
|
18
19
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeout-manager.js","sources":["../../src/composables/timeout-manager.ts"],"sourcesContent":["import { get, set } from '@vueuse/shared';\nimport { ref } from 'vue';\n\nexport function useTimeoutManager() {\n const timeout = ref<NodeJS.Timeout>();\n\n const clear = () => {\n if (get(timeout)) {\n clearTimeout(get(timeout));\n set(timeout, undefined);\n }\n };\n\n const create = (callback: () => void, delay: number) => {\n clear();\n set(timeout, setTimeout(callback, delay));\n };\n\n const isActive = () => !!get(timeout);\n\n return { clear, create, isActive };\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"timeout-manager.js","sources":["../../src/composables/timeout-manager.ts"],"sourcesContent":["import { get, set } from '@vueuse/shared';\nimport { onScopeDispose, ref } from 'vue';\n\ninterface UseTimeoutManagerReturn {\n clear: () => void;\n create: (callback: () => void, delay: number) => void;\n isActive: () => boolean;\n}\n\nexport function useTimeoutManager(): UseTimeoutManagerReturn {\n const timeout = ref<NodeJS.Timeout>();\n\n const clear = (): void => {\n if (get(timeout)) {\n clearTimeout(get(timeout));\n set(timeout, undefined);\n }\n };\n\n const create = (callback: () => void, delay: number): void => {\n clear();\n set(timeout, setTimeout(callback, delay));\n };\n\n const isActive = (): boolean => !!get(timeout);\n\n onScopeDispose(clear);\n\n return { clear, create, isActive };\n}\n"],"names":[],"mappings":";;AASO,SAAS,oBAA6C;AAC3D,QAAM,UAAU,IAAA;AAEhB,QAAM,QAAQ,MAAY;AACxB,QAAI,IAAI,OAAO,GAAG;AAChB,mBAAa,IAAI,OAAO,CAAC;AACzB,UAAI,SAAS,MAAS;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,UAAsB,UAAwB;AAC5D,UAAA;AACA,QAAI,SAAS,WAAW,UAAU,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,WAAW,MAAe,CAAC,CAAC,IAAI,OAAO;AAE7C,iBAAe,KAAK;AAEpB,SAAO,EAAE,OAAO,QAAQ,SAAA;AAC1B;"}
|
package/dist/icons/icons_1.d.ts
CHANGED
|
@@ -66,7 +66,6 @@ export declare const LuAlarmSmoke: GeneratedIcon;
|
|
|
66
66
|
export declare const LuAlbum: GeneratedIcon;
|
|
67
67
|
export declare const LuAlignCenterHorizontal: GeneratedIcon;
|
|
68
68
|
export declare const LuAlignCenterVertical: GeneratedIcon;
|
|
69
|
-
export declare const LuAlignCenter: GeneratedIcon;
|
|
70
69
|
export declare const LuAlignEndHorizontal: GeneratedIcon;
|
|
71
70
|
export declare const LuAlignEndVertical: GeneratedIcon;
|
|
72
71
|
export declare const LuAlignHorizontalDistributeCenter: GeneratedIcon;
|
|
@@ -77,9 +76,6 @@ export declare const LuAlignHorizontalJustifyEnd: GeneratedIcon;
|
|
|
77
76
|
export declare const LuAlignHorizontalJustifyStart: GeneratedIcon;
|
|
78
77
|
export declare const LuAlignHorizontalSpaceAround: GeneratedIcon;
|
|
79
78
|
export declare const LuAlignHorizontalSpaceBetween: GeneratedIcon;
|
|
80
|
-
export declare const LuAlignJustify: GeneratedIcon;
|
|
81
|
-
export declare const LuAlignLeft: GeneratedIcon;
|
|
82
|
-
export declare const LuAlignRight: GeneratedIcon;
|
|
83
79
|
export declare const LuAlignStartHorizontal: GeneratedIcon;
|
|
84
80
|
export declare const LuAlignStartVertical: GeneratedIcon;
|
|
85
81
|
export declare const LuAlignVerticalDistributeCenter: GeneratedIcon;
|
|
@@ -179,6 +175,7 @@ export declare const LuBadgeTurkishLira: GeneratedIcon;
|
|
|
179
175
|
export declare const LuBadgeX: GeneratedIcon;
|
|
180
176
|
export declare const LuBadge: GeneratedIcon;
|
|
181
177
|
export declare const LuBaggageClaim: GeneratedIcon;
|
|
178
|
+
export declare const LuBalloon: GeneratedIcon;
|
|
182
179
|
export declare const LuBan: GeneratedIcon;
|
|
183
180
|
export declare const LuBanana: GeneratedIcon;
|
|
184
181
|
export declare const LuBandage: GeneratedIcon;
|
|
@@ -223,6 +220,7 @@ export declare const LuBinary: GeneratedIcon;
|
|
|
223
220
|
export declare const LuBinoculars: GeneratedIcon;
|
|
224
221
|
export declare const LuBiohazard: GeneratedIcon;
|
|
225
222
|
export declare const LuBird: GeneratedIcon;
|
|
223
|
+
export declare const LuBirdhouse: GeneratedIcon;
|
|
226
224
|
export declare const LuBitcoin: GeneratedIcon;
|
|
227
225
|
export declare const LuBlend: GeneratedIcon;
|
|
228
226
|
export declare const LuBlinds: GeneratedIcon;
|
|
@@ -253,6 +251,7 @@ export declare const LuBookOpenCheck: GeneratedIcon;
|
|
|
253
251
|
export declare const LuBookOpenText: GeneratedIcon;
|
|
254
252
|
export declare const LuBookOpen: GeneratedIcon;
|
|
255
253
|
export declare const LuBookPlus: GeneratedIcon;
|
|
254
|
+
export declare const LuBookSearch: GeneratedIcon;
|
|
256
255
|
export declare const LuBookText: GeneratedIcon;
|
|
257
256
|
export declare const LuBookType: GeneratedIcon;
|
|
258
257
|
export declare const LuBookUp2: GeneratedIcon;
|
|
@@ -322,11 +321,13 @@ export declare const LuCalendarSync: GeneratedIcon;
|
|
|
322
321
|
export declare const LuCalendarX2: GeneratedIcon;
|
|
323
322
|
export declare const LuCalendarX: GeneratedIcon;
|
|
324
323
|
export declare const LuCalendar: GeneratedIcon;
|
|
324
|
+
export declare const LuCalendars: GeneratedIcon;
|
|
325
325
|
export declare const LuCameraOff: GeneratedIcon;
|
|
326
326
|
export declare const LuCamera: GeneratedIcon;
|
|
327
327
|
export declare const LuCandyCane: GeneratedIcon;
|
|
328
328
|
export declare const LuCandyOff: GeneratedIcon;
|
|
329
329
|
export declare const LuCandy: GeneratedIcon;
|
|
330
|
+
export declare const LuCannabisOff: GeneratedIcon;
|
|
330
331
|
export declare const LuCannabis: GeneratedIcon;
|
|
331
332
|
export declare const LuCaptionsOff: GeneratedIcon;
|
|
332
333
|
export declare const LuCaptions: GeneratedIcon;
|
|
@@ -372,6 +373,12 @@ export declare const LuCheckLine: GeneratedIcon;
|
|
|
372
373
|
export declare const LuCheck: GeneratedIcon;
|
|
373
374
|
export declare const LuChefHat: GeneratedIcon;
|
|
374
375
|
export declare const LuCherry: GeneratedIcon;
|
|
376
|
+
export declare const LuChessBishop: GeneratedIcon;
|
|
377
|
+
export declare const LuChessKing: GeneratedIcon;
|
|
378
|
+
export declare const LuChessKnight: GeneratedIcon;
|
|
379
|
+
export declare const LuChessPawn: GeneratedIcon;
|
|
380
|
+
export declare const LuChessQueen: GeneratedIcon;
|
|
381
|
+
export declare const LuChessRook: GeneratedIcon;
|
|
375
382
|
export declare const LuChevronDown: GeneratedIcon;
|
|
376
383
|
export declare const LuChevronFirst: GeneratedIcon;
|
|
377
384
|
export declare const LuChevronLast: GeneratedIcon;
|
|
@@ -422,6 +429,7 @@ export declare const LuCircleParkingOff: GeneratedIcon;
|
|
|
422
429
|
export declare const LuCircleParking: GeneratedIcon;
|
|
423
430
|
export declare const LuCirclePause: GeneratedIcon;
|
|
424
431
|
export declare const LuCirclePercent: GeneratedIcon;
|
|
432
|
+
export declare const LuCirclePile: GeneratedIcon;
|
|
425
433
|
export declare const LuCirclePlay: GeneratedIcon;
|
|
426
434
|
export declare const LuCirclePlus: GeneratedIcon;
|
|
427
435
|
export declare const LuCirclePoundSterling: GeneratedIcon;
|
|
@@ -466,11 +474,13 @@ export declare const LuClock9: GeneratedIcon;
|
|
|
466
474
|
export declare const LuClockAlert: GeneratedIcon;
|
|
467
475
|
export declare const LuClockArrowDown: GeneratedIcon;
|
|
468
476
|
export declare const LuClockArrowUp: GeneratedIcon;
|
|
477
|
+
export declare const LuClockCheck: GeneratedIcon;
|
|
469
478
|
export declare const LuClockFading: GeneratedIcon;
|
|
470
479
|
export declare const LuClockPlus: GeneratedIcon;
|
|
471
480
|
export declare const LuClock: GeneratedIcon;
|
|
472
481
|
export declare const LuClosedCaption: GeneratedIcon;
|
|
473
482
|
export declare const LuCloudAlert: GeneratedIcon;
|
|
483
|
+
export declare const LuCloudBackup: GeneratedIcon;
|
|
474
484
|
export declare const LuCloudCheck: GeneratedIcon;
|
|
475
485
|
export declare const LuCloudCog: GeneratedIcon;
|
|
476
486
|
export declare const LuCloudDownload: GeneratedIcon;
|
|
@@ -486,16 +496,6 @@ export declare const LuCloudRain: GeneratedIcon;
|
|
|
486
496
|
export declare const LuCloudSnow: GeneratedIcon;
|
|
487
497
|
export declare const LuCloudSunRain: GeneratedIcon;
|
|
488
498
|
export declare const LuCloudSun: GeneratedIcon;
|
|
499
|
+
export declare const LuCloudSync: GeneratedIcon;
|
|
489
500
|
export declare const LuCloudUpload: GeneratedIcon;
|
|
490
501
|
export declare const LuCloud: GeneratedIcon;
|
|
491
|
-
export declare const LuCloudy: GeneratedIcon;
|
|
492
|
-
export declare const LuClover: GeneratedIcon;
|
|
493
|
-
export declare const LuClub: GeneratedIcon;
|
|
494
|
-
export declare const LuCodeXml: GeneratedIcon;
|
|
495
|
-
export declare const LuCode: GeneratedIcon;
|
|
496
|
-
export declare const LuCodepen: GeneratedIcon;
|
|
497
|
-
export declare const LuCodesandbox: GeneratedIcon;
|
|
498
|
-
export declare const LuCoffee: GeneratedIcon;
|
|
499
|
-
export declare const LuCog: GeneratedIcon;
|
|
500
|
-
export declare const LuCoins: GeneratedIcon;
|
|
501
|
-
export declare const LuColumns2: GeneratedIcon;
|