@rotki/ui-library 2.16.0 → 2.16.2

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.
Files changed (91) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.js.map +1 -1
  2. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js +7 -2
  3. package/dist/components/accordions/accordion/RuiAccordion.vue_vue_type_script_setup_true_lang.js.map +1 -1
  4. package/dist/components/buttons/button/RuiButton.js.map +1 -1
  5. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js +6 -2
  6. package/dist/components/buttons/button/RuiButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/components/buttons/button/button-styles.d.ts +6 -9
  8. package/dist/components/buttons/button/button-styles.js +42 -20
  9. package/dist/components/buttons/button/button-styles.js.map +1 -1
  10. package/dist/components/cards/RuiCard.js.map +1 -1
  11. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js +4 -1
  12. package/dist/components/cards/RuiCard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/color-picker/RuiColorBoard.js.map +1 -1
  14. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js +7 -2
  15. package/dist/components/color-picker/RuiColorBoard.vue_vue_type_script_setup_true_lang.js.map +1 -1
  16. package/dist/components/color-picker/RuiColorHue.js.map +1 -1
  17. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js +7 -2
  18. package/dist/components/color-picker/RuiColorHue.vue_vue_type_script_setup_true_lang.js.map +1 -1
  19. package/dist/components/color-picker/RuiColorPicker.js.map +1 -1
  20. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js +7 -2
  21. package/dist/components/color-picker/RuiColorPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  22. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  23. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +3 -2
  24. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  26. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +1 -1
  27. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +6 -3
  28. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  29. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  30. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +2 -2
  31. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/forms/text-area/text-area-styles.js +2 -2
  33. package/dist/components/forms/text-area/text-area-styles.js.map +1 -1
  34. package/dist/components/forms/text-field/text-field-styles.js +3 -3
  35. package/dist/components/forms/text-field/text-field-styles.js.map +1 -1
  36. package/dist/components/forms/text-input-styles.js +2 -2
  37. package/dist/components/forms/text-input-styles.js.map +1 -1
  38. package/dist/components/loaders/RuiSkeletonLoader.js.map +1 -1
  39. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js +15 -5
  40. package/dist/components/loaders/RuiSkeletonLoader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/components/overlays/badge/RuiBadge.js.map +1 -1
  42. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js +2 -2
  43. package/dist/components/overlays/badge/RuiBadge.vue_vue_type_script_setup_true_lang.js.map +1 -1
  44. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  45. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +6 -10
  46. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  47. package/dist/components/overlays/notification/RuiNotification.js.map +1 -1
  48. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js +8 -3
  49. package/dist/components/overlays/notification/RuiNotification.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/components/overlays/tooltip/RuiTooltip.js.map +1 -1
  51. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js +13 -6
  52. package/dist/components/overlays/tooltip/RuiTooltip.vue_vue_type_script_setup_true_lang.js.map +1 -1
  53. package/dist/components/tables/RuiDataTable.js.map +1 -1
  54. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js +2 -6
  55. package/dist/components/tables/RuiDataTable.vue_vue_type_script_setup_true_lang.js.map +1 -1
  56. package/dist/components/tables/RuiTableHead.js.map +1 -1
  57. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js +1 -1
  58. package/dist/components/tables/RuiTableHead.vue_vue_type_script_setup_true_lang.js.map +1 -1
  59. package/dist/components/tabs/tab/RuiTab.js.map +1 -1
  60. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js +1 -1
  61. package/dist/components/tabs/tab/RuiTab.vue_vue_type_script_setup_true_lang.js.map +1 -1
  62. package/dist/components/tabs/tab-items/RuiTabItems.js.map +1 -1
  63. package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +2 -2
  64. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js +1 -1
  65. package/dist/components/tabs/tab-items/RuiTabItems.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/tabs/tabs/RuiTabs.js.map +1 -1
  67. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +2 -2
  68. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js +1 -1
  69. package/dist/components/tabs/tabs/RuiTabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  70. package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +1 -1
  71. package/dist/composables/forms/auto-complete/keyboard-navigation.js +2 -2
  72. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  73. package/dist/composables/tables/data-table/expansion.d.ts +0 -1
  74. package/dist/composables/tables/data-table/expansion.js +2 -2
  75. package/dist/composables/tables/data-table/expansion.js.map +1 -1
  76. package/dist/style.css +79 -13
  77. package/dist/utils/tv.d.ts +6 -3
  78. package/dist/utils/tv.js +15 -5
  79. package/dist/utils/tv.js.map +1 -1
  80. package/dist/vite-plugin/index.js +1 -1
  81. package/dist/vite-plugin/index.js.map +1 -1
  82. package/dist/web-types.json +6 -4
  83. package/package.json +9 -2
  84. package/dist/node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -1440
  85. package/dist/node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
  86. package/dist/node_modules/.pnpm/tailwind-variants@3.2.2_tailwind-merge@2.6.1_tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.2_/node_modules/tailwind-variants/dist/chunk-LQJYWU4O.js +0 -91
  87. package/dist/node_modules/.pnpm/tailwind-variants@3.2.2_tailwind-merge@2.6.1_tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.2_/node_modules/tailwind-variants/dist/chunk-LQJYWU4O.js.map +0 -1
  88. package/dist/node_modules/.pnpm/tailwind-variants@3.2.2_tailwind-merge@2.6.1_tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.2_/node_modules/tailwind-variants/dist/chunk-RZF76H2U.js +0 -217
  89. package/dist/node_modules/.pnpm/tailwind-variants@3.2.2_tailwind-merge@2.6.1_tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.2_/node_modules/tailwind-variants/dist/chunk-RZF76H2U.js.map +0 -1
  90. package/dist/node_modules/.pnpm/tailwind-variants@3.2.2_tailwind-merge@2.6.1_tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.2_/node_modules/tailwind-variants/dist/index.js +0 -33
  91. package/dist/node_modules/.pnpm/tailwind-variants@3.2.2_tailwind-merge@2.6.1_tailwindcss@3.4.19_tsx@4.21.0_yaml@2.8.2_/node_modules/tailwind-variants/dist/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RuiDataTable.js","names":[],"sources":["../../../src/components/tables/RuiDataTable.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, IdType extends keyof T = keyof T\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiTooltip from '@/components/overlays/tooltip/RuiTooltip.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { dataTableStyles, getAlignClass } from '@/components/tables/data-table-styles';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\nimport RuiTableEmptyState from '@/components/tables/RuiTableEmptyState.vue';\nimport RuiTableHead, {\n type GroupData,\n type TableColumn,\n type TableRowKeyData,\n type TableSortData,\n} from '@/components/tables/RuiTableHead.vue';\nimport RuiTablePagination, {\n type TablePaginationData,\n} from '@/components/tables/RuiTablePagination.vue';\nimport { useTable } from '@/composables/defaults/table';\nimport { useStickyTableHeader } from '@/composables/sticky-header';\nimport { useTableColumns } from '@/composables/tables/data-table/columns';\nimport { useTableExpansion } from '@/composables/tables/data-table/expansion';\nimport { useTableGrouping } from '@/composables/tables/data-table/grouping';\nimport { useTablePagination } from '@/composables/tables/data-table/pagination';\nimport { useTableSelection } from '@/composables/tables/data-table/selection';\nimport { useTableSort } from '@/composables/tables/data-table/sort';\nimport { type GroupHeader, isRow } from '@/composables/tables/data-table/types';\n\nexport type { GroupedTableRow, GroupHeader, TableOptions } from '@/composables/tables/data-table/types';\n\nexport interface Props<T, K extends keyof T> {\n /**\n * list of items for each row\n */\n rows: readonly T[];\n /**\n * the attribute used to identify each row uniquely for selection, usually `id`\n */\n rowAttr: K;\n /**\n * model for internal searching\n */\n search?: string;\n /**\n * model for items per page\n * will be used if the `pagination` model isn't specified\n */\n itemsPerPage?: number;\n /**\n * list of column definitions\n */\n cols?: TableColumn<T>[];\n /**\n * attribute to use from column definitions to display column titles\n */\n columnAttr?: keyof TableColumn<T>;\n /**\n * flag to show a more or less spacious table\n */\n dense?: boolean;\n /**\n * flag to outline the flag with a border\n */\n outlined?: boolean;\n /**\n * should add zebra-striping to the table row\n */\n striped?: boolean;\n /**\n * flag to show loading state of the table\n * triggers indefinite progress at the bottom of the table header\n */\n loading?: boolean;\n disablePerPage?: boolean;\n /**\n * Maximum number of pages before the jump-to-page dropdown is replaced with\n * a numeric input. Defaults to `500`. Forwarded to `RuiTablePagination`.\n */\n rangesThreshold?: number;\n /**\n * data to display for empty state\n * text and icon\n * @example :empty=\"{ icon: 'transactions-line', label: 'No transactions found' }\"\n */\n empty?: {\n label?: string;\n description?: string;\n };\n /**\n * should hide the header navigation\n */\n hideDefaultHeader?: boolean;\n /**\n * should hide the footer navigation\n */\n hideDefaultFooter?: boolean;\n\n rounded?: 'sm' | 'md' | 'lg';\n /**\n * make expansion work like accordion\n */\n singleExpand?: boolean;\n /**\n * make table head stick to top on scroll\n */\n stickyHeader?: boolean;\n stickyOffset?: number;\n /**\n * Affects how the items per page work across the app.\n * When true, changing the items per page setting in one table will affect other tables.\n */\n globalItemsPerPage?: boolean;\n groupExpandButtonPosition?: 'start' | 'end';\n disabledRows?: readonly T[];\n multiPageSelect?: boolean;\n itemClass?: ((item: T) => string) | string;\n}\n\ndefineOptions({\n name: 'RuiDataTable',\n});\n\nconst selectedData = defineModel<T[IdType][]>();\n\nconst expanded = defineModel<T[]>('expanded');\n\nconst [pagination, paginationModifiers] = defineModel<TablePaginationData, 'external'>('pagination');\n\nconst [sort, sortModifiers] = defineModel<TableSortData<T>, 'external'>('sort');\n\nconst group = defineModel<TableRowKeyData<T>>('group');\n\nconst collapsed = defineModel<T[]>('collapsed');\n\nconst {\n rows,\n rowAttr,\n search = '',\n itemsPerPage = 10,\n cols,\n columnAttr = 'label',\n dense = false,\n outlined = false,\n striped = false,\n loading = false,\n disablePerPage = false,\n rangesThreshold = 500,\n empty = { label: 'No item found' },\n hideDefaultHeader = false,\n hideDefaultFooter = false,\n rounded = 'md',\n singleExpand = false,\n stickyHeader = false,\n stickyOffset,\n globalItemsPerPage = undefined,\n groupExpandButtonPosition = 'start',\n disabledRows,\n multiPageSelect = false,\n itemClass = '',\n} = defineProps<Props<T, IdType>>();\n\nconst emit = defineEmits<{\n 'update:options': [value: { pagination?: TablePaginationData; sort?: TableSortData<T> }];\n 'copy:group': [value: GroupData<T>];\n}>();\n\nconst slots = defineSlots<Partial<\n Record<`header.${string}`, (props: { column: TableColumn<T> }) => any> &\n Record<`item.${string}`, (props: { column: TableColumn<T>; row: T; index: number }) => any> & {\n 'body.prepend': (props: { colspan: number }) => any;\n 'body.append': (props: { colspan: number }) => any;\n 'group.header': (props: {\n colspan: number;\n header: GroupHeader<T>;\n isOpen: boolean;\n toggle: () => void;\n }) => any;\n 'group.header.content': (props: { header: GroupHeader<T>; groupKey: string }) => any;\n 'expanded-item': (props: { row: T; index: number }) => any;\n 'no-data': () => any;\n 'empty-description': () => any;\n 'tfoot': () => any;\n }\n>>();\n\nconst tableDefaults = useTable();\n\nconst stickyHeaderOffset = computed<number | undefined>(() =>\n stickyOffset !== undefined ? stickyOffset : get(tableDefaults.stickyOffset),\n);\n\nconst table = useTemplateRef<HTMLTableElement>('table');\nconst tableScroller = useTemplateRef<HTMLElement>('tableScroller');\n\nconst { stick } = useStickyTableHeader(\n () => stickyHeader,\n stickyHeaderOffset,\n { table, tableScroller },\n);\n\nconst hasExpandedItemSlot = computed<boolean>(() => !!slots['expanded-item']);\n\nconst { expandable, isExpanded, onToggleExpand } = useTableExpansion<T, IdType>(\n { rowAttr, singleExpand },\n { expanded, hasExpandedItemSlot },\n);\n\nfunction emitUpdateOptions(opts: { sort?: TableSortData<T>; pagination?: TablePaginationData }): void {\n emit('update:options', opts);\n}\n\nconst {\n sortData,\n sortedMap,\n sorted,\n onSort: applySort,\n} = useTableSort<T>(\n { rows: () => rows, search: () => search, sortModifiersExternal: sortModifiers.external },\n {\n sort,\n pagination,\n emitUpdateOptions,\n },\n);\n\nconst {\n groupKeys,\n groupKey,\n grouped,\n isExpandedGroup,\n isHiddenRow,\n onToggleExpandGroup,\n onUngroup,\n onCopyGroup,\n} = useTableGrouping<T, IdType>(\n { rowAttr },\n {\n group,\n collapsed,\n sorted,\n emitCopyGroup: (value: GroupData<T>) => emit('copy:group', value),\n },\n);\n\nconst {\n paginationData,\n filtered,\n setInternalTotal,\n resetPagination,\n} = useTablePagination<T>(\n {\n itemsPerPage,\n paginationModifiersExternal: paginationModifiers.external,\n globalItemsPerPage,\n },\n {\n pagination,\n grouped,\n isHiddenRow,\n sort,\n emitUpdateOptions,\n tableDefaults,\n },\n);\n\nconst noData = computed<boolean>(() => get(filtered).length === 0);\n\nconst { columns, colspan, headerSlots, cellValue } = useTableColumns<T, IdType>({\n cols: () => cols,\n columnAttr,\n rows: () => rows,\n expandable,\n groupKeys,\n selectedData,\n slots,\n});\n\nconst {\n isAllSelected,\n indeterminate,\n isSelected,\n isDisabledRow,\n onToggleAll,\n onSelect,\n onCheckboxClick,\n deselectRemovedRows,\n resetCheckboxShiftState,\n} = useTableSelection<T, IdType>(\n { rowAttr, multiPageSelect, disabledRows: () => disabledRows },\n { selectedData, filtered },\n);\n\n// Sort triggers selection reset — handled here to avoid circular dependency between sort and selection\nfunction onSort(payload: Parameters<typeof applySort>[0]): void {\n applySort(payload);\n if (!multiPageSelect)\n onToggleAll(false);\n resetCheckboxShiftState();\n}\n\nfunction onPaginate(): void {\n set(expanded, []);\n if (!multiPageSelect)\n onToggleAll(false);\n resetCheckboxShiftState();\n}\n\n// Reset pagination page to 1 on search query change\nwatch(() => search, () => {\n resetPagination();\n onToggleAll(false);\n resetCheckboxShiftState();\n});\n\nwatch(sorted, (items) => {\n if (!multiPageSelect)\n deselectRemovedRows();\n setInternalTotal(items);\n});\n\nonMounted(() => {\n setInternalTotal(get(sorted));\n});\n\nconst ui = computed<ReturnType<typeof dataTableStyles>>(() => dataTableStyles({\n outlined,\n rounded,\n dense,\n striped,\n}));\n</script>\n\n<template>\n <div\n :class=\"ui.wrapper()\"\n data-id=\"table-wrapper\"\n >\n <RuiTablePagination\n v-if=\"paginationData && !hideDefaultHeader\"\n v-model=\"paginationData\"\n :dense=\"dense\"\n :loading=\"loading\"\n :disable-per-page=\"disablePerPage\"\n :ranges-threshold=\"rangesThreshold\"\n data-id=\"table-pagination\"\n @update:model-value=\"onPaginate()\"\n />\n <div\n ref=\"tableScroller\"\n :class=\"ui.scroller()\"\n data-id=\"table-scroller\"\n >\n <table\n ref=\"table\"\n :class=\"ui.table()\"\n :aria-busy=\"loading\"\n >\n <RuiTableHead\n :loading=\"loading\"\n :indeterminate=\"indeterminate\"\n :capitalize-headers=\"!cols\"\n :colspan=\"colspan\"\n :column-attr=\"columnAttr\"\n :columns=\"columns\"\n :dense=\"dense\"\n :disable-check-all=\"!filtered?.length\"\n :is-all-selected=\"isAllSelected\"\n :no-data=\"noData\"\n :selectable=\"!!selectedData\"\n :sort-data=\"sortData\"\n :sorted-map=\"sortedMap\"\n :stick=\"stick\"\n :sticky-header=\"stickyHeader\"\n @sort=\"onSort($event)\"\n @select:all=\"onToggleAll($event)\"\n >\n <template\n v-for=\"headerSlot in headerSlots\"\n #[headerSlot]=\"slotData\"\n >\n <slot\n :name=\"headerSlot\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiTableHead>\n <RuiTableHead\n v-if=\"stickyHeader\"\n :loading=\"loading\"\n :capitalize-headers=\"!cols\"\n :colspan=\"colspan\"\n :column-attr=\"columnAttr\"\n :columns=\"columns\"\n :dense=\"dense\"\n :no-data=\"noData\"\n :selectable=\"!!selectedData\"\n :sort-data=\"sortData\"\n :sorted-map=\"sortedMap\"\n data-id=\"head-clone\"\n class=\"opacity-0 invisible\"\n >\n <template\n v-for=\"headerSlot in headerSlots\"\n #[headerSlot]=\"slotData\"\n >\n <slot\n :name=\"headerSlot\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiTableHead>\n <tbody :class=\"ui.tbody()\">\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n v-if=\"slots['body.prepend']\"\n :colspan=\"colspan\"\n name=\"body.prepend\"\n />\n <template v-for=\"(row, index) in filtered\">\n <tr\n v-if=\"!isRow(row)\"\n :key=\"`row-${index}`\"\n :class=\"[ui.tr({ rowVariant: 'group' })]\"\n data-id=\"row-group\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"group.header\"\n :colspan=\"colspan\"\n :header=\"row\"\n :is-open=\"isExpandedGroup(row.group)\"\n :toggle=\"() => onToggleExpandGroup(row.group, row.identifier)\"\n >\n <td\n :class=\"[ui.td()]\"\n class=\"!p-2\"\n :colspan=\"colspan\"\n >\n <div class=\"flex items-center gap-2\">\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === 'start'\"\n :expanded=\"isExpandedGroup(row.group)\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n :group-key=\"groupKey\"\n name=\"group.header.content\"\n :header=\"row\"\n >\n <span>{{ groupKey }}: {{ row.identifier }}</span>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-copy-button\"\n @click=\"onCopyGroup({ key: groupKey, value: row.group })\"\n >\n <RuiIcon\n name=\"lu-copy\"\n size=\"16\"\n />\n </RuiButton>\n </slot>\n <RuiTooltip\n :options=\"{ placement: 'top' }\"\n class=\"ml-auto mr-2\"\n >\n <template #activator>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-ungroup-button\"\n @click=\"onUngroup()\"\n >\n <RuiIcon\n name=\"lu-trash-2\"\n size=\"14\"\n />\n </RuiButton>\n </template>\n Ungroup\n </RuiTooltip>\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === 'end'\"\n :expanded=\"isExpandedGroup(row.group)\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n </div>\n </td>\n </slot>\n </tr>\n <template v-else>\n <tr\n :key=\"`row-${index}`\"\n :class=\"[\n ui.tr({ rowVariant: isSelected(row[rowAttr]) ? 'selected' : undefined }),\n typeof itemClass === 'string' ? itemClass : itemClass(row),\n ]\"\n :aria-selected=\"selectedData ? isSelected(row[rowAttr]) : undefined\"\n data-id=\"row\"\n >\n <td\n v-if=\"selectedData\"\n :class=\"ui.checkbox()\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :data-id=\"`table-toggle-check-${index}`\"\n :model-value=\"isSelected(row[rowAttr])\"\n :disabled=\"isDisabledRow(row[rowAttr])\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, row[rowAttr], true)\"\n @click=\"onCheckboxClick($event, row[rowAttr], index)\"\n />\n </td>\n\n <td\n v-for=\"(column, subIndex) in columns\"\n :key=\"subIndex\"\n :class=\"[\n ui.td({ class: getAlignClass(column.align) }),\n column.cellClass,\n ]\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n >\n <slot\n v-if=\"column.key === 'expand'\"\n :name=\"`item.${column.key.toString()}`\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n >\n <RuiExpandButton\n v-if=\"!slots['item.expand']\"\n :expanded=\"isExpanded(row[rowAttr])\"\n @click=\"onToggleExpand(row)\"\n />\n </slot>\n <slot\n v-else\n :column=\"column\"\n :index=\"index\"\n :name=\"`item.${column.key.toString()}`\"\n :row=\"row\"\n >\n {{ cellValue(row, column.key) }}\n </slot>\n </td>\n </tr>\n\n <tr\n v-if=\"expandable && isExpanded(row[rowAttr])\"\n :key=\"`row-expand-${index}`\"\n :class=\"ui.tr({ rowVariant: 'expandable' })\"\n data-id=\"row-expanded\"\n >\n <td\n :colspan=\"colspan\"\n :class=\"[ui.td()]\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"expanded-item\"\n :row=\"row\"\n :index=\"index\"\n />\n </td>\n </tr>\n </template>\n </template>\n <tr v-if=\"loading && noData\">\n <td\n :class=\"ui.tbodyLoader()\"\n :colspan=\"colspan\"\n data-id=\"tbody-loader\"\n >\n <div :class=\"ui.tbodyLoaderContent()\">\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n circular\n />\n </div>\n </td>\n </tr>\n <tr\n v-if=\"noData && empty && !loading\"\n :class=\"ui.tr({ rowVariant: 'empty' })\"\n data-id=\"row-empty\"\n >\n <Transition\n appear\n enter-active-class=\"transition ease-out duration-200 delay-200\"\n enter-from-class=\"opacity-0 translate-y-1\"\n enter-to-class=\"opacity-100 translate-y-0\"\n leave-active-class=\"transition ease-in duration-150\"\n leave-from-class=\"opacity-100 translate-y-0\"\n leave-to-class=\"opacity-0 translate-y-1\"\n >\n <td\n :class=\"ui.td()\"\n :colspan=\"colspan\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot name=\"no-data\">\n <RuiTableEmptyState\n :label=\"empty.label\"\n :description=\"empty.description\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <template\n v-if=\"slots['empty-description']\"\n #description\n >\n <slot name=\"empty-description\" />\n </template>\n </RuiTableEmptyState>\n </slot>\n </td>\n </Transition>\n </tr>\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n v-if=\"slots['body.append']\"\n :colspan=\"colspan\"\n name=\"body.append\"\n />\n </tbody>\n <tfoot>\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot name=\"tfoot\" />\n </tfoot>\n </table>\n </div>\n <RuiTablePagination\n v-if=\"paginationData && !hideDefaultFooter\"\n v-model=\"paginationData\"\n :dense=\"dense\"\n :loading=\"loading\"\n :disable-per-page=\"disablePerPage\"\n :ranges-threshold=\"rangesThreshold\"\n data-id=\"table-pagination\"\n @update:model-value=\"onPaginate()\"\n />\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiDataTable.js","names":[],"sources":["../../../src/components/tables/RuiDataTable.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, IdType extends keyof T = keyof T\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiTooltip from '@/components/overlays/tooltip/RuiTooltip.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { dataTableStyles, getAlignClass } from '@/components/tables/data-table-styles';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\nimport RuiTableEmptyState from '@/components/tables/RuiTableEmptyState.vue';\nimport RuiTableHead, {\n type GroupData,\n type TableColumn,\n type TableRowKeyData,\n type TableSortData,\n} from '@/components/tables/RuiTableHead.vue';\nimport RuiTablePagination, {\n type TablePaginationData,\n} from '@/components/tables/RuiTablePagination.vue';\nimport { useTable } from '@/composables/defaults/table';\nimport { useStickyTableHeader } from '@/composables/sticky-header';\nimport { useTableColumns } from '@/composables/tables/data-table/columns';\nimport { useTableExpansion } from '@/composables/tables/data-table/expansion';\nimport { useTableGrouping } from '@/composables/tables/data-table/grouping';\nimport { useTablePagination } from '@/composables/tables/data-table/pagination';\nimport { useTableSelection } from '@/composables/tables/data-table/selection';\nimport { useTableSort } from '@/composables/tables/data-table/sort';\nimport { type GroupHeader, isRow } from '@/composables/tables/data-table/types';\n\nexport type { GroupedTableRow, GroupHeader, TableOptions } from '@/composables/tables/data-table/types';\n\nexport interface Props<T, K extends keyof T> {\n /**\n * list of items for each row\n */\n rows: readonly T[];\n /**\n * the attribute used to identify each row uniquely for selection, usually `id`\n */\n rowAttr: K;\n /**\n * model for internal searching\n */\n search?: string;\n /**\n * model for items per page\n * will be used if the `pagination` model isn't specified\n */\n itemsPerPage?: number;\n /**\n * list of column definitions\n */\n cols?: TableColumn<T>[];\n /**\n * attribute to use from column definitions to display column titles\n */\n columnAttr?: keyof TableColumn<T>;\n /**\n * flag to show a more or less spacious table\n */\n dense?: boolean;\n /**\n * flag to outline the flag with a border\n */\n outlined?: boolean;\n /**\n * should add zebra-striping to the table row\n */\n striped?: boolean;\n /**\n * flag to show loading state of the table\n * triggers indefinite progress at the bottom of the table header\n */\n loading?: boolean;\n disablePerPage?: boolean;\n /**\n * Maximum number of pages before the jump-to-page dropdown is replaced with\n * a numeric input. Defaults to `500`. Forwarded to `RuiTablePagination`.\n */\n rangesThreshold?: number;\n /**\n * data to display for empty state\n * text and icon\n * @example :empty=\"{ icon: 'transactions-line', label: 'No transactions found' }\"\n */\n empty?: {\n label?: string;\n description?: string;\n };\n /**\n * should hide the header navigation\n */\n hideDefaultHeader?: boolean;\n /**\n * should hide the footer navigation\n */\n hideDefaultFooter?: boolean;\n\n rounded?: 'sm' | 'md' | 'lg';\n /**\n * make expansion work like accordion\n */\n singleExpand?: boolean;\n /**\n * make table head stick to top on scroll\n */\n stickyHeader?: boolean;\n stickyOffset?: number;\n /**\n * Affects how the items per page work across the app.\n * When true, changing the items per page setting in one table will affect other tables.\n */\n globalItemsPerPage?: boolean;\n groupExpandButtonPosition?: 'start' | 'end';\n disabledRows?: readonly T[];\n multiPageSelect?: boolean;\n itemClass?: ((item: T) => string) | string;\n}\n\ndefineOptions({\n name: 'RuiDataTable',\n});\n\nconst selectedData = defineModel<T[IdType][]>();\n\nconst expanded = defineModel<T[]>('expanded');\n\nconst [pagination, paginationModifiers] = defineModel<TablePaginationData, 'external'>('pagination');\n\nconst [sort, sortModifiers] = defineModel<TableSortData<T>, 'external'>('sort');\n\nconst group = defineModel<TableRowKeyData<T>>('group');\n\nconst collapsed = defineModel<T[]>('collapsed');\n\nconst {\n rows,\n rowAttr,\n search = '',\n itemsPerPage = 10,\n cols,\n columnAttr = 'label',\n dense = false,\n outlined = false,\n striped = false,\n loading = false,\n disablePerPage = false,\n rangesThreshold = 500,\n empty = { label: 'No item found' },\n hideDefaultHeader = false,\n hideDefaultFooter = false,\n rounded = 'md',\n singleExpand = false,\n stickyHeader = false,\n stickyOffset,\n globalItemsPerPage = undefined,\n groupExpandButtonPosition = 'start',\n disabledRows,\n multiPageSelect = false,\n itemClass = '',\n} = defineProps<Props<T, IdType>>();\n\nconst emit = defineEmits<{\n 'update:options': [value: { pagination?: TablePaginationData; sort?: TableSortData<T> }];\n 'copy:group': [value: GroupData<T>];\n}>();\n\nconst slots = defineSlots<Partial<\n Record<`header.${string}`, (props: { column: TableColumn<T> }) => any> &\n Record<`item.${string}`, (props: { column: TableColumn<T>; row: T; index: number }) => any> & {\n 'body.prepend': (props: { colspan: number }) => any;\n 'body.append': (props: { colspan: number }) => any;\n 'group.header': (props: {\n colspan: number;\n header: GroupHeader<T>;\n isOpen: boolean;\n toggle: () => void;\n }) => any;\n 'group.header.content': (props: { header: GroupHeader<T>; groupKey: string }) => any;\n 'expanded-item': (props: { row: T; index: number }) => any;\n 'no-data': () => any;\n 'empty-description': () => any;\n 'tfoot': () => any;\n }\n>>();\n\nconst tableDefaults = useTable();\n\nconst stickyHeaderOffset = computed<number | undefined>(() =>\n stickyOffset !== undefined ? stickyOffset : get(tableDefaults.stickyOffset),\n);\n\nconst table = useTemplateRef<HTMLTableElement>('table');\nconst tableScroller = useTemplateRef<HTMLElement>('tableScroller');\n\nconst { stick } = useStickyTableHeader(\n () => stickyHeader,\n stickyHeaderOffset,\n { table, tableScroller },\n);\n\nconst { expandable, isExpanded, onToggleExpand } = useTableExpansion<T, IdType>(\n { rowAttr, singleExpand },\n { expanded },\n);\n\nfunction emitUpdateOptions(opts: { sort?: TableSortData<T>; pagination?: TablePaginationData }): void {\n emit('update:options', opts);\n}\n\nconst {\n sortData,\n sortedMap,\n sorted,\n onSort: applySort,\n} = useTableSort<T>(\n { rows: () => rows, search: () => search, sortModifiersExternal: sortModifiers.external },\n {\n sort,\n pagination,\n emitUpdateOptions,\n },\n);\n\nconst {\n groupKeys,\n groupKey,\n grouped,\n isExpandedGroup,\n isHiddenRow,\n onToggleExpandGroup,\n onUngroup,\n onCopyGroup,\n} = useTableGrouping<T, IdType>(\n { rowAttr },\n {\n group,\n collapsed,\n sorted,\n emitCopyGroup: (value: GroupData<T>) => emit('copy:group', value),\n },\n);\n\nconst {\n paginationData,\n filtered,\n setInternalTotal,\n resetPagination,\n} = useTablePagination<T>(\n {\n itemsPerPage,\n paginationModifiersExternal: paginationModifiers.external,\n globalItemsPerPage,\n },\n {\n pagination,\n grouped,\n isHiddenRow,\n sort,\n emitUpdateOptions,\n tableDefaults,\n },\n);\n\nconst noData = computed<boolean>(() => get(filtered).length === 0);\n\nconst { columns, colspan, headerSlots, cellValue } = useTableColumns<T, IdType>({\n cols: () => cols,\n columnAttr,\n rows: () => rows,\n expandable,\n groupKeys,\n selectedData,\n slots,\n});\n\nconst {\n isAllSelected,\n indeterminate,\n isSelected,\n isDisabledRow,\n onToggleAll,\n onSelect,\n onCheckboxClick,\n deselectRemovedRows,\n resetCheckboxShiftState,\n} = useTableSelection<T, IdType>(\n { rowAttr, multiPageSelect, disabledRows: () => disabledRows },\n { selectedData, filtered },\n);\n\n// Sort triggers selection reset — handled here to avoid circular dependency between sort and selection\nfunction onSort(payload: Parameters<typeof applySort>[0]): void {\n applySort(payload);\n if (!multiPageSelect)\n onToggleAll(false);\n resetCheckboxShiftState();\n}\n\nfunction onPaginate(): void {\n set(expanded, []);\n if (!multiPageSelect)\n onToggleAll(false);\n resetCheckboxShiftState();\n}\n\n// Reset pagination page to 1 on search query change\nwatch(() => search, () => {\n resetPagination();\n onToggleAll(false);\n resetCheckboxShiftState();\n});\n\nwatch(sorted, (items) => {\n if (!multiPageSelect)\n deselectRemovedRows();\n setInternalTotal(items);\n});\n\nonMounted(() => {\n setInternalTotal(get(sorted));\n});\n\nconst ui = computed<ReturnType<typeof dataTableStyles>>(() => dataTableStyles({\n outlined,\n rounded,\n dense,\n striped,\n}));\n</script>\n\n<template>\n <div\n :class=\"ui.wrapper()\"\n data-id=\"table-wrapper\"\n >\n <RuiTablePagination\n v-if=\"paginationData && !hideDefaultHeader\"\n v-model=\"paginationData\"\n :dense=\"dense\"\n :loading=\"loading\"\n :disable-per-page=\"disablePerPage\"\n :ranges-threshold=\"rangesThreshold\"\n data-id=\"table-pagination\"\n @update:model-value=\"onPaginate()\"\n />\n <div\n ref=\"tableScroller\"\n :class=\"ui.scroller()\"\n data-id=\"table-scroller\"\n >\n <table\n ref=\"table\"\n :class=\"ui.table()\"\n :aria-busy=\"loading\"\n >\n <RuiTableHead\n :loading=\"loading\"\n :indeterminate=\"indeterminate\"\n :capitalize-headers=\"!cols\"\n :colspan=\"colspan\"\n :column-attr=\"columnAttr\"\n :columns=\"columns\"\n :dense=\"dense\"\n :disable-check-all=\"!filtered?.length\"\n :is-all-selected=\"isAllSelected\"\n :no-data=\"noData\"\n :selectable=\"!!selectedData\"\n :sort-data=\"sortData\"\n :sorted-map=\"sortedMap\"\n :stick=\"stick\"\n :sticky-header=\"stickyHeader\"\n @sort=\"onSort($event)\"\n @select:all=\"onToggleAll($event)\"\n >\n <template\n v-for=\"headerSlot in headerSlots\"\n #[headerSlot]=\"slotData\"\n >\n <slot\n :name=\"headerSlot\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiTableHead>\n <RuiTableHead\n v-if=\"stickyHeader\"\n :loading=\"loading\"\n :capitalize-headers=\"!cols\"\n :colspan=\"colspan\"\n :column-attr=\"columnAttr\"\n :columns=\"columns\"\n :dense=\"dense\"\n :no-data=\"noData\"\n :selectable=\"!!selectedData\"\n :sort-data=\"sortData\"\n :sorted-map=\"sortedMap\"\n data-id=\"head-clone\"\n class=\"opacity-0 invisible\"\n >\n <template\n v-for=\"headerSlot in headerSlots\"\n #[headerSlot]=\"slotData\"\n >\n <slot\n :name=\"headerSlot\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiTableHead>\n <tbody :class=\"ui.tbody()\">\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n v-if=\"slots['body.prepend']\"\n :colspan=\"colspan\"\n name=\"body.prepend\"\n />\n <template v-for=\"(row, index) in filtered\">\n <tr\n v-if=\"!isRow(row)\"\n :key=\"`row-${index}`\"\n :class=\"[ui.tr({ rowVariant: 'group' })]\"\n data-id=\"row-group\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"group.header\"\n :colspan=\"colspan\"\n :header=\"row\"\n :is-open=\"isExpandedGroup(row.group)\"\n :toggle=\"() => onToggleExpandGroup(row.group, row.identifier)\"\n >\n <td\n :class=\"[ui.td()]\"\n class=\"!p-2\"\n :colspan=\"colspan\"\n >\n <div class=\"flex items-center gap-2\">\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === 'start'\"\n :expanded=\"isExpandedGroup(row.group)\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n :group-key=\"groupKey\"\n name=\"group.header.content\"\n :header=\"row\"\n >\n <span>{{ groupKey }}: {{ row.identifier }}</span>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-copy-button\"\n @click=\"onCopyGroup({ key: groupKey, value: row.group })\"\n >\n <RuiIcon\n name=\"lu-copy\"\n size=\"16\"\n />\n </RuiButton>\n </slot>\n <RuiTooltip\n :options=\"{ placement: 'top' }\"\n class=\"ml-auto mr-2\"\n >\n <template #activator>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-ungroup-button\"\n @click=\"onUngroup()\"\n >\n <RuiIcon\n name=\"lu-trash-2\"\n size=\"14\"\n />\n </RuiButton>\n </template>\n Ungroup\n </RuiTooltip>\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === 'end'\"\n :expanded=\"isExpandedGroup(row.group)\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n </div>\n </td>\n </slot>\n </tr>\n <template v-else>\n <tr\n :key=\"`row-${index}`\"\n :class=\"[\n ui.tr({ rowVariant: isSelected(row[rowAttr]) ? 'selected' : undefined }),\n typeof itemClass === 'string' ? itemClass : itemClass(row),\n ]\"\n :aria-selected=\"selectedData ? isSelected(row[rowAttr]) : undefined\"\n data-id=\"row\"\n >\n <td\n v-if=\"selectedData\"\n :class=\"ui.checkbox()\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :data-id=\"`table-toggle-check-${index}`\"\n :model-value=\"isSelected(row[rowAttr])\"\n :disabled=\"isDisabledRow(row[rowAttr])\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, row[rowAttr], true)\"\n @click=\"onCheckboxClick($event, row[rowAttr], index)\"\n />\n </td>\n\n <td\n v-for=\"(column, subIndex) in columns\"\n :key=\"subIndex\"\n :class=\"[\n ui.td({ class: getAlignClass(column.align) }),\n column.cellClass,\n ]\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n >\n <slot\n v-if=\"column.key === 'expand'\"\n :name=\"`item.${column.key.toString()}`\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n >\n <RuiExpandButton\n v-if=\"!slots['item.expand']\"\n :expanded=\"isExpanded(row[rowAttr])\"\n @click=\"onToggleExpand(row)\"\n />\n </slot>\n <slot\n v-else\n :column=\"column\"\n :index=\"index\"\n :name=\"`item.${column.key.toString()}`\"\n :row=\"row\"\n >\n {{ cellValue(row, column.key) }}\n </slot>\n </td>\n </tr>\n\n <tr\n v-if=\"expandable && !!$slots['expanded-item'] && isExpanded(row[rowAttr])\"\n :key=\"`row-expand-${index}`\"\n :class=\"ui.tr({ rowVariant: 'expandable' })\"\n data-id=\"row-expanded\"\n >\n <td\n :colspan=\"colspan\"\n :class=\"[ui.td()]\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"expanded-item\"\n :row=\"row\"\n :index=\"index\"\n />\n </td>\n </tr>\n </template>\n </template>\n <tr v-if=\"loading && noData\">\n <td\n :class=\"ui.tbodyLoader()\"\n :colspan=\"colspan\"\n data-id=\"tbody-loader\"\n >\n <div :class=\"ui.tbodyLoaderContent()\">\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n circular\n />\n </div>\n </td>\n </tr>\n <tr\n v-if=\"noData && empty && !loading\"\n :class=\"ui.tr({ rowVariant: 'empty' })\"\n data-id=\"row-empty\"\n >\n <Transition\n appear\n enter-active-class=\"transition ease-out duration-200 delay-200\"\n enter-from-class=\"opacity-0 translate-y-1\"\n enter-to-class=\"opacity-100 translate-y-0\"\n leave-active-class=\"transition ease-in duration-150\"\n leave-from-class=\"opacity-100 translate-y-0\"\n leave-to-class=\"opacity-0 translate-y-1\"\n >\n <td\n :class=\"ui.td()\"\n :colspan=\"colspan\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot name=\"no-data\">\n <RuiTableEmptyState\n :label=\"empty.label\"\n :description=\"empty.description\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <template\n v-if=\"slots['empty-description']\"\n #description\n >\n <slot name=\"empty-description\" />\n </template>\n </RuiTableEmptyState>\n </slot>\n </td>\n </Transition>\n </tr>\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n v-if=\"slots['body.append']\"\n :colspan=\"colspan\"\n name=\"body.append\"\n />\n </tbody>\n <tfoot>\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot name=\"tfoot\" />\n </tfoot>\n </table>\n </div>\n <RuiTablePagination\n v-if=\"paginationData && !hideDefaultFooter\"\n v-model=\"paginationData\"\n :dense=\"dense\"\n :loading=\"loading\"\n :disable-per-page=\"disablePerPage\"\n :ranges-threshold=\"rangesThreshold\"\n data-id=\"table-pagination\"\n @update:model-value=\"onPaginate()\"\n />\n </div>\n</template>\n"],"mappings":""}
@@ -133,14 +133,10 @@ var RuiDataTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
133
133
  table,
134
134
  tableScroller
135
135
  });
136
- const hasExpandedItemSlot = computed(() => !!slots["expanded-item"]);
137
136
  const { expandable, isExpanded, onToggleExpand } = useTableExpansion({
138
137
  rowAttr: __props.rowAttr,
139
138
  singleExpand: __props.singleExpand
140
- }, {
141
- expanded,
142
- hasExpandedItemSlot
143
- });
139
+ }, { expanded });
144
140
  function emitUpdateOptions(opts) {
145
141
  emit("update:options", opts);
146
142
  }
@@ -436,7 +432,7 @@ var RuiDataTable_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
436
432
  index,
437
433
  row
438
434
  }, () => [createTextVNode(toDisplayString(unref(cellValue)(row, column.key)), 1)])], 10, _hoisted_5);
439
- }), 128))], 10, _hoisted_4)), unref(expandable) && unref(isExpanded)(row[__props.rowAttr]) ? (openBlock(), createElementBlock("tr", {
435
+ }), 128))], 10, _hoisted_4)), unref(expandable) && !!_ctx.$slots["expanded-item"] && unref(isExpanded)(row[__props.rowAttr]) ? (openBlock(), createElementBlock("tr", {
440
436
  key: `row-expand-${index}`,
441
437
  class: normalizeClass(unref(ui).tr({ rowVariant: "expandable" })),
442
438
  "data-id": "row-expanded"
@@ -1 +1 @@
1
- {"version":3,"file":"RuiDataTable.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tables/RuiDataTable.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, IdType extends keyof T = keyof T\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiTooltip from '@/components/overlays/tooltip/RuiTooltip.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { dataTableStyles, getAlignClass } from '@/components/tables/data-table-styles';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\nimport RuiTableEmptyState from '@/components/tables/RuiTableEmptyState.vue';\nimport RuiTableHead, {\n type GroupData,\n type TableColumn,\n type TableRowKeyData,\n type TableSortData,\n} from '@/components/tables/RuiTableHead.vue';\nimport RuiTablePagination, {\n type TablePaginationData,\n} from '@/components/tables/RuiTablePagination.vue';\nimport { useTable } from '@/composables/defaults/table';\nimport { useStickyTableHeader } from '@/composables/sticky-header';\nimport { useTableColumns } from '@/composables/tables/data-table/columns';\nimport { useTableExpansion } from '@/composables/tables/data-table/expansion';\nimport { useTableGrouping } from '@/composables/tables/data-table/grouping';\nimport { useTablePagination } from '@/composables/tables/data-table/pagination';\nimport { useTableSelection } from '@/composables/tables/data-table/selection';\nimport { useTableSort } from '@/composables/tables/data-table/sort';\nimport { type GroupHeader, isRow } from '@/composables/tables/data-table/types';\n\nexport type { GroupedTableRow, GroupHeader, TableOptions } from '@/composables/tables/data-table/types';\n\nexport interface Props<T, K extends keyof T> {\n /**\n * list of items for each row\n */\n rows: readonly T[];\n /**\n * the attribute used to identify each row uniquely for selection, usually `id`\n */\n rowAttr: K;\n /**\n * model for internal searching\n */\n search?: string;\n /**\n * model for items per page\n * will be used if the `pagination` model isn't specified\n */\n itemsPerPage?: number;\n /**\n * list of column definitions\n */\n cols?: TableColumn<T>[];\n /**\n * attribute to use from column definitions to display column titles\n */\n columnAttr?: keyof TableColumn<T>;\n /**\n * flag to show a more or less spacious table\n */\n dense?: boolean;\n /**\n * flag to outline the flag with a border\n */\n outlined?: boolean;\n /**\n * should add zebra-striping to the table row\n */\n striped?: boolean;\n /**\n * flag to show loading state of the table\n * triggers indefinite progress at the bottom of the table header\n */\n loading?: boolean;\n disablePerPage?: boolean;\n /**\n * Maximum number of pages before the jump-to-page dropdown is replaced with\n * a numeric input. Defaults to `500`. Forwarded to `RuiTablePagination`.\n */\n rangesThreshold?: number;\n /**\n * data to display for empty state\n * text and icon\n * @example :empty=\"{ icon: 'transactions-line', label: 'No transactions found' }\"\n */\n empty?: {\n label?: string;\n description?: string;\n };\n /**\n * should hide the header navigation\n */\n hideDefaultHeader?: boolean;\n /**\n * should hide the footer navigation\n */\n hideDefaultFooter?: boolean;\n\n rounded?: 'sm' | 'md' | 'lg';\n /**\n * make expansion work like accordion\n */\n singleExpand?: boolean;\n /**\n * make table head stick to top on scroll\n */\n stickyHeader?: boolean;\n stickyOffset?: number;\n /**\n * Affects how the items per page work across the app.\n * When true, changing the items per page setting in one table will affect other tables.\n */\n globalItemsPerPage?: boolean;\n groupExpandButtonPosition?: 'start' | 'end';\n disabledRows?: readonly T[];\n multiPageSelect?: boolean;\n itemClass?: ((item: T) => string) | string;\n}\n\ndefineOptions({\n name: 'RuiDataTable',\n});\n\nconst selectedData = defineModel<T[IdType][]>();\n\nconst expanded = defineModel<T[]>('expanded');\n\nconst [pagination, paginationModifiers] = defineModel<TablePaginationData, 'external'>('pagination');\n\nconst [sort, sortModifiers] = defineModel<TableSortData<T>, 'external'>('sort');\n\nconst group = defineModel<TableRowKeyData<T>>('group');\n\nconst collapsed = defineModel<T[]>('collapsed');\n\nconst {\n rows,\n rowAttr,\n search = '',\n itemsPerPage = 10,\n cols,\n columnAttr = 'label',\n dense = false,\n outlined = false,\n striped = false,\n loading = false,\n disablePerPage = false,\n rangesThreshold = 500,\n empty = { label: 'No item found' },\n hideDefaultHeader = false,\n hideDefaultFooter = false,\n rounded = 'md',\n singleExpand = false,\n stickyHeader = false,\n stickyOffset,\n globalItemsPerPage = undefined,\n groupExpandButtonPosition = 'start',\n disabledRows,\n multiPageSelect = false,\n itemClass = '',\n} = defineProps<Props<T, IdType>>();\n\nconst emit = defineEmits<{\n 'update:options': [value: { pagination?: TablePaginationData; sort?: TableSortData<T> }];\n 'copy:group': [value: GroupData<T>];\n}>();\n\nconst slots = defineSlots<Partial<\n Record<`header.${string}`, (props: { column: TableColumn<T> }) => any> &\n Record<`item.${string}`, (props: { column: TableColumn<T>; row: T; index: number }) => any> & {\n 'body.prepend': (props: { colspan: number }) => any;\n 'body.append': (props: { colspan: number }) => any;\n 'group.header': (props: {\n colspan: number;\n header: GroupHeader<T>;\n isOpen: boolean;\n toggle: () => void;\n }) => any;\n 'group.header.content': (props: { header: GroupHeader<T>; groupKey: string }) => any;\n 'expanded-item': (props: { row: T; index: number }) => any;\n 'no-data': () => any;\n 'empty-description': () => any;\n 'tfoot': () => any;\n }\n>>();\n\nconst tableDefaults = useTable();\n\nconst stickyHeaderOffset = computed<number | undefined>(() =>\n stickyOffset !== undefined ? stickyOffset : get(tableDefaults.stickyOffset),\n);\n\nconst table = useTemplateRef<HTMLTableElement>('table');\nconst tableScroller = useTemplateRef<HTMLElement>('tableScroller');\n\nconst { stick } = useStickyTableHeader(\n () => stickyHeader,\n stickyHeaderOffset,\n { table, tableScroller },\n);\n\nconst hasExpandedItemSlot = computed<boolean>(() => !!slots['expanded-item']);\n\nconst { expandable, isExpanded, onToggleExpand } = useTableExpansion<T, IdType>(\n { rowAttr, singleExpand },\n { expanded, hasExpandedItemSlot },\n);\n\nfunction emitUpdateOptions(opts: { sort?: TableSortData<T>; pagination?: TablePaginationData }): void {\n emit('update:options', opts);\n}\n\nconst {\n sortData,\n sortedMap,\n sorted,\n onSort: applySort,\n} = useTableSort<T>(\n { rows: () => rows, search: () => search, sortModifiersExternal: sortModifiers.external },\n {\n sort,\n pagination,\n emitUpdateOptions,\n },\n);\n\nconst {\n groupKeys,\n groupKey,\n grouped,\n isExpandedGroup,\n isHiddenRow,\n onToggleExpandGroup,\n onUngroup,\n onCopyGroup,\n} = useTableGrouping<T, IdType>(\n { rowAttr },\n {\n group,\n collapsed,\n sorted,\n emitCopyGroup: (value: GroupData<T>) => emit('copy:group', value),\n },\n);\n\nconst {\n paginationData,\n filtered,\n setInternalTotal,\n resetPagination,\n} = useTablePagination<T>(\n {\n itemsPerPage,\n paginationModifiersExternal: paginationModifiers.external,\n globalItemsPerPage,\n },\n {\n pagination,\n grouped,\n isHiddenRow,\n sort,\n emitUpdateOptions,\n tableDefaults,\n },\n);\n\nconst noData = computed<boolean>(() => get(filtered).length === 0);\n\nconst { columns, colspan, headerSlots, cellValue } = useTableColumns<T, IdType>({\n cols: () => cols,\n columnAttr,\n rows: () => rows,\n expandable,\n groupKeys,\n selectedData,\n slots,\n});\n\nconst {\n isAllSelected,\n indeterminate,\n isSelected,\n isDisabledRow,\n onToggleAll,\n onSelect,\n onCheckboxClick,\n deselectRemovedRows,\n resetCheckboxShiftState,\n} = useTableSelection<T, IdType>(\n { rowAttr, multiPageSelect, disabledRows: () => disabledRows },\n { selectedData, filtered },\n);\n\n// Sort triggers selection reset — handled here to avoid circular dependency between sort and selection\nfunction onSort(payload: Parameters<typeof applySort>[0]): void {\n applySort(payload);\n if (!multiPageSelect)\n onToggleAll(false);\n resetCheckboxShiftState();\n}\n\nfunction onPaginate(): void {\n set(expanded, []);\n if (!multiPageSelect)\n onToggleAll(false);\n resetCheckboxShiftState();\n}\n\n// Reset pagination page to 1 on search query change\nwatch(() => search, () => {\n resetPagination();\n onToggleAll(false);\n resetCheckboxShiftState();\n});\n\nwatch(sorted, (items) => {\n if (!multiPageSelect)\n deselectRemovedRows();\n setInternalTotal(items);\n});\n\nonMounted(() => {\n setInternalTotal(get(sorted));\n});\n\nconst ui = computed<ReturnType<typeof dataTableStyles>>(() => dataTableStyles({\n outlined,\n rounded,\n dense,\n striped,\n}));\n</script>\n\n<template>\n <div\n :class=\"ui.wrapper()\"\n data-id=\"table-wrapper\"\n >\n <RuiTablePagination\n v-if=\"paginationData && !hideDefaultHeader\"\n v-model=\"paginationData\"\n :dense=\"dense\"\n :loading=\"loading\"\n :disable-per-page=\"disablePerPage\"\n :ranges-threshold=\"rangesThreshold\"\n data-id=\"table-pagination\"\n @update:model-value=\"onPaginate()\"\n />\n <div\n ref=\"tableScroller\"\n :class=\"ui.scroller()\"\n data-id=\"table-scroller\"\n >\n <table\n ref=\"table\"\n :class=\"ui.table()\"\n :aria-busy=\"loading\"\n >\n <RuiTableHead\n :loading=\"loading\"\n :indeterminate=\"indeterminate\"\n :capitalize-headers=\"!cols\"\n :colspan=\"colspan\"\n :column-attr=\"columnAttr\"\n :columns=\"columns\"\n :dense=\"dense\"\n :disable-check-all=\"!filtered?.length\"\n :is-all-selected=\"isAllSelected\"\n :no-data=\"noData\"\n :selectable=\"!!selectedData\"\n :sort-data=\"sortData\"\n :sorted-map=\"sortedMap\"\n :stick=\"stick\"\n :sticky-header=\"stickyHeader\"\n @sort=\"onSort($event)\"\n @select:all=\"onToggleAll($event)\"\n >\n <template\n v-for=\"headerSlot in headerSlots\"\n #[headerSlot]=\"slotData\"\n >\n <slot\n :name=\"headerSlot\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiTableHead>\n <RuiTableHead\n v-if=\"stickyHeader\"\n :loading=\"loading\"\n :capitalize-headers=\"!cols\"\n :colspan=\"colspan\"\n :column-attr=\"columnAttr\"\n :columns=\"columns\"\n :dense=\"dense\"\n :no-data=\"noData\"\n :selectable=\"!!selectedData\"\n :sort-data=\"sortData\"\n :sorted-map=\"sortedMap\"\n data-id=\"head-clone\"\n class=\"opacity-0 invisible\"\n >\n <template\n v-for=\"headerSlot in headerSlots\"\n #[headerSlot]=\"slotData\"\n >\n <slot\n :name=\"headerSlot\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiTableHead>\n <tbody :class=\"ui.tbody()\">\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n v-if=\"slots['body.prepend']\"\n :colspan=\"colspan\"\n name=\"body.prepend\"\n />\n <template v-for=\"(row, index) in filtered\">\n <tr\n v-if=\"!isRow(row)\"\n :key=\"`row-${index}`\"\n :class=\"[ui.tr({ rowVariant: 'group' })]\"\n data-id=\"row-group\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"group.header\"\n :colspan=\"colspan\"\n :header=\"row\"\n :is-open=\"isExpandedGroup(row.group)\"\n :toggle=\"() => onToggleExpandGroup(row.group, row.identifier)\"\n >\n <td\n :class=\"[ui.td()]\"\n class=\"!p-2\"\n :colspan=\"colspan\"\n >\n <div class=\"flex items-center gap-2\">\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === 'start'\"\n :expanded=\"isExpandedGroup(row.group)\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n :group-key=\"groupKey\"\n name=\"group.header.content\"\n :header=\"row\"\n >\n <span>{{ groupKey }}: {{ row.identifier }}</span>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-copy-button\"\n @click=\"onCopyGroup({ key: groupKey, value: row.group })\"\n >\n <RuiIcon\n name=\"lu-copy\"\n size=\"16\"\n />\n </RuiButton>\n </slot>\n <RuiTooltip\n :options=\"{ placement: 'top' }\"\n class=\"ml-auto mr-2\"\n >\n <template #activator>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-ungroup-button\"\n @click=\"onUngroup()\"\n >\n <RuiIcon\n name=\"lu-trash-2\"\n size=\"14\"\n />\n </RuiButton>\n </template>\n Ungroup\n </RuiTooltip>\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === 'end'\"\n :expanded=\"isExpandedGroup(row.group)\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n </div>\n </td>\n </slot>\n </tr>\n <template v-else>\n <tr\n :key=\"`row-${index}`\"\n :class=\"[\n ui.tr({ rowVariant: isSelected(row[rowAttr]) ? 'selected' : undefined }),\n typeof itemClass === 'string' ? itemClass : itemClass(row),\n ]\"\n :aria-selected=\"selectedData ? isSelected(row[rowAttr]) : undefined\"\n data-id=\"row\"\n >\n <td\n v-if=\"selectedData\"\n :class=\"ui.checkbox()\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :data-id=\"`table-toggle-check-${index}`\"\n :model-value=\"isSelected(row[rowAttr])\"\n :disabled=\"isDisabledRow(row[rowAttr])\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, row[rowAttr], true)\"\n @click=\"onCheckboxClick($event, row[rowAttr], index)\"\n />\n </td>\n\n <td\n v-for=\"(column, subIndex) in columns\"\n :key=\"subIndex\"\n :class=\"[\n ui.td({ class: getAlignClass(column.align) }),\n column.cellClass,\n ]\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n >\n <slot\n v-if=\"column.key === 'expand'\"\n :name=\"`item.${column.key.toString()}`\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n >\n <RuiExpandButton\n v-if=\"!slots['item.expand']\"\n :expanded=\"isExpanded(row[rowAttr])\"\n @click=\"onToggleExpand(row)\"\n />\n </slot>\n <slot\n v-else\n :column=\"column\"\n :index=\"index\"\n :name=\"`item.${column.key.toString()}`\"\n :row=\"row\"\n >\n {{ cellValue(row, column.key) }}\n </slot>\n </td>\n </tr>\n\n <tr\n v-if=\"expandable && isExpanded(row[rowAttr])\"\n :key=\"`row-expand-${index}`\"\n :class=\"ui.tr({ rowVariant: 'expandable' })\"\n data-id=\"row-expanded\"\n >\n <td\n :colspan=\"colspan\"\n :class=\"[ui.td()]\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"expanded-item\"\n :row=\"row\"\n :index=\"index\"\n />\n </td>\n </tr>\n </template>\n </template>\n <tr v-if=\"loading && noData\">\n <td\n :class=\"ui.tbodyLoader()\"\n :colspan=\"colspan\"\n data-id=\"tbody-loader\"\n >\n <div :class=\"ui.tbodyLoaderContent()\">\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n circular\n />\n </div>\n </td>\n </tr>\n <tr\n v-if=\"noData && empty && !loading\"\n :class=\"ui.tr({ rowVariant: 'empty' })\"\n data-id=\"row-empty\"\n >\n <Transition\n appear\n enter-active-class=\"transition ease-out duration-200 delay-200\"\n enter-from-class=\"opacity-0 translate-y-1\"\n enter-to-class=\"opacity-100 translate-y-0\"\n leave-active-class=\"transition ease-in duration-150\"\n leave-from-class=\"opacity-100 translate-y-0\"\n leave-to-class=\"opacity-0 translate-y-1\"\n >\n <td\n :class=\"ui.td()\"\n :colspan=\"colspan\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot name=\"no-data\">\n <RuiTableEmptyState\n :label=\"empty.label\"\n :description=\"empty.description\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <template\n v-if=\"slots['empty-description']\"\n #description\n >\n <slot name=\"empty-description\" />\n </template>\n </RuiTableEmptyState>\n </slot>\n </td>\n </Transition>\n </tr>\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n v-if=\"slots['body.append']\"\n :colspan=\"colspan\"\n name=\"body.append\"\n />\n </tbody>\n <tfoot>\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot name=\"tfoot\" />\n </tfoot>\n </table>\n </div>\n <RuiTablePagination\n v-if=\"paginationData && !hideDefaultFooter\"\n v-model=\"paginationData\"\n :dense=\"dense\"\n :loading=\"loading\"\n :disable-per-page=\"disablePerPage\"\n :ranges-threshold=\"rangesThreshold\"\n data-id=\"table-pagination\"\n @update:model-value=\"onPaginate()\"\n />\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RuiDataTable.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/tables/RuiDataTable.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, IdType extends keyof T = keyof T\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiTooltip from '@/components/overlays/tooltip/RuiTooltip.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { dataTableStyles, getAlignClass } from '@/components/tables/data-table-styles';\nimport RuiExpandButton from '@/components/tables/RuiExpandButton.vue';\nimport RuiTableEmptyState from '@/components/tables/RuiTableEmptyState.vue';\nimport RuiTableHead, {\n type GroupData,\n type TableColumn,\n type TableRowKeyData,\n type TableSortData,\n} from '@/components/tables/RuiTableHead.vue';\nimport RuiTablePagination, {\n type TablePaginationData,\n} from '@/components/tables/RuiTablePagination.vue';\nimport { useTable } from '@/composables/defaults/table';\nimport { useStickyTableHeader } from '@/composables/sticky-header';\nimport { useTableColumns } from '@/composables/tables/data-table/columns';\nimport { useTableExpansion } from '@/composables/tables/data-table/expansion';\nimport { useTableGrouping } from '@/composables/tables/data-table/grouping';\nimport { useTablePagination } from '@/composables/tables/data-table/pagination';\nimport { useTableSelection } from '@/composables/tables/data-table/selection';\nimport { useTableSort } from '@/composables/tables/data-table/sort';\nimport { type GroupHeader, isRow } from '@/composables/tables/data-table/types';\n\nexport type { GroupedTableRow, GroupHeader, TableOptions } from '@/composables/tables/data-table/types';\n\nexport interface Props<T, K extends keyof T> {\n /**\n * list of items for each row\n */\n rows: readonly T[];\n /**\n * the attribute used to identify each row uniquely for selection, usually `id`\n */\n rowAttr: K;\n /**\n * model for internal searching\n */\n search?: string;\n /**\n * model for items per page\n * will be used if the `pagination` model isn't specified\n */\n itemsPerPage?: number;\n /**\n * list of column definitions\n */\n cols?: TableColumn<T>[];\n /**\n * attribute to use from column definitions to display column titles\n */\n columnAttr?: keyof TableColumn<T>;\n /**\n * flag to show a more or less spacious table\n */\n dense?: boolean;\n /**\n * flag to outline the flag with a border\n */\n outlined?: boolean;\n /**\n * should add zebra-striping to the table row\n */\n striped?: boolean;\n /**\n * flag to show loading state of the table\n * triggers indefinite progress at the bottom of the table header\n */\n loading?: boolean;\n disablePerPage?: boolean;\n /**\n * Maximum number of pages before the jump-to-page dropdown is replaced with\n * a numeric input. Defaults to `500`. Forwarded to `RuiTablePagination`.\n */\n rangesThreshold?: number;\n /**\n * data to display for empty state\n * text and icon\n * @example :empty=\"{ icon: 'transactions-line', label: 'No transactions found' }\"\n */\n empty?: {\n label?: string;\n description?: string;\n };\n /**\n * should hide the header navigation\n */\n hideDefaultHeader?: boolean;\n /**\n * should hide the footer navigation\n */\n hideDefaultFooter?: boolean;\n\n rounded?: 'sm' | 'md' | 'lg';\n /**\n * make expansion work like accordion\n */\n singleExpand?: boolean;\n /**\n * make table head stick to top on scroll\n */\n stickyHeader?: boolean;\n stickyOffset?: number;\n /**\n * Affects how the items per page work across the app.\n * When true, changing the items per page setting in one table will affect other tables.\n */\n globalItemsPerPage?: boolean;\n groupExpandButtonPosition?: 'start' | 'end';\n disabledRows?: readonly T[];\n multiPageSelect?: boolean;\n itemClass?: ((item: T) => string) | string;\n}\n\ndefineOptions({\n name: 'RuiDataTable',\n});\n\nconst selectedData = defineModel<T[IdType][]>();\n\nconst expanded = defineModel<T[]>('expanded');\n\nconst [pagination, paginationModifiers] = defineModel<TablePaginationData, 'external'>('pagination');\n\nconst [sort, sortModifiers] = defineModel<TableSortData<T>, 'external'>('sort');\n\nconst group = defineModel<TableRowKeyData<T>>('group');\n\nconst collapsed = defineModel<T[]>('collapsed');\n\nconst {\n rows,\n rowAttr,\n search = '',\n itemsPerPage = 10,\n cols,\n columnAttr = 'label',\n dense = false,\n outlined = false,\n striped = false,\n loading = false,\n disablePerPage = false,\n rangesThreshold = 500,\n empty = { label: 'No item found' },\n hideDefaultHeader = false,\n hideDefaultFooter = false,\n rounded = 'md',\n singleExpand = false,\n stickyHeader = false,\n stickyOffset,\n globalItemsPerPage = undefined,\n groupExpandButtonPosition = 'start',\n disabledRows,\n multiPageSelect = false,\n itemClass = '',\n} = defineProps<Props<T, IdType>>();\n\nconst emit = defineEmits<{\n 'update:options': [value: { pagination?: TablePaginationData; sort?: TableSortData<T> }];\n 'copy:group': [value: GroupData<T>];\n}>();\n\nconst slots = defineSlots<Partial<\n Record<`header.${string}`, (props: { column: TableColumn<T> }) => any> &\n Record<`item.${string}`, (props: { column: TableColumn<T>; row: T; index: number }) => any> & {\n 'body.prepend': (props: { colspan: number }) => any;\n 'body.append': (props: { colspan: number }) => any;\n 'group.header': (props: {\n colspan: number;\n header: GroupHeader<T>;\n isOpen: boolean;\n toggle: () => void;\n }) => any;\n 'group.header.content': (props: { header: GroupHeader<T>; groupKey: string }) => any;\n 'expanded-item': (props: { row: T; index: number }) => any;\n 'no-data': () => any;\n 'empty-description': () => any;\n 'tfoot': () => any;\n }\n>>();\n\nconst tableDefaults = useTable();\n\nconst stickyHeaderOffset = computed<number | undefined>(() =>\n stickyOffset !== undefined ? stickyOffset : get(tableDefaults.stickyOffset),\n);\n\nconst table = useTemplateRef<HTMLTableElement>('table');\nconst tableScroller = useTemplateRef<HTMLElement>('tableScroller');\n\nconst { stick } = useStickyTableHeader(\n () => stickyHeader,\n stickyHeaderOffset,\n { table, tableScroller },\n);\n\nconst { expandable, isExpanded, onToggleExpand } = useTableExpansion<T, IdType>(\n { rowAttr, singleExpand },\n { expanded },\n);\n\nfunction emitUpdateOptions(opts: { sort?: TableSortData<T>; pagination?: TablePaginationData }): void {\n emit('update:options', opts);\n}\n\nconst {\n sortData,\n sortedMap,\n sorted,\n onSort: applySort,\n} = useTableSort<T>(\n { rows: () => rows, search: () => search, sortModifiersExternal: sortModifiers.external },\n {\n sort,\n pagination,\n emitUpdateOptions,\n },\n);\n\nconst {\n groupKeys,\n groupKey,\n grouped,\n isExpandedGroup,\n isHiddenRow,\n onToggleExpandGroup,\n onUngroup,\n onCopyGroup,\n} = useTableGrouping<T, IdType>(\n { rowAttr },\n {\n group,\n collapsed,\n sorted,\n emitCopyGroup: (value: GroupData<T>) => emit('copy:group', value),\n },\n);\n\nconst {\n paginationData,\n filtered,\n setInternalTotal,\n resetPagination,\n} = useTablePagination<T>(\n {\n itemsPerPage,\n paginationModifiersExternal: paginationModifiers.external,\n globalItemsPerPage,\n },\n {\n pagination,\n grouped,\n isHiddenRow,\n sort,\n emitUpdateOptions,\n tableDefaults,\n },\n);\n\nconst noData = computed<boolean>(() => get(filtered).length === 0);\n\nconst { columns, colspan, headerSlots, cellValue } = useTableColumns<T, IdType>({\n cols: () => cols,\n columnAttr,\n rows: () => rows,\n expandable,\n groupKeys,\n selectedData,\n slots,\n});\n\nconst {\n isAllSelected,\n indeterminate,\n isSelected,\n isDisabledRow,\n onToggleAll,\n onSelect,\n onCheckboxClick,\n deselectRemovedRows,\n resetCheckboxShiftState,\n} = useTableSelection<T, IdType>(\n { rowAttr, multiPageSelect, disabledRows: () => disabledRows },\n { selectedData, filtered },\n);\n\n// Sort triggers selection reset — handled here to avoid circular dependency between sort and selection\nfunction onSort(payload: Parameters<typeof applySort>[0]): void {\n applySort(payload);\n if (!multiPageSelect)\n onToggleAll(false);\n resetCheckboxShiftState();\n}\n\nfunction onPaginate(): void {\n set(expanded, []);\n if (!multiPageSelect)\n onToggleAll(false);\n resetCheckboxShiftState();\n}\n\n// Reset pagination page to 1 on search query change\nwatch(() => search, () => {\n resetPagination();\n onToggleAll(false);\n resetCheckboxShiftState();\n});\n\nwatch(sorted, (items) => {\n if (!multiPageSelect)\n deselectRemovedRows();\n setInternalTotal(items);\n});\n\nonMounted(() => {\n setInternalTotal(get(sorted));\n});\n\nconst ui = computed<ReturnType<typeof dataTableStyles>>(() => dataTableStyles({\n outlined,\n rounded,\n dense,\n striped,\n}));\n</script>\n\n<template>\n <div\n :class=\"ui.wrapper()\"\n data-id=\"table-wrapper\"\n >\n <RuiTablePagination\n v-if=\"paginationData && !hideDefaultHeader\"\n v-model=\"paginationData\"\n :dense=\"dense\"\n :loading=\"loading\"\n :disable-per-page=\"disablePerPage\"\n :ranges-threshold=\"rangesThreshold\"\n data-id=\"table-pagination\"\n @update:model-value=\"onPaginate()\"\n />\n <div\n ref=\"tableScroller\"\n :class=\"ui.scroller()\"\n data-id=\"table-scroller\"\n >\n <table\n ref=\"table\"\n :class=\"ui.table()\"\n :aria-busy=\"loading\"\n >\n <RuiTableHead\n :loading=\"loading\"\n :indeterminate=\"indeterminate\"\n :capitalize-headers=\"!cols\"\n :colspan=\"colspan\"\n :column-attr=\"columnAttr\"\n :columns=\"columns\"\n :dense=\"dense\"\n :disable-check-all=\"!filtered?.length\"\n :is-all-selected=\"isAllSelected\"\n :no-data=\"noData\"\n :selectable=\"!!selectedData\"\n :sort-data=\"sortData\"\n :sorted-map=\"sortedMap\"\n :stick=\"stick\"\n :sticky-header=\"stickyHeader\"\n @sort=\"onSort($event)\"\n @select:all=\"onToggleAll($event)\"\n >\n <template\n v-for=\"headerSlot in headerSlots\"\n #[headerSlot]=\"slotData\"\n >\n <slot\n :name=\"headerSlot\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiTableHead>\n <RuiTableHead\n v-if=\"stickyHeader\"\n :loading=\"loading\"\n :capitalize-headers=\"!cols\"\n :colspan=\"colspan\"\n :column-attr=\"columnAttr\"\n :columns=\"columns\"\n :dense=\"dense\"\n :no-data=\"noData\"\n :selectable=\"!!selectedData\"\n :sort-data=\"sortData\"\n :sorted-map=\"sortedMap\"\n data-id=\"head-clone\"\n class=\"opacity-0 invisible\"\n >\n <template\n v-for=\"headerSlot in headerSlots\"\n #[headerSlot]=\"slotData\"\n >\n <slot\n :name=\"headerSlot\"\n v-bind=\"slotData\"\n />\n </template>\n </RuiTableHead>\n <tbody :class=\"ui.tbody()\">\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n v-if=\"slots['body.prepend']\"\n :colspan=\"colspan\"\n name=\"body.prepend\"\n />\n <template v-for=\"(row, index) in filtered\">\n <tr\n v-if=\"!isRow(row)\"\n :key=\"`row-${index}`\"\n :class=\"[ui.tr({ rowVariant: 'group' })]\"\n data-id=\"row-group\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"group.header\"\n :colspan=\"colspan\"\n :header=\"row\"\n :is-open=\"isExpandedGroup(row.group)\"\n :toggle=\"() => onToggleExpandGroup(row.group, row.identifier)\"\n >\n <td\n :class=\"[ui.td()]\"\n class=\"!p-2\"\n :colspan=\"colspan\"\n >\n <div class=\"flex items-center gap-2\">\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === 'start'\"\n :expanded=\"isExpandedGroup(row.group)\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n :group-key=\"groupKey\"\n name=\"group.header.content\"\n :header=\"row\"\n >\n <span>{{ groupKey }}: {{ row.identifier }}</span>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-copy-button\"\n @click=\"onCopyGroup({ key: groupKey, value: row.group })\"\n >\n <RuiIcon\n name=\"lu-copy\"\n size=\"16\"\n />\n </RuiButton>\n </slot>\n <RuiTooltip\n :options=\"{ placement: 'top' }\"\n class=\"ml-auto mr-2\"\n >\n <template #activator>\n <RuiButton\n size=\"sm\"\n variant=\"text\"\n icon\n data-id=\"group-ungroup-button\"\n @click=\"onUngroup()\"\n >\n <RuiIcon\n name=\"lu-trash-2\"\n size=\"14\"\n />\n </RuiButton>\n </template>\n Ungroup\n </RuiTooltip>\n <RuiExpandButton\n v-if=\"groupExpandButtonPosition === 'end'\"\n :expanded=\"isExpandedGroup(row.group)\"\n @click=\"onToggleExpandGroup(row.group, row.identifier)\"\n />\n </div>\n </td>\n </slot>\n </tr>\n <template v-else>\n <tr\n :key=\"`row-${index}`\"\n :class=\"[\n ui.tr({ rowVariant: isSelected(row[rowAttr]) ? 'selected' : undefined }),\n typeof itemClass === 'string' ? itemClass : itemClass(row),\n ]\"\n :aria-selected=\"selectedData ? isSelected(row[rowAttr]) : undefined\"\n data-id=\"row\"\n >\n <td\n v-if=\"selectedData\"\n :class=\"ui.checkbox()\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :data-id=\"`table-toggle-check-${index}`\"\n :model-value=\"isSelected(row[rowAttr])\"\n :disabled=\"isDisabledRow(row[rowAttr])\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n class=\"select-none\"\n hide-details\n @update:model-value=\"onSelect($event, row[rowAttr], true)\"\n @click=\"onCheckboxClick($event, row[rowAttr], index)\"\n />\n </td>\n\n <td\n v-for=\"(column, subIndex) in columns\"\n :key=\"subIndex\"\n :class=\"[\n ui.td({ class: getAlignClass(column.align) }),\n column.cellClass,\n ]\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n >\n <slot\n v-if=\"column.key === 'expand'\"\n :name=\"`item.${column.key.toString()}`\"\n :column=\"column\"\n :row=\"row\"\n :index=\"index\"\n >\n <RuiExpandButton\n v-if=\"!slots['item.expand']\"\n :expanded=\"isExpanded(row[rowAttr])\"\n @click=\"onToggleExpand(row)\"\n />\n </slot>\n <slot\n v-else\n :column=\"column\"\n :index=\"index\"\n :name=\"`item.${column.key.toString()}`\"\n :row=\"row\"\n >\n {{ cellValue(row, column.key) }}\n </slot>\n </td>\n </tr>\n\n <tr\n v-if=\"expandable && !!$slots['expanded-item'] && isExpanded(row[rowAttr])\"\n :key=\"`row-expand-${index}`\"\n :class=\"ui.tr({ rowVariant: 'expandable' })\"\n data-id=\"row-expanded\"\n >\n <td\n :colspan=\"colspan\"\n :class=\"[ui.td()]\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n name=\"expanded-item\"\n :row=\"row\"\n :index=\"index\"\n />\n </td>\n </tr>\n </template>\n </template>\n <tr v-if=\"loading && noData\">\n <td\n :class=\"ui.tbodyLoader()\"\n :colspan=\"colspan\"\n data-id=\"tbody-loader\"\n >\n <div :class=\"ui.tbodyLoaderContent()\">\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n circular\n />\n </div>\n </td>\n </tr>\n <tr\n v-if=\"noData && empty && !loading\"\n :class=\"ui.tr({ rowVariant: 'empty' })\"\n data-id=\"row-empty\"\n >\n <Transition\n appear\n enter-active-class=\"transition ease-out duration-200 delay-200\"\n enter-from-class=\"opacity-0 translate-y-1\"\n enter-to-class=\"opacity-100 translate-y-0\"\n leave-active-class=\"transition ease-in duration-150\"\n leave-from-class=\"opacity-100 translate-y-0\"\n leave-to-class=\"opacity-0 translate-y-1\"\n >\n <td\n :class=\"ui.td()\"\n :colspan=\"colspan\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot name=\"no-data\">\n <RuiTableEmptyState\n :label=\"empty.label\"\n :description=\"empty.description\"\n >\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <template\n v-if=\"slots['empty-description']\"\n #description\n >\n <slot name=\"empty-description\" />\n </template>\n </RuiTableEmptyState>\n </slot>\n </td>\n </Transition>\n </tr>\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot\n v-if=\"slots['body.append']\"\n :colspan=\"colspan\"\n name=\"body.append\"\n />\n </tbody>\n <tfoot>\n <!-- eslint-disable-next-line vue/require-explicit-slots -- defined via Partial<Record<...>> in defineSlots -->\n <slot name=\"tfoot\" />\n </tfoot>\n </table>\n </div>\n <RuiTablePagination\n v-if=\"paginationData && !hideDefaultFooter\"\n v-model=\"paginationData\"\n :dense=\"dense\"\n :loading=\"loading\"\n :disable-per-page=\"disablePerPage\"\n :ranges-threshold=\"rangesThreshold\"\n data-id=\"table-pagination\"\n @update:model-value=\"onPaginate()\"\n />\n </div>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTableHead.js","names":[],"sources":["../../../src/components/tables/RuiTableHead.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, K extends keyof T = keyof T\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiBadge from '@/components/overlays/badge/RuiBadge.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { getAlignClass, getSortButtonAlignClass, SortDirection, TableAlign } from '@/components/tables/table-props';\nimport { tv } from '@/utils/tv';\n\n/**\n * Represents a sortable column name for a given type.\n * The column name must be a key of the passed data object type.\n * @template T - The type of the data in the column.\n */\nexport type TableRowKey<T> = keyof T extends string ? keyof T : never;\n\nexport interface BaseTableColumn<T> {\n key: TableRowKey<T> | string;\n sortable?: boolean;\n direction?: SortDirection;\n align?: TableAlign;\n class?: string;\n cellClass?: string;\n colspan?: string | number;\n rowspan?: string | number;\n\n [key: string]: any;\n}\n\n/**\n * Represents a sortable table column.\n * This is used to ensure that when using sortable with a true value,\n * the key matches to an actual property of the object passed.\n *\n * @template T - The type of data in the table column.\n */\nexport interface SortableTableColumn<T> extends BaseTableColumn<T> {\n sortable: true;\n}\n\n/**\n * An interface representing a column in a table that cannot be sorted.\n * This can be mapped to an actual property of the object or to a virtual column.\n *\n * @typeparam T - The type of data in the table.\n */\nexport interface NoneSortableTableColumn<T> extends BaseTableColumn<T> {\n sortable?: false;\n}\n\nexport type TableColumn<T> = SortableTableColumn<T> | NoneSortableTableColumn<T>;\n\nexport interface SortColumn<T> {\n column?: TableRowKey<T>;\n direction: SortDirection;\n}\n\nexport type TableSortData<T> = SortColumn<T> | SortColumn<T>[] | undefined;\n\nexport type TableRowKeyData<T> = TableRowKey<T> | TableRowKey<T>[] | undefined;\n\nexport interface GroupData<T> {\n key: string;\n value?: Partial<T>;\n}\n\nexport type GroupKey<T> = TableColumn<T>['key'];\n\nexport type GroupKeys<T> = GroupKey<T> | GroupKey<T>[] | undefined;\n\nexport interface Props<T> {\n loading?: boolean;\n stickyHeader?: boolean;\n stick?: boolean;\n selectable?: boolean;\n disableCheckAll?: boolean;\n noData?: boolean;\n colspan?: number;\n columns?: TableColumn<T>[];\n capitalizeHeaders?: boolean;\n isAllSelected?: boolean;\n indeterminate?: boolean;\n dense?: boolean;\n sortedMap?: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n sortData?: TableSortData<T>;\n columnAttr?: keyof TableColumn<T>;\n dataId?: string;\n}\n\nconst {\n loading = false,\n stickyHeader = false,\n stick = false,\n selectable = false,\n disableCheckAll = false,\n colspan = 0,\n columns,\n capitalizeHeaders = false,\n isAllSelected = false,\n indeterminate = false,\n dense = false,\n sortedMap = {} as Partial<Record<TableRowKey<T>, SortColumn<T>>>,\n columnAttr = 'label',\n sortData,\n dataId = 'head-main',\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'select:all': [value: boolean];\n 'sort': [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst tableHeadStyles = tv({\n slots: {\n thead: 'divide-y divide-black/[0.12] dark:divide-white/[0.12]',\n checkbox: 'px-2 w-[3.625rem] max-w-[3.625rem] [&_label]:ml-0',\n th: 'p-4',\n columnText: 'text-rui-text dark:text-white font-medium text-sm leading-6',\n sortButton: 'inline-flex group/sort',\n sortIcon: 'transition opacity-0 rotate-180 group-hover/sort:opacity-60',\n loaderRow: 'border-none',\n progress: 'p-0 h-0',\n progressWrapper: 'h-0 -mt-1',\n },\n variants: {\n position: {\n default: {},\n sticky: { thead: 'top-0 z-10 absolute' },\n fixed: {\n thead: 'top-0 z-10 fixed',\n th: 'bg-white dark:bg-[#121212] border-b border-b-black/[0.12] dark:border-b-white/[0.12]',\n },\n },\n dense: {\n true: { th: 'py-[0.38rem]' },\n },\n },\n defaultVariants: {\n position: 'default',\n },\n});\n\nconst headerPosition = computed<'default' | 'sticky' | 'fixed'>(() => {\n if (stickyHeader && stick)\n return 'fixed';\n if (stickyHeader)\n return 'sticky';\n return 'default';\n});\n\nconst ui = computed<ReturnType<typeof tableHeadStyles>>(() => tableHeadStyles({\n position: get(headerPosition),\n dense,\n}));\n\nfunction getSortIconClass(key: TableColumn<T>['key']): string | undefined {\n if (!isSortedBy(key))\n return undefined;\n const direction = getSortDirection(key);\n return `!opacity-100 ${direction === SortDirection.asc ? '!rotate-180' : '!rotate-0'}`;\n}\n\nfunction onSort({ key, direction }: TableColumn<T>): void {\n return emit('sort', {\n key: key as TableRowKey<T>,\n direction: direction ?? SortDirection.asc,\n });\n}\n\nfunction onToggleAll(checked: boolean) {\n return emit('select:all', checked);\n}\n\nfunction isSortedBy(key: TableColumn<T>['key']): boolean {\n return key in sortedMap;\n}\n\nfunction getSortIndex(key: TableColumn<T>['key']): number {\n if (!sortData || !Array.isArray(sortData) || !isSortedBy(key))\n return -1;\n\n return sortData.findIndex(sort => sort.column === key);\n}\n\nfunction getSortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key]?.direction;\n}\n</script>\n\n<template>\n <thead\n :data-id=\"dataId\"\n :class=\"ui.thead()\"\n >\n <tr>\n <th\n v-if=\"selectable\"\n :class=\"ui.checkbox()\"\n scope=\"col\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :disabled=\"disableCheckAll\"\n :indeterminate=\"indeterminate\"\n :model-value=\"isAllSelected\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n data-id=\"table-toggle-check-all\"\n hide-details\n @update:model-value=\"onToggleAll($event)\"\n />\n </th>\n\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"[\n ui.th({ class: getAlignClass(column.align, column.sortable) }),\n column.class,\n { capitalize: !capitalizeHeaders },\n ]\"\n scope=\"col\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n :data-id=\"column.sortable ? 'column-sortable' : undefined\"\n >\n <slot\n :column=\"column\"\n :name=\"`header.${column.key.toString()}`\"\n >\n <RuiBadge\n v-if=\"column.sortable\"\n :model-value=\"getSortIndex(column.key) >= 0\"\n :text=\"`${getSortIndex(column.key) + 1}`\"\n :offset-y=\"dense ? 8 : 0\"\n color=\"secondary\"\n size=\"sm\"\n >\n <RuiButton\n :class=\"ui.sortButton({ class: getSortButtonAlignClass(column.align) })\"\n :data-sorted=\"isSortedBy(column.key) || undefined\"\n :data-direction=\"getSortDirection(column.key)\"\n size=\"sm\"\n variant=\"text\"\n @click=\"onSort(column)\"\n >\n <span\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n\n <template\n v-if=\"column.align === TableAlign.end\"\n #prepend\n >\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n name=\"lu-arrow-down\"\n size=\"18\"\n />\n </template>\n\n <template #append>\n <RuiIcon\n v-if=\"column.align !== TableAlign.end\"\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n name=\"lu-arrow-down\"\n size=\"18\"\n />\n </template>\n </RuiButton>\n </RuiBadge>\n <span\n v-else\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n </slot>\n </th>\n </tr>\n <tr\n v-if=\"loading\"\n :class=\"ui.loaderRow()\"\n data-id=\"thead-loader\"\n >\n <th\n :class=\"ui.progress()\"\n :colspan=\"colspan\"\n scope=\"col\"\n >\n <div :class=\"ui.progressWrapper()\">\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n />\n </div>\n </th>\n </tr>\n </thead>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiTableHead.js","names":[],"sources":["../../../src/components/tables/RuiTableHead.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, K extends keyof T = keyof T\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiBadge from '@/components/overlays/badge/RuiBadge.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { getAlignClass, getSortButtonAlignClass, SortDirection, TableAlign } from '@/components/tables/table-props';\nimport { tv } from '@/utils/tv';\n\n/**\n * Represents a sortable column name for a given type.\n * The column name must be a key of the passed data object type.\n * @template T - The type of the data in the column.\n */\nexport type TableRowKey<T> = keyof T extends string ? keyof T : never;\n\nexport interface BaseTableColumn<T> {\n key: TableRowKey<T> | string;\n sortable?: boolean;\n direction?: SortDirection;\n align?: TableAlign;\n class?: string;\n cellClass?: string;\n colspan?: string | number;\n rowspan?: string | number;\n\n [key: string]: any;\n}\n\n/**\n * Represents a sortable table column.\n * This is used to ensure that when using sortable with a true value,\n * the key matches to an actual property of the object passed.\n *\n * @template T - The type of data in the table column.\n */\nexport interface SortableTableColumn<T> extends BaseTableColumn<T> {\n sortable: true;\n}\n\n/**\n * An interface representing a column in a table that cannot be sorted.\n * This can be mapped to an actual property of the object or to a virtual column.\n *\n * @typeparam T - The type of data in the table.\n */\nexport interface NoneSortableTableColumn<T> extends BaseTableColumn<T> {\n sortable?: false;\n}\n\nexport type TableColumn<T> = SortableTableColumn<T> | NoneSortableTableColumn<T>;\n\nexport interface SortColumn<T> {\n column?: TableRowKey<T>;\n direction: SortDirection;\n}\n\nexport type TableSortData<T> = SortColumn<T> | SortColumn<T>[] | undefined;\n\nexport type TableRowKeyData<T> = TableRowKey<T> | TableRowKey<T>[] | undefined;\n\nexport interface GroupData<T> {\n key: string;\n value?: Partial<T>;\n}\n\nexport type GroupKey<T> = TableColumn<T>['key'];\n\nexport type GroupKeys<T> = GroupKey<T> | GroupKey<T>[] | undefined;\n\nexport interface Props<T> {\n loading?: boolean;\n stickyHeader?: boolean;\n stick?: boolean;\n selectable?: boolean;\n disableCheckAll?: boolean;\n noData?: boolean;\n colspan?: number;\n columns?: TableColumn<T>[];\n capitalizeHeaders?: boolean;\n isAllSelected?: boolean;\n indeterminate?: boolean;\n dense?: boolean;\n sortedMap?: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n sortData?: TableSortData<T>;\n columnAttr?: keyof TableColumn<T>;\n dataId?: string;\n}\n\nconst {\n loading = false,\n stickyHeader = false,\n stick = false,\n selectable = false,\n disableCheckAll = false,\n colspan = 0,\n columns,\n capitalizeHeaders = false,\n isAllSelected = false,\n indeterminate = false,\n dense = false,\n sortedMap = {} as Partial<Record<TableRowKey<T>, SortColumn<T>>>,\n columnAttr = 'label',\n sortData,\n dataId = 'head-main',\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'select:all': [value: boolean];\n 'sort': [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst tableHeadStyles = tv({\n slots: {\n thead: 'divide-y divide-black/[0.12] dark:divide-white/[0.12]',\n checkbox: 'px-2 w-[3.625rem] max-w-[3.625rem] [&_label]:ml-0',\n th: 'p-4',\n columnText: 'text-rui-text dark:text-white font-medium text-[0.875rem] leading-6',\n sortButton: 'inline-flex group/sort',\n sortIcon: 'transition opacity-0 rotate-180 group-hover/sort:opacity-60',\n loaderRow: 'border-none',\n progress: 'p-0 h-0',\n progressWrapper: 'h-0 -mt-1',\n },\n variants: {\n position: {\n default: {},\n sticky: { thead: 'top-0 z-10 absolute' },\n fixed: {\n thead: 'top-0 z-10 fixed',\n th: 'bg-white dark:bg-[#121212] border-b border-b-black/[0.12] dark:border-b-white/[0.12]',\n },\n },\n dense: {\n true: { th: 'py-[0.38rem]' },\n },\n },\n defaultVariants: {\n position: 'default',\n },\n});\n\nconst headerPosition = computed<'default' | 'sticky' | 'fixed'>(() => {\n if (stickyHeader && stick)\n return 'fixed';\n if (stickyHeader)\n return 'sticky';\n return 'default';\n});\n\nconst ui = computed<ReturnType<typeof tableHeadStyles>>(() => tableHeadStyles({\n position: get(headerPosition),\n dense,\n}));\n\nfunction getSortIconClass(key: TableColumn<T>['key']): string | undefined {\n if (!isSortedBy(key))\n return undefined;\n const direction = getSortDirection(key);\n return `!opacity-100 ${direction === SortDirection.asc ? '!rotate-180' : '!rotate-0'}`;\n}\n\nfunction onSort({ key, direction }: TableColumn<T>): void {\n return emit('sort', {\n key: key as TableRowKey<T>,\n direction: direction ?? SortDirection.asc,\n });\n}\n\nfunction onToggleAll(checked: boolean) {\n return emit('select:all', checked);\n}\n\nfunction isSortedBy(key: TableColumn<T>['key']): boolean {\n return key in sortedMap;\n}\n\nfunction getSortIndex(key: TableColumn<T>['key']): number {\n if (!sortData || !Array.isArray(sortData) || !isSortedBy(key))\n return -1;\n\n return sortData.findIndex(sort => sort.column === key);\n}\n\nfunction getSortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key]?.direction;\n}\n</script>\n\n<template>\n <thead\n :data-id=\"dataId\"\n :class=\"ui.thead()\"\n >\n <tr>\n <th\n v-if=\"selectable\"\n :class=\"ui.checkbox()\"\n scope=\"col\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :disabled=\"disableCheckAll\"\n :indeterminate=\"indeterminate\"\n :model-value=\"isAllSelected\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n data-id=\"table-toggle-check-all\"\n hide-details\n @update:model-value=\"onToggleAll($event)\"\n />\n </th>\n\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"[\n ui.th({ class: getAlignClass(column.align, column.sortable) }),\n column.class,\n { capitalize: !capitalizeHeaders },\n ]\"\n scope=\"col\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n :data-id=\"column.sortable ? 'column-sortable' : undefined\"\n >\n <slot\n :column=\"column\"\n :name=\"`header.${column.key.toString()}`\"\n >\n <RuiBadge\n v-if=\"column.sortable\"\n :model-value=\"getSortIndex(column.key) >= 0\"\n :text=\"`${getSortIndex(column.key) + 1}`\"\n :offset-y=\"dense ? 8 : 0\"\n color=\"secondary\"\n size=\"sm\"\n >\n <RuiButton\n :class=\"ui.sortButton({ class: getSortButtonAlignClass(column.align) })\"\n :data-sorted=\"isSortedBy(column.key) || undefined\"\n :data-direction=\"getSortDirection(column.key)\"\n size=\"sm\"\n variant=\"text\"\n @click=\"onSort(column)\"\n >\n <span\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n\n <template\n v-if=\"column.align === TableAlign.end\"\n #prepend\n >\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n name=\"lu-arrow-down\"\n size=\"18\"\n />\n </template>\n\n <template #append>\n <RuiIcon\n v-if=\"column.align !== TableAlign.end\"\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n name=\"lu-arrow-down\"\n size=\"18\"\n />\n </template>\n </RuiButton>\n </RuiBadge>\n <span\n v-else\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n </slot>\n </th>\n </tr>\n <tr\n v-if=\"loading\"\n :class=\"ui.loaderRow()\"\n data-id=\"thead-loader\"\n >\n <th\n :class=\"ui.progress()\"\n :colspan=\"colspan\"\n scope=\"col\"\n >\n <div :class=\"ui.progressWrapper()\">\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n />\n </div>\n </th>\n </tr>\n </thead>\n</template>\n"],"mappings":""}
@@ -70,7 +70,7 @@ var RuiTableHead_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
70
70
  thead: "divide-y divide-black/[0.12] dark:divide-white/[0.12]",
71
71
  checkbox: "px-2 w-[3.625rem] max-w-[3.625rem] [&_label]:ml-0",
72
72
  th: "p-4",
73
- columnText: "text-rui-text dark:text-white font-medium text-sm leading-6",
73
+ columnText: "text-rui-text dark:text-white font-medium text-[0.875rem] leading-6",
74
74
  sortButton: "inline-flex group/sort",
75
75
  sortIcon: "transition opacity-0 rotate-180 group-hover/sort:opacity-60",
76
76
  loaderRow: "border-none",
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTableHead.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tables/RuiTableHead.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, K extends keyof T = keyof T\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiBadge from '@/components/overlays/badge/RuiBadge.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { getAlignClass, getSortButtonAlignClass, SortDirection, TableAlign } from '@/components/tables/table-props';\nimport { tv } from '@/utils/tv';\n\n/**\n * Represents a sortable column name for a given type.\n * The column name must be a key of the passed data object type.\n * @template T - The type of the data in the column.\n */\nexport type TableRowKey<T> = keyof T extends string ? keyof T : never;\n\nexport interface BaseTableColumn<T> {\n key: TableRowKey<T> | string;\n sortable?: boolean;\n direction?: SortDirection;\n align?: TableAlign;\n class?: string;\n cellClass?: string;\n colspan?: string | number;\n rowspan?: string | number;\n\n [key: string]: any;\n}\n\n/**\n * Represents a sortable table column.\n * This is used to ensure that when using sortable with a true value,\n * the key matches to an actual property of the object passed.\n *\n * @template T - The type of data in the table column.\n */\nexport interface SortableTableColumn<T> extends BaseTableColumn<T> {\n sortable: true;\n}\n\n/**\n * An interface representing a column in a table that cannot be sorted.\n * This can be mapped to an actual property of the object or to a virtual column.\n *\n * @typeparam T - The type of data in the table.\n */\nexport interface NoneSortableTableColumn<T> extends BaseTableColumn<T> {\n sortable?: false;\n}\n\nexport type TableColumn<T> = SortableTableColumn<T> | NoneSortableTableColumn<T>;\n\nexport interface SortColumn<T> {\n column?: TableRowKey<T>;\n direction: SortDirection;\n}\n\nexport type TableSortData<T> = SortColumn<T> | SortColumn<T>[] | undefined;\n\nexport type TableRowKeyData<T> = TableRowKey<T> | TableRowKey<T>[] | undefined;\n\nexport interface GroupData<T> {\n key: string;\n value?: Partial<T>;\n}\n\nexport type GroupKey<T> = TableColumn<T>['key'];\n\nexport type GroupKeys<T> = GroupKey<T> | GroupKey<T>[] | undefined;\n\nexport interface Props<T> {\n loading?: boolean;\n stickyHeader?: boolean;\n stick?: boolean;\n selectable?: boolean;\n disableCheckAll?: boolean;\n noData?: boolean;\n colspan?: number;\n columns?: TableColumn<T>[];\n capitalizeHeaders?: boolean;\n isAllSelected?: boolean;\n indeterminate?: boolean;\n dense?: boolean;\n sortedMap?: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n sortData?: TableSortData<T>;\n columnAttr?: keyof TableColumn<T>;\n dataId?: string;\n}\n\nconst {\n loading = false,\n stickyHeader = false,\n stick = false,\n selectable = false,\n disableCheckAll = false,\n colspan = 0,\n columns,\n capitalizeHeaders = false,\n isAllSelected = false,\n indeterminate = false,\n dense = false,\n sortedMap = {} as Partial<Record<TableRowKey<T>, SortColumn<T>>>,\n columnAttr = 'label',\n sortData,\n dataId = 'head-main',\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'select:all': [value: boolean];\n 'sort': [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst tableHeadStyles = tv({\n slots: {\n thead: 'divide-y divide-black/[0.12] dark:divide-white/[0.12]',\n checkbox: 'px-2 w-[3.625rem] max-w-[3.625rem] [&_label]:ml-0',\n th: 'p-4',\n columnText: 'text-rui-text dark:text-white font-medium text-sm leading-6',\n sortButton: 'inline-flex group/sort',\n sortIcon: 'transition opacity-0 rotate-180 group-hover/sort:opacity-60',\n loaderRow: 'border-none',\n progress: 'p-0 h-0',\n progressWrapper: 'h-0 -mt-1',\n },\n variants: {\n position: {\n default: {},\n sticky: { thead: 'top-0 z-10 absolute' },\n fixed: {\n thead: 'top-0 z-10 fixed',\n th: 'bg-white dark:bg-[#121212] border-b border-b-black/[0.12] dark:border-b-white/[0.12]',\n },\n },\n dense: {\n true: { th: 'py-[0.38rem]' },\n },\n },\n defaultVariants: {\n position: 'default',\n },\n});\n\nconst headerPosition = computed<'default' | 'sticky' | 'fixed'>(() => {\n if (stickyHeader && stick)\n return 'fixed';\n if (stickyHeader)\n return 'sticky';\n return 'default';\n});\n\nconst ui = computed<ReturnType<typeof tableHeadStyles>>(() => tableHeadStyles({\n position: get(headerPosition),\n dense,\n}));\n\nfunction getSortIconClass(key: TableColumn<T>['key']): string | undefined {\n if (!isSortedBy(key))\n return undefined;\n const direction = getSortDirection(key);\n return `!opacity-100 ${direction === SortDirection.asc ? '!rotate-180' : '!rotate-0'}`;\n}\n\nfunction onSort({ key, direction }: TableColumn<T>): void {\n return emit('sort', {\n key: key as TableRowKey<T>,\n direction: direction ?? SortDirection.asc,\n });\n}\n\nfunction onToggleAll(checked: boolean) {\n return emit('select:all', checked);\n}\n\nfunction isSortedBy(key: TableColumn<T>['key']): boolean {\n return key in sortedMap;\n}\n\nfunction getSortIndex(key: TableColumn<T>['key']): number {\n if (!sortData || !Array.isArray(sortData) || !isSortedBy(key))\n return -1;\n\n return sortData.findIndex(sort => sort.column === key);\n}\n\nfunction getSortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key]?.direction;\n}\n</script>\n\n<template>\n <thead\n :data-id=\"dataId\"\n :class=\"ui.thead()\"\n >\n <tr>\n <th\n v-if=\"selectable\"\n :class=\"ui.checkbox()\"\n scope=\"col\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :disabled=\"disableCheckAll\"\n :indeterminate=\"indeterminate\"\n :model-value=\"isAllSelected\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n data-id=\"table-toggle-check-all\"\n hide-details\n @update:model-value=\"onToggleAll($event)\"\n />\n </th>\n\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"[\n ui.th({ class: getAlignClass(column.align, column.sortable) }),\n column.class,\n { capitalize: !capitalizeHeaders },\n ]\"\n scope=\"col\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n :data-id=\"column.sortable ? 'column-sortable' : undefined\"\n >\n <slot\n :column=\"column\"\n :name=\"`header.${column.key.toString()}`\"\n >\n <RuiBadge\n v-if=\"column.sortable\"\n :model-value=\"getSortIndex(column.key) >= 0\"\n :text=\"`${getSortIndex(column.key) + 1}`\"\n :offset-y=\"dense ? 8 : 0\"\n color=\"secondary\"\n size=\"sm\"\n >\n <RuiButton\n :class=\"ui.sortButton({ class: getSortButtonAlignClass(column.align) })\"\n :data-sorted=\"isSortedBy(column.key) || undefined\"\n :data-direction=\"getSortDirection(column.key)\"\n size=\"sm\"\n variant=\"text\"\n @click=\"onSort(column)\"\n >\n <span\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n\n <template\n v-if=\"column.align === TableAlign.end\"\n #prepend\n >\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n name=\"lu-arrow-down\"\n size=\"18\"\n />\n </template>\n\n <template #append>\n <RuiIcon\n v-if=\"column.align !== TableAlign.end\"\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n name=\"lu-arrow-down\"\n size=\"18\"\n />\n </template>\n </RuiButton>\n </RuiBadge>\n <span\n v-else\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n </slot>\n </th>\n </tr>\n <tr\n v-if=\"loading\"\n :class=\"ui.loaderRow()\"\n data-id=\"thead-loader\"\n >\n <th\n :class=\"ui.progress()\"\n :colspan=\"colspan\"\n scope=\"col\"\n >\n <div :class=\"ui.progressWrapper()\">\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n />\n </div>\n </th>\n </tr>\n </thead>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"RuiTableHead.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/tables/RuiTableHead.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends object, K extends keyof T = keyof T\">\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCheckbox from '@/components/forms/checkbox/RuiCheckbox.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiBadge from '@/components/overlays/badge/RuiBadge.vue';\nimport RuiProgress from '@/components/progress/RuiProgress.vue';\nimport { getAlignClass, getSortButtonAlignClass, SortDirection, TableAlign } from '@/components/tables/table-props';\nimport { tv } from '@/utils/tv';\n\n/**\n * Represents a sortable column name for a given type.\n * The column name must be a key of the passed data object type.\n * @template T - The type of the data in the column.\n */\nexport type TableRowKey<T> = keyof T extends string ? keyof T : never;\n\nexport interface BaseTableColumn<T> {\n key: TableRowKey<T> | string;\n sortable?: boolean;\n direction?: SortDirection;\n align?: TableAlign;\n class?: string;\n cellClass?: string;\n colspan?: string | number;\n rowspan?: string | number;\n\n [key: string]: any;\n}\n\n/**\n * Represents a sortable table column.\n * This is used to ensure that when using sortable with a true value,\n * the key matches to an actual property of the object passed.\n *\n * @template T - The type of data in the table column.\n */\nexport interface SortableTableColumn<T> extends BaseTableColumn<T> {\n sortable: true;\n}\n\n/**\n * An interface representing a column in a table that cannot be sorted.\n * This can be mapped to an actual property of the object or to a virtual column.\n *\n * @typeparam T - The type of data in the table.\n */\nexport interface NoneSortableTableColumn<T> extends BaseTableColumn<T> {\n sortable?: false;\n}\n\nexport type TableColumn<T> = SortableTableColumn<T> | NoneSortableTableColumn<T>;\n\nexport interface SortColumn<T> {\n column?: TableRowKey<T>;\n direction: SortDirection;\n}\n\nexport type TableSortData<T> = SortColumn<T> | SortColumn<T>[] | undefined;\n\nexport type TableRowKeyData<T> = TableRowKey<T> | TableRowKey<T>[] | undefined;\n\nexport interface GroupData<T> {\n key: string;\n value?: Partial<T>;\n}\n\nexport type GroupKey<T> = TableColumn<T>['key'];\n\nexport type GroupKeys<T> = GroupKey<T> | GroupKey<T>[] | undefined;\n\nexport interface Props<T> {\n loading?: boolean;\n stickyHeader?: boolean;\n stick?: boolean;\n selectable?: boolean;\n disableCheckAll?: boolean;\n noData?: boolean;\n colspan?: number;\n columns?: TableColumn<T>[];\n capitalizeHeaders?: boolean;\n isAllSelected?: boolean;\n indeterminate?: boolean;\n dense?: boolean;\n sortedMap?: Partial<Record<TableRowKey<T>, SortColumn<T>>>;\n sortData?: TableSortData<T>;\n columnAttr?: keyof TableColumn<T>;\n dataId?: string;\n}\n\nconst {\n loading = false,\n stickyHeader = false,\n stick = false,\n selectable = false,\n disableCheckAll = false,\n colspan = 0,\n columns,\n capitalizeHeaders = false,\n isAllSelected = false,\n indeterminate = false,\n dense = false,\n sortedMap = {} as Partial<Record<TableRowKey<T>, SortColumn<T>>>,\n columnAttr = 'label',\n sortData,\n dataId = 'head-main',\n} = defineProps<Props<T>>();\n\nconst emit = defineEmits<{\n 'select:all': [value: boolean];\n 'sort': [value: { key: TableRowKey<T>; direction?: SortDirection }];\n}>();\n\nconst tableHeadStyles = tv({\n slots: {\n thead: 'divide-y divide-black/[0.12] dark:divide-white/[0.12]',\n checkbox: 'px-2 w-[3.625rem] max-w-[3.625rem] [&_label]:ml-0',\n th: 'p-4',\n columnText: 'text-rui-text dark:text-white font-medium text-[0.875rem] leading-6',\n sortButton: 'inline-flex group/sort',\n sortIcon: 'transition opacity-0 rotate-180 group-hover/sort:opacity-60',\n loaderRow: 'border-none',\n progress: 'p-0 h-0',\n progressWrapper: 'h-0 -mt-1',\n },\n variants: {\n position: {\n default: {},\n sticky: { thead: 'top-0 z-10 absolute' },\n fixed: {\n thead: 'top-0 z-10 fixed',\n th: 'bg-white dark:bg-[#121212] border-b border-b-black/[0.12] dark:border-b-white/[0.12]',\n },\n },\n dense: {\n true: { th: 'py-[0.38rem]' },\n },\n },\n defaultVariants: {\n position: 'default',\n },\n});\n\nconst headerPosition = computed<'default' | 'sticky' | 'fixed'>(() => {\n if (stickyHeader && stick)\n return 'fixed';\n if (stickyHeader)\n return 'sticky';\n return 'default';\n});\n\nconst ui = computed<ReturnType<typeof tableHeadStyles>>(() => tableHeadStyles({\n position: get(headerPosition),\n dense,\n}));\n\nfunction getSortIconClass(key: TableColumn<T>['key']): string | undefined {\n if (!isSortedBy(key))\n return undefined;\n const direction = getSortDirection(key);\n return `!opacity-100 ${direction === SortDirection.asc ? '!rotate-180' : '!rotate-0'}`;\n}\n\nfunction onSort({ key, direction }: TableColumn<T>): void {\n return emit('sort', {\n key: key as TableRowKey<T>,\n direction: direction ?? SortDirection.asc,\n });\n}\n\nfunction onToggleAll(checked: boolean) {\n return emit('select:all', checked);\n}\n\nfunction isSortedBy(key: TableColumn<T>['key']): boolean {\n return key in sortedMap;\n}\n\nfunction getSortIndex(key: TableColumn<T>['key']): number {\n if (!sortData || !Array.isArray(sortData) || !isSortedBy(key))\n return -1;\n\n return sortData.findIndex(sort => sort.column === key);\n}\n\nfunction getSortDirection(key: TableColumn<T>['key']): SortDirection | undefined {\n return sortedMap[key]?.direction;\n}\n</script>\n\n<template>\n <thead\n :data-id=\"dataId\"\n :class=\"ui.thead()\"\n >\n <tr>\n <th\n v-if=\"selectable\"\n :class=\"ui.checkbox()\"\n scope=\"col\"\n colspan=\"1\"\n rowspan=\"1\"\n >\n <RuiCheckbox\n :disabled=\"disableCheckAll\"\n :indeterminate=\"indeterminate\"\n :model-value=\"isAllSelected\"\n :size=\"dense ? 'sm' : undefined\"\n color=\"primary\"\n data-id=\"table-toggle-check-all\"\n hide-details\n @update:model-value=\"onToggleAll($event)\"\n />\n </th>\n\n <th\n v-for=\"column in columns\"\n :key=\"column.key\"\n :class=\"[\n ui.th({ class: getAlignClass(column.align, column.sortable) }),\n column.class,\n { capitalize: !capitalizeHeaders },\n ]\"\n scope=\"col\"\n :colspan=\"column.colspan ?? 1\"\n :rowspan=\"column.rowspan ?? 1\"\n :data-id=\"column.sortable ? 'column-sortable' : undefined\"\n >\n <slot\n :column=\"column\"\n :name=\"`header.${column.key.toString()}`\"\n >\n <RuiBadge\n v-if=\"column.sortable\"\n :model-value=\"getSortIndex(column.key) >= 0\"\n :text=\"`${getSortIndex(column.key) + 1}`\"\n :offset-y=\"dense ? 8 : 0\"\n color=\"secondary\"\n size=\"sm\"\n >\n <RuiButton\n :class=\"ui.sortButton({ class: getSortButtonAlignClass(column.align) })\"\n :data-sorted=\"isSortedBy(column.key) || undefined\"\n :data-direction=\"getSortDirection(column.key)\"\n size=\"sm\"\n variant=\"text\"\n @click=\"onSort(column)\"\n >\n <span\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n\n <template\n v-if=\"column.align === TableAlign.end\"\n #prepend\n >\n <RuiIcon\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n name=\"lu-arrow-down\"\n size=\"18\"\n />\n </template>\n\n <template #append>\n <RuiIcon\n v-if=\"column.align !== TableAlign.end\"\n :class=\"ui.sortIcon({ class: getSortIconClass(column.key) })\"\n name=\"lu-arrow-down\"\n size=\"18\"\n />\n </template>\n </RuiButton>\n </RuiBadge>\n <span\n v-else\n :class=\"ui.columnText()\"\n data-id=\"column-text\"\n >\n <slot\n :name=\"`header.text.${column.key.toString()}`\"\n :column=\"column\"\n >\n {{ column[columnAttr] }}\n </slot>\n </span>\n </slot>\n </th>\n </tr>\n <tr\n v-if=\"loading\"\n :class=\"ui.loaderRow()\"\n data-id=\"thead-loader\"\n >\n <th\n :class=\"ui.progress()\"\n :colspan=\"colspan\"\n scope=\"col\"\n >\n <div :class=\"ui.progressWrapper()\">\n <RuiProgress\n color=\"primary\"\n variant=\"indeterminate\"\n />\n </div>\n </th>\n </tr>\n </thead>\n</template>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTab.js","names":[],"sources":["../../../../src/components/tabs/tab/RuiTab.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { RouteLocationRaw } from 'vue-router';\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport { TabAlignment, TabIndicatorPosition, TabLayout } from '@/components/tabs/tab-props';\nimport { useTabLink } from '@/components/tabs/tab/use-tab-link';\nimport { tv } from '@/utils/tv';\n\nexport interface RuiTabClassNames {\n root?: VueClassValue;\n active?: VueClassValue;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n disabled?: boolean;\n grow?: boolean;\n value?: number | string;\n active?: boolean;\n classNames?: RuiTabClassNames;\n /** @deprecated Use `classNames.active` instead */\n activeClass?: string;\n link?: boolean;\n target?: string;\n to?: RouteLocationRaw;\n exact?: boolean;\n /** @deprecated No longer used — vue-router's `useLink` handles route matching internally */\n exactPath?: boolean;\n vertical?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n}\n\ndefineOptions({\n name: 'RuiTab',\n inheritAttrs: false,\n});\n\nconst {\n color,\n disabled = false,\n grow = false,\n value = useId(),\n active = false,\n classNames,\n activeClass = '',\n link = false,\n to = '',\n target = '_self',\n exact = false,\n vertical = false,\n align = TabAlignment.center,\n indicatorPosition = TabIndicatorPosition.end,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n click: [value: string | number];\n}>();\n\nconst slots = defineSlots<{\n default?: (props?: object) => any;\n prepend?: (props?: object) => any;\n append?: (props?: object) => any;\n}>();\n\nconst tab = tv({\n base: 'min-w-[5.625rem] max-w-[22.5rem] flex items-center rounded-none cursor-pointer relative whitespace-nowrap shrink-0 !px-4',\n variants: {\n layout: {\n [TabLayout.horizontal]: '',\n [TabLayout.vertical]: '!h-[3rem] w-full max-w-none',\n },\n align: {\n start: 'justify-start text-left rtl:justify-end rtl:text-right',\n center: 'justify-center text-center',\n end: 'justify-end text-right rtl:justify-start rtl:text-left',\n },\n grow: {\n true: 'grow max-w-none',\n },\n disabled: {\n true: 'cursor-not-allowed',\n },\n active: {\n true: '',\n false: '',\n },\n indicatorPosition: {\n start: '',\n end: '',\n },\n },\n compoundVariants: [\n // Horizontal active indicator (bottom/top border)\n { active: true, layout: TabLayout.horizontal, indicatorPosition: 'end', class: `after:content-[''] after:absolute after:border-current after:h-0 after:w-full after:bottom-0 after:left-0 after:border-b-2` },\n { active: true, layout: TabLayout.horizontal, indicatorPosition: 'start', class: `after:content-[''] after:absolute after:border-current after:h-0 after:w-full after:top-0 after:left-0 after:border-b-2` },\n // Vertical active indicator (right/left border)\n { active: true, layout: TabLayout.vertical, indicatorPosition: 'end', class: `after:content-[''] after:absolute after:border-current after:h-full after:w-0 after:right-0 after:left-auto after:border-r-2` },\n { active: true, layout: TabLayout.vertical, indicatorPosition: 'start', class: `after:content-[''] after:absolute after:border-current after:h-full after:w-0 after:left-0 after:right-auto after:border-r-2` },\n ],\n defaultVariants: { layout: TabLayout.horizontal, align: 'center', indicatorPosition: 'end', active: false },\n});\n\nconst { isRouteActive, href: linkHref, navigate, isLink } = useTabLink({\n link: () => link,\n to: () => to,\n exact: () => exact,\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst isSelf = computed<boolean>(() => target === '_self');\nconst isEffectivelyActive = computed<boolean>(() => active || get(isRouteActive));\n\nfunction onClick(event?: MouseEvent): void {\n emit('click', value);\n if (navigate && get(isSelf) && event)\n navigate(event);\n}\n</script>\n\n<template>\n <RuiButton\n :class=\"[\n tab({ layout, align, indicatorPosition, grow, disabled, active: isEffectivelyActive }),\n isEffectivelyActive && (classNames?.active ?? activeClass),\n ]\"\n :data-active-tab=\"isEffectivelyActive || undefined\"\n :data-align=\"align\"\n :data-indicator-position=\"indicatorPosition\"\n :data-vertical=\"vertical || undefined\"\n :color=\"isEffectivelyActive ? color : undefined\"\n :disabled=\"disabled\"\n :href=\"isLink && !isSelf ? linkHref : undefined\"\n :target=\"isLink ? target : undefined\"\n :tag=\"isLink ? 'a' : undefined\"\n :no-outline=\"isLink\"\n role=\"tab\"\n :aria-selected=\"isEffectivelyActive\"\n tabindex=\"-1\"\n hide-focus-indicator\n variant=\"text\"\n v-bind=\"$attrs\"\n @click=\"disabled ? undefined : onClick($event)\"\n >\n <template\n v-if=\"slots.prepend\"\n #prepend\n >\n <slot name=\"prepend\" />\n </template>\n <slot />\n <template\n v-if=\"slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </RuiButton>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiTab.js","names":[],"sources":["../../../../src/components/tabs/tab/RuiTab.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { RouteLocationRaw } from 'vue-router';\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport { TabAlignment, TabIndicatorPosition, TabLayout } from '@/components/tabs/tab-props';\nimport { useTabLink } from '@/components/tabs/tab/use-tab-link';\nimport { tv } from '@/utils/tv';\n\nexport interface RuiTabClassNames {\n root?: VueClassValue;\n active?: VueClassValue;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n disabled?: boolean;\n grow?: boolean;\n value?: number | string;\n active?: boolean;\n classNames?: RuiTabClassNames;\n /** @deprecated Use `classNames.active` instead */\n activeClass?: string;\n link?: boolean;\n target?: string;\n to?: RouteLocationRaw;\n exact?: boolean;\n /** @deprecated No longer used — vue-router's `useLink` handles route matching internally */\n exactPath?: boolean;\n vertical?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n}\n\ndefineOptions({\n name: 'RuiTab',\n inheritAttrs: false,\n});\n\nconst {\n color,\n disabled = false,\n grow = false,\n value = useId(),\n active = false,\n classNames,\n activeClass = '',\n link = false,\n to = '',\n target = '_self',\n exact = false,\n vertical = false,\n align = TabAlignment.center,\n indicatorPosition = TabIndicatorPosition.end,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n click: [value: string | number];\n}>();\n\nconst slots = defineSlots<{\n default?: (props?: object) => any;\n prepend?: (props?: object) => any;\n append?: (props?: object) => any;\n}>();\n\nconst tab = tv({\n base: 'min-w-[5.625rem] max-w-[22.5rem] flex items-center rounded-none cursor-pointer relative whitespace-nowrap shrink-0 !px-4',\n variants: {\n layout: {\n [TabLayout.horizontal]: '',\n // `min-h` instead of `h`: keep the 48px floor so simple text tabs\n // match horizontal layout, but let tabs grow to fit richer content\n // (logo + label, multi-line text) instead of clipping against the\n // scroll container's `overflow-auto`.\n [TabLayout.vertical]: '!min-h-[3rem] w-full max-w-none',\n },\n align: {\n start: 'justify-start text-left rtl:justify-end rtl:text-right',\n center: 'justify-center text-center',\n end: 'justify-end text-right rtl:justify-start rtl:text-left',\n },\n grow: {\n true: 'grow max-w-none',\n },\n disabled: {\n true: 'cursor-not-allowed',\n },\n active: {\n true: '',\n false: '',\n },\n indicatorPosition: {\n start: '',\n end: '',\n },\n },\n compoundVariants: [\n // Horizontal active indicator (bottom/top border)\n { active: true, layout: TabLayout.horizontal, indicatorPosition: 'end', class: `after:content-[''] after:absolute after:border-current after:h-0 after:w-full after:bottom-0 after:left-0 after:border-b-2` },\n { active: true, layout: TabLayout.horizontal, indicatorPosition: 'start', class: `after:content-[''] after:absolute after:border-current after:h-0 after:w-full after:top-0 after:left-0 after:border-b-2` },\n // Vertical active indicator (right/left border)\n { active: true, layout: TabLayout.vertical, indicatorPosition: 'end', class: `after:content-[''] after:absolute after:border-current after:h-full after:w-0 after:right-0 after:left-auto after:border-r-2` },\n { active: true, layout: TabLayout.vertical, indicatorPosition: 'start', class: `after:content-[''] after:absolute after:border-current after:h-full after:w-0 after:left-0 after:right-auto after:border-r-2` },\n ],\n defaultVariants: { layout: TabLayout.horizontal, align: 'center', indicatorPosition: 'end', active: false },\n});\n\nconst { isRouteActive, href: linkHref, navigate, isLink } = useTabLink({\n link: () => link,\n to: () => to,\n exact: () => exact,\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst isSelf = computed<boolean>(() => target === '_self');\nconst isEffectivelyActive = computed<boolean>(() => active || get(isRouteActive));\n\nfunction onClick(event?: MouseEvent): void {\n emit('click', value);\n if (navigate && get(isSelf) && event)\n navigate(event);\n}\n</script>\n\n<template>\n <RuiButton\n :class=\"[\n tab({ layout, align, indicatorPosition, grow, disabled, active: isEffectivelyActive }),\n isEffectivelyActive && (classNames?.active ?? activeClass),\n ]\"\n :data-active-tab=\"isEffectivelyActive || undefined\"\n :data-align=\"align\"\n :data-indicator-position=\"indicatorPosition\"\n :data-vertical=\"vertical || undefined\"\n :color=\"isEffectivelyActive ? color : undefined\"\n :disabled=\"disabled\"\n :href=\"isLink && !isSelf ? linkHref : undefined\"\n :target=\"isLink ? target : undefined\"\n :tag=\"isLink ? 'a' : undefined\"\n :no-outline=\"isLink\"\n role=\"tab\"\n :aria-selected=\"isEffectivelyActive\"\n tabindex=\"-1\"\n hide-focus-indicator\n variant=\"text\"\n v-bind=\"$attrs\"\n @click=\"disabled ? undefined : onClick($event)\"\n >\n <template\n v-if=\"slots.prepend\"\n #prepend\n >\n <slot name=\"prepend\" />\n </template>\n <slot />\n <template\n v-if=\"slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </RuiButton>\n</template>\n"],"mappings":""}
@@ -53,7 +53,7 @@ var RuiTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
53
53
  variants: {
54
54
  layout: {
55
55
  [TabLayout.horizontal]: "",
56
- [TabLayout.vertical]: "!h-[3rem] w-full max-w-none"
56
+ [TabLayout.vertical]: "!min-h-[3rem] w-full max-w-none"
57
57
  },
58
58
  align: {
59
59
  start: "justify-start text-left rtl:justify-end rtl:text-right",
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTab.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/tabs/tab/RuiTab.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { RouteLocationRaw } from 'vue-router';\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport { TabAlignment, TabIndicatorPosition, TabLayout } from '@/components/tabs/tab-props';\nimport { useTabLink } from '@/components/tabs/tab/use-tab-link';\nimport { tv } from '@/utils/tv';\n\nexport interface RuiTabClassNames {\n root?: VueClassValue;\n active?: VueClassValue;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n disabled?: boolean;\n grow?: boolean;\n value?: number | string;\n active?: boolean;\n classNames?: RuiTabClassNames;\n /** @deprecated Use `classNames.active` instead */\n activeClass?: string;\n link?: boolean;\n target?: string;\n to?: RouteLocationRaw;\n exact?: boolean;\n /** @deprecated No longer used — vue-router's `useLink` handles route matching internally */\n exactPath?: boolean;\n vertical?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n}\n\ndefineOptions({\n name: 'RuiTab',\n inheritAttrs: false,\n});\n\nconst {\n color,\n disabled = false,\n grow = false,\n value = useId(),\n active = false,\n classNames,\n activeClass = '',\n link = false,\n to = '',\n target = '_self',\n exact = false,\n vertical = false,\n align = TabAlignment.center,\n indicatorPosition = TabIndicatorPosition.end,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n click: [value: string | number];\n}>();\n\nconst slots = defineSlots<{\n default?: (props?: object) => any;\n prepend?: (props?: object) => any;\n append?: (props?: object) => any;\n}>();\n\nconst tab = tv({\n base: 'min-w-[5.625rem] max-w-[22.5rem] flex items-center rounded-none cursor-pointer relative whitespace-nowrap shrink-0 !px-4',\n variants: {\n layout: {\n [TabLayout.horizontal]: '',\n [TabLayout.vertical]: '!h-[3rem] w-full max-w-none',\n },\n align: {\n start: 'justify-start text-left rtl:justify-end rtl:text-right',\n center: 'justify-center text-center',\n end: 'justify-end text-right rtl:justify-start rtl:text-left',\n },\n grow: {\n true: 'grow max-w-none',\n },\n disabled: {\n true: 'cursor-not-allowed',\n },\n active: {\n true: '',\n false: '',\n },\n indicatorPosition: {\n start: '',\n end: '',\n },\n },\n compoundVariants: [\n // Horizontal active indicator (bottom/top border)\n { active: true, layout: TabLayout.horizontal, indicatorPosition: 'end', class: `after:content-[''] after:absolute after:border-current after:h-0 after:w-full after:bottom-0 after:left-0 after:border-b-2` },\n { active: true, layout: TabLayout.horizontal, indicatorPosition: 'start', class: `after:content-[''] after:absolute after:border-current after:h-0 after:w-full after:top-0 after:left-0 after:border-b-2` },\n // Vertical active indicator (right/left border)\n { active: true, layout: TabLayout.vertical, indicatorPosition: 'end', class: `after:content-[''] after:absolute after:border-current after:h-full after:w-0 after:right-0 after:left-auto after:border-r-2` },\n { active: true, layout: TabLayout.vertical, indicatorPosition: 'start', class: `after:content-[''] after:absolute after:border-current after:h-full after:w-0 after:left-0 after:right-auto after:border-r-2` },\n ],\n defaultVariants: { layout: TabLayout.horizontal, align: 'center', indicatorPosition: 'end', active: false },\n});\n\nconst { isRouteActive, href: linkHref, navigate, isLink } = useTabLink({\n link: () => link,\n to: () => to,\n exact: () => exact,\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst isSelf = computed<boolean>(() => target === '_self');\nconst isEffectivelyActive = computed<boolean>(() => active || get(isRouteActive));\n\nfunction onClick(event?: MouseEvent): void {\n emit('click', value);\n if (navigate && get(isSelf) && event)\n navigate(event);\n}\n</script>\n\n<template>\n <RuiButton\n :class=\"[\n tab({ layout, align, indicatorPosition, grow, disabled, active: isEffectivelyActive }),\n isEffectivelyActive && (classNames?.active ?? activeClass),\n ]\"\n :data-active-tab=\"isEffectivelyActive || undefined\"\n :data-align=\"align\"\n :data-indicator-position=\"indicatorPosition\"\n :data-vertical=\"vertical || undefined\"\n :color=\"isEffectivelyActive ? color : undefined\"\n :disabled=\"disabled\"\n :href=\"isLink && !isSelf ? linkHref : undefined\"\n :target=\"isLink ? target : undefined\"\n :tag=\"isLink ? 'a' : undefined\"\n :no-outline=\"isLink\"\n role=\"tab\"\n :aria-selected=\"isEffectivelyActive\"\n tabindex=\"-1\"\n hide-focus-indicator\n variant=\"text\"\n v-bind=\"$attrs\"\n @click=\"disabled ? undefined : onClick($event)\"\n >\n <template\n v-if=\"slots.prepend\"\n #prepend\n >\n <slot name=\"prepend\" />\n </template>\n <slot />\n <template\n v-if=\"slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </RuiButton>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwDA,MAAM,OAAO;EAIb,MAAM,QAAQ,UAIV;EAEJ,MAAM,MAAM,GAAG;GACb,MAAM;GACN,UAAU;IACR,QAAQ;MACL,UAAU,aAAa;MACvB,UAAU,WAAW;KACvB;IACD,OAAO;KACL,OAAO;KACP,QAAQ;KACR,KAAK;KACN;IACD,MAAM,EACJ,MAAM,mBACP;IACD,UAAU,EACR,MAAM,sBACP;IACD,QAAQ;KACN,MAAM;KACN,OAAO;KACR;IACD,mBAAmB;KACjB,OAAO;KACP,KAAK;;IAER;GACD,kBAAkB;IAEhB;KAAE,QAAQ;KAAM,QAAQ,UAAU;KAAY,mBAAmB;KAAO,OAAO;KAA8H;IAC7M;KAAE,QAAQ;KAAM,QAAQ,UAAU;KAAY,mBAAmB;KAAS,OAAO;KAA2H;IAE5M;KAAE,QAAQ;KAAM,QAAQ,UAAU;KAAU,mBAAmB;KAAO,OAAO;KAAgI;IAC7M;KAAE,QAAQ;KAAM,QAAQ,UAAU;KAAU,mBAAmB;KAAS,OAAO;;IAChF;GACD,iBAAiB;IAAE,QAAQ,UAAU;IAAY,OAAO;IAAU,mBAAmB;IAAO,QAAQ;;GACrG,CAAC;EAEF,MAAM,EAAE,eAAe,MAAM,UAAU,UAAU,WAAW,WAAW;GACrE,YAAY,QAAA;GACZ,UAAU,QAAA;GACV,aAAa,QAAA;GACd,CAAC;EAEF,MAAM,SAAS,eAA0B,QAAA,WAAW,UAAU,WAAW,UAAU,WAAW;EAC9F,MAAM,SAAS,eAAwB,QAAA,WAAW,QAAQ;EAC1D,MAAM,sBAAsB,eAAwB,QAAA,UAAU,IAAI,cAAc,CAAC;EAEjF,SAAS,QAAQ,OAA0B;AACzC,QAAK,SAAS,QAAA,MAAM;AACpB,OAAI,YAAY,IAAI,OAAO,IAAI,MAC7B,UAAS,MAAM;;;uBAKjB,YAoCY,mBApCZ,WAoCY;IAnCT,OAAK,CAAU,MAAA,IAAG,CAAA;KAAA,QAAG,MAAA,OAAM;KAAA,OAAE,QAAA;KAAK,mBAAE,QAAA;KAAiB,MAAE,QAAA;KAAI,UAAE,QAAA;KAAQ,QAAU,MAAA,oBAAA;KAAmB,CAAA,EAAW,MAAA,oBAAmB,KAAK,QAAA,YAAY,UAAU,QAAA,aAAA;IAI3J,mBAAiB,MAAA,oBAAmB,IAAI,KAAA;IACxC,cAAY,QAAA;IACZ,2BAAyB,QAAA;IACzB,iBAAe,QAAA,YAAY,KAAA;IAC3B,OAAO,MAAA,oBAAmB,GAAG,QAAA,QAAQ,KAAA;IACrC,UAAU,QAAA;IACV,MAAM,MAAA,OAAM,IAAA,CAAK,MAAA,OAAM,GAAG,MAAA,SAAQ,GAAG,KAAA;IACrC,QAAQ,MAAA,OAAM,GAAG,QAAA,SAAS,KAAA;IAC1B,KAAK,MAAA,OAAM,GAAA,MAAS,KAAA;IACpB,cAAY,MAAA,OAAM;IACnB,MAAK;IACJ,iBAAe,MAAA,oBAAmB;IACnC,UAAS;IACT,wBAAA;IACA,SAAQ;MACAA,KAAAA,QAAM,EACb,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,WAAW,KAAA,IAAY,QAAQ,OAAM,GAAA,CAAA,EAAA,YAAA;2BAQrC,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA;;OALA,MAAM,UAAA;UACX;sBAEsB,CAAvB,WAAuB,KAAA,QAAA,UAAA,CAAA,CAAA;;eAIjB,MAAM,SAAA;UACX;sBAEqB,CAAtB,WAAsB,KAAA,QAAA,SAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"RuiTab.vue_vue_type_script_setup_true_lang.js","names":["$attrs"],"sources":["../../../../src/components/tabs/tab/RuiTab.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { RouteLocationRaw } from 'vue-router';\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { VueClassValue } from '@/types/class-value';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport { TabAlignment, TabIndicatorPosition, TabLayout } from '@/components/tabs/tab-props';\nimport { useTabLink } from '@/components/tabs/tab/use-tab-link';\nimport { tv } from '@/utils/tv';\n\nexport interface RuiTabClassNames {\n root?: VueClassValue;\n active?: VueClassValue;\n}\n\nexport interface Props {\n color?: ContextColorsType;\n disabled?: boolean;\n grow?: boolean;\n value?: number | string;\n active?: boolean;\n classNames?: RuiTabClassNames;\n /** @deprecated Use `classNames.active` instead */\n activeClass?: string;\n link?: boolean;\n target?: string;\n to?: RouteLocationRaw;\n exact?: boolean;\n /** @deprecated No longer used — vue-router's `useLink` handles route matching internally */\n exactPath?: boolean;\n vertical?: boolean;\n align?: TabAlignment;\n indicatorPosition?: TabIndicatorPosition;\n}\n\ndefineOptions({\n name: 'RuiTab',\n inheritAttrs: false,\n});\n\nconst {\n color,\n disabled = false,\n grow = false,\n value = useId(),\n active = false,\n classNames,\n activeClass = '',\n link = false,\n to = '',\n target = '_self',\n exact = false,\n vertical = false,\n align = TabAlignment.center,\n indicatorPosition = TabIndicatorPosition.end,\n} = defineProps<Props>();\n\nconst emit = defineEmits<{\n click: [value: string | number];\n}>();\n\nconst slots = defineSlots<{\n default?: (props?: object) => any;\n prepend?: (props?: object) => any;\n append?: (props?: object) => any;\n}>();\n\nconst tab = tv({\n base: 'min-w-[5.625rem] max-w-[22.5rem] flex items-center rounded-none cursor-pointer relative whitespace-nowrap shrink-0 !px-4',\n variants: {\n layout: {\n [TabLayout.horizontal]: '',\n // `min-h` instead of `h`: keep the 48px floor so simple text tabs\n // match horizontal layout, but let tabs grow to fit richer content\n // (logo + label, multi-line text) instead of clipping against the\n // scroll container's `overflow-auto`.\n [TabLayout.vertical]: '!min-h-[3rem] w-full max-w-none',\n },\n align: {\n start: 'justify-start text-left rtl:justify-end rtl:text-right',\n center: 'justify-center text-center',\n end: 'justify-end text-right rtl:justify-start rtl:text-left',\n },\n grow: {\n true: 'grow max-w-none',\n },\n disabled: {\n true: 'cursor-not-allowed',\n },\n active: {\n true: '',\n false: '',\n },\n indicatorPosition: {\n start: '',\n end: '',\n },\n },\n compoundVariants: [\n // Horizontal active indicator (bottom/top border)\n { active: true, layout: TabLayout.horizontal, indicatorPosition: 'end', class: `after:content-[''] after:absolute after:border-current after:h-0 after:w-full after:bottom-0 after:left-0 after:border-b-2` },\n { active: true, layout: TabLayout.horizontal, indicatorPosition: 'start', class: `after:content-[''] after:absolute after:border-current after:h-0 after:w-full after:top-0 after:left-0 after:border-b-2` },\n // Vertical active indicator (right/left border)\n { active: true, layout: TabLayout.vertical, indicatorPosition: 'end', class: `after:content-[''] after:absolute after:border-current after:h-full after:w-0 after:right-0 after:left-auto after:border-r-2` },\n { active: true, layout: TabLayout.vertical, indicatorPosition: 'start', class: `after:content-[''] after:absolute after:border-current after:h-full after:w-0 after:left-0 after:right-auto after:border-r-2` },\n ],\n defaultVariants: { layout: TabLayout.horizontal, align: 'center', indicatorPosition: 'end', active: false },\n});\n\nconst { isRouteActive, href: linkHref, navigate, isLink } = useTabLink({\n link: () => link,\n to: () => to,\n exact: () => exact,\n});\n\nconst layout = computed<TabLayout>(() => vertical ? TabLayout.vertical : TabLayout.horizontal);\nconst isSelf = computed<boolean>(() => target === '_self');\nconst isEffectivelyActive = computed<boolean>(() => active || get(isRouteActive));\n\nfunction onClick(event?: MouseEvent): void {\n emit('click', value);\n if (navigate && get(isSelf) && event)\n navigate(event);\n}\n</script>\n\n<template>\n <RuiButton\n :class=\"[\n tab({ layout, align, indicatorPosition, grow, disabled, active: isEffectivelyActive }),\n isEffectivelyActive && (classNames?.active ?? activeClass),\n ]\"\n :data-active-tab=\"isEffectivelyActive || undefined\"\n :data-align=\"align\"\n :data-indicator-position=\"indicatorPosition\"\n :data-vertical=\"vertical || undefined\"\n :color=\"isEffectivelyActive ? color : undefined\"\n :disabled=\"disabled\"\n :href=\"isLink && !isSelf ? linkHref : undefined\"\n :target=\"isLink ? target : undefined\"\n :tag=\"isLink ? 'a' : undefined\"\n :no-outline=\"isLink\"\n role=\"tab\"\n :aria-selected=\"isEffectivelyActive\"\n tabindex=\"-1\"\n hide-focus-indicator\n variant=\"text\"\n v-bind=\"$attrs\"\n @click=\"disabled ? undefined : onClick($event)\"\n >\n <template\n v-if=\"slots.prepend\"\n #prepend\n >\n <slot name=\"prepend\" />\n </template>\n <slot />\n <template\n v-if=\"slots.append\"\n #append\n >\n <slot name=\"append\" />\n </template>\n </RuiButton>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwDA,MAAM,OAAO;EAIb,MAAM,QAAQ,UAIV;EAEJ,MAAM,MAAM,GAAG;GACb,MAAM;GACN,UAAU;IACR,QAAQ;MACL,UAAU,aAAa;MAKvB,UAAU,WAAW;KACvB;IACD,OAAO;KACL,OAAO;KACP,QAAQ;KACR,KAAK;KACN;IACD,MAAM,EACJ,MAAM,mBACP;IACD,UAAU,EACR,MAAM,sBACP;IACD,QAAQ;KACN,MAAM;KACN,OAAO;KACR;IACD,mBAAmB;KACjB,OAAO;KACP,KAAK;;IAER;GACD,kBAAkB;IAEhB;KAAE,QAAQ;KAAM,QAAQ,UAAU;KAAY,mBAAmB;KAAO,OAAO;KAA8H;IAC7M;KAAE,QAAQ;KAAM,QAAQ,UAAU;KAAY,mBAAmB;KAAS,OAAO;KAA2H;IAE5M;KAAE,QAAQ;KAAM,QAAQ,UAAU;KAAU,mBAAmB;KAAO,OAAO;KAAgI;IAC7M;KAAE,QAAQ;KAAM,QAAQ,UAAU;KAAU,mBAAmB;KAAS,OAAO;;IAChF;GACD,iBAAiB;IAAE,QAAQ,UAAU;IAAY,OAAO;IAAU,mBAAmB;IAAO,QAAQ;;GACrG,CAAC;EAEF,MAAM,EAAE,eAAe,MAAM,UAAU,UAAU,WAAW,WAAW;GACrE,YAAY,QAAA;GACZ,UAAU,QAAA;GACV,aAAa,QAAA;GACd,CAAC;EAEF,MAAM,SAAS,eAA0B,QAAA,WAAW,UAAU,WAAW,UAAU,WAAW;EAC9F,MAAM,SAAS,eAAwB,QAAA,WAAW,QAAQ;EAC1D,MAAM,sBAAsB,eAAwB,QAAA,UAAU,IAAI,cAAc,CAAC;EAEjF,SAAS,QAAQ,OAA0B;AACzC,QAAK,SAAS,QAAA,MAAM;AACpB,OAAI,YAAY,IAAI,OAAO,IAAI,MAC7B,UAAS,MAAM;;;uBAKjB,YAoCY,mBApCZ,WAoCY;IAnCT,OAAK,CAAU,MAAA,IAAG,CAAA;KAAA,QAAG,MAAA,OAAM;KAAA,OAAE,QAAA;KAAK,mBAAE,QAAA;KAAiB,MAAE,QAAA;KAAI,UAAE,QAAA;KAAQ,QAAU,MAAA,oBAAA;KAAmB,CAAA,EAAW,MAAA,oBAAmB,KAAK,QAAA,YAAY,UAAU,QAAA,aAAA;IAI3J,mBAAiB,MAAA,oBAAmB,IAAI,KAAA;IACxC,cAAY,QAAA;IACZ,2BAAyB,QAAA;IACzB,iBAAe,QAAA,YAAY,KAAA;IAC3B,OAAO,MAAA,oBAAmB,GAAG,QAAA,QAAQ,KAAA;IACrC,UAAU,QAAA;IACV,MAAM,MAAA,OAAM,IAAA,CAAK,MAAA,OAAM,GAAG,MAAA,SAAQ,GAAG,KAAA;IACrC,QAAQ,MAAA,OAAM,GAAG,QAAA,SAAS,KAAA;IAC1B,KAAK,MAAA,OAAM,GAAA,MAAS,KAAA;IACpB,cAAY,MAAA,OAAM;IACnB,MAAK;IACJ,iBAAe,MAAA,oBAAmB;IACnC,UAAS;IACT,wBAAA;IACA,SAAQ;MACAA,KAAAA,QAAM,EACb,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,QAAA,WAAW,KAAA,IAAY,QAAQ,OAAM,GAAA,CAAA,EAAA,YAAA;2BAQrC,CAAR,WAAQ,KAAA,QAAA,UAAA,CAAA,CAAA;;OALA,MAAM,UAAA;UACX;sBAEsB,CAAvB,WAAuB,KAAA,QAAA,UAAA,CAAA,CAAA;;eAIjB,MAAM,SAAA;UACX;sBAEqB,CAAtB,WAAsB,KAAA,QAAA,SAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTabItems.js","names":[],"sources":["../../../../src/components/tabs/tab-items/RuiTabItems.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport { Fragment, isVNode } from 'vue';\n\ndefineOptions({\n name: 'RuiTabItems',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<T>();\n\nconst slots = useSlots();\n\nconst reverse = ref<boolean>(false);\nconst currIndex = ref<number>(-1);\nconst activeIndex = ref<number>(-1);\nconst inner = useTemplateRef<HTMLDivElement>('inner');\n\nconst { height: innerHeight } = useElementSize(inner);\n\nconst children = computed<VNode[]>(() => {\n const slotContent = slots.default?.() ?? [];\n\n const tabs = getChildrenTabs(slotContent);\n\n let anyActive = false;\n const children = tabs.map((tab, index) => {\n const value = tab.props?.value ?? index;\n const active = get(modelValue) === value;\n if (active) {\n anyActive = true;\n if (index !== get(currIndex)) {\n set(reverse, index < get(currIndex));\n set(currIndex, index);\n }\n }\n\n return {\n ...tab,\n props: {\n value,\n ...tab.props,\n },\n };\n });\n\n if (!anyActive)\n set(currIndex, -1);\n\n return children;\n});\n\n// When using dynamic content with v-for the slot content can contain fragment,\n// Go through the fragment and always return RuiTabItem only\nfunction getChildrenTabs(children: VNode[]): VNode[] {\n return children\n .flatMap((item) => {\n if (item.type === Fragment && Array.isArray(item.children) && item.children.length > 0)\n return getChildrenTabs(item.children.filter(isVNode));\n\n return [item];\n })\n .flat();\n}\n\nwatch(currIndex, (index) => {\n nextTick(() => {\n set(activeIndex, index);\n });\n});\n</script>\n\n<template>\n <div\n class=\"grow transition-all overflow-hidden\"\n :style=\"{ height: `${innerHeight}px` }\"\n v-bind=\"$attrs\"\n >\n <div ref=\"inner\">\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n :reverse=\"reverse\"\n :active=\"i === activeIndex\"\n />\n </div>\n </div>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiTabItems.js","names":[],"sources":["../../../../src/components/tabs/tab-items/RuiTabItems.vue"],"sourcesContent":["<script lang=\"ts\" setup generic=\"T extends string | number\">\nimport { Fragment, isVNode } from 'vue';\n\ndefineOptions({\n name: 'RuiTabItems',\n inheritAttrs: false,\n});\n\n// Default matches RuiTabs' `defineModel<... >({ default: 0 })`. Without a\n// default, consumers that bind both components to the same ref (e.g.\n// `v-model=\"item.modelValue\"` on both RuiTabs and RuiTabItems, where the\n// ref starts as `undefined`) leave RuiTabItems with `modelValue === undefined`.\n// The `active = modelValue === value` check then fails for every tab — the\n// panel renders but stays height:0, so e2e `toHaveText` and `toBeVisible`\n// assertions pass the element but see no content.\nconst modelValue = defineModel<T>({ default: 0 as T });\n\nconst slots = useSlots();\n\nconst reverse = ref<boolean>(false);\nconst currIndex = ref<number>(-1);\nconst activeIndex = ref<number>(-1);\nconst inner = useTemplateRef<HTMLDivElement>('inner');\n\nconst { height: innerHeight } = useElementSize(inner);\n\nconst children = computed<VNode[]>(() => {\n const slotContent = slots.default?.() ?? [];\n\n const tabs = getChildrenTabs(slotContent);\n\n let anyActive = false;\n const children = tabs.map((tab, index) => {\n const value = tab.props?.value ?? index;\n const active = get(modelValue) === value;\n if (active) {\n anyActive = true;\n if (index !== get(currIndex)) {\n set(reverse, index < get(currIndex));\n set(currIndex, index);\n }\n }\n\n return {\n ...tab,\n props: {\n value,\n ...tab.props,\n },\n };\n });\n\n if (!anyActive)\n set(currIndex, -1);\n\n return children;\n});\n\n// When using dynamic content with v-for the slot content can contain fragment,\n// Go through the fragment and always return RuiTabItem only\nfunction getChildrenTabs(children: VNode[]): VNode[] {\n return children\n .flatMap((item) => {\n if (item.type === Fragment && Array.isArray(item.children) && item.children.length > 0)\n return getChildrenTabs(item.children.filter(isVNode));\n\n return [item];\n })\n .flat();\n}\n\nwatch(currIndex, (index) => {\n nextTick(() => {\n set(activeIndex, index);\n });\n});\n</script>\n\n<template>\n <div\n class=\"grow transition-all overflow-hidden\"\n :style=\"{ height: `${innerHeight}px` }\"\n v-bind=\"$attrs\"\n >\n <div ref=\"inner\">\n <Component\n :is=\"child\"\n v-for=\"(child, i) in children\"\n :key=\"i\"\n :reverse=\"reverse\"\n :active=\"i === activeIndex\"\n />\n </div>\n </div>\n</template>\n"],"mappings":""}
@@ -2,14 +2,14 @@ declare const __VLS_export: <T extends string | number>(__VLS_props: NonNullable
2
2
  props: import("vue").PublicProps & __VLS_PrettifyLocal<{
3
3
  modelValue?: T;
4
4
  } & {
5
- "onUpdate:modelValue"?: ((value: T | undefined) => any) | undefined;
5
+ "onUpdate:modelValue"?: ((value: T) => any) | undefined;
6
6
  }> & (typeof globalThis extends {
7
7
  __VLS_PROPS_FALLBACK: infer P;
8
8
  } ? P : {});
9
9
  expose: (exposed: {}) => void;
10
10
  attrs: any;
11
11
  slots: {};
12
- emit: (event: "update:modelValue", value: T | undefined) => void;
12
+ emit: (event: "update:modelValue", value: T) => void;
13
13
  }>) => import("vue").VNode & {
14
14
  __ctx?: Awaited<typeof __VLS_setup>;
15
15
  };
@@ -7,7 +7,7 @@ var RuiTabItems_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
7
7
  inheritAttrs: false,
8
8
  __name: "RuiTabItems",
9
9
  props: {
10
- "modelValue": {},
10
+ "modelValue": { default: 0 },
11
11
  "modelModifiers": {}
12
12
  },
13
13
  emits: ["update:modelValue"],