Skip to content
Snippets Groups Projects
Commit d80394a6 authored by Marius Dumitru Florea's avatar Marius Dumitru Florea
Browse files

XWIKI-22537: QuickActionsIT#icon is flickering

* Improve the Icon Service caching and move the icon name filtering server side.

(cherry picked from commit d84b9eff)
parent c9a7734d
No related branches found
No related tags found
No related merge requests found
...@@ -20,47 +20,46 @@ ...@@ -20,47 +20,46 @@
define('xwiki-iconService', [ define('xwiki-iconService', [
'jquery', 'jquery',
], function ($) { ], function($) {
/** /**
* Generate an URL for getting JSON resources about icons. * Generate an URL for getting JSON resources about icons.
*/ */
const getResourceURL = function (action, parameters) { function getResourceURL(action, parameters) {
const params = Object.assign({outputSyntax: "plain", action: action}, parameters); return new XWiki.Document('IconPicker', 'IconThemesCode').getURL('get', $.param({
return (new XWiki.Document('IconPicker', 'IconThemesCode')).getURL('get', $.param(params), true); outputSyntax: "plain",
}; action: action,
...parameters
let cachedIconThemes = false; }, true));
const getIconThemes = function () { }
return new Promise(function (resolve, reject) {
if (cachedIconThemes) {
resolve(cachedIconThemes);
return;
}
$.getJSON(getResourceURL('data_iconthemes'), function (data) { let iconThemesPromise = false;
cachedIconThemes = data; function getIconThemes() {
resolve(data); if (!iconThemesPromise) {
}).fail(reject); iconThemesPromise = $.getJSON(getResourceURL('data_iconthemes'));
}); iconThemesPromise.catch(() => {
}; // Reset the promise so that we can try again later.
iconThemesPromise = false;
const cachedIcons = {}; });
const getIcons = function (iconTheme) { }
return new Promise(function (resolve, reject) { return iconThemesPromise;
}
if (cachedIcons[iconTheme]) { const iconsPromises = {};
resolve(cachedIcons[iconTheme]); function getIcons(iconTheme, query) {
return; let iconsPromisesPerTheme = iconsPromises[iconTheme] = iconsPromises[iconTheme] || {};
} let iconsPromise = iconsPromisesPerTheme[query];
if (!iconsPromise) {
$.getJSON(getResourceURL('data_icons', {iconTheme}), function (dataIcons) { iconsPromise = iconsPromisesPerTheme[query] = $.getJSON(getResourceURL('data_icons', {
cachedIcons[iconTheme] = dataIcons; iconTheme,
resolve(dataIcons); query,
}).fail(reject); }));
}); iconsPromise.catch(() => {
}; // Reset the promise so that we can try again later.
delete iconsPromisesPerTheme[query];
});
}
return iconsPromise;
}
return { return {
getIconThemes, getIconThemes,
......
...@@ -43,17 +43,14 @@ ...@@ -43,17 +43,14 @@
feed: function (opts, callback) { feed: function (opts, callback) {
require(['xwiki-iconService'], function (iconService) { require(['xwiki-iconService'], function (iconService) {
iconService.getIconThemes().then(function (iconThemes) { iconService.getIconThemes().then(function (iconThemes) {
// Retreive the list of available icons. // Retreive the list of available icons from the current icon theme that match the query.
iconService.getIcons(iconThemes.currentIconTheme).then(function (icons) { iconService.getIcons(iconThemes.currentIconTheme, opts.query).then(function (icons) {
callback(icons callback(icons.map(icon => ({
.filter(icon => icon.name.toLowerCase().startsWith(opts.query.toLowerCase())) id: icon.name,
.map(icon => ({ label: icon.name,
id: icon.name, imgSrc: icon.metadata.url,
label: icon.name, iconClass: icon.metadata.cssClass
imgSrc: icon.metadata.url, })));
iconClass: icon.metadata.cssClass
}))
);
}).catch(function () { }).catch(function () {
editor.showNotification(editor.localization.get('xwiki-icon.iconsFetchFailed'), 'warning', 5000); editor.showNotification(editor.localization.get('xwiki-icon.iconsFetchFailed'), 'warning', 5000);
}); });
......
...@@ -40,24 +40,27 @@ ...@@ -40,24 +40,27 @@
########################### ###########################
## DATA: ICON THEMES ## DATA: ICON THEMES
########################### ###########################
#if($request.action == 'data_iconthemes') #if ($request.action == 'data_iconthemes')
#set($map = {}) #set ($map = {})
#set($discard = $map.put('iconThemes', $services.icon.iconSetNames)) #set ($discard = $map.put('iconThemes', $services.icon.iconSetNames))
#set($discard = $map.put('currentIconTheme', $services.icon.currentIconSetName)) #set ($discard = $map.put('currentIconTheme', $services.icon.currentIconSetName))
#jsonResponse($map) #jsonResponse($map)
########################### ###########################
## DATA: ICONS ## DATA: ICONS
########################### ###########################
#elseif($request.action == 'data_icons') #elseif ($request.action == 'data_icons')
#set($icons = []) #set ($icons = [])
#set($iconTheme = $request.iconTheme) #set ($iconTheme = $request.iconTheme)
#set($xwikiIcons = $collectiontool.sort($services.icon.getIconNames($iconTheme))) #set ($xwikiIcons = $collectiontool.sort($services.icon.getIconNames($iconTheme)))
#foreach($xwikiIcon in $xwikiIcons) #set ($iconNamePrefix = $request.query.toLowerCase())
#set($icon = {}) #foreach ($xwikiIcon in $xwikiIcons)
#set($discard = $icon.put('name', $xwikiIcon)) #if ("$!iconNamePrefix" == '' || $xwikiIcon.startsWith($iconNamePrefix))
#set($discard = $icon.put('render', $services.icon.renderHTML($xwikiIcon, $iconTheme))) #set ($discard = $icons.add({
#set($discard = $icon.put('metadata', $services.icon.getMetaData($xwikiIcon, $iconTheme))) 'name': $xwikiIcon,
#set($discard = $icons.add($icon)) 'render': $services.icon.renderHTML($xwikiIcon, $iconTheme),
'metadata': $services.icon.getMetaData($xwikiIcon, $iconTheme)
}))
#end
#end #end
#jsonResponse($icons) #jsonResponse($icons)
#else #else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment