diff --git a/CHANGELOG.md b/CHANGELOG.md index af83d148f..b485f257c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,48 @@ +# Dodo release (v3.3.0) + +## Goals + +We've continued to prioritize the development of team-centric features in CryptPad. This release was focused on stabilizing the code for Teams and making them available to the users. + +## Update notes + +This is a pretty basic release: + +1. stop your server +2. pull the latest source code +3. install the latest serverside dependencies with `npm install` +4. install the latest clientside dependencies with `bower update` +5. restart your server + +Note: we've updated our Nginx configuration to fix any missing trailing slash in the URL for the newest applications: https://github.com/xwiki-labs/cryptpad/commit/d4e5b98c140c28417e008379ec7af7cdc235792b + +## Features + +* You can now create _Teams_ in CryptPad. They're available from a new _Teams_ application and provide a full CryptDrive that can be shared between multiple users. + * Each team has a list of members. There are currently 3 different access level for team members: + * Members: can add, delete and edit pads from the team + * Admins: can also invite their CryptPad friends to the team, kick members and promote members as "Admin" + * Owners: can also promote admins as "Owner", change the team name or avatar and delete the team + * Each team has its own storage limit (50 MB by default, the same as user accounts). + * A chat is available to all the team members + * Pads created from the team's drive will be stored in this drive. If they are created as _owned_ pads, they will be ownedcc by the team. + * You can share pads or folders from your drive with one of your teams and you can store pads or folders from your team to your personal drive. + * Each user can be a member of up to 3 teams. A user can't create a new Team if they are already _Owner_ of another one. +* We've done some server improvements to save CPU usage. +* We've also improved to the messenger module to save CPU and memory in the client. +* The support panel (administrator side) now provides more debugging information about the users who ask for help +* A link to the new CryptPad survey (https://survey.cryptpad.fr/index.php/672782?lang=en) has been added to the user menu + * This link can be changed or removed using the "surveyURL" key in `/customize/application_config.js`. An empty value will remove the link from the menu. + +## Bug fixes + +* We've fixed an issue preventing users to remove owned empty channels from the server +* Adding and editing new items to the kanban boards will now update the correct item from the board +* We've fixed an issue with shared folders loaded by unregistered users +* The default title is now always set in newly created polls +* Desktop notifications will now be displayed only once per connection to the server and not once per CryptPad tab in the browser +* The button to download a spreadsheet from the drive has been removed. This feature is not available yet and the button was doing nothing. + # Chilihueque release (v3.2.0) ## Goals diff --git a/customize.dist/pages.js b/customize.dist/pages.js index 43702f7cd..b1b36d029 100644 --- a/customize.dist/pages.js +++ b/customize.dist/pages.js @@ -103,7 +103,7 @@ define([ ])*/ ]) ]), - h('div.cp-version-footer', "CryptPad v3.2.0 (Chilihueque)") + h('div.cp-version-footer', "CryptPad v3.3.0 (Dodo)") ]); }; diff --git a/customize.dist/src/less2/include/sidebar-layout.less b/customize.dist/src/less2/include/sidebar-layout.less index c9e2fdb03..24228cfaf 100644 --- a/customize.dist/src/less2/include/sidebar-layout.less +++ b/customize.dist/src/less2/include/sidebar-layout.less @@ -48,7 +48,6 @@ flex: 0; } span.cp-sidebarlayout-category-name { - //margin-left: 5px; padding-left: 5px; white-space: nowrap; overflow: hidden; diff --git a/package.json b/package.json index d47aa5a2e..20500a960 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "realtime collaborative visual editor with zero knowlege server", - "version": "3.2.0", + "version": "3.3.0", "license": "AGPL-3.0+", "repository": { "type": "git", diff --git a/www/common/drive-ui.js b/www/common/drive-ui.js index 5d6ac55ad..197c31cd5 100644 --- a/www/common/drive-ui.js +++ b/www/common/drive-ui.js @@ -1141,6 +1141,9 @@ define([ //hide.push('download'); hide.push('openincode'); } + if ($element.is('.cp-border-color-sheet')) { + hide.push('download'); + } if ($element.is('.cp-app-drive-element-file')) { // No folder in files hide.push('color'); diff --git a/www/common/notify.js b/www/common/notify.js index 77a1e6815..a3c8cd2b8 100644 --- a/www/common/notify.js +++ b/www/common/notify.js @@ -30,10 +30,19 @@ define(['/api/config'], function (ApiConfig) { icon = DEFAULT_ALT; } - return new Notification(title,{ + var n = new Notification(title,{ icon: icon, body: msg, }); + n.onclick = function () { + if (!document) { return; } + try { + parent.focus(); + window.focus(); //just in case, older browsers + this.close(); + } catch (e) {} + }; + return n; }; Module.system = function (msg, title, icon) { diff --git a/www/common/outer/messenger.js b/www/common/outer/messenger.js index 133614494..8a97b7dc0 100644 --- a/www/common/outer/messenger.js +++ b/www/common/outer/messenger.js @@ -906,7 +906,8 @@ define([ emit: emit, friendsClients: [], channels: {}, - validateKeys: {} + validateKeys: {}, + range_requests: {} }; diff --git a/www/common/outer/team.js b/www/common/outer/team.js index 5063d0257..8fa3d65a6 100644 --- a/www/common/outer/team.js +++ b/www/common/outer/team.js @@ -655,8 +655,8 @@ define([ if (err) { console.error(err); } })); }).nThen(function () { - cb(); closeTeam(ctx, teamId); + cb(); }); }; diff --git a/www/common/translations/messages.ca.json b/www/common/translations/messages.ca.json index e409c9449..dd4c9c4ff 100644 --- a/www/common/translations/messages.ca.json +++ b/www/common/translations/messages.ca.json @@ -12,7 +12,8 @@ "media": "Multimèdia", "todo": "Tasques", "contacts": "Contactes", - "sheet": "Full (Beta)" + "sheet": "Full (Beta)", + "teams": "Equips" }, "button_newpad": "Nou document", "button_newcode": "Nova pàgina de codi", @@ -40,7 +41,7 @@ "error": "Error", "saved": "Desat", "synced": "S'ha desat tot", - "deleted": "Document esborrat del vostre CryptDrive", + "deleted": "Esborrat", "deletedFromServer": "Document esborrat del servidor", "mustLogin": "Cal que inicieu la sessió per accedir a aquesta pàgina", "disabledApp": "Aquesta aplicació està dehabilitada. Per a més informació, contacteu l'administració d'aquest CryptPad.", @@ -481,5 +482,30 @@ "settings_importDone": "S'ha acabat la importació", "settings_autostoreTitle": "Emmagatzematge de documents a CryptDrive", "edit": "Edita", - "autostore_sf": "Carpeta" + "autostore_sf": "Carpeta", + "padNotPinnedVariable": "Aquest document caducarà després de {4} dies d'inactivitat, {0}inicieu una sessió{1} o {2}registreu-vos{3} per conservar-lo.", + "uploadFolderButton": "Carregar una carpeta", + "fm_morePads": "Més", + "fc_color": "Canvia el color", + "fc_openInCode": "Obrir a l'editor de codi", + "fc_expandAll": "Desplega-ho tot", + "fc_collapseAll": "Plega-ho tot", + "register_emailWarning0": "Sembla que heu introduït la vostra adreça electrònica com identificador.", + "register_emailWarning1": "Podeu continuar, però aquestes dades no són necessàries i no s'enviaran al nostre servidor.", + "register_emailWarning2": "No podreu restablir la vostra contrasenya utilitzant la vostra adreça electrònica, com en molts altres serveis.", + "register_emailWarning3": "Si això us ha quedat clar i voleu seguir utilitzant la vostra adreça electrònica com identificador, cliqueu D'acord.", + "settings_autostoreHint": "L'emmagatzematge Automàtic dels documents permet de desar tots els documents que visiteu dins el vostre CryptDrive, sense que hàgiu de fer res de la vostra part.
L'emmagatzematge Manual (sense preguntar) permet que no es desin els documents automàticament. Sempre hi haurà l'opció de desar-los, però restarà oculta.", + "settings_autostoreYes": "Automàtic", + "settings_autostoreNo": "Manual (sense preguntar)", + "settings_autostoreMaybe": "Manual (preguntar sempre)", + "settings_userFeedbackTitle": "Retroacció", + "settings_userFeedbackHint1": "CryptPad pot enviar retroaccions molt limitades al servidor, de forma que ens permeti millorar l'experiència dels usuaris. ", + "settings_userFeedbackHint2": "El contingut dels vostres documents i les claus de desxifrat no es compartiran mai amb el servidor.", + "settings_userFeedback": "Activar l'enviament de retroaccions", + "settings_deleteTitle": "Supressió del compte", + "settings_deleteHint": "La supressió del vostre compte és permanent. El vostre CryptDrive i la vostra llista de documents seran suprimits del servidor. La resta de documents serà suprimida després de 90 dies d'inactivitat si ningú els ha desat al seu CryptDrive.", + "settings_deleteButton": "Suprimir el vostre compte", + "settings_deleteModal": "Envieu la següent informació a qui administri el vostre CryptPad per tal que les vostres dades siguin esborrades del servidor.", + "settings_deleteConfirm": "Segur que voleu suprimir el vostre compte? Aquesta acció és irreversible.", + "settings_deleted": "El vostre compte ha estat suprimit. Premeu D'acord per tornar a la pàgina inicial." } diff --git a/www/common/translations/messages.de.json b/www/common/translations/messages.de.json index 5060a2d9f..62be310eb 100644 --- a/www/common/translations/messages.de.json +++ b/www/common/translations/messages.de.json @@ -1215,5 +1215,10 @@ "team_deleteConfirm": "Du bist gerade dabei, alle Daten eines Teams zu löschen. Andere Teammitglieder können dann möglicherweise nicht mehr auf ihre Daten zugreifen. Dies kann nicht rückgängig gemacht werden. Bist du sicher, dass du fortfahren möchtest?", "team_pendingOwner": "(ausstehend)", "team_pendingOwnerTitle": "Dieser Administrator hat dein Angebot auf Eigentümerschaft noch nicht akzeptiert.", - "team_demoteMeConfirm": "Du bist gerade dabei, deine Rechte aufzugeben. Dies kann nicht rückgängig gemacht werden. Bist du sicher?" + "team_demoteMeConfirm": "Du bist gerade dabei, deine Rechte aufzugeben. Dies kann nicht rückgängig gemacht werden. Bist du sicher?", + "crowdfunding_button2": "CryptPad unterstützen", + "survey": "CryptPad-Umfrage", + "team_title": "Team: {0}", + "team_quota": "Speicherplatzbegrenzung deines Teams", + "drive_quota": "Deine Speicherplatzbegrenzung" } diff --git a/www/teams/app-team.less b/www/teams/app-team.less index 042d75a49..863aec1a9 100644 --- a/www/teams/app-team.less +++ b/www/teams/app-team.less @@ -58,12 +58,6 @@ .cp-leftside-narrow { .cp-avatar { overflow: visible; - media-tag { - margin-right: 0; - } - span.cp-sidebarlayout-category-name { - margin-left: 3px; - } } } .cp-team-cat-header { @@ -73,15 +67,20 @@ justify-content: center; font-size: 20px; } + media-tag, .cp-avatar-default { + margin-right: 3px; + } media-tag { order: -1; - margin-right: 3px; } cursor: default !important; font-size: 18px; &:hover { background-color: transparent !important; } + span.cp-sidebarlayout-category-name { + padding-left: 5px; + } } .cp-team-cat-chat { span.cp-team-chat-notification { @@ -132,6 +131,10 @@ } .cp-team-avatar { .avatar_main(300px); + .cp-avatar img { + max-width: 100%; + max-height: 100%; + } } .cp-team-roster { .avatar_main(50px); diff --git a/www/teams/inner.js b/www/teams/inner.js index 3a87d4c82..d14cb53a8 100644 --- a/www/teams/inner.js +++ b/www/teams/inner.js @@ -378,7 +378,7 @@ define([ refreshList(common, cb); }); - makeBlock('create', function (common, cb) { + var refreshCreate = function (common, cb) { var metadataMgr = common.getMetadataMgr(); var privateData = metadataMgr.getPrivateData(); var content = []; @@ -406,17 +406,21 @@ define([ content.push(h('br')); content.push(h('br')); content.push(button); + var $spinner = $('', {'class': 'fa fa-spinner fa-pulse'}).hide(); + content.push($spinner[0]); var state = false; $(button).click(function () { if (state) { return; } var name = $(input).val(); if (!name.trim()) { return; } state = true; + $spinner.show(); APP.module.execCommand('CREATE_TEAM', { name: name }, function (obj) { if (obj && obj.error) { console.error(obj.error); + $spinner.hide(); return void UI.warn(Messages.error); } // Redraw the create block @@ -428,15 +432,15 @@ define([ refreshList(common, function (content) { state = false; $div.append(content); + $spinner.hide(); $('div.cp-team-cat-list').click(); }); }); }); cb(content); - }); - - makeBlock('back', function (common, cb) { - refreshList(common, cb); + }; + makeBlock('create', function (common, cb) { + refreshCreate(common, cb); }); makeBlock('drive', function (common, cb) { @@ -967,10 +971,17 @@ define([ metadataMgr.onChange(function () { var $div = $('div.cp-team-list'); - if (!$div.length) { return; } - refreshList(common, function (content) { - $div.empty().append(content); - }); + if ($div.length) { + refreshList(common, function (content) { + $div.empty().append(content); + }); + } + var $divCreate = $('div.cp-team-create'); + if ($divCreate.length) { + refreshCreate(common, function (content) { + $divCreate.empty().append(content); + }); + } }); var onDisconnect = function (noAlert) {