SiteList.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <script setup lang="tsx">
  2. import type { EnvGroup } from '@/api/env_group'
  3. import type { Site } from '@/api/site'
  4. import type { Column } from '@/components/StdDesign/types'
  5. import env_group from '@/api/env_group'
  6. import site from '@/api/site'
  7. import EnvGroupTabs from '@/components/EnvGroupTabs/EnvGroupTabs.vue'
  8. import StdBatchEdit from '@/components/StdDesign/StdDataDisplay/StdBatchEdit.vue'
  9. import StdTable from '@/components/StdDesign/StdDataDisplay/StdTable.vue'
  10. import { useIndexStatus } from '@/composables/useIndexStatus'
  11. import { ConfigStatus } from '@/constants'
  12. import InspectConfig from '@/views/config/InspectConfig.vue'
  13. import columns from '@/views/site/site_list/columns'
  14. import SiteDuplicate from '@/views/site/site_list/SiteDuplicate.vue'
  15. import { CheckCircleOutlined, LoadingOutlined } from '@ant-design/icons-vue'
  16. import { message } from 'ant-design-vue'
  17. const route = useRoute()
  18. const router = useRouter()
  19. const table = ref()
  20. const inspectConfig = ref()
  21. const envGroupId = ref(Number.parseInt(route.query.env_group_id as string) || 0)
  22. const envGroups = ref([]) as Ref<EnvGroup[]>
  23. const { isScanning } = useIndexStatus()
  24. watch(route, () => {
  25. inspectConfig.value?.test()
  26. })
  27. onMounted(async () => {
  28. while (true) {
  29. try {
  30. const { data, pagination } = await env_group.get_list()
  31. if (!data || !pagination)
  32. return
  33. envGroups.value.push(...data)
  34. if (data.length < pagination?.per_page) {
  35. return
  36. }
  37. }
  38. catch {
  39. return
  40. }
  41. }
  42. })
  43. function destroy(site_name: string) {
  44. site.destroy(site_name).then(() => {
  45. table.value.get_list()
  46. message.success($gettext('Delete site: %{site_name}', { site_name }))
  47. inspectConfig.value?.test()
  48. })
  49. }
  50. const show_duplicator = ref(false)
  51. const target = ref('')
  52. function handle_click_duplicate(name: string) {
  53. show_duplicator.value = true
  54. target.value = name
  55. }
  56. const stdBatchEditRef = useTemplateRef('stdBatchEditRef')
  57. async function handleClickBatchEdit(batchColumns: Column[], selectedRowKeys: string[], selectedRows: Site[]) {
  58. stdBatchEditRef.value?.showModal(batchColumns, selectedRowKeys, selectedRows)
  59. }
  60. function handleBatchUpdated() {
  61. table.value?.get_list()
  62. table.value?.resetSelection()
  63. }
  64. </script>
  65. <template>
  66. <ACard :title="$gettext('Manage Sites')">
  67. <template #extra>
  68. <div class="flex items-center cursor-default">
  69. <template v-if="isScanning">
  70. <LoadingOutlined class="mr-2" spin />{{ $gettext('Indexing...') }}
  71. </template>
  72. <template v-else>
  73. <CheckCircleOutlined class="mr-2" />{{ $gettext('Indexed') }}
  74. </template>
  75. </div>
  76. </template>
  77. <InspectConfig ref="inspectConfig" />
  78. <EnvGroupTabs v-model:active-key="envGroupId" :env-groups="envGroups" />
  79. <StdTable
  80. ref="table"
  81. :api="site"
  82. :columns="columns"
  83. row-key="name"
  84. disable-delete
  85. disable-view
  86. :get-params="{
  87. env_group_id: envGroupId,
  88. }"
  89. :scroll-x="1600"
  90. @click-edit="(r: string) => router.push({
  91. path: `/sites/${encodeURIComponent(r)}`,
  92. })"
  93. @click-batch-modify="handleClickBatchEdit"
  94. >
  95. <template #actions="{ record }">
  96. <AButton
  97. type="link"
  98. size="small"
  99. @click="handle_click_duplicate(record.name)"
  100. >
  101. {{ $gettext('Duplicate') }}
  102. </AButton>
  103. <APopconfirm
  104. :cancel-text="$gettext('No')"
  105. :ok-text="$gettext('OK')"
  106. :title="$gettext('Are you sure you want to delete?')"
  107. :disabled="record.status !== ConfigStatus.Disabled"
  108. @confirm="destroy(record.name)"
  109. >
  110. <AButton
  111. type="link"
  112. size="small"
  113. :disabled="record.status !== ConfigStatus.Disabled"
  114. >
  115. {{ $gettext('Delete') }}
  116. </AButton>
  117. </APopconfirm>
  118. </template>
  119. </StdTable>
  120. <StdBatchEdit
  121. ref="stdBatchEditRef"
  122. :api="site"
  123. :columns
  124. @save="handleBatchUpdated"
  125. />
  126. <SiteDuplicate
  127. v-model:visible="show_duplicator"
  128. :name="target"
  129. @duplicated="() => table.get_list()"
  130. />
  131. </ACard>
  132. </template>
  133. <style scoped>
  134. </style>