Abwesenheitsplaner (Html Tabelle)
Hallo zusammen,
die html Tabelle in der Vorlage ist mal echt bombe. Genau das was mir fehlt um unsere Planung der Teams besser abzubilden. Sie hat Tooltips und onclick. Leider schaffe ich Mangelns wissen nicht sie auf unsere DB umzubauen. Wenn ich was ändere leuchtet es wie ein Weihnachtsbaum. Daher gebe ich auf, es selber zu versuchen.
Wäre toll wenn ich hier Hilfe von euch bekommen kann. Denn es ist echt toll, wenn man es denn nutzen kann. Brauch auch keine Feiertage. "nur" die Felder in Aufträge und die Tabelle für die Kalenderwoche. Toll wäre es wenn man als zugabe noch bei click auf den Wochentag, die Tabell nur für diesen Tag sehen kann. (bleibt mehr platz für Infos). Aber das ist Wunschdenken.
Danke schon mal im Voraus
Michi
4 Antworten
-
Grüßt euch,
kann mir einer helfen bei der Sache. Das ist mir einfach zu hoch. Aber würde das arbeiten echt erleichtern, wenn ich das wie es auf dem Bild ist, mit der html Tabelle ersetzen könnte.
-
Ich hab ja im Gegensatz zu der Vorlage nur 2 Tabellen welche ich vergleichen muss. Die erste ist die Tabelle wo der code sitzt , die 2. ist Aufträge.
Wenn ich zb in funktion tooltip (me : 'Aufträge') einfüge, scheine ich auf die Tabelle zu verweisen, zumindest findet ninox die felder der Tabelle. Aber spätestens wenn ich speichern möchte kommt irgenwas mit Parametern geändert.
let me := this; let year := number(text(Jahr)); let month := number(Monat); let date0 := date(year, month, 1); let date1 := date(year, month + 1, 0); let days := days(date0, date1) + 1; let rows := ((select Mitarbeiter where not me.Filter or chosen(me.Filter, Team.number(Nr))) order by Name); let holidays := (select Feiertage where Datum >= date0 and Datum <= date1); function tooltip(me : 'Alle Abwesenheiten') do me.--- { Mitarbeiter.(Vorname + " " + Nachname) }<br>{ text('Status:') } - { text(Abwesenheitsart) }<hr>{ format('Erster Tag', "DD.MM.YYYY") + if 'Erster Tag' = 'Letzter Tag' then if Dauer != 1 then " - " + text(Dauer) end else if 'Dauer erster Tag' != 1 then " - " + text('Dauer erster Tag') end end + if 'Erster Tag' != 'Letzter Tag' then "<br>" + format('Letzter Tag', "DD.MM.YYYY") + if 'Dauer letzter Tag' != 1 then " - " + text('Dauer letzter Tag') end end } --- end; function WeekHeads() do let firstMonday := date(year, month, day(date0) - weekday(date0) + 7); let lastMonday := date(year, month, day(date1) - weekday(date1)); let firstWeekDays := days(date0, firstMonday); let weeks := days(firstMonday, lastMonday) / 7; let lastWeekDays := days(lastMonday, date1) + 1; let firstWeek := week(date0); let lastWeek := week(date1); let myFirst := --- <div class="nxp-timeline-cell nxp-timeline-week" style="width:{ firstWeekDays * 40 }px">KW { format(firstWeek, "00") }</div> ---; let myLast := --- <div class="nxp-timeline-cell nxp-timeline-week" style="width:{ lastWeekDays * 40 }px">KW { format(lastWeek, "00") }</div> ---; myFirst + join(for week in range(weeks) do --- <div class="nxp-timeline-cell nxp-timeline-week" style="width:280px">KW { format(week(date(year, month, day(firstMonday) + 1 + week * 7)), "00") }</div> --- end, "") + myLast end; function DayHeads() do join(for day from 1 to days + 1 do let date := date(year, month, day); --- <div class="nxp-timeline-cell nxp-timeline-day"><b>{ format(date, "D") }</b></div> --- end, "") end; function DayNames() do join(for day from 1 to days + 1 do let date := date(year, month, day); --- <div class="nxp-timeline-cell nxp-timeline-day">{ format(date, "dd") }</div> --- end, "") end; function Cell(row : Mitarbeiter,date : date) do --- <div class="nxp-timeline-cell" style="background:{ if date = today() then "#F5A9A9" else if cnt(holidays[Datum = date]) > 0 then "#dcdcdc" else if weekday(date) > 4 then "#f7f8fc" else "white" end end end }">{ if cnt(holidays[Datum = date]) > 0 then "<div class='nxp-timeline-cell-tooltip'>" + first(holidays[Datum = date]).Feiertag + "</div>" else "" end }</div> --- end; function Bar(item : 'Alle Abwesenheiten',y : number) do let day0 := days(date0, max(date0, item.'Erster Tag')) + 1; let day1 := days(date0, min(date1, item.'Letzter Tag')) + 1; let capLeft := item.'Erster Tag' < date0; let capRight := item.'Letzter Tag' > date1; let class := if capLeft then " nxp-timeline-bar-cap-left" else "" end + if capRight then " nxp-timeline-bar-cap-right" else "" end; let color := if item.'Status:' = 3 then color(item.Abwesenheitsart) else "white" end; let border := color(item.Abwesenheitsart); let title := if item.'Status:' = 3 then text(item.Abwesenheitsart) else "" end; let firstHalf := if item.'Dauer erster Tag' = 2 or item.Dauer = 3 then 15 else 0 end; let lastHalf := if item.'Dauer letzter Tag' = 2 or item.Dauer = 2 then 15 else 0 end; let left := (day0 - 1) * 40 + 256 + number(not capLeft) * 4 + firstHalf; let width := (day1 - day0 + 1) * 40 - (number(not capLeft) + number(not capRight)) * 4 - firstHalf - lastHalf; let top := y * 36 + 4; --- <div class="nxp-timeline-bar{ class }" data-nid="{ item.Nr }" style="left:{ left }px;top:{ top }px;width:{ width }px;background-color:{ color };border-color: { border }" onclick="ui.popupRecord('{ item.Nr }')"> <div class="nxp-timeline-bar-tooltip">{ tooltip(item) }</div><div class="nxp-timeline-bar-title">{ title }</div></div> --- end; function Row(row : Mitarbeiter) do let yMax := 0; let items := (row.Abwesenheiten['Erster Tag' <= date1 and 'Letzter Tag' >= date0] order by 'Erster Tag'); let yPositions := ""; let bars := join(for item in items do let items2 := items['Erster Tag' <= item.'Erster Tag' and 'Letzter Tag' >= item.'Erster Tag' and Nr != item.Nr]; let y := 0; for item2 in items2 do let y2 := number(extractx(yPositions, number(item2.Nr) + "=([0-9]+)", "$1")); y := max(y, y2 + 1) end; yPositions := yPositions + " " + number(item.Nr) + "=" + y; "let y := count(items['Erster Tag' < item.'Erster Tag' and 'Letzter Tag' >= item.'Erster Tag'])"; yMax := max(y, yMax); Bar(item, y) end, ""); --- <div class="nxp-timeline-row" style="height:{ (yMax + 1) * 36 + 6 }px"> <div class="nxp-timeline-cell nxp-timeline-name" onclick="ui.popupRecord('{ row.Nr }')">{ row.Name }</div>{ for day from 0 to days do Cell(row, date(year, month, day + 1)) end }{ bars } </div> --- end; function Rows() do join(for row in rows do Row(row) end, "") end; function Widget() do html(--- <div> <style type="text/css">{ Style() }</style> <div class="nxp-timeline"> <div class="nxp-timeline-table"> <div class="nxp-timeline-table-head"> <div class="nxp-timeline-row"><div class="nxp-timeline-cell nxp-timeline-name">KW</div>{ WeekHeads() } </div> <div class="nxp-timeline-row"><div class="nxp-timeline-cell nxp-timeline-name">Tag</div>{ DayHeads() } </div> <div class="nxp-timeline-row"><div class="nxp-timeline-cell nxp-timeline-name"></div>{ DayNames() } </div> </div> <div class="nxp-timeline-table-body">{ Rows() } </div> </div> </div> </div> ---) end; Widget()
-
Hab es glaube ich, bis auf eine Sache... ich brauche die Kunden in der Tabelle zugeordnet zum jeweiligen Team. Da komm ich nicht weiter. Weis einer Rat von euch????
so sieht es jetzt aus:
so soll es aussehen:
function Style() do " .nxp-timeline-table {border-left:solid 1px #e9ecf4;border-top:solid 1px #e9ecf4;display:flex;flex-direction:column;position: absolute;top: 8px;left: 8px;right: 8px;bottom: 8px;} .nxp-timeline-table-head {flex:0 0 auto;} .nxp-timeline-table-body {flex:1 1 auto;overflow:auto} .nxp-timeline-row {display:flex;position:relative;height:40px} .nxp-timeline-cell {width:280px;height:100%;padding:4px;flex:0 0 auto;border-right:solid 1px #e9ecf4;border-bottom:solid 1px #e9ecf4;text-align:center;line-height:32px;box-sizing:border-box} .nxp-timeline-cell-tooltip {display:none;opacity:0;position:relative;z-index:999;min-width:200px;background-color:white;border-style:solid;border-width: 1px;border-color:black;border-radius:3px;padding:8px;color:black;background:#f7f8fc;bottom:-40px;left:1px} .nxp-timeline-cell:hover .nxp-timeline-cell-tooltip {display:block;opacity:1;-webkit-animation:fadeIn .3s;animation:fadeIn .3s} .nxp-timeline-name {width:100px;text-align:left;background:#f7f8fc;cursor:pointer} .nxp-timeline-name:hover {text-decoration:underline} .nxp-timeline-day {background:#f7f8fc} .nxp-timeline-week {background:#f7f8fc;width:280px} .nxp-timeline-bar {position:absolute;top:4px;height:32px;border-radius:4px;background-color:red;opacity:1;cursor:pointer;color:#fff;box-sizing:border-box;border:solid 2px transparent} .nxp-timeline-bar-title {overflow:hidden;text-align:center;line-height:28px;height:100%} .nxp-timeline-bar:hover {border-color:#00000022} .nxp-timeline-bar-cap-left {border-top-left-radius:0;border-bottom-left-radius:0} .nxp-timeline-bar-cap-right {border-top-right-radius:0;border-bottom-right-radius:0} .nxp-timeline-bar-tooltip {display:none;opacity:0;position:absolute;z-index:200;min-width:300px;background-color:white;border-radius:5px;border-style:solid;border-width: 1px;border-color:black;padding:8px;color:black;background:#f7f8fc;bottom:-150px;left:10px} .nxp-timeline-bar:hover .nxp-timeline-bar-tooltip {display:block;opacity:1;-webkit-animation:fadeIn .3s;animation:fadeIn .3s} @-webkit-keyframes fadeIn {from {opacity:0} to {opacity:1}} @keyframes fadeIn {from {opacity:0} to {opacity:1}} " end; let aa := text(Jahr); let bb := KW; let me := this; let date0 := date(number(aa), 1, 4) - weekday(date(number(aa), 1, 4)) + number(bb) * 7 - 7; let date1 := date(number(aa), 1, 4) - weekday(date(number(aa), 1, 4)) + number(bb) * 7 - 2; let days := days(date0, date1) + 1; let rows := ((select 'Aufträge' where not me.Filter1 or chosen(me.Filter1, Team.number(Nr))) order by Name); function tooltip(me : Termine) do me.--- { Mitarbeiter.(Name + " " + Name) }<br>{ text('Status:') } - { text(Auftragsart) }<hr>{ format('Erster Tag', "DD.MM.YYYY") + if 'Erster Tag' = 'Letzter Tag' then if Dauer != 1 then " - " + text(Dauer) end else if 'Dauer erster Tag' != 1 then " - " + text('Dauer erster Tag') end end + if 'Erster Tag' != 'Letzter Tag' then "<br>" + format('Letzter Tag', "DD.MM.YYYY") + if 'Dauer letzter Tag' != 1 then " - " + text('Dauer letzter Tag') end end } --- end; function DayHeads() do join(for p from date0 to date1 + 1 step 1000 * 60 * 60 * 24 do let date := date(p); --- <div class="nxp-timeline-cell nxp-timeline-day"><b>{ format(date, "DD.MM.YYYY") }</b></div> --- end, "") end; function DayNames() do join(for p from date0 to date1 + 1 step 1000 * 60 * 60 * 24 do let date := date(p); --- <div class="nxp-timeline-cell nxp-timeline-day">{ format(date, "dd") }</div> --- end, "") end; function Cell(row : 'Aufträge',date : date) do --- <div class="nxp-timeline-cell" style="background:{ if date = today() then "#F5A9A9" else if weekday(date) > 6 then "#f7f8fc" else "white" end end }">{ if 0 then "<div class='nxp-timeline-cell-tooltip'>" + "" + "</div>" else "" end }</div> --- end; function Bar(item : Termine,y : number) do let day0 := days(date0, max(date0, item.'Erster Tag')) + 1; let day1 := days(date0, min(date1, item.'Letzter Tag')) + 1; let capLeft := item.'Erster Tag' < date0; let capRight := item.'Letzter Tag' > date1; let class := if capLeft then " nxp-timeline-bar-cap-left" else "" end + if capRight then " nxp-timeline-bar-cap-right" else "" end; let color := if item.'Status:' = 3 then color(item.Auftragsart) else "white" end; let border := color(item.Auftragsart); let title := if item.'Status:' = 3 then item.Mitarbeiter.Name + " " + item.Mitarbeiter.Ort + " " + item.Mitarbeiter.Team.Team else "" end; let firstHalf := if item.'Dauer erster Tag' = 2 or item.Dauer = 3 then 15 else 0 end; let lastHalf := if item.'Dauer letzter Tag' = 2 or item.Dauer = 2 then 15 else 0 end; let left := (day0 - 1) * 280 + 100 + number(not capLeft) * 4 + firstHalf; let width := (day1 - day0 + 1) * 280 - (number(not capLeft) + number(not capRight)) * 4 - firstHalf - lastHalf; let top := y * 36 + 4; --- <div class="nxp-timeline-bar{ class }" data-nid="{ item.Nr }" style="left:{ left }px;top:{ top }px;width:{ width }px;background-color:{ color };border-color: { border }" onclick="ui.popupRecord('{ item.Nr }')"> <div class="nxp-timeline-bar-tooltip">{ tooltip(item) }</div><div class="nxp-timeline-bar-title">{ title }</div></div> --- end; function Row(row : 'Aufträge') do let yMax := 0; let items := (row.Termine['Erster Tag' <= date1 and 'Letzter Tag' >= date0] order by 'Erster Tag'); let yPositions := ""; let bars := join(for item in items do let items2 := items['Erster Tag' <= item.'Erster Tag' and 'Letzter Tag' >= item.'Erster Tag' and Nr != item.Nr]; let y := 0; for item2 in items2 do let y2 := number(extractx(yPositions, number(item2.Nr) + "=([0-9]+)", "$1")); y := max(y, y2 + 1) end; yPositions := yPositions + " " + number(item.Nr) + "=" + y; "let y := count(items['Erster Tag' < item.'Erster Tag' and 'Letzter Tag' >= item.'Erster Tag'])"; yMax := max(y, yMax); Bar(item, y) end, ""); --- <div class="nxp-timeline-row" style="height:{ (yMax + 1) * 36 + 6 }px"> <div class="nxp-timeline-cell nxp-timeline-name" onclick="ui.popupRecord('{ row.Nr }')">{ row.Team.Team }</div>{ for day from 0 to days do Cell(row, date(date(number(aa), 1, 4) - weekday(date(number(aa), 1, 4)) + number(bb) * 7 - 7 + 1)) end }{ bars } </div> --- end; function Rows() do join(for row in rows do Row(row) end, "") end; function Widget() do html(--- <div> <style type="text/css">{ Style() }</style> <div class="nxp-timeline"> <div class="nxp-timeline-table"> <div class="nxp-timeline-table-head"> <div class="nxp-timeline-row"><div class="nxp-timeline-cell nxp-timeline-name">Tag</div>{ DayHeads() } </div> <div class="nxp-timeline-row"><div class="nxp-timeline-cell nxp-timeline-name"></div>{ DayNames() } </div> </div> <div class="nxp-timeline-table-body">{ Rows() } </div> </div> </div> </div> ---) end; Widget()
-
Content aside
- Status Answered
- vor 1 JahrZuletzt aktiv
- 4Antworten
- 232Ansichten
-
2
Folge bereits