Reports done. Eval rating supported

This commit is contained in:
nugroho 2025-07-06 00:09:26 +07:00
parent 95d23a3239
commit 4cf19d1ea7
12 changed files with 978 additions and 151 deletions

View File

@ -1,4 +1,4 @@
vernum = "1.0.250601.1020" vernum = "1.0.250704.0335"
async function getJson(url,headers={}) { async function getJson(url,headers={}) {
try { try {
const response = await fetch(url); const response = await fetch(url);

View File

@ -21,6 +21,7 @@
} }
*::-webkit-scrollbar, .main::-webkit-scrollbar { *::-webkit-scrollbar, .main::-webkit-scrollbar {
width: .8ch; width: .8ch;
height: .8ch;
} }
/* Scrollbar thumb (the draggable part) */ /* Scrollbar thumb (the draggable part) */
@ -28,16 +29,15 @@
background: var(--secondary-background); /* Dark semi-transparent */ background: var(--secondary-background); /* Dark semi-transparent */
border-radius: .2ch; /* Rounded edges */ border-radius: .2ch; /* Rounded edges */
} }
/* body *::-webkit-scrollbar-track, .main::-webkit-scrollbar-track {
{ background: var(--input-background);
height: 100%; }
} */
h2, h3, h4 h2, h3, h4
{ {
margin: .25em 0; margin: .25em 0;
} }
aside aside
{ {
display: block; display: block;
position: absolute; position: absolute;
top: 0; top: 0;
@ -49,19 +49,19 @@ aside
padding: .5ch; padding: .5ch;
padding-top: 3.5em; padding-top: 3.5em;
box-shadow: var(--primary-foreground) .65ch 0, inset var(--primary-foreground) -13px 0 20px -25px; box-shadow: var(--primary-foreground) .65ch 0, inset var(--primary-foreground) -13px 0 20px -25px;
} }
.logobox .logobox
{ {
height: 3em; height: 3em;
position: fixed; position: absolute;
top: .5ch; top: .5ch;
left: 0; left: 0;
width: inherit; width: inherit;
padding: 0 .5ch .5ch .5ch; padding: 0 .5ch .5ch .5ch;
border-bottom: 1px solid var(--secondary-background); border-bottom: 1px solid var(--secondary-background);
} }
.sidebar .sidebar
{ {
display: block; display: block;
position: absolute; position: absolute;
top: calc(3em + 1ch); top: calc(3em + 1ch);
@ -69,18 +69,18 @@ aside
width: calc(100% - .25ch); width: calc(100% - .25ch);
max-height: calc(100% - (3em + 1.5ch)); max-height: calc(100% - (3em + 1.5ch));
overflow-x: auto; overflow-x: auto;
} }
.sidebar::-webkit-scrollbar, .main::-webkit-scrollbar { .sidebar::-webkit-scrollbar, .main::-webkit-scrollbar {
width: .8ch; width: .8ch;
} }
/* Scrollbar thumb (the draggable part) */ /* Scrollbar thumb (the draggable part) */
.sidebar::-webkit-scrollbar-thumb, .main::-webkit-scrollbar-thumb { .sidebar::-webkit-scrollbar-thumb, .main::-webkit-scrollbar-thumb {
background: var(--secondary-background); /* Dark semi-transparent */ background: var(--secondary-background); /* Dark semi-transparent */
border-radius: .2ch; /* Rounded edges */ border-radius: .2ch; /* Rounded edges */
} }
.item .item
{ {
height: 2em; height: 2em;
line-height: 2em; line-height: 2em;
margin-left: 1ch; margin-left: 1ch;
@ -91,21 +91,21 @@ aside
border-radius: .25ch; border-radius: .25ch;
cursor: default; cursor: default;
user-select: none; user-select: none;
} }
.item:hover .item:hover
{ {
filter: brightness(1.2); filter: brightness(1.2);
} }
.item[data-active] .item[data-active]
{ {
filter: brightness(1.4); filter: brightness(1.4);
} }
.sub.item .sub.item
{ {
padding-left: 3ch; padding-left: 3ch;
} }
#main #main
{ {
display: block; display: block;
position: relative; position: relative;
margin-left: 30ch; margin-left: 30ch;
@ -114,9 +114,9 @@ aside
overflow: auto; overflow: auto;
backdrop-filter: blur(7px); backdrop-filter: blur(7px);
background-color: var(--semi-background); background-color: var(--semi-background);
} }
nav nav
{ {
display: grid; display: grid;
grid-template-columns: auto 1fr auto; grid-template-columns: auto 1fr auto;
height: 3em; height: 3em;
@ -124,16 +124,16 @@ nav
padding-right: 2ch; padding-right: 2ch;
line-height: 3em; line-height: 3em;
border-bottom: 1px solid var(--input-background); border-bottom: 1px solid var(--input-background);
} }
#content #content
{ {
display: block; display: block;
width: 100%; width: 100%;
min-height: calc(100% - 6em); min-height: calc(100% - 6em);
padding: .5ch 1ch; padding: .5ch 1ch;
} }
#footer #footer
{ {
height: 3em; height: 3em;
padding: .5em; padding: .5em;
line-height: 2em; line-height: 2em;
@ -141,7 +141,7 @@ nav
display: grid; display: grid;
grid-template-columns: auto 1fr auto; grid-template-columns: auto 1fr auto;
color: var(--secondary-foreground); color: var(--secondary-foreground);
} }
</style> </style>
</head> </head>
<body style="margin: 0; height: 100%; background-color: var(--primary-background);"> <body style="margin: 0; height: 100%; background-color: var(--primary-background);">
@ -184,6 +184,7 @@ nav
&nbsp; &nbsp;
<div> <div>
<span id="username">User Name</span> <span id="username">User Name</span>
<div id="prof" style="height: 2.5em; width: 2.5em; vertical-align: middle; display: inline-block; border-radius: 1.25em; background-repeat:no-repeat; background-size: cover; background-position: center top;"></div>
<sep-bar></sep-bar> <sep-bar></sep-bar>
<a-button type="blend" id="lo"><m-inline>logout</m-inline> Keluar</a-button> <a-button type="blend" id="lo"><m-inline>logout</m-inline> Keluar</a-button>
</div> </div>
@ -254,7 +255,8 @@ nav
}); });
if(res.status == 200) location = "/login.html"; if(res.status == 200) location = "/login.html";
}); });
$('#username').text(loggedInAgent.name) $('#username').text(loggedInAgent.name);
$('#prof').css("background-image","url("+(loggedInAgent.photoURL ?? "/assets/images/generic-user.webp")+")");
$('.item, .subitem').click(async (e)=>{ $('.item, .subitem').click(async (e)=>{
if (window.shellnavigating) return; if (window.shellnavigating) return;
window.dispatchEvent(new Event("viewChange")); window.dispatchEvent(new Event("viewChange"));

View File

@ -184,7 +184,7 @@
const sortedProkers = [...currProkers].filter(r=>r.journal.at(-1).status >= 1 && r.journal.at(-1).status <=3 ).sort((a,b)=>a.deadline - b.deadline); const sortedProkers = [...currProkers].filter(r=>r.journal.at(-1).status >= 1 && r.journal.at(-1).status <=3 ).sort((a,b)=>a.deadline - b.deadline);
const closest = sortedProkers.find(p=>p.journal.at(-1).status == 2); const closest = sortedProkers.find(p=>p.journal.at(-1).status == 2);
µ('#udate').text(closest ? `${closest.deadline.getFullYear()}/${(closest.deadline.getMonth()+1).toString().padStart(2,"0")}/${closest.deadline.getDate().toString().padStart(2,"0")}` : ""); µ('#udate').text(closest ? `${closest.deadline.getFullYear()}/${(closest.deadline.getMonth()+1).toString().padStart(2,"0")}/${closest.deadline.getDate().toString().padStart(2,"0")}` : "");
µ('#utext').text(closest ? closest.sasaran : ""); µ('#utext').text(closest ? (closest.owner.name + ": " + closest.sasaran) : "");
const todayActs = sortedProkers.filter(p=> const todayActs = sortedProkers.filter(p=>
{ {
const today = new Date(); const today = new Date();
@ -204,7 +204,7 @@
s.append(v.journal.at(-1).status == 1 ? `Ditolak: `: v.journal.at(-1).status == 2 ? `Diajukan: ` : `Disetujui: `); s.append(v.journal.at(-1).status == 1 ? `Ditolak: `: v.journal.at(-1).status == 2 ? `Diajukan: ` : `Disetujui: `);
s.style.fontWeight = "600" s.style.fontWeight = "600"
s.style.color = v.journal.at(-1).status == 1 ? "var(--neutral-p-accent)": v.journal.at(-1).status == 2 ? "var(--neutral-n-accent)" : "var(--positive-accent)" s.style.color = v.journal.at(-1).status == 1 ? "var(--neutral-p-accent)": v.journal.at(-1).status == 2 ? "var(--neutral-n-accent)" : "var(--positive-accent)"
t.append(v.sasaran) t.append(v.owner.name +": "+v.sasaran)
µ('#htoday').append(d); µ('#htoday').append(d);
}); });
moly.loadScreen.close(loadid); moly.loadScreen.close(loadid);

View File

@ -50,7 +50,6 @@
<script type="module"> <script type="module">
const thisDialog = moly.lastDialog(); const thisDialog = moly.lastDialog();
const data = thisDialog.data; const data = thisDialog.data;
console.log(data);
function µ(selector) function µ(selector)
{ {
if (selector) return $(thisDialog.box).find(selector); if (selector) return $(thisDialog.box).find(selector);

View File

@ -13,12 +13,12 @@
<a-button id="newProker">Tambah Kegiatan</a-button> <a-button id="newProker">Tambah Kegiatan</a-button>
</div> </div>
</div> </div>
<div style="max-height: calc(50vh - 6em); overflow-y: scroll; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="pkWrapper"> <div style="max-height: calc(80vh - 6em); overflow: auto; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="pkWrapper">
<table id="proker" class="bordered selectable"> <table id="proker" class="bordered selectable">
<colgroup> <colgroup>
<col style="width: 4ch;"> <col style="width: 4ch;">
<col style="width: 27ch;"> <col style="width: 27ch;">
<col> <col style="min-width: 12ch;">
<col style="width: 8ch;"> <col style="width: 8ch;">
<col style="width: 17ch;"> <col style="width: 17ch;">
<col style="width: 16ch;"> <col style="width: 16ch;">
@ -174,6 +174,7 @@
no.style.textAlign = "right"; no.style.textAlign = "right";
kg.append(kegiatanName[v.kegiatan]); kg.append(kegiatanName[v.kegiatan]);
ss.append(v.sasaran); ss.append(v.sasaran);
ss.setAttribute("title",v.sasaran)
tw.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`); tw.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`);
tw.style.textAlign = "center"; tw.style.textAlign = "center";
wm.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year)); wm.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year));

585
modules/laporan-view.html Normal file
View File

@ -0,0 +1,585 @@
<div style="display: grid; width: calc(90vw - 3ch); height: calc(90vh - 3.5em); grid-template-rows: 1fr auto; row-gap: .5em;">
<div style=>
<div id="vProker" class="viewer" style="height: 100%;" hidden>
<div style="text-align: center; font-size: 1.1em; font-weight: 600;">
Program Kerja Agen Perubahan Tahun <span class="yr"></span>
</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; column-gap: .5ch; margin-bottom: .5em;">
<div style="display: grid; grid-template-columns: auto auto 1fr; column-gap: .5ch;">
<span>Agen</span>
<span>:</span>
<span class="name"></span>
<span>NIP</span>
<span>:</span>
<span class="nip"></span>
<span>Unit Kerja</span>
<span>:</span>
<span class="uk"></span>
</div>
&nbsp;
<div style="display: grid; grid-template-columns: auto auto 1fr; column-gap: .5ch;">
<span>Supervisor</span>
<span>:</span>
<span class="names"></span>
<span>NIP</span>
<span>:</span>
<span class="nips"></span>
&nbsp;
</div>
</div>
<div class="tbwrapper" style="position: absolute; width: 100%; overflow: auto; max-height: calc(100% - 6.25em)">
<table class="bordered">
<colgroup>
<col style="width: 4ch;">
<col style="width: 27ch;">
<col style="min-width: 12ch;">
<col style="width: 8ch;">
<col style="width: 11ch;">
</colgroup>
<thead>
<tr>
<th>No</th>
<th>Kegiatan</th>
<th>Sasaran</th>
<th>Target</th>
<th>Mulai</th>
</tr>
</thead>
<tbody id="pkContent">
</tbody>
</table>
</div>
</div>
<div id="vRenak" class="viewer" style="height: 100%;" hidden>
<div style="text-align: center; font-size: 1.1em; font-weight: 600;">
Rencana Aksi Agen Perubahan Tahun <span class="yr"></span>
</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; column-gap: .5ch; margin-bottom: .5em;">
<div style="display: grid; grid-template-columns: auto auto 1fr; column-gap: .5ch;">
<span>Agen</span>
<span>:</span>
<span class="name"></span>
<span>NIP</span>
<span>:</span>
<span class="nip"></span>
<span>Unit Kerja</span>
<span>:</span>
<span class="uk"></span>
</div>
&nbsp;
<div style="display: grid; grid-template-columns: auto auto 1fr; column-gap: .5ch;">
<span>Supervisor</span>
<span>:</span>
<span class="names"></span>
<span>NIP</span>
<span>:</span>
<span class="nips"></span>
&nbsp;
</div>
</div>
<div class="tbwrapper" style="position: absolute; width: 100%; overflow: auto; max-height: calc(100% - 6.25em)">
<table class="bordered">
<colgroup>
<col style="width: 4ch;">
<col style="min-width: 20ch;">
<col style="width: 20ch;">
<col style="width: 20ch;">
<col style="width: 8ch;">
<col style="min-width: 20ch;">
<col style="width: 11ch;">
<col style="width: 11ch;">
</colgroup>
<thead>
<tr>
<th>No</th>
<th>Inovasi</th>
<th>Sasaran</th>
<th>Indikator</th>
<th>Target</th>
<th>Aksi</th>
<th>Rencana Mulai</th>
<th>Selesai Pada</th>
</tr>
</thead>
<tbody id="raContent">
</tbody>
</table>
</div>
</div>
<div id="vEval" class="viewer" style="height: 100%;" hidden>
<div style="text-align: center; font-size: 1.1em; font-weight: 600;">
Evaluasi Program Kerja Agen Perubahan Tahun <span class="yr"></span>
</div>
<div style="display: grid; grid-template-columns: auto 1fr auto; column-gap: .5ch; margin-bottom: .5em;">
<div style="display: grid; grid-template-columns: auto auto 1fr; column-gap: .5ch;">
<span>Agen</span>
<span>:</span>
<span class="name"></span>
<span>NIP</span>
<span>:</span>
<span class="nip"></span>
<span>Unit Kerja</span>
<span>:</span>
<span class="uk"></span>
</div>
&nbsp;
<div style="display: grid; grid-template-columns: auto auto 1fr; column-gap: .5ch;">
<span>Evaluator</span>
<span>:</span>
<span class="namee"></span>
<span>NIP</span>
<span>:</span>
<span class="nipe"></span>
<span>Rating</span>
<span>:</span>
<span><span id="rating"></span></span>
</div>
</div>
<div class="tbwrapper" style="position: absolute; width: 100%; overflow: auto; max-height: calc(100% - 6.25em)">
<table class="bordered">
<colgroup>
<col style="min-width: 18ch;">
<col style="width: 18ch;">
<col style="width: 18ch;">
<col style="width: 8ch;">
<col style="min-width: 18ch;">
<col style="width: 11ch;">
<col style="width: 11ch;">
<col style="width: 18ch;">
<col style="width: 18ch;">
<col style="width: 3ch;">
</colgroup>
<thead>
<tr>
<th>Inovasi</th>
<th>Sasaran</th>
<th>Indikator</th>
<th>Target</th>
<th>Aksi</th>
<th>Rencana Mulai</th>
<th>Selesai Pada</th>
<th>Kendala dan Solusi</th>
<th>Catatan Evaluasi</th>
<th></th>
</tr>
</thead>
<tbody id="evContent">
</tbody>
</table>
</div>
</div>
</div>
<div style="display: grid; grid-template-columns: auto auto 1fr auto; gap: .25ch;">
<div>
<button id="proker">Program Kerja</button>
</div>
<div>
<button id="renak">Rencana Aksi</button>
</div>
<div>
<button id="eval">Evaluasi</button>
</div>
<button id="print"><m-inline>print</m-inline></button>
</div>
</div>
<script type="module">
const thisDialog = moly.lastDialog();
const data = thisDialog.data;
const loadid = moly.loadScreen.show("Menyiapkan Laporan...","dots","#"+µ('[id^="db"]')[0].id);
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"
]
// console.log(data)
function µ(selector)
{
if (selector) return $(thisDialog.box).find(selector);
return $(thisDialog.box);
}
let units = await getJson("/api/getunits");
if(units.status != 200)
{
moly.loadScreen.update(loadid,"Gagal mengumpulkan data. Harap ulangi beberapa saat lagi.");
}
units = units.data;
data.unitKerja = units.find(u=>u.deplID == data.deplID)?.unitKerja;
µ('#proker').click(()=>{
µ('.viewer').prop("hidden",true);
µ('.viewer').removeClass("print");
µ('#vProker').prop("hidden",false);
µ('#vProker').addClass("print");
µ('.positive').removeClass("positive");
µ('#proker').addClass("positive");
const printTitle = `Program Kerja Agen Perubahan ${data.name} Tahun ${data.prokers[0].year}`;
µ('#print').off("click").click(()=>{
const content = µ('.print')[0];
if(!content) return;
const pw = window.open('', '_blank');
pw.document.write(`
<html>
<head>
<title>${printTitle}</title>
<link rel="stylesheet" href="/assets/css/fonts.css">
<link rel="stylesheet" href="/assets/css/molybdenum.css">
<style>
@page {
margin: 1cm;
size: A4 landscape;
}
body {
margin: 0;
padding: 0;
font-size: 10pt !important;
}
table.bordered, table.bordered th , table.bordered td {
border: 1px solid var(--secondary-background);
font-size: 10pt !important;
}
table td {
white-space: normal !important;
overflow: visible !important;
text-overflow: unset !important;
}
.tbwrapper
{
overflow: unset !important;
max-height: unset !important;
}
tr {
break-inside: avoid;
}
</style>
</head>
<body>
${content.innerHTML}
<script>
requestAnimationFrame(() => {
setTimeout(() => {
window.print();
// window.close();
}, 100); // small delay ensures DOM is painted
});
<\/script>
</body>
</html>
`);
pw.document.close();
});
});
µ('#renak').click(()=>{
µ('.viewer').prop("hidden",true);
µ('.viewer').removeClass("print");
µ('#vRenak').prop("hidden",false);
µ('#vRenak').addClass("print");
µ('.positive').removeClass("positive");
µ('#renak').addClass("positive");
const printTitle = `Rencana Aksi Agen Perubahan ${data.name} Tahun ${data.prokers[0].year}`;
µ('#print').off("click").click(()=>{
const content = µ('.print')[0];
if(!content) return;
const pw = window.open('', '_blank');
pw.document.write(`
<html>
<head>
<title>${printTitle}</title>
<link rel="stylesheet" href="/assets/css/fonts.css">
<link rel="stylesheet" href="/assets/css/molybdenum.css">
<style>
@page {
margin: 1cm;
size: A4 landscape;
}
body {
margin: 0;
padding: 0;
font-size: 10pt !important;
}
table.bordered, table.bordered th , table.bordered td {
border: 1px solid var(--secondary-background);
font-size: 10pt !important;
}
table td {
white-space: normal !important;
overflow: visible !important;
text-overflow: unset !important;
}
.tbwrapper
{
overflow: unset !important;
max-height: unset !important;
}
tr {
break-inside: avoid;
}
</style>
</head>
<body>
${content.innerHTML}
<script>
requestAnimationFrame(() => {
setTimeout(() => {
window.print();
// window.close();
}, 100); // small delay ensures DOM is painted
});
<\/script>
</body>
</html>
`);
pw.document.close();
});
});
µ('#eval').click(()=>{
µ('.viewer').prop("hidden",true);
µ('.viewer').removeClass("print");
µ('#vEval').prop("hidden",false);
µ('#vEval').addClass("print");
µ('.positive').removeClass("positive");
µ('#eval').addClass("positive");
const printTitle = `Hasil Evaluasi Agen Perubahan ${data.name} Tahun ${data.prokers[0].year}`;
µ('#print').off("click").click(()=>{
const content = µ('.print')[0];
if(!content) return;
const pw = window.open('', '_blank');
pw.document.write(`
<html>
<head>
<title>${printTitle}</title>
<link rel="stylesheet" href="/assets/css/fonts.css">
<link rel="stylesheet" href="/assets/css/molybdenum.css">
<style>
@page {
margin: 1cm;
size: A4 landscape;
}
body {
margin: 0;
padding: 0;
font-size: 10pt !important;
}
table.bordered, table.bordered th , table.bordered td {
border: 1px solid var(--secondary-background);
font-size: 10pt !important;
}
table td {
white-space: normal !important;
overflow: visible !important;
text-overflow: unset !important;
}
.tbwrapper
{
overflow: unset !important;
max-height: unset !important;
}
tr {
break-inside: avoid;
}
</style>
</head>
<body>
${content.innerHTML}
<script>
requestAnimationFrame(() => {
setTimeout(() => {
window.print();
// window.close();
}, 100); // small delay ensures DOM is painted
});
<\/script>
</body>
</html>
`);
pw.document.close();
});
});
µ('#print').off("click").click(()=>{
const content = µ('.print')[0];
if(!content) return;
const pw = window.open('', '_blank');
pw.document.write(`
<html>
<head>
<title>${printTitle}</title>
<link rel="stylesheet" href="/assets/css/fonts.css">
<link rel="stylesheet" href="/assets/css/molybdenum.css">
<style>
@page {
margin: 1cm;
size: A4 landscape;
}
body {
margin: 0;
padding: 0;
font-size: 10pt !important;
}
</style>
</head>
<body>
${content.innerHTML}
<script>
requestAnimationFrame(() => {
setTimeout(() => {
window.print();
// window.close();
}, 100); // small delay ensures DOM is painted
});
<\/script>
</body>
</html>
`);
pw.document.close();
});
let str = "☆☆☆☆☆";
for(let s=1;s<=data.rating;s++)
{
str = "★" + str;
str = str.substring(0,5);
}
str += ` (${data.rating})`
µ('#rating').text(str);
µ('.yr').text(data.prokers[0].year);
µ('.name').text(data.name);
µ('.nip').text(data.agentID);
const spv = agents.find(a=>a.agentID == data.prokers[0].journal.find(j=>j.status == 2).submitterID);
µ('.names').text(spv.name);
µ('.nips').text(spv.agentID);
const evd = data.prokers.find(p=>p.evaled)?.journal.find(j=>j.status == 8);
µ('#eval').prop("disabled", (!evd));
const evr = agents.find(a=>a.agentID == evd?.submitterID);
µ('.namee').text(evr?.name);
µ('.nipe').text(evr?.agentID);
µ('.uk').text(data.unitKerja);
µ('.uk').text(data.unitKerja);
function populateReport()
{
µ('#pkContent').empty();
µ('#raContent').empty();
µ('#evContent').empty();
$.each(data.prokers,(i,v)=>{
const ro = moly.newElement("tr");
const no = moly.newElement("td");
const kg = moly.newElement("td");
const ss = moly.newElement("td");
const tg = moly.newElement("td");
const st = moly.newElement("td");
ro.append(no);
ro.append(kg);
ro.append(ss);
ro.append(tg);
ro.append(st);
no.style.textAlign
= "right";
tg.style.textAlign
= "center";
no.append((i+1)+".");
kg.append(kegiatanName[v.kegiatan]);
ss.append(v.sasaran);
tg.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`);
// st.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year));
st.append((v.year+"/"+v.startMonth.toString().padStart(2,"0")) + (!v.isInMonth ? ("/"+v.startDay.toString().padStart(2,"0")) : ""));
µ('#pkContent').append(ro);
const rro = moly.newElement("tr");
const rno = moly.newElement("td");
const inv = moly.newElement("td");
const ssr = moly.newElement("td");
const ind = moly.newElement("td");
const tgt = moly.newElement("td");
const act = moly.newElement("td");
const str = moly.newElement("td");
const end = moly.newElement("td");
rro.append(rno);
rro.append(inv);
rro.append(ssr);
rro.append(ind);
rro.append(tgt);
rro.append(act);
rro.append(str);
rro.append(end);
rno.style.textAlign
="right";
tgt.style.textAlign
="center";
rno.append((i+1)+".");
inv.append(v.sasaran);
ssr.append(v.entityTarget);
ind.append(v.indicators);
tgt.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`);
act.append(v.actions);
// str.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year));
str.append((v.year+"/"+v.startMonth.toString().padStart(2,"0")) + (!v.isInMonth ? ("/"+v.startDay.toString().padStart(2,"0")) : ""));
end.append(!v.completed ? "Belum" : v.journal.find(j=>j.status == 4).timeStamp.replaceAll("-","/").substring(0,10))
µ('#raContent').append(rro);
// if(!evd) return;
const ero = moly.newElement("tr");
const env = moly.newElement("td");
const ess = moly.newElement("td");
const ein = moly.newElement("td");
const etg = moly.newElement("td");
const eac = moly.newElement("td");
const est = moly.newElement("td");
const edn = moly.newElement("td");
const eks = moly.newElement("td");
const ems = moly.newElement("td");
const ert = moly.newElement("td");
ero.append(env);
ero.append(ess);
ero.append(ein);
ero.append(etg);
ero.append(eac);
ero.append(est);
ero.append(edn);
ero.append(eks);
ero.append(ems);
ero.append(ert);
// <th>Inovasi</th>
// <th>Sasaran</th>
// <th>Indikator</th>
// <th>Target</th>
// <th>Aksi</th>
// <th>Rencana Mulai</th>
// <th>Selesai Pada</th>
// <th>Kendala dan Solusi</th>
// <th>Catatan Evaluasi</th>
// <th></th>
//evContent
env.append(v.sasaran);
ess.append(v.entityTarget);
ein.append(v.indicators);
etg.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`);
eac.append(v.actions);
est.append((v.year+"/"+v.startMonth.toString().padStart(2,"0")) + (!v.isInMonth ? ("/"+v.startDay.toString().padStart(2,"0")) : ""));
edn.append(!v.completed ? "(Belum Selesai)" : v.journal.find(j=>j.status == 4).timeStamp.replaceAll("-","/").substring(0,10));
const done = v.completed ? v.journal.find(j=>j.status == 4) : {};
const ks = v.completed ? JSON.parse(done.notes) : {}
const ksstr = v.completed ? (
`Kendala:
${(ks.kendala.length > 0 ? ks.kendala : "-")}
Solusi:
${(ks.solusi.length > 0 ? ks.solusi : "-")}`
) : "(Belum Selesai)"
eks.append(ksstr);
eks.style.setProperty("white-space", "pre-line", "important");
const evalj = v.evaled ? v.journal.find(j=>j.status == 8) : {};
const ev = v.evaled ? JSON.parse(evalj.notes) : {m:"(Belum Evaluasi)",r:0}
ems.append(ev.m);
ert.append(ev.r);
µ('#evContent').append(ero);
})
}
populateReport();
µ('#proker').click();
if (!units.status) moly.loadScreen.close(loadid);
</script>

View File

@ -1,3 +1,176 @@
<div style="text-align: center;"> <div style="text-align: center; font-weight: 600; margin: .8em 0; font-size: 1.1em;">
Belum Cukup Data Laporan Aksi Perubahan<br>
<span id="uk"></span>
</div> </div>
<div style="margin: 0 2ch;">
Tahun&nbsp;
<select id="pkYear" style="width: max-content;">
</select>
</div>
<div style="max-height: calc(78vh - 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: 22ch;">
<col style="min-width: 20ch;">
<col style="width: 9ch;">
</colgroup>
<thead>
<tr>
<th>No</th>
<th>NIP</th>
<th>Nama Agen</th>
<th>Rating Kinerja</th>
</tr>
</thead>
<tbody id="agEmpty">
<tr>
<td colspan="4" style="text-align: center;">
Data Kosong
</td>
</tr>
</tbody>
<tbody id="agContent" hidden>
</tbody>
</table>
</div>
<script type="module">
window.prokers = [];
async function getProkers()
{
const loadid = moly.loadScreen.show("Memuat data...","bar","#agWrapper");
const getprokers = await getJson("/api/getprokers");
if (getprokers.status != 200)
{
moly.alert.show("Gagal Memuat Data","Data Program Kerja tidak berhasil dimuat. Silakan ulangi kembali beberapa saat lagi.");
moly.loadScreen.close(loadid);
return;
}
let years = [];
prokers = getprokers.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;
},[]).filter(p=>p.owner); //filter untested!
//============AGENTS TABLE FILLING STARTS HERE======================
$('#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;
const repAgents = JSON.parse(JSON.stringify(agents))
$.each(repAgents,(_,v)=>{
if (users.data.find(u=>u.agentID == v.agentID).level != 3) return;
v.prokers = prokers.filter(p=>p.owner.agentID == v.agentID);
delete v.owner;
if(v.prokers.length<=0)
{
v.approved = false;
v.rating = 0;
}
else
{
v.approved = v.prokers[0].journal.at(-1).status >= 3
v.rating = 0;
$.each(v.prokers,(_,y)=>{
y.completed = y.journal.at(-1).status >= 4;
y.evaled = y.journal.at(-1).status == 8;
y.rating = y.evaled ? JSON.parse(y.journal.at(-1).notes).r : 0;
v.rating += y.rating;
});
v.completed = v.prokers.every(p=>p.completed);
v.evaled = v.prokers.every(p=>p.evaled);
v.rating = Number((v.rating / v.prokers.length).toFixed(2));
}
//====EXPAND LATER. WON'T WORK WELL LIKE THIS
const ro = moly.newElement("tr");
const no = moly.newElement("td");
const ni = moly.newElement("td");
const na = moly.newElement("td");
const ra = moly.newElement("td");
ro.append(no);
ro.append(ni);
ro.append(na);
ro.append(ra);
no.append(num + ".");
num++;
no.style.textAlign = "right";
ni.append(v.agentID);
ni.style.textAlign
= ra.style.textAlign
= "center";
na.append(v.name);
$(ro).click(async()=>{
if(!v.approved)
{
moly.alert.show("Belum Ada Program Kerja",`Agen ${v.name} belum memiliki program kerja yang disetujui.`);
return;
}
await moly.dialog.show({title:"Laporan Kerja Agen Perubahan "+v.name, content:"/modules/laporan-view.html",fetching:true, data: v});
});
ra.append(v.rating);
$('#agContent').append(ro);
})
$('#agEmpty').prop("hidden",repAgents.length > 0);
$('#agContent').prop("hidden",repAgents.length < 1);
moly.loadScreen.close(loadid);
return;
}
function µ(selector)
{
if (selector) return $('body>#main>#content').find(selector);
return $('body>#main>#content');
}
µ('#uk').text(userDetails.info.unitKerja);
await getProkers();
</script>

View File

@ -108,17 +108,33 @@
const ks = JSON.parse(v.notes); const ks = JSON.parse(v.notes);
no.append("Kendala:"); no.append("Kendala:");
no.append(moly.newElement("br")); no.append(moly.newElement("br"));
no.append(ks.kendala.length > 1? ks.kendala : "-"); no.append(ks.kendala.length > 1? ks.kendala : "(Tidak ada)");
no.append(moly.newElement("br")); no.append(moly.newElement("br"));
no.append("Solusi:"); no.append("Solusi:");
no.append(moly.newElement("br")); no.append(moly.newElement("br"));
no.append(ks.solusi.length > 1? ks.solusi : "-"); no.append(ks.solusi.length > 1? ks.solusi : "(Tidak ada)");
}
else if(v.status ==8)
{
const rm = JSON.parse(v.notes);
no.append("Nilai: ");
let str = "☆☆☆☆☆";
for(let s=1;s<=rm.r;s++)
{
str = "★" + str;
str = str.substring(0,5);
}
no.append(str);
no.append(moly.newElement("br"));
no.append("Catatan: ");
no.append(moly.newElement("br"));
no.append(rm.m.length > 1? rm.m : "(Tidak ada)");
} }
else else
{ {
no.append("Catatan:"); no.append("Catatan:");
no.append(moly.newElement("br")); no.append(moly.newElement("br"));
no.append(v.notes.length > 1? v.notes : "-"); no.append(v.notes.length > 1? v.notes : "(Tidak ada)");
} }
// console.log(typeof v.document) // console.log(typeof v.document)
if(typeof v.document === "string") if(typeof v.document === "string")

View File

@ -1,14 +1,14 @@
<div style="display: grid; grid-template-columns: auto 1fr; column-gap: 1ch; height: 80vh;"> <div style="display: grid; grid-template-columns: auto 1fr; column-gap: 1ch; height: calc(80vh - 1em);">
<div> <div>
<div>Dokumen Eviden:</div> <div>Dokumen Eviden:</div>
<iframe style="width: 68vw; height: calc(83vh - 3.5em); width: calc(88vw - 38ch)"> <iframe style="width: 68vw; height: calc(80vh - 2.8em); width: calc(88vw - 38ch)">
</iframe> </iframe>
</div> </div>
<div style="display: grid; grid-template-columns: auto 1fr; column-gap: 1ch; width: 35ch; grid-auto-rows: min-content;"> <div style="display: grid; grid-template-columns: auto 1fr; column-gap: 1ch; width: 35ch; grid-auto-rows: min-content;">
<span style="grid-column: span 2;">Aksi Perubahan</span> <span style="grid-column: span 2;">Aksi Perubahan:</span>
<textarea id="act" style="grid-column: span 2; width: 35ch; height: 5em; resize: none;" readonly></textarea> <textarea id="act" style="grid-column: span 2; width: 35ch; height: 4em; resize: none;" readonly></textarea>
Rencana&nbsp;Mulai <span id="planStart"></span> Rencana&nbsp;Mulai <span id="planStart"></span>
Rencana&nbsp;Durasi <span id="planDur"></span> Rencana&nbsp;Durasi <span id="planDur"></span>
Selesai&nbsp;Pada <span id="finishedAt"></span> Selesai&nbsp;Pada <span id="finishedAt"></span>
@ -16,15 +16,19 @@
<span style="grid-column: span 2;"> <span style="grid-column: span 2;">
Kendala: Kendala:
</span> </span>
<textarea id="pro" style="grid-column: span 2; width: 35ch; height: 5em; resize: none;" placeholder="(Tidak ada kendala)" readonly></textarea> <textarea id="pro" style="grid-column: span 2; width: 35ch; height: 4em; resize: none;" placeholder="(Tidak ada kendala)" readonly></textarea>
<span style="grid-column: span 2;"> <span style="grid-column: span 2;">
Solusi: Solusi:
</span> </span>
<textarea id="sol" style="grid-column: span 2; width: 35ch; height: 5em; resize: none;" placeholder="(Tidak ada solusi)" readonly></textarea> <textarea id="sol" style="grid-column: span 2; width: 35ch; height: 4em; resize: none;" placeholder="(Tidak ada solusi)" readonly></textarea>
<span style="grid-column: span 2;">
Nilai: <span id="nilai"></span>
</span>
<input style="grid-column: span 2;" type="range" id="rating" min="1" max="5" value="4">
<span style="grid-column: span 2;"> <span style="grid-column: span 2;">
Catatan Evaluasi: Catatan Evaluasi:
</span> </span>
<textarea id="evalnotes" style="grid-column: span 2; width: 35ch; height: 5em; resize: none;" placeholder="Contoh: Bagus, harap pertahankan kinerja saudara."></textarea> <textarea id="evalnotes" style="grid-column: span 2; width: 35ch; height: 4em; resize: none;" placeholder="Catatan atas kinerja atau solusi dari kendala yang dihadapi agen." maxlength="490"></textarea>
</div> </div>
</div> </div>
<div style="text-align: right;"> <div style="text-align: right;">
@ -40,10 +44,16 @@
} }
const finJour = data.journal.find(e=>e.status == 4); const finJour = data.journal.find(e=>e.status == 4);
const prosol = JSON.parse(finJour.notes); const prosol = JSON.parse(finJour.notes);
console.log(data)
µ('#act').val(data.actions); µ('#act').val(data.actions);
µ('#pro').val(prosol.kendala); µ('#pro').val(prosol.kendala);
µ('#sol').val(prosol.solusi); µ('#sol').val(prosol.solusi);
// let str = "☆☆☆☆☆";
// for(let s=1;s<=Number(µ('#rating').val());s++)
// {
// str = "★" + str;
// str = str.substring(0,5);
// }
// µ('#nilai').text(str);
µ('#planStart').text(data.year + "-" + data.startMonth.toString().padStart(2,"0")+ (data.isInMonth ? "" : "-" + data.startDay.toString().padStart(2,"0"))); µ('#planStart').text(data.year + "-" + data.startMonth.toString().padStart(2,"0")+ (data.isInMonth ? "" : "-" + data.startDay.toString().padStart(2,"0")));
µ('#planDur').text(data.timeTarget + " " + (data.isInMonth ? "Bulan" : "Hari")); µ('#planDur').text(data.timeTarget + " " + (data.isInMonth ? "Bulan" : "Hari"));
µ('#finishedAt').text(finJour.timeStamp.substring(0,16)); µ('#finishedAt').text(finJour.timeStamp.substring(0,16));
@ -51,7 +61,13 @@
µ('iframe')[0].src="/uploads/dokumen/" + finJour.document; µ('iframe')[0].src="/uploads/dokumen/" + finJour.document;
µ('#submit').click(async()=>{ µ('#submit').click(async()=>{
const loadid = moly.loadScreen.show("Mengirim Evaluasi...","sonar","#"+µ('div[id^="db"]')[0].id) const loadid = moly.loadScreen.show("Mengirim Evaluasi...","sonar","#"+µ('div[id^="db"]')[0].id)
const evalres = await postJson('/api/eval', {prokerid: data.prokerID, notes: µ('#evalnotes').val().length > 0 ? µ('#evalnotes').val(): "-"}); const notes = JSON.stringify(
{
r: Number(µ('#rating').val()),
m: (µ('#evalnotes').val().length > 0 ? µ('#evalnotes').val(): "(Tidak ada)")
}
)
const evalres = await postJson('/api/eval', {prokerid: data.prokerID, notes});
if(evalres.status != 201) if(evalres.status != 201)
{ {
moly.alert.show("Pengiriman Evaluaasi Gagal","Tidak dapat mengirim evaluasi. Silakan ulangi kembali beberapa saat lagi."); moly.alert.show("Pengiriman Evaluaasi Gagal","Tidak dapat mengirim evaluasi. Silakan ulangi kembali beberapa saat lagi.");
@ -61,4 +77,14 @@
moly.loadScreen.close(loadid); moly.loadScreen.close(loadid);
thisDialog.resolve(true); thisDialog.resolve(true);
}); });
µ('#rating').change(()=>{
let str = "☆☆☆☆☆";
for(let s=1;s<=Number(µ('#rating').val());s++)
{
str = "★" + str;
str = str.substring(0,5);
}
µ('#nilai').text(str);
});
µ('#rating').change();
</script> </script>

View File

@ -3,7 +3,7 @@
Daftar Agen Perubahan<br> Daftar Agen Perubahan<br>
<span id="uk"></span> <span id="uk"></span>
</div> </div>
<div style="max-height: calc(50vh - 6em); overflow-y: scroll; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="agWrapper"> <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"> <table id="agents" class="bordered selectable">
<colgroup> <colgroup>
<col style="width: 4ch;"> <col style="width: 4ch;">
@ -43,12 +43,12 @@
</span> </span>
&nbsp; &nbsp;
</div> </div>
<div style="max-height: calc(50vh - 6em); overflow-y: scroll; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="pkWrapper"> <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"> <table id="proker" class="bordered selectable">
<colgroup> <colgroup>
<col style="width: 4ch;"> <col style="width: 4ch;">
<col style="width: 27ch;"> <col style="width: 27ch;">
<col> <col style="min-width: 12ch;">
<col style="width: 8ch;"> <col style="width: 8ch;">
<col style="width: 17ch;"> <col style="width: 17ch;">
<col style="width: 16ch;"> <col style="width: 16ch;">
@ -208,6 +208,7 @@
no.style.textAlign = "right"; no.style.textAlign = "right";
kg.append(kegiatanName[v.kegiatan]); kg.append(kegiatanName[v.kegiatan]);
ss.append(v.sasaran); ss.append(v.sasaran);
ss.setAttribute("title",v.sasaran);
tw.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`); tw.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`);
tw.style.textAlign = "center"; tw.style.textAlign = "center";
wm.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year)); wm.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year));
@ -236,11 +237,20 @@
$('#proker #pkContent').append(ro); $('#proker #pkContent').append(ro);
}); });
} }
function fillAgents() async function fillAgents()
{ {
const loadid = moly.loadScreen.show("Memuat data agen...","bar","#agWrapper"); const loadid = moly.loadScreen.show("Memuat data agen...","bar","#agWrapper");
$('#agContent').empty(); $('#agContent').empty();
$.each(agents.filter(a=>a.agentID != userDetails.info.agentID),(i,v)=>{ 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 ro = moly.newElement("tr");
const no = moly.newElement("td"); const no = moly.newElement("td");
const ni = moly.newElement("td"); const ni = moly.newElement("td");
@ -248,7 +258,8 @@
ro.append(no) ro.append(no)
ro.append(ni) ro.append(ni)
ro.append(na) ro.append(na)
no.append((i+1) + "."); no.append(num + ".");
num++;
no.style.textAlign = "right"; no.style.textAlign = "right";
ni.append(v.agentID); ni.append(v.agentID);
ni.style.textAlign = "center"; ni.style.textAlign = "center";

View File

@ -1,8 +1,12 @@
<div style="max-height: calc(50vh - 6em); overflow-y: scroll; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="rgWrapper"> <div style="text-align: center; font-weight: 600; margin: .8em 0; font-size: 1.1em;">
Daftar Dokumen Regulasi
</div>
<a-button id="newReg" style="margin: 0 2ch;">Entri Regulasi Baru</a-button>
<div style="max-height: calc(83vh - 6em); overflow: auto; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="rgWrapper">
<table id="regs" class="bordered selectable"> <table id="regs" class="bordered selectable">
<colgroup> <colgroup>
<col style="width: 25ch;"> <col style="width: 25ch;">
<col> <col style="min-width: 10ch;">
<col style="width: 20ch;"> <col style="width: 20ch;">
<col style="width: 19ch;"> <col style="width: 19ch;">
</colgroup> </colgroup>
@ -23,7 +27,6 @@
</tbody> </tbody>
</table> </table>
</div> </div>
<a-button id="newReg">Entri Regulasi</a-button>
<script type="module"> <script type="module">
let regulations = []; let regulations = [];
async function getRegs() async function getRegs()

View File

@ -3,7 +3,7 @@
Daftar Agen Perubahan<br> Daftar Agen Perubahan<br>
<span id="uk"></span> <span id="uk"></span>
</div> </div>
<div style="max-height: calc(50vh - 6em); overflow-y: scroll; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="agWrapper"> <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"> <table id="agents" class="bordered selectable">
<colgroup> <colgroup>
<col style="width: 4ch;"> <col style="width: 4ch;">
@ -43,12 +43,12 @@
</span> </span>
&nbsp; &nbsp;
</div> </div>
<div style="max-height: calc(50vh - 6em); overflow-y: scroll; margin: 0 0 1em 0; padding: 0 2ch 2ch 2ch;" id="pkWrapper"> <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"> <table id="proker" class="bordered selectable">
<colgroup> <colgroup>
<col style="width: 4ch;"> <col style="width: 4ch;">
<col style="width: 19ch;"> <col style="width: 27ch;">
<col> <col style="min-width: 12ch;">
<col style="width: 8ch;"> <col style="width: 8ch;">
<col style="width: 17ch;"> <col style="width: 17ch;">
<col style="width: 16ch;"> <col style="width: 16ch;">
@ -204,6 +204,7 @@
no.style.textAlign = "right"; no.style.textAlign = "right";
kg.append(kegiatanName[v.kegiatan]); kg.append(kegiatanName[v.kegiatan]);
ss.append(v.sasaran); ss.append(v.sasaran);
ss.setAttribute("title",v.sasaran);
tw.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`); tw.append(`${v.timeTarget} ${v.isInMonth ? "Bulan" : "Hari"}`);
tw.style.textAlign = "center"; tw.style.textAlign = "center";
wm.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year)); wm.append(((v.startDay == null ? "" : v.startDay.toString().padStart(2,"0") + " ") + monthName[v.startMonth] + " " + v.year));
@ -227,11 +228,20 @@
$('#proker #pkContent').append(ro); $('#proker #pkContent').append(ro);
}); });
} }
function fillAgents() async function fillAgents()
{ {
const loadid = moly.loadScreen.show("Memuat data agen...","bar","#agWrapper"); const loadid = moly.loadScreen.show("Memuat data agen...","bar","#agWrapper");
$('#agContent').empty(); $('#agContent').empty();
$.each(agents.filter(a=>a.agentID != userDetails.info.agentID),(i,v)=>{ 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 ro = moly.newElement("tr");
const no = moly.newElement("td"); const no = moly.newElement("td");
const ni = moly.newElement("td"); const ni = moly.newElement("td");
@ -239,7 +249,8 @@
ro.append(no) ro.append(no)
ro.append(ni) ro.append(ni)
ro.append(na) ro.append(na)
no.append((i+1) + "."); no.append(num + ".");
num++;
no.style.textAlign = "right"; no.style.textAlign = "right";
ni.append(v.agentID); ni.append(v.agentID);
ni.style.textAlign = "center"; ni.style.textAlign = "center";