Failed to execute template. Cause: [Access denied when checking [script] access to [xwiki:Collaboratory.UX.HbpSkin.WebHome] for user [xwiki:XWiki.Admin]]. Click on this message for details.

Context Search - HBP Wiki

IAM21 instance, do not create collab nor modify a team, your changes will be lost


Wiki source code of Context Search

Version 26.59 by bougault on 2022/11/17 09:47

Show last authors
1 {{html clean="false"}}
2 <script type="module">
3 import {LitElement, html} from 'https://cdn.jsdelivr.net/gh/lit/dist@2/core/lit-core.min.js';
4 class UnifiedSearch extends LitElement {
5 static properties = {
6 searchText: { type: String },
7 favoritesFilter: { type: Boolean },
8 administratorFilter: { type: Boolean },
9 editorFilter: { type: Boolean },
10 viewerFilter: { type: Boolean },
11 publicFilter: { type: Boolean },
12 privateFilter: { type: Boolean },
13 }
14 constructor() {
15 super();
16 this.searchText = "";
17 this.favoritesFilter = false;
18 this.administratorFilter = true;
19 this.editorFilter = false;
20 this.viewerFilter = false;
21 this.publicFilter = false;
22 this.privateFilter = false;
23 }
24 toggleFilter(filter) {
25 filter = !filter;
26 console.log(this.administratorFilter);
27 }
28 setSearchText(e) {
29 this.searchText = e.target.value;
30 }
31 handleSearch() {
32 console.log(this.searchText);
33 }
34 render() {
35 return html`
36 <div>
37 <div>
38 <input @change="${this.setSearchText}" type="text" placeholder="Search..." />
39 <button @click="${this.handleSearch}">Search</button>
40 </div>
41 <label><input type="checkbox" @change="${() => this.toggleFilter(this.administratorFilter)}" .checked="${this.administratorFilter}"/> Administrator</label>
42 </div>
43 `
44 }
45 }
46 customElements.define('clb-unified-search', UnifiedSearch);
47 </script>
48
49 <clb-unified-search></clb-unified-search>
50
51 <select id="context-search-type">
52 <option value="all">All</option>
53 <option value="collabs">Collabs</option>
54 <option value="current-collab">Current Collab</option>
55 </select>
56 <input type="text" id="context-search-text" />
57 <button id="context-search-button" class="btn btn-primary">Search</button>
58 <div class="form-group">
59 <label>
60 <input type="checkbox" data-role-filter="administrator"> Administrator
61 </label>
62 <label>
63 <input type="checkbox" data-role-filter="editor"> Editor
64 </label>
65 </div>
66
67
68 <pre id="context-search-response"></pre>
69 <script>
70 window.addEventListener('DOMContentLoaded', function() {
71 const filters = {
72 search: '',
73 offset: 0,
74 orderField: 'title',
75 order: 'asc',
76 favorite: false,
77 roles: [] // to be joined as administrator+editor+viewer
78 };
79
80 function addRole(role) {
81 if(filters.roles.indexOf(role) == -1) {
82 filters.roles.push(role);
83 }
84 }
85
86 function removeRole(role) {
87 filters.roles = filters.roles.filter(r => r !== role)
88 }
89
90 const filterInputs = document.querySelectorAll('input[data-role-filter]');
91
92 filterInputs.forEach(function(filterIpt) {
93 filterIpt.addEventListener('click', function() {
94 const role = this.getAttribute('data-role-filter');
95 if(this.checked) {
96 addRole(role);
97 } else {
98 removeRole(role);
99 }
100 runFilteredRequest();
101 })
102 });
103
104 function runFilteredRequest() {
105 const urlParams = new URLSearchParams();
106 const tmpFilters = filters;
107 tmpFilters.roles = tmpFilters.roles.join("+");
108 for(filter in tmpFilters) {
109 urlParams.set(filter, tmpFilters[filter]);
110 }
111 console.log(urlParams);
112 }
113 // https://wiki-dev.ebrains.eu/rest/v1/collabs?search=&offset=0&orderField=title&order=asc&favorite=false&roles=administrator
114 const contextSearchType = document.getElementById("context-search-type");
115 const contextSearchText = document.getElementById("context-search-text");
116 const contextSearchResponse = document.getElementById("context-search-response");
117 const contextSearchButton = document.getElementById("context-search-button");
118 contextSearchButton.addEventListener('click', function() {
119 const context = contextSearchType.options[contextSearchType.selectedIndex].value;
120 const term = contextSearchText.value;
121 switch(context) {
122 case 'collabs':
123 document.location.href = `/bin/view/Collabs/#search=${term}`;
124 break;
125 case 'current-collab':
126 handleXWikiSearch('bougaultx');
127 break
128 default:
129 handleXWikiSearch('')
130 }
131
132 });
133 function handleXWikiSearch(space, callback) {
134 require(['jquery'], function($) {
135 var solrServiceURL = new XWiki.Document('SuggestSolrService', 'XWiki').getURL('get');
136 const contextSearchButton = document.getElementById("context-search-button");
137 const xwikiSpace = space ? `.${space}` : '';
138 contextSearchButton.addEventListener('click', function() {
139 $.post(solrServiceURL, {
140 outputSyntax: 'plain',
141 media: 'json',
142 query: [
143 'q="__INPUT__"~100',
144 'fq=type:DOCUMENT',
145 `fq=space:Collabs${xwikiSpace}.*`
146 ].join('\n'),
147 input: $('#context-search-text').val()
148 }).then(res => {
149 if(callback) {
150 callback(res).then(results => {
151 contextSearchResponse.innerText = JSON.stringify(results, null, 2);
152 })
153 } else {
154 contextSearchResponse.innerText = JSON.stringify(res, null, 2);
155 }
156 });
157 });
158 });
159 }
160 function applyAdministratorFilter(results) {
161 return new Promise((resolve, reject) => {
162 //fetch("/rest/v1/collabs?roles=administrator")
163 fetch("/rest/v1/collabs?search=&offset=0&orderField=title&order=asc&favorite=false&roles=administrator")
164 .then(res => res.json())
165 .then(collabs => {
166 const spaces = collabs.map(collab => `Collabs.${collab.name}`);
167 const filtered = results.filter(result => spaces.some(space => result.space.startsWith(space)));
168 resolve(filtered);
169 })
170
171 })
172 }
173 });
174
175
176 </script>
177 {{/html}}