From df4137baee2fa3e3448603a0e3c8c74d722adb2c Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 20 Jul 2021 09:34:59 +0200 Subject: [PATCH 01/30] * Filemanager/VFS: when creating a new file as root eg. via (docker exec) filemanager/cli.php do NOT create files unreadable by webserver --- api/src/Vfs/Sqlfs/StreamWrapper.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/api/src/Vfs/Sqlfs/StreamWrapper.php b/api/src/Vfs/Sqlfs/StreamWrapper.php index ac93cd527f..a7c62e71b9 100644 --- a/api/src/Vfs/Sqlfs/StreamWrapper.php +++ b/api/src/Vfs/Sqlfs/StreamWrapper.php @@ -254,10 +254,11 @@ class StreamWrapper extends Api\Db\Pdo implements Vfs\StreamWrapperIface { $umaskbefore = umask(); if (self::LOG_LEVEL > 1) error_log(__METHOD__." about to call mkdir for $fs_dir # Present UMASK:".decoct($umaskbefore)." called from:".function_backtrace()); - self::mkdir_recursive($fs_dir,0700,true); + // if running as root eg. via (docker exec) filemanager/cli.php do NOT create dirs not readable by webserver + self::mkdir_recursive($fs_dir,function_exists('posix_getuid') && !posix_getuid() ? 0777 : 0700,true); } } - // check if opend file is a directory + // check if opened file is a directory elseif($stat && ($stat['mode'] & self::MODE_DIR) == self::MODE_DIR) { if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) Is a directory!"); @@ -308,6 +309,11 @@ class StreamWrapper extends Api\Db\Pdo implements Vfs\StreamWrapperIface if ($this->operation == self::STORE2FS) { if (self::LOG_LEVEL > 1) error_log(__METHOD__." fopen (may create a directory? mkdir) ($this->opened_fs_id,$mode,$options)"); + // if creating a new file as root eg. via (docker exec) filemanager/cli.php do NOT create files unreadable by webserver + if ($new_file && function_exists('posix_getuid') && !posix_getuid()) + { + umask(0666); + } if (!($this->opened_stream = fopen(self::_fs_path($this->opened_fs_id),$mode)) && $new_file) { // delete db entry again, if we are not able to open a new(!) file From b95f9e72209ffbe42ef72baecbcdfb3247fa4019 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 20 Jul 2021 14:23:21 -0600 Subject: [PATCH 02/30] Reset after every job --- api/src/Asyncservice.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/Asyncservice.php b/api/src/Asyncservice.php index d169f0c786..ade79ab21d 100644 --- a/api/src/Asyncservice.php +++ b/api/src/Asyncservice.php @@ -425,7 +425,7 @@ class Asyncservice { // checking / setting up egw_info/user // - if ($GLOBALS['egw_info']['user']['account_id'] != $job['account_id']) + //if ($GLOBALS['egw_info']['user']['account_id'] != $job['account_id']) { // run notifications, before changing account_id of enviroment Link::run_notifies(); From 9540ac5414a79862dd9ee81a4f6dcfe287389f3b Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 20 Jul 2021 15:05:26 -0600 Subject: [PATCH 03/30] Ignore maps & minified js --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 038d787df2..6ff21d917d 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,8 @@ status/ smallpart/ swoolepush/ webauthn/ +*/js/*.map +*/js/app.min.js addressbook/js/app.js admin/js/app.js api/js/etemplate/*.js From 93068dcfccec1c31d319cdebdff5f77f892dab2b Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 22 Jul 2021 09:08:33 +0200 Subject: [PATCH 04/30] need to call Vfs\StreamWrapper::init_static() after setting Vfs::$user Vfs::$user should be protected and moved to Vfs\Base plus a getter and setter method added for public access, as after setting it in 21.1+, Api\Vfs\StreamWrapper::init_static() need to be called to set the default user context! --- api/src/Vfs.php | 17 +++++++++++------ api/src/Vfs/StreamWrapper.php | 26 +++++++++++++++++++++----- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/api/src/Vfs.php b/api/src/Vfs.php index 7db81a9198..3337ba424c 100644 --- a/api/src/Vfs.php +++ b/api/src/Vfs.php @@ -82,7 +82,10 @@ class Vfs extends Vfs\Base */ static $is_root = false; /** - * Current user id, in case we ever change if away from $GLOBALS['egw_info']['user']['account_id'] + * Current Vfs user id, set from $GLOBALS['egw_info']['user']['account_id'] by self::init_static() + * + * Should be protected and moved to Vfs\Base plus a getter and setter method added for public access, + * as after setting it in 21.1+, Api\Vfs\StreamWrapper::init_static() need to be called to set the default user context! * * @var int */ @@ -749,22 +752,22 @@ class Vfs extends Vfs\Base * @return boolean * @todo deprecated or even remove $user parameter and code */ - static function check_access($path, $check, $stat=null, $user=null) + static function check_access($path, $check, $stat=null, int $user=null) { static $vfs = null; - if (is_null($stat) && $user && $user != self::$user) + if (is_null($stat) && $user && $user !== self::$user) { static $path_user_stat = array(); $backup_user = self::$user; self::$user = $user; + Vfs\StreamWrapper::init_static(); + self::clearstatcache($path); if (!isset($path_user_stat[$path]) || !isset($path_user_stat[$path][$user])) { - self::clearstatcache($path); - - if (!isset($vfs)) $vfs = new Vfs\StreamWrapper(); + $vfs = new Vfs\StreamWrapper(); $path_user_stat[$path][$user] = $vfs->url_stat($path, 0); self::clearstatcache($path); // we need to clear the stat-cache after the call too, as the next call might be the regular user again! @@ -786,6 +789,8 @@ class Vfs extends Vfs\Base $ret = false; // no access, if we can not stat the file } self::$user = $backup_user; + Vfs\StreamWrapper::init_static(); + $vfs = null; // we need to clear stat-cache again, after restoring original user, as eg. eACL is stored in session self::clearstatcache($path); diff --git a/api/src/Vfs/StreamWrapper.php b/api/src/Vfs/StreamWrapper.php index f666751eb9..acf8690b74 100644 --- a/api/src/Vfs/StreamWrapper.php +++ b/api/src/Vfs/StreamWrapper.php @@ -972,6 +972,7 @@ class StreamWrapper extends Base implements StreamWrapperIface /** * Init our static properties and register this wrapper * + * Must be called when Vfs::$user is changed! */ static function init_static() { @@ -984,16 +985,31 @@ class StreamWrapper extends Base implements StreamWrapperIface { self::$fstab = $fstab; } - if (!empty($GLOBALS['egw_info']['user']['preferences']['common']['vfs_fstab']) && - is_array($GLOBALS['egw_info']['user']['preferences']['common']['vfs_fstab'])) + + // get the user Vfs is currently using, might be different from $GLOBALS['egw_info']['user']['account_id'] + if (!isset(Vfs::$user)) { - self::$fstab += $GLOBALS['egw_info']['user']['preferences']['common']['vfs_fstab']; + Vfs::init_static(); + } + if (Vfs::$user != $GLOBALS['egw_info']['user']['account_id']) + { + $prefs = new Api\Preferences(Vfs::$user); + $vfs_fstab = $prefs->data['common']['vfs_fstab']; + } + else + { + $vfs_fstab = $GLOBALS['egw_info']['user']['preferences']['common']['vfs_fstab']; + } + if (!empty($vfs_fstab) && is_array($vfs_fstab)) + { + self::$fstab += $vfs_fstab; } // set default context for our schema ('vfs') with current user - if (!($context = stream_context_get_options(stream_context_get_default())) || empty($context[self::SCHEME]['user'])) + if (!($context = stream_context_get_options(stream_context_get_default())) || empty($context[self::SCHEME]['user']) || + $context[self::SCHEME]['user'] !== (int)Vfs::$user) { - $context[self::SCHEME]['user'] = (int)$GLOBALS['egw_info']['user']['account_id']; + $context[self::SCHEME]['user'] = (int)Vfs::$user; stream_context_set_default($context); } } From 4240f4cf0123933c12f934cd8f1cfbe977478dcb Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 23 Jul 2021 08:09:49 +0200 Subject: [PATCH 05/30] Changelog for 21.1.20210723 --- api/setup/setup.inc.php | 2 +- doc/rpm-build/debian.changes | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/api/setup/setup.inc.php b/api/setup/setup.inc.php index c5b86b0e12..b169d6feeb 100644 --- a/api/setup/setup.inc.php +++ b/api/setup/setup.inc.php @@ -14,7 +14,7 @@ $setup_info['api']['title'] = 'EGroupware API'; $setup_info['api']['version'] = '21.1'; $setup_info['api']['versions']['current_header'] = '1.29'; // maintenance release in sync with changelog in doc/rpm-build/debian.changes -$setup_info['api']['versions']['maintenance_release'] = '21.1.20210629'; +$setup_info['api']['versions']['maintenance_release'] = '21.1.20210723'; $setup_info['api']['enable'] = 3; $setup_info['api']['app_order'] = 1; $setup_info['api']['license'] = 'GPL'; diff --git a/doc/rpm-build/debian.changes b/doc/rpm-build/debian.changes index 7b88f613d3..26d1ca19ea 100644 --- a/doc/rpm-build/debian.changes +++ b/doc/rpm-build/debian.changes @@ -1,3 +1,14 @@ +egroupware-docker (21.1.20210723) hardy; urgency=low + + * Security Update: all 21.1 users should upgrade ASAP, 20.1 and below is not affected + * Filemanager/VFS: when creating a new file as root eg. via (docker exec) filemanager/cli.php do NOT create files unreadable by webserver + * Collabora: Fix editing files in mounted share + * Kanban/PostgreSQL: fix installation of example board under PostgreSQL + * smallPART/PostgreSQL: fix multiple SQL errors + * smallPART/PostgreSQL: fix installation under PostgreSQL + + -- Ralf Becker Fri, 23 Jul 2021 08:09:49 +0200 + egroupware-docker (21.1.20210629) hardy; urgency=low * Mail/Admin: fix not working mail wizard From a7923576efb162b6f014058b3050d5057941921a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 23 Jul 2021 09:49:18 +0200 Subject: [PATCH 06/30] try fixing not displayed custome type and status icons in CRM view --- infolog/templates/default/index.xet | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infolog/templates/default/index.xet b/infolog/templates/default/index.xet index d2713c7165..6c1c87953b 100644 --- a/infolog/templates/default/index.xet +++ b/infolog/templates/default/index.xet @@ -75,8 +75,8 @@ - - + + From d02a9d5b8670c54afb0dceb300b53fba678a8ce0 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 23 Jul 2021 22:46:13 +0200 Subject: [PATCH 07/30] replace fxp/composer-asset-plugin with asset-packagist.org to install bower and npm assets supposed to work with composer > 1.8.7 --- composer.json | 13 ++++++++----- composer.lock | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 96a2d22afa..196af528a9 100644 --- a/composer.json +++ b/composer.json @@ -38,9 +38,13 @@ "issuses": "https://my.egroupware.org" }, "repositories": [ - { - "type": "pear", - "url": "https://pear.horde.org" + { + "type": "composer", + "url": "https://asset-packagist.org" + }, + { + "type": "pear", + "url": "https://pear.horde.org" }, { "type": "vcs", @@ -77,7 +81,6 @@ "egroupware/collabora": "self.version", "egroupware/guzzlestream": "dev-master", "egroupware/icalendar": "^2.1.9", - "egroupware/imap-client": "^2.30.2", "egroupware/magicsuggest": "^2.1", "egroupware/news_admin": "self.version", "egroupware/openid": "self.version", @@ -90,11 +93,11 @@ "egroupware/tracker": "self.version", "egroupware/webdav": "dev-master", "egroupware/z-push-dev": "^2.5", - "fxp/composer-asset-plugin": "^1.2.2", "giggsey/libphonenumber-for-php": "^8.12", "npm-asset/as-jqplot": "1.0.*", "npm-asset/gridster": "0.5.*", "oomphinc/composer-installers-extender": "^1.1", + "pear-pear.horde.org/horde_imap_client": "^2.30.3", "pear-pear.horde.org/horde_compress": "^2.0.8", "pear-pear.horde.org/horde_crypt": "^2.7.9", "pear-pear.horde.org/horde_mail": "^2.1.2", diff --git a/composer.lock b/composer.lock index 5b59baf1c3..7484faaeaf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a4ca48486896136c2dc9b1c1dfa79846", + "content-hash": "3f243434358f300d4fda0859f4e4b0e9", "packages": [ { "name": "adldap2/adldap2", From 93c390139bf67d763a06fe47dab768fbe0de1ff7 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Mon, 26 Jul 2021 10:10:30 +0200 Subject: [PATCH 08/30] Fix error TypeError: Cannot read property 'length' of undefined --- api/js/etemplate/et2_widget_taglist.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/js/etemplate/et2_widget_taglist.ts b/api/js/etemplate/et2_widget_taglist.ts index 5a91785e6b..b29c261105 100644 --- a/api/js/etemplate/et2_widget_taglist.ts +++ b/api/js/etemplate/et2_widget_taglist.ts @@ -638,7 +638,7 @@ export class et2_taglist extends et2_selectbox implements et2_IResizeable }); // if value has already been set, re-set it by it's id(s) - if (this.options.select_options.length && this.options.value.length) { + if (this.options.select_options.length && this.options.value?.length) { this.set_value(this.options.value.map((v) => v.id)); } } From 4cd2d665d7fed405312161efec602a7ce8fe555f Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Mon, 26 Jul 2021 14:52:01 +0200 Subject: [PATCH 09/30] Fix broken opening a contact in mobile theme --- addressbook/js/app.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addressbook/js/app.ts b/addressbook/js/app.ts index 9097a4c92b..aaab7ae9a4 100644 --- a/addressbook/js/app.ts +++ b/addressbook/js/app.ts @@ -1528,6 +1528,9 @@ class AddressbookApp extends EgwApp */ private videoconference_isUserOnline(_action, _selected) { + // ATM we're not supporting status in mobile theme + if (egwIsMobile()) return false; + let list = app.status ? app.status.getEntireList() : {}; for (let sel in _selected) { From 4fe8fd51549733c5e6cfd4fbd6f6a06987779968 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Tue, 27 Jul 2021 12:38:37 +0200 Subject: [PATCH 10/30] Fix default value for mail's contact label preference --- mail/inc/class.mail_hooks.inc.php | 39 ++++++++++++++++--------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/mail/inc/class.mail_hooks.inc.php b/mail/inc/class.mail_hooks.inc.php index 1ab0d1fb09..add5ec6761 100644 --- a/mail/inc/class.mail_hooks.inc.php +++ b/mail/inc/class.mail_hooks.inc.php @@ -176,6 +176,24 @@ class mail_hooks 'always_display' => lang('always show html emails'), ); + $contactLabelOptions = array ( + 'n_prefix' => array ( + 'id' => 'n_prefix', + 'label' => lang('Prefix'), + ), + 'n_given' => array ( + 'id' => 'n_given', + 'label' => lang('First name') + ), + 'n_family' => array( + 'id' => 'n_family', + 'label' => lang('Last name') + ), + 'org_name' => array( + 'id' => 'org_name', + 'label' => lang('Organisation') + ) + ); // otherwise we get warnings during setup if (!is_array($folderList)) $folderList = array(); @@ -457,29 +475,12 @@ class mail_hooks 'label' => 'Contact label', 'help' => 'Defines what to show as contact label for added contact into To/Cc/Bcc when composing an email. Default is firstname lastname and empty means include eveything available.', 'name' => 'contactLabel', - 'values' => '', + 'values' => $contactLabelOptions, 'attributes' => array( 'allowFreeEntries' => false, 'editModeEnabled' => false, 'autocomplete_url' => ' ', - 'select_options' => array ( - 'n_prefix' => array ( - 'id' => 'n_prefix', - 'label' => lang('Prefix'), - ), - 'n_given' => array ( - 'id' => 'n_given', - 'label' => lang('First name') - ), - 'n_family' => array( - 'id' => 'n_family', - 'label' => lang('Last name') - ), - 'org_name' => array( - 'id' => 'org_name', - 'label' => lang('Organisation') - ) - ) + 'select_options' => $contactLabelOptions ), 'default' => ['n_given','n_family'] ) From eae9c97caa962e9746c2064d83e996bb0e8f3fa5 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 28 Jul 2021 09:03:33 +0200 Subject: [PATCH 11/30] update composer to 1.10.22, as we no longer use fxp/composer-asset-plugin still cant use Composer v2, as Horde is a no longer supported PEAR repo :( --- doc/docker/development/Dockerfile | 2 +- doc/docker/fpm/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/docker/development/Dockerfile b/doc/docker/development/Dockerfile index c5352b3daf..fc62584e29 100644 --- a/doc/docker/development/Dockerfile +++ b/doc/docker/development/Dockerfile @@ -64,7 +64,7 @@ else \ RESULT=$?; \ fi; \ rm composer-setup.php; \ -composer.phar self-update 1.8.6; \ +composer.phar self-update 1.10.22; \ exit $RESULT' \ # disable certificate checks for LDAP as most LDAP and AD servers have no "valid" cert && echo "TLS_REQCERT never" >> /etc/ldap/ldap.conf diff --git a/doc/docker/fpm/Dockerfile b/doc/docker/fpm/Dockerfile index dc6f39b65d..8ba24b726f 100644 --- a/doc/docker/fpm/Dockerfile +++ b/doc/docker/fpm/Dockerfile @@ -69,7 +69,7 @@ fi; \ rm composer-setup.php; \ exit $RESULT' \ # build EGroupware - && composer.phar self-update 1.8.6 \ + && composer.phar self-update 1.10.22 \ && cd /usr/share \ && [ $PHP_VERSION = "8.0" ] && COMPOSER_EXTRA=--ignore-platform-reqs || true \ && composer.phar create-project $COMPOSER_EXTRA --prefer-dist --no-scripts --no-dev egroupware/egroupware:$VERSION \ From 5f7bafd0302cac534da613033e1713d4da82135f Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 30 Jul 2021 15:21:58 +0200 Subject: [PATCH 12/30] allow to explicit register callbacks for the broadcasted push messages egw.registerPush(Function) The callback should have a bound context, if it requires one! --- api/js/jsapi/egw_jsonq.js | 35 +++++++++++++++++++++++++++++++++++ api/js/jsapi/egw_message.js | 3 +++ 2 files changed, 38 insertions(+) diff --git a/api/js/jsapi/egw_jsonq.js b/api/js/jsapi/egw_jsonq.js index 880fd25c41..0d59c40134 100644 --- a/api/js/jsapi/egw_jsonq.js +++ b/api/js/jsapi/egw_jsonq.js @@ -20,6 +20,13 @@ egw.extend('jsonq', egw.MODULE_GLOBAL, function() { "use strict"; + /** + * Explicit registered push callbacks + * + * @type {Function[]} + */ + let push_callbacks = []; + /** * Queued json requests (objects with attributes menuaction, parameters, context, callback, sender and callbeforesend) * @@ -149,6 +156,34 @@ egw.extend('jsonq', egw.MODULE_GLOBAL, function() }, 100); } return uid; + }, + + /** + * Register a callback to receive push broadcasts eg. in a popup or iframe + * + * It's also used internally by egw_message's push method to dispatch to the registered callbacks. + * + * @param {Function|PushData} data callback (with bound context) or PushData to dispatch to callbacks + */ + registerPush: function(data) + { + if (typeof data === "function") + { + push_callbacks.push(data); + } + else + { + for (let n in push_callbacks) + { + try { + push_callbacks[n].call(this, data); + } + // if we get an exception, we assume the callback is no longer available and remove it + catch (ex) { + push_callbacks.splice(n, 1); + } + } + } } }; diff --git a/api/js/jsapi/egw_message.js b/api/js/jsapi/egw_message.js index 9dce3e6be9..aef3ad74fb 100644 --- a/api/js/jsapi/egw_message.js +++ b/api/js/jsapi/egw_message.js @@ -459,6 +459,9 @@ egw.extend('message', egw.MODULE_WND_LOCAL, function(_app, _wnd) app_obj.push(pushData); } } + + // call the global registered push callbacks + this.registerPush(pushData); } }; From 8f93a7f7c6e7809494bf3b9fca4e2a42d492ab85 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 3 Aug 2021 18:53:05 +0200 Subject: [PATCH 13/30] * Setup: support uninstalling automatic installed apps (no more reinstalling next update) --- api/src/Egw/Applications.php | 7 +++- setup/applications.php | 3 ++ setup/inc/class.setup.inc.php | 56 ++++++++++++++++++------- setup/inc/class.setup_detection.inc.php | 2 +- setup/inc/class.setup_process.inc.php | 6 +-- 5 files changed, 54 insertions(+), 20 deletions(-) diff --git a/api/src/Egw/Applications.php b/api/src/Egw/Applications.php index 8e3cf96bf4..d789ebd99a 100755 --- a/api/src/Egw/Applications.php +++ b/api/src/Egw/Applications.php @@ -71,15 +71,18 @@ class Applications } /** - * populate array with a list of installed apps + * Populate array with a list of installed apps * + * egw_applications.app_enabled = -1 is NOT installed, but an uninstalled autoinstall app! + * + * @return array[] */ function read_installed_apps() { $GLOBALS['egw_info']['apps'] = Api\Cache::getInstance(__CLASS__, 'apps', function() { $apps = array(); - foreach($this->db->select($this->table_name,'*',false,__LINE__,__FILE__,false,'ORDER BY app_order ASC') as $row) + foreach($this->db->select($this->table_name,'*', ['app_enabled != -1'],__LINE__,__FILE__,false,'ORDER BY app_order ASC') as $row) { $apps[$row['app_name']] = Array( 'title' => $row['app_name'], diff --git a/setup/applications.php b/setup/applications.php index 634dae54e2..954cc53ce8 100644 --- a/setup/applications.php +++ b/setup/applications.php @@ -226,6 +226,9 @@ if (!empty($detail = $_GET['detail'])) { switch($key) { + case 'autoinstall': + $val = json_encode($val); + break; case 'title': continue 2; case 'tables': diff --git a/setup/inc/class.setup.inc.php b/setup/inc/class.setup.inc.php index e31c85c1ff..0fbe3d8413 100644 --- a/setup/inc/class.setup.inc.php +++ b/setup/inc/class.setup.inc.php @@ -516,16 +516,17 @@ class setup ),False,__LINE__,__FILE__); } try { - $this->db->insert($this->applications_table,array( - 'app_name' => $appname, - 'app_enabled' => $enable, - 'app_order' => $setup_info[$appname]['app_order'], - 'app_tables' => (string)$tables, // app_tables is NOT NULL - 'app_version' => $setup_info[$appname]['version'], - 'app_index' => $setup_info[$appname]['index'], - 'app_icon' => $setup_info[$appname]['icon'], - 'app_icon_app' => $setup_info[$appname]['icon_app'], - ),False,__LINE__,__FILE__); + $this->db->insert($this->applications_table, [ + 'app_enabled' => $enable, + 'app_order' => $setup_info[$appname]['app_order'], + 'app_tables' => (string)$tables, // app_tables is NOT NULL + 'app_version' => $setup_info[$appname]['version'], + 'app_index' => $setup_info[$appname]['index'], + 'app_icon' => $setup_info[$appname]['icon'], + 'app_icon_app' => $setup_info[$appname]['icon_app'], + ], [ + 'app_name' => $appname, + ], __LINE__, __FILE__); } catch (Api\Db\Exception\InvalidSql $e) { @@ -548,7 +549,7 @@ class setup * Check if an application has info in the db * * @param $appname Application 'name' with a matching $setup_info[$appname] array slice - * @param $enabled optional, set to False to not enable this app + * @return boolean|null null: autoinstalled app which got uninstalled */ function app_registered($appname) { @@ -563,13 +564,13 @@ class setup // _debug_array($setup_info[$appname]); } - if ($this->db->select($this->applications_table,'COUNT(*)',array('app_name' => $appname),__LINE__,__FILE__)->fetchColumn()) + if (($enabled = $this->db->select($this->applications_table, 'app_enabled', ['app_name' => $appname], __LINE__,__FILE__)->fetchColumn()) !== false) { if(@$GLOBALS['DEBUG']) { echo '... app previously registered.'; } - return True; + return $enabled <= -1 ? null : true; } if(@$GLOBALS['DEBUG']) { @@ -676,10 +677,35 @@ class setup $this->db->delete(Api\Config::TABLE, array('config_app'=>$appname),__LINE__,__FILE__); } //echo 'DELETING application: ' . $appname; - $this->db->delete($this->applications_table,array('app_name'=>$appname),__LINE__,__FILE__); + + // when uninstalling an autoinstall app, we must mark it deleted in the DB, otherwise it will install again the next update + if (file_exists($file = EGW_SERVER_ROOT.'/'.$appname.'/setup/setup.inc.php')) + { + $setup_info = []; + include($file); + } + if (!empty($setup_info[$appname]['autoinstall']) && $setup_info[$appname]['autoinstall'] === true) + { + $this->db->update($this->applications_table, [ + 'app_enabled' => -1, + 'app_tables' => '', + 'app_version' => 'uninstalled', + 'app_index' => null, + ], [ + 'app_name' => $appname, + ], __LINE__, __FILE__); + } + else + { + $this->db->delete($this->applications_table, ['app_name' => $appname], __LINE__, __FILE__); + } Api\Egw\Applications::invalidate(); + // unregister hooks, before removing links + unset($GLOBALS['egw_info']['apps'][$appname]); + Api\Hooks::read(true); + // Remove links to the app Link::unlink(0, $appname); } @@ -1219,6 +1245,8 @@ class setup { static $table_names = False; + if(!is_object($this->db)) $this->loaddb(); + if (!$table_names || $force_refresh) $table_names = $this->db->table_names(); if (!$table_names) return false; diff --git a/setup/inc/class.setup_detection.inc.php b/setup/inc/class.setup_detection.inc.php index 2132310211..cda523d231 100755 --- a/setup/inc/class.setup_detection.inc.php +++ b/setup/inc/class.setup_detection.inc.php @@ -62,7 +62,7 @@ class setup_detection /* one of these tables exists. checking for post/pre beta version */ if($GLOBALS['egw_setup']->applications_table != 'applications') { - foreach($GLOBALS['egw_setup']->db->select($GLOBALS['egw_setup']->applications_table,'*',false,__LINE__,__FILE__) as $row) + foreach($GLOBALS['egw_setup']->db->select($GLOBALS['egw_setup']->applications_table, '*', 'app_enabled != -1', __LINE__, __FILE__) as $row) { $app = $row['app_name']; if (!isset($setup_info[$app])) // app source no longer there diff --git a/setup/inc/class.setup_process.inc.php b/setup/inc/class.setup_process.inc.php index 3377e847c0..74988baa9b 100755 --- a/setup/inc/class.setup_process.inc.php +++ b/setup/inc/class.setup_process.inc.php @@ -618,10 +618,10 @@ class setup_process foreach($setup_info as $appname => &$appdata) { // check if app is NOT installed - if(!$GLOBALS['egw_setup']->app_registered($appname)) + if (!($registered = $GLOBALS['egw_setup']->app_registered($appname))) { - // check if app wants to be automatically installed on update to version x or allways - if (isset($appdata['autoinstall']) && ($appdata['autoinstall'] === true || + // check if app wants to be automatically installed on update to version x or always (unless uninstalled prior) + if (isset($appdata['autoinstall']) && ($appdata['autoinstall'] === true && $registered !== null || $appdata['autoinstall'] === $this->api_version_target)) { $info_c = $this->current(array($appname => $appdata), $DEBUG); From 6c0aed651f0e8e6d726b8fb3e4c90060d7b59128 Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 9 Aug 2021 13:44:43 -0600 Subject: [PATCH 14/30] Api: Add some extra parameters to Merge::merge_entries() so overridding classes can still use the parent method, passing in IDs & merge object --- api/src/Storage/Merge.php | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/api/src/Storage/Merge.php b/api/src/Storage/Merge.php index 3cf3b840e5..8734fa1c32 100644 --- a/api/src/Storage/Merge.php +++ b/api/src/Storage/Merge.php @@ -2333,14 +2333,19 @@ abstract class Merge /** * Merge the selected IDs into the given document, save it to the VFS, then * either open it in the editor or have the browser download the file. + * + * @param String[]|null $ids Allows extending classes to process IDs in their own way. Leave null to pull from request. + * @param Merge|null $document_merge Already instantiated Merge object to do the merge. + * @throws Api\Exception + * @throws Api\Exception\AssertionFailed */ - public static function merge_entries() + public static function merge_entries(array $ids = null, Merge &$document_merge = null) { - if (class_exists($_REQUEST['merge']) && is_subclass_of($_REQUEST['merge'], 'EGroupware\\Api\\Storage\\Merge')) + if (is_null($document_merge) && class_exists($_REQUEST['merge']) && is_subclass_of($_REQUEST['merge'], 'EGroupware\\Api\\Storage\\Merge')) { $document_merge = new $_REQUEST['merge'](); } - else + elseif (is_null($document_merge)) { $document_merge = new Api\Contacts\Merge(); } @@ -2351,13 +2356,16 @@ abstract class Merge return; } - $ids = is_string($_REQUEST['id']) && strpos($_REQUEST['id'],'[') === FALSE ? explode(',',$_REQUEST['id']) : json_decode($_REQUEST['id'],true); + if(is_null(($ids))) + { + $ids = is_string($_REQUEST['id']) && strpos($_REQUEST['id'], '[') === FALSE ? explode(',', $_REQUEST['id']) : json_decode($_REQUEST['id'], true); + } if($_REQUEST['select_all'] === 'true') { $ids = self::get_all_ids($document_merge); } - $filename = ''; + $filename = $document_merge->get_filename($_REQUEST['document']); $result = $document_merge->merge_file($_REQUEST['document'], $ids, $filename, '', $header); if(!is_file($result) || !is_readable($result)) @@ -2412,6 +2420,17 @@ abstract class Merge } } + /** + * Generate a filename for the merged file + * + * Default is just the name of the template + * @return string + */ + protected function get_filename($document) : string + { + return ''; + } + /** * Get all ids for when they try to do 'Select All', then merge into document * From 168d3856200ed4957674375a14d370121bba838d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 10 Aug 2021 10:39:44 +0200 Subject: [PATCH 15/30] update pear/archive_tar to 1.4.14 to fix upstream security problem also disable evtl. installed old asert plugin --- composer.json | 3 +++ composer.lock | 44 ++++++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index 196af528a9..ec50a93992 100644 --- a/composer.json +++ b/composer.json @@ -55,6 +55,9 @@ "platform": { "php": "7.3" }, + "fxp-asset": { + "enabled": false + }, "sort-packages": true }, "require": { diff --git a/composer.lock b/composer.lock index 7484faaeaf..24850fef95 100644 --- a/composer.lock +++ b/composer.lock @@ -213,8 +213,7 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/fengyuanchen/cropper/zipball/30c58b29ee21010e17e58ebab165fbd84285c685", - "reference": "30c58b29ee21010e17e58ebab165fbd84285c685", - "shasum": "" + "reference": "30c58b29ee21010e17e58ebab165fbd84285c685" }, "type": "bower-asset-library", "extra": { @@ -271,8 +270,7 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/rtfpessoa/diff2html/zipball/4c15a9ca93e50c78f8d02e37273076994888d499", - "reference": "4c15a9ca93e50c78f8d02e37273076994888d499", - "shasum": "" + "reference": "4c15a9ca93e50c78f8d02e37273076994888d499" }, "type": "bower-asset-library" }, @@ -287,8 +285,7 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/ftlabs/fastclick/zipball/9977a916739360ad4ffd7aa19b0016bf375e934b", - "reference": "9977a916739360ad4ffd7aa19b0016bf375e934b", - "shasum": "" + "reference": "9977a916739360ad4ffd7aa19b0016bf375e934b" }, "type": "bower-asset-library", "extra": { @@ -314,8 +311,7 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/5e89585e0121e72ff47de177c5ef604f3089a53d", - "reference": "5e89585e0121e72ff47de177c5ef604f3089a53d", - "shasum": "" + "reference": "5e89585e0121e72ff47de177c5ef604f3089a53d" }, "type": "bower-asset-library", "extra": { @@ -345,8 +341,7 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/mattbryson/TouchSwipe-Jquery-Plugin/zipball/f0d71bf645779358e1458e212102c5d59b7702ec", - "reference": "f0d71bf645779358e1458e212102c5d59b7702ec", - "shasum": "" + "reference": "f0d71bf645779358e1458e212102c5d59b7702ec" }, "type": "bower-asset-library", "extra": { @@ -364,8 +359,7 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/components/jqueryui/zipball/396781474d936959061271505f506b78398fe6a2", - "reference": "396781474d936959061271505f506b78398fe6a2", - "shasum": "" + "reference": "396781474d936959061271505f506b78398fe6a2" }, "require": { "bower-asset/jquery": ">=1.6" @@ -2600,8 +2594,7 @@ "dist": { "type": "zip", "url": "https://api.github.com/repos/jquery/jquery/zipball/f852e631ba85af7da4ad7594785e122504e7b233", - "reference": "f852e631ba85af7da4ad7594785e122504e7b233", - "shasum": "" + "reference": "f852e631ba85af7da4ad7594785e122504e7b233" }, "require-dev": { "npm-asset/archiver": "~0.4.2", @@ -3530,16 +3523,16 @@ }, { "name": "pear/archive_tar", - "version": "1.4.13", + "version": "1.4.14", "source": { "type": "git", "url": "https://github.com/pear/Archive_Tar.git", - "reference": "2b87b41178cc6d4ad3cba678a46a1cae49786011" + "reference": "4d761c5334c790e45ef3245f0864b8955c562caa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/2b87b41178cc6d4ad3cba678a46a1cae49786011", - "reference": "2b87b41178cc6d4ad3cba678a46a1cae49786011", + "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/4d761c5334c790e45ef3245f0864b8955c562caa", + "reference": "4d761c5334c790e45ef3245f0864b8955c562caa", "shasum": "" }, "require": { @@ -3592,7 +3585,17 @@ "archive", "tar" ], - "time": "2021-02-16T10:50:50+00:00" + "funding": [ + { + "url": "https://github.com/mrook", + "type": "github" + }, + { + "url": "https://www.patreon.com/michielrook", + "type": "patreon" + } + ], + "time": "2021-07-20T13:53:39+00:00" }, { "name": "pear/auth_sasl", @@ -10794,5 +10797,6 @@ "platform-dev": [], "platform-overrides": { "php": "7.3" - } + }, + "plugin-api-version": "1.1.0" } From 1f2e2390d3d5585bb3b6e9ece6f590254c8d7f32 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 10 Aug 2021 12:07:08 +0200 Subject: [PATCH 16/30] Fix installation instructions and wiki links --- README.md | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 3714e16120..8fce8e01f6 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,29 @@ # EGroupware -| Branch | Status | Tools | Usage | -| ------ | ------ | ----- | ----- | -| master | [![Build Status](https://travis-ci.org/EGroupware/egroupware.svg?branch=master)](https://travis-ci.org/EGroupware/egroupware) | Travis CI | runs unit-tests after each commit | -| 20.1 | [![Build Status](https://travis-ci.org/EGroupware/egroupware.svg?branch=20.1)](https://travis-ci.org/EGroupware/egroupware) | [![Scrutinizer CI](https://scrutinizer-ci.com/images/logo.png) scrutinizer](https://scrutinizer-ci.com/g/EGroupware/egroupware/) | runs static analysis on our codebase | -| 19.1 | [![Build Status](https://travis-ci.org/EGroupware/egroupware.svg?branch=19.1)](https://travis-ci.org/EGroupware/egroupware) | BrowserStack | manual testing with unusual browser versions or platforms | -### Default and prefered installation method for EGroupware is via your package manager: +| Tools | Usage | +| ----- | ----- | +| Travis CI | runs unit-tests after each commit | +| [![Scrutinizer CI](https://scrutinizer-ci.com/images/logo.png) scrutinizer](https://scrutinizer-ci.com/g/EGroupware/egroupware/) | runs static analysis on our codebase | +| BrowserStack | manual testing with unusual browser versions or platforms | - https://software.opensuse.org/download.html?project=server%3AeGroupWare&package=egroupware-epl +### Default and prefered installation method for EGroupware is via your Linux package manager: -### Installing EGroupware 20.1 via Docker: -EGroupware 20.1 can be installed via Docker, in fact the DEB/RPM packages also does that. Instructions on how to run EGroupware in Docker are in [doc/docker](https://github.com/EGroupware/egroupware/tree/20.1/doc/docker) subdirectory. +* [Installation & Update instructions](https://github.com/EGroupware/egroupware/wiki/Installation-using-egroupware-docker-RPM-DEB-package) +* [Distribution specific instructions](https://github.com/EGroupware/egroupware/wiki/Distribution-specific-instructions) -### Installing EGroupware 19.1 via Docker: -EGroupware 19.1 can be installed via Docker, in fact the DEB/RPM packages also does that. Instructions on how to run EGroupware in Docker are in [doc/docker](https://github.com/EGroupware/egroupware/tree/19.1/doc/docker) subdirectory. +> Every other method (including a developer installation by cloning the repo) is way more complicated AND does not include all features, as part's of EGroupware are running in different containers, eg. the push-server! +### Installing EGroupware 21.1 via Docker for non-Linux environments or not supported Linux distros: +EGroupware 21.1 can be installed via Docker, in fact the DEB/RPM packages also does that. Instructions on how to run EGroupware in Docker are in our [Wiki](https://github.com/EGroupware/egroupware/wiki/Docker-compose-installation) and in [doc/docker](https://github.com/EGroupware/egroupware/tree/21.1/doc/docker) subdirectory. -### Installing EGroupware development version: +### Installing EGroupware development version via Docker: +* this is the prefered developer installation, as it contains eg. a push-server container +* https://github.com/EGroupware/egroupware/tree/master/doc/docker/development + +### Deprecated EGroupware development installation: * install composer.phar from https://getcomposer.org/download/ -* optional: for minified JavaScript and CSS install nodejs and grunt +* for JavaScript dependencies and build install nodejs and npm +* optional: for minified CSS install grunt ``` apt/yum/zypper install nodejs npm install -g grunt-cli From cd4dbd7b05b7118b6b271b7d2e115ff62c4b4c79 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 10 Aug 2021 14:25:27 +0200 Subject: [PATCH 17/30] finally removing fxp/composer-asset-plugin (required via egroupware/projectmanager) --- composer.json | 2 +- composer.lock | 61 +-------------------------------------------------- 2 files changed, 2 insertions(+), 61 deletions(-) diff --git a/composer.json b/composer.json index ec50a93992..5560096aeb 100644 --- a/composer.json +++ b/composer.json @@ -100,9 +100,9 @@ "npm-asset/as-jqplot": "1.0.*", "npm-asset/gridster": "0.5.*", "oomphinc/composer-installers-extender": "^1.1", - "pear-pear.horde.org/horde_imap_client": "^2.30.3", "pear-pear.horde.org/horde_compress": "^2.0.8", "pear-pear.horde.org/horde_crypt": "^2.7.9", + "pear-pear.horde.org/horde_imap_client": "^2.30.3", "pear-pear.horde.org/horde_mail": "^2.1.2", "pear-pear.horde.org/horde_managesieve": "^1.0.2", "pear-pear.horde.org/horde_mapi": "^1.0.9", diff --git a/composer.lock b/composer.lock index 24850fef95..d7cebdb09e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3f243434358f300d4fda0859f4e4b0e9", + "content-hash": "ecdc3fddca0c9dcad5155d7aad711dab", "packages": [ { "name": "adldap2/adldap2", @@ -1710,65 +1710,6 @@ ], "time": "2021-02-12T00:02:00+00:00" }, - { - "name": "fxp/composer-asset-plugin", - "version": "v1.4.5", - "source": { - "type": "git", - "url": "https://github.com/fxpio/composer-asset-plugin.git", - "reference": "6d5cfd0a4f4c3e167d2048eb8f5347309a6bbe10" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fxpio/composer-asset-plugin/zipball/6d5cfd0a4f4c3e167d2048eb8f5347309a6bbe10", - "reference": "6d5cfd0a4f4c3e167d2048eb8f5347309a6bbe10", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0", - "php": ">=5.3.3" - }, - "require-dev": { - "composer/composer": "^1.6.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Fxp\\Composer\\AssetPlugin\\FxpAssetPlugin", - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "psr-4": { - "Fxp\\Composer\\AssetPlugin\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "François Pluchino", - "email": "francois.pluchino@gmail.com" - } - ], - "description": "NPM/Bower Dependency Manager for Composer", - "homepage": "https://github.com/fxpio/composer-asset-plugin", - "keywords": [ - "asset", - "bower", - "composer", - "dependency manager", - "nodejs", - "npm", - "package" - ], - "time": "2019-05-01T11:47:39+00:00" - }, { "name": "gettext/gettext", "version": "v4.8.2", From fdef749794d6afefc7b5bc4f9c93dbcf18aaa50b Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 11 Aug 2021 15:38:06 +0200 Subject: [PATCH 18/30] update jquery-ui to 1.12.1 --- composer.json | 2 +- composer.lock | 30 +++++++++++++----------------- doc/ldif2sql.php | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 18 deletions(-) create mode 100755 doc/ldif2sql.php diff --git a/composer.json b/composer.json index 5560096aeb..1c9b8ea706 100644 --- a/composer.json +++ b/composer.json @@ -77,7 +77,7 @@ "bower-asset/fastclick": "1.0.*", "bower-asset/jquery": "^1.12.4", "bower-asset/jquery-touchswipe": "1.6.*", - "bower-asset/jquery-ui": "=1.11.2", + "bower-asset/jquery-ui": "=1.12.1", "egroupware/activesync": "self.version", "egroupware/adodb-php": "self.version", "egroupware/bookmarks": "self.version", diff --git a/composer.lock b/composer.lock index d7cebdb09e..52b1282068 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ecdc3fddca0c9dcad5155d7aad711dab", + "content-hash": "239bd7fe0d55cfccca0e0ce18c8a7503", "packages": [ { "name": "adldap2/adldap2", @@ -350,27 +350,24 @@ }, { "name": "bower-asset/jquery-ui", - "version": "1.11.2", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/components/jqueryui.git", - "reference": "396781474d936959061271505f506b78398fe6a2" + "reference": "44ecf3794cc56b65954cc19737234a3119d036cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/components/jqueryui/zipball/396781474d936959061271505f506b78398fe6a2", - "reference": "396781474d936959061271505f506b78398fe6a2" + "url": "https://api.github.com/repos/components/jqueryui/zipball/44ecf3794cc56b65954cc19737234a3119d036cc", + "reference": "44ecf3794cc56b65954cc19737234a3119d036cc" }, "require": { "bower-asset/jquery": ">=1.6" }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": [ - "jquery-ui.js" - ], - "bower-asset-ignore": [] - } + "type": "bower-asset", + "license": [ + "MIT" + ] }, { "name": "celtic/lti", @@ -1291,16 +1288,15 @@ "source": { "type": "git", "url": "https://github.com/EGroupware/projectmanager.git", - "reference": "94d182778b2fc04c68c51e295259fa2c09548de3" + "reference": "74f9be3b29e9ece0f68201158863aa058443939a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/EGroupware/projectmanager/zipball/94d182778b2fc04c68c51e295259fa2c09548de3", - "reference": "94d182778b2fc04c68c51e295259fa2c09548de3", + "url": "https://api.github.com/repos/EGroupware/projectmanager/zipball/74f9be3b29e9ece0f68201158863aa058443939a", + "reference": "74f9be3b29e9ece0f68201158863aa058443939a", "shasum": "" }, "require": { - "fxp/composer-asset-plugin": "^1.2.2", "npm-asset/dhtmlx-gantt": "~6.2" }, "type": "egroupware-app", @@ -1324,7 +1320,7 @@ ], "description": "EGroupware project-management application", "homepage": "https://www.egroupware.org/", - "time": "2021-03-30T17:20:21+00:00" + "time": "2021-08-10T22:59:19+00:00" }, { "name": "egroupware/registration", diff --git a/doc/ldif2sql.php b/doc/ldif2sql.php new file mode 100755 index 0000000000..744e7bb832 --- /dev/null +++ b/doc/ldif2sql.php @@ -0,0 +1,36 @@ +#!/usr/bin/env php + Date: Thu, 29 Jul 2021 14:57:10 +0200 Subject: [PATCH 19/30] Remove tab-and-hold jquery plugin and use native touch events to implement something similar --- api/js/egw_action/egw_action_popup.js | 37 +++++++++++++++++++-------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/api/js/egw_action/egw_action_popup.js b/api/js/egw_action/egw_action_popup.js index 3bbf29537b..0d7afaab8e 100644 --- a/api/js/egw_action/egw_action_popup.js +++ b/api/js/egw_action/egw_action_popup.js @@ -12,14 +12,12 @@ /*egw:uses vendor.bower-asset.jquery.dist.jquery; egw_menu; - /api/js/jquery/jquery-tap-and-hold/jquery.tapandhold.js; */ 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 {EGW_KEY_ENTER, EGW_KEY_MENU} from "./egw_action_constants.js"; -import "../jquery/jquery-tap-and-hold/jquery.tapandhold.js"; if (typeof window._egwActionClasses == "undefined") window._egwActionClasses = {}; @@ -280,7 +278,32 @@ export function egwPopupActionImplementation() return false; }; + ai._handleTapHold = function (_node, _callback) + { + let holdTimer = 600; + let maxDistanceAllowed = 40; + let tapTimeout = null; + let startx = 0; + let starty = 0; + _node.addEventListener('touchstart', function(e){ + tapTimeout = setTimeout(function(event){ + _callback(e); + }, holdTimer); + startx = (e.changedTouches) ? e.changedTouches[0].pageX: e.pageX; + starty = (e.changedTouches) ? e.changedTouches[0].pageY: e.pageY; + }); + _node.addEventListener('touchend', function(){ + clearTimeout(tapTimeout); + }); + _node.addEventListener('touchmove', function(_event){ + if (tapTimeout == null) return; + let e = _event.originalEvent; + let x = (e.changedTouches) ? e.changedTouches[0].pageX: e.pageX; + let y = (e.changedTouches) ? e.changedTouches[0].pageY: e.pageY; + if (Math.sqrt((x-startx)*(x-startx) + (y-starty)+(y-starty)) > maxDistanceAllowed) clearTimeout(tapTimeout); + }); + } /** * Registers the handler for the context menu * @@ -292,14 +315,6 @@ export function egwPopupActionImplementation() ai._registerContext = function(_node, _callback, _context) { var contextHandler = function(e) { - if(egwIsMobile()) - { - if (e.originalEvent.which == 3) - { - // Enable onhold trigger till we define a better handler for tree contextmenu - // return; - } - } //Obtain the event object if (!e) @@ -327,7 +342,7 @@ export function egwPopupActionImplementation() }; // Safari still needs the taphold to trigger contextmenu // Chrome has default event on touch and hold which acts like right click - jQuery(_node).bind('taphold', contextHandler); + this._handleTapHold(_node, contextHandler); jQuery(_node).on('contextmenu', contextHandler); }; From af7b1a0fe04cc27cbb0965afedd6eec6584e1d55 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Thu, 29 Jul 2021 15:10:12 +0200 Subject: [PATCH 20/30] Remove the tap-and-hold files --- api/js/jquery/jquery-tap-and-hold/README.txt | 19 --- .../examples/example1.html | 17 --- .../jquery-tap-and-hold/jquery.tapandhold.js | 136 ------------------ 3 files changed, 172 deletions(-) delete mode 100644 api/js/jquery/jquery-tap-and-hold/README.txt delete mode 100644 api/js/jquery/jquery-tap-and-hold/examples/example1.html delete mode 100644 api/js/jquery/jquery-tap-and-hold/jquery.tapandhold.js diff --git a/api/js/jquery/jquery-tap-and-hold/README.txt b/api/js/jquery/jquery-tap-and-hold/README.txt deleted file mode 100644 index 8f30cea8ed..0000000000 --- a/api/js/jquery/jquery-tap-and-hold/README.txt +++ /dev/null @@ -1,19 +0,0 @@ -jQuery - Tap and Hold -===================== - - This jQuery plugin lets you detect a tap and hold event on touch interfaces. - -How to use it? - - 1) Add the jQuery Tap and Hold plugin into your HTML - - - - 2) Bind a tap and hold handler function to the tap and hold event of an element. - - $("#myDiv").bind("taphold", function(event){ - alert("This is a tap and hold!"); - }); - -You can check a working example in examples/example1.html - diff --git a/api/js/jquery/jquery-tap-and-hold/examples/example1.html b/api/js/jquery/jquery-tap-and-hold/examples/example1.html deleted file mode 100644 index 731038c825..0000000000 --- a/api/js/jquery/jquery-tap-and-hold/examples/example1.html +++ /dev/null @@ -1,17 +0,0 @@ - - - jQuery - Tap and Hold - - - - - -
- - \ No newline at end of file diff --git a/api/js/jquery/jquery-tap-and-hold/jquery.tapandhold.js b/api/js/jquery/jquery-tap-and-hold/jquery.tapandhold.js deleted file mode 100644 index b70041d557..0000000000 --- a/api/js/jquery/jquery-tap-and-hold/jquery.tapandhold.js +++ /dev/null @@ -1,136 +0,0 @@ -/** - * Copyright (c) 2011 Zauber S.A. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * @author Guido Marucci Blas - guido@zaubersoftware.com - * @description Adds a handler for a custom event 'taphold' that handles a - * tap and hold on touch interfaces. - */ -(function($) { - var TAP_AND_HOLD_TRIGGER_TIMER = 600; - var MAX_DISTANCE_ALLOWED_IN_TAP_AND_HOLD_EVENT = 40; - var TOUCHSTART = "touchstart"; - var TOUCHEND = "touchend"; - var TOUCHMOVE = "touchmove"; - - // For debugging only - // var TOUCHSTART = "mousedown"; - // var TOUCHEND = "mouseup"; - // var TOUCHMOVE = "mousemove"; - - var tapAndHoldTimer = null; - - function calculateEuclideanDistance(x1, y1, x2, y2) { - var diffX = (x2 - x1); - var diffY = (y2 - y1); - return Math.sqrt((diffX * diffX) + (diffY * diffY)); - }; - - function onTouchStart(event) { - var e = event.originalEvent; - - // Only start detector if and only if one finger is over the widget - if (!e.touches || (e.targetTouches.length === 1 && e.touches.length === 1)) { - startTapAndHoldDetector.call(this, event) - var element = $(this); - element.bind(TOUCHMOVE, onTouchMove); - element.bind(TOUCHEND, onTouchEnd); - } else { - stopTapAndHoldDetector.call(this); - } - }; - - function onTouchMove(event) { - if (tapAndHoldTimer == null) { - return; - } - - var e = event.originalEvent; - var x = (e.changedTouches) ? e.changedTouches[0].pageX: e.pageX; - var y = (e.changedTouches) ? e.changedTouches[0].pageY: e.pageY; - - var tapAndHoldPoint = $(this).data("taphold.point"); - var euclideanDistance = calculateEuclideanDistance(tapAndHoldPoint.x, tapAndHoldPoint.y, x, y); - - if (euclideanDistance > MAX_DISTANCE_ALLOWED_IN_TAP_AND_HOLD_EVENT) { - stopTapAndHoldDetector.call(this); - } - }; - - function onTouchEnd(event) { - stopTapAndHoldDetector.call(this); - }; - - function onTapAndHold(event) { - clear.call(this); - $(this).data("taphold.handler").call(this, event); - }; - - function clear() { - tapAndHoldTimer = null; - $(this).unbind(TOUCHMOVE, onTouchMove); - $(this).unbind(TOUCHEND, onTouchEnd); - }; - - function startTapAndHoldDetector(event) { - if (tapAndHoldTimer != null) { - return; - } - var self = this; - tapAndHoldTimer = setTimeout(function(){ - onTapAndHold.call(self, event) - }, TAP_AND_HOLD_TRIGGER_TIMER); - - // Stores tap x & y - var e = event.originalEvent; - var tapAndHoldPoint = {}; - tapAndHoldPoint.x = (e.changedTouches) ? e.changedTouches[0].pageX: e.pageX; - tapAndHoldPoint.y = (e.changedTouches) ? e.changedTouches[0].pageY: e.pageY; - $(this).data("taphold.point", tapAndHoldPoint); - }; - - function stopTapAndHoldDetector() { - clearTimeout(tapAndHoldTimer); - clear.call(this); - }; - - $.event.special["taphold"] = { - setup: function() { - - }, - - add: function(handleObj) { - $(this).data("taphold.handler", handleObj.handler); - if (handleObj.data) { - $(this).bind(TOUCHSTART, handleObj.data, onTouchStart); - } else { - $(this).bind(TOUCHSTART, onTouchStart); - } - }, - - remove: function(handleObj) { - stopTapAndHoldDetector.call(this); - if (handleObj.data) { - $(this).unbind(TOUCHSTART, handleObj.data, onTouchStart); - } else { - $(this).unbind(TOUCHSTART, onTouchStart); - } - }, - - teardown: function() { - - } - }; - -})(jQuery); From a63416f6d64d3165cf81f22adbbfd8ba9733adb4 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Mon, 2 Aug 2021 15:36:52 +0200 Subject: [PATCH 21/30] Get fw sidebox sortable items working with sortablejs and removes the jquery.sortable --- api/js/framework/fw_desktop.js | 57 +++++----------------------------- package-lock.json | 16 +++++++++- package.json | 3 +- 3 files changed, 25 insertions(+), 51 deletions(-) diff --git a/api/js/framework/fw_desktop.js b/api/js/framework/fw_desktop.js index cbe4fbe234..0a4221d673 100644 --- a/api/js/framework/fw_desktop.js +++ b/api/js/framework/fw_desktop.js @@ -25,7 +25,7 @@ import './fw_browser.js'; import './fw_ui.js'; import './fw_classes.js'; import '../jsapi/egw_inheritance.js'; - +import "sortablejs/Sortable.min.js"; /** * * @param {DOMWindow} window @@ -48,31 +48,15 @@ import '../jsapi/egw_inheritance.js'; init: function() { this._super.apply(this,arguments); - + let self = this; this.setBottomLine(this.parent.entries); - //Make the base Div sortable. Set all elements with the style "egw_fw_ui_sidemenu_entry_header" - //as handle - if(jQuery(this.elemDiv).data('uiSortable')) - { - jQuery(this.elemDiv).sortable("destroy"); - } - jQuery(this.elemDiv).sortable({ - handle: ".egw_fw_ui_sidemenu_entry_header", - distance: 15, - start: function(event, ui) - { - var parent = ui.item.context._parent; - parent.isDraged = true; - parent.parent.startDrag.call(parent.parent); + + Sortable.create(this.elemDiv,{ + onSort: function (evt) { + self.parent.isDraged = true; + self.parent.refreshSort(); }, - stop: function(event, ui) - { - var parent = ui.item.context._parent; - parent.parent.stopDrag.call(parent.parent); - parent.parent.refreshSort.call(parent.parent); - }, - opacity: 0.7, - axis: 'y' + direction: 'vertical' }); }, @@ -107,31 +91,6 @@ import '../jsapi/egw_inheritance.js'; this._super.apply(this,arguments); this.sortCallback = _sortCallback; }, - /** - * - * @returns {undefined} - */ - startDrag: function() - { - if (this.activeEntry) - { - jQuery(this.activeEntry.marker).show(); - jQuery(this.elemDiv).sortable("refresh"); - } - }, - - /** - * - * @returns {undefined} - */ - stopDrag: function() - { - if (this.activeEntry) - { - jQuery(this.activeEntry.marker).hide(); - jQuery(this.elemDiv).sortable("refresh"); - } - }, /** * Called by the sidemenu elements whenever they were sorted. An array containing diff --git a/package-lock.json b/package-lock.json index c36d023484..bcfcdff54b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "carbon-components": "^10.37.0", "carbon-web-components": "^1.14.1", "lit-element": "^2.5.1", - "lit-html": "^1.4.1" + "lit-html": "^1.4.1", + "sortablejs": "^1.14.0" }, "devDependencies": { "@babel/core": "^7.14.6", @@ -31,6 +32,9 @@ "rollup-plugin-terser": "^7.0.2", "terser": "^4.8.0", "typescript": "^3.9.7" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/@babel/code-frame": { @@ -2994,6 +2998,11 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -5704,6 +5713,11 @@ "is-arrayish": "^0.3.1" } }, + "sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", diff --git a/package.json b/package.json index 56ddc5b4d5..468845934b 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,8 @@ "carbon-components": "^10.37.0", "carbon-web-components": "^1.14.1", "lit-element": "^2.5.1", - "lit-html": "^1.4.1" + "lit-html": "^1.4.1", + "sortablejs": "^1.14.0" }, "engines": { "node": ">=14.0.0" From 5777ebeb7597e4a9ee3856bb6f9052f34ba0bd91 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Tue, 3 Aug 2021 15:59:22 +0200 Subject: [PATCH 22/30] Get et2_grid sortable working with sortablejs --- api/js/etemplate/et2_widget_grid.ts | 89 ++++++++++++++--------------- 1 file changed, 44 insertions(+), 45 deletions(-) diff --git a/api/js/etemplate/et2_widget_grid.ts b/api/js/etemplate/et2_widget_grid.ts index f265f5bbce..19b2e9d1d1 100644 --- a/api/js/etemplate/et2_widget_grid.ts +++ b/api/js/etemplate/et2_widget_grid.ts @@ -117,6 +117,7 @@ export class et2_grid extends et2_DOMWidget implements et2_IDetachedDOM, et2_IAl private wrapper = null; private lastRowNode: null; + private sortablejs : Sortable = null; /** * Constructor * @@ -943,56 +944,54 @@ export class et2_grid extends et2_DOMWidget implements et2_IDetachedDOM, et2_IAl */ set_sortable(sortable: boolean | Function) { - const $node = jQuery(this.getDOMNode()); - if(!sortable) + const self = this; + let tbody = this.getDOMNode().getElementsByTagName('tbody')[0]; + + if(!sortable && this.sortablejs) { - $node.sortable("destroy"); + this.sortablejs.destroy(); return; } - // Make sure rows have IDs, so sortable has something to return - jQuery('tr', this.tbody).each(function(index) { - const $this = jQuery(this); - - // Header does not participate in sorting - if($this.hasClass('th')) return; - - // If row doesn't have an ID, assign the index as ID - if(!$this.attr("id")) $this.attr("id", index); - }); - - const self = this; - - // Set up sortable - $node.sortable({ - // Header does not participate in sorting - items: "> tbody > tr:not(.th)", - distance: 15, - cancel: this.options.sortable_cancel, - placeholder: this.options.sortable_placeholder, - containment: this.options.sortable_containment, - connectWith: this.options.sortable_connectWith, - update: function(event, ui) { - self.egw().json(sortable,[ - self.getInstanceManager().etemplate_exec_id, - $node.sortable("toArray"), - self.id], - null, - self, - true - ).sendRequest(); - }, - receive: function (event, ui) { - if (typeof self.sortable_recieveCallback == 'function') { - self.sortable_recieveCallback.call(self, event, ui, self.id); - } - }, - start: function (event, ui) { - if (typeof self.options.sortable_startCallback == 'function') { - self.options.sortable_startCallback.call(self, event, ui, self.id); - } + for (let i =0; i < tbody.children.length; i++) + { + if (!tbody.children[i].classList.contains('th') && !tbody.children[i].id) + { + tbody.children[i].setAttribute('id', i.toString()); } - }); + } + + + //todo: fix the sortable import statement + import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ + this.sortablejs = new Sortable(tbody,{ + group: this.options.sortable_connectWith, + draggable: "tr:not(.th)", + filter: this.options.sortable_cancel, + ghostClass: this.options.sortable_placeholder, + dataIdAttr: 'id', + onAdd:function (event) { + if (typeof self.options.sortable_recieveCallback == 'function') { + self.options.sortable_recieveCallback.call(self, event, this, self.id); + } + }, + onStart: function (event, ui) { + if (typeof self.options.sortable_startCallback == 'function') { + self.options.sortable_startCallback.call(self, event, this, self.id); + } + }, + onSort: function (event) { + self.egw().json(sortable,[ + self.getInstanceManager().etemplate_exec_id, + self.sortablejs.toArray(), + self.id], + null, + self, + true + ).sendRequest(); + }, + }); + }.bind(this)); } /** From 572908e3004c189159ca1dc75e89759b5dad9549 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Wed, 4 Aug 2021 11:26:57 +0200 Subject: [PATCH 23/30] Get favorites list sorting working with Sortablejs --- api/js/etemplate/et2_widget_favorites.ts | 34 +++++++++++++----------- api/js/jsapi/egw_app.ts | 33 ++++++++--------------- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/api/js/etemplate/et2_widget_favorites.ts b/api/js/etemplate/et2_widget_favorites.ts index e4a304c017..844a148138 100644 --- a/api/js/etemplate/et2_widget_favorites.ts +++ b/api/js/etemplate/et2_widget_favorites.ts @@ -177,21 +177,25 @@ export class et2_favorites extends et2_dropdown_button implements et2_INextmatch } }; - //Add Sortable handler to nm fav. menu - jQuery(this.menu).sortable({ - - items:'li:not([data-id$="add"])', - placeholder:'ui-fav-sortable-placeholder', - delay: 250, //(millisecond) delay before the sorting should start - update: function () - { - self.favSortedList = jQuery(this).sortable('toArray', {attribute:'data-id'}); - - self.egw().set_preference(self.options.app,'fav_sort_pref',self.favSortedList); - - sideBoxDOMNodeSort(self.favSortedList); - } - }); + //todo (@todo-jquery-ui): replace the import statement + /** + * todo (@todo-jquery-ui): the sorting does not work at the moment becuase of jquery-ui menu being used in order to create dropdown + * buttons menu. Once we replace the et2_widget_dropdown_button with web component this should be adapted + * and working again. + **/ + import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ + let sortablejs = Sortable.create(this.menu[0], { + ghostClass: 'ui-fav-sortable-placeholder', + draggable: 'li:not([data-id$="add"])', + delay: 25, + dataIdAttr:'data-id', + onSort: function(event){ + self.favSortedList = sortablejs.toArray(); + self.egw.set_preference(self.options.app,'fav_sort_pref', self.favSortedList ); + sideBoxDOMNodeSort(self.favSortedList); + } + }); + }.bind(this)); // Add a listener on the delete to remove this.menu.on("click","div.ui-icon-trash", app[self.options.app], function() { diff --git a/api/js/jsapi/egw_app.ts b/api/js/jsapi/egw_app.ts index 0e425e4cbd..ff796750c3 100644 --- a/api/js/jsapi/egw_app.ts +++ b/api/js/jsapi/egw_app.ts @@ -781,32 +781,21 @@ export abstract class EgwApp }) .addClass("ui-helper-clearfix"); - //Add Sortable handler to sideBox fav. menu - jQuery('ul','#favorite_sidebox_'+this.appname).sortable({ - items:'li:not([data-id$="add"])', - placeholder:'ui-fav-sortable-placeholder', - delay:250, //(millisecond) delay before the sorting should start - helper: function(event, item : any) { - // We'll need to know which app this is for - item.attr('data-appname',self.appname); - // Create custom helper so it can be dragged to Home - var h_parent = item.parent().parent().clone(); - h_parent.find('li').not('[data-id="'+item.attr('data-id')+'"]').remove(); - h_parent.appendTo('body'); - return h_parent; - }, - // @ts-ignore - refreshPositions: true, - update: function (event, ui) - { - // @ts-ignore - var favSortedList = jQuery(this).sortable('toArray', {attribute:'data-id'}); - + //todo (@todo-jquery-ui): replace the import statement + import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ + let el = document.getElementById('favorite_sidebox_'+this.appname).getElementsByTagName('ul')[0]; + let sortablejs = Sortable.create(el, { + ghostClass: 'ui-fav-sortable-placeholder', + draggable: 'li:not([data-id$="add"])', + delay: 25, + dataIdAttr:'data-id', + onSort: function(event){ + let favSortedList = sortablejs.toArray(); self.egw.set_preference(self.appname,'fav_sort_pref',favSortedList); - self._refresh_fav_nm(); } }); + }.bind(this)); // Bind favorite de-select var egw_fw = egw_getFramework(); From af2a2a016e005ffbe17e91746555683a0c6ca88e Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Wed, 4 Aug 2021 11:50:43 +0200 Subject: [PATCH 24/30] Fix broken widget tree actions because of unexpected DOM Element object --- api/js/egw_action/egw_action_popup.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api/js/egw_action/egw_action_popup.js b/api/js/egw_action/egw_action_popup.js index 0d7afaab8e..a697f317b9 100644 --- a/api/js/egw_action/egw_action_popup.js +++ b/api/js/egw_action/egw_action_popup.js @@ -285,6 +285,13 @@ export function egwPopupActionImplementation() let tapTimeout = null; let startx = 0; let starty = 0; + + //TODO (todo-jquery): ATM we need to convert the possible given jquery dom node object into DOM Element, this + // should be no longer neccessary after removing jQuery nodes. + if (_node instanceof jQuery) + { + _node = _node[0]; + } _node.addEventListener('touchstart', function(e){ tapTimeout = setTimeout(function(event){ From 8743bf64b08fff56e07b330ec9dfa03bc7282f1c Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Wed, 4 Aug 2021 14:48:02 +0200 Subject: [PATCH 25/30] Replace nm column jquery-ui sorting with sortablejs --- api/js/etemplate/et2_extension_nextmatch.ts | 37 ++++++++------------- api/js/etemplate/et2_widget_grid.ts | 2 +- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/api/js/etemplate/et2_extension_nextmatch.ts b/api/js/etemplate/et2_extension_nextmatch.ts index f62c874693..a69622ff3d 100644 --- a/api/js/etemplate/et2_extension_nextmatch.ts +++ b/api/js/etemplate/et2_extension_nextmatch.ts @@ -2078,30 +2078,19 @@ export class et2_nextmatch extends et2_DOMWidget implements et2_IResizeable, et2 self.selectPopup = null; }; const $select = jQuery(select.getDOMNode()); - $select.find('.ui-multiselect-checkboxes').sortable({ - placeholder:'ui-fav-sortable-placeholder', - items:'li[class^="selcolumn_sortable_col"]', - cancel: 'li[class^="selcolumn_sortable_#"]', - cursor: "move", - tolerance: "pointer", - axis: 'y', - containment: "parent", - delay: 250, //(millisecond) delay before the sorting should start - beforeStop: function(event, ui) { - jQuery('li[class^="selcolumn_sortable_#"]', this).css({ - opacity: 1 - }); - }, - start: function(event, ui){ - jQuery('li[class^="selcolumn_sortable_#"]', this).css({ - opacity: 0.5 - }); - }, - sort: function (event, ui) - { - jQuery( this ).sortable("refreshPositions" ); - } - }); + + //todo (todo-jquery-ui): fix the sortable import statement + import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ + let sortablejs = Sortable.create(select.getDOMNode().getElementsByClassName('ui-multiselect-checkboxes')[0], { + ghostClass: 'ui-fav-sortable-placeholder', + draggable: 'li[class^="selcolumn_sortable_col"]', + filter: 'li[class^="selcolumn_sortable_#"]', + direction: 'vertical', + delay: 25, + + }); + }.bind(this)); + $select.disableSelection(); $select.find('li[class^="selcolumn_sortable_"]').each(function(i,v){ // @ts-ignore diff --git a/api/js/etemplate/et2_widget_grid.ts b/api/js/etemplate/et2_widget_grid.ts index 19b2e9d1d1..0ef49a4b9d 100644 --- a/api/js/etemplate/et2_widget_grid.ts +++ b/api/js/etemplate/et2_widget_grid.ts @@ -962,7 +962,7 @@ export class et2_grid extends et2_DOMWidget implements et2_IDetachedDOM, et2_IAl } - //todo: fix the sortable import statement + //todo (todo-jquery-ui): fix the sortable import statement import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ this.sortablejs = new Sortable(tbody,{ group: this.options.sortable_connectWith, From 23c27659fc70cd5a06c2ca00dd0dab59c6052d74 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Wed, 4 Aug 2021 16:49:44 +0200 Subject: [PATCH 26/30] Fix broken styling of sidebox app lists --- api/js/framework/fw_desktop.js | 1 + 1 file changed, 1 insertion(+) diff --git a/api/js/framework/fw_desktop.js b/api/js/framework/fw_desktop.js index 0a4221d673..4326852ec7 100644 --- a/api/js/framework/fw_desktop.js +++ b/api/js/framework/fw_desktop.js @@ -51,6 +51,7 @@ import "sortablejs/Sortable.min.js"; let self = this; this.setBottomLine(this.parent.entries); + this.elemDiv.classList.add('ui-sortable') Sortable.create(this.elemDiv,{ onSort: function (evt) { self.parent.isDraged = true; From 72699fad30ad76b85ecc3459303ecb7d009dfe6d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 11 Aug 2021 19:28:01 +0200 Subject: [PATCH 27/30] fix ESM module import (no currly brackets) as suggested by Guy Bedford --- api/js/etemplate/et2_extension_nextmatch.ts | 19 +++---- api/js/etemplate/et2_widget_favorites.ts | 26 +++++---- api/js/etemplate/et2_widget_grid.ts | 59 ++++++++++----------- api/js/jsapi/egw_app.ts | 28 +++++----- 4 files changed, 61 insertions(+), 71 deletions(-) diff --git a/api/js/etemplate/et2_extension_nextmatch.ts b/api/js/etemplate/et2_extension_nextmatch.ts index a69622ff3d..66acfc7be1 100644 --- a/api/js/etemplate/et2_extension_nextmatch.ts +++ b/api/js/etemplate/et2_extension_nextmatch.ts @@ -67,6 +67,7 @@ import {et2_template} from "./et2_widget_template"; import {egw} from "../jsapi/egw_global"; import {et2_compileLegacyJS} from "./et2_core_legacyJSFunctions"; import {egwIsMobile} from "../egw_action/egw_action_common.js"; +import Sortable from 'sortablejs/modular/sortable.complete.esm.js'; //import {et2_selectAccount} from "./et2_widget_SelectAccount"; @@ -2079,17 +2080,13 @@ export class et2_nextmatch extends et2_DOMWidget implements et2_IResizeable, et2 }; const $select = jQuery(select.getDOMNode()); - //todo (todo-jquery-ui): fix the sortable import statement - import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ - let sortablejs = Sortable.create(select.getDOMNode().getElementsByClassName('ui-multiselect-checkboxes')[0], { - ghostClass: 'ui-fav-sortable-placeholder', - draggable: 'li[class^="selcolumn_sortable_col"]', - filter: 'li[class^="selcolumn_sortable_#"]', - direction: 'vertical', - delay: 25, - - }); - }.bind(this)); + let sortablejs = Sortable.create(select.getDOMNode().getElementsByClassName('ui-multiselect-checkboxes')[0], { + ghostClass: 'ui-fav-sortable-placeholder', + draggable: 'li[class^="selcolumn_sortable_col"]', + filter: 'li[class^="selcolumn_sortable_#"]', + direction: 'vertical', + delay: 25, + }); $select.disableSelection(); $select.find('li[class^="selcolumn_sortable_"]').each(function(i,v){ diff --git a/api/js/etemplate/et2_widget_favorites.ts b/api/js/etemplate/et2_widget_favorites.ts index 844a148138..2a993e65d8 100644 --- a/api/js/etemplate/et2_widget_favorites.ts +++ b/api/js/etemplate/et2_widget_favorites.ts @@ -19,6 +19,7 @@ import {et2_INextmatchHeader} from "./et2_extension_nextmatch"; import {et2_dropdown_button} from "./et2_widget_dropdown_button"; import {ClassWithAttributes} from "./et2_core_inheritance"; import {egw, egw_getFramework} from "../jsapi/egw_global"; +import Sortable from 'sortablejs/modular/sortable.complete.esm.js'; /** * Favorites widget, designed for use with a nextmatch widget @@ -177,25 +178,22 @@ export class et2_favorites extends et2_dropdown_button implements et2_INextmatch } }; - //todo (@todo-jquery-ui): replace the import statement /** * todo (@todo-jquery-ui): the sorting does not work at the moment becuase of jquery-ui menu being used in order to create dropdown * buttons menu. Once we replace the et2_widget_dropdown_button with web component this should be adapted * and working again. **/ - import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ - let sortablejs = Sortable.create(this.menu[0], { - ghostClass: 'ui-fav-sortable-placeholder', - draggable: 'li:not([data-id$="add"])', - delay: 25, - dataIdAttr:'data-id', - onSort: function(event){ - self.favSortedList = sortablejs.toArray(); - self.egw.set_preference(self.options.app,'fav_sort_pref', self.favSortedList ); - sideBoxDOMNodeSort(self.favSortedList); - } - }); - }.bind(this)); + let sortablejs = Sortable.create(this.menu[0], { + ghostClass: 'ui-fav-sortable-placeholder', + draggable: 'li:not([data-id$="add"])', + delay: 25, + dataIdAttr:'data-id', + onSort: function(event){ + self.favSortedList = sortablejs.toArray(); + self.egw.set_preference(self.options.app,'fav_sort_pref', self.favSortedList ); + sideBoxDOMNodeSort(self.favSortedList); + } + }); // Add a listener on the delete to remove this.menu.on("click","div.ui-icon-trash", app[self.options.app], function() { diff --git a/api/js/etemplate/et2_widget_grid.ts b/api/js/etemplate/et2_widget_grid.ts index 0ef49a4b9d..7c15e5f2c1 100644 --- a/api/js/etemplate/et2_widget_grid.ts +++ b/api/js/etemplate/et2_widget_grid.ts @@ -23,6 +23,7 @@ import {et2_action_object_impl, et2_DOMWidget} from "./et2_core_DOMWidget"; import {egw_getAppObjectManager, egwActionObject} from '../egw_action/egw_action.js'; import {et2_directChildrenByTagName, et2_filteredNodeIterator, et2_readAttrWithDefault} from "./et2_core_xml"; import {egw} from "../jsapi/egw_global"; +import Sortable from 'sortablejs/modular/sortable.complete.esm.js'; /** @@ -961,37 +962,33 @@ export class et2_grid extends et2_DOMWidget implements et2_IDetachedDOM, et2_IAl } } - - //todo (todo-jquery-ui): fix the sortable import statement - import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ - this.sortablejs = new Sortable(tbody,{ - group: this.options.sortable_connectWith, - draggable: "tr:not(.th)", - filter: this.options.sortable_cancel, - ghostClass: this.options.sortable_placeholder, - dataIdAttr: 'id', - onAdd:function (event) { - if (typeof self.options.sortable_recieveCallback == 'function') { - self.options.sortable_recieveCallback.call(self, event, this, self.id); - } - }, - onStart: function (event, ui) { - if (typeof self.options.sortable_startCallback == 'function') { - self.options.sortable_startCallback.call(self, event, this, self.id); - } - }, - onSort: function (event) { - self.egw().json(sortable,[ - self.getInstanceManager().etemplate_exec_id, - self.sortablejs.toArray(), - self.id], - null, - self, - true - ).sendRequest(); - }, - }); - }.bind(this)); + this.sortablejs = new Sortable(tbody,{ + group: this.options.sortable_connectWith, + draggable: "tr:not(.th)", + filter: this.options.sortable_cancel, + ghostClass: this.options.sortable_placeholder, + dataIdAttr: 'id', + onAdd:function (event) { + if (typeof self.options.sortable_recieveCallback == 'function') { + self.options.sortable_recieveCallback.call(self, event, this, self.id); + } + }, + onStart: function (event, ui) { + if (typeof self.options.sortable_startCallback == 'function') { + self.options.sortable_startCallback.call(self, event, this, self.id); + } + }, + onSort: function (event) { + self.egw().json(sortable,[ + self.getInstanceManager().etemplate_exec_id, + self.sortablejs.toArray(), + self.id], + null, + self, + true + ).sendRequest(); + }, + }); } /** diff --git a/api/js/jsapi/egw_app.ts b/api/js/jsapi/egw_app.ts index ff796750c3..b3f0836375 100644 --- a/api/js/jsapi/egw_app.ts +++ b/api/js/jsapi/egw_app.ts @@ -17,6 +17,7 @@ import {et2_dialog} from "../etemplate/et2_widget_dialog"; import {et2_createWidget} from "../etemplate/et2_core_widget"; import {et2_favorites} from "../etemplate/et2_widget_favorites"; import type {IegwAppLocal} from "./egw_global"; +import Sortable from 'sortablejs/modular/sortable.complete.esm.js'; /** * Type for push-message @@ -781,21 +782,18 @@ export abstract class EgwApp }) .addClass("ui-helper-clearfix"); - //todo (@todo-jquery-ui): replace the import statement - import('../../../node_modules/sortablejs/Sortable.min.js').then(function(){ - let el = document.getElementById('favorite_sidebox_'+this.appname).getElementsByTagName('ul')[0]; - let sortablejs = Sortable.create(el, { - ghostClass: 'ui-fav-sortable-placeholder', - draggable: 'li:not([data-id$="add"])', - delay: 25, - dataIdAttr:'data-id', - onSort: function(event){ - let favSortedList = sortablejs.toArray(); - self.egw.set_preference(self.appname,'fav_sort_pref',favSortedList); - self._refresh_fav_nm(); - } - }); - }.bind(this)); + let el = document.getElementById('favorite_sidebox_'+this.appname).getElementsByTagName('ul')[0]; + let sortablejs = Sortable.create(el, { + ghostClass: 'ui-fav-sortable-placeholder', + draggable: 'li:not([data-id$="add"])', + delay: 25, + dataIdAttr:'data-id', + onSort: function(event){ + let favSortedList = sortablejs.toArray(); + self.egw.set_preference(self.appname,'fav_sort_pref',favSortedList); + self._refresh_fav_nm(); + } + }); // Bind favorite de-select var egw_fw = egw_getFramework(); From d07a7ab194adc9ebccb94fe9ced307dbf79cc65f Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Thu, 12 Aug 2021 14:51:38 +0200 Subject: [PATCH 28/30] WIP of replacing bower-asset packages: - Get jquery-ui and touch event plugin working (although still modular import is not possible becuase of a wierd issue with jquery-ui tooltip plugin) - Import timepicker-addon plugin as npm package - Update composer.lock file --- Gruntfile.js | 16 +- api/js/egw_action/egw_action_dragdrop.js | 1 - api/js/etemplate/et2_widget_ajaxSelect.ts | 1 - api/js/jsapi/egw.js | 2 +- api/js/jsapi/egw_calendar.js | 3 - api/src/Framework.php | 6 +- api/src/Framework/Bundle.php | 2 +- calendar/templates/default/app.css | 2 +- calendar/templates/mobile/app.css | 2 +- calendar/templates/pixelegg/app.css | 2 +- composer.json | 1 - composer.lock | 797 ++++++-- package-lock.json | 2182 ++------------------- package.json | 6 +- 14 files changed, 794 insertions(+), 2229 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index f5b77010d7..f456ac6312 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -41,7 +41,7 @@ module.exports = function (grunt) { files: { "pixelegg/css/pixelegg.min.css": [ "api/js/jquery/chosen/chosen.css", - "vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css", + "node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css", "vendor/egroupware/magicsuggest/magicsuggest.css", "api/js/jquery/jquery-ui-timepicker-addon.css", "api/js/jquery/blueimp/css/blueimp-gallery.min.css", @@ -59,7 +59,7 @@ module.exports = function (grunt) { ], "pixelegg/css/mobile.min.css": [ "api/js/jquery/chosen/chosen.css", - "vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css", + "node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css", "vendor/egroupware/magicsuggest/magicsuggest.css", "api/js/jquery/jquery-ui-timepicker-addon.css", "api/js/jquery/blueimp/css/blueimp-gallery.min.css", @@ -77,7 +77,7 @@ module.exports = function (grunt) { ], "pixelegg/mobile/fw_mobile.min.css": [ "api/js/jquery/chosen/chosen.css", - "vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css", + "node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css", "vendor/egroupware/magicsuggest/magicsuggest.css", "api/js/jquery/jquery-ui-timepicker-addon.css", "api/js/jquery/blueimp/css/blueimp-gallery.min.css", @@ -94,7 +94,7 @@ module.exports = function (grunt) { ], "pixelegg/css/monochrome.min.css": [ "api/js/jquery/chosen/chosen.css", - "vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css", + "node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css", "vendor/egroupware/magicsuggest/magicsuggest.css", "api/js/jquery/jquery-ui-timepicker-addon.css", "api/js/jquery/blueimp/css/blueimp-gallery.min.css", @@ -112,7 +112,7 @@ module.exports = function (grunt) { ], "pixelegg/css/modern.min.css": [ "api/js/jquery/chosen/chosen.css", - "vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css", + "node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css", "vendor/egroupware/magicsuggest/magicsuggest.css", "api/js/jquery/jquery-ui-timepicker-addon.css", "api/js/jquery/blueimp/css/blueimp-gallery.min.css", @@ -134,7 +134,7 @@ module.exports = function (grunt) { files: { "jdots/css/high-contrast.min.css": [ "api/js/jquery/chosen/chosen.css", - "vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css", + "node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css", "vendor/egroupware/magicsuggest/magicsuggest.css", "api/js/jquery/jquery-ui-timepicker-addon.css", "api/js/jquery/blueimp/css/blueimp-gallery.min.css", @@ -155,7 +155,7 @@ module.exports = function (grunt) { ], "jdots/css/jdots.min.css": [ "api/js/jquery/chosen/chosen.css", - "vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css", + "node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css", "vendor/egroupware/magicsuggest/magicsuggest.css", "api/js/jquery/jquery-ui-timepicker-addon.css", "api/js/jquery/blueimp/css/blueimp-gallery.min.css", @@ -175,7 +175,7 @@ module.exports = function (grunt) { ], "jdots/css/orange-green.min.css": [ "api/js/jquery/chosen/chosen.css", - "vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css", + "node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css", "vendor/egroupware/magicsuggest/magicsuggest.css", "api/js/jquery/jquery-ui-timepicker-addon.css", "api/js/jquery/blueimp/css/blueimp-gallery.min.css", diff --git a/api/js/egw_action/egw_action_dragdrop.js b/api/js/egw_action/egw_action_dragdrop.js index e64b6ad0e0..b137f3d54a 100644 --- a/api/js/egw_action/egw_action_dragdrop.js +++ b/api/js/egw_action/egw_action_dragdrop.js @@ -13,7 +13,6 @@ egw_action_common; egw_action_popup; vendor.bower-asset.jquery.dist.jquery; - /vendor/bower-asset/jquery-ui/jquery-ui.js; */ import {egwAction,egwActionImplementation} from "./egw_action.js"; diff --git a/api/js/etemplate/et2_widget_ajaxSelect.ts b/api/js/etemplate/et2_widget_ajaxSelect.ts index 0389e088f7..e6b9cc49bb 100644 --- a/api/js/etemplate/et2_widget_ajaxSelect.ts +++ b/api/js/etemplate/et2_widget_ajaxSelect.ts @@ -12,7 +12,6 @@ /*egw:uses /vendor/bower-asset/jquery/dist/jquery.js; - /vendor/bower-asset/jquery-ui/jquery-ui.js; et2_core_inputWidget; et2_core_valueWidget; */ diff --git a/api/js/jsapi/egw.js b/api/js/jsapi/egw.js index f6fe6127df..248bae94ac 100644 --- a/api/js/jsapi/egw.js +++ b/api/js/jsapi/egw.js @@ -78,7 +78,7 @@ window.app = {classes: {}}; window.egw_appName = egw_script.getAttribute('data-app'); // split includes in legacy js and modules - const legacy_js_regexp = /\/dhtmlx|jquery-ui/; + const legacy_js_regexp = /\/dhtmlx|jquery-ui-dist/; // check if egw object was injected by window open if (typeof window.egw == 'undefined') diff --git a/api/js/jsapi/egw_calendar.js b/api/js/jsapi/egw_calendar.js index 3aec2a3079..a1ba88267a 100644 --- a/api/js/jsapi/egw_calendar.js +++ b/api/js/jsapi/egw_calendar.js @@ -10,7 +10,6 @@ */ /*egw:uses - /vendor/bower-asset/jquery-ui/jquery-ui.js; jquery.jquery-ui-timepicker-addon; egw_core; @@ -19,8 +18,6 @@ egw_css; */ -import "../../../vendor/bower-asset/jquery/dist/jquery.min.js"; -//import "../../../vendor/bower-asset/jquery-ui/jquery-ui.js"; import "../jquery/jquery.noconflict.js"; //import "../jquery/jquery-ui-timepicker-addon.js"; import './egw_core.js'; diff --git a/api/src/Framework.php b/api/src/Framework.php index 74db8d5a58..5d0af42bfc 100644 --- a/api/src/Framework.php +++ b/api/src/Framework.php @@ -1003,7 +1003,7 @@ abstract class Framework extends Framework\Extra self::includeCSS('/api/js/jquery/chosen/chosen.css'); // eTemplate2 uses jQueryUI, so load it first so et2 can override if needed - self::includeCSS("/vendor/bower-asset/jquery-ui/themes/redmond/jquery-ui.css"); + self::includeCSS("/node_modules/jquery-ui-themes/themes/redmond/jquery-ui.css"); // eTemplate2 - load in top so sidebox has styles too self::includeCSS('/api/templates/default/etemplate2.css'); @@ -1074,8 +1074,8 @@ abstract class Framework extends Framework\Extra )); } // manually load old legacy javascript dhtmlx & jQuery-UI via script tag - self::includeJS('/vendor/bower-asset/jquery-ui/jquery-ui.js'); - self::includeJS('/api/js/jquery/jquery-ui-timepicker-addon.js'); + self::includeJS('/node_modules/jquery-ui-dist/jquery-ui.min.js'); + self::includeJS('/node_modules/jquery-ui-timepicker-addon/dist/jquery-ui-timepicker-addon.min.js'); self::includeJS('/api/js/dhtmlxtree/codebase/dhtmlxcommon.js'); self::includeJS('/api/js/dhtmlxMenu/sources/dhtmlxmenu.js'); self::includeJS('/api/js/dhtmlxMenu/sources/ext/dhtmlxmenu_ext.js'); diff --git a/api/src/Framework/Bundle.php b/api/src/Framework/Bundle.php index 7b4d6bda89..1f9ec22404 100644 --- a/api/src/Framework/Bundle.php +++ b/api/src/Framework/Bundle.php @@ -241,7 +241,7 @@ class Bundle // generate api bundle $inc_mgr->include_js_file('/vendor/bower-asset/jquery/dist/jquery.js'); $inc_mgr->include_js_file('/api/js/jquery/jquery.noconflict.js'); - $inc_mgr->include_js_file('/vendor/bower-asset/jquery-ui/jquery-ui.js'); + $inc_mgr->include_js_file('/node_modules/jquery-ui-dist/jquery-ui.min.js'); $inc_mgr->include_js_file('/api/js/jsapi/jsapi.js'); $inc_mgr->include_js_file('/api/js/egw_json.js'); $inc_mgr->include_js_file('/api/js/jsapi/egw.js'); diff --git a/calendar/templates/default/app.css b/calendar/templates/default/app.css index f2cc841130..fd092f0edd 100644 --- a/calendar/templates/default/app.css +++ b/calendar/templates/default/app.css @@ -85,7 +85,7 @@ vertical-align: top; display: inline-block; background-color: transparent; - background-image: url(../../../vendor/bower-asset/jquery-ui/themes/redmond/images/ui-icons_469bdd_256x240.png); + background-image: url(../../../node_modules/jquery-ui-themes/themes/redmond/images/ui-icons_469bdd_256x240.png); border: none; box-shadow: none; } diff --git a/calendar/templates/mobile/app.css b/calendar/templates/mobile/app.css index 396678f40a..c2d1f18cb9 100644 --- a/calendar/templates/mobile/app.css +++ b/calendar/templates/mobile/app.css @@ -107,7 +107,7 @@ vertical-align: top; display: inline-block; background-color: transparent; - background-image: url(../../../vendor/bower-asset/jquery-ui/themes/redmond/images/ui-icons_469bdd_256x240.png); + background-image: url(../../../node_modules/jquery-ui-themes/themes/redmond/images/ui-icons_469bdd_256x240.png); border: none; box-shadow: none; } diff --git a/calendar/templates/pixelegg/app.css b/calendar/templates/pixelegg/app.css index a9c254db7e..78adefc8c3 100755 --- a/calendar/templates/pixelegg/app.css +++ b/calendar/templates/pixelegg/app.css @@ -95,7 +95,7 @@ vertical-align: top; display: inline-block; background-color: transparent; - background-image: url(../../../vendor/bower-asset/jquery-ui/themes/redmond/images/ui-icons_469bdd_256x240.png); + background-image: url(../../../node_modules/jquery-ui-themes/themes/redmond/images/ui-icons_469bdd_256x240.png); border: none; box-shadow: none; } diff --git a/composer.json b/composer.json index 1c9b8ea706..fe7bf8388c 100644 --- a/composer.json +++ b/composer.json @@ -77,7 +77,6 @@ "bower-asset/fastclick": "1.0.*", "bower-asset/jquery": "^1.12.4", "bower-asset/jquery-touchswipe": "1.6.*", - "bower-asset/jquery-ui": "=1.12.1", "egroupware/activesync": "self.version", "egroupware/adodb-php": "self.version", "egroupware/bookmarks": "self.version", diff --git a/composer.lock b/composer.lock index 52b1282068..e3ab293e45 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "239bd7fe0d55cfccca0e0ce18c8a7503", + "content-hash": "248556c07e4f1fd832c970489cdc9a5a", "packages": [ { "name": "adldap2/adldap2", @@ -215,48 +215,9 @@ "url": "https://api.github.com/repos/fengyuanchen/cropper/zipball/30c58b29ee21010e17e58ebab165fbd84285c685", "reference": "30c58b29ee21010e17e58ebab165fbd84285c685" }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": [ - "dist/cropper.js", - "dist/cropper.css" - ], - "bower-asset-ignore": [ - "**/.*", - "node_modules", - "bower_components", - "tests", - "test", - "examples", - "assets", - "demo", - "docs", - "gulpfile.js", - "CONTRIBUTING.md", - "ISSUE_TEMPLATE.md" - ] - }, + "type": "bower-asset", "license": [ "MIT" - ], - "description": "A simple jQuery image cropping plugin.", - "keywords": [ - "crop", - "cropper", - "cropping", - "css", - "development", - "front-end", - "html", - "image", - "javascript", - "jquery", - "move", - "plugin", - "rotate", - "scale", - "web", - "zoom" ] }, { @@ -272,7 +233,7 @@ "url": "https://api.github.com/repos/rtfpessoa/diff2html/zipball/4c15a9ca93e50c78f8d02e37273076994888d499", "reference": "4c15a9ca93e50c78f8d02e37273076994888d499" }, - "type": "bower-asset-library" + "type": "bower-asset" }, { "name": "bower-asset/fastclick", @@ -287,18 +248,7 @@ "url": "https://api.github.com/repos/ftlabs/fastclick/zipball/9977a916739360ad4ffd7aa19b0016bf375e934b", "reference": "9977a916739360ad4ffd7aa19b0016bf375e934b" }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "lib/fastclick.js", - "bower-asset-ignore": [ - "**/.*", - "component.json", - "package.json", - "Makefile", - "tests", - "examples" - ] - } + "type": "bower-asset" }, { "name": "bower-asset/jquery", @@ -313,21 +263,9 @@ "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/5e89585e0121e72ff47de177c5ef604f3089a53d", "reference": "5e89585e0121e72ff47de177c5ef604f3089a53d" }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "dist/jquery.js", - "bower-asset-ignore": [ - "package.json" - ] - }, + "type": "bower-asset", "license": [ "MIT" - ], - "keywords": [ - "browser", - "javascript", - "jquery", - "library" ] }, { @@ -343,31 +281,7 @@ "url": "https://api.github.com/repos/mattbryson/TouchSwipe-Jquery-Plugin/zipball/f0d71bf645779358e1458e212102c5d59b7702ec", "reference": "f0d71bf645779358e1458e212102c5d59b7702ec" }, - "type": "bower-asset-library", - "extra": { - "bower-asset-main": "./jquery.touchSwipe.js" - } - }, - { - "name": "bower-asset/jquery-ui", - "version": "1.12.1", - "source": { - "type": "git", - "url": "https://github.com/components/jqueryui.git", - "reference": "44ecf3794cc56b65954cc19737234a3119d036cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/components/jqueryui/zipball/44ecf3794cc56b65954cc19737234a3119d036cc", - "reference": "44ecf3794cc56b65954cc19737234a3119d036cc" - }, - "require": { - "bower-asset/jquery": ">=1.6" - }, - "type": "bower-asset", - "license": [ - "MIT" - ] + "type": "bower-asset" }, { "name": "celtic/lti", @@ -1080,12 +994,12 @@ { "name": "Chuck Hagenbuch", "email": "chuck@horde.org", - "role": "lead" + "role": "Lead" }, { "name": "Jan Schneider", "email": "jan@horde.org", - "role": "lead" + "role": "Lead" }, { "name": "Michael J Rubinsky", @@ -1199,7 +1113,7 @@ ], "description": "Compiled version of magicsuggest customized for EGroupware project.", "homepage": "https://github.com/EGroupware/magicsuggest", - "time": "2018-06-21T10:14:03+00:00" + "time": "2018-06-21T13:36:37+00:00" }, { "name": "egroupware/news_admin", @@ -2155,6 +2069,16 @@ "JWS", "jwt" ], + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], "time": "2021-02-16T09:40:01+00:00" }, { @@ -2413,112 +2337,36 @@ "version": "1.0.8", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/as-jqplot/-/as-jqplot-1.0.8.tgz", - "shasum": "97061e0f32167597b87c98dfd42c93f10a2fb249" - }, - "type": "npm-asset-library", - "extra": { - "npm-asset-main": "index.js", - "npm-asset-directories": [], - "npm-asset-scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - } + "url": "https://registry.npmjs.org/as-jqplot/-/as-jqplot-1.0.8.tgz" }, + "type": "npm-asset", "license": [ "ISC" - ], - "authors": [ - "" - ], - "description": "AS jqPlot Shim" + ] }, { "name": "npm-asset/dhtmlx-gantt", "version": "6.2.7", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/dhtmlx-gantt/-/dhtmlx-gantt-6.2.7.tgz", - "shasum": "86689f36c1f10e2bfaa5126445b4c560d82b4587" - }, - "type": "npm-asset-library", - "extra": { - "npm-asset-bugs": { - "url": "https://github.com/DHTMLX/gantt/issues" - }, - "npm-asset-main": "codebase/dhtmlxgantt.js", - "npm-asset-directories": [], - "npm-asset-repository": { - "type": "git", - "url": "git+https://github.com/DHTMLX/gantt.git" - } + "url": "https://registry.npmjs.org/dhtmlx-gantt/-/dhtmlx-gantt-6.2.7.tgz" }, + "type": "npm-asset", "license": [ "GPL-2.0" - ], - "authors": [ - { - "name": "DHTMLX" - } - ], - "description": "An open source JavaScript Gantt chart that helps you illustrate a project schedule in a nice-looking chart.", - "homepage": "https://github.com/DHTMLX/gantt#readme", - "keywords": [ - "browser", - "calendar", - "chart", - "dhtmlx", - "dhtmlxgantt", - "gantt", - "gantt chart", - "scheduler", - "timeline" - ], - "time": "2019-10-11T10:48:39+00:00" + ] }, { "name": "npm-asset/gridster", "version": "0.5.6", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/gridster/-/gridster-0.5.6.tgz", - "shasum": "4024713aabd559093a72e9b713f1e41f9bded76f" + "url": "https://registry.npmjs.org/gridster/-/gridster-0.5.6.tgz" }, "require": { "npm-asset/jquery": "2.0.3" }, - "require-dev": { - "npm-asset/bower": "~0.9.2", - "npm-asset/grunt": "~0.4.1", - "npm-asset/grunt-bump": "0.0.11", - "npm-asset/grunt-contrib-concat": "~0.1.3", - "npm-asset/grunt-contrib-cssmin": "~0.5.0", - "npm-asset/grunt-contrib-jshint": "~0.3.0", - "npm-asset/grunt-contrib-uglify": "~0.2.0", - "npm-asset/grunt-contrib-watch": "~0.3.1", - "npm-asset/grunt-contrib-yuidoc": "~0.4.0", - "npm-asset/grunt-conventional-changelog": "~1.0.0", - "npm-asset/qunitjs": "~1.11.0" - }, - "type": "npm-asset-library", - "extra": { - "npm-asset-bugs": { - "url": "https://github.com/ducksboard/gridster.js/issues" - }, - "npm-asset-directories": [], - "npm-asset-repository": { - "type": "git", - "url": "git://github.com/ducksboard/gridster.js.git" - }, - "npm-asset-scripts": [] - }, - "authors": [ - { - "name": "ducksboard", - "email": "hackers@ducksboard.com" - } - ], - "description": "a drag-and-drop multi-column jQuery grid plugin", - "homepage": "http://gridster.net/" + "type": "npm-asset" }, { "name": "npm-asset/jquery", @@ -2533,36 +2381,7 @@ "url": "https://api.github.com/repos/jquery/jquery/zipball/f852e631ba85af7da4ad7594785e122504e7b233", "reference": "f852e631ba85af7da4ad7594785e122504e7b233" }, - "require-dev": { - "npm-asset/archiver": "~0.4.2", - "npm-asset/grunt": "0.4.1", - "npm-asset/grunt-compare-size": "~0.4.0", - "npm-asset/grunt-contrib-jshint": "0.3.0", - "npm-asset/grunt-contrib-uglify": "0.2.0", - "npm-asset/grunt-contrib-watch": "0.3.1", - "npm-asset/grunt-git-authors": "1.2.0", - "npm-asset/grunt-update-submodules": "0.2.0", - "npm-asset/gzip-js": "0.3.1", - "npm-asset/testswarm": "~1.1.0" - }, - "type": "npm-asset-library", - "extra": { - "npm-asset-bugs": { - "url": "http://bugs.jquery.com" - }, - "npm-asset-repository": { - "type": "git", - "url": "https://github.com/jquery/jquery.git" - } - }, - "authors": [ - { - "name": "jQuery Foundation and other contributors", - "url": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt" - } - ], - "description": "JavaScript library for DOM operations", - "homepage": "http://jquery.com" + "type": "npm-asset" }, { "name": "oomphinc/composer-installers-extender", @@ -4157,6 +3976,12 @@ } ], "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], "time": "2021-06-16T14:33:43+00:00" }, { @@ -4248,6 +4073,20 @@ "x.509", "x509" ], + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], "time": "2021-04-06T13:56:45+00:00" }, { @@ -6528,6 +6367,20 @@ "caching", "psr6" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-03-16T09:10:13+00:00" }, { @@ -6590,6 +6443,20 @@ "interoperability", "standards" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-03-23T23:28:01+00:00" }, { @@ -6654,6 +6521,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-03-27T16:54:36+00:00" }, { @@ -6726,6 +6607,20 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-03-26T09:23:24+00:00" }, { @@ -6783,6 +6678,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-08-10T07:47:39+00:00" }, { @@ -6856,6 +6765,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-03-30T10:09:30+00:00" }, { @@ -6913,6 +6836,20 @@ ], "description": "Symfony ErrorHandler Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-08-17T09:56:45+00:00" }, { @@ -6983,6 +6920,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-08-13T14:18:44+00:00" }, { @@ -7045,6 +6996,20 @@ "interoperability", "standards" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-06T13:19:58+00:00" }, { @@ -7095,6 +7060,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-03-27T16:54:36+00:00" }, { @@ -7139,6 +7118,20 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-02-15T18:55:04+00:00" }, { @@ -7265,6 +7258,20 @@ ], "description": "Symfony FrameworkBundle", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-12-11T16:32:02+00:00" }, { @@ -7320,6 +7327,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-08-17T07:39:58+00:00" }, { @@ -7411,6 +7432,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-09-02T08:09:29+00:00" }, { @@ -7473,6 +7508,20 @@ "mime", "mime-type" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-08-17T09:56:45+00:00" }, { @@ -7535,6 +7584,20 @@ "polyfill", "portable" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -7606,6 +7669,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-08-04T06:02:08+00:00" }, { @@ -7673,6 +7750,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-14T12:35:20+00:00" }, { @@ -7736,6 +7827,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-14T12:35:20+00:00" }, { @@ -7855,6 +7960,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-14T12:35:20+00:00" }, { @@ -7914,6 +8033,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-14T12:35:20+00:00" }, { @@ -7976,6 +8109,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-14T12:35:20+00:00" }, { @@ -8042,6 +8189,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-14T12:35:20+00:00" }, { @@ -8170,6 +8331,20 @@ "uri", "url" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-03-30T11:41:10+00:00" }, { @@ -8305,6 +8480,20 @@ "debug", "dump" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-08-17T07:31:35+00:00" }, { @@ -8361,6 +8550,20 @@ "instantiate", "serialize" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T10:01:46+00:00" }, { @@ -8420,6 +8623,20 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-03-30T11:41:10+00:00" }, { @@ -8757,6 +8974,20 @@ "constructor", "instantiate" ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], "time": "2020-11-10T18:47:58+00:00" }, { @@ -9046,6 +9277,12 @@ "object", "object graph" ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], "time": "2020-11-13T09:40:50+00:00" }, { @@ -9478,6 +9715,12 @@ "testing", "xunit" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2021-03-28T07:26:59+00:00" }, { @@ -9528,6 +9771,12 @@ "filesystem", "iterator" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:57:25+00:00" }, { @@ -9581,6 +9830,12 @@ "keywords": [ "process" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:58:55+00:00" }, { @@ -9630,6 +9885,12 @@ "keywords": [ "template" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T05:33:50+00:00" }, { @@ -9679,6 +9940,12 @@ "keywords": [ "timer" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:16:10+00:00" }, { @@ -9768,6 +10035,16 @@ "testing", "xunit" ], + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-02T03:54:37+00:00" }, { @@ -9854,6 +10131,12 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:08:49+00:00" }, { @@ -9900,6 +10183,12 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:08:54+00:00" }, { @@ -9945,6 +10234,12 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:30:19+00:00" }, { @@ -10009,6 +10304,12 @@ "compare", "equality" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T15:49:45+00:00" }, { @@ -10056,6 +10357,12 @@ ], "description": "Library for calculating the complexity of PHP code units", "homepage": "https://github.com/sebastianbergmann/complexity", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T15:52:27+00:00" }, { @@ -10112,6 +10419,12 @@ "unidiff", "unified diff" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:10:38+00:00" }, { @@ -10165,6 +10478,12 @@ "environment", "hhvm" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:52:38+00:00" }, { @@ -10232,6 +10551,12 @@ "export", "exporter" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:24:23+00:00" }, { @@ -10286,6 +10611,12 @@ "keywords": [ "global state" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T15:55:19+00:00" }, { @@ -10333,6 +10664,12 @@ ], "description": "Library for counting the lines of code in PHP source code", "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-11-28T06:42:11+00:00" }, { @@ -10380,6 +10717,12 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:12:34+00:00" }, { @@ -10425,6 +10768,12 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:14:26+00:00" }, { @@ -10478,6 +10827,12 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:17:30+00:00" }, { @@ -10523,6 +10878,12 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:45:17+00:00" }, { @@ -10569,6 +10930,12 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:18:59+00:00" }, { @@ -10612,6 +10979,12 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:39:44+00:00" }, { @@ -10652,6 +11025,12 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], "time": "2020-07-12T23:59:07+00:00" }, { diff --git a/package-lock.json b/package-lock.json index bcfcdff54b..ca29723f13 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,10 @@ "version": "21.1.20210316", "license": "GPL-2.0", "dependencies": { - "carbon-components": "^10.37.0", - "carbon-web-components": "^1.14.1", + "@andxor/jquery-ui-touch-punch-fix": "^1.0.2", + "jquery-ui-dist": "^1.12.1", + "jquery-ui-themes": "^1.12.0", + "jquery-ui-timepicker-addon": "^1.6.3", "lit-element": "^2.5.1", "lit-html": "^1.4.1", "sortablejs": "^1.14.0" @@ -37,10 +39,19 @@ "node": ">=14.0.0" } }, + "node_modules/@andxor/jquery-ui-touch-punch-fix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@andxor/jquery-ui-touch-punch-fix/-/jquery-ui-touch-punch-fix-1.0.2.tgz", + "integrity": "sha512-hdphePfQOxknA9BympZUtbIsXyogz7TgmKykIJrwjS67F4sIhaQJBhlijjkB4xfgFbHPjcJSr9jer09hDuPnaw==", + "dependencies": { + "jquery-ui": "^1.12.1" + } + }, "node_modules/@babel/code-frame": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, "dependencies": { "@babel/highlight": "^7.14.5" }, @@ -91,6 +102,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, "dependencies": { "@babel/types": "^7.14.5", "jsesc": "^2.5.1", @@ -154,6 +166,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, "dependencies": { "@babel/helper-get-function-arity": "^7.14.5", "@babel/template": "^7.14.5", @@ -167,6 +180,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -178,6 +192,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -280,6 +295,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, "dependencies": { "@babel/types": "^7.14.5" }, @@ -291,6 +307,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -322,6 +339,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -335,6 +353,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -346,6 +365,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -359,6 +379,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -366,12 +387,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, "engines": { "node": ">=4" } @@ -380,6 +403,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -391,6 +415,7 @@ "version": "7.14.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -447,21 +472,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/template": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", "@babel/parser": "^7.14.5", @@ -475,6 +490,7 @@ "version": "7.14.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", "@babel/generator": "^7.14.5", @@ -494,6 +510,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" @@ -502,82 +519,6 @@ "node": ">=6.9.0" } }, - "node_modules/@carbon/telemetry": { - "version": "0.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@carbon/telemetry/-/telemetry-0.0.0-alpha.6.tgz", - "integrity": "sha512-DCE8ui/tFi+qvCH+mewbUbWzsiq5Ko3HU1lgrVbpjWv1LfswLKFmMg4Os+PmX6edYoBj39qVChJPeaN/UyfJDw==", - "dependencies": { - "@babel/parser": "^7.12.5", - "@babel/traverse": "^7.12.5", - "ci-info": "^2.0.0", - "configstore": "^5.0.1", - "fast-glob": "^3.2.4", - "fs-extra": "^9.0.1", - "got": "^11.8.0", - "semver": "^7.3.2", - "winston": "^3.3.3", - "yargs": "^16.1.1" - }, - "bin": { - "carbon-telemetry": "bin/carbon-telemetry.js" - } - }, - "node_modules/@carbon/telemetry/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", @@ -656,50 +597,12 @@ "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/@sindresorhus/is": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", - "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, "node_modules/@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" - }, "node_modules/@types/jquery": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.5.tgz", @@ -718,18 +621,11 @@ "@types/jquery": "*" } }, - "node_modules/@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "15.12.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", - "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", + "dev": true }, "node_modules/@types/resolve": { "version": "1.17.1", @@ -740,14 +636,6 @@ "@types/node": "*" } }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -808,15 +696,8 @@ "node_modules/async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true }, "node_modules/balanced-match": { "version": "1.0.2", @@ -838,6 +719,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -886,31 +768,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001239", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz", @@ -921,36 +778,6 @@ "url": "https://opencollective.com/browserslist" } }, - "node_modules/carbon-components": { - "version": "10.37.0", - "resolved": "https://registry.npmjs.org/carbon-components/-/carbon-components-10.37.0.tgz", - "integrity": "sha512-LHReeqzzieP/q/xAHfKJNWLdWhOkr7+DIVZkrQGPf6kZYj5H8tb1KYKOIhasvCNRxJ2es8QJXuH7XW0JoLDfdQ==", - "hasInstallScript": true, - "dependencies": { - "@carbon/telemetry": "0.0.0-alpha.6", - "flatpickr": "4.6.1", - "lodash.debounce": "^4.0.8", - "warning": "^3.0.0" - }, - "engines": { - "node": ">=6.x" - } - }, - "node_modules/carbon-web-components": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/carbon-web-components/-/carbon-web-components-1.14.1.tgz", - "integrity": "sha512-NR0EcIkSH5Qw1UURf4Jt6c+xr979kERfTatbH/Fvgj7MjTvLFyy8mHuhLhpJgybTHDNOtWs+a+VyYQIAhwzX2w==", - "dependencies": { - "@babel/runtime": "^7.8.0", - "lodash-es": "^4.17.0" - }, - "peerDependencies": { - "carbon-components": "~10.37.0", - "flatpickr": "4.6.1", - "lit-element": "^2.3.0", - "lit-html": "^1.2.0" - } - }, "node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -967,11 +794,6 @@ "node": ">=0.10.0" } }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, "node_modules/clean-css": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", @@ -984,56 +806,11 @@ "node": ">= 4.0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1044,29 +821,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/colorette": { "version": "1.2.2", @@ -1083,15 +839,6 @@ "node": ">=0.1.90" } }, - "node_modules/colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "dependencies": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1104,22 +851,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -1129,19 +860,6 @@ "safe-buffer": "~5.1.1" } }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -1155,6 +873,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1167,31 +886,6 @@ } } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -1201,14 +895,6 @@ "node": ">=0.10.0" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", @@ -1218,17 +904,6 @@ "node": ">=0.10.0" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -1241,28 +916,11 @@ "integrity": "sha512-WsmJym1TMeHVndjPjczTFbnRR/c4sbzg8fBFtuhlb2Sru3i/S1VGpzDSrv/It8ctMU2bj8G7g7/O3FzYMGw6eA==", "dev": true }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, "engines": { "node": ">=6" } @@ -1271,6 +929,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -1327,39 +986,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/fast-glob": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", - "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "node_modules/fastq": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", - "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" - }, "node_modules/figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", @@ -1377,6 +1003,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1437,16 +1064,6 @@ "node": ">= 0.10" } }, - "node_modules/flatpickr": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.1.tgz", - "integrity": "sha512-3ULSxbXmcMIRzer/2jLNweoqHpwDvsjEawO2FUd9UFR8uPwLM+LruZcPDpuZStcEgbQKhuFOfXo4nYdGladSNw==" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -1468,20 +1085,6 @@ "node": ">=0.10.0" } }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1517,28 +1120,6 @@ "node": ">=6.9.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/getobject": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.1.tgz", @@ -1568,17 +1149,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -1625,39 +1195,11 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { "node": ">=4" } }, - "node_modules/got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" - }, "node_modules/grunt": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.1.tgz", @@ -1943,23 +1485,6 @@ "node": "*" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1972,14 +1497,6 @@ "node": ">=0.10.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "engines": { - "node": ">=0.8.19" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1993,7 +1510,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/ini": { "version": "1.3.8", @@ -2020,11 +1538,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, "node_modules/is-core-module": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", @@ -2041,22 +1554,16 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2074,18 +1581,11 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -2110,19 +1610,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -2144,11 +1631,6 @@ "node": ">=0.10.0" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2190,10 +1672,34 @@ "node": ">=8" } }, + "node_modules/jquery-ui": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz", + "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE=" + }, + "node_modules/jquery-ui-dist": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.12.1.tgz", + "integrity": "sha1-XAgV08xvkP9fqvWyaKbiO0ypBPo=" + }, + "node_modules/jquery-ui-themes": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jquery-ui-themes/-/jquery-ui-themes-1.12.0.tgz", + "integrity": "sha1-pXugrZaADYRSL+dok//L3mcIHVE=" + }, + "node_modules/jquery-ui-timepicker-addon": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/jquery-ui-timepicker-addon/-/jquery-ui-timepicker-addon-1.6.3.tgz", + "integrity": "sha1-gDfDmwtjAoLdCzfditf8XhFjN38=", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", @@ -2212,6 +1718,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -2219,11 +1726,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -2239,30 +1741,6 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, "node_modules/liftup": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", @@ -2316,80 +1794,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "node_modules/logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", - "dependencies": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - } - }, - "node_modules/logform/node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -2441,18 +1845,11 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, "node_modules/micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, "dependencies": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -2461,14 +1858,6 @@ "node": ">=8.6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2502,7 +1891,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/node-releases": { "version": "1.1.73", @@ -2522,17 +1912,6 @@ "nopt": "bin/nopt.js" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -2595,18 +1974,11 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "dependencies": { "wrappy": "1" } }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" - } - }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -2635,14 +2007,6 @@ "os-tmpdir": "^1.0.0" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -2706,6 +2070,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -2725,50 +2090,6 @@ "node": ">=0.10.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -2778,19 +2099,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/rechoir": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", @@ -2803,19 +2111,6 @@ "node": ">= 0.10" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -2829,11 +2124,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.1.2.tgz", - "integrity": "sha512-8OyfzhAtA32LVUsJSke3auIyINcwdh5l3cvYKdKO0nvsYSKuiLfTM5i78PJswFPT8y6cPW+L1v6/hE95chcpDA==" - }, "node_modules/resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", @@ -2847,23 +2137,6 @@ "node": ">=0.10.0" } }, - "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2935,32 +2208,11 @@ "node": ">=10" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -2972,6 +2224,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -2985,19 +2238,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/sortablejs": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", @@ -3007,6 +2247,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3036,73 +2277,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "engines": { - "node": "*" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3150,15 +2324,11 @@ "node": ">=0.10.0" } }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, "engines": { "node": ">=4" } @@ -3167,6 +2337,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -3174,11 +2345,6 @@ "node": ">=8.0" } }, - "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, "node_modules/tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", @@ -3186,14 +2352,6 @@ "dev": true, "peer": true }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, "node_modules/typescript": { "version": "3.9.9", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", @@ -3229,29 +2387,11 @@ "node": "*" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "node_modules/v8flags": { "version": "3.2.0", @@ -3265,14 +2405,6 @@ "node": ">= 0.10" } }, - "node_modules/warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3288,176 +2420,27 @@ "node": ">= 8" } }, - "node_modules/winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", - "dependencies": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", - "is-stream": "^2.0.0", - "logform": "^2.2.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - }, - "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "dependencies": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/winston-transport/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true } }, "dependencies": { + "@andxor/jquery-ui-touch-punch-fix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@andxor/jquery-ui-touch-punch-fix/-/jquery-ui-touch-punch-fix-1.0.2.tgz", + "integrity": "sha512-hdphePfQOxknA9BympZUtbIsXyogz7TgmKykIJrwjS67F4sIhaQJBhlijjkB4xfgFbHPjcJSr9jer09hDuPnaw==", + "requires": { + "jquery-ui": "^1.12.1" + } + }, "@babel/code-frame": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, "requires": { "@babel/highlight": "^7.14.5" } @@ -3495,6 +2478,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "dev": true, "requires": { "@babel/types": "^7.14.5", "jsesc": "^2.5.1", @@ -3540,6 +2524,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.14.5", "@babel/template": "^7.14.5", @@ -3550,6 +2535,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, "requires": { "@babel/types": "^7.14.5" } @@ -3558,6 +2544,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, "requires": { "@babel/types": "^7.14.5" } @@ -3636,6 +2623,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, "requires": { "@babel/types": "^7.14.5" } @@ -3643,7 +2631,8 @@ "@babel/helper-validator-identifier": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==" + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true }, "@babel/helper-validator-option": { "version": "7.14.5", @@ -3666,6 +2655,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", @@ -3676,6 +2666,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -3684,6 +2675,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -3694,6 +2686,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -3701,17 +2694,20 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -3721,7 +2717,8 @@ "@babel/parser": { "version": "7.14.7", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==" + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "dev": true }, "@babel/plugin-syntax-typescript": { "version": "7.14.5", @@ -3754,18 +2751,11 @@ "@babel/plugin-transform-typescript": "^7.14.5" } }, - "@babel/runtime": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", - "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, "@babel/template": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, "requires": { "@babel/code-frame": "^7.14.5", "@babel/parser": "^7.14.5", @@ -3776,6 +2766,7 @@ "version": "7.14.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "dev": true, "requires": { "@babel/code-frame": "^7.14.5", "@babel/generator": "^7.14.5", @@ -3792,71 +2783,12 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" } }, - "@carbon/telemetry": { - "version": "0.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/@carbon/telemetry/-/telemetry-0.0.0-alpha.6.tgz", - "integrity": "sha512-DCE8ui/tFi+qvCH+mewbUbWzsiq5Ko3HU1lgrVbpjWv1LfswLKFmMg4Os+PmX6edYoBj39qVChJPeaN/UyfJDw==", - "requires": { - "@babel/parser": "^7.12.5", - "@babel/traverse": "^7.12.5", - "ci-info": "^2.0.0", - "configstore": "^5.0.1", - "fast-glob": "^3.2.4", - "fs-extra": "^9.0.1", - "got": "^11.8.0", - "semver": "^7.3.2", - "winston": "^3.3.3", - "yargs": "^16.1.1" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, "@rollup/plugin-babel": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", @@ -3902,41 +2834,12 @@ "picomatch": "^2.2.2" } }, - "@sindresorhus/is": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", - "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==" - }, - "@szmarczak/http-timer": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", - "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@types/cacheable-request": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", - "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, "@types/estree": { "version": "0.0.39", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, - "@types/http-cache-semantics": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" - }, "@types/jquery": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.5.tgz", @@ -3955,18 +2858,11 @@ "@types/jquery": "*" } }, - "@types/keyv": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", - "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "requires": { - "@types/node": "*" - } - }, "@types/node": { "version": "15.12.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", - "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" + "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==", + "dev": true }, "@types/resolve": { "version": "1.17.1", @@ -3977,14 +2873,6 @@ "@types/node": "*" } }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "requires": { - "@types/node": "*" - } - }, "@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -4033,12 +2921,8 @@ "async": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true }, "balanced-match": { "version": "1.0.2", @@ -4060,6 +2944,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -4089,51 +2974,12 @@ "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==", "dev": true }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - } - }, "caniuse-lite": { "version": "1.0.30001239", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz", "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==", "dev": true }, - "carbon-components": { - "version": "10.37.0", - "resolved": "https://registry.npmjs.org/carbon-components/-/carbon-components-10.37.0.tgz", - "integrity": "sha512-LHReeqzzieP/q/xAHfKJNWLdWhOkr7+DIVZkrQGPf6kZYj5H8tb1KYKOIhasvCNRxJ2es8QJXuH7XW0JoLDfdQ==", - "requires": { - "@carbon/telemetry": "0.0.0-alpha.6", - "flatpickr": "4.6.1", - "lodash.debounce": "^4.0.8", - "warning": "^3.0.0" - } - }, - "carbon-web-components": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/carbon-web-components/-/carbon-web-components-1.14.1.tgz", - "integrity": "sha512-NR0EcIkSH5Qw1UURf4Jt6c+xr979kERfTatbH/Fvgj7MjTvLFyy8mHuhLhpJgybTHDNOtWs+a+VyYQIAhwzX2w==", - "requires": { - "@babel/runtime": "^7.8.0", - "lodash-es": "^4.17.0" - } - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -4147,11 +2993,6 @@ "supports-color": "^2.0.0" } }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, "clean-css": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", @@ -4161,67 +3002,11 @@ "source-map": "0.5.x" } }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -4229,16 +3014,8 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "colorette": { "version": "1.2.2", @@ -4252,15 +3029,6 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -4273,19 +3041,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -4295,16 +3050,6 @@ "safe-buffer": "~5.1.1" } }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -4315,50 +3060,23 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, "requires": { "ms": "2.1.2" } }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" - }, "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "requires": { - "is-obj": "^2.0.0" - } - }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -4371,33 +3089,17 @@ "integrity": "sha512-WsmJym1TMeHVndjPjczTFbnRR/c4sbzg8fBFtuhlb2Sru3i/S1VGpzDSrv/It8ctMU2bj8G7g7/O3FzYMGw6eA==", "dev": true }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esprima": { "version": "4.0.1", @@ -4438,36 +3140,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "fast-glob": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", - "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "fastq": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", - "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" - }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", @@ -4482,6 +3154,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -4529,16 +3202,6 @@ "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", "dev": true }, - "flatpickr": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.1.tgz", - "integrity": "sha512-3ULSxbXmcMIRzer/2jLNweoqHpwDvsjEawO2FUd9UFR8uPwLM+LruZcPDpuZStcEgbQKhuFOfXo4nYdGladSNw==" - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4554,17 +3217,6 @@ "for-in": "^1.0.1" } }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4590,19 +3242,6 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, "getobject": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.1.tgz", @@ -4623,14 +3262,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -4669,30 +3300,8 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true }, "grunt": { "version": "1.4.1", @@ -4910,20 +3519,6 @@ "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", "dev": true }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4933,11 +3528,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4951,7 +3541,8 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "ini": { "version": "1.3.8", @@ -4975,11 +3566,6 @@ "is-windows": "^1.0.1" } }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, "is-core-module": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", @@ -4992,17 +3578,14 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -5016,12 +3599,8 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -5041,16 +3620,6 @@ "is-unc-path": "^1.0.0" } }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -5066,11 +3635,6 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5105,10 +3669,31 @@ } } }, + "jquery-ui": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz", + "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE=" + }, + "jquery-ui-dist": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.12.1.tgz", + "integrity": "sha1-XAgV08xvkP9fqvWyaKbiO0ypBPo=" + }, + "jquery-ui-themes": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/jquery-ui-themes/-/jquery-ui-themes-1.12.0.tgz", + "integrity": "sha1-pXugrZaADYRSL+dok//L3mcIHVE=" + }, + "jquery-ui-timepicker-addon": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/jquery-ui-timepicker-addon/-/jquery-ui-timepicker-addon-1.6.3.tgz", + "integrity": "sha1-gDfDmwtjAoLdCzfditf8XhFjN38=" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "3.14.1", @@ -5123,12 +3708,8 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true }, "json5": { "version": "2.2.0", @@ -5139,28 +3720,6 @@ "minimist": "^1.2.5" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", - "requires": { - "json-buffer": "3.0.1" - } - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, "liftup": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", @@ -5210,64 +3769,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - }, - "dependencies": { - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, "make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -5309,25 +3810,16 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, "micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" } }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -5352,7 +3844,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node-releases": { "version": "1.1.73", @@ -5369,11 +3862,6 @@ "abbrev": "1" } }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -5421,18 +3909,11 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -5455,11 +3936,6 @@ "os-tmpdir": "^1.0.0" } }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", @@ -5507,7 +3983,8 @@ "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true }, "pretty-bytes": { "version": "3.0.1", @@ -5518,30 +3995,6 @@ "number-is-nan": "^1.0.0" } }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5551,16 +4004,6 @@ "safe-buffer": "^5.1.0" } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "rechoir": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", @@ -5570,16 +4013,6 @@ "resolve": "^1.9.0" } }, - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -5590,11 +4023,6 @@ "path-parse": "^1.0.6" } }, - "resolve-alpn": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.1.2.tgz", - "integrity": "sha512-8OyfzhAtA32LVUsJSke3auIyINcwdh5l3cvYKdKO0nvsYSKuiLfTM5i78PJswFPT8y6cPW+L1v6/hE95chcpDA==" - }, "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", @@ -5605,19 +4033,6 @@ "global-modules": "^1.0.0" } }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5667,18 +4082,11 @@ } } }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -5689,7 +4097,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, "serialize-javascript": { "version": "4.0.0", @@ -5700,19 +4109,6 @@ "randombytes": "^2.1.0" } }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, "sortablejs": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", @@ -5721,7 +4117,8 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "source-map-support": { "version": "0.5.19", @@ -5747,51 +4144,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -5826,29 +4178,21 @@ } } }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "requires": { "is-number": "^7.0.0" } }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, "tslib": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", @@ -5856,14 +4200,6 @@ "dev": true, "peer": true }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, "typescript": { "version": "3.9.9", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", @@ -5886,23 +4222,11 @@ "util-deprecate": "^1.0.2" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "v8flags": { "version": "3.2.0", @@ -5913,14 +4237,6 @@ "homedir-polyfill": "^1.0.1" } }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "^1.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5930,137 +4246,11 @@ "isexe": "^2.0.0" } }, - "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", - "requires": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", - "is-stream": "^2.0.0", - "logform": "^2.2.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - } - }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true } } } diff --git a/package.json b/package.json index 468845934b..7040e9596d 100644 --- a/package.json +++ b/package.json @@ -45,8 +45,10 @@ } }, "dependencies": { - "carbon-components": "^10.37.0", - "carbon-web-components": "^1.14.1", + "@andxor/jquery-ui-touch-punch-fix": "^1.0.2", + "jquery-ui-dist": "^1.12.1", + "jquery-ui-themes": "^1.12.0", + "jquery-ui-timepicker-addon": "^1.6.3", "lit-element": "^2.5.1", "lit-html": "^1.4.1", "sortablejs": "^1.14.0" From 50f620e0752f0559361993d808674a35a8d9f009 Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Thu, 12 Aug 2021 14:57:47 +0200 Subject: [PATCH 29/30] Activate touch plugin on mobile framework --- pixelegg/js/fw_mobile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixelegg/js/fw_mobile.js b/pixelegg/js/fw_mobile.js index 2e86add77e..423d10c13f 100644 --- a/pixelegg/js/fw_mobile.js +++ b/pixelegg/js/fw_mobile.js @@ -23,7 +23,7 @@ import '../../api/js/framework/fw_browser.js'; import '../../api/js/framework/fw_ui.js'; import '../../api/js/framework/fw_classes.js'; import '../../api/js/jsapi/egw_inheritance.js'; - +import '@andxor/jquery-ui-touch-punch-fix/jquery.ui.touch-punch.js'; /** * * @param {DOMWindow} window From 1d0772a064cf2ada8c80f2825141dcd6c605d210 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 12 Aug 2021 08:57:15 -0600 Subject: [PATCH 30/30] * Calendar: Activate links in location & description in event tooltip --- calendar/js/et2_widget_event.ts | 2898 ++++++++++++++++--------------- 1 file changed, 1473 insertions(+), 1425 deletions(-) diff --git a/calendar/js/et2_widget_event.ts b/calendar/js/et2_widget_event.ts index 8942259736..ad4e87763f 100644 --- a/calendar/js/et2_widget_event.ts +++ b/calendar/js/et2_widget_event.ts @@ -20,7 +20,7 @@ import {et2_action_object_impl, et2_DOMWidget} from "../../api/js/etemplate/et2_ import {et2_calendar_daycol} from "./et2_widget_daycol"; import {et2_calendar_planner_row} from "./et2_widget_planner_row"; import {et2_IDetachedDOM} from "../../api/js/etemplate/et2_core_interfaces"; -import {et2_no_init} from "../../api/js/etemplate/et2_core_common"; +import {et2_activateLinks, et2_insertLinkText, et2_no_init} from "../../api/js/etemplate/et2_core_common"; import {egw_getAppObjectManager, egwActionObject} from '../../api/js/egw_action/egw_action.js'; import {egw} from "../../api/js/jsapi/egw_global"; import {et2_selectbox} from "../../api/js/etemplate/et2_widget_selectbox"; @@ -55,1433 +55,1481 @@ import {et2_dialog} from "../../api/js/etemplate/et2_widget_dialog"; export class et2_calendar_event extends et2_valueWidget implements et2_IDetachedDOM { - static readonly _attributes : any = { - "value": { - type: "any", - default: et2_no_init - }, - "onclick": { - "description": "JS code which is executed when the element is clicked. " + - "If no handler is provided, or the handler returns true and the event is not read-only, the " + - "event will be opened according to calendar settings." - } - }; - private div: JQuery; - private title: JQuery; - private body: JQuery; - private icons: JQuery; - private _need_actions_linked: boolean = false; - private _actionObject: egwActionObject; - - /** - * Constructor - */ - constructor(_parent, _attrs? : WidgetConfig, _child? : object) - { - // Call the inherited constructor - super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_calendar_event._attributes, _child || {})); - - const event = this; - - // Main container - this.div = jQuery(document.createElement("div")) - .addClass("calendar_calEvent") - .addClass(this.options.class) - .css('width',this.options.width) - .on('mouseenter', function() { - // Bind actions on first mouseover for faster creation - if(event._need_actions_linked) - { - event._copy_parent_actions(); - } - // Tooltip - if(!event._tooltipElem) - { - event.options.statustext_html = true; - event.set_statustext(event._tooltip()); - if(event.statustext) - { - return event.div.trigger('mouseenter'); - } - } - // Hacky to remove egw's tooltip border and let the mouse in - window.setTimeout(function() { - jQuery('body .egw_tooltip') - .css('border','none') - .on('mouseenter', function() { - event.div.off('mouseleave.tooltip'); - jQuery('body.egw_tooltip').remove(); - jQuery('body').append(this); - jQuery(this).stop(true).fadeTo(400, 1) - .on('mouseleave', function() { - jQuery(this).fadeOut('400', function() { - jQuery(this).remove(); - // Set up to work again - event.set_statustext(event._tooltip()); - }); - }); - }); - - },105); - }); - this.title = jQuery(document.createElement('div')) - .addClass("calendar_calEventHeader") - .appendTo(this.div); - this.body = jQuery(document.createElement('div')) - .addClass("calendar_calEventBody") - .appendTo(this.div); - this.icons = jQuery(document.createElement('div')) - .addClass("calendar_calEventIcons") - .appendTo(this.title); - - this.setDOMNode(this.div[0]); - } - - doLoadingFinished( ) - { - super.doLoadingFinished(); - - // Already know what is needed to hook to cache - if(this.options.value && this.options.value.row_id) - { - egw.dataRegisterUID( - 'calendar::'+this.options.value.row_id, - this._UID_callback, - this, - this.getInstanceManager().execId, - this.id - ); - } - return true; - } - - destroy( ) - { - super.destroy(); - - if(this._actionObject) - { - this._actionObject.remove(); - this._actionObject = null; - } - - this.div.off(); - this.title.remove(); - this.title = null; - this.body.remove(); - this.body = null; - this.icons = null; - this.div.remove(); - this.div = null; - - jQuery('body.egw_tooltip').remove(); - - // Unregister, or we'll continue to be notified... - if(this.options.value) - { - const old_app_id = this.options.value.row_id; - egw.dataUnregisterUID('calendar::'+old_app_id,null,this); - } - } - - set_value( _value) - { - // Un-register for updates - if(this.options.value) - { - var old_id = this.options.value.row_id; - if(!_value || !_value.row_id || old_id !== _value.row_id) - { - egw.dataUnregisterUID('calendar::'+old_id,null,this); - } - } - this.options.value = _value; - - // Register for updates - const id = this.options.value.row_id; - if(!old_id || old_id !== id) - { - egw.dataRegisterUID('calendar::'+id, this._UID_callback ,this,this.getInstanceManager().execId,this.id); - } - if(_value && !egw.dataHasUID('calendar::'+id)) - { - egw.dataStoreUID('calendar::'+id, _value); - } - } - - /** - * Callback for changes in cached data - */ - _UID_callback(event) - { - // Copy to avoid changes, which may cause nm problems - const value = event === null ? null : jQuery.extend({}, event); - let parent = this.getParent(); - let parent_owner = parent.getDOMNode(parent).dataset['owner'] || parent.getParent().options.owner; - if(parent_owner.indexOf(',') >= 0) - { - parent_owner = parent_owner.split(','); - } - - // Make sure id is a string, check values - if(value) - { - this._values_check(value); - } - - // Check for changing days in the grid view - let state = this.getInstanceManager().app_obj.calendar.getState() || app.calendar.getState(); - if(!this._sameday_check(value) || !this._status_check(value, state.status_filter, parent_owner)) - { - // May need to update parent to remove out-of-view events - parent.removeChild(this); - if(event === null && parent && parent.instanceOf(et2_calendar_daycol)) - { - (parent)._out_of_view(); - } - - // This should now cease to exist, as new events have been created - this.destroy(); - return; - } - - // Copy to avoid changes, which may cause nm problems - this.options.value = jQuery.extend({},value); - - if(this.getParent().options.date) - { - this.options.value.date = this.getParent().options.date; - } - - // Let parent position - could also be et2_calendar_planner_row - (this.getParent()).position_event(this); - - // Parent may remove this if the date isn't the same - if(this.getParent()) - { - this._update(); - } - } - - /** - * Draw the event - */ - _update( ) - { - - // Update to reflect new information - const event = this.options.value; - - const id = event.row_id ? event.row_id : event.id + (event.recur_type ? ':' + event.recur_date : ''); - const formatted_start = event.start.toJSON(); - - this.set_id('event_' + id); - if(this._actionObject) - { - this._actionObject.id = 'calendar::' + id; - } - - this._need_actions_linked = !this.options.readonly; - - // Make sure category stuff is there - // Fake it to use the cache / call - if already there, these will return - // immediately. - const im = this.getInstanceManager(); - et2_selectbox.cat_options({ - _type:'select-cat', - getInstanceManager: function() {return im;} - }, - {application:event.app||'calendar'} - ); - - // Need cleaning? (DnD helper removes content) - // @ts-ignore - if(!this.div.has(this.title).length) - { - this.div - .empty() - .append(this.title) - .append(this.body); - } - if(!this.getParent().options.readonly && !this.options.readonly && this.div.droppable('instance')) - { - this.div - // Let timegrid always get the drag - .droppable('option','greedy',false); - } - let tooltip = jQuery(this._tooltip()).text(); - // DOM nodes - this.div - // Set full day flag - .attr('data-full_day', event.whole_day) - - // Put everything we need for basic interaction here, so it's available immediately - .attr('data-id', event.id) - .attr('data-app', event.app || 'calendar') - .attr('data-app_id', event.app_id) - .attr('data-start', formatted_start) - .attr('data-owner', event.owner) - .attr('data-recur_type', event.recur_type) - .attr('data-resize', event.whole_day ? 'WD' : '' + (event.recur_type ? 'S':'')) - .attr('data-priority', event.priority) - // Accessibility - .attr("tabindex",0) - .attr("aria-label", tooltip) - // Remove any category classes - .removeClass(function(index, css) { - return (css.match (/(^|\s)cat_\S+/g) || []).join(' '); - }) - // Remove any status classes - .removeClass(function(index, css) { - return (css.match(/calendar_calEvent\S+/g) || []).join(' '); - }) - .removeClass('calendar_calEventSmall') - .addClass(event.class) - .toggleClass('calendar_calEventPrivate', typeof event.private !== 'undefined' && event.private); - this.options.class = event.class; - const status_class = this._status_class(); - - // Add category classes, if real categories are set - if(event.category && event.category != '0') - { - const cats = event.category.split(','); - for(let i = 0; i < cats.length; i++) - { - this.div.addClass('cat_' + cats[i]); - } - } - - this.div.toggleClass('calendar_calEventUnknown', event.participants[egw.user('account_id')] ? event.participants[egw.user('account_id')][0] === 'U' : false); - this.div.addClass(status_class); - - this.body.toggleClass('calendar_calEventBodySmall', event.whole_day_on_top || false); - - // Header - const title = !event.is_private ? egw.htmlspecialchars(event['title']) : egw.lang('private'); - - this.title - .html(''+this._get_timespan(event) + '
') - .append(''+title+''); - - // Colors - don't make them transparent if there is no color - // @ts-ignore - if(jQuery.Color("rgba(0,0,0,0)").toRgbaString() != jQuery.Color(this.div,'background-color').toRgbaString()) - { - // Most statuses use colored borders - this.div.css('border-color',this.div.css('background-color') ); - } - - this.icons.appendTo(this.title) - .html(this._icons().join('')); - - // Body - if(event.whole_day_on_top) - { - this.body.html(title); - } - else - { - // @ts-ignore - const start_time = jQuery.datepicker.formatTime( - egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", - { - hour: event.start_m / 60, - minute: event.start_m % 60, - seconds: 0, - timezone: 0 + static readonly _attributes: any = { + "value": { + type: "any", + default: et2_no_init }, - {"ampm": (egw.preference("timeformat") === "12")} - ).trim(); - - this.body - .html(''+title+'') - .append(''+start_time + ''); - if(this.options.value.description.trim()) - { - this.body - .append('

'+egw.htmlspecialchars(this.options.value.description)+'

'); - } - } - - // Clear tooltip for regeneration - this.set_statustext(''); - - // Height specific section - // This can take an unreasonable amount of time if parent is hidden - if(jQuery((this.getParent()).getDOMNode(this)).is(':visible')) - { - this._small_size(); - } - } - - /** - * Calculate display variants for when event is too short for full display - * - * Display is based on the number of visible lines, calculated off the header - * height: - * 1 - show just the event title, with ellipsis - * 2 - Show timespan and title, with ellipsis - * > 4 - Show description as well, truncated to fit - */ - _small_size( ) - { - - if(this.options.value.whole_day_on_top) return; - - // Skip for planner view, it's always small - if(this.getParent() && this.getParent().instanceOf(et2_calendar_planner_row)) return; - - // Pre-calculation reset - this.div.removeClass('calendar_calEventSmall'); - this.body.css('height', 'auto'); - - const line_height = parseFloat(this.div.css('line-height')); - let visible_lines = Math.floor(this.div.innerHeight() / line_height); - - if(!this.title.height()) - { - // Handle sizing while hidden, such as when calendar is not the active tab - visible_lines = Math.floor(egw.getHiddenDimensions(this.div).h / egw.getHiddenDimensions(this.title).h); - } - visible_lines = Math.max(1,visible_lines); - - if(this.getParent() && this.getParent().instanceOf(et2_calendar_daycol)) - { - this.div.toggleClass('calendar_calEventSmall',visible_lines < 4); - this.div - .attr('data-visible_lines', visible_lines); - } - else if (this.getParent() && this.getParent().instanceOf(et2_calendar_planner_row)) - { - // Less than 8 hours is small - this.div.toggleClass('calendar_calEventSmall',this.options.value.end.valueOf() - this.options.value.start.valueOf() < 28800000); - } - - - if(this.body.height() > this.div.height() - this.title.height() && visible_lines >= 4) - { - this.body.css('height', Math.floor((visible_lines-1)*line_height - this.title.height()) + 'px'); - } - else - { - this.body.css('height', ''); - } - } - - /** - * Examines the participants & returns CSS classname for status - * - * @returns {String} - */ - _status_class( ) - { - let status_class = 'calendar_calEventAllAccepted'; - for(let id in this.options.value.participants) - { - let status = this.options.value.participants[id]; - - status = et2_calendar_event.split_status(status); - - switch (status) - { - case 'A': - case '': // app without status - break; - case 'U': - status_class = 'calendar_calEventSomeUnknown'; - return status_class; // break for - default: - status_class = 'calendar_calEventAllAnswered'; - break; - } - } - return status_class; - } - - /** - * Create tooltip shown on hover - * - * @return {String} - */ - _tooltip( ) - { - if(!this.div || !this.options.value || !this.options.value.app_id) return ''; - - const border = this.div.css('borderTopColor'); - const bg_color = this.div.css('background-color'); - const header_color = this.title.css('color'); - const timespan = this._get_timespan(this.options.value); - const parent = this.getParent() instanceof et2_calendar_daycol ? (this.getParent()) : (this.getParent()); - - parent.date_helper.set_value(this.options.value.start.valueOf ? new Date(this.options.value.start) : this.options.value.start); - const start = parent.date_helper.input_date.val(); - parent.date_helper.set_value(this.options.value.end.valueOf ? new Date(this.options.value.end) : this.options.value.end); - const end = parent.date_helper.input_date.val(); - - const times = !this.options.value.multiday ? - '' + this.egw().lang('Time') + ':' + timespan : - '' + this.egw().lang('Start') + ':' + start + ' ' + - '' + this.egw().lang('End') + ':' + end; - let cat_label: (string | string[]) = ''; - if(this.options.value.category) - { - const cat = et2_createWidget('select-cat', {'readonly': true}, this); - cat.set_value(this.options.value.category); - cat_label = this.options.value.category.indexOf(',') <= 0 ? cat.span.text() : []; - if(typeof cat_label != 'string') - { - cat.span.children().each(function() { - (cat_label).push(jQuery(this).text()); - }); - cat_label = cat_label.join(', '); - } - cat.destroy(); - } - - // Location + Videoconference - let location = ''; - if(this.options.value.location || this.options.value['##videoconference']) - { - location += '

' + this.egw().lang('Location') + ':' + - egw.htmlspecialchars(this.options.value.location); - if(this.options.value['##videoconference']) - { - // Click handler is set in _bind_videoconference() - location += (this.options.value.location.trim() ? '
' : '') + - ''+ - this.egw().lang('Video conference') + - ''; - this._bind_videoconference(); - } - location += '

'; - } - - // Participants - let participants = ''; - if(this.options.value.participant_types['']) - { - participants += this.options.value.participant_types[''].join("
"); - } - for(let type_name in this.options.value.participant_types) - { - if(type_name) - { - participants += '

'+type_name+':
'; - participants += this.options.value.participant_types[type_name].join("
"); - } - } - - return '

'+ - '
'+ - ''+timespan+''+ - this.icons[0].outerHTML+ - '
'+ - '
'+ - '

'+egw.htmlspecialchars(this.options.value.title)+'


'+ - egw.htmlspecialchars(this.options.value.description)+'

'+ - '

'+times+'

'+ - location + - (cat_label ? '

'+this.egw().lang('Category') + ':

' + cat_label +'

' : '')+ - '

'+this.egw().lang('Participants')+':


'+ - participants + '

'+ this._participant_summary(this.options.value.participants) + - '
'+ - '
'; - } - - /** - * Generate participant summary line - * - * @returns {String} - */ - _participant_summary(participants) - { - if( Object.keys(this.options.value.participants).length < 2) - { - return ''; - } - - const participant_status = {A: 0, R: 0, T: 0, U: 0, D: 0}; - const status_label = {A: 'accepted', R: 'rejected', T: 'tentative', U: 'unknown', D: 'delegated'}; - const participant_summary = Object.keys(this.options.value.participants).length + ' ' + this.egw().lang('Participants') + ': '; - const status_totals = []; - - for(let id in this.options.value.participants) - { - var status = this.options.value.participants[id].substr(0,1); - participant_status[status]++; - } - for(let status in participant_status) - { - if(participant_status[status] > 0) - { - status_totals.push(participant_status[status] + ' ' + this.egw().lang(status_label[status])); - } - } - return participant_summary + status_totals.join(', '); - } - - /** - * Get actual icons from list - */ - _icons( ) : string[] - { - const icons = []; - - if(this.options.value.is_private) - { - // Hide everything - icons.push(''); - } - else - { - if(this.options.value.icons) - { - jQuery.extend(icons, this.options.value.icons); - } - else if(this.options.value.app !== 'calendar') - { - let app_icon = ""+(egw.link_get_registry(this.options.value.app,'icon') || (this.options.value.app + '/navbar')); - icons.push(''); - } - if(this.options.value.priority == 3) - { - icons.push(''); - } - if(this.options.value.public == '0') - { - // Show private flag - icons.push(''); - } - if(this.options.value['recur_type']) - { - icons.push(''); - } - // icons for single user, multiple users or group(s) and resources - const single = ''; - const multiple = ''; - for(const uid in this.options.value['participants']) - { - // @ts-ignore - if(Object.keys(this.options.value.participants).length == 1 && !isNaN(uid)) - { - icons.push(single); - break; + "onclick": { + "description": "JS code which is executed when the element is clicked. " + + "If no handler is provided, or the handler returns true and the event is not read-only, the " + + "event will be opened according to calendar settings." } - // @ts-ignore - if(!isNaN(uid) && icons.indexOf(multiple) === -1) - { - icons.push(multiple); - } - /* - * TODO: resource icons - elseif(!isset($icons[$uid[0]]) && isset($this->bo->resources[$uid[0]]) && isset($this->bo->resources[$uid[0]]['icon'])) - { - $icons[$uid[0]] = html::image($this->bo->resources[$uid[0]]['app'], - ($this->bo->resources[$uid[0]]['icon'] ? $this->bo->resources[$uid[0]]['icon'] : 'navbar'), - lang($this->bo->resources[$uid[0]]['app']), - 'width="16px" height="16px"'); - } - */ - } - - if(this.options.value.alarm && !jQuery.isEmptyObject(this.options.value.alarm) && !this.options.value.is_private) - { - icons.push(''); - } - if(this.options.value.participants[egw.user('account_id')] && this.options.value.participants[egw.user('account_id')][0] == 'U') - { - icons.push(''); - } - if(this.options.value["##videoconference"]) - { - icons.push(''); - } - } - - // Always include non-blocking, regardless of privacy - if(this.options.value.non_blocking) - { - icons.push(''); - } - return icons; - } - - /** - * Bind the click handler for opening the video conference - * - * Tooltips are placed in the DOM directly in the body, managed by egw. - */ - _bind_videoconference() - { - let vc_event = 'click.calendar_videoconference'; - jQuery('body').off(vc_event) - .on(vc_event, '[data-videoconference]',function(event) { - let data = egw.dataGetUIDdata("calendar::"+this.dataset.id); - app.calendar.joinVideoConference(this.dataset.videoconference, data.data||this.dataset); - }); - } - /** - * Get a text representation of the timespan of the event. Either start - * - end, or 'all day' - * - * @param {Object} event Event to get the timespan for - * @param {number} event.start_m Event start, in minutes from midnight - * @param {number} event.end_m Event end, in minutes from midnight - * - * @return {string} Timespan - */ - _get_timespan( event) - { - let timespan = ''; - if (event['start_m'] === 0 && event['end_m'] >= 24*60-1) - { - if (event['end_m'] > 24*60) - { - // @ts-ignore - timespan = jQuery.datepicker.formatTime( - egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", - { - hour: event.start_m / 60, - minute: event.start_m % 60, - seconds: 0, - timezone: 0 - }, - {"ampm": (egw.preference("timeformat") === "12")} - // @ts-ignore - ).trim()+' - '+jQuery.datepicker.formatTime( - egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", - { - hour: event.end_m / 60, - minute: event.end_m % 60, - seconds: 0, - timezone: 0 - }, - {"ampm": (egw.preference("timeformat") === "12")} - ).trim(); - } - else - { - timespan = this.egw().lang('Whole day'); - } - } - else - { - let duration : string | number = event.multiday ? - (event.end - event.start) / 60000 : - (event.end_m - event.start_m); - duration = Math.floor(duration/60) + this.egw().lang('h')+(duration%60 ? duration%60 : ''); - - // @ts-ignore - timespan = jQuery.datepicker.formatTime( - egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", - { - hour: event.start_m / 60, - minute: event.start_m % 60, - seconds: 0, - timezone: 0 - }, - {"ampm": (egw.preference("timeformat") === "12")} - ).trim(); - - // @ts-ignore - timespan += ' - ' + jQuery.datepicker.formatTime( - egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", - { - hour: event.end_m / 60, - minute: event.end_m % 60, - seconds: 0, - timezone: 0 - }, - {"ampm": (egw.preference("timeformat") === "12")} - ).trim(); - - timespan += ': ' + duration; - } - return timespan; - } - - /** - * Make sure event data has all proper values, and format them as expected - * @param {Object} event - */ - _values_check(event) - { - // Make sure ID is a string - if(event.id) - { - event.id = ''+event.id; - } - - // Parent might be a daycol or a planner_row - let parent = this.getParent(); - - // Use dates as objects - if(typeof event.start !== 'object') - { - parent.date_helper.set_value(event.start); - event.start = new Date(parent.date_helper.getValue()); - } - if(typeof event.end !== 'object') - { - parent.date_helper.set_value(event.end); - event.end = new Date(parent.date_helper.getValue()); - } - - // We need minutes for durations - if(typeof event.start_m === 'undefined') - { - event.start_m = event.start.getUTCHours() * 60 + event.start.getUTCMinutes(); - event.end_m = event.end.getUTCHours() * 60 + event.end.getUTCMinutes(); - } - if(typeof event.multiday === 'undefined') - { - event.multiday = (event.start.getUTCFullYear() !== event.end.getUTCFullYear() || - event.start.getUTCMonth() !== event.end.getUTCMonth() || - event.start.getUTCDate() != event.end.getUTCDate()); - } - if(!event.start.getUTCHours() && !event.start.getUTCMinutes() && event.end.getUTCHours() == 23 && event.end.getUTCMinutes() == 59) - { - event.whole_day_on_top = (event.non_blocking && event.non_blocking != '0'); - } - } - - /** - * Check to see if the provided event information is for the same date as - * what we're currently expecting, and that it has not been changed. - * - * If the date has changed, we adjust the associated daywise caches to move - * the event's ID to where it should be. This check allows us to be more - * directly reliant on the data cache, and less on any other control logic - * elsewhere first. - * - * @param {Object} event Map of event data from cache - * @param {string} event.date For non-recurring, single day events, this is - * the date the event is on. - * @param {string} event.start Start of the event (used for multi-day events) - * @param {string} event.end End of the event (used for multi-day events) - * - * @return {Boolean} Provided event data is for the same date - */ - _sameday_check(event) - { - // Event somehow got orphaned, or deleted - if(!this.getParent() || event === null) - { - return false; - } - - // Also check participants against owner - const owner_match = et2_calendar_event.owner_check(event, this.getParent()); - - // Simple, same day - if(owner_match && this.options.value.date && event.date == this.options.value.date) - { - return true; - } - - // Multi-day non-recurring event spans days - date does not match - const event_start = new Date(event.start); - const event_end = new Date(event.end); - const parent = this.getParent(); - if(owner_match && (parent instanceof et2_calendar_daycol) && parent.getDate() >= event_start && parent.getDate() <= event_end) - { - return true; - } - - // Delete all old actions - if(this._actionObject) - { - this._actionObject.clear(); - this._actionObject.unregisterActions(); - this._actionObject = null; - } - - // Update daywise caches - const new_cache_id = CalendarApp._daywise_cache_id(event.date, this.getParent().options.owner); - let new_daywise: any = egw.dataGetUIDdata(new_cache_id); - new_daywise = new_daywise && new_daywise.data ? new_daywise.data : []; - let old_cache_id = ''; - if(this.options.value && this.options.value.date) - { - old_cache_id = CalendarApp._daywise_cache_id(this.options.value.date,parent.options.owner); - } - - if(new_cache_id != old_cache_id) - { - let old_daywise: any = egw.dataGetUIDdata(old_cache_id); - old_daywise = old_daywise && old_daywise.data ? old_daywise.data : []; - old_daywise.splice(old_daywise.indexOf(this.options.value.row_id),1); - egw.dataStoreUID(old_cache_id,old_daywise); - - if (new_daywise.indexOf(event.row_id) < 0) - { - new_daywise.push(event.row_id); - } - if(egw.dataHasUID(new_cache_id)) - { - egw.dataStoreUID(new_cache_id, new_daywise); - } - } - - return false; - } - - /** - * Check that the event passes the given status filter. - * Status filter is set in the sidebox and used when fetching several events, but if user changes their status - * for an event, it may no longer match and have to be removed. - * - * @param event - * @param filter - * @param owner The owner of the target / parent, not the event owner - * @private - */ - _status_check(event, filter: string, owner: string | string[]): boolean - { - if(!owner || !event) - { - return false; - } - - // If we're doing a bunch, just one passing is enough - if(typeof owner !== "string") - { - let pass = false; - for (let j = 0; j < owner.length && pass == false; j++) - { - pass = pass || this._status_check(event, filter, owner[j]); - } - return pass; - } - - // Show also events just owned by selected user - // Group members can be owner too, those get handled when we check group memberships below - if(filter == 'owner' && owner == event.owner) - { - return true; - } - - // Get the relevant participant - let participant = event.participants[owner]; - - // If filter says don't look in groups, skip it all - if(!participant && filter === 'no-enum-groups') - { - return false; - } - - // Couldn't find the current owner in the participant list, check groups & resources - if(!participant) - { - let options: any = null; - if(app.calendar && app.calendar.sidebox_et2 && app.calendar.sidebox_et2.getWidgetById('owner')) - { - options = app.calendar.sidebox_et2.getWidgetById('owner').taglist.getSelection(); - } - if((isNaN(parseInt(owner)) || parseInt(owner) < 0) && options && typeof options.find == "function") - { - let resource = options.find(function (element) - { - return element.id == owner; - }) || {}; - let matching_participant = typeof resource.resources == "undefined" ? - resource : - resource?.resources.filter(id => typeof event.participants[id] != "undefined"); - if(matching_participant.length > 0) - { - return this._status_check(event, filter, matching_participant); - } - else if (filter == 'owner' && resource && resource.resources && resource.resources.indexOf(event.owner)) - { - // owner param was a group but event is owned by someone in that group - return true; - } - } - } - - let status = et2_calendar_event.split_status(participant); - - switch (filter) - { - default: - case 'all': - return true; - case 'default': // Show all status, but rejected - return status !== 'R'; - case 'accepted': //Show only accepted events - return status === 'A' - case 'unknown': // Show only invitations, not yet accepted or rejected - return status === 'U'; - case 'tentative': // Show only tentative accepted events - return status === 'T'; - case 'delegated': // Show only delegated events - return status === 'D'; - case 'rejected': // Show only rejected events - return status === 'R'; - // Handled above - //case 'owner': // Show also events just owned by selected user - case 'hideprivate': // Show all events, as if they were private - // handled server-side - return true; - case 'showonlypublic': // Show only events flagged as public, -not checked as private - return event.public == '1'; - // Handled above - // case 'no-enum-groups': // Do not include events of group members - case 'not-unknown': // Show all status, but unknown - return status !== 'U'; - case 'deleted': // Show events that have been deleted - return event.deleted; - } - } - - attachToDOM() - { - let result = super.attachToDOM(); - - // Remove the binding for the click handler, unless there's something - // custom here. - if(!this.onclick) - { - jQuery(this.node).off("click"); - } - return result; - } - - /** - * Click handler calling custom handler set via onclick attribute to this.onclick. - * All other handling is done by the timegrid widget. - * - * @param {Event} _ev - * @returns {boolean} - */ - click( _ev) - { - let result = true; - if(typeof this.onclick == 'function') - { - // Make sure function gets a reference to the widget, splice it in as 2. argument if not - const args = Array.prototype.slice.call(arguments); - if(args.indexOf(this) == -1) args.splice(1, 0, this); - - result = this.onclick.apply(this, args); - } - return result; - } - - /** - * Show the recur prompt for this event - * - * Calls et2_calendar_event.recur_prompt with this event's value. - * - * @param {et2_calendar_event~prompt_callback} callback - * @param {Object} [extra_data] - */ - recur_prompt(callback, extra_data) - { - et2_calendar_event.recur_prompt(this.options.value,callback,extra_data); - } - - /** - * Show the series split prompt for this event - * - * Calls et2_calendar_event.series_split_prompt with this event's value. - * - * @param {et2_calendar_event~prompt_callback} callback - */ - series_split_prompt(callback) - { - et2_calendar_event.series_split_prompt(this.options.value,this.options.value.recur_date, callback); - } - - /** - * Copy the actions set on the parent, apply them to self - * - * This can take a while to do, so we try to do it only when needed - on mouseover - */ - _copy_parent_actions() - { - // Copy actions set in parent - if(!this.options.readonly && !this.getParent().options.readonly) - { - let action_parent : et2_widget = this; - while(action_parent != null && !action_parent.options.actions && - !(action_parent instanceof et2_container) - ) - { - action_parent = action_parent.getParent(); - } - try { - this._link_actions(action_parent.options.actions||{}); - this._need_actions_linked = false; - } catch (e) { - // something went wrong, but keep quiet about it - } - } - } - - /** - * Link the actions to the DOM nodes / widget bits. - * - * @param {object} actions {ID: {attributes..}+} map of egw action information - */ - _link_actions(actions) - { - if(!this._actionObject) - { - // Get the top level element - timegrid or so - var objectManager = this.getParent()._actionObject || this.getParent().getParent()._actionObject || - egw_getAppObjectManager(true).getObjectById(this.getParent().getParent().getParent().id) || egw_getAppObjectManager(true); - this._actionObject = objectManager.getObjectById('calendar::'+this.options.value.row_id); - } - - if (this._actionObject == null) { - // Add a new container to the object manager which will hold the widget - // objects - this._actionObject = objectManager.insertObject(false, new egwActionObject( - 'calendar::'+this.options.value.row_id, objectManager, et2_calendar_event.et2_event_action_object_impl(this,this.getDOMNode()), - this._actionManager || objectManager.manager.getActionById('calendar::'+this.options.value.row_id) || objectManager.manager - )); - } - else - { - this._actionObject.setAOI(et2_calendar_event.et2_event_action_object_impl(this, this.getDOMNode(this))); - } - - // Delete all old objects - this._actionObject.clear(); - this._actionObject.unregisterActions(); - - // Go over the widget & add links - this is where we decide which actions are - // 'allowed' for this widget at this time - const action_links = this._get_action_links(actions); - action_links.push('egw_link_drag'); - action_links.push('egw_link_drop'); - if(this._actionObject.parent.getActionLink('invite')) - { - action_links.push('invite'); - } - this._actionObject.updateActionLinks(action_links); - } - - /** - * Code for implementing et2_IDetachedDOM - * - * @param {array} _attrs array to add further attributes to - */ - getDetachedAttributes( _attrs) - { - - } - - getDetachedNodes( ) - { - return [this.getDOMNode()]; - } - - setDetachedAttributes( _nodes, _values) - { - - } - - // Static class stuff - /** - * Check event owner against a parent object - * - * As an event is edited, its participants may change. Also, as the state - * changes we may change which events are displayed and show the same event - * in several places for different users. Here we check the event participants - * against an owner value (which may be an array) to see if the event should be - * displayed or included. - * - * @param {Object} event - Event information - * @param {et2_widget_daycol|et2_widget_planner_row} parent - potential parent object - * that has an owner option - * @param {boolean} [owner_too] - Include the event owner in consideration, or only - * event participants - * - * @return {boolean} Should the event be displayed - */ - static owner_check(event, parent, owner_too?) - { - let owner_match = true; - let state = (parent.getInstanceManager ? parent.getInstanceManager().app_obj.calendar.state : false ) || app.calendar?.state || {} - if(typeof owner_too === 'undefined' && state.status_filter) - { - owner_too = state.status_filter === 'owner'; - } - let options : any = null; - if(app.calendar && app.calendar.sidebox_et2 && app.calendar.sidebox_et2.getWidgetById('owner')) - { - options = app.calendar.sidebox_et2.getWidgetById('owner').taglist.getSelection(); - } - else - { - options = parent.getArrayMgr("sel_options").getRoot().getEntry('owner'); - } - if(event.participants && typeof parent.options.owner != 'undefined' && parent.options.owner.length > 0) - { - var parent_owner = jQuery.extend([], typeof parent.options.owner !== 'object' ? - [parent.options.owner] : - parent.options.owner); - owner_match = false; - const length = parent_owner.length; - for(var i = 0; i < length; i++ ) - { - // Handle groups & grouped resources like mailing lists, they won't match so - // we need the list - pull it from sidebox owner - if((isNaN(parent_owner[i]) || parent_owner[i] < 0) && options && typeof options.find == "function") - { - var resource = options.find(function(element) {return element.id == parent_owner[i];}) || {}; - if(resource && resource.resources) - { - parent_owner.splice(i,1); - i--; - parent_owner = parent_owner.concat(resource.resources); - - } - } - } - let participants = jQuery.extend([], Object.keys(event.participants)); - for(var i = 0; i < participants.length; i++ ) - { - const id = participants[i]; - // Expand group invitations - if (parseInt(id) < 0) - { - // Add in groups, if we can get them from options, great - var resource; - if(options && options.find && (resource = options.find(function(element) {return element.id === id;})) && resource.resources) - { - participants = participants.concat(resource.resources); - } - else - { - // Add in groups, if we can get them (this is asynchronous) - egw.accountData(id,'account_id',true,function(members) { - participants = participants.concat(Object.keys(members)); - }, this); - } - } - if(parent.options.owner == id || - parent_owner.indexOf && - parent_owner.indexOf(id) >= 0) - { - owner_match = true; - break; - } - } - } - if(owner_too && !owner_match) - { - owner_match = (parent.options.owner == event.owner || - parent_owner.indexOf && - parent_owner.indexOf(event.owner) >= 0); - } - return owner_match; - } - - /** - * @callback et2_calendar_event~prompt_callback - * @param {string} button_id - One of ok, exception, series, single or cancel - * depending on which buttons are on the prompt - * @param {Object} event_data - Event information - whatever you passed in to - * the prompt. - */ - /** - * Recur prompt - * If the event is recurring, asks the user if they want to edit the event as - * an exception, or change the whole series. Then the callback is called. - * - * If callback is not provided, egw.open() will be used to open an edit dialog. - * - * If you call this on a single (non-recurring) event, the callback will be - * executed immediately, with the passed button_id as 'single'. - * - * @param {Object} event_data - Event information - * @param {string} event_data.id - Unique ID for the event, possibly with a - * timestamp - * @param {string|Date} event_data.start - Start date/time for the event - * @param {number} event_data.recur_type - Recur type, or 0 for a non-recurring event - * @param {et2_calendar_event~prompt_callback} [callback] - Callback is - * called with the button (exception, series, single or cancel) and the event - * data. - * @param {Object} [extra_data] - Additional data passed to the callback, used - * as extra parameters for default callback - * - * @augments {et2_calendar_event} - */ - public static recur_prompt(event_data, callback?, extra_data?) - { - let egw; - const edit_id = event_data.app_id; - const edit_date = event_data.start; - - // seems window.opener somehow in certain conditions could be from different origin - // we try to catch the exception and in this case retrieve the egw object from current window. - try - { - egw = this.egw ? (typeof this.egw == 'function' ? this.egw() : this.egw) : window.opener && typeof window.opener.egw != 'undefined' ? window.opener.egw('calendar'):window.egw('calendar'); - } - catch(e){ - egw = window.egw('calendar'); - } - - const that = this; - - const extra_params = extra_data && typeof extra_data == 'object' ? extra_data : {}; - extra_params.date = edit_date.toJSON ? edit_date.toJSON() : edit_date; - if(typeof callback != 'function') - { - callback = function(_button_id) - { - switch(_button_id) - { - case 'exception': - extra_params.exception = '1'; - egw.open(edit_id, event_data.app||'calendar', 'edit', extra_params); - break; - case 'series': - case 'single': - egw.open(edit_id, event_data.app||'calendar', 'edit', extra_params); - break; - case 'cancel': - default: - break; - } - }; - } - if(parseInt(event_data.recur_type)) - { - const buttons = [ - {text: egw.lang("Edit exception"), id: "exception", class: "ui-priority-primary", "default": true}, - {text: egw.lang("Edit series"), id: "series"}, - {text: egw.lang("Cancel"), id: "cancel"} - ]; - et2_dialog.show_dialog( - function(button_id) {callback.call(that, button_id, event_data);}, - (!event_data.is_private ? event_data['title'] : egw.lang('private')) + "\n" + - egw.lang("Do you want to edit this event as an exception or the whole series?"), - egw.lang("This event is part of a series"), {}, buttons, et2_dialog.QUESTION_MESSAGE - ); - } - else - { - callback.call(this,'single',event_data); - } - } - - /** - * Split series prompt - * - * If the event is recurring and the user adjusts the time or duration, we may need - * to split the series, ending the current one and creating a new one with the changes. - * This prompts the user if they really want to do that. - * - * There is no default callback, and nothing happens if you call this on a - * single (non-recurring) event - * - * @param {Object} event_data - Event information - * @param {string} event_data.id - Unique ID for the event, possibly with a timestamp - * @param {string|Date} instance_date - The date of the edited instance of the event - * @param {et2_calendar_event~prompt_callback} callback - Callback is - * called with the button (ok or cancel) and the event data. - * @augments {et2_calendar_event} - */ - public static series_split_prompt(event_data, instance_date, callback) - { - let egw; - // seems window.opener somehow in certian conditions could be from different origin - // we try to catch the exception and in this case retrieve the egw object from current window. - try { - egw = this.egw ? (typeof this.egw == 'function' ? this.egw() : this.egw) : window.opener && typeof window.opener.egw != 'undefined' ? window.opener.egw('calendar'):window.egw('calendar'); - } - catch(e){ - egw = window.egw('calendar'); - } - - const that = this; - - if(typeof instance_date == 'string') - { - instance_date = new Date(instance_date); - } - - // Check for modifying a series that started before today - const tempDate = new Date(); - const today = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate(), tempDate.getHours(), -tempDate.getTimezoneOffset(), tempDate.getSeconds()); - const termination_date = instance_date < today ? egw.lang('today') : date(egw.preference('dateformat'), instance_date); - - if(parseInt(event_data.recur_type)) - { - et2_dialog.show_dialog( - function(button_id) {callback.call(that, button_id, event_data);}, - (!event_data.is_private ? event_data['title'] : egw.lang('private')) + "\n" + - egw.lang("Do you really want to change the start of this series? If you do, the original series will be terminated as of %1 and a new series for the future reflecting your changes will be created.", termination_date), - egw.lang("This event is part of a series"), {}, et2_dialog.BUTTONS_OK_CANCEL , et2_dialog.WARNING_MESSAGE - ); - } - } - - public static drag_helper (event,ui) - { - ui.helper.width(ui.width()); - } - - /** - * splits the combined status, quantity and role - * - * @param {string} status - combined value, O: status letter: U, T, A, R - * @param {int} [quantity] - quantity - * @param {string} [role] - * @return string status U, T, A or R, same as $status parameter on return - */ - public static split_status (status,quantity?,role?) - { - quantity = 1; - role = 'REQ-PARTICIPANT'; - //error_log(__METHOD__.__LINE__.array2string($status)); - let matches = null; - if (typeof status === 'string' && status.length > 1) - { - matches = status.match(/^.([0-9]*)(.*)$/gi); - } - if(matches) - { - if (parseInt(matches[1]) > 0) quantity = parseInt(matches[1]); - if (matches[2]) role = matches[2]; - status = status[0]; - } - else if (status === true) - { - status = 'U'; - } - return status; - } - - /** - * The egw_action system requires an egwActionObjectInterface Interface implementation - * to tie actions to DOM nodes. I'm not sure if we need this. - * - * The class extension is different than the widgets - * - * @param {et2_DOMWidget} widget - * @param {Object} node - * - */ - public static et2_event_action_object_impl(widget, node) - { - const aoi = new et2_action_object_impl(widget, node).getAOI(); - - // _outerCall may be used to determine, whether the state change has been - // evoked from the outside and the stateChangeCallback has to be called - // or not. - aoi.doSetState = function(_state, _outerCall) { }; + private div: JQuery; + private title: JQuery; + private body: JQuery; + private icons: JQuery; + private _need_actions_linked: boolean = false; + private _actionObject: egwActionObject; - return aoi; - } + /** + * Constructor + */ + constructor(_parent, _attrs?: WidgetConfig, _child?: object) + { + // Call the inherited constructor + super(_parent, _attrs, ClassWithAttributes.extendAttributes(et2_calendar_event._attributes, _child || {})); + + const event = this; + + // Main container + this.div = jQuery(document.createElement("div")) + .addClass("calendar_calEvent") + .addClass(this.options.class) + .css('width', this.options.width) + .on('mouseenter', function () + { + // Bind actions on first mouseover for faster creation + if (event._need_actions_linked) + { + event._copy_parent_actions(); + } + // Tooltip + if (!event._tooltipElem) + { + event.options.statustext_html = true; + event.set_statustext(event._tooltip()); + if (event.statustext) + { + return event.div.trigger('mouseenter'); + } + } + // Hacky to remove egw's tooltip border and let the mouse in + window.setTimeout(function () + { + jQuery('body .egw_tooltip') + .css('border', 'none') + .on('mouseenter', function () + { + event.div.off('mouseleave.tooltip'); + jQuery('body.egw_tooltip').remove(); + jQuery('body').append(this); + jQuery(this).stop(true).fadeTo(400, 1) + .on('mouseleave', function () + { + jQuery(this).fadeOut('400', function () + { + jQuery(this).remove(); + // Set up to work again + event.set_statustext(event._tooltip()); + }); + }); + }); + + }, 105); + }); + this.title = jQuery(document.createElement('div')) + .addClass("calendar_calEventHeader") + .appendTo(this.div); + this.body = jQuery(document.createElement('div')) + .addClass("calendar_calEventBody") + .appendTo(this.div); + this.icons = jQuery(document.createElement('div')) + .addClass("calendar_calEventIcons") + .appendTo(this.title); + + this.setDOMNode(this.div[0]); + } + + doLoadingFinished() + { + super.doLoadingFinished(); + + // Already know what is needed to hook to cache + if (this.options.value && this.options.value.row_id) + { + egw.dataRegisterUID( + 'calendar::' + this.options.value.row_id, + this._UID_callback, + this, + this.getInstanceManager().execId, + this.id + ); + } + return true; + } + + destroy() + { + super.destroy(); + + if (this._actionObject) + { + this._actionObject.remove(); + this._actionObject = null; + } + + this.div.off(); + this.title.remove(); + this.title = null; + this.body.remove(); + this.body = null; + this.icons = null; + this.div.remove(); + this.div = null; + + jQuery('body.egw_tooltip').remove(); + + // Unregister, or we'll continue to be notified... + if (this.options.value) + { + const old_app_id = this.options.value.row_id; + egw.dataUnregisterUID('calendar::' + old_app_id, null, this); + } + } + + set_value(_value) + { + // Un-register for updates + if (this.options.value) + { + var old_id = this.options.value.row_id; + if (!_value || !_value.row_id || old_id !== _value.row_id) + { + egw.dataUnregisterUID('calendar::' + old_id, null, this); + } + } + this.options.value = _value; + + // Register for updates + const id = this.options.value.row_id; + if (!old_id || old_id !== id) + { + egw.dataRegisterUID('calendar::' + id, this._UID_callback, this, this.getInstanceManager().execId, this.id); + } + if (_value && !egw.dataHasUID('calendar::' + id)) + { + egw.dataStoreUID('calendar::' + id, _value); + } + } + + /** + * Callback for changes in cached data + */ + _UID_callback(event) + { + // Copy to avoid changes, which may cause nm problems + const value = event === null ? null : jQuery.extend({}, event); + let parent = this.getParent(); + let parent_owner = parent.getDOMNode(parent).dataset['owner'] || parent.getParent().options.owner; + if (parent_owner.indexOf(',') >= 0) + { + parent_owner = parent_owner.split(','); + } + + // Make sure id is a string, check values + if (value) + { + this._values_check(value); + } + + // Check for changing days in the grid view + let state = this.getInstanceManager().app_obj.calendar.getState() || app.calendar.getState(); + if (!this._sameday_check(value) || !this._status_check(value, state.status_filter, parent_owner)) + { + // May need to update parent to remove out-of-view events + parent.removeChild(this); + if (event === null && parent && parent.instanceOf(et2_calendar_daycol)) + { + (parent)._out_of_view(); + } + + // This should now cease to exist, as new events have been created + this.destroy(); + return; + } + + // Copy to avoid changes, which may cause nm problems + this.options.value = jQuery.extend({}, value); + + if (this.getParent().options.date) + { + this.options.value.date = this.getParent().options.date; + } + + // Let parent position - could also be et2_calendar_planner_row + (this.getParent()).position_event(this); + + // Parent may remove this if the date isn't the same + if (this.getParent()) + { + this._update(); + } + } + + /** + * Draw the event + */ + _update() + { + + // Update to reflect new information + const event = this.options.value; + + const id = event.row_id ? event.row_id : event.id + (event.recur_type ? ':' + event.recur_date : ''); + const formatted_start = event.start.toJSON(); + + this.set_id('event_' + id); + if (this._actionObject) + { + this._actionObject.id = 'calendar::' + id; + } + + this._need_actions_linked = !this.options.readonly; + + // Make sure category stuff is there + // Fake it to use the cache / call - if already there, these will return + // immediately. + const im = this.getInstanceManager(); + et2_selectbox.cat_options({ + _type: 'select-cat', + getInstanceManager: function () + { + return im; + } + }, + {application: event.app || 'calendar'} + ); + + // Need cleaning? (DnD helper removes content) + // @ts-ignore + if (!this.div.has(this.title).length) + { + this.div + .empty() + .append(this.title) + .append(this.body); + } + if (!this.getParent().options.readonly && !this.options.readonly && this.div.droppable('instance')) + { + this.div + // Let timegrid always get the drag + .droppable('option', 'greedy', false); + } + let tooltip = jQuery(this._tooltip()).text(); + // DOM nodes + this.div + // Set full day flag + .attr('data-full_day', event.whole_day) + + // Put everything we need for basic interaction here, so it's available immediately + .attr('data-id', event.id) + .attr('data-app', event.app || 'calendar') + .attr('data-app_id', event.app_id) + .attr('data-start', formatted_start) + .attr('data-owner', event.owner) + .attr('data-recur_type', event.recur_type) + .attr('data-resize', event.whole_day ? 'WD' : '' + (event.recur_type ? 'S' : '')) + .attr('data-priority', event.priority) + // Accessibility + .attr("tabindex", 0) + .attr("aria-label", tooltip) + // Remove any category classes + .removeClass(function (index, css) + { + return (css.match(/(^|\s)cat_\S+/g) || []).join(' '); + }) + // Remove any status classes + .removeClass(function (index, css) + { + return (css.match(/calendar_calEvent\S+/g) || []).join(' '); + }) + .removeClass('calendar_calEventSmall') + .addClass(event.class) + .toggleClass('calendar_calEventPrivate', typeof event.private !== 'undefined' && event.private); + this.options.class = event.class; + const status_class = this._status_class(); + + // Add category classes, if real categories are set + if (event.category && event.category != '0') + { + const cats = event.category.split(','); + for (let i = 0; i < cats.length; i++) + { + this.div.addClass('cat_' + cats[i]); + } + } + + this.div.toggleClass('calendar_calEventUnknown', event.participants[egw.user('account_id')] ? event.participants[egw.user('account_id')][0] === 'U' : false); + this.div.addClass(status_class); + + this.body.toggleClass('calendar_calEventBodySmall', event.whole_day_on_top || false); + + // Header + const title = !event.is_private ? egw.htmlspecialchars(event['title']) : egw.lang('private'); + + this.title + .html('' + this._get_timespan(event) + '
') + .append('' + title + ''); + + // Colors - don't make them transparent if there is no color + // @ts-ignore + if (jQuery.Color("rgba(0,0,0,0)").toRgbaString() != jQuery.Color(this.div, 'background-color').toRgbaString()) + { + // Most statuses use colored borders + this.div.css('border-color', this.div.css('background-color')); + } + + this.icons.appendTo(this.title) + .html(this._icons().join('')); + + // Body + if (event.whole_day_on_top) + { + this.body.html(title); + } + else + { + // @ts-ignore + const start_time = jQuery.datepicker.formatTime( + egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", + { + hour: event.start_m / 60, + minute: event.start_m % 60, + seconds: 0, + timezone: 0 + }, + {"ampm": (egw.preference("timeformat") === "12")} + ).trim(); + + this.body + .html('' + title + '') + .append('' + start_time + ''); + if (this.options.value.description.trim()) + { + this.body + .append('

' + egw.htmlspecialchars(this.options.value.description) + '

'); + } + } + + // Clear tooltip for regeneration + this.set_statustext(''); + + // Height specific section + // This can take an unreasonable amount of time if parent is hidden + if (jQuery((this.getParent()).getDOMNode(this)).is(':visible')) + { + this._small_size(); + } + } + + /** + * Calculate display variants for when event is too short for full display + * + * Display is based on the number of visible lines, calculated off the header + * height: + * 1 - show just the event title, with ellipsis + * 2 - Show timespan and title, with ellipsis + * > 4 - Show description as well, truncated to fit + */ + _small_size() + { + + if (this.options.value.whole_day_on_top) return; + + // Skip for planner view, it's always small + if (this.getParent() && this.getParent().instanceOf(et2_calendar_planner_row)) return; + + // Pre-calculation reset + this.div.removeClass('calendar_calEventSmall'); + this.body.css('height', 'auto'); + + const line_height = parseFloat(this.div.css('line-height')); + let visible_lines = Math.floor(this.div.innerHeight() / line_height); + + if (!this.title.height()) + { + // Handle sizing while hidden, such as when calendar is not the active tab + visible_lines = Math.floor(egw.getHiddenDimensions(this.div).h / egw.getHiddenDimensions(this.title).h); + } + visible_lines = Math.max(1, visible_lines); + + if (this.getParent() && this.getParent().instanceOf(et2_calendar_daycol)) + { + this.div.toggleClass('calendar_calEventSmall', visible_lines < 4); + this.div + .attr('data-visible_lines', visible_lines); + } + else if (this.getParent() && this.getParent().instanceOf(et2_calendar_planner_row)) + { + // Less than 8 hours is small + this.div.toggleClass('calendar_calEventSmall', this.options.value.end.valueOf() - this.options.value.start.valueOf() < 28800000); + } + + + if (this.body.height() > this.div.height() - this.title.height() && visible_lines >= 4) + { + this.body.css('height', Math.floor((visible_lines - 1) * line_height - this.title.height()) + 'px'); + } + else + { + this.body.css('height', ''); + } + } + + /** + * Examines the participants & returns CSS classname for status + * + * @returns {String} + */ + _status_class() + { + let status_class = 'calendar_calEventAllAccepted'; + for (let id in this.options.value.participants) + { + let status = this.options.value.participants[id]; + + status = et2_calendar_event.split_status(status); + + switch (status) + { + case 'A': + case '': // app without status + break; + case 'U': + status_class = 'calendar_calEventSomeUnknown'; + return status_class; // break for + default: + status_class = 'calendar_calEventAllAnswered'; + break; + } + } + return status_class; + } + + /** + * Create tooltip shown on hover + * + * @return {String} + */ + _tooltip() + { + if (!this.div || !this.options.value || !this.options.value.app_id) return ''; + + const border = this.div.css('borderTopColor'); + const bg_color = this.div.css('background-color'); + const header_color = this.title.css('color'); + const timespan = this._get_timespan(this.options.value); + const parent = this.getParent() instanceof et2_calendar_daycol ? (this.getParent()) : (this.getParent()); + + parent.date_helper.set_value(this.options.value.start.valueOf ? new Date(this.options.value.start) : this.options.value.start); + const start = parent.date_helper.input_date.val(); + parent.date_helper.set_value(this.options.value.end.valueOf ? new Date(this.options.value.end) : this.options.value.end); + const end = parent.date_helper.input_date.val(); + + const times = !this.options.value.multiday ? + '' + this.egw().lang('Time') + ':' + timespan : + '' + this.egw().lang('Start') + ':' + start + ' ' + + '' + this.egw().lang('End') + ':' + end; + let cat_label: (string | string[]) = ''; + if (this.options.value.category) + { + const cat = et2_createWidget('select-cat', {'readonly': true}, this); + cat.set_value(this.options.value.category); + cat_label = this.options.value.category.indexOf(',') <= 0 ? cat.span.text() : []; + if (typeof cat_label != 'string') + { + cat.span.children().each(function () + { + (cat_label).push(jQuery(this).text()); + }); + cat_label = cat_label.join(', '); + } + cat.destroy(); + } + + // Activate links in description + let description_node = document.createElement("p"); + description_node.className = "calendar_calEvent_description"; + et2_insertLinkText( + et2_activateLinks(egw.htmlspecialchars(this.options.value.description)), description_node, '_blank' + ); + + // Location + Videoconference + let location = ''; + if (this.options.value.location || this.options.value['##videoconference']) + { + location = '

'; + let location_node = document.createElement("span"); + location_node.className = "calendar_calEventLabel"; + et2_insertLinkText(et2_activateLinks( + this.egw().lang('Location') + ':' + + egw.htmlspecialchars(this.options.value.location)), location_node, '_blank'); + location += location_node.outerHTML; + + if (this.options.value['##videoconference']) + { + // Click handler is set in _bind_videoconference() + location += (this.options.value.location.trim() ? '
' : '') + + '' + + this.egw().lang('Video conference') + + ''; + this._bind_videoconference(); + } + location += '

'; + } + + // Participants + let participants = ''; + if (this.options.value.participant_types['']) + { + participants += this.options.value.participant_types[''].join("
"); + } + for (let type_name in this.options.value.participant_types) + { + if (type_name) + { + participants += '

' + type_name + ':
'; + participants += this.options.value.participant_types[type_name].join("
"); + } + } + + return '

' + + '
' + + '' + timespan + '' + + this.icons[0].outerHTML + + '
' + + '
' + + '

' + egw.htmlspecialchars(this.options.value.title) + '


' + + description_node.outerHTML + + '

' + times + '

' + + location + + (cat_label ? '

' + this.egw().lang('Category') + ':

' + cat_label + '

' : '') + + '

' + this.egw().lang('Participants') + ':


' + + participants + '

' + this._participant_summary(this.options.value.participants) + + '
' + + '
'; + } + + /** + * Generate participant summary line + * + * @returns {String} + */ + _participant_summary(participants) + { + if (Object.keys(this.options.value.participants).length < 2) + { + return ''; + } + + const participant_status = {A: 0, R: 0, T: 0, U: 0, D: 0}; + const status_label = {A: 'accepted', R: 'rejected', T: 'tentative', U: 'unknown', D: 'delegated'}; + const participant_summary = Object.keys(this.options.value.participants).length + ' ' + this.egw().lang('Participants') + ': '; + const status_totals = []; + + for (let id in this.options.value.participants) + { + var status = this.options.value.participants[id].substr(0, 1); + participant_status[status]++; + } + for (let status in participant_status) + { + if (participant_status[status] > 0) + { + status_totals.push(participant_status[status] + ' ' + this.egw().lang(status_label[status])); + } + } + return participant_summary + status_totals.join(', '); + } + + /** + * Get actual icons from list + */ + _icons(): string[] + { + const icons = []; + + if (this.options.value.is_private) + { + // Hide everything + icons.push(''); + } + else + { + if (this.options.value.icons) + { + jQuery.extend(icons, this.options.value.icons); + } + else if (this.options.value.app !== 'calendar') + { + let app_icon = "" + (egw.link_get_registry(this.options.value.app, 'icon') || (this.options.value.app + '/navbar')); + icons.push(''); + } + if (this.options.value.priority == 3) + { + icons.push(''); + } + if (this.options.value.public == '0') + { + // Show private flag + icons.push(''); + } + if (this.options.value['recur_type']) + { + icons.push(''); + } + // icons for single user, multiple users or group(s) and resources + const single = ''; + const multiple = ''; + for (const uid in this.options.value['participants']) + { + // @ts-ignore + if (Object.keys(this.options.value.participants).length == 1 && !isNaN(uid)) + { + icons.push(single); + break; + } + // @ts-ignore + if (!isNaN(uid) && icons.indexOf(multiple) === -1) + { + icons.push(multiple); + } + /* + * TODO: resource icons + elseif(!isset($icons[$uid[0]]) && isset($this->bo->resources[$uid[0]]) && isset($this->bo->resources[$uid[0]]['icon'])) + { + $icons[$uid[0]] = html::image($this->bo->resources[$uid[0]]['app'], + ($this->bo->resources[$uid[0]]['icon'] ? $this->bo->resources[$uid[0]]['icon'] : 'navbar'), + lang($this->bo->resources[$uid[0]]['app']), + 'width="16px" height="16px"'); + } + */ + } + + if (this.options.value.alarm && !jQuery.isEmptyObject(this.options.value.alarm) && !this.options.value.is_private) + { + icons.push(''); + } + if (this.options.value.participants[egw.user('account_id')] && this.options.value.participants[egw.user('account_id')][0] == 'U') + { + icons.push(''); + } + if (this.options.value["##videoconference"]) + { + icons.push(''); + } + } + + // Always include non-blocking, regardless of privacy + if (this.options.value.non_blocking) + { + icons.push(''); + } + return icons; + } + + /** + * Bind the click handler for opening the video conference + * + * Tooltips are placed in the DOM directly in the body, managed by egw. + */ + _bind_videoconference() + { + let vc_event = 'click.calendar_videoconference'; + jQuery('body').off(vc_event) + .on(vc_event, '[data-videoconference]', function (event) + { + let data = egw.dataGetUIDdata("calendar::" + this.dataset.id); + app.calendar.joinVideoConference(this.dataset.videoconference, data.data || this.dataset); + }); + } + + /** + * Get a text representation of the timespan of the event. Either start + * - end, or 'all day' + * + * @param {Object} event Event to get the timespan for + * @param {number} event.start_m Event start, in minutes from midnight + * @param {number} event.end_m Event end, in minutes from midnight + * + * @return {string} Timespan + */ + _get_timespan(event) + { + let timespan = ''; + if (event['start_m'] === 0 && event['end_m'] >= 24 * 60 - 1) + { + if (event['end_m'] > 24 * 60) + { + // @ts-ignore + timespan = jQuery.datepicker.formatTime( + egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", + { + hour: event.start_m / 60, + minute: event.start_m % 60, + seconds: 0, + timezone: 0 + }, + {"ampm": (egw.preference("timeformat") === "12")} + // @ts-ignore + ).trim() + ' - ' + jQuery.datepicker.formatTime( + egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", + { + hour: event.end_m / 60, + minute: event.end_m % 60, + seconds: 0, + timezone: 0 + }, + {"ampm": (egw.preference("timeformat") === "12")} + ).trim(); + } + else + { + timespan = this.egw().lang('Whole day'); + } + } + else + { + let duration: string | number = event.multiday ? + (event.end - event.start) / 60000 : + (event.end_m - event.start_m); + duration = Math.floor(duration / 60) + this.egw().lang('h') + (duration % 60 ? duration % 60 : ''); + + // @ts-ignore + timespan = jQuery.datepicker.formatTime( + egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", + { + hour: event.start_m / 60, + minute: event.start_m % 60, + seconds: 0, + timezone: 0 + }, + {"ampm": (egw.preference("timeformat") === "12")} + ).trim(); + + // @ts-ignore + timespan += ' - ' + jQuery.datepicker.formatTime( + egw.preference("timeformat") === "12" ? "h:mmtt" : "HH:mm", + { + hour: event.end_m / 60, + minute: event.end_m % 60, + seconds: 0, + timezone: 0 + }, + {"ampm": (egw.preference("timeformat") === "12")} + ).trim(); + + timespan += ': ' + duration; + } + return timespan; + } + + /** + * Make sure event data has all proper values, and format them as expected + * @param {Object} event + */ + _values_check(event) + { + // Make sure ID is a string + if (event.id) + { + event.id = '' + event.id; + } + + // Parent might be a daycol or a planner_row + let parent = this.getParent(); + + // Use dates as objects + if (typeof event.start !== 'object') + { + parent.date_helper.set_value(event.start); + event.start = new Date(parent.date_helper.getValue()); + } + if (typeof event.end !== 'object') + { + parent.date_helper.set_value(event.end); + event.end = new Date(parent.date_helper.getValue()); + } + + // We need minutes for durations + if (typeof event.start_m === 'undefined') + { + event.start_m = event.start.getUTCHours() * 60 + event.start.getUTCMinutes(); + event.end_m = event.end.getUTCHours() * 60 + event.end.getUTCMinutes(); + } + if (typeof event.multiday === 'undefined') + { + event.multiday = (event.start.getUTCFullYear() !== event.end.getUTCFullYear() || + event.start.getUTCMonth() !== event.end.getUTCMonth() || + event.start.getUTCDate() != event.end.getUTCDate()); + } + if (!event.start.getUTCHours() && !event.start.getUTCMinutes() && event.end.getUTCHours() == 23 && event.end.getUTCMinutes() == 59) + { + event.whole_day_on_top = (event.non_blocking && event.non_blocking != '0'); + } + } + + /** + * Check to see if the provided event information is for the same date as + * what we're currently expecting, and that it has not been changed. + * + * If the date has changed, we adjust the associated daywise caches to move + * the event's ID to where it should be. This check allows us to be more + * directly reliant on the data cache, and less on any other control logic + * elsewhere first. + * + * @param {Object} event Map of event data from cache + * @param {string} event.date For non-recurring, single day events, this is + * the date the event is on. + * @param {string} event.start Start of the event (used for multi-day events) + * @param {string} event.end End of the event (used for multi-day events) + * + * @return {Boolean} Provided event data is for the same date + */ + _sameday_check(event) + { + // Event somehow got orphaned, or deleted + if (!this.getParent() || event === null) + { + return false; + } + + // Also check participants against owner + const owner_match = et2_calendar_event.owner_check(event, this.getParent()); + + // Simple, same day + if (owner_match && this.options.value.date && event.date == this.options.value.date) + { + return true; + } + + // Multi-day non-recurring event spans days - date does not match + const event_start = new Date(event.start); + const event_end = new Date(event.end); + const parent = this.getParent(); + if (owner_match && (parent instanceof et2_calendar_daycol) && parent.getDate() >= event_start && parent.getDate() <= event_end) + { + return true; + } + + // Delete all old actions + if (this._actionObject) + { + this._actionObject.clear(); + this._actionObject.unregisterActions(); + this._actionObject = null; + } + + // Update daywise caches + const new_cache_id = CalendarApp._daywise_cache_id(event.date, this.getParent().options.owner); + let new_daywise: any = egw.dataGetUIDdata(new_cache_id); + new_daywise = new_daywise && new_daywise.data ? new_daywise.data : []; + let old_cache_id = ''; + if (this.options.value && this.options.value.date) + { + old_cache_id = CalendarApp._daywise_cache_id(this.options.value.date, parent.options.owner); + } + + if (new_cache_id != old_cache_id) + { + let old_daywise: any = egw.dataGetUIDdata(old_cache_id); + old_daywise = old_daywise && old_daywise.data ? old_daywise.data : []; + old_daywise.splice(old_daywise.indexOf(this.options.value.row_id), 1); + egw.dataStoreUID(old_cache_id, old_daywise); + + if (new_daywise.indexOf(event.row_id) < 0) + { + new_daywise.push(event.row_id); + } + if (egw.dataHasUID(new_cache_id)) + { + egw.dataStoreUID(new_cache_id, new_daywise); + } + } + + return false; + } + + /** + * Check that the event passes the given status filter. + * Status filter is set in the sidebox and used when fetching several events, but if user changes their status + * for an event, it may no longer match and have to be removed. + * + * @param event + * @param filter + * @param owner The owner of the target / parent, not the event owner + * @private + */ + _status_check(event, filter: string, owner: string | string[]): boolean + { + if (!owner || !event) + { + return false; + } + + // If we're doing a bunch, just one passing is enough + if (typeof owner !== "string") + { + let pass = false; + for (let j = 0; j < owner.length && pass == false; j++) + { + pass = pass || this._status_check(event, filter, owner[j]); + } + return pass; + } + + // Show also events just owned by selected user + // Group members can be owner too, those get handled when we check group memberships below + if (filter == 'owner' && owner == event.owner) + { + return true; + } + + // Get the relevant participant + let participant = event.participants[owner]; + + // If filter says don't look in groups, skip it all + if (!participant && filter === 'no-enum-groups') + { + return false; + } + + // Couldn't find the current owner in the participant list, check groups & resources + if (!participant) + { + let options: any = null; + if (app.calendar && app.calendar.sidebox_et2 && app.calendar.sidebox_et2.getWidgetById('owner')) + { + options = app.calendar.sidebox_et2.getWidgetById('owner').taglist.getSelection(); + } + if ((isNaN(parseInt(owner)) || parseInt(owner) < 0) && options && typeof options.find == "function") + { + let resource = options.find(function (element) + { + return element.id == owner; + }) || {}; + let matching_participant = typeof resource.resources == "undefined" ? + resource : + resource?.resources.filter(id => typeof event.participants[id] != "undefined"); + if (matching_participant.length > 0) + { + return this._status_check(event, filter, matching_participant); + } + else if (filter == 'owner' && resource && resource.resources && resource.resources.indexOf(event.owner)) + { + // owner param was a group but event is owned by someone in that group + return true; + } + } + } + + let status = et2_calendar_event.split_status(participant); + + switch (filter) + { + default: + case 'all': + return true; + case 'default': // Show all status, but rejected + return status !== 'R'; + case 'accepted': //Show only accepted events + return status === 'A' + case 'unknown': // Show only invitations, not yet accepted or rejected + return status === 'U'; + case 'tentative': // Show only tentative accepted events + return status === 'T'; + case 'delegated': // Show only delegated events + return status === 'D'; + case 'rejected': // Show only rejected events + return status === 'R'; + // Handled above + //case 'owner': // Show also events just owned by selected user + case 'hideprivate': // Show all events, as if they were private + // handled server-side + return true; + case 'showonlypublic': // Show only events flagged as public, -not checked as private + return event.public == '1'; + // Handled above + // case 'no-enum-groups': // Do not include events of group members + case 'not-unknown': // Show all status, but unknown + return status !== 'U'; + case 'deleted': // Show events that have been deleted + return event.deleted; + } + } + + attachToDOM() + { + let result = super.attachToDOM(); + + // Remove the binding for the click handler, unless there's something + // custom here. + if (!this.onclick) + { + jQuery(this.node).off("click"); + } + return result; + } + + /** + * Click handler calling custom handler set via onclick attribute to this.onclick. + * All other handling is done by the timegrid widget. + * + * @param {Event} _ev + * @returns {boolean} + */ + click(_ev) + { + let result = true; + if (typeof this.onclick == 'function') + { + // Make sure function gets a reference to the widget, splice it in as 2. argument if not + const args = Array.prototype.slice.call(arguments); + if (args.indexOf(this) == -1) args.splice(1, 0, this); + + result = this.onclick.apply(this, args); + } + return result; + } + + /** + * Show the recur prompt for this event + * + * Calls et2_calendar_event.recur_prompt with this event's value. + * + * @param {et2_calendar_event~prompt_callback} callback + * @param {Object} [extra_data] + */ + recur_prompt(callback, extra_data) + { + et2_calendar_event.recur_prompt(this.options.value, callback, extra_data); + } + + /** + * Show the series split prompt for this event + * + * Calls et2_calendar_event.series_split_prompt with this event's value. + * + * @param {et2_calendar_event~prompt_callback} callback + */ + series_split_prompt(callback) + { + et2_calendar_event.series_split_prompt(this.options.value, this.options.value.recur_date, callback); + } + + /** + * Copy the actions set on the parent, apply them to self + * + * This can take a while to do, so we try to do it only when needed - on mouseover + */ + _copy_parent_actions() + { + // Copy actions set in parent + if (!this.options.readonly && !this.getParent().options.readonly) + { + let action_parent: et2_widget = this; + while (action_parent != null && !action_parent.options.actions && + !(action_parent instanceof et2_container) + ) + { + action_parent = action_parent.getParent(); + } + try + { + this._link_actions(action_parent.options.actions || {}); + this._need_actions_linked = false; + } + catch (e) + { + // something went wrong, but keep quiet about it + } + } + } + + /** + * Link the actions to the DOM nodes / widget bits. + * + * @param {object} actions {ID: {attributes..}+} map of egw action information + */ + _link_actions(actions) + { + if (!this._actionObject) + { + // Get the top level element - timegrid or so + var objectManager = this.getParent()._actionObject || this.getParent().getParent()._actionObject || + egw_getAppObjectManager(true).getObjectById(this.getParent().getParent().getParent().id) || egw_getAppObjectManager(true); + this._actionObject = objectManager.getObjectById('calendar::' + this.options.value.row_id); + } + + if (this._actionObject == null) + { + // Add a new container to the object manager which will hold the widget + // objects + this._actionObject = objectManager.insertObject(false, new egwActionObject( + 'calendar::' + this.options.value.row_id, objectManager, et2_calendar_event.et2_event_action_object_impl(this, this.getDOMNode()), + this._actionManager || objectManager.manager.getActionById('calendar::' + this.options.value.row_id) || objectManager.manager + )); + } + else + { + this._actionObject.setAOI(et2_calendar_event.et2_event_action_object_impl(this, this.getDOMNode(this))); + } + + // Delete all old objects + this._actionObject.clear(); + this._actionObject.unregisterActions(); + + // Go over the widget & add links - this is where we decide which actions are + // 'allowed' for this widget at this time + const action_links = this._get_action_links(actions); + action_links.push('egw_link_drag'); + action_links.push('egw_link_drop'); + if (this._actionObject.parent.getActionLink('invite')) + { + action_links.push('invite'); + } + this._actionObject.updateActionLinks(action_links); + } + + /** + * Code for implementing et2_IDetachedDOM + * + * @param {array} _attrs array to add further attributes to + */ + getDetachedAttributes(_attrs) + { + + } + + getDetachedNodes() + { + return [this.getDOMNode()]; + } + + setDetachedAttributes(_nodes, _values) + { + + } + + // Static class stuff + /** + * Check event owner against a parent object + * + * As an event is edited, its participants may change. Also, as the state + * changes we may change which events are displayed and show the same event + * in several places for different users. Here we check the event participants + * against an owner value (which may be an array) to see if the event should be + * displayed or included. + * + * @param {Object} event - Event information + * @param {et2_widget_daycol|et2_widget_planner_row} parent - potential parent object + * that has an owner option + * @param {boolean} [owner_too] - Include the event owner in consideration, or only + * event participants + * + * @return {boolean} Should the event be displayed + */ + static owner_check(event, parent, owner_too?) + { + let owner_match = true; + let state = (parent.getInstanceManager ? parent.getInstanceManager().app_obj.calendar.state : false) || app.calendar?.state || {} + if (typeof owner_too === 'undefined' && state.status_filter) + { + owner_too = state.status_filter === 'owner'; + } + let options: any = null; + if (app.calendar && app.calendar.sidebox_et2 && app.calendar.sidebox_et2.getWidgetById('owner')) + { + options = app.calendar.sidebox_et2.getWidgetById('owner').taglist.getSelection(); + } + else + { + options = parent.getArrayMgr("sel_options").getRoot().getEntry('owner'); + } + if (event.participants && typeof parent.options.owner != 'undefined' && parent.options.owner.length > 0) + { + var parent_owner = jQuery.extend([], typeof parent.options.owner !== 'object' ? + [parent.options.owner] : + parent.options.owner); + owner_match = false; + const length = parent_owner.length; + for (var i = 0; i < length; i++) + { + // Handle groups & grouped resources like mailing lists, they won't match so + // we need the list - pull it from sidebox owner + if ((isNaN(parent_owner[i]) || parent_owner[i] < 0) && options && typeof options.find == "function") + { + var resource = options.find(function (element) + { + return element.id == parent_owner[i]; + }) || {}; + if (resource && resource.resources) + { + parent_owner.splice(i, 1); + i--; + parent_owner = parent_owner.concat(resource.resources); + + } + } + } + let participants = jQuery.extend([], Object.keys(event.participants)); + for (var i = 0; i < participants.length; i++) + { + const id = participants[i]; + // Expand group invitations + if (parseInt(id) < 0) + { + // Add in groups, if we can get them from options, great + var resource; + if (options && options.find && (resource = options.find(function (element) + { + return element.id === id; + })) && resource.resources) + { + participants = participants.concat(resource.resources); + } + else + { + // Add in groups, if we can get them (this is asynchronous) + egw.accountData(id, 'account_id', true, function (members) + { + participants = participants.concat(Object.keys(members)); + }, this); + } + } + if (parent.options.owner == id || + parent_owner.indexOf && + parent_owner.indexOf(id) >= 0) + { + owner_match = true; + break; + } + } + } + if (owner_too && !owner_match) + { + owner_match = (parent.options.owner == event.owner || + parent_owner.indexOf && + parent_owner.indexOf(event.owner) >= 0); + } + return owner_match; + } + + /** + * @callback et2_calendar_event~prompt_callback + * @param {string} button_id - One of ok, exception, series, single or cancel + * depending on which buttons are on the prompt + * @param {Object} event_data - Event information - whatever you passed in to + * the prompt. + */ + /** + * Recur prompt + * If the event is recurring, asks the user if they want to edit the event as + * an exception, or change the whole series. Then the callback is called. + * + * If callback is not provided, egw.open() will be used to open an edit dialog. + * + * If you call this on a single (non-recurring) event, the callback will be + * executed immediately, with the passed button_id as 'single'. + * + * @param {Object} event_data - Event information + * @param {string} event_data.id - Unique ID for the event, possibly with a + * timestamp + * @param {string|Date} event_data.start - Start date/time for the event + * @param {number} event_data.recur_type - Recur type, or 0 for a non-recurring event + * @param {et2_calendar_event~prompt_callback} [callback] - Callback is + * called with the button (exception, series, single or cancel) and the event + * data. + * @param {Object} [extra_data] - Additional data passed to the callback, used + * as extra parameters for default callback + * + * @augments {et2_calendar_event} + */ + public static recur_prompt(event_data, callback?, extra_data?) + { + let egw; + const edit_id = event_data.app_id; + const edit_date = event_data.start; + + // seems window.opener somehow in certain conditions could be from different origin + // we try to catch the exception and in this case retrieve the egw object from current window. + try + { + egw = this.egw ? (typeof this.egw == 'function' ? this.egw() : this.egw) : window.opener && typeof window.opener.egw != 'undefined' ? window.opener.egw('calendar') : window.egw('calendar'); + } + catch (e) + { + egw = window.egw('calendar'); + } + + const that = this; + + const extra_params = extra_data && typeof extra_data == 'object' ? extra_data : {}; + extra_params.date = edit_date.toJSON ? edit_date.toJSON() : edit_date; + if (typeof callback != 'function') + { + callback = function (_button_id) + { + switch (_button_id) + { + case 'exception': + extra_params.exception = '1'; + egw.open(edit_id, event_data.app || 'calendar', 'edit', extra_params); + break; + case 'series': + case 'single': + egw.open(edit_id, event_data.app || 'calendar', 'edit', extra_params); + break; + case 'cancel': + default: + break; + } + }; + } + if (parseInt(event_data.recur_type)) + { + const buttons = [ + {text: egw.lang("Edit exception"), id: "exception", class: "ui-priority-primary", "default": true}, + {text: egw.lang("Edit series"), id: "series"}, + {text: egw.lang("Cancel"), id: "cancel"} + ]; + et2_dialog.show_dialog( + function (button_id) + { + callback.call(that, button_id, event_data); + }, + (!event_data.is_private ? event_data['title'] : egw.lang('private')) + "\n" + + egw.lang("Do you want to edit this event as an exception or the whole series?"), + egw.lang("This event is part of a series"), {}, buttons, et2_dialog.QUESTION_MESSAGE + ); + } + else + { + callback.call(this, 'single', event_data); + } + } + + /** + * Split series prompt + * + * If the event is recurring and the user adjusts the time or duration, we may need + * to split the series, ending the current one and creating a new one with the changes. + * This prompts the user if they really want to do that. + * + * There is no default callback, and nothing happens if you call this on a + * single (non-recurring) event + * + * @param {Object} event_data - Event information + * @param {string} event_data.id - Unique ID for the event, possibly with a timestamp + * @param {string|Date} instance_date - The date of the edited instance of the event + * @param {et2_calendar_event~prompt_callback} callback - Callback is + * called with the button (ok or cancel) and the event data. + * @augments {et2_calendar_event} + */ + public static series_split_prompt(event_data, instance_date, callback) + { + let egw; + // seems window.opener somehow in certian conditions could be from different origin + // we try to catch the exception and in this case retrieve the egw object from current window. + try + { + egw = this.egw ? (typeof this.egw == 'function' ? this.egw() : this.egw) : window.opener && typeof window.opener.egw != 'undefined' ? window.opener.egw('calendar') : window.egw('calendar'); + } + catch (e) + { + egw = window.egw('calendar'); + } + + const that = this; + + if (typeof instance_date == 'string') + { + instance_date = new Date(instance_date); + } + + // Check for modifying a series that started before today + const tempDate = new Date(); + const today = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate(), tempDate.getHours(), -tempDate.getTimezoneOffset(), tempDate.getSeconds()); + const termination_date = instance_date < today ? egw.lang('today') : date(egw.preference('dateformat'), instance_date); + + if (parseInt(event_data.recur_type)) + { + et2_dialog.show_dialog( + function (button_id) + { + callback.call(that, button_id, event_data); + }, + (!event_data.is_private ? event_data['title'] : egw.lang('private')) + "\n" + + egw.lang("Do you really want to change the start of this series? If you do, the original series will be terminated as of %1 and a new series for the future reflecting your changes will be created.", termination_date), + egw.lang("This event is part of a series"), {}, et2_dialog.BUTTONS_OK_CANCEL, et2_dialog.WARNING_MESSAGE + ); + } + } + + public static drag_helper(event, ui) + { + ui.helper.width(ui.width()); + } + + /** + * splits the combined status, quantity and role + * + * @param {string} status - combined value, O: status letter: U, T, A, R + * @param {int} [quantity] - quantity + * @param {string} [role] + * @return string status U, T, A or R, same as $status parameter on return + */ + public static split_status(status, quantity?, role?) + { + quantity = 1; + role = 'REQ-PARTICIPANT'; + //error_log(__METHOD__.__LINE__.array2string($status)); + let matches = null; + if (typeof status === 'string' && status.length > 1) + { + matches = status.match(/^.([0-9]*)(.*)$/gi); + } + if (matches) + { + if (parseInt(matches[1]) > 0) quantity = parseInt(matches[1]); + if (matches[2]) role = matches[2]; + status = status[0]; + } + else if (status === true) + { + status = 'U'; + } + return status; + } + + /** + * The egw_action system requires an egwActionObjectInterface Interface implementation + * to tie actions to DOM nodes. I'm not sure if we need this. + * + * The class extension is different than the widgets + * + * @param {et2_DOMWidget} widget + * @param {Object} node + * + */ + public static et2_event_action_object_impl(widget, node) + { + const aoi = new et2_action_object_impl(widget, node).getAOI(); + + // _outerCall may be used to determine, whether the state change has been + // evoked from the outside and the stateChangeCallback has to be called + // or not. + aoi.doSetState = function (_state, _outerCall) + { + }; + + return aoi; + } } + et2_register_widget(et2_calendar_event, ["calendar-event"]); \ No newline at end of file