เพิ่ม comment code
This commit is contained in:
parent
fd74ca29db
commit
52bfaeb0e8
14 changed files with 78 additions and 99 deletions
|
|
@ -8,6 +8,7 @@ import config from "@/app.config"
|
|||
import { useQuasar } from "quasar"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const mixin = useCounterMixin()
|
||||
|
|
@ -127,10 +128,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
const blob = formDataSick.leaveDocument.slice(0, formDataSick.leaveDocument[0].size)
|
||||
|
|
@ -158,6 +160,9 @@ async function saveFormData() {
|
|||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังก์ชั่นแปลงครึ่งวัน/ทั้งวัน
|
||||
*/
|
||||
const isReadOnly = computed(() => {
|
||||
const conditionHalfDay = formDataSick.halfDay === "half_day_morning" || formDataSick.halfDay === "half_day_afternoon"
|
||||
if (conditionHalfDay) {
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
<script setup lang="ts">
|
||||
import { ref, reactive, watch } from "vue"
|
||||
import { useQuasar } from "quasar"
|
||||
import type { FormData, FormRef } from "@/modules/05_leave/interface/request/BirthForm"
|
||||
import type { FormRef } from "@/modules/05_leave/interface/request/BirthForm"
|
||||
import { useCounterMixin } from "@/stores/mixin"
|
||||
import { useLeaveStore } from "@/modules/05_leave/store"
|
||||
import http from "@/plugins/http"
|
||||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const mixin = useCounterMixin()
|
||||
const router = useRouter()
|
||||
|
|
@ -111,10 +112,10 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
const blob = formDataBirth.leaveDocument.slice(0, formDataBirth.leaveDocument[0].size)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import config from "@/app.config"
|
|||
import { useQuasar } from "quasar"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const mixin = useCounterMixin()
|
||||
const router = useRouter()
|
||||
|
|
@ -127,10 +128,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
|
||||
|
|
@ -167,22 +169,6 @@ async function saveFormData() {
|
|||
<div class="q-pl-sm text-weight-bold text-dark">กรอกข้อมูล</div>
|
||||
</div>
|
||||
<form @submit.prevent.stop="onValidate">
|
||||
<!-- ลาไปช่วยเหลือภริยาที่คลอดบุตร
|
||||
<ul>
|
||||
<li>เขียนที่</li>
|
||||
<li>ชื่อภรรยา</li>
|
||||
<li>วันที่คลอด</li>
|
||||
<li>ลาตั้งแต่วันที่</li>
|
||||
<li>ลาถึงวันที่</li>
|
||||
<li>จำนวนวันที่ลา (frontend คำนวนให้ Auto)</li>
|
||||
<li>ที่อยู่ที่ติดต่อได้ระหว่างลา (textarea)</li>
|
||||
<li>หมายเลขโทรศัพท์</li>
|
||||
<li>รายละเอียด (ไม่บังคับกรอก)</li>
|
||||
<li>เอกสารประกอบ</li>
|
||||
</ul>
|
||||
<p>
|
||||
*หมายเหตุ ที่อยู่ที่ติดต่อได้ระหว่างลา (อาจดึงมาจากที่อยู่ปัจจุบันโดยอัตโนมัติ แต่ให้ผู้ใช้งานแก้ไขได้)
|
||||
</p> -->
|
||||
<q-card bordered class="q-pa-md bg-grey-1">
|
||||
<div class="col-12 row q-pa-sm q-col-gutter-sm">
|
||||
<q-input
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import config from "@/app.config"
|
|||
import { useQuasar } from "quasar"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const $q = useQuasar()
|
||||
const dataStore = useLeaveStore()
|
||||
const mixin = useCounterMixin()
|
||||
|
|
@ -125,6 +126,9 @@ const onSubmit = async () => {
|
|||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
|
||||
|
|
@ -165,6 +169,7 @@ function resetDate() {
|
|||
console.log("testnull")
|
||||
}
|
||||
|
||||
/** ฟังก์ชั่นแปลงค่า ครึ่งวัน/ทั้งวัน */
|
||||
const isReadOnly = computed(() => {
|
||||
const conditionHalfDay = formDataVacation.halfDay === "half_day_morning" || formDataVacation.halfDay === "half_day_afternoon"
|
||||
if (conditionHalfDay) {
|
||||
|
|
|
|||
|
|
@ -8,12 +8,12 @@ import http from "@/plugins/http"
|
|||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const router = useRouter()
|
||||
const mixin = useCounterMixin()
|
||||
const { date2Thai, dialogConfirm, calculateDurationYmd, dateToISO, success, messageError } = mixin
|
||||
|
||||
const edit = ref<boolean>(true)
|
||||
const files = ref<any>(null)
|
||||
|
||||
|
|
@ -136,10 +136,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
|
||||
|
|
@ -162,7 +163,6 @@ async function saveFormData() {
|
|||
formData.append("leaveDetail", formDataOrdination.leaveDetail)
|
||||
formData.append("leavebirthDate", dateToISO(formDataOrdination.leavebirthDate))
|
||||
formData.append("leavegovernmentDate", dateToISO(formDataOrdination.leavegovernmentDate))
|
||||
|
||||
await http
|
||||
.post(config.API.leaveUser(), formData)
|
||||
.then((res: any) => {
|
||||
|
|
|
|||
|
|
@ -8,12 +8,12 @@ import http from "@/plugins/http"
|
|||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const router = useRouter()
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const mixin = useCounterMixin()
|
||||
const { date2Thai, dialogConfirm, calculateDurationYmd, messageError, success, dateToISO } = mixin
|
||||
|
||||
const edit = ref<boolean>(true)
|
||||
const files = ref<any>(null)
|
||||
|
||||
|
|
@ -23,6 +23,7 @@ const leavegovernmentDateRef = ref<object | null>(null)
|
|||
const leaveStartDateRef = ref<object | null>(null)
|
||||
const leaveEndDateRef = ref<object | null>(null)
|
||||
const leaveDocumentRef = ref<object | null>(null)
|
||||
|
||||
/** รับ props มาจากหน้าหลัก */
|
||||
const props = defineProps({
|
||||
data: {
|
||||
|
|
@ -92,10 +93,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
|
||||
|
|
|
|||
|
|
@ -8,12 +8,12 @@ import http from "@/plugins/http"
|
|||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const router = useRouter()
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const mixin = useCounterMixin()
|
||||
const { date2Thai, dialogConfirm, calculateDurationYmd, dateToISO, success, messageError } = mixin
|
||||
|
||||
const edit = ref<boolean>(true)
|
||||
const files = ref<any>(null)
|
||||
|
||||
|
|
@ -105,10 +105,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
const blob = formDataMilitary.leaveDocument.slice(0, formDataMilitary.leaveDocument[0].size)
|
||||
|
|
|
|||
|
|
@ -8,12 +8,12 @@ import http from "@/plugins/http"
|
|||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const router = useRouter()
|
||||
const mixin = useCounterMixin()
|
||||
const { date2Thai, dialogConfirm, calculateDurationYmd, dateToISO, success, messageError, arabicNumberToText } = mixin
|
||||
|
||||
const edit = ref<boolean>(true)
|
||||
const files = ref<any>(null)
|
||||
|
||||
|
|
@ -119,10 +119,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
const blob = formDataStudy.leaveDocument.slice(0, formDataStudy.leaveDocument[0].size)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import http from "@/plugins/http"
|
|||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const router = useRouter()
|
||||
|
|
@ -113,10 +114,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
const blob = formDataTrain.leaveDocument.slice(0, formDataTrain.leaveDocument[0].size)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<script setup lang="ts">
|
||||
import { ref, reactive, watch } from "vue"
|
||||
import type { FormData, FormRef } from "@/modules/05_leave/interface/request/WorkInternationalForm"
|
||||
import type { FormRef } from "@/modules/05_leave/interface/request/WorkInternationalForm"
|
||||
import { useCounterMixin } from "@/stores/mixin"
|
||||
import { useQuasar } from "quasar"
|
||||
import { useLeaveStore } from "@/modules/05_leave/store"
|
||||
|
|
@ -8,6 +8,7 @@ import http from "@/plugins/http"
|
|||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const mixin = useCounterMixin()
|
||||
|
|
@ -103,10 +104,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
const blob = formDataWorkInternational.leaveDocument.slice(0, formDataWorkInternational.leaveDocument[0].size)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import http from "@/plugins/http"
|
|||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const mixin = useCounterMixin()
|
||||
|
|
@ -139,10 +140,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
const blob = formDataFollowSpouse.leaveDocument.slice(0, formDataFollowSpouse.leaveDocument[0].size)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<script setup lang="ts">
|
||||
import { reactive, ref, computed } from "vue"
|
||||
import { reactive, ref } from "vue"
|
||||
import { useCounterMixin } from "@/stores/mixin"
|
||||
import { useQuasar } from "quasar"
|
||||
import type { RehabilitationForm } from "@/modules/05_leave/interface/request/AddAbsence"
|
||||
|
|
@ -8,6 +8,7 @@ import http from "@/plugins/http"
|
|||
import config from "@/app.config"
|
||||
import { useRouter } from "vue-router"
|
||||
|
||||
/** Use */
|
||||
const dataStore = useLeaveStore()
|
||||
const $q = useQuasar()
|
||||
const mixin = useCounterMixin()
|
||||
|
|
@ -16,7 +17,6 @@ const router = useRouter()
|
|||
const edit = ref<boolean>(true)
|
||||
const isSave = ref<boolean>(false)
|
||||
const files = ref<any>(null)
|
||||
const filesUpload = ref<any>(null)
|
||||
|
||||
/** ตัวแปร ref สำหรับแสดง validate */
|
||||
const leaveStartDateRef = ref<object | null>(null)
|
||||
|
|
@ -90,10 +90,11 @@ const onSubmit = async () => {
|
|||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ฟังชั่นบันทีกข้อมูลจาก formdata ส่งไปที่ Api
|
||||
*/
|
||||
async function saveFormData() {
|
||||
const formData = new FormData()
|
||||
const blob = formDataRehabilitation.leaveDocument.slice(0, formDataRehabilitation.leaveDocument[0].size)
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@ const $q = useQuasar()
|
|||
export const useLeaveStore = defineStore("Leave", () => {
|
||||
const tabValue = ref<string>("calendar")
|
||||
const typeLeave = ref<string | undefined>("")
|
||||
|
||||
const LeaveType = ref<string | null>("0")
|
||||
const LeaveStatus = ref<string | null>("0")
|
||||
const fiscalYearyear = ref<Number | null>(new Date().getFullYear())
|
||||
|
|
@ -40,6 +39,7 @@ export const useLeaveStore = defineStore("Leave", () => {
|
|||
rows.value = datalist
|
||||
}
|
||||
|
||||
//ฟังก์ชั่นแปลง Status
|
||||
function convertStatud(val: string) {
|
||||
switch (val) {
|
||||
case "NEW":
|
||||
|
|
@ -215,7 +215,7 @@ export const useLeaveStore = defineStore("Leave", () => {
|
|||
}
|
||||
|
||||
/**
|
||||
*ฟังก์ชั่นแปลง id
|
||||
*ฟังก์ชั่นหา id จาก api
|
||||
* @param val ค่า string
|
||||
* @returns ส่งค่าที่แปลงแล้ว
|
||||
*/
|
||||
|
|
@ -223,6 +223,7 @@ export const useLeaveStore = defineStore("Leave", () => {
|
|||
return options.value.find(x => x.code == val)?.id
|
||||
}
|
||||
|
||||
//ดึงข้อมูล profile จาก API
|
||||
async function fetchProfile() {
|
||||
console.log("profile")
|
||||
await http
|
||||
|
|
|
|||
|
|
@ -38,42 +38,9 @@ onMounted(async () => {
|
|||
await fectOptionType()
|
||||
})
|
||||
|
||||
const saveAbsence = () => {
|
||||
$q.dialog({
|
||||
title: "ยืนยันการยื่นข้อมูลลา",
|
||||
message: "ต้องการยื่นข้อมูลลานี้ใช่หรือไม่?",
|
||||
cancel: {
|
||||
flat: true,
|
||||
color: "negative",
|
||||
},
|
||||
persistent: true,
|
||||
})
|
||||
.onOk(() => {
|
||||
// createFormresign()
|
||||
if (model.value !== "LV-007") {
|
||||
console.log(1)
|
||||
} else if (model.value === "LV-007") {
|
||||
console.log(2)
|
||||
}
|
||||
router.push(`/leave`)
|
||||
})
|
||||
.onCancel(() => {})
|
||||
.onDismiss(() => {})
|
||||
}
|
||||
/** ฟังก์ชั่น บันทึก */
|
||||
const onSubmit = async () => {
|
||||
dialogConfirm(
|
||||
$q,
|
||||
async () => {
|
||||
await saveformdata()
|
||||
},
|
||||
"ยืนยันการยื่นใบลา",
|
||||
"ต้องการยืนยันการยื่นใบลานี้ใช่หรือไม่ ?"
|
||||
)
|
||||
|
||||
console.log("save")
|
||||
}
|
||||
|
||||
/**
|
||||
* ดึงค่าประเภทการลาจาก Api
|
||||
*/
|
||||
async function fectOptionType() {
|
||||
await http
|
||||
.get(config.API.leaveType())
|
||||
|
|
@ -85,7 +52,10 @@ async function fectOptionType() {
|
|||
messageError($q, err)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* check ว่าลาได้ไหม จาก api
|
||||
* @param formData
|
||||
*/
|
||||
async function FetchCheck(formData: any) {
|
||||
await http
|
||||
.post(config.API.leaveCheck(), { type: dataStore.typeId ?? null, leaveStartDate: formData.leaveStartDate ?? null, leaveEndDate: formData.leaveEndDate ?? null })
|
||||
|
|
@ -162,18 +132,18 @@ async function FetchCheck(formData: any) {
|
|||
</div>
|
||||
</div>
|
||||
<div v-if="model" class="col-12">
|
||||
<SickForm :on-submit="onSubmit" v-if="model === 'LV-001' || model === 'LV-002'" />
|
||||
<FormBirth :on-submit="onSubmit" v-if="model === 'LV-003'" />
|
||||
<HelpWifeBirthForm :on-submit="onSubmit" v-if="model === 'LV-004'" />
|
||||
<VacationForm :on-submit="onSubmit" v-if="model === 'LV-005'" />
|
||||
<OrdinationForm :on-submit="onSubmit" v-if="model === 'LV-006' && modelSpecific === '0'" />
|
||||
<HajjForm :on-submit="onSubmit" v-if="model === 'LV-006' && modelSpecific === '1'" />
|
||||
<MilitaryForm :on-submit="onSubmit" v-if="model === 'LV-007'" style="width: 100%" />
|
||||
<StudyForm :on-submit="onSubmit" v-if="model === 'LV-008' && modelSpecific === 's0'" style="width: 100%" />
|
||||
<TrainForm :on-submit="onSubmit" v-if="model === 'LV-008' && modelSpecific != 's0' && modelSpecific != ''" />
|
||||
<WorkInternationalForm :on-submit="onSubmit" v-if="model === 'LV-009'" />
|
||||
<FollowSpouseForm :on-submit="onSubmit" v-if="model === 'LV-010'" />
|
||||
<RehabilitationForm :on-submit="onSubmit" v-if="model === 'LV-011'" />
|
||||
<SickForm v-if="model === 'LV-001' || model === 'LV-002'" />
|
||||
<FormBirth v-if="model === 'LV-003'" />
|
||||
<HelpWifeBirthForm v-if="model === 'LV-004'" />
|
||||
<VacationForm v-if="model === 'LV-005'" />
|
||||
<OrdinationForm v-if="model === 'LV-006' && modelSpecific === '0'" />
|
||||
<HajjForm v-if="model === 'LV-006' && modelSpecific === '1'" />
|
||||
<MilitaryForm v-if="model === 'LV-007'" style="width: 100%" />
|
||||
<StudyForm v-if="model === 'LV-008' && modelSpecific === 's0'" style="width: 100%" />
|
||||
<TrainForm v-if="model === 'LV-008' && modelSpecific != 's0' && modelSpecific != ''" />
|
||||
<WorkInternationalForm v-if="model === 'LV-009'" />
|
||||
<FollowSpouseForm v-if="model === 'LV-010'" />
|
||||
<RehabilitationForm v-if="model === 'LV-011'" />
|
||||
</div>
|
||||
</div>
|
||||
</q-card>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue