Files
apkt-eis/src/components/Form/FiltersType/Type7.vue

178 lines
4.6 KiB
Vue
Executable File

<script setup lang="ts">
interface SlaOption {
id: number
name: string
min: string
max: string
}
import Select from '@/components/Select.vue';
import DatePicker from '@/components/DatePicker.vue';
import InputWithSuffix from '../InputWithSuffix.vue';
import {
selectedUid,
selectedUp3Posko,
selectedPosko,
fetchUid,
itemsUid,
itemsUp3,
itemsPosko
} from './reference';
import { onMounted, ref, watch } from 'vue';
const props = defineProps({
slaOptions: {
type: Array as () => SlaOption[],
default: [
{
id: 1,
name: 'Dibawah / Sesuai SLA (<= 45 menit)',
min: '1',
max: '45'
},
{
id: 2,
name: 'Melebihi SLA (> 45 menit)',
min: '46',
max: `${99999 * 60 * 24}`
}
]
}
})
const sla = props.slaOptions.map((item: any) => {
return {
id: item.id,
name: item.name
}
})
const emit = defineEmits(['update:filters'])
const uidPlaceholder = 'Semua Unit Induk Distribusi/Wilayah'
const up3Placeholder = 'Semua Unit Pelaksanaan Pelayanan Pelanggan'
const poskoPlaceholder = 'Semua Posko'
const up3 = ref({ id: 0, name: up3Placeholder })
const uid = ref({ id: 0, name: uidPlaceholder })
const posko = ref({ id: 0, name: poskoPlaceholder })
const isHidden = ref(false)
const totalMin = ref('1 Menit')
const totalMax = ref('5 Menit')
const setDataMin = (value: any) => (totalMin.value = value)
const getDataMin = () => totalMin.value
const setDataMax = (value: any) => (totalMax.value = value)
const getDataMax = () => totalMax.value
const data = ref({
uid: uid.value,
up3: up3.value,
posko: posko.value,
periode: '',
minTime: getDataMin().split(' ')[0],
maxTime: getDataMax().split(' ')[0]
})
const setUid = (value: any) => {
uid.value = value
selectedUid(value)
up3.value = { id: 0, name: up3Placeholder }
data.value.uid = value
}
const setUp3 = (value: any) => {
up3.value = value
selectedUp3Posko(value)
posko.value = { id: 0, name: poskoPlaceholder }
data.value.up3 = value
}
const setPosko = (value: any) => {
posko.value = value
selectedPosko(value)
data.value.posko = value
}
const setMin = (value: any) => {
console.log(value)
data.value.minTime = value
setDataMin(value)
}
const setMax = (value: any) => {
data.value.maxTime = value
setDataMax(value)
}
const triggerInput = ref(false)
const changeDuration = (value: any) => {
if (value.id === 0) {
setMin('1')
setMax('5')
triggerInput.value = false
isHidden.value = false
} else if (value.id === 1) {
setMin(props.slaOptions[0].min)
setMax(props.slaOptions[0].max)
triggerInput.value = true
isHidden.value = true
} else {
setMin(props.slaOptions[1].min)
setMax(props.slaOptions[1].max)
triggerInput.value = true
isHidden.value = true
}
}
watch(data, (newValue) => {
emit('update:filters', newValue)
})
onMounted(() => {
fetchUid()
emit('update:filters', data.value)
})
</script>
<template>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">
<div class="flex flex-col flex-1 space-y-2">
<label class="filter-input-label">Unit Induk Distribusi/Wilayah:</label>
<Select @update:selected="setUid($event)" :data="itemsUid" :placeholder="uidPlaceholder" />
</div>
<div class="flex flex-col flex-1 space-y-2">
<label class="filter-input-label">Unit Pelaksanaan Pelayanan Pelanggan:</label>
<Select @update:selected="setUp3($event)" :data="itemsUp3" :selected="up3" :placeholder="up3Placeholder" />
</div>
<div class="flex flex-col flex-1 space-y-2">
<label class="filter-input-label">Posko:</label>
<Select @update:selected="setPosko($event)" :data="itemsPosko" :selected="posko"
:placeholder="poskoPlaceholder" />
</div>
<div class="flex flex-col flex-1 space-y-2">
<label class="filter-input-label">Periode Tanggal:</label>
<DatePicker @update:date-value="(value) => (data.periode = value)" />
</div>
<div class="flex flex-col flex-1 space-y-2">
<label class="filter-input-label">Durasi:</label>
<div class="flex flex-col gap-y-1">
<Select @update:selected="changeDuration($event)" :data="sla" placeholder="Durasi Menit" />
<div class="flex flex-1 justify-between gap-x-1.5" :class="[isHidden ? 'hidden' : '']">
<InputWithSuffix :value="`${data.minTime} Menit`" @update:text="setMin($event)" class="flex flex-1" />
<small class="flex items-center">s/d</small>
<InputWithSuffix :value="`${data.maxTime} Menit`" @update:text="setMax($event)" class="flex flex-1" />
</div>
</div>
</div>
</div>
</template>