- แก้ไขข้อความ

- แก้ไขเมนู
This commit is contained in:
Warunee Tamkoo 2024-04-19 13:58:58 +07:00
parent a2279a234a
commit c6d53b22f3
5 changed files with 201 additions and 317 deletions

View file

@ -52,7 +52,7 @@ const menuList = readonly<any[]>([
role: "dashboard",
},
{
key: 3,
key: 2,
icon: "o_person",
activeIcon: "person",
label: "ข้อมูลหลัก (ใหม่)",
@ -60,43 +60,41 @@ const menuList = readonly<any[]>([
role: "metadata",
children: [
{
key: 3.1,
key: 2.0,
label: "ข้อมูลเกี่ยวกับบุคคล",
path: "masterPersonal",
},
{
key: 3.2,
key: 2.0,
label: "ข้อมูลตำแหน่งข้าราชการฯ",
path: "masterPosition",
},
{
key: 3.3,
key: 2.0,
label: "ข้อมูลตำแหน่งลูกจ้างประจำ",
path: "masterPositionEmployee",
},
{
key: 3.4,
key: 2.0,
label: "ข้อมูลปฏิทินวันหยุด",
path: "masterCalendarWork",
},
{
key: 3.5,
key: 2.0,
label: "ข้อมูลเครื่องราชอิสริยาภรณ์",
path: "masterInsignia",
},
{
key: 3.6,
key: 2.1,
label: "ตัวชี้วัด",
role: "evaluateKPI",
children: [
{
key: 3.61,
label: "ตามแผน",
path: "KPIIndicatorByPlan",
role: "evaluateKPI",
},
{
key: 3.62,
label: "ตามตำแหน่ง",
path: "KPIIndicatorByRole",
role: "evaluateKPI",
@ -104,7 +102,7 @@ const menuList = readonly<any[]>([
],
},
{
key: 3.7,
key: 2.0,
label: "สมรรถนะ",
path: "KPICompetency",
role: "evaluateKPI",
@ -112,52 +110,15 @@ const menuList = readonly<any[]>([
],
},
{
key: 4,
key: 3,
icon: "o_groups",
activeIcon: "groups",
label: "โครงสร้างอัตรากำลัง (ใหม่)",
path: "organizationalNew",
role: "organization",
// children: [
// {
// key: 3.1,
// label: "จัดการตำแหน่ง",
// path: "organizationalMapping",
// },
// {
// key: 3.2,
// label: "แผนภูมิโครงสร้าง",
// path: "organizationalStructChart",
// },
// {
// key: 3.3,
// label: "แผนภูมิองค์กร",
// path: "organizationalOrgChart",
// },
// {
// key: 3.4,
// label: "ผังโครงสร้าง",
// path: "organizationalTree",
// },
// {
// key: 3.5,
// label: "ผังโครงสร้างลูกจ้าง",
// path: "organizationalEmployee",
// },
// {
// key: 3.6,
// label: "จัดการบัญชี 2",
// path: "manageReport2",
// },
// {
// key: 3.7,
// label: "รายงานบัญชี",
// path: "organizationalReport",
// },
// ],
},
{
key: 4,
key: 3,
icon: "o_groups",
activeIcon: "groups",
label: "อัตรากำลังลูกจ้างประจำฯ",
@ -173,7 +134,7 @@ const menuList = readonly<any[]>([
role: "organization",
},
{
key: 2,
key: 100,
icon: "o_person",
activeIcon: "person",
label: "ข้อมูลหลัก",
@ -181,7 +142,7 @@ const menuList = readonly<any[]>([
role: "metadata",
},
{
key: 3,
key: 0,
icon: "o_groups",
activeIcon: "groups",
label: "โครงสร้างอัตรากำลัง",
@ -242,7 +203,7 @@ const menuList = readonly<any[]>([
role: "registryverify",
},
{
key: 10,
key: 5,
icon: "o_contact_page",
activeIcon: "registry_employee_page",
label: "ทะเบียนประวัติลูกจ้าง",
@ -250,7 +211,7 @@ const menuList = readonly<any[]>([
role: "registryEmployee",
},
{
key: 10,
key: 6,
icon: "mdi-file-certificate-outline",
activeIcon: "order",
label: "ออกคำสั่ง",
@ -258,7 +219,7 @@ const menuList = readonly<any[]>([
role: "order",
},
{
key: 5,
key: 7,
icon: "o_search",
activeIcon: "search",
label: "สรรหา",
@ -268,13 +229,13 @@ const menuList = readonly<any[]>([
{
label: "ตั้งค่าเว็บสรรหา",
path: "editorweb",
key: 5.1,
key: 7.1,
role: "recruit",
},
{
label: "สอบแข่งขัน",
path: "",
key: 5.2,
key: 7.2,
role: "recruit",
children: [
{
@ -292,7 +253,7 @@ const menuList = readonly<any[]>([
{
label: "คัดเลือก",
path: "",
key: 5.3,
key: 7.3,
role: "recruit",
children: [
{
@ -325,7 +286,7 @@ const menuList = readonly<any[]>([
],
},
{
key: 6,
key: 8,
path: "placement",
icon: "how_to_reg",
activeIcon: "how_to_reg",
@ -333,67 +294,46 @@ const menuList = readonly<any[]>([
role: "placement",
children: [
{
key: 6.1,
label: "รายชื่อผู้สอบผ่าน",
path: "placement",
role: "placement",
},
// {
// key: 6.2,
// label: "ออกคำสั่ง",
// path: "Orderplacement",
// role: "placement",
// },
{
key: 6.3,
label: "การทดลองปฏิบัติหน้าที่ราชการ",
path: "probation",
role: "probation",
},
{
key: 6.4,
label: "รายการขอโอน",
path: "transfer",
role: "placement",
},
{
key: 6.5,
label: "รายการรับโอน",
path: "receive",
role: "placement",
},
{
key: 6.6,
label: "รายการช่วยราชการ",
path: "help-government",
role: "placement",
},
{
key: 6.7,
label: "รายการส่งตัวกลับ",
path: "repatriate",
role: "placement",
},
{
key: 6.8,
label: "รายการแต่งตั้ง-เลื่อน-ย้าย",
path: "appoint-promote",
role: "placement",
},
{
key: 6.8,
label: "ปรับระดับชั้นงาน-ย้ายลูกจ้าง",
path: "appoint-employee",
role: "placement",
},
// {
// key: 6.9,
// label: "รายการย้าย",
// path: "relocation",
// role: "placement",
// },
{
key: 6.1,
label: "รายการอื่นๆ",
path: "other",
role: "placement",
@ -401,7 +341,7 @@ const menuList = readonly<any[]>([
],
},
{
key: 7,
key: 9,
icon: "mdi-account-cancel-outline",
activeIcon: "mdi-account-cancel",
label: "พ้นจากราชการ",
@ -409,51 +349,34 @@ const menuList = readonly<any[]>([
role: "retirement",
children: [
{
key: 7.1,
label: "ประกาศเกษียณ",
path: "retirement",
role: "retirement",
},
{
key: 7.2,
label: "รายการลาออก",
path: "resign",
role: "retirement",
},
{
key: 7.3,
label: "Exit interview",
path: "exit-Interview",
role: "retirement",
},
{
key: 7.4,
label: "รายการบันทึกการถึงแก่กรรม",
path: "deceased",
role: "retirement",
},
{
key: 7.5,
label: "รายการให้ออก",
path: "dismiss-order",
role: "retirement",
},
// {
// key: 7.6,
// label: "รายการปลดออก",
// path: "discharged",
// role: "retirement",
// },
// {
// key: 7.7,
// label: "รายการไล่ออก",
// path: "expulsion",
// role: "retirement",
// },
],
},
{
key: 8,
key: 10,
icon: "mdi-medal-outline",
activeIcon: "mdi-medal",
label: "เครื่องราชฯ",
@ -461,37 +384,31 @@ const menuList = readonly<any[]>([
role: "insignia",
children: [
{
key: 8.1,
label: "รอบการเสนอขอ",
path: "insigniaProposals",
role: "insignia",
},
{
key: 8.2,
label: "จัดการคำขอ",
path: "insigniaManage",
role: "insignia",
},
{
key: 8.3,
label: "บันทึกผลการเสนอขอ",
path: "insigniaRecord",
role: "insignia",
},
{
key: 8.4,
label: "จัดสรรเครื่องราชฯ",
path: "insigniaAllocate",
role: "insignia",
},
{
key: 8.6,
label: "ยืม-คืนเครื่องราชฯ",
path: "insigniaBorrow",
role: "insignia",
},
{
key: 8.5,
label: "รายงาน",
path: "insigniaReport",
role: "insignia",
@ -499,7 +416,7 @@ const menuList = readonly<any[]>([
],
},
{
key: 9,
key: 11,
icon: "mdi-calendar",
activeIcon: "mdi-calendar",
label: "การลา",
@ -507,37 +424,31 @@ const menuList = readonly<any[]>([
role: "leave",
children: [
{
key: 9.1,
label: "รอบการปฏิบัติงาน",
path: "/round-time",
role: "leave",
},
{
key: 9.2,
label: "แก้ไขรอบการปฎิบัติงานผู้ใช้งาน",
path: "/change-round",
role: "leave",
},
{
key: 9.3,
label: "รายการลงเวลาปฏิบัติงาน",
path: "/work-list",
role: "leave",
},
{
key: 9.4,
label: "ลงเวลากรณีพิเศษ",
path: "/timestamp-special",
role: "leave",
},
{
key: 9.5,
label: "รายการลา",
path: "/leave",
role: "leave",
},
{
key: 9.6,
label: "รายงานสถิติการลา",
path: "/leave-report",
role: "leave",
@ -545,56 +456,50 @@ const menuList = readonly<any[]>([
],
},
{
key: 11,
key: 12,
icon: "mdi-scale-balance",
activeIcon: "mdi-scale-balance",
label: "วินัย",
role: "discipline",
children: [
{
key: 11.1,
key: 12.0,
label: "เรื่องร้องเรียน",
path: "disciplineComplaints",
role: "discipline",
},
{
key: 11.2,
key: 12.0,
label: "สืบสวนข้อเท็จจริง",
path: "disciplineInvestigatefacts",
role: "discipline",
},
{
key: 11.3,
key: 12.0,
label: "สอบสวนความผิดทางวินัย",
path: "disciplineDisciplinary",
role: "discipline",
},
{
key: 11.4,
key: 12.0,
label: "สรุปผลการพิจารณาความผิดทางวินัย",
path: "disciplineResult",
role: "discipline",
},
{
key: 11.5,
key: 12.0,
label: "รายชื่อผู้ถูกพักราชการ",
path: "disciplineListSuspend",
role: "discipline",
},
// {
// key: 11.5,
// label: "รายงาน",
// path: "disciplineReport",
// role: "discipline",
// },
{
key: 11.5,
key: 12.0,
label: "อุทธรณ์/ร้องทุกข์",
path: "appealComplain",
role: "discipline",
},
{
key: 11.5,
key: 12.0,
label: "ออกคำสั่งลงโทษทางวินัย",
path: "disciplineOrder",
role: "discipline",
@ -602,7 +507,7 @@ const menuList = readonly<any[]>([
{
label: "ข้อมูลพื้นฐาน",
path: "",
key: 11.7,
key: 12.1,
role: "discipline",
children: [
{
@ -620,14 +525,14 @@ const menuList = readonly<any[]>([
],
},
{
key: 11,
key: 13,
icon: "mdi-account-check",
activeIcon: "mdi-account-check",
label: "ประเมินบุคคล",
role: "evaluate",
children: [
{
key: 11.1,
key: 13.0,
label: "คำขอประเมิน",
path: "evaluate",
role: "discipline",
@ -635,7 +540,7 @@ const menuList = readonly<any[]>([
{
label: "กรรมการและการประชุม",
path: "",
key: 11.7,
key: 13.1,
role: "evaluate",
children: [
{
@ -653,44 +558,38 @@ const menuList = readonly<any[]>([
],
},
{
key: 12,
key: 14,
icon: "mdi-cash",
activeIcon: "mdi-cash",
label: "เงินเดือน/ค่าจ้าง",
role: "salary",
children: [
{
key: 12.1,
label: "ผังบัญชีเงินเดือนข้าราชการฯ",
path: "salaryChart",
role: "salary",
},
{
key: 12.2,
label: "ผังบัญชีค่าจ้างลูกจ้างประจำ",
path: "salaryEmployeeChart",
role: "salary",
},
{
key: 12.3,
label: "รอบการขึ้นเงินเดือน",
path: "salaryRound",
role: "salary",
},
{
key: 12.4,
label: "เลื่อนเงินเดือนข้าราชการฯ",
path: "salaryLists",
role: "salary",
},
{
key: 12.5,
label: "เลื่อนค่าจ้างลูกจ้างประจำ",
path: "salaryEmployeeLists",
role: "salary",
},
{
key: 12.6,
label: "ออกคำสั่งเลื่อนเงินเดือน/ค่าจ้าง",
path: "commandSalary",
role: "salary",
@ -698,14 +597,13 @@ const menuList = readonly<any[]>([
],
},
{
key: 13,
key: 15,
icon: "mdi-account-star",
activeIcon: "mdi-account-star",
label: "ประเมินผลการปฏิบัติราชการระดับบุคคล",
role: "evaluateKPI",
children: [
{
key: 13.1,
label: "รอบการประเมิน",
path: "KPIRound",
role: "evaluateKPI",
@ -713,52 +611,39 @@ const menuList = readonly<any[]>([
],
},
{
key: 14,
key: 16,
icon: "mdi-briefcase-account",
activeIcon: "mdi-briefcase-account",
label: "พัฒนาบุคลากร",
role: "development",
children: [
{
key: 14.1,
label: "โครงการ/หลักสูตรการฝึกอบรม",
path: "developmentMain",
role: "development",
},
{
key: 14.2,
label: "ประวัติฝึกอบรม/ดูงาน ขรก.",
path: "developmentHistory",
role: "development",
},
{
key: 14.3,
label: "ประวัติฝึกอบรม/ดูงานลูกจ้าง",
path: "developmentEmployeeHistory",
role: "development",
},
{
key: 14.4,
label: "ทุนการศึกษา/ฝึกอบรม",
path: "developmentScholarship",
role: "development",
},
{
key: 14.5,
label: "ยุทธศาสตร์",
path: "developmentStrategic",
role: "development",
},
],
},
// {
// key: 99,
// icon: "mdi-chat",
// activeIcon: "mdi-chat",
// label: "ถาม-ตอบ",
// role: "support",
// path: "support",
// },
]);
const tabList = readonly<tabType[]>([

View file

@ -73,10 +73,10 @@ const columns = ref<QTableProps["columns"]>([
{
name: "isActive",
align: "left",
label: "สถานะ",
label: "สถานะ",
sortable: true,
field: "isActive",
format: (val) => (val ? "เปืดรอบ" : "ปิดรอบ"),
format: (val) => (val ? "เปิด" : "ปิดแล้ว"),
headerStyle: "font-size: 14px",
style: "font-size: 14px",
},
@ -261,7 +261,7 @@ function onCloseRounde(id: string) {
dialogConfirm(
$q,
() => {
showLoader()
showLoader();
http
.get(config.API.kpiPeriod + `/close/${id}`)
.then(() => {

View file

@ -350,6 +350,7 @@ onMounted(() => {
>
<template v-slot:header="props">
<q-tr :props="props">
<q-th auto-width></q-th>
<q-th v-for="col in props.cols" :key="col.name" :props="props">
<span class="text-weight-medium">{{ col.label }}</span>
</q-th>
@ -357,6 +358,11 @@ onMounted(() => {
</template>
<template v-slot:body="props">
<q-tr :props="props" class="cursor-pointer">
<q-td v-if="props.row.isDone">
<q-icon name="mdi-check" color="green" size="xs">
<q-tooltip>งไปบนทกททะเบยนประวแล</q-tooltip>
</q-icon>
</q-td>
<q-td v-for="col in props.cols" :key="col.id">
<div>{{ col.value ? col.value : "-" }}</div>
</q-td>

View file

@ -213,152 +213,122 @@ onMounted(() => {
<q-card flat bordered class="q-pa-md">
<q-toolbar class="q-pa-none">
<div class="row q-gutter-sm">
<div>
<datepicker
style="width: 150px"
menu-class-name="modalfix"
v-model="formQuery.year"
:locale="'th'"
autoApply
year-picker
:enableTimePicker="false"
@update:model-value="fetchNewList"
>
<template #year="{ year }">{{ year + 543 }}</template>
<template #year-overlay-value="{ value }">{{
parseInt(value + 543)
}}</template>
<template #trigger>
<q-input
dense
lazy-rules
outlined
:model-value="
formQuery.year === 0
? 'ทั้งหมด'
: Number(formQuery.year) + 543
"
:label="`${'ปีงบประมาณ'}`"
>
<template v-if="formQuery.year" v-slot:append>
<q-icon
name="cancel"
@click.stop.prevent="(formQuery.year = 0), fetchNewList()"
class="cursor-pointer"
/>
</template>
<template v-slot:prepend>
<q-icon
name="event"
class="cursor-pointer"
style="color: var(--q-primary)"
>
</q-icon>
</template>
</q-input>
</template>
</datepicker>
</div>
<div>
<q-select
dense
outlined
v-model="formQuery.type"
:options="scholarshipTypeOp"
emit-value
map-options
option-value="id"
option-label="name"
label="เลือกประเภททุน"
@update:model-value="fetchNewList"
style="width: 350px"
/>
</div>
<datepicker
style="width: 150px"
menu-class-name="modalfix"
v-model="formQuery.year"
:locale="'th'"
autoApply
year-picker
:enableTimePicker="false"
@update:model-value="fetchNewList"
>
<template #year="{ year }">{{ year + 543 }}</template>
<template #year-overlay-value="{ value }">{{
parseInt(value + 543)
}}</template>
<template #trigger>
<q-input
dense
lazy-rules
outlined
:model-value="
formQuery.year === 0 ? 'ทั้งหมด' : Number(formQuery.year) + 543
"
:label="`${'ปีงบประมาณ'}`"
>
<template v-if="formQuery.year" v-slot:append>
<q-icon
name="cancel"
@click.stop.prevent="(formQuery.year = 0), fetchNewList()"
class="cursor-pointer"
/>
</template>
<template v-slot:prepend>
<q-icon
name="event"
class="cursor-pointer"
style="color: var(--q-primary)"
>
</q-icon>
</template>
</q-input>
</template>
</datepicker>
<q-select
dense
outlined
v-model="formQuery.type"
:options="scholarshipTypeOp"
emit-value
map-options
option-value="id"
option-label="name"
label="เลือกประเภททุน"
@update:model-value="fetchNewList"
class="type"
/>
</div>
<q-toolbar-title>
<q-btn
flat
round
dense
icon="add"
color="primary"
@click="onClickAddOrView()"
>
<q-tooltip>เพ</q-tooltip>
</q-btn>
<q-space />
<div class="row q-gutter-sm">
<q-btn
flat
round
dense
icon="add"
color="primary"
@click="onClickAddOrView()"
icon="mdi-arrow-down-bold-circle-outline"
color="blue"
@click="onDownload"
>
<q-tooltip>เพ</q-tooltip>
<q-tooltip>ดาวนโหลด</q-tooltip>
</q-btn>
</q-toolbar-title>
<q-space />
<div class="row q-gutter-sm">
<div>
<q-btn
flat
round
dense
icon="mdi-arrow-down-bold-circle-outline"
color="blue"
@click="onDownload"
>
<q-tooltip>ดาวนโหลด</q-tooltip>
</q-btn>
<!-- <q-btn
flat
round
color="blue"
icon="mdi-arrow-down-bold-circle-outline"
>
<q-menu>
<q-list style="min-width: 100px" dense>
<q-item clickable v-close-popup v-for="items in itemDownload">
<q-item-section avatar>
<q-icon :color="items.color" :name="items.icon" />
</q-item-section>
<q-item-section :class="`text-${items.color}`">{{
items.label
}}</q-item-section>
</q-item>
</q-list>
</q-menu>
<q-tooltip>ดาวนโหลด</q-tooltip>
</q-btn> -->
</div>
<div>
<q-input
standout
dense
v-model="formQuery.keyword"
ref="filterRef"
outlined
placeholder="ค้นหา"
@keyup.enter="fetchNewList()"
>
<template v-slot:append>
<q-icon v-if="formQuery.keyword == ''" name="search" />
<q-icon
v-if="formQuery.keyword !== ''"
name="clear"
class="cursor-pointer"
@click="(formQuery.keyword = ''), fetchNewList()"
/>
</template>
</q-input>
</div>
<div>
<q-select
v-model="visibleColumns"
multiple
outlined
dense
options-dense
:display-value="$q.lang.table.columns"
emit-value
map-options
:options="columns"
option-value="name"
options-cover
style="min-width: 150px"
/>
</div>
<q-input
standout
dense
v-model="formQuery.keyword"
ref="filterRef"
outlined
placeholder="ค้นหา"
@keyup.enter="fetchNewList()"
>
<template v-slot:append>
<q-icon v-if="formQuery.keyword == ''" name="search" />
<q-icon
v-if="formQuery.keyword !== ''"
name="clear"
class="cursor-pointer"
@click="(formQuery.keyword = ''), fetchNewList()"
/>
</template>
</q-input>
<q-select
v-model="visibleColumns"
multiple
outlined
dense
options-dense
:display-value="$q.lang.table.columns"
emit-value
map-options
:options="columns"
option-value="name"
options-cover
style="min-width: 150px"
/>
</div>
</q-toolbar>
@ -416,4 +386,11 @@ onMounted(() => {
</q-card>
</template>
<style scoped></style>
<style scoped>
.q-select.type >>> .q-field__native > span {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 200px;
}
</style>

View file

@ -733,15 +733,18 @@ watch(
@click="link = menuItem.label"
active-class="text-primary menuActiveMini text-weight-medium"
v-if="
menuItem.key == 3 ||
menuItem.key == 5 ||
menuItem.key == 6 ||
menuItem.key == 2 ||
menuItem.key == 0 ||
menuItem.key == 7 ||
menuItem.key == 8 ||
menuItem.key == 9 ||
menuItem.key == 10 ||
menuItem.key == 11 ||
menuItem.key == 12 ||
menuItem.key == 14
menuItem.key == 13 ||
menuItem.key == 14 ||
menuItem.key == 15 ||
menuItem.key == 16
"
>
<div class="row items-center no-wrap">
@ -772,8 +775,24 @@ watch(
:to="{ name: `${subMenu.path}` }"
>
<!-- เมนอย 2 -->
<div v-if="menuItem.key == 5">
<q-item dense clickable v-if="subMenu.key !== 5.1">
<div
v-if="
menuItem.key == 2 ||
menuItem.key == 7 ||
menuItem.key == 12 ||
menuItem.key == 13
"
>
<q-item
dense
clickable
v-if="
subMenu.key !== 2.0 &&
subMenu.key !== 7.1 &&
subMenu.key !== 12.0 &&
subMenu.key !== 13.0
"
>
<q-item-section
>{{ subMenu.label }}
</q-item-section>
@ -898,16 +917,18 @@ watch(
expand-icon="mdi-chevron-down"
expanded-icon="mdi-chevron-up"
v-if="
menuItem.key == 3 ||
menuItem.key == 5 ||
menuItem.key == 6 ||
menuItem.key == 2 ||
menuItem.key == 0 ||
menuItem.key == 7 ||
menuItem.key == 8 ||
menuItem.key == 9 ||
menuItem.key == 10 ||
menuItem.key == 11 ||
menuItem.key == 12 ||
menuItem.key == 13 ||
menuItem.key == 14
menuItem.key == 14 ||
menuItem.key == 15 ||
menuItem.key == 16
"
>
<template v-slot:header>
@ -924,7 +945,10 @@ watch(
<!-- เมนอย 2 (สรรหา) -->
<div
v-if="
menuItem.key == 5 || menuItem.key == 11 || menuItem.key == 3
menuItem.key == 2 ||
menuItem.key == 7 ||
menuItem.key == 12 ||
menuItem.key == 13
"
>
<div v-for="(subMenu, i) in menuItem.children" :key="i">
@ -933,18 +957,10 @@ watch(
dense-toggle
:label="subMenu.label"
v-if="
subMenu.key !== 5.1 &&
subMenu.key !== 11.1 &&
subMenu.key !== 11.2 &&
subMenu.key !== 11.3 &&
subMenu.key !== 11.4 &&
subMenu.key !== 11.5 &&
subMenu.key !== 3.1 &&
subMenu.key !== 3.2 &&
subMenu.key !== 3.3 &&
subMenu.key !== 3.4 &&
subMenu.key !== 3.5 &&
subMenu.key !== 3.7
subMenu.key !== 2.0 &&
subMenu.key !== 7.1 &&
subMenu.key !== 12.0 &&
subMenu.key !== 13.0
"
class="expan2"
dense