@paris-ias/list 1.0.137 → 1.0.139

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 (49) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/components/actions/DenseItem.vue +64 -0
  3. package/dist/runtime/components/actions/ExpandedItem.vue +17 -14
  4. package/dist/runtime/components/actions/RowsItem.vue +56 -10
  5. package/dist/runtime/components/actions/View.vue +5 -17
  6. package/dist/runtime/components/affiliation/DenseItem.vue +26 -10
  7. package/dist/runtime/components/affiliation/RowsItem.vue +26 -10
  8. package/dist/runtime/components/apps/DenseItem.vue +26 -10
  9. package/dist/runtime/components/apps/RowsItem.vue +26 -10
  10. package/dist/runtime/components/disciplines/DenseItem.vue +26 -10
  11. package/dist/runtime/components/disciplines/RowsItem.vue +26 -10
  12. package/dist/runtime/components/events/DenseItem.vue +12 -3
  13. package/dist/runtime/components/events/RowsItem.vue +12 -5
  14. package/dist/runtime/components/fellowships/DenseItem.vue +14 -0
  15. package/dist/runtime/components/fellowships/RowsItem.vue +16 -2
  16. package/dist/runtime/components/fellowships/View.vue +2 -2
  17. package/dist/runtime/components/files/DenseItem.vue +25 -10
  18. package/dist/runtime/components/files/RowsItem.vue +26 -10
  19. package/dist/runtime/components/list/atoms/FiltersMenu.vue +9 -0
  20. package/dist/runtime/components/list/atoms/PerPage.vue +3 -2
  21. package/dist/runtime/components/list/atoms/ResetButton.vue +5 -1
  22. package/dist/runtime/components/list/atoms/SearchInput.vue +15 -2
  23. package/dist/runtime/components/list/atoms/SearchString.vue +169 -133
  24. package/dist/runtime/components/list/atoms/SortMenu.vue +22 -18
  25. package/dist/runtime/components/list/atoms/ViewMenu.vue +26 -14
  26. package/dist/runtime/components/list/molecules/Filters.vue +4 -4
  27. package/dist/runtime/components/list/molecules/GlobalSearchInput.vue +12 -14
  28. package/dist/runtime/components/list/molecules/Header.vue +11 -20
  29. package/dist/runtime/components/list/molecules/Pagination.vue +51 -48
  30. package/dist/runtime/components/list/molecules/ResultsContainer.vue +5 -2
  31. package/dist/runtime/components/list/organisms/List.vue +105 -74
  32. package/dist/runtime/components/list/organisms/Results.vue +31 -17
  33. package/dist/runtime/components/mailing/RowsItem.vue +26 -10
  34. package/dist/runtime/components/news/DenseItem.vue +59 -45
  35. package/dist/runtime/components/news/RowsItem.vue +11 -7
  36. package/dist/runtime/components/people/DenseItem.vue +10 -8
  37. package/dist/runtime/components/people/RowsItem.vue +11 -2
  38. package/dist/runtime/components/projects/DenseItem.vue +11 -4
  39. package/dist/runtime/components/projects/RowsItem.vue +10 -3
  40. package/dist/runtime/components/publications/DenseItem.vue +12 -8
  41. package/dist/runtime/components/publications/RowsItem.vue +12 -4
  42. package/dist/runtime/components/tags/RowsItem.vue +23 -10
  43. package/dist/runtime/components/users/DenseItem.vue +24 -10
  44. package/dist/runtime/components/users/RowsItem.vue +24 -10
  45. package/dist/runtime/composables/useUtils.js +1 -1
  46. package/dist/runtime/plugins/pinia.js +5 -2
  47. package/dist/runtime/stores/root.d.ts +10 -9
  48. package/dist/runtime/stores/root.js +82 -117
  49. package/package.json +1 -1
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@paris-ias/list",
3
3
  "configKey": "list",
4
- "version": "1.0.137",
4
+ "version": "1.0.139",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "0.8.4",
7
7
  "unbuild": "2.0.0"
@@ -0,0 +1,64 @@
1
+ <template>
2
+ <v-row
3
+ class="my-2 highlight-on-hover"
4
+ no-gutters
5
+ @click="$router.push(pathPrefix)"
6
+ >
7
+ <v-col v-if="mdAndUp" cols="12" md="2">
8
+ <MiscAtomsImageContainer
9
+ :loading="isLoading"
10
+ :src="imageSrc"
11
+ :ratio="1 / 1"
12
+ cover
13
+ />
14
+ </v-col>
15
+ <v-col cols="12" :md="mdAndUp ? 10 : 12" class="px-4">
16
+ <v-skeleton-loader
17
+ v-if="isLoading"
18
+ :type="
19
+ [
20
+ 'heading, subtitle, text@6',
21
+ 'heading, subtitle, text@6',
22
+ 'heading, subtitle, text@4',
23
+ 'heading, subtitle, text@4',
24
+ 'heading, subtitle, text@4',
25
+ 'heading, subtitle, text@4',
26
+ ][['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')]
27
+ "
28
+ />
29
+ <template v-else>
30
+ <div class="text-h5">{{ item.name }}</div>
31
+ <div v-if="item.summary" class="text-body-1 mt-2">
32
+ <MDC :value="item.summary" />
33
+ </div>
34
+ </template>
35
+ </v-col>
36
+ </v-row>
37
+ <v-divider />
38
+ </template>
39
+
40
+ <script setup>
41
+ import { useDisplay } from "vuetify"
42
+ import { computed } from "#imports"
43
+ import { useRootStore } from "../../stores/root"
44
+
45
+ const { name, mdAndUp } = useDisplay()
46
+ const rootStore = useRootStore()
47
+ const props = defineProps({
48
+ item: { type: Object, required: true },
49
+ index: { type: Number, required: false, default: 0 },
50
+ pathPrefix: { type: String, required: true },
51
+ loading: { type: Boolean, required: false, default: false },
52
+ })
53
+
54
+ const isLoading = computed(() => rootStore.loading || props.loading)
55
+ const imageSrc = computed(() => {
56
+ const img = props.item && props.item.image
57
+ if (!img) return "/default.png"
58
+ if (typeof img === "string") return img
59
+ if (img && img.url) return img
60
+ return "/default.png"
61
+ })
62
+ </script>
63
+
64
+ <style></style>
@@ -1,20 +1,23 @@
1
1
  <template>
2
- <div>
3
- {{ item.name }}
4
- </div>
2
+ <v-card flat class="pa-4">
3
+ <v-skeleton-loader v-if="isLoading" type="heading, text@10" />
4
+ <template v-else>
5
+ <div class="text-h4 mb-2">{{ item.name }}</div>
6
+ <MDC v-if="item.description" :value="item.description" />
7
+ </template>
8
+ </v-card>
5
9
  </template>
6
10
 
7
- <script lang="ts" setup>
11
+ <script setup>
12
+ import { computed } from "#imports"
13
+ import { useRootStore } from "../../stores/root"
14
+
15
+ const rootStore = useRootStore()
8
16
  const props = defineProps({
9
- item: {
10
- type: Object,
11
- required: true,
12
- },
13
- pathPrefix: {
14
- type: String,
15
- required: true,
16
- },
17
+ item: { type: Object, required: true },
18
+ pathPrefix: { type: String, required: true },
19
+ loading: { type: Boolean, default: false },
17
20
  })
18
- </script>
19
21
 
20
- <style></style>
22
+ const isLoading = computed(() => rootStore.loading || props.loading)
23
+ </script>
@@ -1,17 +1,63 @@
1
1
  <template>
2
- {{ item }}
2
+ <v-row
3
+ class="highlight-on-hover pa-3"
4
+ no-gutters
5
+ @click="$router.push(pathPrefix)"
6
+ >
7
+ <v-col v-if="mdAndUp" cols="12" md="3">
8
+ <MiscAtomsImageContainer
9
+ cover
10
+ :src="imageSrc"
11
+ :ratio="1 / 1"
12
+ :loading="isLoading"
13
+ />
14
+ </v-col>
15
+ <v-col cols="12" :md="mdAndUp ? 9 : 12" class="px-6">
16
+ <v-skeleton-loader
17
+ v-if="isLoading"
18
+ :type="
19
+ [
20
+ 'heading, ossein, text@6, button',
21
+ 'heading, ossein, text@6, button',
22
+ 'heading, ossein, text@4, button',
23
+ 'heading, ossein, text@4, button',
24
+ 'heading, ossein, text@4, button',
25
+ 'heading, ossein, text@4, button',
26
+ ][['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')]
27
+ "
28
+ />
29
+ <template v-else>
30
+ <div class="text-h5 text-wrap">{{ item.name }}</div>
31
+ <div v-if="item.summary" class="mt-2">
32
+ <MDC :value="item.summary" />
33
+ </div>
34
+ </template>
35
+ </v-col>
36
+ </v-row>
37
+ <v-divider />
3
38
  </template>
4
39
 
5
40
  <script setup>
6
- defineProps({
7
- item: {
8
- type: Object,
9
- required: true,
10
- },
11
- pathPrefix: {
12
- type: String,
13
- required: true,
14
- },
41
+ import { useDisplay } from "vuetify"
42
+ import { computed } from "#imports"
43
+ import { useRootStore } from "../../stores/root"
44
+
45
+ const { name, mdAndUp } = useDisplay()
46
+ const rootStore = useRootStore()
47
+ const props = defineProps({
48
+ item: { type: Object, required: true },
49
+ index: { type: Number, required: false, default: 0 },
50
+ pathPrefix: { type: String, required: true },
51
+ loading: { type: Boolean, required: false, default: false },
52
+ })
53
+
54
+ const isLoading = computed(() => rootStore.loading || props.loading)
55
+ const imageSrc = computed(() => {
56
+ const img = props.item && props.item.image
57
+ if (!img) return "/default.png"
58
+ if (typeof img === "string") return img
59
+ if (img && img.url) return img
60
+ return "/default.png"
15
61
  })
16
62
  </script>
17
63
 
@@ -1,22 +1,10 @@
1
1
  <template>
2
- {{ item }}
2
+ <v-row no-gutters>
3
+ <slot />
4
+ </v-row>
5
+ <v-divider />
3
6
  </template>
4
7
 
5
8
  <script setup>
6
- import { useNuxtApp } from "#imports"
7
-
8
- const { $stores } = useNuxtApp()
9
- defineProps({
10
- item: {
11
- type: Object,
12
- required: true,
13
- },
14
- loading: {
15
- type: Boolean,
16
- required: false,
17
- default: false,
18
- },
19
- })
20
-
21
- $stores.actions.loading = false
9
+ defineProps({ loading: { type: Boolean, default: false } })
22
10
  </script>
@@ -1,18 +1,34 @@
1
1
  <template>
2
- {{ item }}
2
+ <v-row
3
+ class="my-2 highlight-on-hover"
4
+ no-gutters
5
+ @click="$router.push(pathPrefix)"
6
+ >
7
+ <v-col cols="12" class="px-4">
8
+ <v-skeleton-loader v-if="isLoading" type="heading, text@6" />
9
+ <template v-else>
10
+ <div class="text-h5">{{ item.name }}</div>
11
+ <div v-if="item.summary" class="text-body-1 mt-1">
12
+ <MDC :value="item.summary" />
13
+ </div>
14
+ </template>
15
+ </v-col>
16
+ </v-row>
17
+ <v-divider />
3
18
  </template>
4
19
 
5
20
  <script setup>
6
- defineProps({
7
- item: {
8
- type: Object,
9
- required: true,
10
- },
11
- pathPrefix: {
12
- type: String,
13
- required: true,
14
- },
21
+ import { computed } from "#imports"
22
+ import { useRootStore } from "../../stores/root"
23
+
24
+ const rootStore = useRootStore()
25
+ const props = defineProps({
26
+ item: { type: Object, required: true },
27
+ pathPrefix: { type: String, required: true },
28
+ loading: { type: Boolean, default: false },
15
29
  })
30
+
31
+ const isLoading = computed(() => rootStore.loading || props.loading)
16
32
  </script>
17
33
 
18
34
  <style></style>
@@ -1,18 +1,34 @@
1
1
  <template>
2
- {{ item }}
2
+ <v-row
3
+ class="highlight-on-hover pa-3"
4
+ no-gutters
5
+ @click="$router.push(pathPrefix)"
6
+ >
7
+ <v-col cols="12" class="px-6">
8
+ <v-skeleton-loader v-if="isLoading" type="heading, text@8, button" />
9
+ <template v-else>
10
+ <div class="text-h5">{{ item.name }}</div>
11
+ <div v-if="item.summary" class="mt-2">
12
+ <MDC :value="item.summary" />
13
+ </div>
14
+ </template>
15
+ </v-col>
16
+ </v-row>
17
+ <v-divider />
3
18
  </template>
4
19
 
5
20
  <script setup>
6
- defineProps({
7
- item: {
8
- type: Object,
9
- required: true,
10
- },
11
- pathPrefix: {
12
- type: String,
13
- required: true,
14
- },
21
+ import { computed } from "#imports"
22
+ import { useRootStore } from "../../stores/root"
23
+
24
+ const rootStore = useRootStore()
25
+ const props = defineProps({
26
+ item: { type: Object, required: true },
27
+ pathPrefix: { type: String, required: true },
28
+ loading: { type: Boolean, default: false },
15
29
  })
30
+
31
+ const isLoading = computed(() => rootStore.loading || props.loading)
16
32
  </script>
17
33
 
18
34
  <style></style>
@@ -1,18 +1,34 @@
1
1
  <template>
2
- {{ item }}
2
+ <v-row
3
+ class="my-2 highlight-on-hover"
4
+ no-gutters
5
+ @click="$router.push(pathPrefix)"
6
+ >
7
+ <v-col cols="12" class="px-4">
8
+ <v-skeleton-loader v-if="isLoading" type="heading, text@6" />
9
+ <template v-else>
10
+ <div class="text-h5">{{ item.name }}</div>
11
+ <div v-if="item.summary" class="text-body-1 mt-1">
12
+ <MDC :value="item.summary" />
13
+ </div>
14
+ </template>
15
+ </v-col>
16
+ </v-row>
17
+ <v-divider />
3
18
  </template>
4
19
 
5
20
  <script setup>
6
- defineProps({
7
- item: {
8
- type: Object,
9
- required: true,
10
- },
11
- pathPrefix: {
12
- type: String,
13
- required: true,
14
- },
21
+ import { computed } from "#imports"
22
+ import { useRootStore } from "../../stores/root"
23
+
24
+ const rootStore = useRootStore()
25
+ const props = defineProps({
26
+ item: { type: Object, required: true },
27
+ pathPrefix: { type: String, required: true },
28
+ loading: { type: Boolean, default: false },
15
29
  })
30
+
31
+ const isLoading = computed(() => rootStore.loading || props.loading)
16
32
  </script>
17
33
 
18
34
  <style></style>
@@ -1,18 +1,34 @@
1
1
  <template>
2
- {{ item }}
2
+ <v-row
3
+ class="highlight-on-hover pa-3"
4
+ no-gutters
5
+ @click="$router.push(pathPrefix)"
6
+ >
7
+ <v-col cols="12" class="px-6">
8
+ <v-skeleton-loader v-if="isLoading" type="heading, text@8, button" />
9
+ <template v-else>
10
+ <div class="text-h5">{{ item.name }}</div>
11
+ <div v-if="item.summary" class="mt-2">
12
+ <MDC :value="item.summary" />
13
+ </div>
14
+ </template>
15
+ </v-col>
16
+ </v-row>
17
+ <v-divider />
3
18
  </template>
4
19
 
5
20
  <script setup>
6
- defineProps({
7
- item: {
8
- type: Object,
9
- required: true,
10
- },
11
- pathPrefix: {
12
- type: String,
13
- required: true,
14
- },
21
+ import { computed } from "#imports"
22
+ import { useRootStore } from "../../stores/root"
23
+
24
+ const rootStore = useRootStore()
25
+ const props = defineProps({
26
+ item: { type: Object, required: true },
27
+ pathPrefix: { type: String, required: true },
28
+ loading: { type: Boolean, default: false },
15
29
  })
30
+
31
+ const isLoading = computed(() => rootStore.loading || props.loading)
16
32
  </script>
17
33
 
18
34
  <style></style>
@@ -1,18 +1,34 @@
1
1
  <template>
2
- {{ item }}
2
+ <v-row
3
+ class="my-2 highlight-on-hover"
4
+ no-gutters
5
+ @click="$router.push(pathPrefix)"
6
+ >
7
+ <v-col cols="12" class="px-4">
8
+ <v-skeleton-loader v-if="isLoading" type="heading, text@6" />
9
+ <template v-else>
10
+ <div class="text-h5">{{ item.name }}</div>
11
+ <div v-if="item.summary" class="text-body-1 mt-1">
12
+ <MDC :value="item.summary" />
13
+ </div>
14
+ </template>
15
+ </v-col>
16
+ </v-row>
17
+ <v-divider />
3
18
  </template>
4
19
 
5
20
  <script setup>
6
- defineProps({
7
- item: {
8
- type: Object,
9
- required: true,
10
- },
11
- pathPrefix: {
12
- type: String,
13
- required: true,
14
- },
21
+ import { computed } from "#imports"
22
+ import { useRootStore } from "../../stores/root"
23
+
24
+ const rootStore = useRootStore()
25
+ const props = defineProps({
26
+ item: { type: Object, required: true },
27
+ pathPrefix: { type: String, required: true },
28
+ loading: { type: Boolean, default: false },
15
29
  })
30
+
31
+ const isLoading = computed(() => rootStore.loading || props.loading)
16
32
  </script>
17
33
 
18
34
  <style></style>
@@ -1,18 +1,34 @@
1
1
  <template>
2
- {{ item }}
2
+ <v-row
3
+ class="highlight-on-hover pa-3"
4
+ no-gutters
5
+ @click="$router.push(pathPrefix)"
6
+ >
7
+ <v-col cols="12" class="px-6">
8
+ <v-skeleton-loader v-if="isLoading" type="heading, text@8, button" />
9
+ <template v-else>
10
+ <div class="text-h5">{{ item.name }}</div>
11
+ <div v-if="item.summary" class="mt-2">
12
+ <MDC :value="item.summary" />
13
+ </div>
14
+ </template>
15
+ </v-col>
16
+ </v-row>
17
+ <v-divider />
3
18
  </template>
4
19
 
5
20
  <script setup>
6
- defineProps({
7
- item: {
8
- type: Object,
9
- required: true,
10
- },
11
- pathPrefix: {
12
- type: String,
13
- required: true,
14
- },
21
+ import { computed } from "#imports"
22
+ import { useRootStore } from "../../stores/root"
23
+
24
+ const rootStore = useRootStore()
25
+ const props = defineProps({
26
+ item: { type: Object, required: true },
27
+ pathPrefix: { type: String, required: true },
28
+ loading: { type: Boolean, default: false },
15
29
  })
30
+
31
+ const isLoading = computed(() => rootStore.loading || props.loading)
16
32
  </script>
17
33
 
18
34
  <style></style>
@@ -3,7 +3,7 @@
3
3
  <v-col v-if="mdAndUp" cols="1">
4
4
  <MiscAtomsDateStamp
5
5
  v-if="item.start"
6
- :loading="$stores['events'].loading"
6
+ :loading="isLoading"
7
7
  :date-start="item.start"
8
8
  :date-stop="item.stop"
9
9
  class="pr-6 mt-md-2"
@@ -12,7 +12,7 @@
12
12
  <v-col v-if="mdAndUp" cols="1">
13
13
  <MiscAtomsImageContainer
14
14
  cover
15
- :loading="$stores.events.loading"
15
+ :loading="isLoading"
16
16
  :src="
17
17
  item && item.image && item.image.url ? item.image.url : '/default.png'
18
18
  "
@@ -67,12 +67,14 @@
67
67
  </template>
68
68
 
69
69
  <script setup>
70
- import { useI18n, useNuxtApp } from "#imports"
70
+ import { useI18n, useNuxtApp, computed } from "#imports"
71
71
  import { useDisplay } from "vuetify"
72
+ import { useRootStore } from "../../stores/root"
72
73
  const { $rootStore } = useNuxtApp()
73
74
  const { smAndDown, mdAndUp } = useDisplay()
74
75
 
75
76
  const { locale } = useI18n()
77
+ const rootStore = useRootStore()
76
78
  const props = defineProps({
77
79
  item: {
78
80
  type: Object,
@@ -86,7 +88,14 @@ const props = defineProps({
86
88
  type: String,
87
89
  required: true,
88
90
  },
91
+ loading: {
92
+ type: Boolean,
93
+ required: false,
94
+ default: false,
95
+ },
89
96
  })
97
+
98
+ const isLoading = computed(() => props.loading)
90
99
  </script>
91
100
  <!-- <NuxtLink
92
101
  v-if="item && item.slug"
@@ -5,7 +5,7 @@
5
5
  <v-col cols="12" md="1">
6
6
  <MiscAtomsDateStamp
7
7
  v-if="item.start"
8
- :loading="$stores['events'].loading"
8
+ :loading="isLoading"
9
9
  :date-start="item.start"
10
10
  :date-stop="item.stop"
11
11
  class="pr-6 mt-md-2"
@@ -15,7 +15,7 @@
15
15
  <v-row no-gutters>
16
16
  <v-col cols="12" class="pr-lg-6">
17
17
  <v-skeleton-loader
18
- v-if="rootStore.loading || $stores['events'].loading"
18
+ v-if="isLoading"
19
19
  :type="
20
20
  [
21
21
  'heading, subtitle, text@6,subtitle, text, ossein, button, button',
@@ -61,7 +61,7 @@
61
61
  >
62
62
  <v-col cols="12">
63
63
  <v-skeleton-loader
64
- v-if="rootStore.loading || $stores['events'].loading"
64
+ v-if="isLoading"
65
65
  :type="
66
66
  ['article, heading, text, heading, text, button, button'][
67
67
  ['md'].indexOf(name || 'md')
@@ -78,7 +78,7 @@
78
78
  <v-col cols="12" md="4">
79
79
  <MiscAtomsImageContainer
80
80
  cover
81
- :loading="$stores['events'].loading"
81
+ :loading="isLoading"
82
82
  :src="item.image && item.image.url ? item.image : '/default.png'"
83
83
  :ratio="1 / 1"
84
84
  />
@@ -89,7 +89,7 @@
89
89
  <script setup>
90
90
  import { useDisplay } from "vuetify"
91
91
  import { useRootStore } from "../../stores/root"
92
- import { useNuxtApp } from "#imports"
92
+ import { useNuxtApp, computed } from "#imports"
93
93
 
94
94
  const { name, mdAndDown, lgAndUp } = useDisplay()
95
95
 
@@ -108,5 +108,12 @@ const props = defineProps({
108
108
  type: String,
109
109
  required: true,
110
110
  },
111
+ loading: {
112
+ type: Boolean,
113
+ required: false,
114
+ default: false,
115
+ },
111
116
  })
117
+
118
+ const isLoading = computed(() => rootStore.loading || props.loading)
112
119
  </script>
@@ -1,7 +1,9 @@
1
1
  <template>
2
2
  <v-row v-ripple no-gutters class="cursor-pointer highlight-on-hover">
3
3
  <v-col align-self="center" cols="8" class="text-h5 dense">
4
+ <v-skeleton-loader v-if="isLoading" type="heading" />
4
5
  <div
6
+ v-else
5
7
  v-html="
6
8
  $rootStore.search.length
7
9
  ? highlightAndTruncate(300, item.name, $rootStore.search.split(' '))
@@ -11,7 +13,9 @@
11
13
  <FellowshipsBadges :item="item" />
12
14
  </v-col>
13
15
  <v-col align-self="center" cols="4">
16
+ <v-skeleton-loader v-if="isLoading" type="chip@3" class="mt-2" />
14
17
  <MiscMoleculesChipContainer
18
+ v-else
15
19
  :items="[
16
20
  $t('list.filters.fellowships.fellowshipType.' + item.fellowshipType),
17
21
  ...(props.item && props.item.disciplines
@@ -26,6 +30,8 @@
26
30
 
27
31
  <script setup>
28
32
  import { useNuxtApp } from "#imports"
33
+ import { useRootStore } from "../../stores/root"
34
+ import { computed } from "#imports"
29
35
  const { $rootStore } = useNuxtApp()
30
36
 
31
37
  const props = defineProps({
@@ -42,5 +48,13 @@ const props = defineProps({
42
48
  type: String,
43
49
  required: true,
44
50
  },
51
+ loading: {
52
+ type: Boolean,
53
+ required: false,
54
+ default: false,
55
+ },
45
56
  })
57
+
58
+ const rootStore = useRootStore()
59
+ const isLoading = computed(() => rootStore.loading || props.loading)
46
60
  </script>