b0VIM 8.2f €d:È+debianvps-8ced61a9/var/www/html/phpmysql/js/roster.jsutf-8 3210#"! UtpZ[[W¶P O]_¬I GT 6›Ô åVð TD Q— RèG:U�_Ö]5 ’;žU×M,AyAºJûEadvúZ湑{A èɼŒ†„ƒT ÷ º ´ ‹ u 8  ³ ¨ › M G E D #  × ƒ � € k F  ø Ÿ i é Û Ú ž w C  ª˜}nc]/Ñ­¢•|vts^8Èu"Ѥ�dÏÉ£}VU<Ω2åº@úù if ((EDITABLE_CELLS_RIGHT.length > 0) || EDITABLE_CELL) { } else {document.querySelector("#Roster-week-add-editable-row button.row-bottom").classList.remove("active")} setEditableRowBottomTrue() if ((EDITABLE_ROW_BOTTOM) ||(EDITABLE_ROWS_BOTTOM.length > 0)) { } else {document.querySelector("#Roster-week-add-editable-row button.row-top").classList.remove("active")} setEditableRowTrue() if ((EDITABLE_ROW) || (EDITABLE_ROWS_TOP.length > 0)) { return getSettings().then(() => { callback_1 = () => { TIME_STEP = roster_data.time_step DAYBREAK_2 = roster_data.break_90 DAYBREAK_1 = roster_data.break_60 } roster_data = await dbGet_roster_where_yearweek(yws[0]) } else { roster_data = await dbGet_roster_where_yearweek(DATE_YEAR_WEEK) if (yws.indexOf(DATE_YEAR_WEEK) > -1) { let roster_data let yws = await dbGet_rosters_yearweek() ROSTER_PERSON_INFOS = await dbGet_roster_info_where_yearweek(DATE_YEAR_WEEK) EDITABLE_CELLS_RIGHT = await dbGet_roster_editable_cells_right(DATE_YEAR_WEEK) EDITABLE_ROWS_BOTTOM = await dbGet_roster_editable_rows_bottom(DATE_YEAR_WEEK) EDITABLE_ROWS_TOP = await dbGet_roster_editable_rows_top(DATE_YEAR_WEEK) showLoading("getActiveRoster")getActiveRoster = async (reload) => {// get Active Roster} } return createR() } else { }) return createR(changes) return dbGet_roster_changes_where_yearweek(DATE_YEAR_WEEK_OLDEST).then((changes) => { if (year_week < DATE_YEAR_WEEK_OLDEST) { } }) }) return yws } DATE_YEAR_WEEK_OLDEST = ROSTERS_YEARWEEK[ROSTERS_YEARWEEK.length-1] DATE_YEAR_WEEK_NEWEST = ROSTERS_YEARWEEK[0] if (year_week === DATE_YEAR_WEEK) { ROSTERS_YEARWEEK = yws return dbGet_rosters_yearweek().then((yws) => { } changes.forEach(c => dbSet_roster_change_where_yearweek_and_day(year_week, c.day_id, c.start, c.end, c.amount)) if (year_week < DATE_YEAR_WEEK_OLDEST) { return dbSet_roster(year_week, TIME_STEP, [DAYBREAK_1, DAYBREAK_2]).then(() => { createR = (changes) => { if (!year_week) {year_week = DATE_YEAR_WEEK}createDataA = async (year_week) => {// create new Roster} if (r_id && r_id < yws.length) {return await getDataRosterToRoster(yws[r_id]) } let r_id = yws.indexOf(DATE_YEAR_WEEK)+d let yws = ROSTERS_YEARWEEKgetRosterBefore = async (d) => {} } return dbGet_roster_active(year_week).then(r => {pushR(r); return r}) } else { }) return dbGet_roster_active(year_week).then(r => {pushR(r); return r}) return createDataA(year_week).then(() => { } else if (ROSTERS_YEARWEEK.indexOf(year_week) === -1) { return roster if (typeof roster !== "undefined") { } ROSTERS.push({year_week: year_week, roster: [...r]}) pushR = (r) => { let roster = ROSTERS.find(ro => ro.year_week === year_week)?.rostergetDataRosterToRoster = async (year_week) => {} } return getDataRosterToRoster(year_week) } else { return ROSTER_TABLE_TO } else if (year_week === DATE_YEAR_WEEK_TABLE_TO) { return ROSTER_TABLE_FROM } else if (year_week === DATE_YEAR_WEEK_TABLE_FROM) { return ROSTER if (year_week === DATE_YEAR_WEEK) {getActiveRosterData = async (year_week) => {// get Roster Data ROSTERad[‡À�‰‡†} }) hideLoading("toggleTableWeekEditeable") loadRosterTableWeekData(year_week, table_name).then(() => {adJ¦PÇÆ�'©Hå ¾ H ´ ;   ¬ Œ † „ ƒ R ÿ Þ ˜ „ ‚ � 2 Ú Ÿ ‹ m  Ô»z1" ÿí¹OòÕÃ…iQôâܸzÍ¢›šmj8÷»¡ÓÂÀ½šy%úΦ~ while (person_without.length > 0) { while (person_without.length > 0) { if (person_without.length === 0) return person_without = await person_without let person_without = new Promise((res, rej) => {res(getPersonWithoutShifts())}) showLoading("autoAddShifts")autoAddShifts = async (rerun) => {/*} return start if (start < ROSTER[day_id].d[0].t) {start = ROSTER[day_id].d[0].t} if (start+average > ROSTER[day_id].d[ROSTER[day_id].d.length-1].t) {start = ROSTER[day_id].d[ROSTER[day_id].d.length-1].t-average} start = start[0].time let start = await getBestShiftStarts(person_id, day_id) let average = await getPersonAverageHours(person_id, day_id)getAutoTimeStart = async (person_id, day_id) => {} return best.sort((a,b) => b.rank-a.rank) }) best.push({time: d.t, rank: rank}) let rank = amount_sortet.filter(da => { return da.time >= d.t && da.time < d.t+average}).map(da => ((getMax(da.max, da.is)*100)/da.max)).reduce((a, b) => a + b, 0) max_diff = amount_sortet.map(da => (da.max-da.is))[0] ROSTER[day_id].d.forEach(d => { } return re else {re = (re*max_diff/100) } if (re < 0) {re = (re*max_diff/100)*max_diff} let re = max-is getMax = (max, is) => { let max_diff = amount_sortet.map(da => (da.max-da.is))[0] let best = [] average = await average let average = new Promise((res, rej) => {res(getPersonAverageHours(person_id, day_id))}) let amount_sortet = getPersonAmountForDay(day_id).sort((a, b) => {return (b.max-b.is)-(a.max-a.is) })getBestShiftStarts = async (person_id, day_id) => {// get auto shift} }) return } }) return reloadPersonDayData(person_id, day_id, year_week) return setActivePerson(person_id).then((person) => { if (!noreload) { if (year_week !== DATE_YEAR_WEEK) return return dbRemove_shift_where_person_and_year_week_and_day(person_id, year_week, day_id).then(() => { let year_week_set = false let shifts = [] if (ROSTERS_YEARWEEK.indexOf(year_week) === -1) return if (day_id >= DAYS.length) return if (!year_week) { year_week = DATE_YEAR_WEEK}removePersonFromShiftDay = async (person_id, day_id, year_week, noreload) => {} return block_td let block_td = block_table_row.querySelector('[time="'+time+'"]') if (!block_table_row) return let block_table_row = document.getElementById(`Tr-${person_id}-day-${day_id}`)getBlockTimeTd = (person_id, day_id, time) => { } } setTimeAmountTh(day_id) document.querySelector(`#Person-table-tr-${person_id} .td-overtime`).innerHTML = overtime block_overtime.innerHTML = overtime else if (overtime < 0) {block_overtime.classList.add("orange"); block_overtime.classList.remove("green", "red")} else if (overtime > 0) {overtime = `+${overtime}`; block_overtime.classList.add("red"); block_overtime.classList.remove("green", "orange")} if (overtime === 0) {block_overtime.classList.add("green"); block_overtime.classList.remove("orange", "red")} let overtime = person.overtime let block_overtime = document.querySelector(`#Tr-${person_id}-day-${day_id} .td-overtime`) document.querySelector(`#Tr-${person_id}-day-${day_id} .break-today`).innerHTML = breaks document.querySelector(`#Tr-${person_id}-day-${day_id} .hours-today`).innerHTML = hours-person.mpa[day_id] } blocks_name[i].getElementsByClassName("hours-given")[0].innerHTML = hours_a+"/"+hours_total for (var i = 0; i < blocks_name.length; i++) { hours_total = parseFloat(hours_total.toFixed(2))adoO£|9àÕsþ « ¡ m g ( &  Ò ¼ ¬ “ G  À Ÿ ™ † O & % ú Ø ‡ } ] Ø Î ’ ‰ ? 9   ÄKì�G@>ú³}Ñxâát,&«ª–”U-Ã�`UOÒon reloadPersonDayData(person_id, day_id, year_week, "Roster-week-table-to").then(() => { setActivePerson(person_id, year_week).then((persons) => { if (document.getElementById("Roster-week-table-to")) { } }) hideLoading(`setShift-${shift_id}`) reloadPersonDayData(person_id, day_id) setActivePerson(person_id, year_week).then((persons) => { if (year_week === DATE_YEAR_WEEK) { showLoading(`setShift-${shift_id}`)setShift = async (year_week, day_id, person_id, shift_id) => {} return time_end if (time_end > roster[day_id].d[roster[day_id].d.length-1].t) time_end = roster[day_id].d[roster[day_id].d.length-1].t } time_end = time_end-TIME_STEPS[TIME_STEPS.indexOf(TIME_STEP)-1] if (time_start === roster[day_id].d[0].t && roster[day_id].d[1].t-roster[day_id].d[0].t !== TIME_STEP) { let time_end = time_start+person_average_hours-TIME_STEP if (person_average_hours > 9) person_average_hours = person_average_hours+DAYBREAK_2 if (person_average_hours > 6) person_average_hours = person_average_hours+DAYBREAK_1 person_average_hours = await person_average_hours let person_average_hours = new Promise((res, rej) => {res(getPersonAverageHours(person_id, day_id, year_week))}) let roster = await getActiveRosterData(year_week) if (typeof year_week === "undefined") {year_week = DATE_YEAR_WEEK}getShiftEnd = async (person_id, day_id, time_start, year_week) => {} }) dbAdd_shift(next_yw, day_id, person_id, time_start, time_end) dbRemove_shift_where_person_and_year_week_and_day(person_id, next_yw, day_id).then(() => { should_delete && createDataA(next_yw) ROSTERS_YEARWEEK.indexOf(next_yw === -1) && let next_yw = getDateToRosterDate(new Date(getDateOfISOWeek(DATE_YEAR_WEEK).getTime() + 7 * 24 * 60 * 60 * 1000))[0]addShiftToNextRoster = (person_id, day_id, time_start, time_end, should_delete) => {} getD().then(() => setD()) } addShift(DATE_YEAR_WEEK, day_id, person_id, time_start, time_end) if (time_end < time_start) { time_end = time_start} } if (time_end > ROSTER[day_id].d[ROSTER[day_id].d.length-1].t) {time_end = ROSTER[day_id].d[ROSTER[day_id].d.length-1].t} if (time_start > end) { } if (time_end > start-(TIME_STEP*2)) {time_end = start-(TIME_STEP*2)} if (time_start < start) { let time_end = time_start+duration if (duration < 0) {duration = 2} let duration = average-prev_duration-TIME_STEP setD = () => { } average = await average average = new Promise((res, rej) => {res(getPersonAverageHours(person_id, day_id))}) prev_duration = prev_duration [0] prev_duration = await getPersonDayHoursAndBreaks(person_id, day_id) getD = async () => { let average let prev_durationaddExtrashiftToRoster = (person_id, day_id, time_start, start, end) => { */} getActiveRoster().then(() => hideLoading("autoAddShifts")) } person_without.splice(person_without_id, 1) } addNewShiftToRoster(person_id, day_id, as, undefined, undefined, true) as = await as let as = new Promise((res, rej) => {res(getAutoTimeStart(person_id, day_id))}) let day_id = days[di] for (let di=0; di= 0) {max_id = 0} let max_id = person_without.map(p => p[2] === person_without[0][2]).indexOf(false)-1ad$¼_̽²¬ª_±”L>4 Ö š � 3 ) " À Š l  Æ ¨ § q F ÷ ñ ß ’ 9 ß Ô Î ½ » º x E  »´²±dGÄŒLKJƒPîäãI3Ó­�R. þ´ŽRAäÝÛÚ·�92Ú¼» let person_id = person.idcreateBlockExtraShift = (person, day_id, time, start, end) => {} return has_shift }) if (shift.start <= time && shift.end > time) has_shift = true shifts.forEach(shift => { let has_shift = falsetimeHasShift = (time, shifts) => {} }) hideLoading("modifyShift") } updateShift(shift, time, shift.end) } else { updateShift(shift, shift.start, time+TIME_STEP) } else if (direction === 1) { addNewShiftToRoster(person_id, day_id, start, end, year_week) } end = shift_b.end start = shift.start } else if (time+TIME_STEP === shift_b.start) { end = shift.end start = shift_b.start if (time-TIME_STEP === shift_b.end) { let new_shift let end let start if ((typeof shift_b !== "undefined" && time-TIME_STEP === shift_b.end) || (typeof shift_b !== "undefined" && time+TIME_STEP === shift_b.start)) { } return addNewShiftToRoster(person_id, day_id, time, undefined, year_week) if (direction !== 1 && time > shift.end) { else if (time > ROSTER[day_id].d[ROSTER[day_id].d.length-1].t) {time = ROSTER[day_id].d[ROSTER[day_id].d.length-1].t} if (time < ROSTER[day_id].d[0].t) {time = ROSTER[day_id].d[0].t} let shift_b = shifts.find(s => s.start !== shift.start) let shift = shifts.find(s => s.id === shift_id) let shifts = person.shifts.filter(s => s.day_id === day_id) getActivePersonById(person_id, year_week).then(person => { showLoading("modifyShift") modifyShift = (year_week, day_id, shift_id, person_id, time, direction) => {} }) addShift(DATE_YEAR_WEEK, day_id, person_id, time+TIME_STEP, end) addShift(DATE_YEAR_WEEK, day_id, person_id, start, time) dbRemove_shift_where_id(shift_id).then(() => {splitShift = (person_id, day_id, shift_id, time, start, end) => {} return add() } }) return addShift(year_week, day_id, person_id, time_start, time_end, noreload) return removePersonFromShiftDay(person.id, day_id, year_week, true).then(() => { ROSTERS_YEARWEEK.indexOf(year_week) === -1 && createDataA(year_week) add = () => { } time_end = await getShiftEnd(person_id, day_id, time_start, year_week) if (typeof time_end === "undefined") { let roster = await getActiveRosterData(year_week) if (cif !== false) return let cif = await checkIfPersonDayIsFree(person_id, day_id, year_week) if (typeof year_week === "undefined") {year_week = DATE_YEAR_WEEK; year_week_set = true} let year_week_set = false let person = await getActivePersonById(person_id)addNewShiftToRoster = async (person_id, day_id, time_start, time_end, year_week, noreload) => {} }) } setShift(shift.yearweek, shift.day_id, shift.person_id, shift.id) if (!noreload) { dbSet_shift_where_id(shift.id, start, end).then(() => {updateShift = async (shift, start, end, noreload) => {} }) return shift.shift_id } } return setShift(year_week, day_id, person_id, shift.id) if (!noreload) { if ((year_week === DATE_YEAR_WEEK) || (year_week === DATE_YEAR_WEEK_TABLE_TO)) { return dbAdd_shift(year_week, day_id, person_id, start, end).then(shift => {addShift = async (year_week, day_id, person_id, start, end, noreload) => {} } }) }) hideLoading(`setShift-${shift_id}`)ad1qIË­wž‰‡†nê « ‹ m B  ± ° t 0 í ì s ² ] \   ð ± # ¬oedH zù»±°xwvX—•”F(ì¢98ýŤ?êÏ­Hêäã¤qp block_button.setAttribute("title", title_text) block_button.classList.add("roster-extend-shift", chevron) } title_text = `${person.name}\nSchichtende verschieben\n${timeToHHMM(time+TIME_STEP)}` click = `modifyShift("${DATE_YEAR_WEEK}", ${day_id}, ${shift_id}, ${person_id}, ${time}, 1)` chevron = "chevron-right" if (direction === 1) { let title_text = `${person.name}\nSchichtstart verschieben\n${timeToHHMM(time)}` let click = `modifyShift("${DATE_YEAR_WEEK}", ${day_id}, ${shift_id}, ${person_id}, ${time}, 0)` let chevron = "chevron-left" let block_button = document.createElement("button") if (typeof block_container_mod === "undefined") return let block_container_mod = block_container.getElementsByClassName("shiftmodify-buttons-container")[0] let block_container = block_td.getElementsByClassName("container")[0] let block_td = getBlockTimeTd(person_id, day_id, time) let person_id = person.idaddRosterButtonExtendShift = (person, day_id, shift_id, time, direction) => {} }) } block_button_extend.setAttribute("style", "width: 100%;") } else if (time === end) { block_button_shorten.setAttribute("style", "width: 100%;") if (time === start) { block_td_container.appendChild(block_container) } block_container.appendChild(block_button_shorten) block_button_shorten.setAttribute("title", `${person.name}\nSchichtende verschieben\n${timeToHHMM(time+TIME_STEP)}`) block_button_shorten.setAttribute("onclick", `modifyShift("${DATE_YEAR_WEEK}", ${day_id}, ${shift_id}, ${person_id}, ${time}, 1)`) block_button_shorten.classList.add("chevron-left") if (time !== end) { } block_container.appendChild(block_button_extend) block_button_extend.setAttribute("title", `${person.name}\nSchichtstart verschieben\n${timeToHHMM(time)}`) block_button_extend.setAttribute("onclick", `modifyShift("${DATE_YEAR_WEEK}", ${day_id}, ${shift_id}, ${person_id}, ${time}, 0)`) block_button_extend.classList.add("chevron-right") if (time !== start) { block_container.classList.add("shiftmodify-buttons-container-inner") if (typeof block_extend_remove !== "undefined") block_extend_remove.remove() if (typeof block_container_remove !== "undefined") block_container_remove.remove() let block_extend_remove = block_td_container.getElementsByClassName("roster-extend-shift")[0] let block_container_remove = block_td_container.getElementsByClassName("shiftmodify-buttons-container-inner")[0] let block_button_extend = document.createElement("button") let block_button_shorten = document.createElement("button") let block_container = document.createElement("div") let block_td_container = block_td.getElementsByClassName("container")[0] let block_td = getBlockTimeTd(person_id, day_id, time) if (end-start <= TIME_STEP) return let end = shift.end let start = shift.start let shift = person.shifts.find(s => s.id === shift_id) getActivePersonById(person_id).then(person => {addRosterButtonInnerShiftExtendShort = (person_id, day_id, shift_id, time) => {// load editable Roster} return block_add block_add.setAttribute("onClick", `addExtrashiftToRoster(${person_id}, ${day_id}, ${time}, ${start}, ${end})`) block_add.setAttribute("title", `${person.name}\nExtra Schicht hinzufügen\n${timeToHHMM(time)}`) block_add.classList.add("roster-add-extra-shift") block_add.innerHTML = "+" let block_add = document.createElement("button")adVŽGОœ›M/ô§0ß Þ ¦ O N ð x G E D  Õ ž ^ 6  ç — Q  ´ R ðÅ‹�€cF(ýßœU#ìϬŠFï˨š}Jò‘ûOáAóäÙÓ°Ž� if (h_mpa === 0) {h_mpa = ""} let h_mpa = person.mpa[day_id] } }) } addRosterButtonExtendShift(person, day_id, shift.id, time, 1) if (time !== shift.end && shifts.length === 1) block_container.appendChild(createBlockExtraShift(person, day_id, time, shift.start, shift.end)) } else if (is_after) { addRosterButtonExtendShift(person, day_id, shift.id, time) if (time !== shift.start-TIME_STEP && shifts.length === 1) block_container.appendChild(createBlockExtraShift(person, day_id, time, shift.start, shift.end)) } else if (is_before) { addRosterButtonSplitShift(person, day_id, shifts[0].id, time, shifts[0].start, shifts[0].end) if (shifts.length === 1 && time !== shift.start && time !== shift.end-TIME_STEP) addRosterButtonInnerShiftExtendShort(person_id, day_id, shift.id, time) block_td.classList.add("assigned") if (has_shift) { } is_after = true is_during = false } else if (is_during) { block_td.classList.add("assigned") if (is_after) {is_after = false; shift = shifts[1]} is_before = false is_during = true if (has_shift) { let has_shift = timeHasShift(time, shifts) block_td.classList.remove("assigned") let block_container = block_td.querySelector(".container") let block_td = getBlockTimeTd(person_id, day_id, time) let time = data.t ROSTER[day_id].d.forEach(data => { let is_during = false let is_after = false let is_before = true } removes[i].parentNode.removeChild(removes[i]) for (i=0; i a.start-b.start) let shifts = person.shifts.filter(s => s.day_id === day_id) let person = PERSONS.find(p => p.id === person_id) showLoading("loadEditablePersonDayShift")loadEditablePersonDayShift = (person_id, day_id, noWReload) => {} block_td_container.appendChild(block_button) block_button.setAttribute("onClick", `splitShift(${person_id}, ${day_id}, ${shift_id}, ${time}, ${start}, ${end})`) block_button.setAttribute("title", `${person.name}\nSchicht teilen\n${timeToHHMM(time)}`) block_button.classList.add("shift-split", "button-x", "shiftmodify-button-header") let block_button = document.createElement("button") if (block_remove_button) block_td_container.removeChild(block_remove_button) let block_remove_button = block_td.getElementsByClassName("container")[0].getElementsByClassName("shift-split")[0] let block_td_container = block_td.getElementsByClassName("container")[0] let block_td = getBlockTimeTd(person_id, day_id, time) let person_id = person.idaddRosterButtonSplitShift = (person, day_id, shift_id, time, start, end) => {} block_container_mod.appendChild(block_button) block_button.setAttribute("onClick", click)ad, 6¨f865Έi-ý Æ · ± � Œ l 6 / ü ú ù Ç } [ = <  Ð § n < *  —‘�Ž�w>ê™aVOMLÄ“_ êÕ:£Bþ¸c.×’?ûèÙ΢†ZH // set roster renderPersonTableRow(person_id) // set Person Table row if (year_week === DATE_YEAR_WEEK) { }) }) }) block_td_breaks.innerHTML = hours_breaks_all[1] block_td_hours.innerHTML = hours_breaks_all[0]+"/"+hours_total hours_total = parseFloat(hours_total.toFixed(2)) getPersonHoursWithFreedays(person_id, year_week).then(hours_total => { let breaks_all = hours_breaks_all[1] getPersonHoursAndBreaks(person_id, year_week).then(hours_breaks_all => { let block_td_breaks = block_name.querySelector(".breaks") let block_td_hours = block_name.querySelector(".hours") if (!block_name) {hideLoading(`reloadPersonDayData-${person_id}-${day_id}`); return} let block_name = document.querySelector(`#${table_id} .Roster-week-tr-${person_id} .Roster-week-td-name`) // set week hours and breaks renderRosterTableWeekPersonDay(person, day_id, year_week, document.querySelector(`#${table_id} .Roster-week-td-name-${person_id}-day-${day_id}`), t console.l console.log("a", structuredClone(person)) getActivePersonById(person_id, year_week).then(person => { if (!table_id) {table_id = "Roster-week-table"} if (!year_week) {year_week = DATE_YEAR_WEEK} showLoading(`reloadPersonDayData-${person_id}-${day_id}`)reloadPersonDayData = async (person_id, day_id, year_week, table_id) => {} }) }) hideLoading(`reloadPersonData${person_id}`) reloadPersonDayData(person_id, day_id, year_week, table_id).then(() => { DAYS.forEach((day, day_id) => { showLoading(`reloadPersonData${person_id}`)reloadPersonData = (person_id, year_week, table_id) => {// reload Person data} } return `

${text_start}

-

${text_end}

` } else { return `

-

` if (EDITABLE_TABLES.indexOf(table_id) > -1) { if (text_end.length === 4) {text_end = " "+text_end} let text_end = timeToHHMM(shift_end) if (text_start.length === 4) {text_start = " "+text_start} let text_start = timeToHHMM(shift_start) let shift_end = shift.end let shift_start = shift.start if (typeof table_id === "undefined") {table_id = "Roster-week-table"}getShiftTimeText = (shift, day_id, table_id) => {} hideLoading("loadEditableDataIntoRosterTable") }) loadEditablePersonDayShift(person.id, day_id) PERSONS.forEach(person => { block.classList.add("editable") } return hideLoading("loadEditableDataIntoRosterTable") if (block.classList.contains("editable")) { let block = document.querySelector(`#Roster-${day_id}`) el.classList.add("d-none") window.onmousemove = (e) => eventListenerEditRosterDay(e, day_id) showLoading("loadEditableDataIntoRosterTable")loadEditableDataIntoRosterTable = (el, day_id) => {} hideLoading("loadEditablePersonDayShift") if (block_mpa) { block_mpa.innerHTML = `
${h_mpa}
`} let block_mpa = document.querySelector(`#Tr-${person_id}-day-${day_id} .hours-mpa`)adµámN%á{TB á � ? o )     Ï — O    … U   ã 2 Ô É Ã Á À š ~ X )  ûØªŠ„jhC+è®�‚_C$±«‘�dEû¾œ�lI'±«¦ŒŠdK%ʨŠ}_òÐÅ¡P,Ñľ¼»} } })*/ EDITABLE_CELLS_RIGHT.push({id: person.id, yearweek: DATE_YEAR_WEEK, text: ""}) PERSONS.forEach(person => { EDITABLE_CELLS_RIGHT.push({id: "i", yearweek: DATE_YEAR_WEEK, text: ""}) /*EDITABLE_CELLS_RIGHT = [] }) loadRosterTableWeek() EDITABLE_CELLS_RIGHT = ec dbGet_roster_editable_cells_right(DATE_YEAR_WEEK).then(ec => { setEditableCellTrue() } else { loadRosterTableWeek() EDITABLE_CELLS_RIGHT = [] dbRemove_roster_editable_cells_right(DATE_YEAR_WEEK) EDITABLE_CELL = false el.classList.remove("active") if (EDITABLE_CELL) {rosterWeekAddEditableCell = (el) => {} loadRosterTableWeek() } //for (let i=0; i<6; i++) {EDITABLE_ROWS_BOTTOM.push({id: i.toString(), yearweek: DATE_YEAR_WEEK, text: ''})} EDITABLE_ROWS_BOTTOM = [] EDITABLE_ROW_BOTTOM = true el.classList.add("active") } else { EDITABLE_ROWS_BOTTOM = [] dbRemove_roster_editable_rows_bottom(DATE_YEAR_WEEK) EDITABLE_ROW_BOTTOM = false el.classList.remove("active") if (EDITABLE_ROW_BOTTOM) {rosterWeekAddEditableRowBottom = (el) => {} loadRosterTableWeek() } //for (let i=0; i<6; i++) {EDITABLE_ROWS_TOP.push({id: i.toString(), yearweek: DATE_YEAR_WEEK, text: ''})} EDITABLE_ROWS_TOP = [] EDITABLE_ROW = true el.classList.add("active") } else { EDITABLE_ROWS_TOP = [] dbRemove_roster_editable_rows_top(DATE_YEAR_WEEK) EDITABLE_ROW = false el.classList.remove("active") if (EDITABLE_ROW) {rosterWeekAddEditableRow = (el) => {} loadRosterTableWeek() } DISPLAY_OVERTIME = true dbSet_settings_overtime_default(true) el.classList.add("active") } else { DISPLAY_OVERTIME = false dbSet_settings_overtime_default(false) el.classList.remove("active") if (DISPLAY_OVERTIME) {rosterWeekDisplayOvertime = (el) => {} } }) if (day_id === DAYS.length-1) hideLoading(`loadTableWeekPersonData-${person_id}`) renderRosterTableWeekPersonDay(person, day_id, year_week, document.querySelector(`#${table_id} .Roster-week-td-name-${person_id}-day-${day_id}`), table_id).then(() => { for (let day_id=0; day_id -1) let block_table = document.querySelector(`#${table_id}`) let person = await getActivePersonById(person_id, year_week) if (typeof table_id === "undefined") { table_id = "Roster-week-table"} if (typeof year_week === "undefined") { year_week = DATE_YEAR_WEEK} showLoading(`loadTableWeekPersonData-${person_id}`)loadTableWeekPersonData = async (person_id, year_week, table_id) => {} }) } loadEditablePersonDayShift(person_id, day_id, true) } loadEditablePersonDayShift(per } loa } loadEditablePerson } loadEditablePersonD loadEditablePersonDayShift(person_id, day_id, true) if (docume loadEditablePersonDayShift(person_id, day_id, true) setTimeAmount(person_id)// set roster hours and breaks createBlockRosterTablePersonRow(person, ROSTER[day_id], day_id, document.querySelector(`#Tr-${person_id}-day-${day_id}`)).then(() => {ad}TØÁZð†„( ð ² q S G . ÷ Ú § ~ m A Ô –  â l [ ð æ » { N  ìÛ©Ÿ‡�u(î·ŽYX/Ý´}@ ¬{qD5(þøåÆ›pC4.!æ¹|J ]RLëÏ­¥¤} let title_shift_text = person.name }); return a.start - b.start; shifts.sort((a, b) => { block_td_container.classList.add("container") block_time_container.classList.add("time") } }) if (shifts.length === 0) block_time_container.setAttribute("onClick", `addNewShiftToRoster(${person_id}, ${day_id}, ${auto_start}, undefined, "${year_week}")`) getAutoTimeStart(person_id, day_id).then(auto_start => { if (EDITABLE_TABLES.indexOf(table_id) > -1) { let block_time_container = document.createElement("div") block_td.appendChild(block_td_container) let block_td_container = document.createElement("div")// set shift } return setInfo(person_id, day_id, block_td) block_td.classList.add("v-bottom") block_td.classList.add("no-shift") if (shifts.length === 0) {// set empty shift } block_td.classList.remove("free") } else { return setInfo(person_id, day_id, block_td) } block_td.appendChild(block_duration) //let duration = await getPersonDayHoursAndBreaks(person_id, day_id, year_week)[0] block_duration.classList.add("duration") let block_duration = document.createElement("p") if (ch_free === dbGet_settings_label_cut(2)) { block_td.appendChild(block_free) block_free.appendChild(block_time) block_time.innerHTML = ch_free block_time.classList.add("time") let block_time = document.createElement("p") block_free.classList.add("free") let block_free = document.createElement("div") block_td.classList.add("free") if (ch_free) { let ch_free = await checkIfPersonDayIsFree(person_id, day_id, year_week)// set free } info_set = true } block_td.classList.remove("v-bottom") } else { block_td.appendChild(block_info) block_info.appendChild(block_info_text) block_info_text.innerHTML = info let block_info_text = document.createElement("div") if (typeof info !== "undefined") { } info = await dbGet_roster_info_where_yearweek_and_day_and_person(year_week, day_id, person_id) } else { info = ROSTER_PERSON_INFOS_TABLE_TO.find(i => i.day_id === day_id && i.id === person_id.toString())?.text } else if (year_week === DATE_YEAR_WEEK_TABLE_TO) { info = ROSTER_PERSON_INFOS_TABLE_FROM.find(i => i.day_id === day_id && i.id === person_id.toString())?.text } else if (year_week === DATE_YEAR_WEEK_TABLE_FROM) { info = ROSTER_PERSON_INFOS.find(i => i.day_id === day_id && i.id === person_id.toString())?.text if (year_week === DATE_YEAR_WEEK) { let info block_info.classList.add("info") block_info = document.createElement("div") if (info_set) return setInfo = async (person_id, day_id, block_td) => { let info_set = false// set info let person_id = person.id let shifts = person.shifts.filter(s => s.day_id === day_id) block_td.classList.remove("v-bottom", "free", "v-bottom") block_td.innerHTML = "" if (!block_td) {return}renderRosterTableWeekPersonDay = async (person, day_id, year_week, block_td, table_id) => {} else if (cell === "cell_right") dbSet_roster_editable_cells_right_where_key(DATE_YEAR_WEEK, id, text) else if (cell === "row_bottom") dbSet_roster_editable_rows_bottom_where_key(DATE_YEAR_WEEK, id, text) if (cell === "row_top") dbSet_roster_editable_rows_top_where_key(DATE_YEAR_WEEK, id, text) id = id.toString()setEditableCell = (cell, id, text) => {ad+‹QÖŸ\2ýö½°\*û   g 6 þ ° y l 6  ã ° u ) õ î í â ° x @  è ª d  Ö�4#èÞ¨›e¶ND>ðÅ—„_AÕ x; ÚØ×™mF@ð꿾ˆ[ùøÂ‹Š let block_thead_row = document.createElement("tr") let block_thead = document.createElement("thead") if (EDITABLE_TABLES.indexOf(table_id) > -1) block_table.classList.add("Roster-week-editable") block_table.setAttribute("id", table_id) let block_table = document.createElement("table") let date = getDateOfISOWeek(year_week) } year_week = DATE_YEAR_WEEK if (typeof year_week === "undefined") { } table_id = "Roster-week-table" if (typeof table_id === "undefined") { createBlockRosterTableWeek = async (year_week, table_id) => {} setInfo(person_id, day_id, block_td) } block_td_container.appendChild(block_sl) block_sl.innerHTML = dbGet_shift_label_cut(label_sl) block_sl.classList.add("label") let block_sl = document.createElement("div") block_td_container.style = 'grid-template-areas: "time time time time" "break mpa label duration";' if (label_sl !== false) { let label_sl = person.sl[day_id]// set shift label block_td_container.appendChild(block_mpa) block_mpa.appendChild(block_mpa_value) block_mpa.appendChild(block_mpa_title) block_mpa.classList.add("mpa") } } block_mpa.setAttribute("title", `${getRenames("m").a} mit 1h für diesen Tag hinzufügen.`) block_mpa.setAttribute("onClick", `showLoading("addMpaToday"); window.setTimeout(() => {addMpaToday(${person_id}, ${day_id}, 1); hideLoading("addMpaToday")},50)`) if (EDITABLE_TABLES.indexOf(table_id) > -1) { } else { block_mpa_title.innerHTML = getRenames("m").a } block_mpa_value.innerHTML = person.mpa[day_id] } else { block_mpa_value.setAttribute("onchange", `addMpaToday(${person_id}, ${day_id}, this.value)`) block_mpa_value.setAttribute("step", `0.25`) block_mpa_value.setAttribute("type", `number`) block_mpa_value.setAttribute("title", `${getRenames("m").a} ändern.`) block_mpa_value.setAttribute("value", person.mpa[day_id]) block_mpa_value = document.createElement("input") if (EDITABLE_TABLES.indexOf(table_id) > -1) { if (person.mpa[day_id] > 0) { let block_mpa_value = document.createElement("div") let block_mpa_title = document.createElement("div") let block_mpa = document.createElement("div")// set mpa }) block_td_container.appendChild(block_break) block_break.innerHTML = parseFloat(duration) === 0 ? "" : break_day if (break_day < 10) {break_day = ` ${break_day} `} block_break.setAttribute("title", "Pause") block_break.classList.add("break") let break_day = hours_breaks[1] let block_break = document.createElement("p")// set break block_td_container.appendChild(block_duration) block_duration.innerHTML = parseFloat(duration) === 0 ? "" : duration block_duration.setAttribute("title", "Stunden") block_duration.classList.add("duration") let block_duration = document.createElement("p") if (Math.floor(hours_breaks[0]).toString().length === 1) {duration = " "+duration} duration = duration-person.mpa[day_id] let duration = hours_breaks[0].toString() getPersonDayHoursAndBreaks(person_id, day_id, year_week).then(hours_breaks => {// set hours block_td_container.appendChild(block_time_container) }) block_time_container.appendChild(block_time) block_time.innerHTML = shift_text let shift_text = getShiftTimeText(shift, day_id, table_id) let block_time = document.createElement("div") shifts.forEach((shift, shift_id) => {aduRОjEóò¼“mä ­ q p ?  å h = ß Ø ¿ † , Ý k & Ë ˜ ’ ‘ d c -  ئrUÌ”c]!ä­‹P´Eâ«¡nXR)('¢ŽfC à§€s/)üÌšut let person = person_week[pw] for (let pw=0; pw -1) || (SETTINGS.sort_week.indexOf("d-u") > -1)) {sort_d = true} let sort_d = false block_table.appendChild(block_thead) } addEmptyRow() block_thead.appendChild(block_thead_row_1) } block_thead_row_1.appendChild(block_th_er) block_th_er.innerHTML = EDITABLE_ROWS_TOP.find(c => c.id === i.toString())?.text || "" block_th_er.addEventListener('focusout', (e) => setEditableCell("row_top", i, e.target.innerHTML)) if (!NOWEEKEDIT) block_th_er.setAttribute("contenteditable", `true`) block_th_er.setAttribute("id", `Roster-week-th-editable-${i}`) let block_th_er = document.createElement("th") for (let i=0; i<6; i++) { block_thead_row_1.classList.add("tr-editable") let block_thead_row_1 = document.createElement("tr") if (table_id === "Roster-week-table" && EDITABLE_ROW) { } block_tbody.appendChild(block_tbody_row) block_tbody_row.appendChild(block_td) } block_td.setAttribute("colspan", DAYS.length+1) } else { block_td.setAttribute("colspan", DAYS.length+2) if (EDITABLE_CELL) { let block_td = document.createElement("td") block_tbody_row.classList.add("tr-empty") let block_tbody_row = document.createElement("tr") addEmptyRow = () => { let block_tbody = document.createElement("tbody") block_thead.appendChild(block_thead_row) } block_thead_row.appendChild(block_th_cell) block_th_cell.innerHTML = EDITABLE_CELLS_RIGHT.find(c => c.id === "i")?.text || "" if (EDITABLE_ROW) block_th_cell.setAttribute("rowspan", "2") block_th_cell.addEventListener('focusout', (e) => setEditableCell("cell_right", "i", e.target.innerHTML)) if (!NOWEEKEDIT) block_th_cell.setAttribute("contenteditable", "true") block_th_cell.classList.add("td-editable-cell", `Roster-week-td-editable-cell-i`) let block_th_cell = document.createElement("th") if (EDITABLE_CELL) { }) block_thead_row.appendChild(block_th) block_th.appendChild(block_th_day_date) block_th.appendChild(block_th_day) block_th_day_date.innerHTML = day_date.toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: '2-digit'}) block_th_day.innerHTML = roster.n block_th.setAttribute("day_id", day_id) block_th.classList.add("Roster-week-th") let block_th_day_date = document.createElement("p") let block_th_day = document.createElement("p") let block_th = document.createElement("th") day_date.setDate(day_date.getDate() - (day_date.getDay() + 6) % 7 + day_id) let day_date = new Date(date) roster.forEach((roster, day_id) => { let roster = await getActiveRosterData(year_week) block_thead_row.appendChild(block_th) block_th.appendChild(block_th_name) block_th_name.innerHTML = "Name" let block_th_name = document.createElement("p") block_th.classList.add("Roster-week-th-name") let block_th = document.createElement("th")ad5mGœz? Ì”Xå ¯ y K  ¾ � ? ¿ ¾ Š T  ã « z L Ì Ë ³ ` 9 Ò¯|; øÞ­¦¥j6Ï•a/ÕÔʉLã�¤mc2,+ ö¹‚`Åml if (!NOWEEKEDIT) block_td_ediatable.setAttribute("contenteditable", `true`) block_td_ediatable.setAttribute("id", `Roster-week-td-bottom-editable-${i}`) let block_td_ediatable = document.createElement("td") for (let i=0; i<6; i++) { block_tr_editable.classList.add("tr-editable") let block_tr_editable = document.createElement("tr") addEmptyRow() if (EDITABLE_ROW_BOTTOM) { } block_tbody.appendChild(block_tbody_row) } block_tbody_row.appendChild(block_td_cell) block_td_cell.innerHTML = EDITABLE_CELLS_RIGHT.find(c => c.id === person_id.toString())?.text || "" block_td_cell.addEventListener('focusout', (e) => setEditableCell("cell_right", person_id, e.target.innerHTML)) if (!NOWEEKEDIT) block_td_cell.setAttribute("contenteditable", "true") block_td_cell.classList.add("td-editable-cell", `Roster-week-td-editable-cell-${person_id}`) let block_td_cell = document.createElement("td") if (table_id === "Roster-week-table" && EDITABLE_CELL) { } renderRosterTableWeekPersonDay(person, day_id, year_week, block_td, table_id) block_tbody_row.appendChild(block_td) block_td.setAttribute("day_id", day_id) block_td.setAttribute("person_id", person_id) block_td.classList.add("Roster-week-td", `Roster-week-td-name-${person_id}-day-${day_id}`) block_td = document.createElement("td") for (let day_id=0; day_id {res(getPersonHoursWithFreedays(person_id, year_week))}) let breaks_all = hours_breaks_all[1] let hours_breaks_all = await getPersonHoursAndBreaks(person_id, year_week)// set hours and breaks block_tbody_row.setAttribute("person_id", person_id) block_tbody_row.classList.add("Roster-week-tr-"+person_id) block_tbody_row.appendChild(block_td) block_td.appendChild(block_td_container) block_td_container.appendChild(block_td_breaks) block_td_container.appendChild(block_td_hours) block_td_container.appendChild(block_td_overtime) block_td_container.appendChild(block_td_name) block_td_container.classList.add("td-name") block_td_breaks.setAttribute("title", "Pause insgesamt") block_td_breaks.classList.add("breaks", "font-number") block_td_hours.setAttribute("title", "Stunden insgesamt") block_td_hours.classList.add("hours", "font-number") block_td_overtime.setAttribute("title", "Überstunden insgesamt") block_td_overtime.classList.add("overtime", "font-number") block_td_name.innerHTML = person.name block_td.setAttribute("person_id", person_id) block_td.classList.add("Roster-week-td-name") let block_td_breaks = document.createElement("p") let block_td_hours = document.createElement("p") let block_td_overtime = document.createElement("p") let block_td_name = document.createElement("p") let block_td_container = document.createElement("div") let block_td = document.createElement("td") let block_tbody_row = document.createElement("tr") let person_id = person.id if (sort_d && sort_d_c !== person.department) {addEmptyRow(); sort_d_c = person.department}ad {U‡ÜÒŸ™poXVUõ Ê � V / )  î Ñ ™ s 8   ¿ ¹ ‹ b  è ± £ ˜ ’ n & ` Y W V 8  Á�V,+ûÕ§EÜÛÚ¾d9ÿøÝ¡b;à´o=ÿªDêà¤�›š™g!î¥{z button.classList.remove("d-none") let button = block_container.querySelector(".button-edit-table") if (!block_container.contains(event.target)) { let block_container = document.getElementById(`Roster-${day_id}`)eventListenerEditRosterDay = (event, day_id) => {} }) block_roster_container.appendChild(block_week_info) } document.getElementById("Set-week-info-container").classList.remove("d-none") document.getElementById("Set-week-info-container").querySelector("textarea").value = info document.querySelector("#Roster-week-week-info").classList.add("active") block_week_info.appendChild(block_week_info_text) block_week_info_text.innerHTML = info let block_week_info_text = document.createElement("div") if (typeof info !== "undefined") { let info = ROSTER_PERSON_INFOS.find(i => i.day_id === 999 && i.id === "all")?.text block_week_info.innerHTML = "" block_week_info.setAttribute("id", "Roster-week-info") let block_week_info = document.createElement("div") createB().then(() => { } block_roster_container.appendChild(create_block ) create_block = await create_block let create_block = new Promise((res, rej) => {res(createBlockRosterTableWeek())}) createB = async () => { block_roster_container.appendChild(block_print) block_roster_container.appendChild(block_header) block_print.setAttribute("onClick", `printTable("Roster-week-container", ${DATE_YEAR_WEEK})`) block_print.classList.add("button-print") block_print.innerHTML = "Drucken" block_header.innerHTML = "Woche "+DATE_WEEK block_roster_container.innerHTML = "" let block_print = document.createElement("button") let block_header = document.createElement("h2") let block_roster_container = document.getElementById("Roster-week-container") if (PERSONS.length === 0) returnloadRosterTableWeek = () => {} }) document.querySelectorAll(`#${table_id} .Roster-week-th`)[day_id].querySelectorAll("p")[1].innerHTML = day_date.toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: '2-digit'}) let day_date = new Date(getIsoStringFromDay(day_id, year_week)) DAYS.forEach((day, day_id) => { } }) } hideLoading("loadRosterTableWeekData") if (i === person_all.length-1) { loadTableWeekPersonData(person_id, year_week, table_id).then(() => { let person_id = person_all[i].id for (let i=0; i {} return block_table block_table.appendChild(block_tbody) } block_tbody.appendChild(block_tr_editable) } block_tr_editable.appendChild(block_td_ediatable) block_td_ediatable.innerHTML = EDITABLE_ROWS_BOTTOM.find(c => c.id === i.toString())?.text || "" block_td_ediatable.addEventListener('focusout', (e) => setEditableCell("row_bottom", i, e.target.innerHTML))ad²_ÞØ×ÕÔÓ²ž|X#êÏȶ´³†e=Î ¦ . ¹ ¦ › • € i Y 5  ý Ü º � U ' Ö – e ç Í € P  ¢ ïÝÏ»ª†`KïÉ´ˆfGåî�mA<;:Ú‚"öªK,η¥—Vüé²± } else if (DATE_YEAR_WEEK === year_week) { }) loopP(PERSONS) createDataA(year_week_to).then(() => { if (ROSTERS_YEARWEEK.indexOf(year_week_to) === -1) { } } }) } else if (p === persons_yw.length-1) { hideLoading("copyRosterDay")} }) if (p === persons_yw.length-1) { hideLoading("copyRosterDay")} setS(shifts, day_id, year_week_to).then(() => { if (cf === false) { checkIfPersonDayIsFree(persons_yw[p].id, day_id, year_week_to).then(cf => { let shifts = persons_yw[p].shifts.filter(s => s.day_id === from_id) for (let p=0; p { } day_id = parseFloat(day_id) from_id = parseFloat(from_id) year_week = DATE_YEAR_WEEK } else { day_id = from_id from_id = parseFloat(from_id) year_week_to = DATE_YEAR_WEEK_AFTER year_week = DATE_YEAR_WEEK } else if (day_id === "next"){ day_id = parseFloat(day_id) from_id = day_id year_week = DATE_YEAR_WEEK_BEFORE } else if (from_id === "week_before_week") { day_id = parseFloat(day_id) from_id = day_id year_week = DATE_YEAR_WEEK_BEFORE if (from_id === "week_before") { } else { setAs() } } } }) } else if (p === PERSONS.length-1) { hideLoading("copyRosterDay")} }) if (p === PERSONS.length-1) { hideLoading("copyRosterDay")} setS(shifts, d_id, year_week_to).then(() => { if (cf === false) { checkIfPersonDayIsFree(person_id, d_id).then(cf => { } continue if (p === PERSONS.length-1) { hideLoading("copyRosterDay")} if (d_id === from_id) { for (let d_id=0; d_id s.day_id === from_id) let person_id = person.id let person = PERSONS[p] for (let p = 0; p { from_id = parseFloat(from_id) year_week = DATE_YEAR_WEEK if (day_id === "all") { let year_week_to = DATE_YEAR_WEEK let year_week let new_roster_data asyncMain = () => { } }) return if (shifts.length > 1) { return addShift(yw, did, shifts[1].person_id, shifts[1].start, shifts[1].end) } return addNewShiftToRoster(shifts[0].person_id, did, shifts[0].start, shifts[0].end, yw, noreload).then(() => { if (shifts.length === 0) return if (yw !== DATE_YEAR_WEEK) {noreload = true} let noreload = shifts.length === 1 ? false : true setS = async (shifts, did, yw) => { showLoading("copyRosterDay")copyRosterDay = async (day_id, from_id) => {} return blocks }) blocks.push(block) block.innerHTML = day block.value = d_id let block = document.createElement("option") if (day_id === d_id) return DAYS.forEach((day, d_id) => { let blocks = []createDaysOption = (day_id) => {} } window.onmousemove = nullad0À]áÌgYURB@?üÝ�lAé º «   ™ — – o C ô ¹ ™ ˜ g û Ù Ø ™ Y ) þ ý ¾ b 3   ² ° ¯ † ßÝܤVUõÀOîìë¶Hêèç­xX;Ȧk3-, ­Œa_^÷âܺ˜ƒPNMùÀ¿ let block_input = document.createElement("textarea") let block = el.parentNodeopenPersonDayInfoInput = (person_id, day_id, el) => {} closePersonDayInfoInput(person_id, day_id, block) } while (targetEl); targetEl = targetEl.parentNode; if (targetEl == clickEl) return do { let clickEl = block let targetEl = evt.targeteventListenerClosePersonDayInfoInput = (evt, person_id, day_id, block) => {} reloadPersonDayData(person_id, day_id) document.body.onclick = null document.getElementById(`Td-name-${person_id}-day-${day_id}`).classList.remove("active") block.removeChild(block_text) } addRosterPersonDayInfo(person_id, day_id, text) block.querySelector("button").classList.add("set") } else if (text.length > 0) { block.querySelector("button").classList.remove("set") removeRosterPersonDayInfo(person_id, day_id) if (text.length === 0) { let text = block_text.value let block_text = block.querySelector("textarea")closePersonDayInfoInput = (person_id, day_id, block) => {} dbRemove_roster_info_where_yearweek_and_day_and_person(DATE_YEAR_WEEK, day_id, person_id) ROSTER_PERSON_INFOS = ROSTER_PERSON_INFOS.filter(i => `${i.id}-${i.day_id}` !== `${person_id}-${day_id}`)removeRosterPersonDayInfo = (person_id, day_id) => {} dbSet_roster_info_where_yearweek_and_day_and_person(DATE_YEAR_WEEK, day_id, person_id, text) else ROSTER_PERSON_INFOS.push({id: person_id.toString(), yearweek: DATE_YEAR_WEEK, day_id: day_id, text: text}) if (typeof info !== "undefined") {info.text = text} let info = ROSTER_PERSON_INFOS.find(i => i.day_id === day_id && i.id === person_id.toString()) while (text.slice(-1) === "\n") {text = text.substring(0, text.length-1)}addRosterPersonDayInfo = (person_id, day_id, text) => {} document.getElementById("Table-times-thead-tr-"+day_id).querySelector(`[time="${time}"]`).scrollIntoView({behavior: "smooth", inline: "center", block: "nearest"})scrollTimeIntoView = (day_id, time) => {} document.getElementById("Popup").onclick = (e) => eventListenerClosePopup(e) block.appendChild(block_button_remove) block_button_remove.innerHTML = "löschen" block_button_remove.setAttribute("onClick", "removeDayShifts("+day_id+");closePopup()") let block_button_remove = document.createElement("button") block.appendChild(block_button_cancel) block_button_cancel.innerHTML = "abbrechen" block_button_cancel.setAttribute("onClick", "closePopup()") let block_button_cancel = document.createElement("button") block.appendChild(block_text) block_text.innerHTML = "Sicher dass du alle Schichten für "+DAYS[day_id]+" löschen möchtest?" let block_text = document.createElement("p") block.style.width = "300px" let block = document.getElementById("Popup-container") document.getElementById("Popup").classList.add("active", "request-remove") document.body.classList.add("noscroll")requestRemoveDayShifts = (day_id) => {} }) }) }) hideLoading("removeDayShifts") if (INVIEW.length > 0) document.querySelector(INVIEW)?.scrollIntoView() getActiveRoster().then(() => { setPerson().then(() => { dbRemove_shift_where_year_week_and_day(DATE_YEAR_WEEK, day_id).then(() => { checkElementInView("main") showLoading("removeDayShifts")removeDayShifts = (day_id) => {} asyncMain() } } } dbGet_persons_active_where_yearweek(year_week).then(persons_yw => loopP(persons_yw)) } else { loopP(PERSONS)ad§ ë  ¦=ÿغQECBë ½ { ] : ý ü Ù Ø ¿ Š D ù ¹ ^ Ú › Q ó ò ¹ † … ? üÁ”e)(é±fCÁ!œl,+*Ô´“QͧƒAí²p432òñªcb block_td_name_hours_container.appendChild(block_name_td_container) block_name_td_container.appendChild(block_name_td_container_hours) block_name_td_container_hours.appendChild(block_name_hours) block_name_hours.appendChild(block_name_hours_vs_given) block_name_hours_vs_given.innerHTML = hours_a+"/"+hours_total block_name_hours_vs_given.classList.add("hours-given") block_name_hours_vs_given.setAttribute("title", "Stunden vergeben/Stunden max") let block_name_hours_vs_given = document.createElement("div") let breaks_a = hours_breaks_all[1] let hours_a = hours_breaks_all[0] let hours_breaks_all = await getPersonHoursAndBreaks(person_id, year_week) hours_total = parseFloat(hours_total.toFixed(2)) let hours_total = await getPersonHoursWithFreedays(person_id) let breaks = hours_breaks[1] let hours = hours_breaks[0] let hours_breaks = await getPersonDayHoursAndBreaks(person_id, day_id, year_week) block_name_td_container.appendChild(block_name_td_overtime) block_name_td_overtime.innerHTML = overtime else if (overtime < 0) {block_name_td_overtime.classList.add("orange"); block_name_td_overtime.classList.remove("green", "red")} else if (overtime > 0) {overtime = `+${overtime}`; block_name_td_overtime.classList.add("red"); block_name_td_overtime.classList.remove("green", "orange")} if (overtime === 0) {block_name_td_overtime.classList.add("green"); block_name_td_overtime.classList.remove("orange", "red")} let overtime = person.overtime block_name_td_overtime.setAttribute("title", "Überstunden insgesamt") block_name_td_overtime.classList.add("td-overtime") let block_name_td_overtime = document.createElement("div") block_name_td_container.appendChild(block_name_td_name) block_name_td_name.innerHTML = person.name block_name_td_name.classList.add("name") let block_name_td_name = document.createElement("div") block_name_td_container_hours.classList.add("hours-container") let block_name_td_container_hours = document.createElement("div") block_name_hours.classList.add("hours-amount") let block_name_hours = document.createElement("div") block_name_td.classList.add(`name-${person_id}`, "td-name", "td-name-hours", "td-sticky") block_name_td.setAttribute("id", "Td-name-"+person_id+"-day-"+day_id) block_name_td_container.classList.add("td-name-container") block_name_td.style.background = `linear-gradient(to right, black 1px, ${d_color} 1px, ${d_color} calc(100% - 1px), black 1px)` let d_color = DEPARTMENT_COLORS[DEPARTMENTS.map(d => d.id).indexOf(person.department)] let block_name_td_container = document.createElement("div") block_td_name_hours_container.classList.add("td-name-hours-container") let block_td_name_hours_container = document.createElement("div") let block_name_td = document.createElement("td") // create table name block_tbody_row.innerHTML = "" let shifts = shifts_all.filter(s => s.day_id === day_id) let shifts_all = person.shifts let person_id = person.id let year_week = DATE_YEAR_WEEK document.querySelec console.log("a", structuredClone(person))createBlockRosterTablePersonRow = async (person, roster, day_id, block_tbody_row) => {} }, 100) document.body.onclick = (e) => eventListenerClosePersonDayInfoInput(e, person_id, day_id, block) window.setTimeout(() => { block.appendChild(block_input) if (typeof info !== "undefined") block_input.value = info let info = ROSTER_PERSON_INFOS.find(i => i.day_id === day_id && i.id === person_id.toString())?.text document.getElementById(`Td-name-${person_id}-day-${day_id}`).classList.add("active")ad1¡UÃÂÁ¢¡–Z#îÅÄ�Q#º ™ ˜ [  Ù ¤ w v ; Æ Å \ [ Ò c  Õ — f e * ê§Xô¥rYäã±°¢j;:Ç•m;:9ú¨p0ø÷Á~}dÂÁyA@ùøÛ¡  let block_td_after = document.createElement("td") callback_r = (name) => { // create table td block_tbody_row.appendChild(block_name_td) block_tbody_row.classList.add("tr-name-"+person_id) block_tbody_row.setAttribute("id", `Tr-${person_id}-day-${day_id}`) block_tbody_row.setAttribute("onmouseout", `this.classList.remove("hover");`) block_tbody_row.setAttribute("onmouseover", `this.classList.add("hover");`) // create table time block_td_name_hours_container.appendChild(block_td_top_bottom) block_td_top_bottom .appendChild(block_td_bottom) block_td_bottom.appendChild(block_name_hours_today) block_name_hours_today.innerHTML = hours-person.mpa[day_id] block_name_hours_today.classList.add("hours-today") block_name_hours_today.setAttribute("title", "Schichtstunden heute ohne MPA") let block_name_hours_today = document.createElement("div") block_td_bottom.appendChild(block_name_break) block_name_break.innerHTML = breaks block_name_break.classList.add("break-today") block_name_break.setAttribute("title", "Pause heute") let block_name_break = document.createElement("div") block_td_bottom.classList.add("td-bottom") let block_td_bottom = document.createElement("div") // bottom block_td_top_bottom.appendChild(block_td_top) block_td_top.appendChild(block_name_td_menu) } block_name_td_button.setAttribute("disabled", "true") if (check_if_free) { block_td_top.appendChild(block_name_td_button) block_name_td_menu.classList.add("menu", "menu-"+person_id+"-day-"+day_id) block_name_td_button.setAttribute("onClick", "openRosterPersonMenu("+person_id+", "+day_id+")") block_name_td_button.innerHTML = "" block_name_td_button.classList.add("button-menu", "hamburger") let block_name_td_button = document.createElement("button") let block_name_td_menu = document.createElement("div") block_td_top.appendChild(block_name_td_info) block_name_td_info.appendChild(block_name_td_info_button) block_name_td_info_button.innerHTML = "i" block_name_td_info_button.setAttribute("title", "Informationen zu der Schicht hinzufügen") block_name_td_info_button.setAttribute("onClick", `openPersonDayInfoInput(${person_id}, ${day_id}, this)`) block_name_td_info_button.classList.add("button-info") info && info.length > 0 && block_name_td_info_button.classList.add("set") let info = ROSTER_PERSON_INFOS.find(i => i.day_id === day_id && i.id === person_id.toString())?.text let block_name_td_info_button = document.createElement("button") block_name_td_info.classList.add("td-info") let block_name_td_info = document.createElement("div") block_td_top.appendChild(block_name_mpa) block_name_mpa.appendChild(block_name_mpa_value) block_name_mpa.style.zIndex = mpa === 0 ? "-1" : "0" block_name_mpa_value.innerHTML = mpa === 0 ? "" : person.mpa[day_id] let block_name_mpa_value = document.createElement("div") if (check_if_free) {mpa = 0} let check_if_free = await checkIfPersonDayIsFree(person_id, day_id) let mpa = person.mpa[day_id] block_name_mpa.classList.add("hours-mpa") block_name_mpa.setAttribute("title", getRenames("m").a) let block_name_mpa = document.createElement("div") block_td_top.classList.add("td-top") let block_td_top = document.createElement("div") block_td_top_bottom.classList.add("td-top-bottom") let block_td_top_bottom = document.createElement("div") // top // create table name hours block_name_td.appendChild(block_td_name_hours_container)ad-}MÊ¢„~}[1Ý›bBÕ ¡ z : ë Ÿ X 5 ã Î – ˆ  Ÿ ž X   Ó • [ ) æÜ¢nΙ�ˆ†…jê©zR øÂ‰R)äÂ�Oñ­‰Tå½yUèÞ}| block.appendChild(block_box) block_box.appendChild(block_hou) block_box.appendChild(block_dep) block_box.appendChild(block_name) if (block_remove) block_roster_container.removeChild(block_remove) block_hou.innerHTML = "Stunden" block_hou.setAttribute("onClick", "sortRosterBy('days', this)") block_hou.setAttribute("name", "h") block_hou.classList.add("sort-roster-by", "sort") block_hou.setAttribute("id", "Sort-roster-by-hours") let block_hou = document.createElement("button") block_dep.innerHTML = "Bereich" block_dep.setAttribute("onClick", "sortRosterBy('days', this)") block_dep.setAttribute("name", "d") block_dep.classList.add("sort-roster-by", "sort") block_dep.setAttribute("id", "Sort-roster-by-department") let block_dep = document.createElement("button") block_name.innerHTML = "Name" block_name.setAttribute("onClick", "sortRosterBy('days', this)") block_name.setAttribute("name", "n") block_name.classList.add("sort-roster-by", "sort") block_name.setAttribute("id", "Sort-roster-by-name") let block_name = document.createElement("button") block_box.classList.add("sort-box") let block_box = document.createElement("div") block.classList.add("settings-box") block.setAttribute("id", "Sort-roster-by") let block_remove = document.querySelector("#Sort-roster-by") let block = document.createElement("div") let block_roster_container = document.getElementById("Roster-days-container")renderRosterSort = () => {} }) } block_times_td.classList.add("assigned") if (shifts.find(s => s.start <= time && s.end >time)) { if (time_id === roster.d.length-1) block_tbody_row.appendChild(callback_r(person.name)) block_tbody_row.appendChild(block_times_td) block_times_td.appendChild(block_times_container) } block_times_container.appendChild(block_times_content) block_times_container.innerHTML = "" block_times_content.innerHTML = check_if_free block_times_content = document.createElement("p") block_times_td.classList.add("free") } else { block_times_container.appendChild(block_times_content) block_times_content.appendChild(block_times_button_shift) block_times_button_shift.setAttribute("onClick", "addNewShiftToRoster("+person_id+", "+day_id+", "+time+")") block_times_button_shift.setAttribute("title", `${person.name}\nNeue Schicht\n${timeToHHMM(time)}`) } block_times_button_shift.innerHTML = "" } else { block_times_button_shift.innerHTML = dbGet_shift_label_cut(label) if (label !== false) { block_times_button_shift.classList.add("roster-add-shift") let block_times_button_shift = document.createElement("button") block_times_content.classList.add("shiftmodify-buttons-container") block_times_content = document.createElement("div") if (check_if_free === false) { block_times_td.classList.add("td-day-time") block_times_td.setAttribute("time", time) block_times_td.setAttribute("person", person.name) let block_times_content block_times_container.classList.add("container") let block_times_container = document.createElement("div") let block_times_td = document.createElement("td") let time = data.t roster.d.forEach((data, time_id) => { let label = person.sl[day_id] } return block_td_after block_td_after.innerHTML = name block_td_after.classList.add("td-name-after")ad(AÒ¶´”Bݺ�]6ó « ` _ # Ý Ü ™ X  ë ê é   S R ¼  ¢ , + 쾋OÛ¥h ÂÁ}1€!€%ä­€Dýü®­kÜÛ”(' block_button_edit_table.setAttribute("onClick", `loadEditableDataIntoRosterTable(this, ${day_id})`) let block_button_edit_table = document.createElement("button") block_table_container.classList.add("tables-container") block_table_container.setAttribute("id", "Table-"+day_id+"-container") let block_table_container = document.createElement("div") block_container_roster_head.appendChild(block_container_copy_from_to) block_container_copy_from_to.appendChild(block_button_copy_to) block_button_copy_to.appendChild(block_copy_to_all) block_copy_to_all.innerHTML = "Alle" block_copy_to_all.setAttribute("value", "all") let block_copy_to_all = document.createElement("option") createDaysOption(day_id).forEach(block => block_button_copy_to.appendChild(block)) block_button_copy_to.innerHTML = '' block_button_copy_to.setAttribute("onchange", "copyRosterDay(this.value, "+day_id+")") block_button_copy_to.setAttribute("title", "Den gesamten Plan dieses Tages, auf einen Anderen Tag übertragen.\nDies löscht alle vorhandenen Schichten des zieltages.") block_button_copy_to.classList.add("select-copy-to", "select-copy") let block_button_copy_to = document.createElement("select") block_container_copy_from_to.appendChild(block_button_copy_from) createDaysOption(day_id).forEach(block => block_button_copy_from.appendChild(block)) block_button_copy_from.appendChild(block_option_wbw) block_option_wbw.innerHTML = "Vorletze Woche" block_option_wbw.value = "week_before_week" let block_option_wbw = document.createElement("option") block_button_copy_from.appendChild(block_option_wb) block_option_wb.innerHTML = "Letzte Woche" block_option_wb.value = "week_before" let block_option_wb = document.createElement("option") block_button_copy_from.innerHTML = '' block_button_copy_from.setAttribute("onchange", "copyRosterDay("+day_id+", this.value)") block_button_copy_from.setAttribute("title", "Den gesamten Plan von einem Wochentag, oder selben Tag der Vorwoche kopieren.\nDies löscht alle vorhandenen Schichten des Tages") block_button_copy_from.classList.add("select-copy-from", "select-copy") let block_button_copy_from = document.createElement("select") block_container_copy_from_to.classList.add("container-copy-from-to") let block_container_copy_from_to = document.createElement("div") addDragToScroll(block_container_roster) block_container_roster.appendChild(block_header_day) block_container_roster.classList.add("Roster-container") block_container_roster.setAttribute("id","Roster-"+day_id) block_header_day.setAttribute("id", `Roster-${day_id}-title`) let block_header_day = document.createElement("h2") block_container_roster_head.classList.add("Roster-container-head") let block_container_roster_head = document.createElement("div") let block_container_roster = document.createElement("div") day.setDate(day.getDate() + 1) let roster = ROSTER[day_id] for (let day_id=0; day_id {} setRosterSortButtons(0) block_roster_container.appendChild(block)ad0PA½t6쩨n=É Ž C B  à €  7 ô Á j  Ë ‘ R  ê · ¶ µ „ W * ó±n,Õ—<êÀŠ|{BÂv2ï¥VÓ’2óÄ€P ÇPO block_th_amount_button_up.setAttribute("onClick", "changeTimeAmount(this, "+day_id+", 'up', "+time_id+")") block_th_amount_button_up.classList.add("chevron-up") block_th_amount_buttons.classList.add("th-amount-buttons") block_th_time.innerHTML = time_text if (time_text.length === 4) time_text = ` ${time_text}` let time_text = timeToHHMM(time.t) block_th_time.classList.add("time", "font-number") block_th.setAttribute("style", "background-color: "+colors_red_orange_green[0]+";") block_th.classList.add("th-day-time", "font-number") block_th.setAttribute("time", time.t) let block_th_amount_button_down = document.createElement("button") let block_th_amount_button_up = document.createElement("button") let block_th_amount_buttons = document.createElement("div") let block_th_amount_is = document.createElement("p") let block_th_amount_max = document.createElement("p") let block_th_amount_container = document.createElement("div") let block_th_amount = document.createElement("div") let block_th_time = document.createElement("p") let block_th = document.createElement("th") } block_time_scroll.appendChild(button) button.innerHTML = time.t button.setAttribute("title", `Zur Uhrzeit ${time.t}:00 scrollen`) button.setAttribute("onClick", `scrollTimeIntoView(${day_id}, ${time.t})`) let button = document.createElement("button") if (checkNaturalNumber(time.t)) { let time = roster.d[time_id] for (let time_id=0; time_idó¦¥D]  ß ž n / . è ¡ ^  ä ã ± � € N M ý § m "�€æÜ€Kçæ½”f=å­„Xä�…„WzB<:9 ཆF: Áhba } year_week = document.querySelector("#Popup .item-table-to .select-roster").value if (document.querySelector("#Popup .item-table-to .select-roster")) { } EDITABLE_TABLES.push(table_name) else { if (table_id > -1) { EDITABLE_TABLES.splice(table_id, 1) } let table_id = EDITABLE_TABLES.indexOf(table_name) let year_week = DATE_YEAR_WEEK showLoading("toggleTableWeekEditeable")toggleTableWeekEditeable = (table_name) => {} } addDragToScroll(block_container_roster, day_id) block_header_day.innerHTML = roster.n+" "+day_date.toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: '2-digit'}) day_date.setDate(day_date.getDate() - (day_date.getDay() + 6) % 7 + day_id) let day_date = structuredClone(DATE) } createBlockRosterTablePersonRow(person, roster, day_id, block_tbody_row) block_tbody.appendChild(block_tbody_row) let block_tbody_row = document.createElement("tr") let person = PERSONS_ROSTER[pr] log_date = performance.now() for (let pr=0; pr time.a) color = "#458caf" if (color_id >= colors_red_orange_green.length) color = colors_red_orange_green[colors_red_orange_green.length-1] let color = colors_red_orange_green[color_id] let color_id = Math.round((amount*colors_red_orange_green.length)/time.a) let amount = await getPersonAmountForDayTime(day_id, time.t).length block_thead_row.appendChild(block_th) block_th.appendChild(block_th_time) block_th.appendChild(block_th_amount) block_th_amount.classList.add("time-amount") block_th_amount.appendChild(block_th_amount_buttons) block_th_amount.appendChild(block_th_amount_container) block_th_amount_container.appendChild(block_th_amount_max) block_th_amount_container.appendChild(block_th_amount_is) block_th_amount_is.classList.add("time-amount-is") block_th_amount_is.innerHTML = "0/" block_th_amount_max.classList.add("time-amount-max") block_th_amount_max.innerHTML = time.a block_th_amount_container.classList.add("th-amount-container") block_th_amount_container.setAttribute("title", "vergebene Schichten/Gewünschte Anzahl\nUm mehrere zu erhöhen auf mehrere dieser Zahlen drücken.\nUm alle Markierungen zu entfernen eine unmarkierte Zahl verändern.") block_th_amount_container.setAttribute("onClick", "this.classList.toggle('active')") block_th_amount_buttons.appendChild(block_th_amount_button_down) block_th_amount_buttons.appendChild(block_th_amount_button_up) block_th_amount_button_down.setAttribute("onClick", "changeTimeAmount(this, "+day_id+", 'down', "+time_id+")") block_th_amount_button_down.classList.add("chevron-down")ad�WÕœYêÇ¡_JÕ { z p P  ¤ l ] W 6  ý à ¶ ‰ ƒ ‚ ] \ 4 û � \ é Í Ë Ê ¤ �  òðÀkO1àÙ¿½¼–_9õ“]ã¤^]ëêŠ60.-,Ε10áä£b@¹�� hours_total = await hours_total let hours_total = new Promise((res, rej) => {res(getPersonHoursWithFreedays(person_id))}) let breaks_a = hours_breaks_a[1] let hours_a = hours_breaks_a[0] let hours_breaks_a = await getPersonHoursAndBreaks(person_id) let breaks = hours_breaks[1] let hours = hours_breaks[0] let hours_breaks = await getPersonDayHoursAndBreaks(person_id, day_id) let blocks_name = document.querySelectorAll(`#Roster-days-container .tr-name-${person_id}`) for (let day_id=0; day_id p.id === person_id)setTimeAmount = async (person_id) => {} } block_th.getElementsByClassName("time-amount-is")[0].innerHTML = amount+"/" block_th.setAttribute("style", `background-color: ${color}; border-color: ${color}87;`) let block_th = document.getElementById("Table-times-thead-tr-"+day_id).querySelector('[time="'+el.t+'"]') else if (amount === ROSTER[day_id].d[id].a) color = "#61a64d" if (amount > ROSTER[day_id].d[id].a) color = "#458caf" if (color_id >= colors_red_orange_green.length) color = colors_red_orange_green[colors_red_orange_green.length-1] let color = colors_red_orange_green[color_id] let color_id = Math.round((amount*colors_red_orange_green.length)/ROSTER[day_id].d[id].a) let amount = getPersonAmountForDayTime(day_id, el.t).length let el = ROSTER[day_id].d[id] for (let id=0; id {} return shifts_in_time }) if (shift.start <= time && shift.end >= time) shifts_in_time.push(shift) shifts.forEach(shift => { let shifts_in_time = [] let shifts = PERSONS.map(p => p.shifts).flat(1).filter(s => s.day_id === day_id)getPersonAmountForDayTime = (day_id, time) => {} return amount_day ROSTER[day_id].d.forEach(time => amount_day.push({ time: time.t, is: getPersonAmountForDayTime(day_id, time.t).length, max: time.a }) ) let amount_day = []getPersonAmountForDay = (day_id) => {} setTimeAmountTh(day_id) document.getElementById("Roster-"+day_id).getElementsByClassName("time-amount-max")[ael].innerHTML = newAmount setDataAC(DATE_YEAR_WEEK, day_id, change_times) change_times.forEach(data => {data.time = data.t; data.amount = data.a; delete data.t; delete data.a}) let change_times = structuredClone(ROSTER[day_id].d) ROSTER[day_id].d[ael].a = newAmount if (amount === newAmount) return } if (amount > 0) newAmount = amount-1 } else { if (amount < PERSONS.length) newAmount = amount+1 if (direction === "up") { let newAmount = amount let amount = roster.d[ael].a } return setDataAC(DATE_YEAR_WEEK, day_id, change_times) change_times.forEach(data => {data.time = data.t; data.amount = data.a; delete data.t; delete data.a}) let change_times = structuredClone(ROSTER[day_id].d) setTimeAmountTh(day_id) } block_time.getElementsByClassName("time-amount-max")[0].innerHTML = newAmount ROSTER[day_id].d[t_id].a = newAmount } if (amount > 0) newAmount = amount-1 } else { if (amount < PERSONS.length) newAmount = amount+1 if (direction === "up") { let newAmount = amount let amount = roster.d[t_id].a let t_id = roster.d.map(a => {return a.t}).indexOf(time) let time = parseFloat(block_time.getAttribute("time")) let block_time = block.parentNode.parentNode let block = blocks_multiple[i]ad.¶[‚P*º¹ž?Î o n L  ë » ¤ • Š „ k , é Ø ¸ ® ¨ � Ž � c @ ó   M ü Ï » � G : úôΨ�kjQ'ÙµŠ3פM(ýüÚ¯¤ž…F÷×Íǯ­¬“X8´+ðÆŽPB!ê¶µ for (i=0; i< blocks_multiple.length; i++) { if (blocks_multiple.length > 0) { } } blocks_multiple = [] } blocks_multiple[i].classList.remove("active") for (i=0; i< blocks_multiple.length; i++) { if (blocks_multiple.length > 0) { if (!block_this_active.classList.contains("active")) { let block_this_active = document.getElementById(`Table-times-thead-tr-${day_id}`).getElementsByClassName("th-amount-container")[ael] let blocks_multiple = document.getElementById(`Table-times-thead-tr-${day_id}`).querySelectorAll(".th-amount-container.active") let roster = ROSTER[day_id]changeTimeAmount = async (el, day_id, direction, ael) => {// Roster Amount per day} return callback_0() } } return callback_1() } else { return hideLoading("getActiveRoster") if (ROSTERS_YEARWEEK.indexOf(DATE_YEAR_WEEK) === -1) { callback_0 = () => { } }) hideLoading("getActiveRoster") loadRosterTableWeek() } else {EDITABLE_CELL = false} EDITABLE_CELL = true } else if (DISPLAY_EDITABLE_CELL.v) { EDITABLE_CELL = true if (EDITABLE_CELLS_RIGHT.length > 0) { } else {EDITABLE_ROW_BOTTOM = false} EDITABLE_ROW_BOTTOM = true if ((DISPLAY_EDITABLE_ROW_BOTTOM.v) ||(EDITABLE_ROWS_BOTTOM.length > 0)) { } else {EDITABLE_ROW = false } EDITABLE_ROW = true if ((DISPLAY_EDITABLE_ROW.v) || (EDITABLE_ROWS_TOP.length > 0)) { return getSettings().then(() => { callback_1 = () => { NOWEEKEDIT = true TIME_STEP = roster_data.time_step DAYBREAK_2 = roster_data.break_90 DAYBREAK_1 = roster_data.break_60 } roster_data = await dbGet_roster_where_yearweek(yws[0]) } else { roster_data = await dbGet_roster_where_yearweek(DATE_YEAR_WEEK) if (yws.indexOf(DATE_YEAR_WEEK) > -1) { let roster_data let yws = await dbGet_rosters_yearweek() ROSTER_PERSON_INFOS = await dbGet_roster_info_where_yearweek(DATE_YEAR_WEEK) EDITABLE_CELLS_RIGHT = await dbGet_roster_editable_cells_right(DATE_YEAR_WEEK) EDITABLE_ROWS_BOTTOM = await dbGet_roster_editable_rows_bottom(DATE_YEAR_WEEK) EDITABLE_ROWS_TOP = await dbGet_roster_editable_rows_top(DATE_YEAR_WEEK) showLoading("getActiveRoster")getActiveRosterWeek = async (reload) => {} return callback_0() } } return callback_1() } else { return createDataA().then(() => {return callback_1()}) if (ROSTERS_YEARWEEK.indexOf(DATE_YEAR_WEEK) === -1) { callback_0 = () => { } }) }) return setZoomLevel(SETTINGS.zoom_web) hideLoading("getActiveRoster") return loadRosterTable().then(() => { loadRosterTableWeek() if (person_list_buttons.length > 0) person_list_buttons[0].classList.add("active") for (let i=0; i { let breaks_all = hours_breaks_all[1] getPersonHoursAndBreaks(person_id, year_week).then(hours_breaks_all => { let block_td_breaks = block_name.querySelector(".breaks") let block_td_hours = block_name.querySelector(".hours") if (!block_name) {hideLoading(`reloadPersonDayData-${person_id}-${day_id}`); return} let block_name = document.querySelector(`#${table_id} .Roster-week-tr-${person_id} .Roster-week-td-name`) // set week hours and breaks renderRosterTableWeekPersonDay(person, day_id, year_week, document.querySelector(`#${table_id} .Roster-week-td-name-${person_id}-day-${day_id}`), table_id).then(() => { } renderRosterTableWeekPersonDay(person, day_id, year_week, document.querySelector(`#Roster-week-table .Roster-week-td-name-${person_id}-day-${day_id}`), table_id) if (year_week === DATE_YEAR_WEEK && table_id !== "Roster-week-table") { // set weekadpx;³�rOîíÔŸYÎ s ï ° f   Î › š T  Ö © z > = þ Æ { X Ö6±�A@?éɨf1⼘VÇ…IHG¿x block_td_name_hours_container.appendChild(block_name_td_container) block_name_td_container.appendChild(block_name_td_container_hours) block_name_td_container_hours.appendChild(block_name_hours) block_name_hours.appendChild(block_name_hours_vs_given) block_name_hours_vs_given.innerHTML = hours_a+"/"+hours_total block_name_hours_vs_given.classList.add("hours-given") block_name_hours_vs_given.setAttribute("title", "Stunden vergeben/Stunden max") let block_name_hours_vs_given = document.createElement("div") let breaks_a = hours_breaks_all[1] let hours_a = hours_breaks_all[0] let hours_breaks_all = await getPersonHoursAndBreaks(person_id, year_week) hours_total = parseFloat(hours_total.toFixed(2)) let hours_total = await getPersonHoursWithFreedays(person_id) let breaks = hours_breaks[1] let hours = hours_breaks[0] let hours_breaks = await getPersonDayHoursAndBreaks(person_id, day_id, year_week) block_name_td_container.appendChild(block_name_td_overtime) block_name_td_overtime.innerHTML = overtime else if (overtime < 0) {block_name_td_overtime.classList.add("orange"); block_name_td_overtime.classList.remove("green", "red")} else if (overtime > 0) {overtime = `+${overtime}`; block_name_td_overtime.classList.add("red"); block_name_td_overtime.classList.remove("green", "orange")} if (overtime === 0) {block_name_td_overtime.classList.add("green"); block_name_td_overtime.classList.remove("orange", "red")} let overtime = person.overtime block_name_td_overtime.setAttribute("title", "Überstunden insgesamt") block_name_td_overtime.classList.add("td-overtime") let block_name_td_overtime = document.createElement("div") block_name_td_container.appendChild(block_name_td_name) block_name_td_name.innerHTML = person.name block_name_td_name.classList.add("name") let block_name_td_name = document.createElement("div") block_name_td_container_hours.classList.add("hours-container") let block_name_td_container_hours = document.createElement("div") block_name_hours.classList.add("hours-amount") let block_name_hours = document.createElement("div") block_name_td.classList.add(`name-${person_id}`, "td-name", "td-name-hours", "td-sticky") block_name_td.setAttribute("id", "Td-name-"+person_id+"-day-"+day_id) block_name_td_container.classList.add("td-name-container") block_name_td.style.background = `linear-gradient(to right, black 1px, ${d_color} 1px, ${d_color} calc(100% - 1px), black 1px)` let d_color = DEPARTMENT_COLORS[DEPARTMENTS.map(d => d.id).indexOf(person.department)] let block_name_td_container = document.createElement("div") block_td_name_hours_container.classList.add("td-name-hours-container") let block_td_name_hours_container = document.createElement("div") let block_name_td = document.createElement("td") // create table name block_tbody_row.innerHTML = "" let shifts = shifts_all.filter(s => s.day_id === day_id) let shifts_all = person.shifts let person_id = person.id let year_week = DATE_YEAR_WEEK document.querySelector(`#Roster-${day_id}`).classList.remove("editable")adoãV¶§–PF?=<ö¾v+*é ¬ | B A Y û ð ê è ç Á ¥  P / " ÿ Ñ ± « ‘ � j R ,  Õ ¶ © † j K ØÒ¸¶‹lF"åö“pNØÒͳ±‹rL.ñϱ¤†?÷ìÈwSøëåãÕ} } } } } } })*/ EDITABLE_CELLS_RIGHT.push({id: person.id, yearweek: DATE_YEAR_WEEK, text: ""}) PERSONS.forEach(person => { EDITABLE_CELLS_RIGHT.push({id: "i", yearweek: DATE_YEAR_WEEK, text: ""}) /*EDITABLE_CELLS_RIGHT = [] }) loadRosterTableWeek() EDITABLE_CELLS_RIGHT = ec dbGet_roster_editable_cells_right(DATE_YEAR_WEEK).then(ec => { setEditableCellTrue() } else { loadRosterTableWeek() EDITABLE_CELLS_RIGHT = [] dbRemove_roster_editable_cells_right(DATE_YEAR_WEEK) EDITABLE_CELL = false el.classList.remove("active") if (EDITABLE_CELL) {rosterWeekAddEditableCell = (el) => {} loadRosterTableWeek() } //for (let i=0; i<6; i++) {EDITABLE_ROWS_BOTTOM.push({id: i.toString(), yearweek: DATE_YEAR_WEEK, text: ''})} EDITABLE_ROWS_BOTTOM = [] EDITABLE_ROW_BOTTOM = true el.classList.add("active") } else { EDITABLE_ROWS_BOTTOM = [] dbRemove_roster_editable_rows_bottom(DATE_YEAR_WEEK) EDITABLE_ROW_BOTTOM = false el.classList.remove("active") if (EDITABLE_ROW_BOTTOM) {rosterWeekAddEditableRowBottom = (el) => {} loadRosterTableWeek() } //for (let i=0; i<6; i++) {EDITABLE_ROWS_TOP.push({id: i.toString(), yearweek: DATE_YEAR_WEEK, text: ''})} EDITABLE_ROWS_TOP = [] EDITABLE_ROW = true el.classList.add("active") } else { EDITABLE_ROWS_TOP = [] dbRemove_roster_editable_rows_top(DATE_YEAR_WEEK) EDITABLE_ROW = false el.classList.remove("active") if (EDITABLE_ROW) {rosterWeekAddEditableRow = (el) => {} loadRosterTableWeek() } DISPLAY_OVERTIME = true dbSet_settings_overtime_default(true) el.classList.add("active") } else { DISPLAY_OVERTIME = false dbSet_settings_overtime_default(false) el.classList.remove("active") if (DISPLAY_OVERTIME) {rosterWeekDisplayOvertime = (el) => {} } }) if (day_id === DAYS.length-1) hideLoading(`loadTableWeekPersonData-${person_id}`) renderRosterTableWeekPersonDay(person, day_id, year_week, document.querySelector(`#${table_id} .Roster-week-td-name-${person_id}-day-${day_id}`), table_id).then(() => { for (let day_id=0; day_id -1) let block_table = document.querySelector(`#${table_id}`) let person = await getActivePersonById(person_id, year_week) if (typeof table_id === "undefined") { table_id = "Roster-week-table"} if (typeof year_week === "undefined") { year_week = DATE_YEAR_WEEK} showLoading(`loadTableWeekPersonData-${person_id}`)loadTableWeekPersonData = async (person_id, year_week, table_id) => {} }) } hideLoading(`reloadPersonDayData-${person_id}-${day_id}`) } else { }) hideLoading(`reloadPersonDayData-${person_id}-${day_id}`)