OrganizationDetailView.vue 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <!-- Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/ -->
  2. <script setup lang="ts">
  3. import { computed } from 'vue'
  4. import CommonOrganizationAvatar from '#shared/components/CommonOrganizationAvatar/CommonOrganizationAvatar.vue'
  5. import type { AvatarOrganization } from '#shared/components/CommonOrganizationAvatar/index.ts'
  6. import ObjectAttributes from '#shared/components/ObjectAttributes/ObjectAttributes.vue'
  7. import { useOnlineNotificationSeen } from '#shared/composables/useOnlineNotificationSeen.ts'
  8. import CommonLoader from '#mobile/components/CommonLoader/CommonLoader.vue'
  9. import CommonTicketStateList from '#mobile/components/CommonTicketStateList/CommonTicketStateList.vue'
  10. import OrganizationMembersList from '#mobile/components/Organization/OrganizationMembersList.vue'
  11. import { useHeader } from '#mobile/composables/useHeader.ts'
  12. import { useOrganizationDetail } from '#mobile/entities/organization/composables/useOrganizationDetail.ts'
  13. import { useOrganizationEdit } from '#mobile/entities/organization/composables/useOrganizationEdit.ts'
  14. import { useOrganizationTicketsCount } from '#mobile/entities/organization/composables/useOrganizationTicketsCount.ts'
  15. interface Props {
  16. internalId: number
  17. }
  18. const props = defineProps<Props>()
  19. const {
  20. organization,
  21. loading,
  22. objectAttributes,
  23. organizationQuery,
  24. loadAllMembers,
  25. loadOrganization,
  26. } = useOrganizationDetail()
  27. loadOrganization(props.internalId)
  28. useOnlineNotificationSeen(organization)
  29. const { openEditOrganizationDialog } = useOrganizationEdit()
  30. useHeader({
  31. title: __('Organization'),
  32. backUrl: '/',
  33. actionTitle: __('Edit'),
  34. actionHidden: computed(
  35. () => organization.value == null || !organization.value.policy.update,
  36. ),
  37. refetch: computed(
  38. () => organization.value != null && organizationQuery.loading().value,
  39. ),
  40. onAction() {
  41. if (!organization.value || !organization.value.policy.update) return
  42. openEditOrganizationDialog(organization.value)
  43. },
  44. })
  45. const { getTicketData } = useOrganizationTicketsCount()
  46. const ticketData = computed(() => getTicketData(organization.value))
  47. </script>
  48. <template>
  49. <div v-if="organization" class="px-4">
  50. <div class="flex flex-col items-center justify-center py-6">
  51. <div>
  52. <CommonOrganizationAvatar
  53. :entity="organization as AvatarOrganization"
  54. size="xl"
  55. />
  56. </div>
  57. <div class="mt-2 text-xl font-bold">
  58. {{ organization.name }}
  59. </div>
  60. </div>
  61. <ObjectAttributes
  62. :object="organization"
  63. :attributes="objectAttributes"
  64. :skip-attributes="['name']"
  65. />
  66. <OrganizationMembersList
  67. :organization="organization"
  68. :disable-show-more="loading"
  69. @load-more="loadAllMembers()"
  70. />
  71. <CommonTicketStateList
  72. v-if="ticketData"
  73. :create-link="ticketData.createLink"
  74. :create-label="ticketData.createLabel"
  75. :counts="ticketData.count"
  76. :tickets-link-query="ticketData.query"
  77. />
  78. </div>
  79. <CommonLoader v-else-if="loading" class="w-full p-4" :loading="loading" />
  80. </template>