281 lines
13 KiB
HTML
281 lines
13 KiB
HTML
<group-el label="Daftar Agen Perubahan" id="agGroup">
|
|
<div style="text-align: center; font-weight: 600; margin: .8em 0; font-size: 1.1em;">
|
|
Daftar Agen Perubahan<br>
|
|
<span id="uk"></span>
|
|
</div>
|
|
<div style="max-height: calc(70vh - 6em); overflow: auto; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="agWrapper">
|
|
<table id="agents" class="bordered selectable">
|
|
<colgroup>
|
|
<col style="width: 4ch;">
|
|
<col style="width: 27ch;">
|
|
<col>
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>No</th>
|
|
<th>NIP</th>
|
|
<th>Nama Agen</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="agEmpty">
|
|
<tr>
|
|
<td colspan="3" style="text-align: center;">
|
|
Data Kosong
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody id="agContent" hidden>
|
|
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</group-el>
|
|
<group-el label="Program Kerja" id="pkGroup" collapsed disabled>
|
|
<div style="text-align: center; font-weight: 600; margin: .8em 0; font-size: 1.1em;">
|
|
Program Kerja Agen Perubahan<br>
|
|
<span id="agName"></span>
|
|
</div>
|
|
<div style="display: flex; justify-content: space-between; padding: 0 2.5ch;">
|
|
<span>Tahun:
|
|
<select id="pkYear" style="width: max-content;">
|
|
|
|
</select>
|
|
</span>
|
|
|
|
</div>
|
|
<div style="max-height: calc(68vh - 6em); overflow: auto; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="pkWrapper">
|
|
<table id="proker" class="bordered selectable">
|
|
<colgroup>
|
|
<col style="width: 4ch;">
|
|
<col style="width: 27ch;">
|
|
<col style="min-width: 12ch;">
|
|
<col style="width: 8ch;">
|
|
<col style="width: 17ch;">
|
|
<col style="width: 16ch;">
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>No</th>
|
|
<th>Kegiatan</th>
|
|
<th>Sasaran</th>
|
|
<th>Target Waktu</th>
|
|
<th>Waktu Mulai</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="empty">
|
|
<tr>
|
|
<td colspan="6" style="text-align: center;">Data Kosong</td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody id="pkContent" hidden>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</group-el>
|
|
<script type="module">
|
|
let prokers = [];
|
|
const kegiatanName = [
|
|
"Sebagai Katalis",
|
|
"Sebagai Penggerak Perubahan",
|
|
"Sebagai Pemberi Solusi",
|
|
"Sebagai Mediator",
|
|
"Sebagai Penghubung"
|
|
]
|
|
const statusName = [
|
|
"Draft",
|
|
"Ditolak",
|
|
"Diajukan",
|
|
"Berjalan",
|
|
"Lebih Awal",
|
|
"Tepat Waktu",
|
|
"Terlambat",
|
|
"Tidak Terlaksana"
|
|
]
|
|
async function populateProker(agentID)
|
|
{
|
|
if(!agentID) return false;
|
|
const loadid = moly.loadScreen.show("Memuat Daftar Program Kerja...","bar","#pkWrapper");
|
|
prokers = await getJson('/api/getprokers');
|
|
if (prokers.status != 200 || prokers.length < 1)
|
|
{
|
|
moly.loadScreen.close(loadid);
|
|
return;
|
|
}
|
|
$('#agName').text(agents.find(a=>a.agentID == agentID)?.name);
|
|
prokers.data = prokers.data.filter(e=>e.ownerID == agentID);
|
|
$('#pkYear').empty();
|
|
const years = [];
|
|
prokers = prokers.data.reduce((a,v)=>{
|
|
const aindex = a.findIndex(e=>e.prokerID == v.prokerID);
|
|
if(!years.includes(v.year))
|
|
{
|
|
years.push(v.year);
|
|
const opt = moly.newElement("option");
|
|
opt.value = v.year;
|
|
opt.append(v.year);
|
|
$('#pkYear').append(opt);
|
|
}
|
|
if(aindex >=0)
|
|
{
|
|
a[aindex].journal.push({
|
|
journalID: v.journalID,
|
|
submitterID: v.submitterID,
|
|
notes: v.notes,
|
|
status: v.status,
|
|
document: v.document,
|
|
timeStamp: v.timeStamp.replace("T"," ")
|
|
})
|
|
a[aindex].journal.sort((ja,jb)=>ja.journalID.localeCompare(jb.journalID));
|
|
}
|
|
else
|
|
{
|
|
const nv = JSON.parse(JSON.stringify(v));
|
|
nv.journal= [{
|
|
journalID: v.journalID,
|
|
submitterID: v.submitterID,
|
|
notes: v.notes,
|
|
status: v.status,
|
|
document: v.document,
|
|
timeStamp: v.timeStamp.replace("T"," ")
|
|
}]
|
|
const owner = agents.find(e=> e.agentID == v.ownerID)
|
|
if (owner)
|
|
{
|
|
nv.owner = owner
|
|
delete nv.ownerID
|
|
}
|
|
delete nv.journalID;
|
|
delete nv.submitterID;
|
|
delete nv.notes;
|
|
delete nv.status;
|
|
delete nv.document;
|
|
delete nv.timeStamp;
|
|
a.push(nv);
|
|
}
|
|
return a;
|
|
},[]);
|
|
$('#pkYear').val(years.length > 0 ? years[0] : "");
|
|
$('#submitProker').prop("disabled",years.length < 1);
|
|
$('#pkYear').change(()=>{
|
|
fillProker();
|
|
})
|
|
fillProker();
|
|
moly.loadScreen.close(loadid);
|
|
return prokers.length > 0;
|
|
}
|
|
function fillProker()
|
|
{
|
|
$('#proker #empty').prop("hidden", prokers.length > 0);
|
|
$('#proker #pkContent').prop("hidden", prokers.length < 1);
|
|
$('#proker #pkContent').empty();
|
|
const listedProkers = prokers.filter(e=>e.year == Number($('#pkYear').val()));
|
|
$('#submitProker').prop("disabled",!(listedProkers.length > 0 && listedProkers[0].journal.at(-1).status < 2));
|
|
const statusStyles =[
|
|
"text-align: center; background-color: var(--secondary-foreground); color: var(--primary-background)",
|
|
"text-align: center; background-color: var(--neutral-n-accent); color: var(--primary-foreground)",
|
|
"text-align: center; background-color: var(--positive-accent); color: var(--primary-foreground)",
|
|
"text-align: center; background-color: unset; color: unset",
|
|
"text-align: center; background-color: var(--positive-accent); color: var(--primary-foreground)",
|
|
"text-align: center; background-color: var(--neutral-p-accent); color: var(--primary-foreground)",
|
|
"text-align: center; background-color: var(--neutral-n-accent); color: var(--primary-foreground)",
|
|
"text-align: center; background-color: var(--negative-accent); color: var(--primary-background)",
|
|
"text-align: center; box-shadow: inset 0 0 1.5ch 0.25ch var(--positive-accent)", // belum jadwalnya
|
|
"text-align: center; box-shadow: inset 0 0 1.5ch 0.25ch var(--neutral-p-accent)", // berjalan
|
|
"text-align: center; box-shadow: inset 0 0 1.5ch 0.25ch var(--neutral-n-accent)", // hampir deadline
|
|
"text-align: center; box-shadow: inset 0 0 1.5ch 0.25ch var(--negative-accent)" // terlambat
|
|
];
|
|
$.each(listedProkers,(i,v)=>{
|
|
|
|
const ro = moly.newElement("tr");
|
|
const no = moly.newElement("td");
|
|
const kg = moly.newElement("td");
|
|
const ss = moly.newElement("td");
|
|
const tw = moly.newElement("td");
|
|
const wm = moly.newElement("td");
|
|
const st = moly.newElement("td");
|
|
ro.append(no);
|
|
ro.append(kg);
|
|
ro.append(ss);
|
|
ro.append(tw);
|
|
ro.append(wm);
|
|
ro.append(st);
|
|
no.append((i+1)+".");
|
|
no.style.textAlign = "right";
|
|
kg.append(kegiatanName[v.kegiatan]);
|
|
ss.append(v.sasaran);
|
|
ss.setAttribute("title",v.sasaran);
|
|
tw.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`);
|
|
tw.style.textAlign = "center";
|
|
wm.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year));
|
|
wm.style.textAlign = "right";
|
|
const Now = new Date();
|
|
const doneline = new Date(v.journal.at(-1).timeStamp);
|
|
const lifeline = (v.isInMonth ? new Date(v.year, v.startMonth -1, 1) : new Date(v.year, v.startMonth -1, v.startDay)).setHours(0,0,0,0);
|
|
const deadline = new Date((v.isInMonth ? new Date(v.year, v.startMonth + v.timeTarget, 0) : new Date(v.year, v.startMonth -1, v.startDay + v.timeTarget)).setHours(23,59,59));
|
|
const neardeadline = new Date((new Date(deadline)).setDate(deadline.getDate() - 15)).setHours(0,0,0,0);
|
|
// v.status = v.journal.at(-1).status == 4 && doneline < lifeline ? 4 : v.journal.at(-1).status == 4 && doneline <= deadline ? 5 : v.journal.at(-1).status == 4 && doneline > deadline ? 6 : v.journal.at(-1).status == 3 && v.year < Now.getFullYear() ? 7 : 3;
|
|
v.status = v.journal.at(-1).status == 8 ? (v.journal.at(-2).status == 4 && doneline < lifeline ? 4 : v.journal.at(-2).status == 4 && doneline <= deadline ? 5 : v.journal.at(-2).status == 4 && doneline > deadline ? 6 : v.journal.at(-2).status == 3 && v.year < Now.getFullYear() ? 7 : v.journal.at(-2).status) : (v.journal.at(-1).status == 4 && doneline < lifeline ? 4 : v.journal.at(-1).status == 4 && doneline <= deadline ? 5 : v.journal.at(-1).status == 4 && doneline > deadline ? 6 : v.journal.at(-1).status == 3 && v.year < Now.getFullYear() ? 7 : v.journal.at(-1).status);
|
|
st.append(statusName[v.status]);
|
|
v.styleCode = v.status != 3 ? v.status : Now < lifeline ? 8 : Now < neardeadline ? 9 : Now >= neardeadline && Now < deadline ? 10 : 11;
|
|
$(st).text(v.status != 3 ? $(st).text() : Now < lifeline ? "Belum Jadwalnya" : Now < neardeadline ? "Berjalan" : Now >= neardeadline && Now.getDate() == deadline.getDate() && Now.getMonth() == deadline.getMonth() ? "Deadline!" : Now >= neardeadline && Now <= deadline ? "Hampir Deadline" : "Lewat Deadline");
|
|
st.style = statusStyles[v.styleCode];
|
|
$(ro).click(async()=>{
|
|
const vr = await moly.dialog.show({title: "Detil Program Kerja "+v.owner.name, content: "/modules/submission-view.html", fetching: true, data: {startIndex: i, prokers}});
|
|
// console.log(vr);
|
|
if (vr) populateProker(vr);
|
|
})
|
|
$('#proker #pkContent').append(ro);
|
|
});
|
|
}
|
|
async function fillAgents()
|
|
{
|
|
const loadid = moly.loadScreen.show("Memuat data agen...","bar","#agWrapper");
|
|
$('#agContent').empty();
|
|
const users = await getJson("/api/getusers");
|
|
if(users.status != 200)
|
|
{
|
|
moly.alert.show("Gagal Memuat Data","Data pengguna tidak berhasil dimuat. Silakan ulangi kembali beberapa saat lagi.")
|
|
moly.loadScreen.close(loadid);
|
|
return;
|
|
}
|
|
let num = 1;
|
|
$.each(agents,(_,v)=>{
|
|
if (users.data.find(u=>u.agentID == v.agentID).level != 3) return;
|
|
const ro = moly.newElement("tr");
|
|
const no = moly.newElement("td");
|
|
const ni = moly.newElement("td");
|
|
const na = moly.newElement("td");
|
|
ro.append(no)
|
|
ro.append(ni)
|
|
ro.append(na)
|
|
no.append(num + ".");
|
|
num++;
|
|
no.style.textAlign = "right";
|
|
ni.append(v.agentID);
|
|
ni.style.textAlign = "center";
|
|
na.append(v.name);
|
|
$(ro).click(async ()=>{
|
|
if (!await populateProker(v.agentID))
|
|
{
|
|
moly.alert.show("Program Kerja Kosong",`Agen ${v.name} tidak memiliki Program Kerja.`)
|
|
return;
|
|
}
|
|
$('#agGroup').prop("collapsed",true);
|
|
$('#pkGroup').prop("collapsed",false);
|
|
$('#pkGroup').prop("disabled",false);
|
|
});
|
|
$('#agContent').append(ro);
|
|
})
|
|
$('#agEmpty').prop("hidden",agents.length > 0);
|
|
$('#agContent').prop("hidden",agents.length < 1);
|
|
moly.loadScreen.close(loadid);
|
|
}
|
|
$(document).ready(async()=>{
|
|
$('#uk').text(userDetails.info.unitKerja);
|
|
fillAgents();
|
|
$($('#agGroup')[0].shadowRoot).find("group-label>a-button")[0].addEventListener("click",()=>{
|
|
$('#pkGroup').prop("collapsed",!$('#agGroup').prop("collapsed"));
|
|
});
|
|
})
|
|
</script> |