diff --git a/docs/content/2.components/table.md b/docs/content/2.components/table.md index a83a23867d..f747feff21 100644 --- a/docs/content/2.components/table.md +++ b/docs/content/2.components/table.md @@ -302,11 +302,11 @@ componentProps: ### Loading -Use the `loading` prop to display a loading state. +Use the `loading` prop to indicate that data is currently loading with an indeterminate [Progress](/components/progress#indeterminate) bar. -Use the `loading-state` prop to customize the `icon` and `label` or change them globally in `ui.table.default.loadingState`. +You can use the `progress` prop to customize the `color` and `animation` of the progress bar or change them globally in `ui.table.default.progress` (you can set it to `null` to hide the progress bar). -You can also set it to `null` to hide the loading state. +If there is no rows provided, a loading state will also be displayed. You can use the `loading-state` prop to customize the `icon` and `label` or change them globally in `ui.table.default.loadingState` (you can set it to `null` to hide the loading state). ::component-card --- @@ -330,8 +330,12 @@ props: loadingState: icon: 'i-heroicons-arrow-path-20-solid' label: "Loading..." + progress: + color: 'primary' + animation: 'carousel' excludedProps: - loadingState + - progress --- :: diff --git a/src/runtime/components/data/Table.vue b/src/runtime/components/data/Table.vue index 1bdf1cbc7d..605a55d7f7 100644 --- a/src/runtime/components/data/Table.vue +++ b/src/runtime/components/data/Table.vue @@ -20,9 +20,15 @@ + + + + + + - +
@@ -72,12 +78,13 @@ import type { PropType } from 'vue' import { upperFirst } from 'scule' import { defu } from 'defu' import { useVModel } from '@vueuse/core' -import UButton from '../elements/Button.vue' import UIcon from '../elements/Icon.vue' +import UButton from '../elements/Button.vue' +import UProgress from '../elements/Progress.vue' import UCheckbox from '../forms/Checkbox.vue' import { useUI } from '../../composables/useUI' import { mergeConfig, get } from '../../utils' -import type { Strategy, Button } from '../../types' +import type { Strategy, Button, ProgressColor, ProgressAnimation } from '../../types' // @ts-expect-error import appConfig from '#build/app.config' import { table } from '#ui/ui.config' @@ -102,8 +109,9 @@ function defaultSort (a: any, b: any, direction: 'asc' | 'desc') { export default defineComponent({ components: { - UButton, UIcon, + UButton, + UProgress, UCheckbox }, inheritAttrs: false, @@ -160,6 +168,10 @@ export default defineComponent({ type: Object as PropType<{ icon: string, label: string }>, default: () => config.default.emptyState }, + progress: { + type: Object as PropType<{ color: ProgressColor, animation: ProgressAnimation }>, + default: () => config.default.progress + }, class: { type: [String, Object, Array] as PropType, default: () => '' diff --git a/src/runtime/ui.config/data/table.ts b/src/runtime/ui.config/data/table.ts index b3364ca50a..d486cc1ec1 100644 --- a/src/runtime/ui.config/data/table.ts +++ b/src/runtime/ui.config/data/table.ts @@ -2,7 +2,7 @@ export default { wrapper: 'relative overflow-x-auto', base: 'min-w-full table-fixed', divide: 'divide-y divide-gray-300 dark:divide-gray-700', - thead: '', + thead: 'relative', tbody: 'divide-y divide-gray-200 dark:divide-gray-800', tr: { base: '', @@ -36,6 +36,9 @@ export default { label: 'text-sm text-center text-gray-900 dark:text-white', icon: 'w-6 h-6 mx-auto text-gray-400 dark:text-gray-500 mb-4' }, + progress: { + wrapper: 'absolute inset-x-0 -bottom-[0.5px] p-0' + }, default: { sortAscIcon: 'i-heroicons-bars-arrow-up-20-solid', sortDescIcon: 'i-heroicons-bars-arrow-down-20-solid', @@ -47,6 +50,10 @@ export default { variant: 'ghost' as const, class: '-m-1.5' }, + progress: { + color: 'primary' as const, + animation: 'carousel' as const + }, loadingState: { icon: 'i-heroicons-arrow-path-20-solid', label: 'Loading...'