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