worked up to evidence uploads

This commit is contained in:
nugroho 2025-06-27 00:08:33 +07:00
parent b02ea14b7b
commit 6ad2260f3e
7 changed files with 148 additions and 8 deletions

3
.gitignore vendored
View File

@ -1,2 +1,3 @@
.DS_Store .DS_Store
/assets/images/uploads/* /assets/images/uploads/*
/uploads/*

View File

@ -0,0 +1,72 @@
<div>
Sasaran Aksi:
</div>
<div id="sasaran" style="margin-bottom: .5em;">&nbsp;</div>
<div>
Kendala, Hambatan, dan Masalah (Opsional):
</div>
<textarea id="kendala" style="width: 75ch;height: 6em; resize: none;" maxlength="240" placeholder="Silakan isi dengan kendala, hambatan, dan permasalahan yang dihadapi selama menjalankan aksi perubahan.">
</textarea>
<div>
Solusi (Opsional):
</div>
<textarea id="solusi" style="width: 100%;height: 6em; resize: none;" maxlength="240" placeholder="Silakan isi dengan langkah yang diambil untuk menanggulangi kendala, hambatan, dan permasalahan diatas.">
</textarea>
<div style="display: grid; grid-template-columns: 1fr auto; column-gap: 1.25ch;">
<span>Dokumen Eviden (Wajib): </span>
<file-input accept="application/pdf" id="evidence" style="width: 52.75ch"></file-input>
</div>
<div style="display: grid;grid-template-columns: auto 1fr auto; margin-top: .75em; border-top: 1px solid var(--secondary-foreground); padding-top: .5em;">
<a-button id="cancel" type="negative">Batal</a-button>
&nbsp;
<a-button id="upload">Upload Eviden</a-button>
</div>
<script type="module">
const thisDialog = moly.lastDialog();
const data = thisDialog.data;
let evidence = null;
function µ(selector)
{
if (selector) return $(thisDialog.box).find(selector);
return $(thisDialog.box);
}
µ('#sasaran').text(data.sasaran);
µ('#evidence').change(async()=>{
if(µ('#evidence')[0]._input.files.length < 1)
{
evidence = null;
return;
}
const loadid = moly.loadScreen.show("Memroses berkas...","bar","#"+µ('div[id^="db"]')[0].id);
evidence = await moly.file.serialise(µ('#evidence')[0]._input.files[0]);
moly.loadScreen.close(loadid);
});
µ('#cancel').click(()=>{thisDialog.resolve(false)});
µ('#upload').click(async()=>{
const loadid = moly.loadScreen.show("Memroses berkas...","bar","#"+µ('div[id^="db"]')[0].id);
const upload =
{
prokerid: data.prokerID,
notes: JSON.stringify({
kendala: µ('#kendala').val(),
solusi: µ('#solusi').val()
}),
evidence: evidence.data
}
if(!evidence)
{
moly.alert.show("Dokumen Eviden Belum Dipilih","Dokuman Eviden bersifat wajib. Harap input dokumen eviden untuk diunggah.");
moly.loadScreen.close(loadid);
return;
}
const upl = await postJson('/api/pkevidence',upload);
if(upl.status != 201)
{
moly.alert.show("Eviden Tidak Terupload","Eviden tidak berhasi diupload. Silakan ulangi kembali beberapa saat lagi.");
moly.loadScreen.close(loadid);
return;
}
moly.loadScreen.close(loadid);
});
//["prokerid", "notes", "evidence"]
</script>

View File

@ -0,0 +1,40 @@
<div>
Sasaran Aksi:
</div>
<div id="sasaran" style="margin-bottom: .5em;">&nbsp;</div>
<div>
Kendala, Hambatan, dan Masalah:
</div>
<textarea disabled id="kendala" style="width: 75ch;height: 6em; resize: none;" maxlength="240" placeholder="(Tidak ada kendala)">
</textarea>
<div>
Solusi:
</div>
<textarea disabled id="solusi" style="width: 100%;height: 6em; resize: none;" maxlength="240" placeholder="(Tidak ada solusi)">
</textarea>
<div style="display: grid; grid-template-columns: auto 1fr; column-gap: 1.25ch;">
<span>Dokumen Eviden: </span>
<a-button id="ve">Lihat Dokumen</a-button>
</div>
<script type="module">
const thisDialog = moly.lastDialog();
const data = thisDialog.data;
const journal = data.journal.at(-1);
const notes = JSON.parse(journal.notes);
console.log(data)
function µ(selector)
{
if (selector) return $(thisDialog.box).find(selector);
return $(thisDialog.box);
}
µ('#sasaran').text(data.sasaran);
µ('#kendala').text(notes.kendala);
µ('#solusi').text(notes.solusi);
µ('#ve').text(journal.document);
µ('#ve').click(async()=>{
const loadid = moly.loadScreen.show("Memroses berkas...","bar","#main");
await moly.dialog.show({title: "Preview Eviden", content:"/modules/pdf-previewer.html",fetching:true, data: {url: "/uploads/dokumen/" + journal.document}});
moly.loadScreen.close(loadid)
thisDialog.resolve(false);
});
</script>

View File

@ -55,7 +55,6 @@
if (selector) return $(thisDialog.box).find(selector); if (selector) return $(thisDialog.box).find(selector);
return $(thisDialog.box); return $(thisDialog.box);
} }
console.log(prokers);
µ('#targetUnit').change(()=>{ µ('#targetUnit').change(()=>{
µ('.forDay').prop("hidden", µ('#targetUnit').val() != "0"); µ('.forDay').prop("hidden", µ('#targetUnit').val() != "0");
µ('.forMonth').prop("hidden", µ('#targetUnit').val() != "1"); µ('.forMonth').prop("hidden", µ('#targetUnit').val() != "1");

View File

@ -146,6 +146,10 @@
"text-align: center; background-color: var(--neutral-p-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(--neutral-n-accent); color: var(--primary-foreground)",
"text-align: center; background-color: var(--negative-accent); color: var(--primary-background)", "text-align: center; background-color: var(--negative-accent); color: var(--primary-background)",
"text-align: center; background-color: unset; color: var(--positive-accent)", // belum jadwalnya
"text-align: center; background-color: unset; color: unset", // berjalan
"text-align: center; background-color: unset; color: var(--neutral-n-accent)", // hampir deadline
"text-align: center; background-color: unset; color: var(--negative-accent)" // terlambat
]; ];
$.each(listedProkers,(i,v)=>{ $.each(listedProkers,(i,v)=>{
@ -170,8 +174,16 @@
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));
wm.style.textAlign = "right"; wm.style.textAlign = "right";
st.append(statusName[v.journal.at(-1).status]); const Now = new Date();
st.style = statusStyles[v.journal.at(-1).status]; 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);
const deadline = v.isInMonth ? new Date(v.year, v.startMonth + v.timeTarget, 0) : new Date(v.year, v.startMonth -1, v.startDay + v.timeTarget);
const neardeadline = (new Date(deadline)).setDate(deadline.getDate() - 15);
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;
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 <= deadline ? "Hampir Deadline" : "Lewat Deadline");
st.style = statusStyles[v.styleCode];
$(ro).click(async()=>{ $(ro).click(async()=>{
const data = v; const data = v;
if (data.journal.at(-1).status < 2) if (data.journal.at(-1).status < 2)
@ -179,9 +191,13 @@
const vw = await moly.dialog.show({title: "Detil Program Kerja", content: "/modules/kegiatan-proker-edit.html", fetching: true, data}); const vw = await moly.dialog.show({title: "Detil Program Kerja", content: "/modules/kegiatan-proker-edit.html", fetching: true, data});
if(vw) populateProker(); if(vw) populateProker();
} }
else if (data.journal.at(-1).status > 3)
{
await moly.dialog.show({title: "Lihat Eviden Akhir Aksi Perubahan", content: "/modules/kegiatan-proker-finished.html", fetching: true, data})
}
else if (data.journal.at(-1).status > 2) else if (data.journal.at(-1).status > 2)
{ {
alert("To Advance the proker") await moly.dialog.show({title: "Upload Eviden Akhir Aksi Perubahan", content: "/modules/kegiatan-proker-finish.html", fetching: true, data})
} }
}) })
$('#proker #pkContent').append(ro); $('#proker #pkContent').append(ro);

View File

@ -9,5 +9,5 @@
if (selector) return $(thisDialog.box).find(selector); if (selector) return $(thisDialog.box).find(selector);
return $(thisDialog.box); return $(thisDialog.box);
} }
µ('#previewer')[0].src = "data:application/pdf;base64,"+data.data; µ('#previewer')[0].src = data.data? "data:application/pdf;base64,"+data.data : data.url;
</script> </script>

View File

@ -179,6 +179,10 @@
"text-align: center; background-color: var(--neutral-p-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(--neutral-n-accent); color: var(--primary-foreground)",
"text-align: center; background-color: var(--negative-accent); color: var(--primary-background)", "text-align: center; background-color: var(--negative-accent); color: var(--primary-background)",
"text-align: center; background-color: unset; color: var(--positive-accent)", // belum jadwalnya
"text-align: center; background-color: unset; color: unset", // berjalan
"text-align: center; background-color: unset; color: var(--neutral-n-accent)", // hampir deadline
"text-align: center; background-color: unset; color: var(--negative-accent)" // terlambat
]; ];
$.each(listedProkers,(i,v)=>{ $.each(listedProkers,(i,v)=>{
@ -203,8 +207,16 @@
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));
wm.style.textAlign = "right"; wm.style.textAlign = "right";
st.append(statusName[v.journal.at(-1).status]); const Now = new Date();
st.style = statusStyles[v.journal.at(-1).status]; 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);
const deadline = v.isInMonth ? new Date(v.year, v.startMonth + v.timeTarget, 0) : new Date(v.year, v.startMonth -1, v.startDay + v.timeTarget);
const neardeadline = (new Date(deadline)).setDate(deadline.getDate() - 15);
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;
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 <= deadline ? "Hampir Deadline" : "Lewat Deadline");
st.style = statusStyles[v.styleCode];
$(ro).click(async()=>{ $(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}}); 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); // console.log(vr);