diff --git a/.docker/release/files/usr/local/include/application.ini b/.docker/release/files/usr/local/include/application.ini index d7695abb9..ed077dbbc 100644 --- a/.docker/release/files/usr/local/include/application.ini +++ b/.docker/release/files/usr/local/include/application.ini @@ -292,5 +292,5 @@ dev_email = "" dev_password = "" [version] -current = "2.7.2" +current = "2.7.3" saved = "Mon, 23 Aug 2021 07:55:13 +0000" diff --git a/README.md b/README.md index 6daddb5a4..93845af62 100644 --- a/README.md +++ b/README.md @@ -129,23 +129,23 @@ RainLoop 1.15 vs SnappyMail |js/* |RainLoop |Snappy | |--------------- |--------: |--------: | -|admin.js |2.158.025 | 86.143 | -|app.js |4.215.733 | 435.037 | +|admin.js |2.158.025 | 86.179 | +|app.js |4.215.733 | 435.073 | |boot.js | 672.433 | 2.707 | -|libs.js | 647.679 | 213.208 | +|libs.js | 647.679 | 211.161 | |polyfills.js | 325.908 | 0 | |serviceworker.js | 0 | 285 | -|TOTAL |8.019.778 | 737.380 | +|TOTAL |8.019.778 | 735.405 | |js/min/* |RainLoop |Snappy |RL gzip |SM gzip |RL brotli |SM brotli | |--------------- |--------: |--------: |------: |------: |--------: |--------: | -|admin.min.js | 255.514 | 43.930 | 73.899 | 13.591 | 60.674 | 12.162 | -|app.min.js | 516.000 | 222.420 |140.430 | 66.268 |110.657 | 56.207 | +|admin.min.js | 255.514 | 43.957 | 73.899 | 13.590 | 60.674 | 12.174 | +|app.min.js | 516.000 | 222.447 |140.430 | 66.271 |110.657 | 56.274 | |boot.min.js | 66.456 | 1.621 | 22.553 | 983 | 20.043 | 805 | -|libs.min.js | 574.626 | 102.959 |177.280 | 37.514 |151.855 | 33.617 | +|libs.min.js | 574.626 | 101.006 |177.280 | 36.780 |151.855 | 32.955 | |polyfills.min.js | 32.608 | 0 | 11.315 | 0 | 10.072 | 0 | -|TOTAL |1.445.204 | 370.930 |425.477 |118.356 |353.301 |102.791 | -|TOTAL (no admin) |1.189.690 | 327.000 |351.061 |104.765 |292.627 | 90.629 | +|TOTAL |1.445.204 | 369.031 |425.477 |117.624 |353.301 |102.208 | +|TOTAL (no admin) |1.189.690 | 325.074 |351.061 |104.034 |292.627 | 90.034 | For a user its around 68% smaller and faster than traditional RainLoop. diff --git a/integrations/nextcloud/snappymail/VERSION b/integrations/nextcloud/snappymail/VERSION index fbafd6b60..e2bdf6e45 100755 --- a/integrations/nextcloud/snappymail/VERSION +++ b/integrations/nextcloud/snappymail/VERSION @@ -1 +1 @@ -2.7.2 \ No newline at end of file +2.7.3 \ No newline at end of file diff --git a/integrations/nextcloud/snappymail/appinfo/info.xml b/integrations/nextcloud/snappymail/appinfo/info.xml index 9dfbe71ee..0597048c8 100644 --- a/integrations/nextcloud/snappymail/appinfo/info.xml +++ b/integrations/nextcloud/snappymail/appinfo/info.xml @@ -4,7 +4,7 @@ SnappyMail SnappyMail Webmail Simple, modern and fast web-based email client. After enabling in Nextcloud, go to Nextcloud admin panel, "Additionnal settings" and you will see a "SnappyMail webmail" section. There, click on the link to go to the SnappyMail admin panel. The default user/password is admin/12345. This version is based on SnappyMail 2.6.0 (2021-07). - 2.7.2 + 2.7.3 agpl SnappyMail Team, Nextgen-Networks, Tab Fitts, Nathan Kinkade, Pierre-Alain Bandinelli SnappyMail diff --git a/package.json b/package.json index ba1c834b6..762ed160d 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "title": "SnappyMail", "description": "Simple, modern & fast web-based email client", "private": true, - "version": "2.7.2", + "version": "2.7.3", "homepage": "https://snappymail.eu", "author": { "name": "DJ Maze", diff --git a/snappymail/v/0.0.0/app/templates/Views/User/PopupsCompose.html b/snappymail/v/0.0.0/app/templates/Views/User/PopupsCompose.html index ec589784e..c959a19bf 100644 --- a/snappymail/v/0.0.0/app/templates/Views/User/PopupsCompose.html +++ b/snappymail/v/0.0.0/app/templates/Views/User/PopupsCompose.html @@ -68,11 +68,9 @@ -
 
📇
-
 
{ // In the future, "ko" may become distinct from "koExports" (so that non-exported objects are not reachable) // At that point, "target" would be set to: (typeof koExports !== "undefined" ? koExports : ko) - var target = ko; + var target = ko, i = 0, l = tokens.length - 1; - for (var i = 0; i < tokens.length - 1; i++) + for (; i < l; i++) target = target[tokens[i]]; - target[tokens[tokens.length - 1]] = object; + target[tokens[l]] = object; }; ko.exportProperty = (owner, publicName, object) => owner[publicName] = object; ko.exportSymbol('version', "3.5.1-sm"); @@ -105,7 +105,7 @@ ko.utils = { string.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g, ''), domNodeIsAttachedToDocument: node => - node.ownerDocument.documentElement.contains(node.nodeType !== 1 ? node.parentNode : node), + node.ownerDocument.documentElement.contains(node.nodeType !== 1 ? node.parentNode : node), triggerEvent: (element, eventType) => { if (!(element && element.nodeType)) @@ -366,7 +366,6 @@ class koSubscription this._node = null; this._domNodeDisposalCallback = null; ko.exportProperty(this, 'dispose', this.dispose); - ko.exportProperty(this, 'disposeWhenNodeIsRemoved', this.disposeWhenNodeIsRemoved); } dispose() { @@ -2350,17 +2349,17 @@ ko.expressionRewriting = (() => { clearCachedDefinition: componentName => delete loadedDefinitionsCache[componentName], - register: (componentName, config) => { - if (!config) { - throw new Error('Invalid configuration for ' + componentName); - } + register: (componentName, config) => { + if (!config) { + throw new Error('Invalid configuration for ' + componentName); + } - if (defaultConfigRegistry[componentName]) { - throw new Error('Component ' + componentName + ' is already registered'); - } + if (defaultConfigRegistry[componentName]) { + throw new Error('Component ' + componentName + ' is already registered'); + } - defaultConfigRegistry[componentName] = config; - } + defaultConfigRegistry[componentName] = config; + } }; // The default loader is responsible for two things: @@ -2376,49 +2375,49 @@ ko.expressionRewriting = (() => { var defaultConfigRegistry = Object.create(null); var createViewModelKey = 'createViewModel'; - // Takes a config object of the form { template: ..., viewModel: ... }, and asynchronously convert it - // into the standard component definition format: - // { template: , createViewModel: function(params, componentInfo) { ... } }. - // Since both template and viewModel may need to be resolved asynchronously, both tasks are performed - // in parallel, and the results joined when both are ready. We don't depend on any promises infrastructure, - // so this is implemented manually below. + // Takes a config object of the form { template: ..., viewModel: ... }, and asynchronously convert it + // into the standard component definition format: + // { template: , createViewModel: function(params, componentInfo) { ... } }. + // Since both template and viewModel may need to be resolved asynchronously, both tasks are performed + // in parallel, and the results joined when both are ready. We don't depend on any promises infrastructure, + // so this is implemented manually below. function loadComponent(componentName, callback) { - var result = {}, - config = defaultConfigRegistry[componentName] || {}, - templateConfig = config['template'], - viewModelConfig = config['viewModel']; + var result = {}, + config = defaultConfigRegistry[componentName] || {}, + templateConfig = config['template'], + viewModelConfig = config['viewModel']; - if (templateConfig) { - if (!templateConfig['element']) { - throwError(componentName, 'Unknown template value: ' + templateConfig); - } - // Element ID - find it, then copy its child nodes - var element = templateConfig['element']; - var elemInstance = document.getElementById(element); - if (!elemInstance) { - throwError(componentName, 'Cannot find element with ID ' + element); - } - if (!elemInstance.matches('TEMPLATE')) { - throwError(componentName, 'Template Source Element not a