include jquery and other legacy js files via script tag

This commit is contained in:
Ralf Becker 2021-06-10 11:38:54 +02:00
parent 40cac6f964
commit 5298336886
33 changed files with 458 additions and 514 deletions

View File

@ -16,6 +16,8 @@ import 'jqueryui';
import { EgwApp } from '../../api/js/jsapi/egw_app';
import { etemplate2 } from "../../api/js/etemplate/etemplate2";
import { et2_dialog } from "../../api/js/etemplate/et2_widget_dialog";
import { fetchAll } from "../../api/js/etemplate/et2_extension_nextmatch_actions.js";
import "./CRM.js";
/**
* UI for Addressbook
*

View File

@ -20,7 +20,8 @@ import {EgwApp, PushData} from '../../api/js/jsapi/egw_app';
import {etemplate2} from "../../api/js/etemplate/etemplate2";
import {et2_dialog} from "../../api/js/etemplate/et2_widget_dialog";
import {et2_selectbox} from "../../api/js/etemplate/et2_widget_selectbox";
import {fetchALL} from "../../api/js/etemplate/et2_extension_nextmatch_actions.js";
import {fetchAll} from "../../api/js/etemplate/et2_extension_nextmatch_actions.js";
import "./CRM.js";
/**
* Object to call app.addressbook.openCRMview with

View File

@ -1,4 +1,3 @@
"use strict";
/**
* EGroupware - Admin - Javascript UI
*
@ -8,100 +7,83 @@
* @copyright (c) 2013-20 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
/*egw:uses
/api/js/jsapi/egw_app.js
*/
require("jquery");
require("jqueryui");
require("../jsapi/egw_global");
require("../etemplate/et2_types");
var egw_app_1 = require("../../api/js/jsapi/egw_app");
import 'jquery';
import 'jqueryui';
import '../jsapi/egw_global';
import '../etemplate/et2_types';
import { EgwApp } from '../../api/js/jsapi/egw_app';
/**
* UI for Admin
*
* @augments AppJS
*/
var AdminApp = /** @class */ (function (_super) {
__extends(AdminApp, _super);
class AdminApp extends EgwApp {
/**
* Constructor
*
* @memberOf app.classes.admin
*/
function AdminApp() {
var _this =
constructor() {
// call parent
_super.call(this, 'admin') || this;
super('admin');
/**
* reference to iframe
*
* {et2_iframe}
*/
_this.iframe = null;
this.iframe = null;
/**
* reference to nextmatch
*
* {et2_extension_nextmatch}
*/
_this.nm = null;
this.nm = null;
/**
* Reference to div to hold AJAX loadable pages
*
* {et2_box}
*/
_this.ajax_target = null;
this.ajax_target = null;
/**
* Reference to ACL edit dialog (not the list)
*/
_this.acl_dialog = null;
_this.tree = null;
this.acl_dialog = null;
this.tree = null;
/**
* No SSL
*/
_this.SSL_NONE = 0;
this.SSL_NONE = 0;
/**
* STARTTLS on regular tcp connection/port
*/
_this.SSL_STARTTLS = 1;
this.SSL_STARTTLS = 1;
/**
* SSL (inferior to TLS!)
*/
_this.SSL_SSL = 3;
this.SSL_SSL = 3;
/**
* require TLS version 1+, no SSL version 2 or 3
*/
_this.SSL_TLS = 2;
this.SSL_TLS = 2;
/**
* if set, verify certifcate (currently not implemented in Horde_Imap_Client!)
*/
_this.SSL_VERIFY = 8;
return _this;
this.SSL_VERIFY = 8;
}
/**
* Destructor
*/
AdminApp.prototype.destroy = function (_app) {
destroy(_app) {
this.iframe = null;
this.nm = null;
this.acl_dialog = null;
this.tree = null;
// call parent
_super.prototype.destroy.call(this, _app);
};
super.destroy(_app);
}
/**
* This function is called when the etemplate2 object is loaded
* and ready. If you must store a reference to the et2 object,
@ -110,9 +92,9 @@ var AdminApp = /** @class */ (function (_super) {
* @param {etemplate2} _et2
* @param {string} _name name of template loaded
*/
AdminApp.prototype.et2_ready = function (_et2, _name) {
et2_ready(_et2, _name) {
// call parent
_super.prototype.et2_ready.call(this, _et2, _name);
super.et2_ready(_et2, _name);
switch (_name) {
case 'admin.index':
var iframe = this.iframe = this.et2.getWidgetById('iframe');
@ -154,13 +136,13 @@ var AdminApp = /** @class */ (function (_super) {
}
break;
}
};
}
/**
* Show given url in (visible) iframe or nextmatch with accounts (!_url)
*
* @param {string} [_url=] url to show in iframe or nothing for showing
*/
AdminApp.prototype.load = function (_url) {
load(_url) {
if (this.iframe && this.iframe.getDOMNode().contentDocument.location.href
.match(/menuaction=admin.admin_statistics.submit.+required=true/) && (!_url ||
!_url.match(/statistics=(postpone|canceled|submitted)/))) {
@ -210,7 +192,7 @@ var AdminApp = /** @class */ (function (_super) {
this.nm.set_disabled(!!_url || ajax);
this.groups.set_disabled(true);
this.ajax_target.set_disabled(!ajax);
};
}
/**
* Observer method receives update notifications from all applications
*
@ -229,7 +211,7 @@ var AdminApp = /** @class */ (function (_super) {
* @param {string} _targetapp which app's window should be refreshed, default current
* @return {false|*} false to stop regular refresh, thought all observers are run
*/
AdminApp.prototype.observer = function (_msg, _app, _id, _type, _msg_type, _targetapp) {
observer(_msg, _app, _id, _type, _msg_type, _targetapp) {
switch (_app) {
case 'admin':
// if iframe is used --> refresh it
@ -295,7 +277,7 @@ var AdminApp = /** @class */ (function (_super) {
return false; // --> no regular refresh needed
}
}
};
}
/**
* Handle a push notification about entry changes from the websocket
*
@ -314,7 +296,7 @@ var AdminApp = /** @class */ (function (_super) {
* @param {object|null} pushData.acl Extra data for determining relevance. eg: owner or responsible to decide if update is necessary
* @param {number} pushData.account_id User that caused the notification
*/
AdminApp.prototype.push = function (pushData) {
push(pushData) {
// We'll listen to addressbook, but only if it has an account ID
if (pushData.app != this.appname)
return;
@ -324,13 +306,13 @@ var AdminApp = /** @class */ (function (_super) {
else if (pushData.id < 0) {
this.groups.refresh(pushData.id, pushData.type);
}
};
}
/**
* Hide navbar for idots template
*
* Just a hack for old idots, not neccesary for jdots
*/
AdminApp.prototype._hide_navbar = function () {
_hide_navbar() {
var document = this.iframe.getDOMNode().contentDocument;
if (!document)
return; // nothing we can do ...
@ -343,36 +325,36 @@ var AdminApp = /** @class */ (function (_super) {
if (elem)
elem.style.display = 'none';
}
};
}
/**
* Set location of iframe for given _action and _sender (row)
*
* @param _action
* @param _senders
*/
AdminApp.prototype.iframe_location = function (_action, _senders) {
iframe_location(_action, _senders) {
var id = _senders[0].id.split('::');
var url = _action.data.url.replace(/(%24|\$)id/, id[1]);
this.load(url);
};
}
/**
* Callback to load an etemplate
*
* @param {Object[]} _data
*/
AdminApp.prototype._ajax_load_callback = function (_data) {
_ajax_load_callback(_data) {
if (!_data || _data.type != undefined)
return;
// Insert the content, etemplate will load into it
jQuery(this.ajax_target.node).append(typeof _data === 'string' ? _data : _data[0]);
};
}
/**
* Link hander for jDots template to just reload our iframe, instead of reloading whole admin app
*
* @param _url
* @return boolean true, if linkHandler took care of link, false otherwise
*/
AdminApp.prototype.linkHandler = function (_url) {
linkHandler(_url) {
var matches = _url.match(/menuaction=admin.admin_ui.index.*&load=([^&]+)/);
if (_url != 'about:blank' && (this.iframe != null && !_url.match('menuaction=admin.admin_ui.index') || matches)) {
if (matches) {
@ -383,14 +365,14 @@ var AdminApp = /** @class */ (function (_super) {
}
// can not load our own index page, has to be done by framework
return false;
};
}
/**
* Run an admin module / onclick callback for tree
*
* @param {string} _id id of clicked node
* @param {et2_tree} _widget reference to tree widget
*/
AdminApp.prototype.run = function (_id, _widget) {
run(_id, _widget) {
var link = _widget.getUserData(_id, 'link');
this.groups.set_disabled(true);
if (_id == '/accounts' || _id.substr(0, 8) == '/groups/') {
@ -410,9 +392,9 @@ var AdminApp = /** @class */ (function (_super) {
this.load(link);
}
else if (link.substr(0, 11) == 'javascript:') {
var href_regexp = /^javascript:([^\(]+)\((.*)?\);?$/;
var matches = link.match(href_regexp);
var args = [];
const href_regexp = /^javascript:([^\(]+)\((.*)?\);?$/;
const matches = link.match(href_regexp);
let args = [];
if (matches.length > 1 && matches[2] !== undefined) {
try {
args = JSON.parse('[' + matches[2] + ']');
@ -423,21 +405,21 @@ var AdminApp = /** @class */ (function (_super) {
}
egw.applyFunc(matches[1], args);
}
};
}
/**
* Show the group list in the main window
*/
AdminApp.prototype.group_list = function () {
group_list() {
this.nm.set_disabled(true);
this.groups.set_disabled(false);
};
}
/**
* View, edit or delete a group callback for tree
*
* @param {object} _action egwAction
* @param {array} _senders egwActionObject _senders[0].id holds id
*/
AdminApp.prototype.group = function (_action, _senders) {
group(_action, _senders) {
// Tree IDs look like /groups/ID, nm uses admin::ID
var from_nm = _senders[0].id.indexOf('::') > 0;
var account_id = _senders[0].id.split(from_nm ? '::' : '/')[from_nm ? 1 : 2];
@ -465,14 +447,14 @@ var AdminApp = /** @class */ (function (_super) {
}
break;
}
};
}
/**
* Modify an ACL entry
*
* @param {object} _action egwAction
* @param {array} _senders egwActionObject _senders[0].id holds the id "admin::app:account:location"
*/
AdminApp.prototype.acl = function (_action, _senders) {
acl(_action, _senders) {
var ids = [];
for (var i = 0; i < _senders.length; ++i) {
ids.push(_senders[i].id.split('::').pop()); // remove "admin::" prefix
@ -492,8 +474,8 @@ var AdminApp = /** @class */ (function (_super) {
this._acl_dialog(content);
break;
}
};
AdminApp.prototype._acl_delete = function (ids) {
}
_acl_delete(ids) {
var app = egw.app_name(); // can be either admin or preferences!
if (app != 'admin')
app = 'preferences';
@ -532,7 +514,7 @@ var AdminApp = /** @class */ (function (_super) {
}
// Create the dialog
this.acl_dialog = et2_createWidget("dialog", dialog_options, et2_dialog._create_parent(app));
};
}
/**
* Create the ACL edit dialog, including defaults & fetching what can be found
*
@ -542,7 +524,7 @@ var AdminApp = /** @class */ (function (_super) {
* @param {string} app Name of app
* @param {function} callback
*/
AdminApp.prototype._acl_dialog = function (content, sel_options, etemplate, app, callback) {
_acl_dialog(content, sel_options, etemplate, app, callback) {
if (typeof content == 'undefined')
content = {};
// Determine which application we're running as
@ -585,8 +567,8 @@ var AdminApp = /** @class */ (function (_super) {
else {
// Restrict application selectbox to only apps that support ACL
sel_options.acl_appname = [];
for (var app_1 in acl_rights) {
sel_options.acl_appname.push({ value: app_1, label: this.egw.lang(this.egw.link_get_registry(app_1, 'entries') || app_1) });
for (let app in acl_rights) {
sel_options.acl_appname.push({ value: app, label: this.egw.lang(this.egw.link_get_registry(app, 'entries') || app) });
}
// Sort list
sel_options.acl_appname.sort(function (a, b) {
@ -603,7 +585,7 @@ var AdminApp = /** @class */ (function (_super) {
content.acl_rights = content.acl_rights ? parseInt(content.acl_rights) : null;
jQuery.extend(content, { acl: [], right: [], label: [] });
// Use this to make sure we get correct app translations
var app_egw = egw(content.acl_appname, window);
let app_egw = egw(content.acl_appname, window);
for (var right in acl_rights[content.acl_appname]) {
// only user himself is allowed to grant private (16) rights
if (right == '16' && content['acl_account'] != egw.user('account_id')) {
@ -704,7 +686,7 @@ var AdminApp = /** @class */ (function (_super) {
}
// Create the dialog
this.acl_dialog = et2_createWidget("dialog", dialog_options, et2_dialog._create_parent(app));
};
}
/**
* Change handler for ACL edit dialog application selectbox.
* Re-creates the dialog with the current values
@ -712,7 +694,7 @@ var AdminApp = /** @class */ (function (_super) {
* @param input
* @param widget
*/
AdminApp.prototype.acl_reopen_dialog = function (input, widget) {
acl_reopen_dialog(input, widget) {
var content = {};
if (this.acl_dialog != null) {
content = this.acl_dialog.get_value() || {};
@ -722,36 +704,36 @@ var AdminApp = /** @class */ (function (_super) {
}
// Re-open the dialog
this._acl_dialog(content);
};
}
/**
* Load the new application's lang files when the app filter is changed
*/
AdminApp.prototype.acl_app_change = function (event, nm) {
var appname = nm.getWidgetById('filter2').getValue() || '';
acl_app_change(event, nm) {
let appname = nm.getWidgetById('filter2').getValue() || '';
if (appname) {
var app_egw = egw(appname);
let app_egw = egw(appname);
app_egw.langRequireApp(window, appname);
nm.getRoot().setApiInstance(app_egw);
}
};
}
/**
* Callback called on successfull call of serverside ACL handling
*
* @param {object} _data returned from server
*/
AdminApp.prototype._acl_callback = function (_data) {
_acl_callback(_data) {
// Avoid the window / framework / app and just refresh the etemplate
// Framework will try to refresh the opener
// Get by ID, since this.et2 isn't always the ACL list
var et2 = etemplate2.getById('admin-acl').widgetContainer;
et2.getInstanceManager().refresh(_data.msg, this.appname, _data.ids, _data.type);
};
}
/**
* Check to see if admin has taken away access to a category
*
* @@param {widget} button add/apply pressed button
*/
AdminApp.prototype.check_owner = function (button) {
check_owner(button) {
var select_owner = this.et2.getWidgetById('owner');
var diff = [];
if (typeof select_owner != 'undefined') {
@ -794,25 +776,25 @@ var AdminApp = /** @class */ (function (_super) {
}
}
return true;
};
}
/**
* Show icon based on icon-selectbox, hide placeholder (broken image), if no icon selected
*
* @param {widget} widget select box widget
*/
AdminApp.prototype.change_icon = function (widget) {
change_icon(widget) {
var img = widget.getRoot().getWidgetById('icon_url');
if (img) {
img.set_src(widget.getValue());
}
};
}
/**
* Add / edit an account
*
* @param {object} _action egwAction
* @param {array} _senders egwActionObject _senders[0].id holds account_id
*/
AdminApp.prototype.account = function (_action, _senders) {
account(_action, _senders) {
var params = jQuery.extend({}, this.egw.link_get_registry('addressbook', 'edit'));
var popup = this.egw.link_get_registry('addressbook', 'edit_popup');
switch (_action.id) {
@ -828,7 +810,7 @@ var AdminApp = /** @class */ (function (_super) {
break;
}
this.egw.open_link(this.egw.link('/index.php', params), 'admin', popup, 'admin');
};
}
/**
* Submit statistic
*
@ -840,7 +822,7 @@ var AdminApp = /** @class */ (function (_super) {
* @param {string} submit_url
* @return {boolean}
*/
AdminApp.prototype.submit_statistic = function (form, submit_url) {
submit_statistic(form, submit_url) {
var that = this;
var submit = function () {
// submit to egroupware.org
@ -872,26 +854,26 @@ var AdminApp = /** @class */ (function (_super) {
}, this.egw.lang('Submit displayed information?'), '', {}, et2_dialog.BUTTON_YES_NO, et2_dialog.QUESTION_MESSAGE, undefined, egw);
}
return false;
};
}
/**
* Change handler for when you change the type of a custom field.
* It toggles options / attributes as appropriate.
* @param {event object} e
* @param {widget object} widget
*/
AdminApp.prototype.cf_type_change = function (e, widget) {
cf_type_change(e, widget) {
var root = widget.getRoot();
var attributes = widget.getArrayMgr('content').getEntry('attributes[' + widget.getValue() + ']') || {};
root.getWidgetById('cf_values').set_statustext(widget.egw().lang(widget.getArrayMgr('content').getEntry('options[' + widget.getValue() + ']') || ''));
jQuery(root.getWidgetById('cf_len').getDOMNode()).toggle(attributes.cf_len && true);
jQuery(root.getWidgetById('cf_rows').getDOMNode()).toggle(attributes.cf_rows && true);
jQuery(root.getWidgetById('cf_values').getParentDOMNode()).toggle(attributes.cf_values && true);
};
}
/**
* Change handler for when you delete a custom app type
* If Policy app is available, it asks for documentation
*/
AdminApp.prototype.cf_type_delete = function (e, widget) {
cf_type_delete(e, widget) {
var callback = function (button, value) {
if (button === et2_dialog.YES_BUTTON) {
var values = jQuery.extend({}, this.getInstanceManager().getValues(this.getRoot()), value, { appname: this.getRoot().getArrayMgr('content').getEntry('content_types[appname]') });
@ -933,14 +915,14 @@ var AdminApp = /** @class */ (function (_super) {
callback(et2_dialog.YES_BUTTON);
}
return false;
};
}
/**
* Activate none standard SMTP mail accounts for selected users
*
* @param {egw_action} _action
* @param {array} _selected selected users
*/
AdminApp.prototype.emailadminActiveAccounts = function (_action, _selected) {
emailadminActiveAccounts(_action, _selected) {
var menuaction = 'admin.admin_mail.ajax_activeAccounts';
var accounts = [];
var msg1 = egw.lang('%1 accounts being activated', "" + Object.keys(_selected).length);
@ -961,13 +943,13 @@ var AdminApp = /** @class */ (function (_super) {
};
// confirmation dialog
et2_dialog.show_dialog(callbackDialog, egw.lang('Are you sure you want to %1 mail for selected accounts?', egw.lang(_action.id)), egw.lang('Active Mail Accounts'), {}, et2_dialog.BUTTON_YES_NO, et2_dialog.WARNING_MESSAGE, undefined, egw);
};
}
/**
* Resize window methode
*
* @returns {undefined}
*/
AdminApp.prototype.wizard_popup_resize = function () {
wizard_popup_resize() {
var $main_div = jQuery('#popupMainDiv');
var $et2 = jQuery('.et2_container');
var w = {
@ -981,21 +963,21 @@ var AdminApp = /** @class */ (function (_super) {
if (delta_width != 0 || delta_height != 0) {
window.resizeTo(egw_getWindowOuterWidth() - delta_width, egw_getWindowOuterHeight() - delta_height);
}
};
}
/**
* Switch account wizard to manual entry
*/
AdminApp.prototype.wizard_manual = function () {
wizard_manual() {
jQuery('.emailadmin_manual').fadeToggle(); // not sure how to to this et2-isch
this.wizard_popup_resize(); // popup needs to be resized after toggling
};
}
/**
* onclick for continue button to show progress animation
*
* @param {object} _event event-object or information about event
* @param {et2_baseWidget} _widget widget causing the event
*/
AdminApp.prototype.wizard_detect = function (_event, _widget) {
wizard_detect(_event, _widget) {
// we need to do a manual asynchronious submit to show progress animation
// default synchronious submit stops animation!
if (this.et2._inst.submit('button[continue]', true)) // true = async submit
@ -1007,60 +989,60 @@ var AdminApp = /** @class */ (function (_super) {
}
}
return false;
};
}
/**
* Set default port, if imap ssl-type changes
*
* @param {object} _event event-object or information about event
* @param {et2_baseWidget} _widget widget causing the event
*/
AdminApp.prototype.wizard_imap_ssl_onchange = function (_event, _widget) {
wizard_imap_ssl_onchange(_event, _widget) {
var ssl_type = _widget.get_value();
this.et2.getWidgetById('acc_imap_port').set_value(ssl_type == this.SSL_SSL || ssl_type == this.SSL_TLS ? 993 : 143);
};
}
/**
* Set default port, if imap ssl-type changes
*
* @param {object} _event event-object or information about event
* @param {et2_baseWidget} _widget widget causing the event
*/
AdminApp.prototype.wizard_smtp_ssl_onchange = function (_event, _widget) {
wizard_smtp_ssl_onchange(_event, _widget) {
var ssl_type = _widget.get_value();
this.et2.getWidgetById('acc_smtp_port').set_value(ssl_type == 'no' ? 25 : (ssl_type == this.SSL_SSL || ssl_type == this.SSL_TLS ? 465 : 587));
};
}
/**
* Set default port, if imap ssl-type changes
*
* @param {object} _event event-object or information about event
* @param {et2_baseWidget} _widget widget causing the event
*/
AdminApp.prototype.wizard_sieve_ssl_onchange = function (_event, _widget) {
wizard_sieve_ssl_onchange(_event, _widget) {
var ssl_type = _widget.get_value();
this.et2.getWidgetById('acc_sieve_port').set_value(ssl_type == this.SSL_SSL || ssl_type == this.SSL_TLS ? 5190 : 4190);
this.wizard_sieve_onchange(_event, _widget);
};
}
/**
* Enable sieve, if user changes some setting
*
* @param {object} _event event-object or information about event
* @param {et2_baseWidget} _widget widget causing the event
*/
AdminApp.prototype.wizard_sieve_onchange = function (_event, _widget) {
wizard_sieve_onchange(_event, _widget) {
this.et2.getWidgetById('acc_sieve_enabled').set_value(1);
};
}
/**
* Switch to select multiple accounts
*
* @param {object} _event event-object or information about event
* @param {et2_baseWidget} _widget widget causing the event
*/
AdminApp.prototype.edit_multiple = function (_event, _widget) {
edit_multiple(_event, _widget) {
// hide multiple button
_widget.set_disabled(true);
// switch account-selection to multiple
var account_id = this.et2.getWidgetById('account_id');
account_id.set_multiple(true);
};
}
/**
* Hide not applying fields, used as:
* - onchange handler on account_id
@ -1069,7 +1051,7 @@ var AdminApp = /** @class */ (function (_super) {
* @param {object} _event event-object or information about event
* @param {et2_baseWidget} _widget widget causing the event
*/
AdminApp.prototype.account_hide_not_applying = function (_event, _widget) {
account_hide_not_applying(_event, _widget) {
var account_id = this.et2.getWidgetById('account_id');
var ids = account_id && account_id.get_value ? account_id.get_value() : [];
if (typeof ids == 'string')
@ -1104,73 +1086,72 @@ var AdminApp = /** @class */ (function (_super) {
if (_event && _event.stopPropagation)
_event.stopPropagation();
return false;
};
}
/**
* Callback if user changed account selction
*
* @param {object} _event event-object or information about event
* @param {et2_baseWidget} _widget widget causing the event
*/
AdminApp.prototype.change_account = function (_event, _widget) {
change_account(_event, _widget) {
// todo check dirty and query user to a) save changes, b) discard changes, c) cancel selection
_widget.getInstanceManager().submit();
};
}
/**
* Callback if user changes notification folders: unset use-default checkbox
*
* @param {object} _event
* @param {et2_widget} _widget
*/
AdminApp.prototype.change_folders = function (_event, _widget) {
change_folders(_event, _widget) {
var use_default = this.et2.getWidgetById('notify_use_default');
if (use_default)
use_default.set_value(false);
};
}
/**
* default onExecute for admin actions
*
* @param {object} _action
* @param {object} _senders
*/
AdminApp.prototype.account_edit_action = function (_action, _senders) {
account_edit_action(_action, _senders) {
if (_action.data.url) {
this.egw.open_link(_action.data.url, _action.data.target || '_blank', _action.data.popup);
}
};
}
/**
* Clear instance cache
*
* If there is an error on server-side, resend request with an parameter allowing
* cache to use different method not requiring eg. so much memory
*/
AdminApp.prototype.clear_cache = function () {
var wait = this.egw.message(this.egw.lang('Clear cache and register hooks') + "\n" + this.egw.lang('Please wait...'), 'info');
var success = function () {
clear_cache() {
let wait = this.egw.message(this.egw.lang('Clear cache and register hooks') + "\n" + this.egw.lang('Please wait...'), 'info');
let success = function () {
wait.close();
egw.message('Done');
};
this.egw.json('admin.admin_hooks.ajax_clear_cache', null, success).sendRequest(true, undefined, jQuery.proxy(function (_xmlhttp, _err) {
this.egw.json('admin.admin_hooks.ajax_clear_cache&errored=1', null, success).sendRequest(true);
}, this));
};
}
/**
* Action handler for clear credentials action
*
* @param action
* @param selected
*/
AdminApp.prototype.clear_credentials_handler = function (action, selected) {
var ids = [];
for (var _i = 0, selected_1 = selected; _i < selected_1.length; _i++) {
var row = selected_1[_i];
clear_credentials_handler(action, selected) {
let ids = [];
for (let row of selected) {
ids.push(row.id.split("::").pop());
}
this.egw.request("admin.admin_passwordreset.ajax_clear_credentials", [action.id, ids]);
};
}
/**
* Export content of given field into relevant file
*/
AdminApp.prototype.smime_exportCert = function () {
smime_exportCert() {
var $a = jQuery(document.createElement('a')).appendTo('body').hide();
var acc_id = this.et2.getArrayMgr("content").getEntry('acc_id');
var url = window.egw.webserverUrl + '/index.php?';
@ -1180,14 +1161,14 @@ var AdminApp = /** @class */ (function (_super) {
$a.prop('download', "");
$a[0].click();
$a.remove();
};
}
/**
* Create certificate generator dialog
*/
AdminApp.prototype.smime_genCertificate = function () {
smime_genCertificate() {
var self = this;
et2_createWidget("dialog", {
callback: function (_button_id, _value) {
callback(_button_id, _value) {
if (_button_id == 'create' && _value) {
var isValid = true;
var required = ['countryName', 'emailAddress'];
@ -1244,26 +1225,26 @@ var AdminApp = /** @class */ (function (_super) {
resizable: false,
position: 'left top'
}, et2_dialog._create_parent('mail'));
};
}
/**
* Triggers upload for background image and updates its taglist
*
* @param {type} node
* @param {type} widget
*/
AdminApp.prototype.login_background_update = function (node, widget) {
login_background_update(node, widget) {
var taglist = widget._parent._children[0];
egw.json('admin.admin_config.ajax_upload_anon_images', [widget.get_value(), taglist.get_value()], function (_data) {
taglist.set_value(_data);
}).sendRequest();
};
}
/**
* Set content of selected row
*
* @param {array} node
* @returns
*/
AdminApp.prototype.cmds_onselect = function (node) {
cmds_onselect(node) {
var splitter = this.et2.getWidgetById('splitter');
var cmds_preview = this.et2.getWidgetById('cmds_preview');
if (node.length != 1) {
@ -1288,12 +1269,7 @@ var AdminApp = /** @class */ (function (_super) {
policy_preview.set_disabled(true);
cmds_preview.set_value({ content: [data.data] });
}
};
return AdminApp;
}(egw_app_1.EgwApp
/**
* @lends app.classes.admin
*/
));
}
}
app.classes.admin = AdminApp;
//# sourceMappingURL=app.js.map

View File

@ -18,7 +18,6 @@
import {egwAction, egwActionImplementation, egwActionObject} from './egw_action.js';
import {egwFnct} from './egw_action_common.js';
import {egwMenu, _egw_active_menu} from "./egw_menu.js";
import '../jquery/jquery-tap-and-hold/jquery.tapandhold.js';
if (typeof window._egwActionClasses == "undefined")
window._egwActionClasses = {};

View File

@ -16,7 +16,6 @@
import { EGW_AO_SHIFT_STATE_MULTI, EGW_AO_STATE_FOCUSED, EGW_AO_STATE_SELECTED, egwActionObjectInterface } from "../egw_action/egw_action.js";
import { egwBitIsSet, egwGetShiftState, egwPreventSelect, egwSetBit, egwUnfocus, egwIsMobile } from "../egw_action/egw_action_common.js";
import { _egw_active_menu } from "../egw_action/egw_menu.js";
import '../../../vendor/bower-asset/jquery-touchswipe/jquery.touchSwipe.js';
/**
* Contains the action object interface implementation for the nextmatch widget
* row.

View File

@ -23,7 +23,6 @@ import {
} from "../egw_action/egw_action.js";
import {egwBitIsSet, egwGetShiftState, egwPreventSelect, egwSetBit, egwUnfocus, egwIsMobile} from "../egw_action/egw_action_common.js";
import {_egw_active_menu} from "../egw_action/egw_menu.js";
import '../../../vendor/bower-asset/jquery-touchswipe/jquery.touchSwipe.js';
/**
* Contains the action object interface implementation for the nextmatch widget

View File

@ -19,6 +19,8 @@ import { ClassWithAttributes } from "./et2_core_inheritance";
import { et2_register_widget, et2_createWidget } from "./et2_core_widget";
import { et2_no_init } from "./et2_core_common";
import { egw } from "../jsapi/egw_global";
import { tinymce } from "../../../vendor/tinymce/tinymce/tinymce.min.js";
import { etemplate2 } from "./etemplate2";
/**
* @augments et2_inputWidget
*/

View File

@ -23,6 +23,8 @@ import {et2_IResizeable} from "./et2_core_interfaces";
import {et2_no_init} from "./et2_core_common";
import {egw} from "../jsapi/egw_global";
import {et2_vfsSelect} from "./et2_widget_vfs";
import {tinymce} from "../../../vendor/tinymce/tinymce/tinymce.min.js";
import {etemplate2} from "./etemplate2";
/**
* @augments et2_inputWidget

View File

@ -11,7 +11,6 @@
vendor.bower-asset.jquery.dist.jquery;
egw_inheritance.js;
*/
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
import '../jsapi/egw_inheritance.js';
window.fw_base = (function(){ "use strict"; return Class.extend(

View File

@ -12,7 +12,6 @@
egw_inheritance.js;
*/
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
import '../egw_action/egw_action_common.js';
import '../jsapi/egw_inheritance.js';
import '../etemplate/etemplate2.js'; // otherwise et2_load json-response-handler is not (yet) available

View File

@ -16,7 +16,6 @@
framework.fw_classes;
egw_inheritance.js;
*/
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
import './fw_base.js';
import './fw_browser.js';
import './fw_ui.js';

View File

@ -12,9 +12,6 @@
/api/js/jquery/mousewheel/mousewheel.js;
egw_inheritance.js;
*/
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
import '../../../vendor/bower-asset/jquery-ui/jquery-ui.js';
import '../jquery/mousewheel/mousewheel.js';
import '../jsapi/egw_inheritance.js';
/**

View File

@ -5,8 +5,6 @@
// Full source at https://github.com/harvesthq/chosen
// Copyright (c) 2011 Harvest http://getharvest.com
import 'jquery';
// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
// This file is generated by `grunt build`, do not edit it by hand.
(function() {

View File

@ -17,7 +17,6 @@
* @description Adds a handler for a custom event 'taphold' that handles a
* tap and hold on touch interfaces.
*/
import '../../../../vendor/bower-asset/jquery/dist/jquery.js';
(function($) {
var TAP_AND_HOLD_TRIGGER_TIMER = 600;
var MAX_DISTANCE_ALLOWED_IN_TAP_AND_HOLD_EVENT = 40;

View File

@ -1,8 +1,6 @@
/*! jQuery Timepicker Addon - v1.6.1 - 2015-11-14
* http://trentrichardson.com/examples/timepicker
* Copyright (c) 2015 Trent Richardson; Licensed MIT */
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
import '../../../vendor/bower-asset/jquery-ui/jquery-ui.js';
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery', 'jquery-ui'], factory);

View File

@ -5,13 +5,16 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package api
* @subpackage ajax
* @author Ralf Becker <rb@stylite.de>
* @version $Id$
* @author Ralf Becker <rb@egroupware.org>
*/
/*egw:uses
/vendor/bower-asset/jquery/dist/jquery.js;
/vendor/bower-asset/jquery-ui/jquery-ui.js;
/api/js/jquery/chosen/chosen.jquery.js;
/api/js/jquery/jquery-tab-and-hold/jquery.tabandhold.js;
/api/js/jquery/mousewheel/mousewheel.js;
/api/js/jquery/jquery-ui-timepicker-addon.js;
/vendor/bower-asset/jquery-touchswipe/jquery.touchSwipe.js;
*/
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
jQuery.noConflict();

View File

@ -63,6 +63,9 @@
window.egw_webserverUrl = egw_script.getAttribute('data-url');
window.egw_appName = egw_script.getAttribute('data-app');
// split includes in legacy js and modules
const legacy_js_regexp = /\/dhtmlx|jquery/;
// check if egw object was injected by window open
if (typeof window.egw == 'undefined')
{
@ -95,6 +98,7 @@
{
window.egw = {
prefsOnly: true,
legacy_js_regexp: legacy_js_regexp,
webserverUrl: egw_webserverUrl
};
if (debug) console.log('creating new egw object');
@ -146,6 +150,7 @@
console.log('Security exception accessing window specific egw object --> creating new one', e);
window.egw = {
prefsOnly: true,
legacy_js_regexp: legacy_js_regexp,
webserverUrl: egw_webserverUrl
};
}
@ -187,12 +192,10 @@
}));
}
// split includes in legacy js and modules
const legacy_regexp = /dhtmlx/;
// make our promise global, as legacy code calls egw_LAB.wait which we assign to egw_ready.then
window.egw_LAB = window.egw_ready = Promise.all(
[legacy_js_import(include.filter((src) => src.match(legacy_regexp) !== null), window.egw_webserverUrl)]
.concat(include.filter((src) => src.match(legacy_regexp) === null)
window.egw_LAB = window.egw_ready =
legacy_js_import(include.filter((src) => src.match(legacy_js_regexp) !== null), window.egw_webserverUrl)
.then(() => Promise.all(include.filter((src) => src.match(legacy_js_regexp) === null)
.map(rel_src => import(window.egw_webserverUrl+'/'+rel_src)
.catch((err) => { console.log(rel_src+":\n\n"+err.message)})
))).then(() =>

View File

@ -9,8 +9,6 @@
* @author Hadi Nategh <hn@groupware.org>
* @author Nathan Gray <ng@groupware.org>
*/
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
import '../../../vendor/bower-asset/jquery-ui/jquery-ui.js';
import { etemplate2 } from "../etemplate/etemplate2";
import { et2_nextmatch } from "../etemplate/et2_extension_nextmatch";
import { et2_dialog } from "../etemplate/et2_widget_dialog";

View File

@ -10,8 +10,6 @@
* @author Nathan Gray <ng@groupware.org>
*/
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
import '../../../vendor/bower-asset/jquery-ui/jquery-ui.js';
import {etemplate2} from "../etemplate/etemplate2";
import type {et2_container} from "../etemplate/et2_core_baseWidget";
import {et2_nextmatch} from "../etemplate/et2_extension_nextmatch";

View File

@ -19,8 +19,6 @@
egw_css;
*/
import './egw_core.js';
import 'jqueryui';
import '../jquery/jquery-ui-timepicker-addon.js';
/**
* Date and timepicker

View File

@ -156,6 +156,8 @@ egw.extend('files', egw.MODULE_WND_LOCAL, function(_app, _wnd)
{
_jsFiles = [_jsFiles];
}
// filter out files included by script-tag via egw.js
_jsFiles = _jsFiles.filter((src) => src.match(egw.legacy_js_regexp) === null);
let promise;
if (_jsFiles.length === 1) // running this in below case fails when loading app.js from etemplate.load()
{

View File

@ -4,13 +4,11 @@
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package api
* @subpackage jsapi
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @author Hadi Nategh (as AT stylite.de)
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @version $Id$
*/
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
import './egw_json.js';
jQuery(function()

View File

@ -13,8 +13,6 @@
'use strict';
import '../../../vendor/bower-asset/jquery/dist/jquery.js';
/**
* Check whether the console object is defined - if not, define one
*/

View File

@ -7,12 +7,10 @@
* @link https://www.egroupware.org
*/
import '../../vendor/bower-asset/jquery/dist/jquery.js'; // also ensures egw_LAB.wait exists!
/* if login page is not in top window, set top windows location to it */
if (top !== window) top.location = window.location;
egw_LAB.wait(function()
egw_ready.then(function()
{
jQuery(document).ready(function()
{

View File

@ -1121,6 +1121,11 @@ abstract class Framework extends Framework\Extra
return $java_script;
}
/**
* Files imported via script tag in egw.js, because they are no modules
*/
const legacy_js_imports = '/\/dhtmlx|jquery/';
/**
* Add EGroupware URL prefix eg. '/egroupware' to files AND bundles
*
@ -1141,6 +1146,13 @@ abstract class Framework extends Framework\Extra
// @todo: add all node_modules as bare imports
// map all legacy-js to something "not hurting"
$imports = array_map(static function($url) use ($prefix)
{
return !preg_match(self::legacy_js_imports, $url) ? $url :
$prefix.'/api/js/jquery/jquery.noconflict.js';
}, $imports);
return ['imports' => $imports];
}

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,10 @@
/**
* EGroupware - Filemanager - Javascript UI
*
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @package filemanager
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @copyright (c) 2008-19 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @copyright (c) 2008-21 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
*/
@ -13,6 +13,13 @@
*/
import {EgwApp} from "../../api/js/jsapi/egw_app";
import {et2_nextmatch} from "../../api/js/etemplate/et2_extension_nextmatch";
import {etemplate2} from "../../api/js/etemplate/etemplate2";
import {et2_dialog} from "../../api/js/etemplate/et2_widget_dialog";
import {et2_file} from "../../api/js/etemplate/et2_widget_file";
import {et2_button} from "../../api/js/etemplate/et2_widget_button";
import {et2_nextmatch_controller} from "../../api/js/etemplate/et2_extension_nextmatch_controller";
import {egw_get_file_editor_prefered_mimes} from "../../api/js/jsapi/egw_global";
import {et2_createWidget} from "../../api/js/etemplate/et2_core_widget";
/**
* UI for filemanager

View File

@ -10,11 +10,10 @@
/*egw:uses
/api/js/jsapi/egw_app.js
*/
import 'jquery';
import 'jqueryui';
import { EgwApp } from '../../api/js/jsapi/egw_app';
import { etemplate2 } from "../../api/js/etemplate/etemplate2";
import { CRMView } from "../../addressbook/js/CRM";
import { nm_open_popup } from "../../api/js/etemplate/et2_extension_nextmatch_actions";
/**
* UI for Infolog
*
@ -639,8 +638,7 @@ class InfologApp extends EgwApp {
var app = this.et2.getInstanceManager().app_obj;
if (!app.stylite) {
var self = this;
// @ToDo: @new-js-loader
egw_LAB.script('stylite/js/app.js?' + this.et2.getArrayMgr('content').getEntry('encryption_ts')).wait(function () {
egw.includeJS('/stylite/js/app.js?' + this.et2.getArrayMgr('content').getEntry('encryption_ts'), undefined, undefined, egw.webserverUrl).then(() => {
app.stylite = new app.classes.stylite;
app.stylite.et2 = self.et2;
if (callback) {

View File

@ -12,14 +12,12 @@
/api/js/jsapi/egw_app.js
*/
import 'jquery';
import 'jqueryui';
import {EgwApp} from '../../api/js/jsapi/egw_app';
import {etemplate2} from "../../api/js/etemplate/etemplate2";
import {et2_nextmatch} from "../../api/js/etemplate/et2_extension_nextmatch";
import {CRMView} from "../../addressbook/js/CRM";
import {et2_selectbox} from "../../api/js/etemplate/et2_widget_selectbox";
import {nm_open_popup} from "../../api/js/etemplate/et2_extension_nextmatch_actions";
/**
* UI for Infolog
@ -780,8 +778,8 @@ class InfologApp extends EgwApp
if (!app.stylite)
{
var self = this;
// @ToDo: @new-js-loader
egw_LAB.script('stylite/js/app.js?'+this.et2.getArrayMgr('content').getEntry('encryption_ts')).wait(function()
egw.includeJS('/stylite/js/app.js?'+this.et2.getArrayMgr('content').getEntry('encryption_ts'),
undefined, undefined, egw.webserverUrl).then(() =>
{
app.stylite = new app.classes.stylite;
app.stylite.et2 = self.et2;

View File

@ -13,7 +13,6 @@
framework.fw_desktop;
/pixelegg/js/slider.js;
*/
import '../../vendor/bower-asset/jquery/dist/jquery.js';
import '../../api/js/framework/fw_desktop.js';
import './slider.js';

View File

@ -7,8 +7,6 @@
* @package pixelegg
*/
import '../../api/js/jquery/chosen/chosen.jquery.js';
egw_ready.then(function()
{
/**

View File

@ -1,55 +1,39 @@
"use strict";
/**
* EGroupware - Resources - Javascript UI
*
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @package resources
* @author Hadi Nategh <hn-AT-stylite.de>
* @copyright (c) 2008-13 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @author Hadi Nategh <hn-AT-egroupware.org>
* @copyright (c) 2008-21 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id: app.js 44390 2013-11-04 20:54:23Z ralfbecker $
*/
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var egw_app_1 = require("../../api/js/jsapi/egw_app");
import { EgwApp } from "../../api/js/jsapi/egw_app";
import { fetchAll } from "../../api/js/etemplate/et2_extension_nextmatch_actions";
/**
* UI for resources
*/
var resourcesApp = /** @class */ (function (_super) {
__extends(resourcesApp, _super);
class resourcesApp extends EgwApp {
/**
* Constructor
*/
function resourcesApp() {
return _super.call(this, 'resources') || this;
constructor() {
super('resources');
}
/**
* Destructor
*/
resourcesApp.prototype.destroy = function (_app) {
destroy(_app) {
delete this.et2;
_super.prototype.destroy.call(this, _app);
};
super.destroy(_app);
}
/**
* This function is called when the etemplate2 object is loaded
* and ready. If you must store a reference to the et2 object,
* make sure to clean it up in destroy().
*/
resourcesApp.prototype.et2_ready = function (et2, name) {
_super.prototype.et2_ready.call(this, et2, name);
};
et2_ready(et2, name) {
super.et2_ready(et2, name);
}
/**
* call calendar planner by selected resources
*
@ -57,14 +41,14 @@ var resourcesApp = /** @class */ (function (_super) {
* @param {action} _senders selected action
*
*/
resourcesApp.prototype.view_calendar = function (_action, _senders) {
var res_ids = [];
var matches = [];
var nm = _action.parent.data.nextmatch;
var selection = nm.getSelection();
var show_calendar = function (res_ids) {
view_calendar(_action, _senders) {
let res_ids = [];
let matches = [];
let nm = _action.parent.data.nextmatch;
let selection = nm.getSelection();
let show_calendar = function (res_ids) {
egw(window).message(this.egw.lang('%1 resource(s) View calendar', res_ids.length));
var current_owners = (app.calendar ? app.calendar.state.owner || [] : []).join(',');
let current_owners = (app.calendar ? app.calendar.state.owner || [] : []).join(',');
if (current_owners) {
current_owners += ',';
}
@ -75,7 +59,7 @@ var resourcesApp = /** @class */ (function (_super) {
fetchAll(res_ids, nm, show_calendar);
}
else {
for (var i = 0; i < _senders.length; i++) {
for (let i = 0; i < _senders.length; i++) {
res_ids.push(_senders[i].id);
matches = res_ids[i].match(/^(?:resources::)?([0-9]+)(:([0-9]+))?$/);
if (matches) {
@ -84,23 +68,23 @@ var resourcesApp = /** @class */ (function (_super) {
}
show_calendar(res_ids);
}
};
}
/**
* Calendar sidebox hook change handler
*
*/
resourcesApp.prototype.sidebox_change = function (ev, widget) {
sidebox_change(ev, widget) {
if (ev[0] != 'r') {
widget.setSubChecked(ev, widget.getValue()[ev].value || false);
}
var owner = jQuery.extend([], app.calendar.state.owner) || [];
for (var i = owner.length - 1; i >= 0; i--) {
let owner = jQuery.extend([], app.calendar.state.owner) || [];
for (let i = owner.length - 1; i >= 0; i--) {
if (owner[i][0] == 'r') {
owner.splice(i, 1);
}
}
var value = widget.getValue();
for (var key in value) {
let value = widget.getValue();
for (let key in value) {
if (key[0] !== 'r')
continue;
if (value[key].value && owner.indexOf(key) === -1) {
@ -108,16 +92,16 @@ var resourcesApp = /** @class */ (function (_super) {
}
}
app.calendar.update_state({ owner: owner });
};
}
/**
* Book selected resource for calendar
*
* @param {action} _action actions
* @param {action} _senders selected action
*/
resourcesApp.prototype.book = function (_action, _senders) {
var res_ids = [], matches = [];
for (var i = 0; i < _senders.length; i++) {
book(_action, _senders) {
let res_ids = [], matches = [];
for (let i = 0; i < _senders.length; i++) {
res_ids.push(_senders[i].id);
matches = res_ids[i].match(/^(?:resources::)?([0-9]+)(:([0-9]+))?$/);
if (matches) {
@ -126,18 +110,17 @@ var resourcesApp = /** @class */ (function (_super) {
}
egw(window).message(this.egw.lang('%1 resource(s) booked', res_ids.length));
this.egw.open_link('calendar.calendar_uiforms.edit&participants=r' + res_ids.join(',r'), '_blank', '700x700');
};
}
/**
* set the picture_src to own_src by uploding own file
*
*/
resourcesApp.prototype.select_picture_src = function () {
var rBtn = this.et2.getWidgetById('picture_src');
select_picture_src() {
let rBtn = this.et2.getWidgetById('picture_src');
if (typeof rBtn != 'undefined') {
rBtn.set_value('own_src');
}
};
return resourcesApp;
}(egw_app_1.EgwApp));
}
}
app.classes.resources = resourcesApp;
//# sourceMappingURL=app.js.map

View File

@ -1,15 +1,15 @@
/**
* EGroupware - Resources - Javascript UI
*
* @link http://www.egroupware.org
* @link https://www.egroupware.org
* @package resources
* @author Hadi Nategh <hn-AT-stylite.de>
* @copyright (c) 2008-13 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @author Hadi Nategh <hn-AT-egroupware.org>
* @copyright (c) 2008-21 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id: app.js 44390 2013-11-04 20:54:23Z ralfbecker $
*/
import {EgwApp} from "../../api/js/jsapi/egw_app";
import {fetchAll} from "../../api/js/etemplate/et2_extension_nextmatch_actions";
/**
* UI for resources