Changes for page Material Collection

Last modified by Judith Steinfeld on 2025/06/03 11:13

From version 54.2
edited by admin
on 2024/10/21 15:07
Change comment: There is no comment for this version
To version 56.1
edited by Judith Steinfeld
on 2024/11/06 09:43
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.admin
1 +XWiki.JudithSteinfeld
Content
... ... @@ -5,7 +5,7 @@
5 5  
6 6  With our material collection we want to provide an overview of existing materials and contacts by outlining where to find what.
7 7  
8 -The collection of existing materials is complemented by our own materials which include for example videos and slides from various workshops and schools organized by the ErUM-Data-Hub in collaboration with DIG-UM with which we reached over 800 participants so far.
8 +The collection of existing materials thrives on being filled and is complemented by our own materials which include for example videos and slides from various workshops and schools organized by the ErUM-Data-Hub in collaboration with DIG-UM with which we reached over 800 participants so far.
9 9  
10 10  
11 11  If you want to be subscribed or unsubscribed from this list please contact [[judith.steinfeld@erumdatahub.de>>mailto:judith.steinfeld@erumdatahub.de]]
... ... @@ -21,7 +21,8 @@
21 21   'link': {"type": "hidden"},
22 22   'date': {"html": true},
23 23   'author': {},
24 - "tags": {"sortable": false, "html": true, "headerClass": "tagsCol"}
24 + "tags": {"sortable": false, "filterable": false, "html": true, "headerClass": "tagsCol"},
25 + "_actions": {"actions": ["view", "edit"]}
25 25  })
26 26  #set ($options = {
27 27   'className': 'Materials.Code.MaterialsClass',
... ... @@ -34,5 +34,8 @@
34 34   'defaultOrder': 'desc'
35 35  })
36 36  #set ($columns = ['doc.location', 'link', "tags", "tags", 'date', 'author'])
38 +#if (!$isGuest)
39 + #set($discard = $columns.add("_actions"))
40 +#end
37 37  #livetable('materials' $columns $columnsProperties $options)
38 38  {{/velocity}}
XWiki.JavaScriptExtension[0]
Code
... ... @@ -1,13 +1,49 @@
1 +const tabName = "materials";
1 1  const tagCols = [
2 - ["Tag1", "CERN", "CHEP", "GPU", "VISPA"],
3 + ["Type", "lecture", "exercise", "hands-on", "solution", "tutorial", "talk", "course", "video", "paper"],
3 3   ["Tags", true],
4 4  ]
5 5  
6 6  document.observe('xwiki:livetable:loading', () => {
7 - debugger;
8 + const mats = document.getElementById(tabName);
9 +
10 + // coulmn data sources
11 + const conf = JSON.parse(mats.dataset.settings);
12 + tagCols.forEach(([name], i) => {
13 + const cn = `tags-${i}`;
14 + conf.columns.splice(conf.columns.indexOf("tags"), 1, cn);
15 + conf.columnDescriptors[cn] = {
16 + displayName: name,
17 + headerClass: "tagsCol",
18 + html: true,
19 + sortable: false,
20 + };
21 + });
22 + mats.dataset.settings = JSON.stringify(conf);
23 +
24 + // column headers
25 + mats.querySelectorAll(".xwiki-livetable-display-header .tagsCol").forEach(
26 + (v, i) => v.textContent = tagCols[i][0]
27 + );
28 +
29 + // handle clicks for tags
30 + document.getElementById(`${tabName}-display`).addEventListener("click", ev => {
31 + if (ev.button) return; // only left click
32 + if (ev.target.nodeName !== "SPAN") return;
33 + if (!ev.target.classList.contains("ltTag")) return;
34 + const tag = ev.target.textContent;
35 + ev.preventDefault();
36 + const lt = mats.__liveTable;
37 + const st = lt.tagCloud.selectedTags;
38 + if (tag in st) delete st[tag];
39 + else st[tag] = {};
40 + lt.tags = Object.keys(st);
41 + lt.clearCache();
42 + lt.showRows(1, lt.limit);
43 + })
8 8  });
9 9  
10 -document.observe("xwiki:livetable:materials:receivedEntries", ({memo: {data}}) => {
46 +document.observe(`xwiki:livetable:${tabName}:receivedEntries`, ({memo: {data}}) => {
11 11   for (const row of data.rows) {
12 12   const ol = new DOMParser().parseFromString(row.doc_location, "text/xml").documentElement;
13 13   const li = ol.children;
... ... @@ -17,12 +17,24 @@
17 17   li[i].textContent = li[i].textContent; // remove link
18 18  
19 19   const a = li[li.length - 1].children[0];
56 + const b = a.ownerDocument.createElement("b");
57 + a.replaceWith(b);
58 + b.appendChild(a);
59 + a.textContent = row.doc_title;
60 +
20 20   const u = new URL(row.link_value);
21 21   let icon;
63 + if (u.hostname.includes("github")) icon = "github";
64 + if (u.hostname.includes("github.io")) icon = "book";
65 + if (u.hostname.includes("gitlab")) icon = "gitlab";
66 + if (u.hostname.includes("google")) icon = "google";
67 + if (u.hostname.includes("colab")) icon = "code";
68 + if (u.hostname.includes("youtube")) icon = "youtube-play";
22 22   if (u.pathname.endsWith(".pdf")) icon = "file-pdf-o";
70 + if (u.pathname.endsWith(".pptx")) icon = "file-powerpoint-o";
23 23   if (icon) {
24 24   const s = a.ownerDocument.createElement("span");
25 - s.textContent = " ";
73 + s.appendChild(a.ownerDocument.createElement("wbr"));
26 26   s.setAttribute("class", `fa fa-${icon}`);
27 27   s.setAttribute("style", "padding-right: .3em;");
28 28   a.insertBefore(s, a.firstChild);
... ... @@ -33,14 +33,14 @@
33 33   row.doc_location = ol.outerHTML;
34 34  
35 35   // tags
36 - const tags = new Set(e.tags_value.slice(1, -1).split(", "));
37 - let i = 1;
38 - for (const [[name, ...want] of tagCols)
39 - row[`tags${i++}`] = (
84 + const tags = new Set(row.tags_value.slice(1, -1).split(", "));
85 + tagCols.forEach(([name, ...want], i) =>
86 + row[`tags-${i}`] = (
40 40   want[0] === true
41 41   ? Array.from(tags)
42 - : want.filter(tag => tags.has(tag) && (tags.remove(tag) || true));
43 - ).sort().map(tag => `<span>${tag}</span>`).join(" ");
89 + : want.filter(tag => tags.delete(tag))
90 + ).sort().map(tag => `<span class="ltTag" style="cursor:pointer;white-space:nowrap;">${tag}</span>`).join(", ")
91 + );
44 44   }
45 45  });
46 46