From 92ccc3eb7db114c348600ef06008af4616930861 Mon Sep 17 00:00:00 2001 From: hLinx <327159425@qq.com> Date: Thu, 26 Dec 2024 18:15:26 +0800 Subject: [PATCH] =?UTF-8?q?perf(frontend):=20=E5=8D=95=E6=8D=AE=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=94=AF=E6=8C=81=20ctrl=20=E6=96=B0=E5=BC=80?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=9F=A5=E7=9C=8B=E5=8D=95=E6=8D=AE=E8=AF=A6?= =?UTF-8?q?=E6=83=85=20#8852?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/list/components/TableMode.vue | 35 ++++------------- .../common/hooks/use-open-detail.ts | 39 +++++++++++++++++++ .../components/list/components/TableMode.vue | 35 ++++------------- .../components/list/components/TableMode.vue | 35 ++++------------- .../components/list/components/TableMode.vue | 35 ++++------------- .../components/list/components/TableMode.vue | 24 +++--------- 6 files changed, 77 insertions(+), 126 deletions(-) create mode 100644 dbm-ui/frontend/src/views/ticket-center/common/hooks/use-open-detail.ts diff --git a/dbm-ui/frontend/src/views/ticket-center/business/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-center/business/components/list/components/TableMode.vue index b581575930..7e8c678896 100644 --- a/dbm-ui/frontend/src/views/ticket-center/business/components/list/components/TableMode.vue +++ b/dbm-ui/frontend/src/views/ticket-center/business/components/list/components/TableMode.vue @@ -31,7 +31,7 @@ v-if="data" text theme="primary" - @click="() => handleShowDetail(data)"> + @click="(event: MouseEvent) => handleGoDetail(data, event)"> {{ data.id }} </BkButton> </template> @@ -57,16 +57,17 @@ </div> </template> <script setup lang="ts"> - import { getCurrentInstance, onActivated, onDeactivated } from 'vue'; + import { onActivated } from 'vue'; import { useI18n } from 'vue-i18n'; - import { useRoute, useRouter } from 'vue-router'; + import { useRoute } from 'vue-router'; import TicketModel from '@services/model/ticket/ticket'; import { getTickets } from '@services/source/ticket'; - import { useStretchLayout, useUrlSearch } from '@hooks'; + import { useUrlSearch } from '@hooks'; import useDatePicker from '@views/ticket-center/common/hooks/use-date-picker'; + import useOpenDetail from '@views/ticket-center/common/hooks/use-open-detail'; import useSearchSelect from '@views/ticket-center/common/hooks/use-search-select'; import TableModeTable from '@views/ticket-center/common/TableModeTable.vue'; import TicketClone from '@views/ticket-center/common/TicketClone.vue'; @@ -74,13 +75,10 @@ type IRowData = TicketModel; - const router = useRouter(); const route = useRoute(); const { t } = useI18n(); - const currentInstance = getCurrentInstance(); - const { getSearchParams, removeSearchParam } = useUrlSearch(); - const { splitScreen: stretchLayoutSplitScreen } = useStretchLayout(); + const { removeSearchParam } = useUrlSearch(); const { value: datePickerValue, shortcutsRange } = useDatePicker(); @@ -88,6 +86,8 @@ exclude: ['bk_biz_id'], }); + const handleGoDetail = useOpenDetail(); + const dataSource = (params: ServiceParameters<typeof getTickets>) => getTickets({ ...params, @@ -98,29 +98,10 @@ const rowClass = (params: TicketModel) => (params.id === selectTicketId.value ? 'select-row' : ''); - const handleShowDetail = (data: IRowData) => { - stretchLayoutSplitScreen(); - selectTicketId.value = data.id; - }; - onActivated(() => { selectTicketId.value = Number(route.query.selectId); removeSearchParam('selectId'); }); - - onDeactivated(() => { - setTimeout(() => { - if (currentInstance!.isUnmounted) { - return; - } - router.replace({ - params: { - ticketId: selectTicketId.value, - }, - query: getSearchParams(), - }); - }); - }); </script> <style lang="less"> .ticket-list-table-mode { diff --git a/dbm-ui/frontend/src/views/ticket-center/common/hooks/use-open-detail.ts b/dbm-ui/frontend/src/views/ticket-center/common/hooks/use-open-detail.ts new file mode 100644 index 0000000000..1538232653 --- /dev/null +++ b/dbm-ui/frontend/src/views/ticket-center/common/hooks/use-open-detail.ts @@ -0,0 +1,39 @@ +import { getCurrentInstance } from 'vue'; +import { useRouter } from 'vue-router'; + +import TicketModel from '@services/model/ticket/ticket'; + +import { useStretchLayout, useUrlSearch } from '@hooks'; + +export default () => { + const { splitScreen: stretchLayoutSplitScreen } = useStretchLayout(); + + const currentInstance = getCurrentInstance(); + const router = useRouter(); + const { getSearchParams } = useUrlSearch(); + + return (ticketData: TicketModel, event: MouseEvent) => { + if (event.ctrlKey || event.metaKey) { + const { href } = router.resolve({ + name: 'ticketDetail', + params: { + ticketId: ticketData.id, + }, + }); + return window.open(href); + } + + stretchLayoutSplitScreen(); + setTimeout(() => { + if (currentInstance!.isUnmounted) { + return; + } + router.replace({ + params: { + ticketId: ticketData.id, + }, + query: getSearchParams(), + }); + }); + }; +}; diff --git a/dbm-ui/frontend/src/views/ticket-center/self-apply/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-center/self-apply/components/list/components/TableMode.vue index e86fa3dc6c..0fb09d7015 100644 --- a/dbm-ui/frontend/src/views/ticket-center/self-apply/components/list/components/TableMode.vue +++ b/dbm-ui/frontend/src/views/ticket-center/self-apply/components/list/components/TableMode.vue @@ -31,7 +31,7 @@ v-if="data" text theme="primary" - @click="() => handleShowDetail(data)"> + @click="(event: MouseEvent) => handleGoDetail(data, event)"> {{ data.id }} </BkButton> </template> @@ -58,16 +58,17 @@ </div> </template> <script setup lang="ts"> - import { getCurrentInstance, onActivated, onDeactivated } from 'vue'; + import { onActivated } from 'vue'; import { useI18n } from 'vue-i18n'; - import { useRoute, useRouter } from 'vue-router'; + import { useRoute } from 'vue-router'; import TicketModel from '@services/model/ticket/ticket'; import { getTickets } from '@services/source/ticket'; - import { useStretchLayout, useUrlSearch } from '@hooks'; + import { useUrlSearch } from '@hooks'; import useDatePicker from '@views/ticket-center/common/hooks/use-date-picker'; + import useOpenDetail from '@views/ticket-center/common/hooks/use-open-detail'; import useSearchSelect from '@views/ticket-center/common/hooks/use-search-select'; import TableModeTable from '@views/ticket-center/common/TableModeTable.vue'; import TicketClone from '@views/ticket-center/common/TicketClone.vue'; @@ -75,18 +76,17 @@ type IRowData = TicketModel<unknown>; - const router = useRouter(); const route = useRoute(); const { t } = useI18n(); - const currentInstance = getCurrentInstance(); - const { getSearchParams, removeSearchParam } = useUrlSearch(); - const { splitScreen: stretchLayoutSplitScreen } = useStretchLayout(); + const { removeSearchParam } = useUrlSearch(); const { value: datePickerValue, shortcutsRange } = useDatePicker(); const { value: searachSelectValue, searchSelectData } = useSearchSelect(); + const handleGoDetail = useOpenDetail(); + const dataSource = (params: ServiceParameters<typeof getTickets>) => getTickets({ ...params, @@ -97,29 +97,10 @@ const rowClass = (params: TicketModel) => (params.id === selectTicketId.value ? 'select-row' : ''); - const handleShowDetail = (data: IRowData) => { - stretchLayoutSplitScreen(); - selectTicketId.value = data.id; - }; - onActivated(() => { selectTicketId.value = Number(route.query.selectId); removeSearchParam('selectId'); }); - - onDeactivated(() => { - setTimeout(() => { - if (currentInstance!.isUnmounted) { - return; - } - router.replace({ - params: { - ticketId: selectTicketId.value, - }, - query: getSearchParams(), - }); - }); - }); </script> <style lang="less"> .ticket-list-table-mode { diff --git a/dbm-ui/frontend/src/views/ticket-center/self-done/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-center/self-done/components/list/components/TableMode.vue index 6e230e9de7..601b6cf9f0 100644 --- a/dbm-ui/frontend/src/views/ticket-center/self-done/components/list/components/TableMode.vue +++ b/dbm-ui/frontend/src/views/ticket-center/self-done/components/list/components/TableMode.vue @@ -31,7 +31,7 @@ v-if="data" text theme="primary" - @click="() => handleShowDetail(data)"> + @click="(event: MouseEvent) => handleGoDetail(data, event)"> {{ data.id }} </BkButton> </template> @@ -53,34 +53,34 @@ </div> </template> <script setup lang="ts"> - import { getCurrentInstance, onActivated, onDeactivated } from 'vue'; + import { onActivated } from 'vue'; import { useI18n } from 'vue-i18n'; - import { useRoute, useRouter } from 'vue-router'; + import { useRoute } from 'vue-router'; import TicketModel from '@services/model/ticket/ticket'; import { getTickets } from '@services/source/ticket'; - import { useStretchLayout, useUrlSearch } from '@hooks'; + import { useUrlSearch } from '@hooks'; import useDatePicker from '@views/ticket-center/common/hooks/use-date-picker'; + import useOpenDetail from '@views/ticket-center/common/hooks/use-open-detail'; import useSearchSelect from '@views/ticket-center/common/hooks/use-search-select'; import TableModeTable from '@views/ticket-center/common/TableModeTable.vue'; import TicketDetailLink from '@views/ticket-center/common/TicketDetailLink.vue'; type IRowData = TicketModel<unknown>; - const router = useRouter(); const route = useRoute(); const { t } = useI18n(); - const currentInstance = getCurrentInstance(); - const { getSearchParams, removeSearchParam } = useUrlSearch(); - const { splitScreen: stretchLayoutSplitScreen } = useStretchLayout(); + const { removeSearchParam } = useUrlSearch(); const { value: datePickerValue, shortcutsRange } = useDatePicker(); const { value: searachSelectValue, searchSelectData } = useSearchSelect(); + const handleGoDetail = useOpenDetail(); + const dataSource = (params: ServiceParameters<typeof getTickets>) => getTickets({ ...params, @@ -91,29 +91,10 @@ const rowClass = (params: TicketModel) => (params.id === selectTicketId.value ? 'select-row' : ''); - const handleShowDetail = (data: IRowData) => { - stretchLayoutSplitScreen(); - selectTicketId.value = data.id; - }; - onActivated(() => { selectTicketId.value = Number(route.query.selectId); removeSearchParam('selectId'); }); - - onDeactivated(() => { - setTimeout(() => { - if (currentInstance!.isUnmounted) { - return; - } - router.replace({ - params: { - ticketId: selectTicketId.value, - }, - query: getSearchParams(), - }); - }); - }); </script> <style lang="less"> .ticket-self-done-list-table-mode { diff --git a/dbm-ui/frontend/src/views/ticket-center/self-manage/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-center/self-manage/components/list/components/TableMode.vue index 932428b003..48eea48f5a 100644 --- a/dbm-ui/frontend/src/views/ticket-center/self-manage/components/list/components/TableMode.vue +++ b/dbm-ui/frontend/src/views/ticket-center/self-manage/components/list/components/TableMode.vue @@ -31,7 +31,7 @@ v-if="data" text theme="primary" - @click="() => handleShowDetail(data)"> + @click="(event: MouseEvent) => handleGoDetail(data, event)"> {{ data.id }} </BkButton> </template> @@ -53,34 +53,34 @@ </div> </template> <script setup lang="ts"> - import { getCurrentInstance, onActivated, onDeactivated } from 'vue'; + import { onActivated } from 'vue'; import { useI18n } from 'vue-i18n'; - import { useRoute, useRouter } from 'vue-router'; + import { useRoute } from 'vue-router'; import TicketModel from '@services/model/ticket/ticket'; import { getTickets } from '@services/source/ticket'; - import { useStretchLayout, useUrlSearch } from '@hooks'; + import { useUrlSearch } from '@hooks'; import useDatePicker from '@views/ticket-center/common/hooks/use-date-picker'; + import useOpenDetail from '@views/ticket-center/common/hooks/use-open-detail'; import useSearchSelect from '@views/ticket-center/common/hooks/use-search-select'; import TableModeTable from '@views/ticket-center/common/TableModeTable.vue'; import TicketDetailLink from '@views/ticket-center/common/TicketDetailLink.vue'; type IRowData = TicketModel<unknown>; - const router = useRouter(); const route = useRoute(); const { t } = useI18n(); - const currentInstance = getCurrentInstance(); - const { getSearchParams, removeSearchParam } = useUrlSearch(); - const { splitScreen: stretchLayoutSplitScreen } = useStretchLayout(); + const { removeSearchParam } = useUrlSearch(); const { value: datePickerValue, shortcutsRange } = useDatePicker(); const { value: searachSelectValue, searchSelectData } = useSearchSelect(); + const handleGoDetail = useOpenDetail(); + const dataSource = (params: ServiceParameters<typeof getTickets>) => getTickets({ ...params, @@ -91,29 +91,10 @@ const rowClass = (params: TicketModel) => (params.id === selectTicketId.value ? 'select-row' : ''); - const handleShowDetail = (data: IRowData) => { - stretchLayoutSplitScreen(); - selectTicketId.value = data.id; - }; - onActivated(() => { selectTicketId.value = Number(route.query.selectId); removeSearchParam('selectId'); }); - - onDeactivated(() => { - setTimeout(() => { - if (currentInstance!.isUnmounted) { - return; - } - router.replace({ - params: { - ticketId: selectTicketId.value, - }, - query: getSearchParams(), - }); - }); - }); </script> <style lang="less"> .ticket-list-table-mode { diff --git a/dbm-ui/frontend/src/views/ticket-center/self-todo/components/list/components/TableMode.vue b/dbm-ui/frontend/src/views/ticket-center/self-todo/components/list/components/TableMode.vue index b2ae0d5ea3..85e41d44ff 100644 --- a/dbm-ui/frontend/src/views/ticket-center/self-todo/components/list/components/TableMode.vue +++ b/dbm-ui/frontend/src/views/ticket-center/self-todo/components/list/components/TableMode.vue @@ -48,7 +48,7 @@ v-if="data" text theme="primary" - @click="() => handleShowDetail(data)"> + @click="(event: MouseEvent) => handleGoDetail(data, event)"> {{ data.id }} </BkButton> </template> @@ -73,7 +73,7 @@ </div> </template> <script setup lang="ts"> - import { getCurrentInstance, onActivated, onDeactivated, ref, shallowRef, useTemplateRef } from 'vue'; + import { onActivated, onDeactivated, ref, shallowRef, useTemplateRef } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRoute, useRouter } from 'vue-router'; @@ -83,6 +83,7 @@ import { useStretchLayout, useUrlSearch } from '@hooks'; import useDatePicker from '@views/ticket-center/common/hooks/use-date-picker'; + import useOpenDetail from '@views/ticket-center/common/hooks/use-open-detail'; import useSearchSelect from '@views/ticket-center/common/hooks/use-search-select'; import TableModeTable from '@views/ticket-center/common/TableModeTable.vue'; @@ -94,11 +95,10 @@ const router = useRouter(); const { t } = useI18n(); - const currentInstance = getCurrentInstance(); const { list: statusList, defaultStatus: ticketStatus } = useStatusList(); - const { getSearchParams, removeSearchParam } = useUrlSearch(); + const { removeSearchParam } = useUrlSearch(); const { splitScreen: stretchLayoutSplitScreen } = useStretchLayout(); const { value: datePickerValue, shortcutsRange } = useDatePicker(); @@ -107,6 +107,8 @@ exclude: ['status'], }); + const handleGoDetail = useOpenDetail(); + const rowClass = (params: TicketModel) => (params.id === selectTicketId.value ? 'select-row' : ''); const dataSource = (params: ServiceParameters<typeof getTickets>) => @@ -118,7 +120,6 @@ }); const dataTableRef = useTemplateRef('dataTable'); - // const ticketStatus = ref(defaultStatus.value); const selectTicketIdList = shallowRef<TicketModel[]>([]); const isShowBatchOperation = ref(false); const selectTicketId = ref(0); @@ -149,7 +150,6 @@ }; onActivated(() => { - // ticketStatus.value = defaultStatus.value; selectTicketId.value = Number(route.query.selectId); removeSearchParam('selectId'); resumeTicketStatus(); @@ -157,18 +157,6 @@ onDeactivated(() => { pauseTicketStatus(); - setTimeout(() => { - if (currentInstance!.isUnmounted) { - return; - } - router.replace({ - params: { - status: ticketStatus.value, - ticketId: selectTicketId.value, - }, - query: getSearchParams(), - }); - }); }); </script> <style lang="less">