Wiki source code of Extensions
Last modified by superadmin on 2025/05/07 14:18
Hide last authors
author | version | line-number | content |
---|---|---|---|
![]() |
1.1 | 1 | {{template name="extension.vm" output="false"/}} |
2 | |||
3 | {{velocity}} | ||
4 | ## HTML cleaner messes up the content of the legend tag. | ||
5 | {{html clean="false"}} | ||
6 | #if ($isAjaxRequest) | ||
7 | #handleExtensionRequest() | ||
8 | #else | ||
9 | <div class="full column"> | ||
10 | #displayExtensionSearchBar() | ||
11 | |||
12 | #if ($request.extensionId && $request.extensionVersion) | ||
13 | ## Advanced search. | ||
14 | #handleExtensionRequest() | ||
15 | #else | ||
16 | #if ($request.index_start) | ||
17 | #set ($void = $extensionManager.getRepository('index').index("wiki:${xcontext.database}")) | ||
18 | #end | ||
19 | ## Simple search. | ||
20 | #set ($noResultsMessageKey = 'extensions.search.noResults') | ||
21 | #set ($paginationParams = {}) | ||
22 | ## Dump whitespace generated by the pagination macro | ||
23 | #set ($discard = "#paginationPrepareParams($paginationParams)") | ||
24 | #if ("$!selectedRepositoryId" != '') | ||
25 | #set ($repository = $extensionManager.getRepository($selectedRepositoryId)) | ||
26 | #if ("$!request.search" == '') | ||
27 | ## Fetch extensions from known repositories. | ||
28 | #if ($selectedRepositoryId == 'core') | ||
29 | #set($extensions = $services.extension.core.getCoreExtensions()) | ||
30 | #elseif ($selectedRepositoryId == 'installed') | ||
31 | #if ($xcontext.isMainWiki()) | ||
32 | #set($extensions = $services.extension.installed.getInstalledExtensions()) | ||
33 | #else | ||
34 | #set($extensions = $services.extension.installed.getInstalledExtensions($extensionNamespace)) | ||
35 | #end | ||
36 | #elseif ($selectedRepositoryId == 'local') | ||
37 | #set($extensions = $services.extension.local.getLocalExtensions()) | ||
38 | #end | ||
39 | #if ($extensions) | ||
40 | #set ($totalHits = $extensions.size()) | ||
41 | #if ($totalHits == 0) | ||
42 | #set ($noResultsMessageKey = "extensions.search.repository.${selectedRepositoryId}.empty") | ||
43 | #end | ||
44 | ## All extensions from the specified repository have been fetched. We need to display only the current page. | ||
45 | #set ($extensions = $extensions.subList($paginationParams.firstItem, $mathtool.min($extensions.size(), $mathtool.add($paginationParams.firstItem, $paginationParams.itemsPerPage)))) | ||
46 | #end | ||
47 | #end | ||
48 | #end | ||
49 | #if (!$extensions) | ||
50 | #set($extensionQuery = $services.extension.index.newQuery("$!request.search")) | ||
51 | #set($void = $extensionQuery.setOffset($paginationParams.firstItem)) | ||
52 | #set($void = $extensionQuery.setLimit($paginationParams.itemsPerPage)) | ||
53 | #if ($selectedRepositoryId == 'installed') | ||
54 | #if ($xcontext.isMainWiki()) | ||
55 | #set ($extensions = $services.extension.installed.repository.searchInstalledExtensions($extensionQuery)) | ||
56 | #else | ||
57 | ## When searching for installed extensions in a subwiki we need to take the namespace into account. | ||
58 | #set ($extensions = $services.extension.installed.repository.searchInstalledExtensions($extensionNamespace, $extensionQuery)) | ||
59 | #end | ||
60 | #elseif ($repository) | ||
61 | #set ($extensions = $repository.search($extensionQuery)) | ||
62 | #else | ||
63 | #if ($recommended) | ||
64 | #set($void = $extensionQuery.addFilter('recommended', true, 'EQUAL')) | ||
65 | #end | ||
66 | #if ($indexed) | ||
67 | #set ($repository = $extensionManager.index.repository) | ||
68 | #if ($compatible) | ||
69 | #set ($void = $extensionQuery.setCompatible(true, '', "wiki:$xcontext.database")) | ||
70 | #end | ||
71 | #else | ||
72 | #set ($repository = $extensionManager) | ||
73 | #end | ||
74 | #set ($extensions = $repository.search($extensionQuery)) | ||
75 | #end | ||
76 | #set ($totalHits = $extensions.totalHits) | ||
77 | #end | ||
78 | |||
79 | #if ($recommended) | ||
80 | #if (!$extensions.iterator().hasNext()) | ||
![]() |
4.1 | 81 | #warning($services.localization.render('extensions.search.recommended.fallback', ["<em>$!escapetool.xml($request.search)</em>"])) |
![]() |
1.1 | 82 | ## Search again with the recommended filter |
83 | #set ($extensions = $repository.search("$!request.search", $paginationParams.firstItem, $paginationParams.itemsPerPage)) | ||
84 | #set ($totalHits = $extensions.totalHits) | ||
85 | #set ($recommended = false) | ||
86 | #elseif (!$customExtensionFilter) | ||
![]() |
4.1 | 87 | #define ($infoHeaderContent) |
![]() |
1.1 | 88 | #if ($compatible) |
89 | $services.localization.render('extensions.search.compatiblerecommended.disclaimer') | ||
90 | #else | ||
91 | $services.localization.render('extensions.search.recommended.disclaimer') | ||
92 | #end | ||
93 | <form action="${xwiki.relativeRequestURL}"> | ||
94 | #if ($request.section) | ||
95 | <input type="hidden" name="section" value="${escapetool.xml($request.section)}" /> | ||
96 | #end | ||
97 | <input type="hidden" name="search" value="$!{escapetool.xml($request.search)}" /> | ||
98 | <input type="hidden" name="recommended" value="false" /> | ||
99 | <input type="hidden" name="indexed" value="$indexed" /> | ||
100 | <input type="hidden" name="compatible" value="$compatible" /> | ||
101 | #if ($compatible) | ||
102 | <input type="submit" value="${escapetool.xml($services.localization.render('extensions.search.compatible.all.label'))}" class="btn btn-default"/> | ||
103 | #else | ||
104 | <input type="submit" value="${escapetool.xml($services.localization.render('extensions.search.all.label'))}" class="btn btn-default"/> | ||
105 | #end | ||
106 | </form> | ||
![]() |
4.1 | 107 | #end |
108 | #info("$infoHeaderContent") | ||
![]() |
1.1 | 109 | #end |
110 | #end | ||
111 | |||
112 | #if (!$extensions.iterator().hasNext()) | ||
![]() |
4.1 | 113 | #info($services.localization.render($noResultsMessageKey, ["<em>$!escapetool.xml($request.search)</em>"])) |
![]() |
1.1 | 114 | #else |
115 | #if ($totalHits && $totalHits > $paginationParams.itemsPerPage) | ||
116 | #set ($hasPagination = true) | ||
117 | #set ($paginationParams.totalItems = $totalHits) | ||
118 | #set ($paginationParams.url = $doc.getURL($xcontext.action, $request.getQueryString().replaceAll('(^|&)firstIndex=[^&]++&?', '$1'))) | ||
119 | #pagination($paginationParams) | ||
120 | #end | ||
121 | #foreach($extension in $extensions) | ||
122 | #displayExtension($extension) | ||
123 | #end | ||
124 | #if ($hasPagination) | ||
125 | #set ($discard = $paginationParams.put('position', 'bottom')) | ||
126 | #pagination($paginationParams) | ||
127 | #end | ||
128 | #end | ||
129 | |||
130 | #if ($indexed) | ||
![]() |
4.1 | 131 | #define ($formContent) |
132 | <form action="${xwiki.relativeRequestURL}"> | ||
133 | #if ($request.section) | ||
134 | <input type="hidden" name="section" value="${escapetool.xml($request.section)}" /> | ||
135 | #end | ||
136 | <input type="hidden" name="search" value="$!{escapetool.xml($request.search)}" /> | ||
137 | <input type="hidden" name="recommended" value="$recommended" /> | ||
138 | <input type="hidden" name="indexed" value="$indexed" /> | ||
139 | <input type="hidden" name="compatible" value="$compatible" /> | ||
140 | #if ($indexJobStatus.state != 'RUNNING') | ||
141 | <input type="submit" value="${escapetool.xml($services.localization.render('extensions.search.indexed.reindex'))}" name="index_start" class="btn btn-default"/> | ||
142 | #end | ||
143 | </form> | ||
144 | #end | ||
![]() |
1.1 | 145 | #set ($indexJobStatus = $repository.getStatus("wiki:${xcontext.database}")) |
146 | #if ($indexJobStatus) | ||
147 | #if ($indexJobStatus.state != 'FINISHED') | ||
![]() |
3.1 | 148 | #set ($discard = $xwiki.jsfx.use('uicomponents/job/job.js')) |
![]() |
1.1 | 149 | #set ($jobStatusURL = $doc.getURL('get', $escapetool.url({ |
150 | 'xpage': 'job_status_json', | ||
151 | 'outputSyntax': 'plain', | ||
152 | 'jobId': $indexJobStatus.request.id | ||
153 | }))) | ||
![]() |
4.1 | 154 | #define ($infoFooterContent) |
155 | $escapetool.xml($services.localization.render('extensions.search.indexed.started', [$xwiki.formatDate($indexJobStatus.startDate)])) | ||
156 | <div class="xcontent job-status" data-url="$escapetool.xml($jobStatusURL)"> | ||
157 | #displayJobProgressBar($indexJobStatus, true) | ||
158 | </div> | ||
159 | #end | ||
![]() |
1.1 | 160 | #else |
![]() |
4.1 | 161 | #define ($infoFooterContent) |
162 | $escapetool.xml($services.localization.render('extensions.search.indexed.on', [$xwiki.formatDate($indexJobStatus.startDate)])) | ||
163 | #end | ||
![]() |
1.1 | 164 | #end |
![]() |
4.1 | 165 | #info("$infoFooterContent |
166 | $formContent") | ||
![]() |
1.1 | 167 | #else |
![]() |
4.1 | 168 | #warning("$escapetool.xml($services.localization.render('extensions.search.indexed.nojob')) |
169 | $formContent") | ||
![]() |
1.1 | 170 | #end |
171 | #end | ||
172 | #end | ||
173 | </div> | ||
174 | #end | ||
175 | {{/html}} | ||
176 | {{/velocity}} |