|
|
|
|
@ -5,6 +5,18 @@ const NewEntryButton = document.getElementById('newEntrySubmitButton')
|
|
|
|
|
const SETStudySaveButton = document.getElementById('SETStudySaveButton')
|
|
|
|
|
const SETMonthGoalSaveButton = document.getElementById('SETMonthGoalSaveButton')
|
|
|
|
|
const rule55hCheck = document.getElementById('rule55hCheck')
|
|
|
|
|
const openViewOfEntry = document.getElementById('openViewOfEntry')
|
|
|
|
|
const openViewOfEntryIcon = document.getElementById('openViewOfEntryIcon')
|
|
|
|
|
const ActivitysTable = document.getElementById('ActivitysTable')
|
|
|
|
|
const timerCard = document.getElementById('timerCard')
|
|
|
|
|
const toggleSortOptions = document.getElementById('toggleSortOptions')
|
|
|
|
|
const sortOptionsRow = document.getElementById('sortOptionsRow')
|
|
|
|
|
const sortFieldButton = document.getElementById('sortFieldButton')
|
|
|
|
|
const sortFieldLabel = document.getElementById('sortFieldLabel')
|
|
|
|
|
const sortFieldMenu = document.getElementById('sortFieldMenu')
|
|
|
|
|
const sortFieldOptions = document.querySelectorAll('.sortFieldOption')
|
|
|
|
|
const sortDirectionToggle = document.getElementById('sortDirectionToggle')
|
|
|
|
|
const sortDirectionIcon = document.getElementById('sortDirectionIcon')
|
|
|
|
|
var allowToSend = false;
|
|
|
|
|
const monate = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"];
|
|
|
|
|
const currentDate = new Date();
|
|
|
|
|
@ -13,6 +25,16 @@ const currentDate = new Date();
|
|
|
|
|
// live aktualisiert, damit getActualDataAndFillView() sie synchron verwenden kann.
|
|
|
|
|
var rule55Active = false;
|
|
|
|
|
|
|
|
|
|
// Sortierung der Aktivitäten-Tabelle: wird aus dem Cache (localStorage) geladen/gespeichert.
|
|
|
|
|
var sortField = 'date';
|
|
|
|
|
var sortDirection = 'asc';
|
|
|
|
|
|
|
|
|
|
// Ob die Filter/Sortier-Optionen gerade sichtbar sind (wird ebenfalls im Cache gespeichert).
|
|
|
|
|
var isFilterVisible = true;
|
|
|
|
|
|
|
|
|
|
// Ob die Aktivitäten-Tabelle gerade maximiert ist (Timer-Karte ist dann ausgeblendet).
|
|
|
|
|
var isTableMaximized = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Trigger
|
|
|
|
|
@ -27,6 +49,12 @@ document.addEventListener('DOMContentLoaded', (event) => {
|
|
|
|
|
// 55h-Regel Einstellung laden, bevor die erste Jahresansicht berechnet wird
|
|
|
|
|
await loadRule55Setting();
|
|
|
|
|
|
|
|
|
|
// Gespeicherte Sortierung der Aktivitäten-Tabelle aus dem Cache laden
|
|
|
|
|
loadSortPreference();
|
|
|
|
|
|
|
|
|
|
// Gespeicherte Sichtbarkeit der Filter/Sortier-Optionen aus dem Cache laden
|
|
|
|
|
loadFilterVisibility();
|
|
|
|
|
|
|
|
|
|
// Bildschirm mit dem Inhalt für den aktuellen Tag füllen
|
|
|
|
|
getActualDataAndFillView();
|
|
|
|
|
|
|
|
|
|
@ -76,6 +104,112 @@ rule55hCheck.addEventListener('change', () => {
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// TABELLE MAXIMIEREN
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
// Aktivitäten-Tabelle vergrößern/verkleinern: Timer-Karte klappt beim Maximieren
|
|
|
|
|
// animiert weg, um Platz zu schaffen; die Tabelle wächst gleichzeitig.
|
|
|
|
|
openViewOfEntry.addEventListener('click', () => {
|
|
|
|
|
isTableMaximized = !isTableMaximized
|
|
|
|
|
ActivitysTable.classList.toggle('ActivitysTableMaximized', isTableMaximized)
|
|
|
|
|
timerCard.classList.toggle('timerCollapsed', isTableMaximized)
|
|
|
|
|
openViewOfEntryIcon.src = isTableMaximized
|
|
|
|
|
? openViewOfEntryIcon.src.replace('open.png', 'close.png')
|
|
|
|
|
: openViewOfEntryIcon.src.replace('close.png', 'open.png')
|
|
|
|
|
openViewOfEntry.title = isTableMaximized ? 'Tabelle minimieren' : 'Tabelle maximieren'
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// SORTIERUNG DER AKTIVITÄTEN-TABELLE
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
// Lädt die gespeicherte Sortierung aus dem Cache (localStorage) und synchronisiert die Steuerelemente
|
|
|
|
|
function loadSortPreference() {
|
|
|
|
|
try {
|
|
|
|
|
const saved = JSON.parse(localStorage.getItem('piomintTableSort'))
|
|
|
|
|
if (saved && saved.field) {
|
|
|
|
|
sortField = saved.field
|
|
|
|
|
sortDirection = (saved.direction === 'desc') ? 'desc' : 'asc'
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Sortierung konnte nicht aus dem Cache geladen werden:', error)
|
|
|
|
|
}
|
|
|
|
|
const selectedOption = Array.from(sortFieldOptions).find(option => option.dataset.value === sortField)
|
|
|
|
|
sortFieldLabel.innerText = selectedOption ? selectedOption.dataset.label : 'Datum'
|
|
|
|
|
sortDirectionIcon.innerText = (sortDirection === 'asc') ? 'A → Z' : 'Z → A'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Speichert die aktuelle Sortierung im Cache (localStorage)
|
|
|
|
|
function saveSortPreference() {
|
|
|
|
|
try {
|
|
|
|
|
localStorage.setItem('piomintTableSort', JSON.stringify({ field: sortField, direction: sortDirection }))
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Sortierung konnte nicht im Cache gespeichert werden:', error)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Eigener Dropdown für die Sortier-Eigenschaft (statt <select>) öffnen/schließen
|
|
|
|
|
sortFieldButton.addEventListener('click', (event) => {
|
|
|
|
|
event.stopPropagation()
|
|
|
|
|
sortFieldMenu.classList.toggle('d-none')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Außerhalb des Menüs klicken schließt es wieder
|
|
|
|
|
document.addEventListener('click', (event) => {
|
|
|
|
|
if (!sortFieldMenu.classList.contains('d-none') && !sortFieldMenu.contains(event.target) && event.target !== sortFieldButton) {
|
|
|
|
|
sortFieldMenu.classList.add('d-none')
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
sortFieldOptions.forEach(option => {
|
|
|
|
|
option.addEventListener('click', () => {
|
|
|
|
|
sortField = option.dataset.value
|
|
|
|
|
sortFieldLabel.innerText = option.dataset.label
|
|
|
|
|
sortFieldMenu.classList.add('d-none')
|
|
|
|
|
saveSortPreference()
|
|
|
|
|
getActualDataAndFillView(cursorMonth, cursorYear)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
sortDirectionToggle.addEventListener('click', () => {
|
|
|
|
|
sortDirection = (sortDirection === 'asc') ? 'desc' : 'asc'
|
|
|
|
|
sortDirectionIcon.innerText = (sortDirection === 'asc') ? 'A → Z' : 'Z → A'
|
|
|
|
|
saveSortPreference()
|
|
|
|
|
getActualDataAndFillView(cursorMonth, cursorYear)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// FILTER/SORTIER-OPTIONEN EIN-/AUSBLENDEN
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
// Lädt die gespeicherte Sichtbarkeit der Filter-Optionen aus dem Cache (localStorage)
|
|
|
|
|
function loadFilterVisibility() {
|
|
|
|
|
try {
|
|
|
|
|
const saved = localStorage.getItem('piomintFilterVisible')
|
|
|
|
|
if (saved !== null) {
|
|
|
|
|
isFilterVisible = (saved === 'true')
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Filter-Sichtbarkeit konnte nicht aus dem Cache geladen werden:', error)
|
|
|
|
|
}
|
|
|
|
|
sortOptionsRow.classList.toggle('sortOptionsCollapsed', !isFilterVisible)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
toggleSortOptions.addEventListener('click', () => {
|
|
|
|
|
isFilterVisible = !isFilterVisible
|
|
|
|
|
sortOptionsRow.classList.toggle('sortOptionsCollapsed', !isFilterVisible)
|
|
|
|
|
// Offenes Dropdown-Menü beim Einklappen der Filterzeile mit schließen
|
|
|
|
|
if (!isFilterVisible) {
|
|
|
|
|
sortFieldMenu.classList.add('d-none')
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
localStorage.setItem('piomintFilterVisible', isFilterVisible)
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error('Filter-Sichtbarkeit konnte nicht im Cache gespeichert werden:', error)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Änderungen überwachen damit die das Formular nicht zu früh abgesendet wird
|
|
|
|
|
@ -237,7 +371,7 @@ async function getActualDataAndFillView(monat = currentDate.getMonth(), jahr = c
|
|
|
|
|
console.log(jahr)
|
|
|
|
|
|
|
|
|
|
// Tabelle mit den aktuellen informationen füllen (funktion triggern und Daten übergeben)
|
|
|
|
|
fillTableWithEntries(filteredEntries)
|
|
|
|
|
fillTableWithEntries(filteredEntries, sortField, sortDirection)
|
|
|
|
|
|
|
|
|
|
// Ausgabe der Daten in den Log für DEV möglich
|
|
|
|
|
// console.log('Gefilterte Einträge für September 2024:', filteredEntries);
|
|
|
|
|
|