From ed5a05709a5cabad6b698b0dbc88a522d31ee5da Mon Sep 17 00:00:00 2001 From: puriphatt Date: Thu, 10 Apr 2025 17:23:19 +0700 Subject: [PATCH] refactor: implement request list action dialog and enhance messenger functionality --- src/pages/08_request-list/MainPage.vue | 45 ++++ .../08_request-list/MessengerExpansion.vue | 4 +- .../08_request-list/RequestListAction .vue | 226 ++++++++++++++++++ src/pages/08_request-list/RequestListView.vue | 5 + .../08_request-list/TableRequestList.vue | 21 ++ 5 files changed, 300 insertions(+), 1 deletion(-) create mode 100644 src/pages/08_request-list/RequestListAction .vue diff --git a/src/pages/08_request-list/MainPage.vue b/src/pages/08_request-list/MainPage.vue index 3c5d5dee..c615b4da 100644 --- a/src/pages/08_request-list/MainPage.vue +++ b/src/pages/08_request-list/MainPage.vue @@ -24,6 +24,8 @@ import { RequestData, RequestDataStatus } from 'src/stores/request-list/types'; import { dialogWarningClose } from 'src/stores/utils'; import { CancelButton, SaveButton } from 'src/components/button'; import { getRole } from 'src/services/keycloak'; +import FloatingActionButton from 'src/components/FloatingActionButton.vue'; +import RequestListAction from './RequestListAction .vue'; const $q = useQuasar(); const navigatorStore = useNavigator(); @@ -32,6 +34,7 @@ const requestListStore = useRequestList(); const { t } = useI18n(); const { data, stats, page, pageMax, pageSize } = storeToRefs(requestListStore); +const requestListActionData = ref(); const refFilter = ref>(); // NOTE: Variable @@ -45,6 +48,7 @@ const pageState = reactive({ rejectCancelDialog: false, rejectCancelReason: '', requestId: '', + requestListActionDialog: false, }); const fieldSelectedOption = computed(() => { @@ -131,6 +135,33 @@ async function submitRejectCancel() { } } +async function openRequestListDialog() { + const ret = await requestListStore.getRequestDataList({ + page: 1, + pageSize: 999, + incomplete: true, + }); + + console.log(ret); + if (ret) { + requestListActionData.value = ret.result; + } + + pageState.requestListActionDialog = true; +} + +async function submitRequestListAction(data: { + form: { responsibleUserLocal: boolean; responsibleUserId: string }; + selected: RequestData[]; +}) { + const res = await requestListStore.updateMessenger( + data.selected.map((v) => v.id), + data.form.responsibleUserId, + ); + + if (res) pageState.requestListActionDialog = false; +} + onMounted(async () => { pageState.gridView = $q.screen.lt.md ? true : false; navigatorStore.current.title = 'requestList.title'; @@ -147,6 +178,13 @@ watch([() => pageState.inputSearch, () => pageState.statusFilter], () => { }); + + diff --git a/src/pages/08_request-list/MessengerExpansion.vue b/src/pages/08_request-list/MessengerExpansion.vue index 24434d89..4b7958cb 100644 --- a/src/pages/08_request-list/MessengerExpansion.vue +++ b/src/pages/08_request-list/MessengerExpansion.vue @@ -13,6 +13,7 @@ const props = defineProps<{ readonly?: boolean; step: Step; responsibleAreaDistrictId?: string; + defaultMessenger?: string; }>(); const emit = defineEmits<{ @@ -85,7 +86,8 @@ function assignToForm() { companyDuty: attributesForm.value.companyDuty ?? false, companyDutyCost: attributesForm.value.companyDutyCost ?? 30, responsibleUserLocal: attributesForm.value.responsibleUserLocal ?? true, - responsibleUserId: attributesForm.value.responsibleUserId ?? '', + responsibleUserId: + attributesForm.value.responsibleUserId || props.defaultMessenger, individualDuty: attributesForm.value.individualDuty ?? false, individualDutyCost: attributesForm.value.individualDutyCost ?? 10, }), diff --git a/src/pages/08_request-list/RequestListAction .vue b/src/pages/08_request-list/RequestListAction .vue new file mode 100644 index 00000000..814f4da3 --- /dev/null +++ b/src/pages/08_request-list/RequestListAction .vue @@ -0,0 +1,226 @@ + + + + diff --git a/src/pages/08_request-list/RequestListView.vue b/src/pages/08_request-list/RequestListView.vue index a908e4d5..94343725 100644 --- a/src/pages/08_request-list/RequestListView.vue +++ b/src/pages/08_request-list/RequestListView.vue @@ -873,6 +873,11 @@ async function submitRejectCancel() { :readonly=" data.requestDataStatus === RequestDataStatus.Canceled " + :default-messenger=" + value.stepStatus[pageState.currentStep - 1] + ? undefined + : data.defaultMessengerId + " :step="{ step: pageState.currentStep, requestWorkId: value.id || '', diff --git a/src/pages/08_request-list/TableRequestList.vue b/src/pages/08_request-list/TableRequestList.vue index 5872f96d..99706193 100644 --- a/src/pages/08_request-list/TableRequestList.vue +++ b/src/pages/08_request-list/TableRequestList.vue @@ -21,6 +21,8 @@ const props = withDefaults( grid?: boolean; visibleColumns?: string[]; hideAction?: boolean; + hideView?: boolean; + checkable?: boolean; }>(), { row: () => [], @@ -36,6 +38,8 @@ defineEmits<{ (e: 'rejectCancel', data: RequestData): void; }>(); +const selected = defineModel('selected'); + function responsiblePerson(quotation: QuotationFull): CreatedBy[] | undefined { const productServiceList = quotation.productServiceList; const tempPerson: CreatedBy[] = []; @@ -106,12 +110,25 @@ function getEmployeeName( card-container-class="q-col-gutter-sm" :rows-per-page-options="[0]" class="full-width" + selection="multiple" + v-model:selected="selected" + :selected-rows-label=" + (n) => + $t('general.selected', { + number: n, + msg: $t('general.list'), + }) + " + :no-data-label="$t('general.noDataTable')" >