/* * Egroupware * * @license https://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package calendar * @subpackage etemplate * @link https://www.egroupware.org * @author Nathan Gray */ import {et2_register_widget} from "../../api/js/etemplate/et2_core_widget.ts"; import {et2_taglist_email} from "../../api/js/etemplate/et2_widget_taglist"; /** * Tag list widget customised for calendar owner, which can be a user * account or group, or an entry from almost any app, or an email address * * A cross between auto complete, selectbox and chosen multiselect * * Uses MagicSuggest library * @see http://nicolasbize.github.io/magicsuggest/ * @augments et2_taglist_email */ export class et2_calendar_owner extends et2_taglist_email { static readonly _attributes = { "autocomplete_url": { "default": "calendar_owner_etemplate_widget::ajax_owner" }, "autocomplete_params": { "name": "Autocomplete parameters", "type": "any", "default": {}, "description": "Extra parameters passed to autocomplete URL. It should be a stringified JSON object." }, allowFreeEntries: { "default": false, ignore: true }, select_options: { "type": "any", "name": "Select options", // Set to empty object to use selectbox's option finding "default": {}, "description": "Internally used to hold the select options." } }; // Allows sub-widgets to override options to the library lib_options = { autoSelect: false, groupBy: 'app', minChars: 2, selectFirst: true, // This option will also expand when the selection is changed // via code, which we do not want //expandOnFocus: true toggleOnClick: true }; doLoadingFinished() { super.doLoadingFinished(); var widget = this; // onChange fired when losing focus, which is different from normal this._oldValue = this.taglist.getValue(); return true; } selectionRenderer(item) { if(this && this.options && this.options.allowFreeEntries) { return super.selectionRenderer(item); } else { var label = jQuery('<span>').text(item.label); if (item.class) label.addClass(item.class); if (typeof item.title != 'undefined') label.attr('title', item.title); if (typeof item.data != 'undefined') label.attr('data', item.data); if (typeof item.icon != 'undefined') { var wrapper = jQuery('<div>').addClass('et2_taglist_tags_icon_wrapper'); jQuery('<span/>') .addClass('et2_taglist_tags_icon') .css({"background-image": "url("+(item.icon.match(/^(http|https|\/)/) ? item.icon : egw.image(item.icon, item.app))+")"}) .appendTo(wrapper); label.appendTo(wrapper); return wrapper; } return label; } } getValue() { if(this.taglist == null) return null; return this.taglist.getValue(); } /** * Override parent to handle our special additional data types (c#,r#,etc.) when they * are not available client side. * * @param {string|string[]} _value array of selected owners, which can be a number, * or a number prefixed with one character indicating the resource type. */ set_value(_value) { super.set_value(_value); // If parent didn't find a label, label will be the same as ID so we // can find them that way let missing_labels = []; for(var i = 0; i < this.options.value.length; i++) { var value = this.options.value[i]; if(value.id == value.label) { missing_labels.push(value.id); } } if(Object.keys(missing_labels).length > 0) { // Proper label was not found by parent - ask directly egw.json('calendar_owner_etemplate_widget::ajax_owner',[missing_labels],function(data) { for(let owner in data) { if(!owner || typeof owner == "undefined") continue; let idx = this.options.value.find(element => element.id == owner); if(idx) { idx = jQuery.extend(idx, data[owner]); } // Put it in the list of options for next time this.options.select_options.push(data[owner]); } this.set_value(this.options.value); }, this,true,this).sendRequest(); } if(this.taglist) { this.taglist.clear(true); this.taglist.addToSelection(this.options.value,true); } } } et2_register_widget(et2_calendar_owner, ["calendar-owner"]);