Changes for page Helpers

Last modified by Benjamin Fischer on 2025/06/17 11:57

From version 1.1
edited by Benjamin Fischer
on 2025/05/15 13:30
Change comment: There is no comment for this version
To version 1.8
edited by Benjamin Fischer
on 2025/05/15 16:21
Change comment: There is no comment for this version

Summary

Details

XWiki.JavaScriptExtension[0]
Caching policy
... ... @@ -1,0 +1,1 @@
1 +default
Code
... ... @@ -1,0 +1,85 @@
1 +const livetableRowHook = {};
2 +
3 +((() => {
4 + const tagCols = {};
5 +
6 + document.observe('xwiki:livetable:loading', () => {
7 + for (const tab of document.querySelectorAll(".xwiki-livetable")) {
8 + const tableId = tab.id;
9 + if (!tableId) continue;
10 + console.debug("loading", tableId);
11 +
12 + // coulmn data sources
13 + const conf = JSON.parse(tab.dataset.settings);
14 +
15 + tagCols[tableId] = (conf.columnDescriptors.tags ?? { aux: [] }).aux ?? [["Tags", true]];
16 + tagCols[tableId].forEach(([name], i) => {
17 + const cn = `tags-${i}`;
18 + conf.columns.splice(conf.columns.indexOf("tags"), 1, cn);
19 + conf.columnDescriptors[cn] = {
20 + displayName: name,
21 + headerClass: "tagsCol",
22 + html: true,
23 + sortable: false,
24 + };
25 + });
26 + tab.dataset.settings = JSON.stringify(conf);
27 +
28 + // column headers
29 + tab.querySelectorAll(".xwiki-livetable-display-header .tagsCol").forEach(
30 + (v, i) => v.textContent = tagCols[tableId][i][0]
31 + );
32 +
33 + // column tooltips
34 + tab.querySelectorAll(".xwiki-livetable-display-header-text").forEach(
35 + el => {
36 + const t = el.textContent.trim();
37 + const c = conf.columnDescriptors[t]?.tooltip;
38 + if (c) {
39 + el.title = t;
40 + el.dataset.content = c;
41 + el.dataset.toggle = "popover";
42 + el.dataset.placement = "top";
43 + }
44 + }
45 + )
46 +
47 + // handle clicks for tags
48 + tab.getElementsByClassName("xwiki-livetable-display-body")[0].addEventListener("click", ev => {
49 + if (ev.button) return; // only left click
50 + if (ev.target.nodeName !== "SPAN") return;
51 + if (!ev.target.classList.contains("ltTag")) return;
52 + const tag = ev.target.textContent;
53 + ev.preventDefault();
54 + const lt = tab.__liveTable;
55 + const st = lt.tagCloud.selectedTags;
56 + if (tag in st) delete st[tag];
57 + else st[tag] = {};
58 + lt.tags = Object.keys(st);
59 + lt.clearCache();
60 + lt.showRows(1, lt.limit);
61 + });
62 +
63 + }
64 + });
65 +
66 + document.observe("xwiki:livetable:receivedEntries", ({ memo: { data }, tableId }) => {
67 + console.debug("receivedEntries", tableId, data);
68 + const rf = livetableRowHook[tableId];
69 + for (const row of data.rows) {
70 + if (rf) rf(row);
71 +
72 + // tags
73 + const tags = new Set(row.tags_value.slice(1, -1).split(", "));
74 + tagCols[tableId]?.forEach(([name, ...want], i) =>
75 + row[`tags-${i}`] = (
76 + want[0] === true
77 + ? Array.from(tags)
78 + : want.filter(tag => tags.delete(tag))
79 + ).sort().map(tag => `<span class="ltTag" style="cursor:pointer;">${tag}</span>`).join(", ")
80 + );
81 + }
82 + });
83 +
84 +})());
85 +
Name
... ... @@ -1,0 +1,1 @@
1 +Global Helpers
Parse content
... ... @@ -1,0 +1,1 @@
1 +No
Use this extension
... ... @@ -1,0 +1,1 @@
1 +always