jws-frontend/src/components/02_personnel-management/FormInformation.vue

274 lines
7.1 KiB
Vue
Raw Normal View History

2024-04-17 15:44:13 +07:00
<script setup lang="ts">
2024-08-09 15:06:41 +07:00
import useUserStore from 'stores/user';
import { selectFilterOptionRefMod } from 'stores/utils';
2024-07-30 04:04:17 +00:00
import { onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
2024-04-17 15:44:13 +07:00
const userStore = useUserStore();
2024-07-30 04:04:17 +00:00
const { t } = useI18n();
2024-04-17 15:44:13 +07:00
const hqId = defineModel<string | null | undefined>('hqId');
const brId = defineModel<string | null | undefined>('brId');
const userType = defineModel<string>('userType');
const userRole = defineModel<string>('userRole');
2024-04-18 09:05:32 +07:00
const username = defineModel<string | null | undefined>('username');
2024-04-17 15:44:13 +07:00
const userCode = defineModel<string>('userCode');
defineProps<{
2024-08-02 15:31:59 +07:00
title?: string;
2024-04-17 15:44:13 +07:00
dense?: boolean;
outlined?: boolean;
readonly?: boolean;
separator?: boolean;
2024-04-18 09:05:32 +07:00
usernameReadonly?: boolean;
2024-04-17 15:44:13 +07:00
}>();
async function selectHq(id: string) {
if (!id) return;
brId.value = '';
userStore.userOption.brOpts = [];
await userStore.fetchBrOption(id);
2024-04-18 18:18:31 +07:00
if (userStore.userOption.brOpts.length === 1) {
brId.value = userStore.userOption.brOpts[0].value;
}
2024-08-26 17:18:40 +07:00
brFilter = selectFilterOptionRefMod(
ref(userStore.userOption.brOpts),
brOptions,
'label',
);
2024-04-17 15:44:13 +07:00
}
2024-07-30 04:04:17 +00:00
const hqOptions = ref<Record<string, unknown>[]>([]);
const hqFilter = selectFilterOptionRefMod(
ref(userStore.userOption.hqOpts),
hqOptions,
'label',
);
const brOptions = ref<Record<string, unknown>[]>([]);
2024-08-26 17:18:40 +07:00
let brFilter = selectFilterOptionRefMod(
2024-07-30 04:04:17 +00:00
ref(userStore.userOption.brOpts),
brOptions,
'label',
);
const userTypeOptions = ref<Record<string, unknown>[]>([]);
const userTypeFilter = selectFilterOptionRefMod(
ref(
userStore.userOption.userTypeOpts.map((v) => ({
2024-08-26 16:24:08 +07:00
label: t(`personnel.${v.label}`),
2024-07-30 04:04:17 +00:00
value: v.value,
})),
),
userTypeOptions,
'label',
);
const roleOptions = ref<Record<string, unknown>[]>([]);
const roleFilter = selectFilterOptionRefMod(
ref(userStore.userOption.roleOpts),
roleOptions,
'label',
);
onMounted(async () => {
if (userStore.userOption.hqOpts[0].value)
await userStore.fetchBrOption(userStore.userOption.hqOpts[0].value);
});
2024-04-17 15:44:13 +07:00
</script>
<template>
2024-08-02 15:31:59 +07:00
<div class="row col-12">
<div class="col-12 q-pb-sm text-weight-bold text-body1">
<q-icon
flat
size="xs"
class="q-pa-sm rounded q-mr-xs"
color="info"
name="mdi-office-building-outline"
style="background-color: var(--surface-3)"
/>
{{ $t(`${title}`) }}
</div>
2024-08-07 04:17:15 +00:00
<div class="col-12 row q-col-gutter-sm">
2024-08-02 15:31:59 +07:00
<q-select
outlined
clearable
use-input
fill-input
emit-value
map-options
hide-selected
hide-bottom-space
v-model="hqId"
for="select-hq-id"
input-debounce="0"
option-label="label"
option-value="value"
lazy-rules="ondemand"
2024-08-26 16:24:08 +07:00
class="col-md-2 col-12"
2024-08-02 15:31:59 +07:00
:dense="dense"
:readonly="readonly"
:hide-dropdown-icon="readonly"
2024-08-26 16:24:08 +07:00
:label="$t('branch.form.code')"
2024-08-02 15:31:59 +07:00
:options="hqOptions"
2024-08-26 16:24:08 +07:00
:rules="[
(val: string) =>
!!val ||
$t('form.error.selectField', { field: $t('branch.form.code') }),
]"
2024-08-02 15:31:59 +07:00
@update:model-value="(val: string) => selectHq(val)"
@filter="hqFilter"
2024-08-26 17:18:40 +07:00
@clear="
() => {
(hqId = ''), (brId = '');
}
"
2024-08-02 15:31:59 +07:00
>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
2024-08-26 16:24:08 +07:00
{{ $t('general.noData') }}
2024-08-02 15:31:59 +07:00
</q-item-section>
</q-item>
</template>
</q-select>
<q-select
outlined
clearable
use-input
fill-input
emit-value
map-options
hide-selected
hide-bottom-space
for="select-br-id"
input-debounce="0"
option-label="label"
option-value="value"
lazy-rules="ondemand"
2024-08-26 16:24:08 +07:00
class="col-md-2 col-12"
2024-08-02 15:31:59 +07:00
:dense="dense"
:readonly="readonly"
:hide-dropdown-icon="readonly"
2024-08-26 16:24:08 +07:00
:label="$t('branch.form.codeBranch')"
2024-08-02 15:31:59 +07:00
:options="brOptions"
@filter="brFilter"
2024-08-19 14:43:42 +07:00
:model-value="readonly ? brId || '-' : brId"
@update:model-value="(v) => (typeof v === 'string' ? (brId = v) : '')"
@clear="brId = ''"
2024-08-02 15:31:59 +07:00
>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
2024-08-26 16:24:08 +07:00
{{ $t('general.noData') }}
2024-08-02 15:31:59 +07:00
</q-item-section>
</q-item>
</template>
</q-select>
<q-input
lazy-rules="ondemand"
for="input-username"
:dense="dense"
outlined
:readonly="usernameReadonly"
emit-value
map-options
options-dense
hide-bottom-space
2024-08-26 16:24:08 +07:00
class="col-md col-12"
:label="$t('personnel.form.username')"
2024-08-02 15:31:59 +07:00
v-model="username"
2024-08-26 16:24:08 +07:00
:rules="[(val: string) => val.length > 2 || $t('form.error.required')]"
2024-08-02 15:31:59 +07:00
/>
<q-select
outlined
clearable
use-input
fill-input
emit-value
map-options
hide-selected
hide-bottom-space
class="col"
v-model="userType"
input-debounce="0"
option-value="value"
option-label="label"
lazy-rules="ondemand"
for="select-user-type"
:dense="dense"
:readonly="readonly"
:hide-dropdown-icon="readonly"
2024-08-26 16:24:08 +07:00
:label="$t('personnel.form.userType')"
2024-08-02 15:31:59 +07:00
:options="userTypeOptions"
:rules="[
2024-08-26 16:24:08 +07:00
(val: string) =>
!!val ||
$t('form.error.selectField', {
field: $t('personnel.form.userType'),
}),
2024-08-02 15:31:59 +07:00
]"
@filter="userTypeFilter"
>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
2024-08-26 16:24:08 +07:00
{{ $t('general.noData') }}
2024-08-02 15:31:59 +07:00
</q-item-section>
</q-item>
</template>
</q-select>
<q-select
outlined
clearable
use-input
fill-input
emit-value
map-options
hide-selected
hide-bottom-space
class="col"
input-debounce="0"
option-label="label"
option-value="value"
lazy-rules="ondemand"
for="select-user-role"
:dense="dense"
v-model="userRole"
:readonly="readonly"
:hide-dropdown-icon="readonly"
2024-08-26 16:24:08 +07:00
:label="$t('personnel.form.userRole')"
2024-08-02 15:31:59 +07:00
:options="roleOptions"
:rules="[
2024-08-26 16:24:08 +07:00
(val: string) =>
!!val ||
$t('form.error.selectField', {
field: $t('personnel.form.userRole'),
}),
2024-08-02 15:31:59 +07:00
]"
@filter="roleFilter"
>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
2024-08-26 16:24:08 +07:00
{{ $t('general.noData') }}
2024-08-02 15:31:59 +07:00
</q-item-section>
</q-item>
</template>
</q-select>
<!-- <q-input lazy-rules="ondemand"
2024-04-22 10:53:56 +07:00
id="input-user-code"
2024-04-17 15:44:13 +07:00
:dense="dense"
:outlined="readonly ? false : outlined"
:borderless="readonly"
2024-04-17 15:44:13 +07:00
readonly
hide-bottom-space
class="col-3"
2024-04-22 10:53:56 +07:00
:label="$t('formDialogInputUserCode')"
2024-04-17 15:44:13 +07:00
v-model="userCode"
/> -->
2024-08-02 15:31:59 +07:00
</div>
2024-04-17 15:44:13 +07:00
</div>
</template>