Skip to content

Commit

Permalink
feat(Table): display progress bar when loading (#1362)
Browse files Browse the repository at this point in the history
  • Loading branch information
benjamincanac committed Feb 15, 2024
1 parent 04ef473 commit 3fe3521
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 8 deletions.
10 changes: 7 additions & 3 deletions docs/content/2.components/table.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
---
Expand All @@ -330,8 +330,12 @@ props:
loadingState:
icon: 'i-heroicons-arrow-path-20-solid'
label: "Loading..."
progress:
color: 'primary'
animation: 'carousel'
excludedProps:
- loadingState
- progress
---
::

Expand Down
20 changes: 16 additions & 4 deletions src/runtime/components/data/Table.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,15 @@
</slot>
</th>
</tr>

<tr v-if="loading && progress">
<td :colspan="0" :class="ui.progress.wrapper">
<UProgress v-bind="{ ...(ui.default.progress || {}), ...progress }" size="2xs" />
</td>
</tr>
</thead>
<tbody :class="ui.tbody">
<tr v-if="loadingState && loading">
<tr v-if="loadingState && loading && !rows.length">
<td :colspan="columns.length + (modelValue ? 1 : 0)">
<slot name="loading-state">
<div :class="ui.loadingState.wrapper">
Expand Down Expand Up @@ -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'
Expand All @@ -102,8 +109,9 @@ function defaultSort (a: any, b: any, direction: 'asc' | 'desc') {
export default defineComponent({
components: {
UButton,
UIcon,
UButton,
UProgress,
UCheckbox
},
inheritAttrs: false,
Expand Down Expand Up @@ -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<any>,
default: () => ''
Expand Down
9 changes: 8 additions & 1 deletion src/runtime/ui.config/data/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: '',
Expand Down Expand Up @@ -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',
Expand All @@ -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...'
Expand Down

0 comments on commit 3fe3521

Please sign in to comment.