Source: engine/ur/Tile.js

(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;
    }
})();