From e0109b09ffd7ab8df4ef381a098ba30704f11a26 Mon Sep 17 00:00:00 2001 From: Samuel Zielke Date: Fri, 13 Sep 2024 08:18:49 +0200 Subject: [PATCH] Create Edit Form with first functions && Edit JS Libarys && Show Yearly infos --- app/static/app/images/more.png | Bin 0 -> 1713 bytes app/static/app/js/dbcontrol.js | 397 +++++++++++++++++++--------- app/static/app/js/home.js | 198 ++++++++++++++ app/static/app/js/serviceworker.js | 24 +- app/static/app/js/welcomeControl.js | 16 ++ app/templates/app/base.html | 20 +- app/templates/app/home.html | 363 +++++++++---------------- 7 files changed, 636 insertions(+), 382 deletions(-) create mode 100644 app/static/app/images/more.png create mode 100644 app/static/app/js/home.js create mode 100644 app/static/app/js/welcomeControl.js diff --git a/app/static/app/images/more.png b/app/static/app/images/more.png new file mode 100644 index 0000000000000000000000000000000000000000..330e631652c30c2f750c6f4a695645bfb38434f5 GIT binary patch literal 1713 zcmd5->pK$)7~kmN5MA&j3|$aikRF#Qx7ciEqR}?9+=a2ESzFjalKZWt9npHEHJ8og z5_3tRn-P&*HXS)6tqy7I~rY>CVXtmryh;%)Z&^mEmHvcL~FzAR@K8)RpybgOc|N*V!l zL))rL?&==L`q2nOEIYy{{}9d5u3o-YP9-P>^>QZ~5%_y0Iuow3+KnXKhVSn9NcKWu z1|CtQW&OJbr5=*D$+lG?bXNLRh%r&yw$l*+{I%%=&439lEw_LWtxCAtOl_)s&J=uG z1)tH0Jko?S(a_5Q-xW!)H65Pc;x`$^tzjvS>_f*%nsdXEq{SxDV=o$~Y255{+Xbg6 zl6PxQ#X1BzI|8qmO&Y+Kc+FT20w3*d6sgs3putzb?L}d(2KIOUG##4iUp0w7ft^J$ z9q3j4-3TwztXA=cQ7gcZ7KSJVfXRuZoL}cEfilLTIRCo=G6G2+CN?UDI#C zMpx@K#=H*Tf#xmI1U;&~_ds6YbK9ssx77Sutv;$0A z(F7HRU1oHa5tly{o1NN5!4oz$|3i!^9oaE037<7ZLPL627?GB}^{y ztpzLf;)-FOqCdSdrci=l#=!2(2k?q-*)DV@7{e_4EWr7;_{`2A9px@+Vxo}3Y(6+g zdP0a6_Z}`UBf}nA`##ttHjIm%iKFKBuer;i(X)ngdA6$%dOI~ifMlITjkWHjSvj%2 z%rxNi5p|abY75|iY%5Grzr(0?_*p6Ee78Xy{#ARDl%FuRXneIm9AzJ!=x4?v`7R|3 zRzc01^){DNOx zdNtAHB>V>)(9%<_7J0I>d0joY6Pseg%3qkUJdD(wN(p^!z_D>3&1h{*6!u?IjlO>O z9MK-Hh+qw)>BVoJx2b{?t$y;I@4bnyEHZeEqDt;vs}LpC`u%1vDbDN;f|hkm8hvt3 zxZz7fdU{rO-PJ|1M}U@gcKpLlU#r;O!_*O%8F*z2%+z(J?pg)IQj5>Mc|YTXg%{HQ z6uKVag~@8@)ghlndEmO||KMSCIVW3=#f|5bxvpq(jlX6DGyU20*>%$M$iiDKf5oW} zatQADEDi;>)^@4+yK5#D>C?JHt3=TA5t?;;@!P>(f@hG~vItt&j3_pWc>$20hudHWY710aib8-tJwtmy*VmIK?HCNt_+TzoN} z-Hnk$>$rUWK^k${R?^CH=5s@ulohHs-i2&_s^hMgCkYEXtb0jA~_2X9P#M``pX6%uTz~J2ZT0aH2Z?gDlnST|J zJ1NQee6cVA7r}H59fCzR|^mx>!y=M6QI1KWNpZ=egb9t<+^@2 Xk9PhemXb2vyY(($u1FV-b3n?!2|%&r literal 0 HcmV?d00001 diff --git a/app/static/app/js/dbcontrol.js b/app/static/app/js/dbcontrol.js index 7bf886d..d8a0eaf 100644 --- a/app/static/app/js/dbcontrol.js +++ b/app/static/app/js/dbcontrol.js @@ -3,148 +3,125 @@ const dbName = 'myDB'; const dbVersion = 1; let db; + + +// +// GRUND FUNKTIONEN FÜR DIE DATENBANK +// + + // IndexedDB initialisieren function initDB() { - return new Promise((resolve, reject) => { - const request = indexedDB.open(dbName, dbVersion); + return new Promise((resolve, reject) => { + const request = indexedDB.open(dbName, dbVersion); + + request.onupgradeneeded = function (event) { + db = event.target.result; + const store = db.createObjectStore('hours', { + keyPath: 'id', + autoIncrement: true, + }); + + // Spalten definieren + store.createIndex('createdate', 'createdate', { unique: false }); + store.createIndex('date', 'date', { unique: false }); + store.createIndex('duration', 'duration', { unique: false }); + store.createIndex('type', 'type', { unique: false }); + store.createIndex('status', 'status', { unique: false }); + store.createIndex('sondertext', 'sondertext', { unique: false }); + }; - request.onupgradeneeded = function (event) { - db = event.target.result; - const store = db.createObjectStore('hours', { - keyPath: 'id', - autoIncrement: true, - }); + request.onsuccess = function (event) { + db = event.target.result; + resolve(db); + }; - // Spalten definieren - store.createIndex('createdate', 'createdate', { unique: false }); - store.createIndex('date', 'date', { unique: false }); - store.createIndex('duration', 'duration', { unique: false }); - store.createIndex('type', 'type', { unique: false }); - store.createIndex('status', 'status', { unique: false }); - store.createIndex('sondertext', 'sondertext', { unique: false }); - }; - - request.onsuccess = function (event) { - db = event.target.result; - resolve(db); - }; - - request.onerror = function (event) { - console.error('IndexedDB Fehler:', event.target.errorCode); - reject(event.target.errorCode); - }; - }); + request.onerror = function (event) { + console.error('IndexedDB Fehler:', event.target.errorCode); + reject(event.target.errorCode); + }; + }); } // Neuer Eintrag in die IndexedDB function addEntry(data) { - return new Promise((resolve, reject) => { - const transaction = db.transaction(['hours'], 'readwrite'); - const store = transaction.objectStore('hours'); + return new Promise((resolve, reject) => { + const transaction = db.transaction(['hours'], 'readwrite'); + const store = transaction.objectStore('hours'); - data.createdate = new Date(); - const request = store.add(data); + data.createdate = new Date(); + const request = store.add(data); - request.onsuccess = function () { - resolve(request.result); - }; + request.onsuccess = function () { + resolve(request.result); + }; - request.onerror = function (event) { - reject('Fehler beim Hinzufügen des Eintrags:', event.target.error); - }; - }); + request.onerror = function (event) { + reject('Fehler beim Hinzufügen des Eintrags:', event.target.error); + }; + }); } // Eintrag aktualisieren function updateEntry(id, updatedData) { - return new Promise((resolve, reject) => { - const transaction = db.transaction(['hours'], 'readwrite'); - const store = transaction.objectStore('hours'); + return new Promise((resolve, reject) => { + const transaction = db.transaction(['hours'], 'readwrite'); + const store = transaction.objectStore('hours'); - const getRequest = store.get(id); + const getRequest = store.get(id); - getRequest.onsuccess = function (event) { - const data = event.target.result; - Object.assign(data, updatedData); - data.createdate = new Date(); // Aktualisiere das Änderungsdatum + getRequest.onsuccess = function (event) { + const data = event.target.result; + Object.assign(data, updatedData); + data.createdate = new Date(); // Aktualisiere das Änderungsdatum - const updateRequest = store.put(data); + const updateRequest = store.put(data); - updateRequest.onsuccess = function () { - resolve(data); - }; + updateRequest.onsuccess = function () { + resolve(data); + }; - updateRequest.onerror = function (event) { - reject('Fehler beim Aktualisieren des Eintrags:', event.target.error); - }; - }; + updateRequest.onerror = function (event) { + reject('Fehler beim Aktualisieren des Eintrags:', event.target.error); + }; + }; - getRequest.onerror = function (event) { - reject('Fehler beim Abrufen des Eintrags:', event.target.error); - }; - }); + getRequest.onerror = function (event) { + reject('Fehler beim Abrufen des Eintrags:', event.target.error); + }; + }); } // Eintrag löschen function deleteEntry(id) { - return new Promise((resolve, reject) => { - const transaction = db.transaction(['hours'], 'readwrite'); - const store = transaction.objectStore('hours'); + return new Promise((resolve, reject) => { + const transaction = db.transaction(['hours'], 'readwrite'); + const store = transaction.objectStore('hours'); - const request = store.delete(id); + const request = store.delete(id); - request.onsuccess = function () { - resolve(`Eintrag mit ID ${id} gelöscht.`); - }; + request.onsuccess = function () { + resolve(`Eintrag mit ID ${id} gelöscht.`); + }; - request.onerror = function (event) { - reject('Fehler beim Löschen des Eintrags:', event.target.error); - }; - }); + request.onerror = function (event) { + reject('Fehler beim Löschen des Eintrags:', event.target.error); + }; + }); } // Einträge abrufen function getAllEntries() { - return new Promise((resolve, reject) => { - const transaction = db.transaction(['hours'], 'readonly'); - const store = transaction.objectStore('hours'); - - const request = store.getAll(); - - request.onsuccess = function () { - resolve(request.result); - }; - - request.onerror = function (event) { - reject('Fehler beim Abrufen der Einträge:', event.target.error); - }; - }); -} - -// Einträge nach Monat und/oder Jahr filtern -function filterEntriesByMonthYear(month, year) { return new Promise((resolve, reject) => { const transaction = db.transaction(['hours'], 'readonly'); const store = transaction.objectStore('hours'); - + const request = store.getAll(); - + request.onsuccess = function () { - const allEntries = request.result; - - // Filter nach Monat und Jahr - const filteredEntries = allEntries.filter(entry => { - const entryDate = new Date(entry.date); // Konvertiere das date-Feld in ein Date-Objekt - - const matchesMonth = month ? entryDate.getMonth() + 1 === month : true; // +1 da getMonth() 0-basiert ist - const matchesYear = year ? entryDate.getFullYear() === year : true; - - return matchesMonth && matchesYear; - }); - - resolve(filteredEntries); + resolve(request.result); }; - + request.onerror = function (event) { reject('Fehler beim Abrufen der Einträge:', event.target.error); }; @@ -161,16 +138,16 @@ async function addEncryptedEntry(data) { const store = transaction.objectStore('hours'); const request = store.add({ - iv: Array.from(iv), // IV muss auch gespeichert werden - encryptedData: Array.from(new Uint8Array(encryptedData)), // Encrypted data als Uint8Array speichern + iv: Array.from(iv), // IV muss auch gespeichert werden + encryptedData: Array.from(new Uint8Array(encryptedData)), // Encrypted data als Uint8Array speichern }); request.onsuccess = function () { - resolve(request.result); + resolve(request.result); }; request.onerror = function (event) { - reject('Fehler beim Hinzufügen des verschlüsselten Eintrags:', event.target.error); + reject('Fehler beim Hinzufügen des verschlüsselten Eintrags:', event.target.error); }; }); } @@ -186,19 +163,193 @@ async function getDecryptedEntry(id) { const request = store.get(id); request.onsuccess = async function () { - const entry = request.result; - if (entry) { - const iv = new Uint8Array(entry.iv); - const encryptedData = new Uint8Array(entry.encryptedData); - const decryptedData = await decryptData(key, iv, encryptedData); - resolve(JSON.parse(decryptedData)); - } else { - reject('Eintrag nicht gefunden'); - } - }; - - request.onerror = function (event) { - reject('Fehler beim Abrufen des verschlüsselten Eintrags:', event.target.error); - }; -}); + const entry = request.result; + if (entry) { + const iv = new Uint8Array(entry.iv); + const encryptedData = new Uint8Array(entry.encryptedData); + const decryptedData = await decryptData(key, iv, encryptedData); + resolve(JSON.parse(decryptedData)); + } else { + reject('Eintrag nicht gefunden'); + } + }; + + request.onerror = function (event) { + reject('Fehler beim Abrufen des verschlüsselten Eintrags:', event.target.error); + }; + }); +} + +function durationDBtoForm(durationInMin) { + const hours = Math.floor(durationInMin / 60); // Ganze Stunden berechnen + const mins = durationInMin % 60; // Verbleibende Minuten berechnen + + return [hours, mins] +} + + + +// +// KOMBI FUNKTIONEN +// SIND VOR ALLEM HIER DAMIT SIE ZEITGLEICH GERENDERT WERDEN +// + +// Die abgefragte Dauer in Minuten umrechnen und in hh:mm formatieren +function formatDuration(minutes, shortOutput = false) { + const hours = Math.floor(minutes / 60); // Ganze Stunden berechnen + const mins = minutes % 60; // Verbleibende Minuten berechnen + + if (!shortOutput){ + return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`; // Stunden und Minuten formatieren + } else { + return `${String(hours)}:${String(mins)}`.replace(':30', ',5').replace(':0', ''); // Stunden und Minuten formatieren + } +} + +// Datum für die gewünschte Ansicht formatieren +function formatDate(dateString) { + const date = new Date(dateString); // Konvertiere in ein Date-Objekt + const day = String(date.getDate()).padStart(2, '0'); // Tag + const month = String(date.getMonth() + 1).padStart(2, '0'); // Monat (getMonth() ist 0-basiert) + const year = String(date.getFullYear()).slice(-2); // Die letzten 2 Ziffern des Jahres + return `${day}.${month}.${year}`; // Format tt.mm.yy +} + +// Einträge nach Monat und/oder Jahr filtern +function filterEntriesByMonthYear(month, year) { + return new Promise((resolve, reject) => { + const transaction = db.transaction(['hours'], 'readonly'); + const store = transaction.objectStore('hours'); + + const request = store.getAll(); + + request.onsuccess = function () { + const allEntries = request.result; + + // Filter nach Monat und Jahr + const filteredEntries = allEntries.filter(entry => { + const entryDate = new Date(entry.date); // Konvertiere das date-Feld in ein Date-Objekt + + const matchesMonth = month ? entryDate.getMonth() + 1 === month : true; // +1 da getMonth() 0-basiert ist + const matchesYear = year ? entryDate.getFullYear() === year : true; + + return matchesMonth && matchesYear; + }); + + resolve(filteredEntries); + }; + + request.onerror = function (event) { + reject('Fehler beim Abrufen der Einträge:', event.target.error); + }; + }); +} + +// Tabelle auf dem Dashboard mit Infos füllen +function fillTableWithEntries(entries) { + const tableBody = document.getElementById('entriesTableBody'); + + // Zuerst den Inhalt der Tabelle löschen (falls schon Daten da sind) + tableBody.innerHTML = ''; + + // Iteriere durch die Einträge und füge Zeilen hinzu + entries.forEach(entry => { + const row = document.createElement('tr'); + + //EVENTUELL MAL IN DER ZUKUNFT - UM EINTRÄGE ZU SEITE WISCHEN + // let startX = 0; + // let currentRow; + + // row.addEventListener('touchstart', (e) => { + // startX = e.touches[0].clientX; + // currentRow = e.currentTarget; + // }); + + // row.addEventListener('touchmove', (e) => { + // const moveX = e.touches[0].clientX; + // if (startX - moveX > 50) { + // currentRow.classList.add('swipe-left'); + // } + // }); + + // // Am Ende des Swipe, zeige den Löschen-Button + // row.addEventListener('touchend', () => { + // if (currentRow.classList.contains('swipe-left')) { + // currentRow.querySelector('.editCell').classList.remove('d-none') + // currentRow.querySelector('.delCell').classList.remove('d-none') + // currentRow.querySelector('.duration').classList.add('d-none') + // currentRow.querySelector('.date').classList.add('d-none') + // } + // }); + + // Spalte für die Dauer (duration) + const durationCell = document.createElement('td'); + durationCell.classList.add('duration') + durationCell.textContent = formatDuration(entry.duration); // Dauer im hh:mm-Format + row.appendChild(durationCell); + + // Spalte für das Datum (date) + const dateCell = document.createElement('td'); + const entryDate = new Date(entry.date); // Konvertiere in ein Date-Objekt + dateCell.classList.add('date') + dateCell.textContent = formatDate(entry.date); // Datum im tt.mm.yy-Format + row.appendChild(dateCell); + + // Spalte für den Typ (type) - wenn 3, dann zeige "Beschreibung" an + const typeCell = document.createElement('td'); + if (entry.type === 3) { + typeCell.textContent = entry.sondertext; // Bei Type 3 zeige "Beschreibung" an + } else if (entry.type === 2) { + typeCell.textContent = 'LDC'; // Ansonsten zeige den Type-Wert + } else if (entry.type === 1) { + typeCell.textContent = 'Dienst'; // Ansonsten zeige den Type-Wert + } + row.appendChild(typeCell); + + const editCell = document.createElement('td'); + // editCell.classList.add('editCell') + // editCell.style = 'background-color: rgb(120,170,86); color: white;' + editCell.addEventListener('click', ()=>{ + document.getElementById('editEntryID').value = entry.id; + document.getElementById('editStunden').value = durationDBtoForm(entry.duration)[0]; + document.getElementById('editMinuten').value = durationDBtoForm(entry.duration)[1]; + document.getElementById('editDatum').value = entry.date; + if (entry.type === 2) { + document.getElementById('editldcCheck').checked = true; + } else if (entry.type === 3) { + document.getElementById('editsonstigesCheck').checked = true; + document.getElementById('editsonstigesInput').value = entry.sondertext; + document.getElementById('edit-sonstiges-text').style.display = 'block'; + } + console.log(entry.id) + }) + editCell.innerHTML = ''; + row.appendChild(editCell) + + // const delCell = document.createElement('td'); + // delCell.classList.add('d-none') + // delCell.classList.add('delCell') + // delCell.style = 'background-color: red; color: white;' + // delCell.innerHTML = '

Delete

' + // row.appendChild(delCell) + + // Füge die erstellte Zeile dem Tabellenkörper hinzu + tableBody.appendChild(row); + }); +} + +// Abgefragte Daten Zeiten summieren und filtern können +function sumDurations(data, type = null, roundToHalfHour = false) { + // Optionaler Filter nach dem Typ, falls ein Typ angegeben wurde + const filteredData = type !== null ? data.filter(item => item.type === type) : data; + + // Berechnung der Summe der "duration"-Werte + let totalDuration = filteredData.reduce((sum, item) => sum + item.duration, 0); + + // Optionales Runden auf halbe Stunden + if (roundToHalfHour) { + totalDuration = Math.round(totalDuration / 30) * 30; + } + + return totalDuration; } \ No newline at end of file diff --git a/app/static/app/js/home.js b/app/static/app/js/home.js new file mode 100644 index 0000000..2f07532 --- /dev/null +++ b/app/static/app/js/home.js @@ -0,0 +1,198 @@ +// Absende Formular Verwalten +const hours = document.getElementById('stunden'); +const mins = document.getElementById('minuten'); +const NewEntryButton = document.getElementById('newEntrySubmitButton') +var allowToSend = false; + + + +// +// Trigger +// + +// Wenn das Dokument komplett geladen ist +document.addEventListener('DOMContentLoaded', (event) => { + initDB().then(() => { + console.log('IndexedDB erfolgreich initialisiert.'); + // Hier kannst du die App weiter initialisieren, z.B. Daten laden oder die UI aufbauen + + // Bildschirm mit dem Inhalt für den aktuellen Tag füllen + getActualDataAndFillView(); + + //loadInitialData(); + }).catch((error) => { + console.error('Fehler bei der Initialisierung der IndexedDB:', error); + }); +}); + + + +// Änderungen überwachen damit die das Formular nicht zu früh abgesendet wird +hours.addEventListener('input', () => { + checkInput(); +}) +mins.addEventListener('input', () => { + checkInput(); +}) +document.getElementById('sonstigesInput').addEventListener('input', () => { + checkInput(); +}) + +// Einstellungen wenn Neuer Eintrag erstellt wird +NewEntryButton.addEventListener('click', () => { + + if (allowToSend === true) { + var type = 1 + + // Abfragen der Checkboxen + const ldcCheck = document.getElementById('ldcCheck').checked + if (ldcCheck) { + type = 2 + document.getElementById('ldcCheck').checked = false + } else if (document.getElementById('sonstigesCheck').checked) { + type = 3; + document.getElementById('sonstigesCheck').checked = false; + sonstigesText.style.display = 'none'; + } + + // Berechnen der Duration + const duration = (parseInt(hours.value)*60) + parseInt(mins.value) + + const newEntryData = { + date: document.getElementById('datum').value, + duration: duration, + type: type, + status: 1, + sondertext: document.getElementById('sonstigesInput').value, + } + + addEntry(newEntryData).then((id) => { + console.log('Eintrag hinzugefügt mit ID:', id); + }); + + hours.value = null + mins.value = null + document.getElementById('sonstigesInput').value = null + checkInput() + } +}) + +async function getActualDataAndFillView() { + try { + + // Aktuelles Datum + const currentDate = new Date(); + + // Filter funktion aufrufen und entsprechend mit dem aktuellen Datum füllen + const filteredEntries = await filterEntriesByMonthYear(currentDate.getMonth() + 1, currentDate.getFullYear()); + + // Tabelle mit den aktuellen informationen füllen (funktion triggern und Daten übergeben) + fillTableWithEntries(filteredEntries) + + // Ausgabe der Daten in den Log für DEV möglich + // console.log('Gefilterte Einträge für September 2024:', filteredEntries); + + // MonatsCard füllen + + // Aktueller Monatsstand an Stunden + const GesamtStundenMonat = formatDuration(sumDurations(filteredEntries,null,true), true) + document.getElementById('monthHours').innerText = GesamtStundenMonat + document.getElementById('prBarMonth').style.width = `${(100/50)*parseInt(GesamtStundenMonat)}%` + + // Aktueller Rest an Stunden + const rest = 50 - parseInt(GesamtStundenMonat) + if (rest > 0) { + document.getElementById('monthRest').innerText = rest + } else { + document.getElementById('monthRest').innerText = 0 + } + + // Aufteilunge Stunden nach Dienst und LDC + document.getElementById('monthHourService').innerText = formatDuration(sumDurations(filteredEntries,1,true), true) + document.getElementById('monthHourLDC').innerText = formatDuration(sumDurations(filteredEntries,2,true), true) + document.getElementById('monthHourOther').innerText = formatDuration(sumDurations(filteredEntries,3,true), true) + + // Jahres Ansicht füllen + var yearData = await filterEntriesByMonthYear(null, currentDate.getFullYear()); + yearData = formatDuration(sumDurations(yearData, null, true), true) + document.getElementById('yearHours').innerText = yearData + document.getElementById('yearRest').innerText = 600 - parseInt(yearData) + document.getElementById('prBarYear').style.width = `${Math.round((100/600)*parseInt(yearData))}%` + + } catch (error) { + console.error('Fehler bei der Initialisierung oder Filterung:', error); + } +} + + + +// +// NEUES EINTRAG FORMULAR +// + +// Checkboxen-Verhalten: Nur eine Checkbox kann ausgewählt werden +var ldcCheck = document.getElementById('ldcCheck'); +var sonstigesCheck = document.getElementById('sonstigesCheck'); +var sonstigesText = document.getElementById('sonstiges-text'); +var sonstigesInput = document.getElementById('sonstigesInput'); + +ldcCheck.addEventListener('change', function() { + if (ldcCheck.checked) { + sonstigesCheck.checked = false; + sonstigesText.style.display = 'none'; + sonstigesInput.removeAttribute('required'); // Entferne required, wenn "Sonstiges" abgewählt ist + } +}); + +sonstigesCheck.addEventListener('change', function() { + checkInput(); + if (sonstigesCheck.checked) { + ldcCheck.checked = false; + sonstigesText.style.display = 'block'; + sonstigesInput.setAttribute('required', 'required'); // Setze required, wenn "Sonstiges" ausgewählt ist + } else { + sonstigesText.style.display = 'none'; + sonstigesInput.removeAttribute('required'); // Entferne required, wenn "Sonstiges" abgewählt ist + } +}); + + + +// +// FUNKTIONEN LIBARY +// + +function checkInput() { + // Eingabe feld für Beschreibung leeren wenn sonstiges abgewählt wird + if (!sonstigesCheck.checked) { + sonstigesInput.value = null; + } + // Debug ausgabe er Werte + // console.log(`Check: ${sonstigesCheck.checked} - Input: ${sonstigesInput.value} - Stunden: ${hours.value} - Min: ${mins.value}`) + + // Berechtigungen durch gehen damit Button verfügbar und Form abgesendet werden kann + if ((sonstigesCheck.checked && sonstigesInput.value !== "") || !(sonstigesCheck.checked)) { + // Debug Ausgabe für Bedingungsstufen + // console.log("Erste Bedingung: TRUE") + if (hours.value && mins.value) { + // Debug Ausgabe für Bedingungsstufen + // console.log("Zweite Bedingung: TRUE") + if (!allowToSend) { + // Debug Ausgabe für Bedingungsstufen + // console.log("Dritte Bedingung: TRUE") + allowToSend = true; + NewEntryButton.classList.remove('disabled'); + NewEntryButton.classList.replace('btn-light', 'btn-primary'); + } + } else if (allowToSend) { + allowToSend = false; + NewEntryButton.classList.add('disabled'); + NewEntryButton.classList.replace('btn-primary', 'btn-light'); + } + } else if (allowToSend) { + allowToSend = false; + NewEntryButton.classList.add('disabled'); + NewEntryButton.classList.replace('btn-primary', 'btn-light'); + } +} + diff --git a/app/static/app/js/serviceworker.js b/app/static/app/js/serviceworker.js index 7731fb1..f499a52 100644 --- a/app/static/app/js/serviceworker.js +++ b/app/static/app/js/serviceworker.js @@ -28,15 +28,15 @@ self.addEventListener('activate', event => { ); }); -// Serve from Cache -self.addEventListener("fetch", event => { - event.respondWith( - caches.match(event.request) - .then(response => { - return response || fetch(event.request); - }) - .catch(() => { - return caches.match('app/home'); - }) - ) -}); \ No newline at end of file +// // Serve from Cache +// self.addEventListener("fetch", event => { +// event.respondWith( +// caches.match(event.request) +// .then(response => { +// return response || fetch(event.request); +// }) +// .catch(() => { +// return caches.match('app/home'); +// }) +// ) +// }); \ No newline at end of file diff --git a/app/static/app/js/welcomeControl.js b/app/static/app/js/welcomeControl.js new file mode 100644 index 0000000..99e7560 --- /dev/null +++ b/app/static/app/js/welcomeControl.js @@ -0,0 +1,16 @@ +/* ALLES RUND UM DIE WILLKOMMENSMELDUNG */ + +function setAllOk() { + document.getElementById('welcome_content').style.display = 'none'; + document.getElementById('dashboard').classList.remove('d-none'); + document.getElementById('refresh_icon').classList.remove('d-none') + document.getElementById('settings_icon').classList.remove('d-none') +} + +document.getElementById("allOk").addEventListener('click', function(){ + setAllOk(); + localStorage.setItem('infoReadAllRead', "true"); +}) + +const ReadingState = localStorage.getItem('infoReadAllRead'); +if (ReadingState === "true") {setAllOk();} \ No newline at end of file diff --git a/app/templates/app/base.html b/app/templates/app/base.html index f04938b..7acb362 100644 --- a/app/templates/app/base.html +++ b/app/templates/app/base.html @@ -24,24 +24,26 @@ - Settings +
+
-
Allgemein
+ + +
Bericht
  • Bibelstudien:
  • -
  • +
diff --git a/app/templates/app/home.html b/app/templates/app/home.html index 072e9b9..d9c9a4d 100644 --- a/app/templates/app/home.html +++ b/app/templates/app/home.html @@ -2,6 +2,7 @@ {% load static %} {% block content %} + - -

Wilkommen!

-

Schön das du hier bist! +

+ Schön das du hier bist!
Ich wünsche dir viel Freude mit der App. -
Sollten Fragen oder Probleme auftauchen, fühl dich frei in der Community piomint.de/feedback einen Eintrag da zu lassen. +
Diese ist noch ganz neu und wächst immer weiter! +
Ein paar kurze punkte zu dieser App:

Hinweis: -
Diese App ist für Pioniere optimiert und deshalb für den normalen Dienst oder Hilfspionierdienst nicht so gut geeignet. -
Eine Ausnahme ist der "Dauer-Hippi" - Dieser ist in den Einstellung auswählbar. +
Diese App ist für Pioniere und soll das Stundenmanagemant vereinfachen. +
Wenn du "Dauer-Hippi" machst kannst du das in den Einstellungen aktivieren. +
+
Verwendung: +
Diese Daten liegen erstmal lokal auf deinem Handy. In Zukunft wird es so sein, +
das du dir einen Account anlegen kannst und die Daten gesichert werden und du auch über andere Geräte darauf zugreifen kannst. +
Wenn du aktuell die App löscht, sind alle Daten weg! +
+
Datenschutz +
Sowohl jetzt, als auch mit einem Account werden keine Personen bezogenen Daten gesammelt oder gesichert.


@@ -39,24 +38,25 @@
-

Jahr: 450h/600h

-

Offen: 150h

+

Jahr: h/600h

+

Offen: h

-
+
-

Monat: 25h/50h

-

Offen: 25h

+

Monat: h/50h

+

Offen: h

-
+
-
- - +
+ + +
@@ -64,7 +64,7 @@

Timer

-

00:00

+

00:00:00

play play @@ -76,34 +76,51 @@
-
+

Aktivitäten

- - +
- - - - - - - - - - +
DauerDatumBeschreibung
+
- + + + + +