(function() {
/** Update texts handling for UR harmonization */
Help4.engine.ur.Tile = class {
/**
* @param {Help4.engine.ur.UrHarmonizationEngine} engine
* @param {?Object} filter
*/
static setFilter(engine, filter) {
if (!filter) {
engine._filter = null;
return;
}
engine._filter ||= {};
const {_filter} = engine;
for (let [key, value] of Object.entries(filter)) {
if (value === null) {
delete _filter[key];
} else {
_filter[key] = value;
}
}
if (!Object.keys(_filter).length) engine._filter = null;
}
/**
* @param {Help4.engine.ur.UrHarmonizationEngine} engine
* @param {?(string|number)} [id = null] - id or index
* @returns {?(Help4.widget.help.ProjectTile|Help4.widget.help.ProjectTile[])}
*/
static getTile(engine, id = null) {
const {controller, _started, _running, _assignMode, _wtaTile} = engine;
const {core: {isEditMode}} = controller.getConfiguration();
if (!_started || !_running || isEditMode || _assignMode) {
// return no tiles, don't alter the tile state here
return null;
}
const filteredTiles = _filterTiles(engine);
if (typeof id === 'string') {
if (id === _wtaTile?.id) return _wtaTile;
return filteredTiles?.get(id) || null;
} else {
const filtered = filteredTiles?.values();
return _wtaTile && filtered
? [_wtaTile, ...filtered]
: (filtered ? [...filtered] : _wtaTile);
}
}
/**
* @param {Help4.engine.ur.UrHarmonizationEngine} engine
* @returns {boolean}
*/
static hasTiles(engine) {
const {_started, _running, _wtaUrl, _tiles} = engine;
return _started && _running
? _wtaUrl ? true : !!_tiles.size
: false;
}
}
/**
* @private
* @param {Help4.engine.ur.UrHarmonizationEngine} engine
* @returns {?Map<string, Help4.widget.help.ProjectTile>}
*/
function _filterTiles(engine) {
const {_tiles, _filter} = engine;
const query = _filter?.query?.toLowerCase() || null;
if (query) {
if (_filter.prevQuery === query) return _filter.match;
// get ids of tiles that match the query
_filter.prevQuery = query;
_filter.match = new Map();
// do NOT use forEach here; as new Map().entries().forEach is not supported in FF and Safari!
for (const [id, tile] of _tiles.entries()) {
if ((tile.title || '').toLowerCase().indexOf(query) >= 0 ||
(tile.summaryText || '').toLowerCase().indexOf(query) >= 0 ||
tile.content && Help4.filterHtml(tile.content, query))
{
_filter.match.set(id, tile);
}
}
return _filter.match;
}
if (_filter) {
_filter.prevQuery = null;
_filter.match = null;
if (_filter.instantHelp) {
return null; // UR tiles can't be instant tiles
}
}
return _tiles;
}
})();