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

201 lines
5.2 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-12-11 12:06:04 +07:00
import { ref } from 'vue';
2024-07-30 04:04:17 +00:00
import { useI18n } from 'vue-i18n';
2024-08-30 11:42:52 +07:00
import { isRoleInclude } from 'src/stores/utils';
2024-12-11 12:06:04 +07:00
import SelectBranch from '../shared/select/SelectBranch.vue';
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');
2024-12-11 12:06:04 +07:00
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
}>();
2024-07-30 04:04:17 +00:00
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',
);
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-12-11 12:06:04 +07:00
<SelectBranch
id="select-hq-id"
2024-08-26 16:24:08 +07:00
class="col-md-2 col-12"
2024-12-11 12:06:04 +07:00
:readonly
:disabled="isRoleInclude(['branch_manager']) && !readonly"
:params="{
filter: 'head',
}"
2024-08-26 16:24:08 +07:00
:label="$t('branch.form.code')"
2024-12-11 12:06:04 +07:00
code-only
2024-08-02 15:31:59 +07:00
clearable
2024-12-11 12:06:04 +07:00
v-model:value="hqId"
@update:value="() => (brId = '')"
required
/>
<SelectBranch
id="select-br-id"
2024-08-26 16:24:08 +07:00
class="col-md-2 col-12"
2024-12-11 12:06:04 +07:00
:key="hqId ?? undefined"
:readonly
:disabled="(isRoleInclude(['branch_manager']) && !readonly) || !hqId"
:params="{
headOfficeId: hqId ?? undefined,
}"
2024-08-26 16:24:08 +07:00
:label="$t('branch.form.codeBranch')"
2024-12-11 12:06:04 +07:00
code-only
clearable
v-model:value="brId"
/>
2024-08-02 15:31:59 +07:00
<q-input
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"
:rules="[
(val: string) => val.length > 2 || $t('form.error.required'),
(val: string) =>
2024-09-25 13:18:00 +07:00
(val.length > 0 && /^[a-zA-Z0-9_]+$/.test(val)) ||
$t('form.error.letterAndNumOnly'),
]"
2024-08-02 15:31:59 +07:00
/>
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"
for="select-user-type"
2024-11-12 15:57:41 +07:00
autocomplete="off"
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('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"
2024-11-12 15:57:41 +07:00
autocomplete="off"
2024-08-02 15:31:59 +07:00
option-label="label"
option-value="value"
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>
2024-09-04 17:49:12 +07:00
<!-- <q-input
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>