Changes for page Home

Last modified by Benjamin Fischer on 2025/06/04 14:20

From version 72.47
edited by Benjamin Fischer
on 2024/11/07 11:57
Change comment: There is no comment for this version
To version 79.1
edited by Judith Steinfeld
on 2024/11/12 08:29
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.fischer
1 +XWiki.JudithSteinfeld
Content
... ... @@ -1,7 +1,10 @@
1 1  {{box cssClass="floatinginfobox" image="https://wiki.test.erumdatahub.de/bin/download/Main/WebHome/logo_horizontal_23_neu.png?width=200"}}
2 2  {{displayIcon name="application_view_tile"/}} [[Indico>>https://indico.desy.de/category/984/]]
3 -{{displayIcon name="email"/}} [[Mailing Lists]]
3 +{{displayIcon name="email"/}} [[Mailing Lists>>doc:DIG-UM.Mailing Lists.WebHome]]
4 4  {{displayIcon name="world"/}} [[Website>>https://erumdatahub.de/]]
5 +
6 +//{{icon name="info-circle"/}}//ErUM =** Er**forschung von** U**niversum & **M**aterie
7 +(Research on Universe and Matter)
5 5  {{/box}}
6 6  
7 7  Welcome to the new ErUM-Data-Hub Wiki - a place for all ErUM-Data communities, to interact and share information with one another.
... ... @@ -9,6 +9,8 @@
9 9  If you have any ideas for new features or content that you would want to find here, feel free to get in contact with us.
10 10  Otherwise, you can always create an account and contribute improvements or novel content yourself. For now, the registration is not open to the puplic.
11 11  
15 += =
16 +
12 12  = What is new? =
13 13  
14 14  Have a look at our new comprehensive:
... ... @@ -16,6 +16,8 @@
16 16  * [[Material collection]] of learning and teaching materials, and
17 17  * [[People in ErUM-Data]] list of research groups and contact information of people who work in ErUM-Data.
18 18  
24 += =
25 +
19 19  = ErUM-Data Calendar =
20 20  
21 21  {{velocity output="false"}}
XWiki.JavaScriptExtension[0]
Code
... ... @@ -9,17 +9,19 @@
9 9   const range = num => Array(num).fill().map((_, i) => i);
10 10   FC.defineView('monthCols', {
11 11   class: FC.View.extend({
12 - render() {
13 - console.debug("render");
14 - },
15 - renderSkeleton() {
16 - console.debug("renderSkeleton");
17 - },
18 18   renderEvents(events) {
19 19   console.debug("renderEvents", events);
14 + debugger;
15 + try {
16 + this._renderFun(events);
17 + } catch (e) {
18 + console.exception(e);
19 + }
20 + },
21 + _renderFun(events) {
20 20   const cf = this.opt("columnFormat") ?? "MMM";
21 - const rf = this.opt("rowFormat") ?? "dd";
22 - const df = this.opt("cellFormat") ?? "ddd";
23 + const rf = this.opt("rowFormat") ?? "D";
24 + const df = this.opt("cellFormat") ?? "dd";
23 23   const wf = this.opt("weekFormat") ?? "w";
24 24   const colspan = (df || wf) ? (1 + !!df + !!wf) : null;
25 25  
... ... @@ -27,54 +27,84 @@
27 27   const ye = this.end;
28 28   const yv = events.slice().sort((a,b) => a.start.diff(b.start) || a.end.diff(b.end));
29 29  
32 + const cols = [];
30 30   const head = [];
31 31   const days = Array(31).fill().map(_ => []);
32 32  
33 33   if (rf) {
37 + cols.push(E("col", {class: "fc-fitCol"}));
34 34   head.push(E("th"));
35 35   days.forEach((arr, day) => arr.push(E("th", {class: "fc-axis"}, ys.clone().add({day}).format(rf))));
36 36   }
37 37  
38 - for (const month in Array(12).fill()) {
42 + for (const month of range(12)) {
39 39   const ms = ys.clone().add({month})
40 40   const me = ms.clone().add({month: 1});
41 41   const md = me.diff(ms, "days");
42 - const mv = yv.filter(t => ms.isBefore(t.end) || t.start.isBefore(me));
46 + const mv = yv.filter(t => ms.isBefore(t.end) && t.start.isBefore(me));
43 43  
48 + if (df) cols.push(E("col", {class: "fc-fitCol"}));
49 + cols.push(E("col"));
50 + if (wf) cols.push(E("col", {class: "fc-fitCol"}));
44 44   head.push(E("th", {colspan}, ms.format(cf)));
45 45  
46 46   const bgc = new Array(md);
54 + const bgt = new Array(md);
55 + let scc = [];
56 + let scu = [];
57 + const scs = col => el => {
58 + const step = 100 / scc.length;
59 + el.style.left = `${col * step}%`;
60 + el.style.width = `${step}%`;
61 + };
47 47  
48 - for (let day = 0; i < 31; i++) {
49 - if (i < md) {
63 + for (const day of range(31)) {
64 + if (day < md) {
50 50   const ds = ms.clone().add({day});
51 51   const de = ds.clone().add({day: 1});
52 52  
53 53   const oc = [];
54 - while(mv[0]?.isBefore(de)) {
69 + while(mv[0]?.start.isBefore(de)) {
55 55   const v = mv.shift();
56 - const d = Math.ceil(v.end.min(me).diff(ds, "days", true));
57 - if (t.rendering == "background")
58 - if (t.color)
59 - for (let i=0; i<d; i++)
60 - bgc[day + i] = t.color;
61 - else {
62 - const e = E("div", t.title);
71 + const d = Math.ceil(v.end.max(me).diff(ds, "days", true));
72 + if (v.rendering == "background") {
73 + if (v.color)
74 + for (const i of range(d)) {
75 + bgc[day + i] = v.color;
76 + bgt[day + i] = v.title;
77 + }
78 + } else {
79 + const e = E("div", E("a", {href: v.url}, v.title));
63 63   e.style.height = `${100 * d}%`;
64 - if (t.color) e.style.borderColor = e.style.backgroundColor = t.color;
65 - if (t.textColor) e.style.color = t.textColor;
81 + if (v.color) e.style.borderColor = e.style.backgroundColor = v.color;
82 + if (v.textColor) e.style.color = v.textColor;
83 + if (v.start.isBefore(ms)) e.classList.add("fc-cut-start");
84 + if (me.isBefore(v.end)) e.classList.add("fc-cut-end");
66 66   oc.push(e);
67 - // TODO: soft-columns
86 + const i = scu.indexOf(0);
87 + if (i < 0) {
88 + scc.push([e]);
89 + scu.push(d);
90 + scc.forEach((els, col) => els.forEach(scs(col)));
91 + } else {
92 + scc[i].push(e);
93 + scu[i] = d;
94 + scs(i)(e);
95 + }
68 68   }
69 69   }
70 70  
71 - const da = {class: this.getDayClasses(d).join(" ")};
72 - if (df) days[i].push(E("td", da, ds.format(df)));
73 - if (bgc[day]) da.style = `background-color: ${bgc[day]};`;
74 - days[i].push(E("td", da, oc));
75 - if (wf) days[i].oush(E("td", ds.weekday() ? "" : ds.format(wf)));
99 + scu = scu.map(u => Math.max(0, u - 1));
100 + if (!scu.some()) {scc = []; scu = [];}
101 +
102 + const style = bgc[day] && `background-color: ${bgc[day]};`;
103 + const dc = this.getDayClasses(ds);
104 + const da = (sub, title = bgt[day] ?? null) => ({class: dc.concat(sub).join(" "), style, title});
105 + if (df) days[day].push(E("td", da("fc-dayVal", ds.format("D")), ds.format(df)));
106 + days[day].push(E("td", da("fc-mainVal"), oc));
107 + if (wf) days[day].push(E("td", da("fc-weekVal"), ds.weekday() ? "" : ds.format(wf)));
76 76   } else
77 - days[i].push(E("td", {colspan}));
109 + days[day].push(E("td", {colspan}));
78 78   }
79 79   }
80 80  
... ... @@ -82,13 +82,12 @@
82 82   this.el.addClass("fc-month-cols-view").html(
83 83   E(
84 84   "table",
117 + E("colgroup", cols),
85 85   E("thead", {class: "fc-head"}, E("tr", head)),
86 86   E("tbody", {class: "fc-body"}, days.map(d => E("tr", d))),
87 87   )
88 88   );
89 -
90 - //debugger;
91 - },
122 + }
92 92   }),
93 93   duration: { year: 1 },
94 94   });
... ... @@ -103,6 +103,7 @@
103 103   },
104 104   monthCols: {
105 105   columnFormat: "MMM",
137 + weekFormat: "W",
106 106   titleFormat: "YYYY",
107 107   buttonText: "year",
108 108   },
... ... @@ -119,14 +119,16 @@
119 119   right: "month,monthCols",
120 120   },
121 121   timeFormat: "H:mm",
122 - defaultView: "month",
154 + defaultView: "monthCols",
123 123   firstDay: "1",
124 124   minTime: "8:00",
125 125   maxTime: "23:00",
126 - defaultDate: "2024-11-06",
127 127   editable: false,
128 128   eventDataTransform: event => {
129 - if (event.url.split("/")[4] === "Holidays") event.rendering = "background";
160 + const cal = event.url.split("/")[4];
161 + if (cal === "Holidays" || cal == "Blocked" || cal.includes("Conference")) event.rendering = "background";
162 + event.viewUrl = event.url;
163 + event.url = event.html.match(/<span class="wikiexternallink"><a href="([^"]+)">\1</)?.[1] ?? event.url;
130 130   return event;
131 131   },
132 132   eventRender: function (event, element) {
XWiki.StyleSheetExtension[0]
Code
... ... @@ -1,5 +1,74 @@
1 -#calendarCustom {
1 +@weekend-color: #f5f5f5;
2 +#calendarCustom.fc {
2 2   td.fc-sat, td.fc-sun {
3 - background-color: #f5f5f5;
4 + background-color: @weekend-color;
4 4   }
6 + .fc-month-cols-view > table {
7 + table-layout: auto;
8 + td, th {
9 + border-width: 0px;
10 + }
11 + col.fc-fitCol {
12 + width: 1px;
13 + }
14 + tbody.fc-body {
15 + td {
16 + &.fc-sat, &.fc-sun {
17 + background-color: @weekend-color;
18 + &.fc-dayVal {
19 + background-color: @weekend-color !important;
20 + }
21 + }
22 + }
23 + tr:nth-child(4n+3) > * {
24 + border-top: 1px solid #ddd;
25 + }
26 + tr:nth-child(4n+5) > * {
27 + border-top: 1px solid #bbb;
28 + }
29 + tr:hover > th {
30 + background-color: #ccc;
31 + }
32 + td.fc-mainVal {
33 + position: relative;
34 + & > div {
35 + z-index: 5;
36 + position: absolute;
37 + width: 100%;
38 + overflow: hidden;
39 + border-radius: 4px;
40 + &.fc-cut-start {
41 + border-top-left-radius: 0px;
42 + border-top-right-radius: 0px;
43 + }
44 + &.fc-cut-end {
45 + border-bottom-left-radius: 0px;
46 + border-bottom-right-radius: 0px;
47 + }
48 + &:hover {
49 + width: auto !important;
50 + max-width: 10vw;
51 + height: auto !important;
52 + z-index: 10;
53 + }
54 + & > a {
55 + display: block;
56 + color: inherit;
57 + background-color: inherit;
58 + }
59 + }
60 + }
61 + td.fc-dayVal, td.fc-weekVal {
62 + color: #7f95aa;
63 + cursor: default;
64 + }
65 + td.fc-dayVal {
66 + font-size: small;
67 + }
68 + td.fc-weekVal {
69 + font-size: smaller;
70 + text-align: right;
71 + }
72 + }
73 + }
5 5  }