Skip to main content

SOURCE CODE: JOBs DONE REPORT versi WEB-PURPOSE

 <h1><a href="https://drive.google.com/file/d/1y2vNqYvDkqNxSZEQOddFQ0_LvpSkqDuF/view?usp=sharing" target="_blank">APK by MEDIAN.CO DOWNLOAD LINK!</a></h1>




<br />

<hr />

<br />

<p><span><span style="color: red; font-size: 60px;"><b>Jobs Done!</b></span><br /><span style="color: #ffa400; font-size: 30px;">Household++</span></span></p>


<!--==============================================-->

<!--FIREBASE CDN (BLOGGER COMPAT MODE)-->

<!--==============================================-->

<script src="https://www.gstatic.com/firebasejs/9.22.2/firebase-app-compat.js"></script>

<script src="https://www.gstatic.com/firebasejs/9.22.2/firebase-database-compat.js"></script>


<script>

firebase.initializeApp({

  apiKey: "AIzaSyAF5r6Rvu-DmoV-vf47wYTZfarpVGmNYR0",

  authDomain: "ronin-11938.firebaseapp.com",

  databaseURL: "https://ronin-11938-default-rtdb.firebaseio.com",

  projectId: "ronin-11938",

  storageBucket: "ronin-11938.firebasestorage.app",

  messagingSenderId: "823368889742",

  appId: "1:823368889742:web:609e16ace214b94a0df"

});


var rdb = firebase.database();

var refCRUD = rdb.ref("JobDoneData");

</script>


<!--==============================================-->

<!--STYLE (BLOGGER SAFE)-->

<!--==============================================-->

<style>

:root {

  --bg: #ffffff;

  --card: #ffffff;

  --glass: rgba(255,255,255,0.82);

  --border: #dcdcdc;

  --shadow: rgba(0,0,0,0.14);

  --text: #222;

}

@media (prefers-color-scheme: dark) {

  :root {

    --bg: #111;

    --card: lightgrey;

    --glass: rgba(40,40,40,0.72);

    --border: #333;

    --shadow: rgba(0,0,0,0.55);

    --text: #f5f5f5;

  }

}

body { background: lightgrey; color: var(--text); }


.crud-box, .table-box {

  background: var(--card);

  border:1px solid var(--border);

  padding:18px;

  border-radius:12px;

  margin-bottom:20px;

  box-shadow:0 4px 12px var(--shadow);

}


input, select, textarea {

  padding:10px;

  width:100%;

  border-radius:8px;

  border:1px solid var(--border);

  box-shadow:0 1px 3px var(--shadow) inset;

}


.icon-btn {

  cursor:pointer;

  font-size:22px;

  margin-right:6px;

  transition:0.15s;

}

.icon-btn:hover { transform:scale(1.28); }


/* ========================================= */

/* NEW DATE COLUMN — TWO ROWS (Month + Year) */

/* ========================================= */

.date-cell {

  width: 150px;

  min-width: 150px;

  text-align: center;

  white-space: normal;

  line-height: 1.25;

  font-weight: 600;

}

.date-year {

  display:block;

  font-size:0.9em;

  margin-top:2px;

  color:#666;

}


.glass-modal {

  position:fixed; top:0; left:0; width:100%; height:100%;

  background:lime;

  display:none;

  align-items:center;

  justify-content:center;

  z-index:9999;

}

.glass-modal-content {

  background:lime;

  backdrop-filter:blur(12px);

  padding:20px;

  border-radius:15px;

  width:90%;

  max-width:420px;

  box-shadow:0 4px 18px var(--shadow);

  color:var(--text);

}


.table-clean { border-collapse:collapse; width:100%; }

.table-clean th {

  background:lime;

  padding:10px;

  border-bottom:2px solid var(--border);

}


.table-clean td {

  padding:10px;

  border-bottom:1px solid var(--border);

}

.table-clean tr:nth-child(even) {

  background:white;

}

.table-clean tr:nth-child(odd) {

 background:white;

}

  

</style>


<!--==============================================-->

<!--INPUT FORM-->

<!--==============================================-->

<div class="crud-box">

  <h3>➕ <span style="color: #ff00fe;">Add Job Done</span></h3>


  <label><b><span style="color: #04ff00;">Month</span></b></label>

  <select id="monthSelect" style="margin-bottom: 10px;"></select>


  <label><b><span style="color: #04ff00;">Year</span></b></label>

  <select id="yearSelect" style="margin-bottom: 10px;"></select>


  <label><b><span style="color: #04ff00;">Description</span></b></label>

  <textarea id="jobDesc" style="height: 80px;"></textarea>


  <br /><br />

  <button onclick="addRecord()" style="background: rgb(0, 123, 255); border-radius: 8px; border: none; color: white; padding: 10px 20px;">

    💾 Save

  </button>

</div>


<!--==============================================-->

<!--SEARCH + SORT-->

<!--==============================================-->

<div class="crud-box">

  <label><b><span style="color: #01ffff;">Search</span></b></label>

  <input id="searchInput" onkeyup="renderTable()" placeholder="Search description or date…" />


  <br /><br />


  <span style="color: #2b00fe;"><label><b>Sort by</b></label>

  </span><select id="sortSelect" onchange="renderTable()">

    <option value="desc">Newest First</option>

    <option value="asc">Oldest First</option>

  </select>

</div>


<!--==============================================-->

<!--TABLE-->

<!--==============================================-->

<div class="table-box">

  <table class="table-clean">

    <thead>

      <tr>

        <th><span style="color: #fcff01;">DATE</span></th>

        <th><span style="color: #fcff01; font-size: x-large;">DESCRIPTION</span></th>

        <th><span style="color: #fcff01;">Icon</span></th>

      </tr>

    </thead>

    <tbody id="dataList"></tbody>

  </table>

</div>


<span style="color: #fcff01;"><!--==============================================-->

<!--CUSTOM FLOATING GLASS MODAL-->

<!--==============================================-->

</span><div class="glass-modal" id="modalGlass">

  <div class="glass-modal-content">

    <h4 id="modalTitle"></h4>

    <div id="modalBody" style="margin-top: 10px; white-space: pre-wrap;"></div>

    <span style="color: #fcff01;"><br />

    <button onclick="closeModal()" style="padding: 8px 15px;">Close</button></span>

  </div>

</div>


<!--==============================================-->

<!--LOGIC SCRIPT-->

<!--==============================================-->

<script>

var allData = [];

var monthNames = ["January","February","March","April","May","June","July","August","September","October","November","December"];


function loadMonthYear() {

  var mSel = document.getElementById("monthSelect");

  var ySel = document.getElementById("yearSelect");


  var today = new Date();

  var curM = today.getMonth() + 1;

  var curY = today.getFullYear();


  for (var i=1; i<=12; i++) {

    var o = document.createElement("option");

    o.value = i;

    o.text = monthNames[i-1];

    if (i === curM) o.selected = true;

    mSel.appendChild(o);

  }


  for (var y=2023; y<=curY+5; y++) {

    var o2 = document.createElement("option");

    o2.value = y;

    o2.text = y;

    if (y === curY) o2.selected = true;

    ySel.appendChild(o2);

  }

}

loadMonthYear();


function addRecord() {

  var m = document.getElementById("monthSelect").value;

  var y = document.getElementById("yearSelect").value;

  var desc = document.getElementById("jobDesc").value;


  if (m==="" || y==="" || desc.trim()==="") {

    alert("Please complete all fields.");

    return;

  }


  var id = refCRUD.push().key;


  refCRUD.child(id).set({

    id:id,

    month:m,

    year:y,

    description:desc,

    sortKey:(parseInt(y)*100)+parseInt(m)

  });


  document.getElementById("jobDesc").value="";

}


refCRUD.on("value", function(snap) {

  allData=[];

  snap.forEach(function(c){ allData.push(c.val()); });

  renderTable();

});


function renderTable() {

  var tbody=document.getElementById("dataList");

  tbody.innerHTML="";


  var search=document.getElementById("searchInput").value.toLowerCase();

  var sort=document.getElementById("sortSelect").value;


  var filtered=[];

  for (var i=0;i<allData.length;i++){

    var text = monthNames[allData[i].month-1] + " " + allData[i].year + " " + allData[i].description;

    if (text.toLowerCase().indexOf(search)!==-1) filtered.push(allData[i]);

  }


  filtered.sort(function(a,b){

    return sort==="desc" ? b.sortKey-a.sortKey : a.sortKey-b.sortKey;

  });


  for (var i=0;i<filtered.length;i++){

    var d=filtered[i];

    var tr=document.createElement("tr");


    tr.innerHTML =

      "<td class='date-cell'>" +

         monthNames[d.month-1] +

         "<span class='date-year'>" + d.year + "</span>" +

      "</td>" +

      "<td>"+ d.description.replace(/\\n/g,'<br>') +"</td>" +

      "<td>" +

        "<span class='icon-btn' onclick=\"viewRecord('" + d.id + "')\">👁️</span>" +

        "<span class='icon-btn' onclick=\"editRecord('" + d.id + "')\">✏️</span>" +

        "<span class='icon-btn' onclick=\"deleteRecord('" + d.id + "')\">🗑️</span>" +

      "</td>";


    tbody.appendChild(tr);

  }

}


function viewRecord(id){

  for (var i=0;i<allData.length;i++){

    if (allData[i].id===id){

      openModal(

        "View Record",

        monthNames[allData[i].month-1]+" "+allData[i].year+"\n\n"+allData[i].description

      );

      return;

    }

  }

}


function editRecord(id){

  for (var i=0;i<allData.length;i++){

    if (allData[i].id===id){

      var newDesc=prompt("Edit description:", allData[i].description);

      if (newDesc!==null){

        refCRUD.child(id).update({description:newDesc});

      }

      return;

    }

  }

}


function deleteRecord(id){

  if (confirm("Delete this record?")){

    refCRUD.child(id).remove();

  }

}


function openModal(title,body){

  document.getElementById("modalTitle").textContent=title;

  document.getElementById("modalBody").textContent=body;

  document.getElementById("modalGlass").style.display="flex";

}


function closeModal(){

  document.getElementById("modalGlass").style.display="none";

}

</script>


Comments

Popular posts from this blog

PART 0.1.0 RAD PROTOTYPE Web-App: Post-Video & Comments [program]

Video List — JP Kanji Ultra Translation CONTROL SECTION — Login (Admin) Username: Password: Login CONTROL SECTION — Admin Panel Enable Comments Disable Comments Logout Activity Log Show Video COMMENTS DISABLED BY ADMIN Leave a Comment: Additional Comment Show Video COMMENTS DISABLED BY ADMIN Leave a Comment: Additional Comment Show Video COMMENTS DISABLED BY ADMIN Leave a Comment: Additional Comment Show Video COMMENTS DISABLED BY ADMIN Leave a Comment: Additional Comment

My Pending and Delayed POSTs SUMMARY [APPs]
MADE by ChatGPT

🔗 My Pending and Delayed POSTs SUMMARY Sort by Date Sort by Auto Title Sort by My Title Ascending Descending (Newest First) Insert URL: Your Own Title (Optional): Status: Pending Done ➕ ADD ENTRY 💾 SAVE EDIT (MAIN FORM) DATE / TIME AUTO TITLE MY TITLE STATUS URL ACTIONS 📝 TO DO LIST SUMMARY Sort by Date Sort by Header Sort by Detail ...

REPOST: Studying WATER PUMP by ROMAN ENGINEERING

*^ Ini yg Asli Gan! Mekanisme pada Concrete Pump: Kok ky Sistem Mekanik Romawi ya?! Tapi malah bisa HANYA pake PER aka bukan "MATA BOR look a like" Mekanisme Drill yg Cost Pembuatan bikin REPOT aka harus Tool SUPER Khusus Dari Material Besi yg digunakan terlihat langsung secara kasat mata Jauh Lebih Banyak drpd Per Biasa seperti yg ditunjukkan pd Video Alternatif dgn Penggunaan PER Video dr Instagram: Source: YouTube Rome's drainage machines #history #romanempire #engineering