Source: widget/learning/Widget.js

(function() {
    /**
     * @namespace learning
     * @memberof Help4.widget
     */
    Help4.widget.learning = {};

    /**
     * @typedef {Object} Help4.widget.learning.AllowedTypes
     * @property {'project'} project
     * @property {'slide'} slide
     * @property {'book'} book
     * @property {'media'} media
     * @property {'cdoc'} cdoc
     * @property {'group'} group
     */

    /**
     * @type {Help4.widget.learning.AllowedTypes}
     */
    Help4.widget.learning.ALLOWED_TYPES = {
        project: 'project',
        slide: 'slide',
        book: 'book',
        media: 'media',
        cdoc: 'cdoc',
        group: 'group'
    };

    const NAME = 'learning';

    /**
     * @typedef {Help4.widget.Widget.Context} Help4.widget.learning.Widget.Context
     * @property {Object} widget.learning
     * @property {Help4.widget.learning.Data} widget.learning.data
     */

    /**
     * SEN Learning functionality widget.
     * @augments Help4.widget.Widget
     * @property {?Help4.widget.learning.Data} _data
     * @property {?Help4.widget.learning.View} _view
     */
    Help4.widget.learning.Widget = class extends Help4.widget.Widget {
        /** @override */
        constructor() {
            super({
                statics: {
                    _data: {},
                    _view: {}
                }
            });
        }

        /** @override */
        getName() {
            return NAME;
        }

        /**
         * @override
         * @returns {Help4.widget.learning.Widget.Context}
         */
        getContext() {
            const context = super.getContext();
            context.widget.learning = {data: this._data};
            return context;
        }

        /**
         * will allow to activate this widget and open the learning center if available
         * @param {boolean} external - whether to open the learning center externally
         */
        async openLearningCenter(external = false) {
            if (!this.isActive()) await this.activate();
            external && this._view?.openLearningCenter();
        }

        /**
         * @override
         * @returns {Promise<Help4.widget.Widget.Descriptor>}
         */
        async _onGetDescriptor() {
            const {
                Localization,
                control2: {ICONS},
                widget: {COLOR}
            } = Help4;

            const {learning: {enabled}, core: {isRemoteMode}, WM} = this.getContext().configuration;
            const text = Localization.getText('button.widget.learning');

            return {
                id: NAME,
                enabled: enabled && !isRemoteMode && WM < 2,
                showPanel: true,
                requires: {
                    namespaces: [
                        'Help4.widget.companionCore.Core',
                        'Help4.widget.companionCore.SEN',
                        'Help4.widget.companionCore.UACP'
                    ]
                },
                tile: {
                    text,
                    title: text,
                    icon: ICONS.icon_learn,
                    color: COLOR.color4,
                    position: 3
                }
            };
        }

        /** @override */
        focus() {
            this._view?.focus();
        }

        /**
         * @override
         * @param {string} direction
         */
        focusListItem(direction) {
            this._view?.focusListItem(direction);
        }

        /** @override */
        async _onBeforeInit() {
            const {Data, Backend: backend} = Help4.widget.learning;
            this._data = new Data({widget: this, backend});
        }

        /** @override */
        async _onAfterInit() {
            await this._data.initialize();
            await _setVisible.call(this);
        }

        /** @override */
        async _onSystemNavigate() {
            await this._data.update();
            await _setVisible.call(this);
        }

        /** @override */
        async _onAfterActivate() {
            // initialize learning info view
            this._view = new Help4.widget.learning.View({widget: this});
        }

        /** @override */
        async _onBeforeDeactivate() {
            this._destroyControl('_view');
        }

        /**
         * @override
         * @param {Help4.widget.Widget.SearchFilter} search
         * @returns {Promise<Help4.widget.Widget.SearchResult[]>}
         */
        async filter({fulltext}) {
            const {assets} = this._data;

            const results = [];
            for (const asset of assets) {
                const {caption, description, contentLanguage} = asset;

                if (this._fulltextMatchesText(fulltext, caption) || this._fulltextMatchesHtml(fulltext, description)) {
                    const {entityType, entitySubType, _metadata: {entityId: entityUid}} = asset;

                    results.push({
                        caption,
                        description,
                        entityType,
                        entitySubType,
                        entityUid,
                        contentLanguage
                    });
                }
            }
            return results;
        }

        /** @override */
        async getTexts() {
            if (this.isActive()) {
                return this._view?.getTexts();
            }
        }

        /**
         * @override
         * @param {Object} texts
         */
        async setTexts(texts) {
            this.isActive() && this._view?.setTexts(texts);
        }
    }

    /**
     * @memberof Help4.widget.learning.Widget#
     * @private
     */
    async function _setVisible() {
        const {
            /** @type {boolean} */ showLearningCenter,
            /** @type {?string} */ learningAppCommunityUrl,
            /** @type {Help4.jscore.DataContainer} */ assets
        } = this._data;

        this.__visible = showLearningCenter || !!learningAppCommunityUrl || assets.count() > 0;
    }
})();