CommonSimpleEntityList.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <!-- Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/ -->
  2. <script setup lang="ts" generic="T">
  3. import { computed } from 'vue'
  4. import type { ObjectLike } from '#shared/types/utils.ts'
  5. import CommonShowMoreButton from '#desktop/components/CommonShowMoreButton/CommonShowMoreButton.vue'
  6. import entityModules from '#desktop/components/CommonSimpleEntityList/plugins/index.ts'
  7. import {
  8. type Entity,
  9. EntityType,
  10. } from '#desktop/components/CommonSimpleEntityList/types.ts'
  11. interface Props {
  12. entity: Entity<ObjectLike>
  13. type: EntityType
  14. label?: string
  15. }
  16. const props = defineProps<Props>()
  17. defineEmits<{
  18. 'load-more': []
  19. }>()
  20. const entitySetup = computed(() => {
  21. const { component, ...context } = entityModules[props.type]
  22. return {
  23. component,
  24. context,
  25. array: props.entity.array,
  26. }
  27. })
  28. </script>
  29. <template>
  30. <div class="flex flex-col gap-1.5">
  31. <CommonLabel
  32. v-if="label"
  33. class="-:inline-flex items-center text-xs leading-snug text-stone-200 dark:text-neutral-500"
  34. >
  35. {{ label }}
  36. </CommonLabel>
  37. <ul v-if="entity.array?.length" class="flex flex-col gap-1.5">
  38. <li v-for="item in entitySetup.array" :key="`entity-${item.id}`">
  39. <component
  40. :is="entitySetup.component"
  41. :entity="item"
  42. :context="entitySetup.context"
  43. />
  44. </li>
  45. </ul>
  46. <CommonLabel v-if="!entity.array?.length" class="block"
  47. >{{ entitySetup.context.emptyMessage }}
  48. </CommonLabel>
  49. <CommonShowMoreButton
  50. v-if="entity"
  51. class="self-end"
  52. :entities="entity.array"
  53. :total-count="entity.totalCount"
  54. @click="$emit('load-more')"
  55. />
  56. </div>
  57. </template>