Pārlūkot izejas kodu

Merge branch 'edge' into meteor-1.8

Lauri Ojansivu 6 gadi atpakaļ
vecāks
revīzija
e410205886

+ 15 - 4
CHANGELOG.md

@@ -1,11 +1,22 @@
-# Upcoming Wekan release
+# v2.38 2019-03-06 Wekan release
 
 This release adds the following new features:
 
-- [Added a Helm Chart to the project](https://github.com/wekan/wekan/pull/2227).
-  Thanks to TechnoTaff.
+- [Added a Helm Chart to the project](https://github.com/wekan/wekan/pull/2227), thanks to TechnoTaff.
+- [Added support for LDAP admin status sync](https://github.com/wekan/wekan-ldap/pull/40).
+  Examples: LDAP_SYNC_ADMIN_STATUS=true, LDAP_SYNC_ADMIN_GROUP=group1,group2 (https://github.com/wekan/wekan/commit/7e451d9033eb6162cd37de3e5ffabdc22e272948).
+  Thanks to JulianJacobi and xet7.
 
-Thanks to above GitHub users for their contributions.
+and fixes the following bugs:
+
+- [Fix card deletion from archive](https://github.com/wekan/wekan/commit/77754cf32f28498e550a46325d90eb41f08f8552). Thanks to andresmanelli.
+- [Fix card move with wrong swimlaneId](https://github.com/wekan/wekan/commit/1bef3a3f8ff4eac43bf97cc8b86d85e618b0e2ef). Thanks to andresmanelli.
+  NOTE: This does not yet fix card move [with Custom Field](https://github.com/wekan/wekan/issues/2233), it will be fixed later.
+- [Fix: LDAP Authentication with Recursive Group Filtering Does Not Work on Snap](https://github.com/wekan/wekan/issues/2228). Thanks to apages2.
+- [Use ubuntu:cosmic base in Dockerfile](https://github.com/wekan/wekan/commit/df00776e6ca47080435eca9a31a16fd24c0770ed). Thanks to xet7.
+- [Remove phantomjs binary from Docker/Snap/Stackerfile to reduce size](https://github.com/wekan/wekan/issues/2229). Thanks to soohwa.
+
+Thanks to above GitHub users for their contributions, and translators for their translations.
 
 # v2.37 2019-03-04 Wekan release
 

+ 5 - 0
Dockerfile

@@ -75,6 +75,8 @@ ARG LDAP_SYNC_USER_DATA
 ARG LDAP_SYNC_USER_DATA_FIELDMAP
 ARG LDAP_SYNC_GROUP_ROLES
 ARG LDAP_DEFAULT_DOMAIN
+ARG LDAP_SYNC_ADMIN_STATUS
+ARG LDAP_SYNC_ADMIN_GROUPS
 ARG LOGOUT_WITH_TIMER
 ARG LOGOUT_IN
 ARG LOGOUT_ON_HOURS
@@ -159,6 +161,8 @@ ENV BUILD_DEPS="apt-utils bsdtar gnupg gosu wget curl bzip2 build-essential pyth
     LDAP_SYNC_USER_DATA_FIELDMAP="" \
     LDAP_SYNC_GROUP_ROLES="" \
     LDAP_DEFAULT_DOMAIN="" \
+    LDAP_SYNC_ADMIN_STATUS="" \
+    LDAP_SYNC_ADMIN_GROUPS="" \
     LOGOUT_WITH_TIMER=false \
     LOGOUT_IN="" \
     LOGOUT_ON_HOURS="" \
@@ -293,6 +297,7 @@ RUN \
     gosu wekan:wekan /home/wekan/.meteor/meteor npm install && \
     gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
     cp /home/wekan/app/fix-download-unicode/cfs_access-point.txt /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
+    rm /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs && \
     chown wekan:wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js && \
     #Removed binary version of bcrypt because of security vulnerability that is not fixed yet.
     #https://github.com/wekan/wekan/commit/4b2010213907c61b0e0482ab55abb06f6a668eac

+ 1 - 1
Stackerfile.yml

@@ -1,5 +1,5 @@
 appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
-appVersion: "v2.37.0"
+appVersion: "v2.38.0"
 files:
   userUploads:
     - README.md

+ 7 - 1
client/components/lists/list.js

@@ -67,7 +67,13 @@ BlazeComponent.extendComponent({
         const nCards = MultiSelection.isActive() ? MultiSelection.count() : 1;
         const sortIndex = calculateIndex(prevCardDom, nextCardDom, nCards);
         const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
-        const swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
+        const currentBoard = Boards.findOne(Session.get('currentBoard'));
+        let swimlaneId = '';
+        const boardView = Meteor.user().profile.boardView;
+        if (boardView === 'board-view-swimlanes')
+          swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
+        else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal'))
+          swimlaneId = currentBoard.getDefaultSwimline()._id;
 
         // Normally the jquery-ui sortable library moves the dragged DOM element
         // to its new position, which disrupts Blaze reactive updates mechanism

+ 6 - 0
docker-compose.yml

@@ -501,6 +501,12 @@ services:
       # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
       # example :
       #- LDAP_DEFAULT_DOMAIN=
+      #
+      # Enable/Disable syncing of admin status based on ldap groups:
+      #- LDAP_SYNC_ADMIN_STATUS=true
+      #
+      # Comma separated list of admin group names to sync.
+      #- LDAP_SYNC_ADMIN_GROUPS=group1,group2
       #---------------------------------------------------------------------
       # ==== LOGOUT TIMER, probably does not work yet ====
       # LOGOUT_WITH_TIMER : Enables or not the option logout with timer

+ 1 - 1
i18n/de.i18n.json

@@ -28,7 +28,7 @@
     "act-importCard": "importiert Karte __card__ auf der Liste __list__ bei Swimlane __swimlane__ in Board __board__ ",
     "act-importList": "importiert Liste __list__ bei Swimlane __swimlane__ in Board __board__ ",
     "act-joinMember": "fügt Mitglied __member__ der Karte __card__ auf der Liste __list__ bei Swimlane __swimlane__ an Board __board__ hinzu",
-    "act-moveCard": "verschiebe Karte __card__ von Liste __oldList__ von Swimlane  __oldSwimlane__ von Board __oldBoard__ nach Liste __list__ in Swimlane __swimlane__ zu Board __board__",
+    "act-moveCard": "verschiebt Karte __card__ von Liste __oldList__ von Swimlane  __oldSwimlane__ von Board __oldBoard__ nach Liste __list__ in Swimlane __swimlane__ zu Board __board__",
     "act-removeBoardMember": "entfernte Mitglied __member__ vom Board __board__",
     "act-restoredCard": "wiederherstellte Karte __card__ auf der Liste __list__ bei Swimlane __swimlane__ an Board __board__",
     "act-unjoinMember": "entfernte Mitglied __member__ von Karte __card__ auf der Liste __list__ bei Swimlane __swimlane__ an Board __board__",

+ 42 - 42
i18n/fr.i18n.json

@@ -75,11 +75,11 @@
     "add-cover": "Ajouter la couverture",
     "add-label": "Ajouter une étiquette",
     "add-list": "Ajouter une liste",
-    "add-members": "Assigner des membres",
+    "add-members": "Assigner des participants",
     "added": "Ajouté le",
-    "addMemberPopup-title": "Membres",
+    "addMemberPopup-title": "Participants",
     "admin": "Admin",
-    "admin-desc": "Peut voir et éditer les cartes, supprimer des membres et changer les paramètres du tableau.",
+    "admin-desc": "Peut voir et éditer les cartes, supprimer des participants et changer les paramètres du tableau.",
     "admin-announcement": "Annonce",
     "admin-announcement-active": "Annonce destinée à tous",
     "admin-announcement-title": "Annonce de l'administrateur",
@@ -103,7 +103,7 @@
     "archives": "Archiver",
     "template": "Modèle",
     "templates": "Modèles",
-    "assign-member": "Affecter un membre",
+    "assign-member": "Affecter un participant",
     "attached": "joint",
     "attachment": "Pièce jointe",
     "attachment-delete-pop": "La suppression d'une pièce jointe est définitive. Elle ne peut être annulée.",
@@ -141,9 +141,9 @@
     "card-edit-attachments": "Modifier les pièces jointes",
     "card-edit-custom-fields": "Éditer les champs personnalisés",
     "card-edit-labels": "Gérer les étiquettes",
-    "card-edit-members": "Gérer les membres",
+    "card-edit-members": "Gérer les participants",
     "card-labels-title": "Modifier les étiquettes de la carte.",
-    "card-members-title": "Ajouter ou supprimer des membres à la carte.",
+    "card-members-title": "Assigner ou supprimer des participants à la carte.",
     "card-start": "Début",
     "card-start-on": "Commence le",
     "cardAttachmentsPopup-title": "Ajouter depuis",
@@ -152,7 +152,7 @@
     "cardDeletePopup-title": "Supprimer la carte ?",
     "cardDetailsActionsPopup-title": "Actions sur la carte",
     "cardLabelsPopup-title": "Étiquettes",
-    "cardMembersPopup-title": "Membres",
+    "cardMembersPopup-title": "Participants",
     "cardMorePopup-title": "Plus",
     "cardTemplatePopup-title": "Créer un modèle",
     "cards": "Cartes",
@@ -247,7 +247,7 @@
     "deleteLabelPopup-title": "Supprimer l'étiquette ?",
     "description": "Description",
     "disambiguateMultiLabelPopup-title": "Préciser l'action sur l'étiquette",
-    "disambiguateMultiMemberPopup-title": "Préciser l'action sur le membre",
+    "disambiguateMultiMemberPopup-title": "Préciser l'action sur le participant",
     "discard": "Mettre à la corbeille",
     "done": "Fait",
     "download": "Télécharger",
@@ -263,13 +263,13 @@
     "editLabelPopup-title": "Modifier l'étiquette",
     "editNotificationPopup-title": "Modifier la notification",
     "editProfilePopup-title": "Modifier le profil",
-    "email": "Email",
+    "email": "E-mail",
     "email-enrollAccount-subject": "Un compte a été créé pour vous sur __siteName__",
     "email-enrollAccount-text": "Bonjour __user__,\n\nPour commencer à utiliser ce service, il suffit de cliquer sur le lien ci-dessous.\n\n__url__\n\nMerci.",
     "email-fail": "Échec de l'envoi du courriel.",
     "email-fail-text": "Une erreur est survenue en tentant d'envoyer l'email",
-    "email-invalid": "Adresse email incorrecte.",
-    "email-invite": "Inviter par email",
+    "email-invalid": "Adresse e-mail incorrecte.",
+    "email-invite": "Inviter par e-mail",
     "email-invite-subject": "__inviter__ vous a envoyé une invitation",
     "email-invite-text": "Cher __user__,\n\n__inviter__ vous invite à rejoindre le tableau \"__board__\" pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n\n__url__\n\nMerci.",
     "email-resetPassword-subject": "Réinitialiser votre mot de passe sur __siteName__",
@@ -280,7 +280,7 @@
     "enable-wip-limit": "Activer la limite WIP",
     "error-board-doesNotExist": "Ce tableau n'existe pas",
     "error-board-notAdmin": "Vous devez être administrateur de ce tableau pour faire cela",
-    "error-board-notAMember": "Vous devez être membre de ce tableau pour faire cela",
+    "error-board-notAMember": "Vous devez être participant de ce tableau pour faire cela",
     "error-json-malformed": "Votre texte JSON n'est pas valide",
     "error-json-schema": "Vos données JSON ne contiennent pas l'information appropriée dans un format correct",
     "error-list-doesNotExist": "Cette liste n'existe pas",
@@ -294,7 +294,7 @@
     "filter-cards": "Filtrer les cartes",
     "filter-clear": "Supprimer les filtres",
     "filter-no-label": "Aucune étiquette",
-    "filter-no-member": "Aucun membre",
+    "filter-no-member": "Aucun participant",
     "filter-no-custom-fields": "Pas de champs personnalisés",
     "filter-on": "Le filtre est actif",
     "filter-on-desc": "Vous êtes en train de filtrer les cartes sur ce tableau. Cliquez ici pour modifier les filtres.",
@@ -310,9 +310,9 @@
     "link": "Lien",
     "import-board": "importer un tableau",
     "import-board-c": "Importer un tableau",
-    "import-board-title-trello": "Importer le tableau depuis Trello",
-    "import-board-title-wekan": "Importer le tableau depuis l'export précédent",
-    "import-sandstorm-backup-warning": "Ne supprimez pas les données que vous importez du tableau exporté d'origine ou de Trello avant de vérifier que la graine peut se fermer et s'ouvrir à nouveau, ou qu'une erreur \"Tableau introuvable\" survient, sinon vous perdrez vos données.",
+    "import-board-title-trello": "Importer un tableau depuis Trello",
+    "import-board-title-wekan": "Importer un tableau depuis un export précédent",
+    "import-sandstorm-backup-warning": "Ne supprimez pas les données que vous importez d'un tableau exporté d'origine ou de Trello avant de vérifier que la graine peut se fermer et s'ouvrir à nouveau ou qu'une erreur \"Tableau introuvable\" survient, sinon vous perdrez vos données.",
     "import-sandstorm-warning": "Le tableau importé supprimera toutes les données du tableau et les remplacera avec celles du tableau importé.",
     "from-trello": "Depuis Trello",
     "from-wekan": "Depuis un export précédent",
@@ -320,15 +320,15 @@
     "import-board-instruction-wekan": "Dans votre tableau, allez dans 'Menu', puis 'Exporter un tableau', et copier le texte du fichier téléchargé.",
     "import-board-instruction-about-errors": "Si une erreur survient en important le tableau, il se peut que l'import ait fonctionné, et que le tableau se trouve sur la page \"Tous les tableaux\".",
     "import-json-placeholder": "Collez ici les données JSON valides",
-    "import-map-members": "Faire correspondre aux membres",
-    "import-members-map": "Le tableau que vous venez d'importer contient des membres. Veuillez associer les membres que vous souhaitez importer à vos utilisateurs.",
-    "import-show-user-mapping": "Contrôler l'association des membres",
-    "import-user-select": "Sélectionnez l'utilisateur existant que vous voulez associer à ce membre",
-    "importMapMembersAddPopup-title": "Sélectionner le membre",
+    "import-map-members": "Assigner des participants",
+    "import-members-map": "Le tableau que vous venez d'importer contient des participants. Veuillez assigner les participants que vous souhaitez importer à vos utilisateurs.",
+    "import-show-user-mapping": "Contrôler l'assignation des participants",
+    "import-user-select": "Sélectionnez l'utilisateur existant que vous voulez associer à ce participant",
+    "importMapMembersAddPopup-title": "Sélectionner le participant",
     "info": "Version",
     "initials": "Initiales",
     "invalid-date": "Date invalide",
-    "invalid-time": "Temps invalide",
+    "invalid-time": "Heure invalide",
     "invalid-user": "Utilisateur invalide",
     "joined": "a rejoint",
     "just-invited": "Vous venez d'être invité à ce tableau",
@@ -354,15 +354,15 @@
     "listImportCardPopup-title": "Importer une carte Trello",
     "listMorePopup-title": "Plus",
     "link-list": "Lien vers cette liste",
-    "list-delete-pop": "Toutes les actions seront supprimées du fil d'activité et il ne sera plus possible de les récupérer. Cette action ne peut pas être annulée.",
+    "list-delete-pop": "Toutes les actions seront supprimées du fil d'activité et il ne sera plus possible de les récupérer. Cette action est irréversible.",
     "list-delete-suggest-archive": "Vous pouvez archiver une liste pour l'enlever du tableau tout en conservant son activité.",
     "lists": "Listes",
     "swimlanes": "Couloirs",
     "log-out": "Déconnexion",
     "log-in": "Connexion",
     "loginPopup-title": "Connexion",
-    "memberMenuPopup-title": "Préférence de membre",
-    "members": "Membres",
+    "memberMenuPopup-title": "Préférence du participant",
+    "members": "Participants",
     "menu": "Menu",
     "move-selection": "Déplacer la sélection",
     "moveCardPopup-title": "Déplacer la carte",
@@ -382,7 +382,7 @@
     "normal": "Normal",
     "normal-desc": "Peut voir et modifier les cartes. Ne peut pas changer les paramètres.",
     "not-accepted-yet": "L'invitation n'a pas encore été acceptée",
-    "notify-participate": "Recevoir les mises à jour de toutes les cartes auxquelles vous participez en tant que créateur ou que membre ",
+    "notify-participate": "Recevoir les mises à jour de toutes les cartes auxquelles vous participez en tant que créateur ou que participant ",
     "notify-watch": "Recevoir les mises à jour de tous les tableaux, listes ou cartes que vous suivez",
     "optional": "optionnel",
     "or": "ou",
@@ -404,10 +404,10 @@
     "remove-from-board": "Retirer du tableau",
     "remove-label": "Retirer l'étiquette",
     "listDeletePopup-title": "Supprimer la liste ?",
-    "remove-member": "Supprimer le membre",
+    "remove-member": "Supprimer le participant",
     "remove-member-from-card": "Supprimer de la carte",
-    "remove-member-pop": "Supprimer __name__ (__username__) de __boardTitle__ ? Ce membre sera supprimé de toutes les cartes du tableau et recevra une notification.",
-    "removeMemberPopup-title": "Supprimer le membre ?",
+    "remove-member-pop": "Supprimer __name__ (__username__) de __boardTitle__ ? Ce participant sera supprimé de toutes les cartes du tableau et recevra une notification.",
+    "removeMemberPopup-title": "Supprimer le participant ?",
     "rename": "Renommer",
     "rename-board": "Renommer le tableau",
     "restore": "Restaurer",
@@ -421,13 +421,13 @@
     "setWipLimitPopup-title": "Définir la limite WIP",
     "shortcut-assign-self": "Affecter cette carte à vous-même",
     "shortcut-autocomplete-emoji": "Auto-complétion des emoji",
-    "shortcut-autocomplete-members": "Auto-complétion des membres",
+    "shortcut-autocomplete-members": "Auto-complétion des participants",
     "shortcut-clear-filters": "Retirer tous les filtres",
     "shortcut-close-dialog": "Fermer la boîte de dialogue",
     "shortcut-filter-my-cards": "Filtrer mes cartes",
     "shortcut-show-shortcuts": "Afficher cette liste de raccourcis",
-    "shortcut-toggle-filterbar": "Afficher/Cacher la barre latérale des filtres",
-    "shortcut-toggle-sidebar": "Afficher/Cacher la barre latérale du tableau",
+    "shortcut-toggle-filterbar": "Afficher/Masquer la barre latérale des filtres",
+    "shortcut-toggle-sidebar": "Afficher/Masquer la barre latérale du tableau",
     "show-cards-minimum-count": "Afficher le nombre de cartes si la liste en contient plus de ",
     "sidebar-open": "Ouvrir le panneau",
     "sidebar-close": "Fermer le panneau",
@@ -447,9 +447,9 @@
     "time": "Temps",
     "title": "Titre",
     "tracking": "Suivi",
-    "tracking-info": "Vous serez notifié de toute modification concernant les cartes pour lesquelles vous êtes impliqué en tant que créateur ou membre.",
+    "tracking-info": "Vous serez notifié de toute modification concernant les cartes pour lesquelles vous êtes impliqué en tant que créateur ou participant.",
     "type": "Type",
-    "unassign-member": "Retirer le membre",
+    "unassign-member": "Retirer le participant",
     "unsaved-description": "Vous avez une description non sauvegardée",
     "unwatch": "Arrêter de suivre",
     "upload": "Télécharger",
@@ -480,7 +480,7 @@
     "invite": "Inviter",
     "invite-people": "Inviter une personne",
     "to-boards": "Au(x) tableau(x)",
-    "email-addresses": "Adresses email",
+    "email-addresses": "Adresses mail",
     "smtp-host-description": "L'adresse du serveur SMTP qui gère vos mails.",
     "smtp-port-description": "Le port des mails sortants du serveur SMTP.",
     "smtp-tls-description": "Activer la gestion de TLS sur le serveur SMTP",
@@ -494,7 +494,7 @@
     "invitation-code": "Code d'invitation",
     "email-invite-register-subject": "__inviter__ vous a envoyé une invitation",
     "email-invite-register-text": "Cher __user__,\n\n__inviter__ vous invite à le rejoindre sur le tableau kanban pour collaborer.\n\nVeuillez suivre le lien ci-dessous :\n__url__\n\nVotre code d'invitation est : __icode__\n\nMerci.",
-    "email-smtp-test-subject": "Email de test SMTP",
+    "email-smtp-test-subject": "E-mail de test SMTP",
     "email-smtp-test-text": "Vous avez envoyé un mail avec succès",
     "error-invitation-code-not-exist": "Ce code d'invitation n'existe pas.",
     "error-notAuthorized": "Vous n'êtes pas autorisé à accéder à cette page.",
@@ -592,8 +592,8 @@
     "r-when-a-label-is": "Quand une étiquette est",
     "r-when-the-label-is": "Quand l'étiquette est",
     "r-list-name": "Nom de la liste",
-    "r-when-a-member": "Quand un membre est",
-    "r-when-the-member": "Quand le membre",
+    "r-when-a-member": "Quand un participant est",
+    "r-when-the-member": "Quand le participant",
     "r-name": "nom",
     "r-when-a-attach": "Quand une pièce jointe",
     "r-when-a-checklist": "Quand une checklist est",
@@ -614,7 +614,7 @@
     "r-add": "Ajouter",
     "r-remove": "Supprimer",
     "r-label": "étiquette",
-    "r-member": "membre",
+    "r-member": "participant",
     "r-remove-all": "Supprimer tous les membres de la carte",
     "r-set-color": "Définir la couleur à",
     "r-checklist": "checklist",
@@ -644,9 +644,9 @@
     "r-create-card": "Créer une nouvelle carte",
     "r-in-list": "dans la liste",
     "r-in-swimlane": "Dans le couloir",
-    "r-d-add-member": "Ajouter un membre",
-    "r-d-remove-member": "Supprimer un membre",
-    "r-d-remove-all-member": "Supprimer tous les membres",
+    "r-d-add-member": "Ajouter un participant",
+    "r-d-remove-member": "Supprimer un participant",
+    "r-d-remove-all-member": "Supprimer tous les participants",
     "r-d-check-all": "Cocher tous les éléments d'une liste",
     "r-d-uncheck-all": "Décocher tous les éléments d'une liste",
     "r-d-check-one": "Cocher l'élément",

+ 33 - 33
i18n/pl.i18n.json

@@ -1,37 +1,37 @@
 {
     "accept": "Akceptuj",
     "act-activity-notify": "Powiadomienia aktywności",
-    "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-createBoard": "created board __board__",
-    "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-createCustomField": "created custom field __customField__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-createList": "added list __list__ to board __board__",
-    "act-addBoardMember": "added member __member__ to board __board__",
-    "act-archivedBoard": "Board __board__ moved to Archive",
-    "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
-    "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
-    "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive",
-    "act-importBoard": "imported board __board__",
-    "act-importCard": "imported card  __card__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__",
-    "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-moveCard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-removeBoardMember": "removed member __member__ from board __board__",
-    "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-addAttachment": "Dodano załącznik __attachment__ do karty __card__ na liście __list__ w diagramie czynności __swimlane__ na tablicy __board__",
+    "act-deleteAttachment": "Usunięto załącznik __attachment__ na karcie __card__ na liście __list__ w diagramie czynności __swimlane__ na tablicy __board__",
+    "act-addSubtask": "Dodane podzadanie __subtask__ na karcie __card__ na liście __list__ w diagramie czynności __swimlane__ na tablicy __board__",
+    "act-addLabel": "Dodano etykietę __label__ do karty __card__ na liście __list__ w diagramie czynności __swimlane__ na tablicy __board__",
+    "act-removeLabel": "Usunięto etykietę __label__ z karty __card__ na liście __list__ w diagramie czynności __swimlane__ na tablicy __board__",
+    "act-addChecklist": "Dodano listę zadań __checklist__ do karty __card__ na liście __list__ w diagramie czynności __swimlane__ na tablicy __board__",
+    "act-addChecklistItem": "Dodano element listy zadań __checklistItem__ do listy zadań __checklist__ na karcie __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-removeChecklist": "Usunięto listę zadań __checklist__ z karty __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-removeChecklistItem": "Usunięto element listy zadań __checklistItem__ z listy zadań __checkList__ na karcie __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-checkedItem": "Zaznaczono __checklistItem__ na liście zadań __checklist__ na karcie __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-uncheckedItem": "Odznaczono __checklistItem__ na liście __checklist__ na karcie __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-completeChecklist": "Wykonano wszystkie zadania z listy __checklist__ na karcie __card__ na liście __list__ na diagramie czynności__ na tablicy __board__",
+    "act-uncompleteChecklist": "Wycofano ukończenie wykonania listy __checklist__ na karcie __card__ na liście __list__ na diagramie czynności__ na tablicy __board__",
+    "act-addComment": "Dodano komentarz na karcie __card__: __comment__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-createBoard": "Utworzono tablicę __board__",
+    "act-createCard": "Utworzono kartę __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-createCustomField": "Utworzono niestandardowe pole __customField__ na karcie __card__ na liście __list__ na diagramie czynności__ na tablicy __board__",
+    "act-createList": "Dodano listę __list__ do tablicy __board__",
+    "act-addBoardMember": "Dodano użytykownika __member__ do tablicy __board__",
+    "act-archivedBoard": "Tablica __board__ została przeniesiona do Archiwum",
+    "act-archivedCard": "Karta __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__ została przeniesiona do Archiwum",
+    "act-archivedList": "Lista __list__ na diagramie czynności __swimlane__ na tablicy __board__ została przeniesiona do Archiwum",
+    "act-archivedSwimlane": "Diagram czynności __swimlane__ na tablicy __board__ został przeniesiony do Archiwum",
+    "act-importBoard": "Zaimportowano tablicę __board__",
+    "act-importCard": "Zaimportowano kartę __card__ do listy __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-importList": "Zaimportowano listę __list__ na diagram czynności __swimlane__ do tablicy __board__",
+    "act-joinMember": "Dodano użytkownika __member__ do karty __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-moveCard": "Przeniesiono kartę __card__ z listy __oldList__ na diagramie czynności __oldSwimlane__ na tablicy __oldBoard__ do listy __listy__ na diagramie czynności __swimlane__ na tablicy __board__",
+    "act-removeBoardMember": "Usunięto użytkownika __member__ z tablicy __board__",
+    "act-restoredCard": "Przywrócono kartę __card__ na listę __list__ na diagram czynności__ na tablicy __board__",
+    "act-unjoinMember": "Usunięto użytkownika __member__ z karty __card__ na liście __list__ na diagramie czynności __swimlane__ na tablicy __board__",
     "act-withBoardTitle": "__board__",
     "act-withCardTitle": "[__board__] __card__",
     "actions": "Akcje",
@@ -56,14 +56,14 @@
     "activity-unchecked-item": "odznaczono %s w liście zadań %s z %s",
     "activity-checklist-added": "dodał(a) listę zadań do %s",
     "activity-checklist-removed": "usunięto listę zadań z %s",
-    "activity-checklist-completed": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "activity-checklist-completed": "Wykonano wszystkie zadania z listy __checklist__ na karcie __card__ na liście __list__ na diagramie czynności__ na tablicy __board__",
     "activity-checklist-uncompleted": "nieukończono listy zadań %s z %s",
     "activity-checklist-item-added": "dodał(a) zadanie '%s' do %s",
     "activity-checklist-item-removed": "usunięto element z listy zadań '%s' w %s",
     "add": "Dodaj",
     "activity-checked-item-card": "zaznaczono %s w liście zadań %s",
     "activity-unchecked-item-card": "odznaczono %s w liście zadań %s",
-    "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "activity-checklist-completed-card": "Wykonano wszystkie zadania z listy __checklist__ na karcie __card__ na liście __list__ na diagramie czynności__ na tablicy __board__",
     "activity-checklist-uncompleted-card": "nieukończono listy zadań %s",
     "add-attachment": "Dodaj załącznik",
     "add-board": "Dodaj tablicę",

+ 33 - 33
i18n/pt-BR.i18n.json

@@ -1,37 +1,37 @@
 {
     "accept": "Aceitar",
     "act-activity-notify": "Notificação de atividade",
-    "act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-createBoard": "created board __board__",
-    "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-createCustomField": "created custom field __customField__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-createList": "added list __list__ to board __board__",
-    "act-addBoardMember": "added member __member__ to board __board__",
-    "act-archivedBoard": "Board __board__ moved to Archive",
-    "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
-    "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
-    "act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive",
-    "act-importBoard": "imported board __board__",
-    "act-importCard": "imported card  __card__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__",
-    "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-moveCard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-removeBoardMember": "removed member __member__ from board __board__",
-    "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "act-addAttachment": "adicionado anexo __attachment__ ao cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-deleteAttachment": "excluido anexo __attachment__ do cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-addSubtask": "adicionada subtarefa __subtask__ ao cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-addLabel": "Adicionada etiqueta __label__ ao cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-removeLabel": "Removida etiqueta __label__ do cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-addChecklist": "adicionada lista de verificação __checklist__ ao cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-addChecklistItem": "adicionado o item  __checklistItem__ a lista de verificação__checklist__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-removeChecklist": "emovida a lista de verificação __checklist__ do cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-removeChecklistItem": "removido item __checklistItem__ da lista de verificação __checkList__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-checkedItem": "marcado __checklistItem__ na lista de verificação __checklist__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-uncheckedItem": "desmarcado __checklistItem__ na lista __checklist__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-completeChecklist": "completada a lista de verificação __checklist__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-uncompleteChecklist": "lista de verificação incompleta __checklist__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-addComment": "comentou no cartão __card__: __comment__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-createBoard": "criado quadro__board__",
+    "act-createCard": "criado cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-createCustomField": "criado campo customizado __customField__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-createList": "adicionada lista __list__ ao quadro __board__",
+    "act-addBoardMember": "adicionado membro __member__ ao quadro __board__",
+    "act-archivedBoard": "Quadro __board__ foi Arquivado",
+    "act-archivedCard": "Cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__ foi Arquivado",
+    "act-archivedList": "Lista __list__ em raia __swimlane__ no quadro __board__ foi Arquivada",
+    "act-archivedSwimlane": "Raia __swimlane__ no quadro __board__ foi Arquivada",
+    "act-importBoard": "importado quadro __board__",
+    "act-importCard": "importado cartão  __card__ para lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-importList": "importada lista __list__ para raia __swimlane__ no quadro __board__",
+    "act-joinMember": "adicionado membro __member__ ao cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-moveCard": "movido cartão __card__ da lista __oldList__ em raia __oldSwimlane__ no quadro __oldBoard__ para lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-removeBoardMember": "removido membro __member__ do quadro __board__",
+    "act-restoredCard": "restaurado cartão __card__ a lista __list__ em raia __swimlane__ no quadro __board__",
+    "act-unjoinMember": "removido membro __member__ do cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
     "act-withBoardTitle": "__board__",
     "act-withCardTitle": "[__board__] __card__",
     "actions": "Ações",
@@ -56,14 +56,14 @@
     "activity-unchecked-item": "desmarcado %s na lista de verificação %s de %s",
     "activity-checklist-added": "Adicionada lista de verificação a %s",
     "activity-checklist-removed": "removida a lista de verificação de %s",
-    "activity-checklist-completed": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "activity-checklist-completed": "completada a lista de verificação __checklist__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
     "activity-checklist-uncompleted": "não-completada a lista de verificação %s de %s",
     "activity-checklist-item-added": "adicionado o item de lista de verificação para '%s' em %s",
     "activity-checklist-item-removed": "removida o item de lista de verificação de '%s' na %s",
     "add": "Novo",
     "activity-checked-item-card": "marcaddo %s na lista de verificação %s",
     "activity-unchecked-item-card": "desmarcado %s na lista de verificação %s",
-    "activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
+    "activity-checklist-completed-card": "completada a lista de verificação __checklist__ no cartão __card__ na lista __list__ em raia __swimlane__ no quadro __board__",
     "activity-checklist-uncompleted-card": "não-completada a lista de verificação %s",
     "add-attachment": "Adicionar Anexos",
     "add-board": "Adicionar Quadro",

+ 6 - 6
i18n/ru.i18n.json

@@ -15,22 +15,22 @@
     "act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
     "act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
     "act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-createBoard": "created board __board__",
+    "act-createBoard": "создал доску __board__",
     "act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
     "act-createCustomField": "created custom field __customField__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
-    "act-createList": "added list __list__ to board __board__",
-    "act-addBoardMember": "added member __member__ to board __board__",
+    "act-createList": "добавил список __list__ на доску __board__",
+    "act-addBoardMember": "добавил участника __member__ на доску __board__",
     "act-archivedBoard": "Доска __board__ перемещена в Архив",
-    "act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
+    "act-archivedCard": "Карточка __card__ из списка __list__ с дорожки __swimlane__ доски __board__ перемещена в Архив",
     "act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
     "act-archivedSwimlane": "Дорожка __swimlane__ на доске __board__ перемещена в Архив",
     "act-importBoard": "импортировал доску __board__",
     "act-importCard": "imported card  __card__ to list __list__ at swimlane __swimlane__ at board __board__",
-    "act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__",
+    "act-importList": "импортировал список __list__ на дорожку __swimlane__ доски __board__",
     "act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
     "act-moveCard": "переместил карточку __card__ из списка __oldList__ с дорожки __oldSwimlane__ доски __oldBoard__ в список __list__ на дорожку __swimlane__ доски __board__",
     "act-removeBoardMember": "удалил участника __member__ с доски __board__",
-    "act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
+    "act-restoredCard": "восстановил карточку __card__ в список __list__ на дорожку __swimlane__ доски __board__",
     "act-unjoinMember": "removed member __member__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
     "act-withBoardTitle": "__board__",
     "act-withCardTitle": "[__board__] __card__",

+ 2 - 2
models/cards.js

@@ -1421,8 +1421,8 @@ function cardRemover(userId, doc) {
   Checklists.remove({
     cardId: doc._id,
   });
-  Subtasks.remove({
-    cardId: doc._id,
+  Cards.remove({
+    parentId: doc._id,
   });
   CardComments.remove({
     cardId: doc._id,

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "wekan",
-  "version": "v2.37.0",
+  "version": "v2.38.0",
   "description": "Open-Source kanban",
   "private": true,
   "scripts": {

+ 8 - 5
releases/rebuild-release.sh

@@ -5,11 +5,14 @@
 		rm -rf packages
 		mkdir -p ~/repos/wekan/packages
 		cd ~/repos/wekan/packages
-		git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router
-		git clone --depth 1 -b master https://github.com/meteor-useraccounts/core.git meteor-useraccounts-core
-		git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-cas.git
-		git clone --depth 1 -b master https://github.com/wekan/wekan-ldap.git
-		git clone --depth 1 -b master https://github.com/wekan/wekan-scrollbar.git
+                git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router
+                git clone --depth 1 -b master https://github.com/meteor-useraccounts/core.git meteor-useraccounts-core
+                git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-cas.git
+                git clone --depth 1 -b master https://github.com/wekan/wekan-ldap.git
+                git clone --depth 1 -b master https://github.com/wekan/wekan-scrollbar.git
+                git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-oidc.git
+                mv meteor-accounts-oidc/packages/switch_accounts-oidc wekan_accounts-oidc
+                mv meteor-accounts-oidc/packages/switch_oidc wekan_oidc
 
 		if [[ "$OSTYPE" == "darwin"* ]]; then
 			echo "sed at macOS";

+ 130 - 0
releases/rebuild-wekan.sh

@@ -0,0 +1,130 @@
+#!/bin/bash
+
+echo "Note: If you use other locale than en_US.UTF-8 , you need to additionally install en_US.UTF-8"
+echo "      with 'sudo dpkg-reconfigure locales' , so that MongoDB works correctly."
+echo "      You can still use any other locale as your main locale."
+
+X64NODE="https://releases.wekan.team/node-v8.11.3-linux-x64.tar.gz"
+
+function pause(){
+	read -p "$*"
+}
+
+echo
+PS3='Please enter your choice: '
+options=("Install Wekan dependencies" "Build Wekan" "Quit")
+select opt in "${options[@]}"
+do
+    case $opt in
+        "Install Wekan dependencies")
+
+		if [[ "$OSTYPE" == "linux-gnu" ]]; then
+	                echo "Linux";
+
+			if [ "$(grep -Ei 'buntu|mint' /etc/*release)" ]; then
+				sudo apt install -y build-essential git curl wget
+#				sudo apt -y install nodejs npm
+#				sudo npm -g install n
+#				sudo n 8.11.3
+			fi
+
+#			if [ "$(grep -Ei 'debian' /etc/*release)" ]; then
+#				sudo apt install -y build-essential git curl wget
+#				echo "Debian, or Debian on Windows Subsystem for Linux"
+#				curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
+#				sudo apt install -y nodejs
+#			fi
+
+			# TODO: Add Sandstorm for version of Node.js install
+			#MACHINE_TYPE=`uname -m`
+			#if [ ${MACHINE_TYPE} == 'x86_64' ]; then
+			#	# 64-bit stuff here
+			#	wget ${X64NODE}
+			#	sudo tar -C /usr/local --strip-components 1 -xzf ${X64NODE}
+			#elif [ ${MACHINE_TYPE} == '32bit' ]; then
+			#	echo "TODO: 32-bit Linux install here"
+			#	exit
+			#fi
+		elif [[ "$OSTYPE" == "darwin"* ]]; then
+		        echo "macOS";
+			pause '1) Install XCode 2) Install Node 8.x from https://nodejs.org/en/ 3) Press [Enter] key to continue.'
+		elif [[ "$OSTYPE" == "cygwin" ]]; then
+		        # POSIX compatibility layer and Linux environment emulation for Windows
+		        echo "TODO: Add Cygwin";
+			exit;
+		elif [[ "$OSTYPE" == "msys" ]]; then
+		        # Lightweight shell and GNU utilities compiled for Windows (part of MinGW)
+		        echo "TODO: Add msys on Windows";
+			exit;
+		elif [[ "$OSTYPE" == "win32" ]]; then
+		        # I'm not sure this can happen.
+		        echo "TODO: Add Windows";
+			exit;
+		elif [[ "$OSTYPE" == "freebsd"* ]]; then
+		        echo "TODO: Add FreeBSD";
+			exit;
+		else
+		        echo "Unknown"
+			echo ${OSTYPE}
+			exit;
+		fi
+
+	        ## Latest npm with Meteor 1.6
+	        sudo npm -g install npm
+	        sudo npm -g install node-gyp
+	        # Latest fibers for Meteor 1.6
+	        sudo npm -g install fibers@2.0.0
+	        # Install Meteor, if it's not yet installed
+	        curl https://install.meteor.com | bash
+#	        mkdir ~/repos
+#	        cd ~/repos
+#	        git clone https://github.com/wekan/wekan.git
+#	        cd wekan
+#	        git checkout devel
+		break
+		;;
+        "Build Wekan")
+		echo "Building Wekan."
+		cd ~/repos/wekan
+		rm -rf packages
+		mkdir -p ~/repos/wekan/packages
+		cd ~/repos/wekan/packages
+		git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router
+		git clone --depth 1 -b master https://github.com/meteor-useraccounts/core.git meteor-useraccounts-core
+		git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-cas.git
+		git clone --depth 1 -b master https://github.com/wekan/wekan-ldap.git
+		git clone --depth 1 -b master https://github.com/wekan/wekan-scrollbar.git
+		if [[ "$OSTYPE" == "darwin"* ]]; then
+			echo "sed at macOS";
+			sed -i '' 's/api\.versionsFrom/\/\/api.versionsFrom/' ~/repos/wekan/packages/meteor-useraccounts-core/package.js
+		else
+			echo "sed at ${OSTYPE}"
+			sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' ~/repos/wekan/packages/meteor-useraccounts-core/package.js
+		fi
+
+		cd ~/repos/wekan
+		rm -rf node_modules
+		meteor npm install
+		rm -rf .build
+		meteor build .build --directory
+		cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js
+		#Removed binary version of bcrypt because of security vulnerability that is not fixed yet.
+		#https://github.com/wekan/wekan/commit/4b2010213907c61b0e0482ab55abb06f6a668eac
+		#https://github.com/wekan/wekan/commit/7eeabf14be3c63fae2226e561ef8a0c1390c8d3c
+		#cd ~/repos/wekan/.build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt
+		#rm -rf node_modules/bcrypt
+		#meteor npm install bcrypt
+		cd ~/repos/wekan/.build/bundle/programs/server
+		rm -rf node_modules
+		meteor npm install
+		#meteor npm install bcrypt
+		cd ~/repos
+		echo Done.
+		break
+		;;
+        "Quit")
+		break
+            ;;
+        *) echo invalid option;;
+    esac
+done

+ 2 - 1
releases/release-sandstorm.sh

@@ -12,7 +12,8 @@ cd ~/repos
 cd ~/repos/wekan
 meteor-spk pack wekan-$1.spk
 spk publish wekan-$1.spk
-scp wekan-$1.spk x2:/var/snap/wekan/common/releases.wekan.team/
+#scp wekan-$1.spk x2:/var/snap/wekan/common/releases.wekan.team/
+scp wekan-$1.spk x2:/var/www/releases.wekan.team/
 mv wekan-$1.spk ..
 
 # Delete old stuff

+ 2 - 1
releases/release-snap.sh

@@ -22,5 +22,6 @@ cd ~/repos/wekan
 sudo snap install --dangerous wekan_$1_amd64.snap
 echo "Now you can test local installed snap."
 snapcraft push wekan_$1_amd64.snap
-scp wekan_$1_amd64.snap x2:/var/snap/wekan/common/releases.wekan.team/
+#scp wekan_$1_amd64.snap x2:/var/snap/wekan/common/releases.wekan.team/
+scp wekan_$1_amd64.snap x2:/var/www/releases.wekan.team/
 mv wekan_$1_amd64.snap ..

+ 2 - 4
releases/release.sh

@@ -1,9 +1,7 @@
 # Usage: ./release.sh 1.36
 
 # Build Sandstorm
-cd ~/repos/wekan
-./releases/release-sandstorm.sh $1
+./release-sandstorm.sh $1
 
 # Build Snap
-cd ~/repos/wekan
-./releases/release-snap.sh $1
+./release-snap.sh $1

+ 4 - 0
releases/virtualbox/start-wekan.sh

@@ -247,6 +247,10 @@
         # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
         # example :
         #export LDAP_DEFAULT_DOMAIN=
+        # Enable/Disable syncing of admin status based on ldap groups:
+        #export LDAP_SYNC_ADMIN_STATUS=true
+        # Comma separated list of admin group names.
+        #export LDAP_SYNC_ADMIN_GROUPS=group1,group2
         # LOGOUT_WITH_TIMER : Enables or not the option logout with timer
         # example : LOGOUT_WITH_TIMER=true
         #export LOGOUT_WITH_TIMER=

+ 2 - 2
sandstorm-pkgdef.capnp

@@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
     appTitle = (defaultText = "Wekan"),
     # The name of the app as it is displayed to the user.
 
-    appVersion = 239,
+    appVersion = 240,
     # Increment this for every release.
 
-    appMarketingVersion = (defaultText = "2.37.0~2019-03-04"),
+    appMarketingVersion = (defaultText = "2.38.0~2019-03-06"),
     # Human-readable presentation of the app version.
 
     minUpgradableAppVersion = 0,

+ 10 - 2
snap-src/bin/config

@@ -3,7 +3,7 @@
 # All supported keys are defined here together with descriptions and default values
 
 # list of supported keys
-keys="DEBUG MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API EMAIL_NOTIFICATION_TIMEOUT CORS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_EMAIL_MAP LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD"
+keys="DEBUG MONGODB_BIND_UNIX_SOCKET MONGODB_BIND_IP MONGODB_PORT MAIL_URL MAIL_FROM ROOT_URL PORT DISABLE_MONGODB CADDY_ENABLED CADDY_BIND_PORT WITH_API EMAIL_NOTIFICATION_TIMEOUT CORS MATOMO_ADDRESS MATOMO_SITE_ID MATOMO_DO_NOT_TRACK MATOMO_WITH_USERNAME BROWSER_POLICY_ENABLED TRUSTED_URL WEBHOOKS_ATTRIBUTES OAUTH2_ENABLED OAUTH2_CLIENT_ID OAUTH2_SECRET OAUTH2_SERVER_URL OAUTH2_AUTH_ENDPOINT OAUTH2_USERINFO_ENDPOINT OAUTH2_TOKEN_ENDPOINT OAUTH2_ID_MAP OAUTH2_USERNAME_MAP OAUTH2_FULLNAME_MAP OAUTH2_EMAIL_MAP LDAP_ENABLE LDAP_PORT LDAP_HOST LDAP_BASEDN LDAP_LOGIN_FALLBACK LDAP_RECONNECT LDAP_TIMEOUT LDAP_IDLE_TIMEOUT LDAP_CONNECT_TIMEOUT LDAP_AUTHENTIFICATION LDAP_AUTHENTIFICATION_USERDN LDAP_AUTHENTIFICATION_PASSWORD LDAP_LOG_ENABLED LDAP_BACKGROUND_SYNC LDAP_BACKGROUND_SYNC_INTERVAL LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED LDAP_BACKGROUND_SYNC_IMPORT_NEW_USERS LDAP_ENCRYPTION LDAP_CA_CERT LDAP_REJECT_UNAUTHORIZED LDAP_USER_SEARCH_FILTER LDAP_USER_SEARCH_SCOPE LDAP_USER_SEARCH_FIELD LDAP_SEARCH_PAGE_SIZE LDAP_SEARCH_SIZE_LIMIT LDAP_GROUP_FILTER_ENABLE LDAP_GROUP_FILTER_OBJECTCLASS LDAP_GROUP_FILTER_GROUP_ID_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_ATTRIBUTE LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT LDAP_GROUP_FILTER_GROUP_NAME LDAP_UNIQUE_IDENTIFIER_FIELD LDAP_UTF8_NAMES_SLUGIFY LDAP_USERNAME_FIELD LDAP_FULLNAME_FIELD LDAP_MERGE_EXISTING_USERS LDAP_SYNC_USER_DATA LDAP_SYNC_USER_DATA_FIELDMAP LDAP_SYNC_GROUP_ROLES LDAP_DEFAULT_DOMAIN LDAP_EMAIL_MATCH_ENABLE LDAP_EMAIL_MATCH_REQUIRE LDAP_EMAIL_MATCH_VERIFIED LDAP_EMAIL_FIELD LDAP_SYNC_ADMIN_STATUS LDAP_SYNC_ADMIN_GROUPS LOGOUT_WITH_TIMER LOGOUT_IN LOGOUT_ON_HOURS LOGOUT_ON_MINUTES DEFAULT_AUTHENTICATION_METHOD"
 
 # default values
 DESCRIPTION_DEBUG="Debug OIDC OAuth2 etc. Example: sudo snap set wekan debug='true'"
@@ -264,7 +264,7 @@ KEY_LDAP_GROUP_FILTER_GROUP_MEMBER_FORMAT="ldap-group-filter-member-format"
 
 DESCRIPTION_LDAP_GROUP_FILTER_GROUP_NAME="ldap-group-filter-group-name. Default: ''"
 DEFAULT_LDAP_GROUP_FILTER_GROUP_NAME=""
-KEY_LDAP_GROUP_FILTER_GROUP_NAME="ldap-group-filter-member-format"
+KEY_LDAP_GROUP_FILTER_GROUP_NAME="ldap-group-filter-member-name"
 
 DESCRIPTION_LDAP_UNIQUE_IDENTIFIER_FIELD="This field is sometimes class GUID (Globally Unique Identifier)"
 DEFAULT_LDAP_UNIQUE_IDENTIFIER_FIELD=""
@@ -314,6 +314,14 @@ DESCRIPTION_LDAP_SYNC_GROUP_ROLES="ldap-sync-group-roles . Default: '' (empty)."
 DEFAULT_LDAP_SYNC_GROUP_ROLES=""
 KEY_LDAP_SYNC_GROUP_ROLES="ldap-sync-group-roles"
 
+DESCRIPTION_LDAP_SYNC_ADMIN_STATUS="Enable/Disable syncing of admin status based on LDAP groups. Example: true"
+DEFAULT_LDAP_SYNC_ADMIN_STATUS=""
+KEY_LDAP_SYNC_ADMIN_STATUS="ldap-sync-admin-status"
+
+DESCRIPTION_LDAP_SYNC_ADMIN_GROUPS="Comma separated list of admin group names to sync. Example: group1, group2"
+DEFAULT_LDAP_SYNC_ADMIN_GROUPS=""
+KEY_LDAP_SYNC_ADMIN_GROUPS="ldap-sync-admin-groups"
+
 DESCRIPTION_LDAP_DEFAULT_DOMAIN="The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP"
 DEFAULT_LDAP_DEFAULT_DOMAIN=""
 KEY_LDAP_DEFAULT_DOMAIN="ldap-default-domain"

+ 22 - 16
snap-src/bin/wekan-help

@@ -297,22 +297,28 @@ echo -e "Ldap Default Domain."
 echo -e "The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP:"
 echo -e "\t$ snap set $SNAP_NAME ldap-default-domain=''"
 echo -e "\n"
-# echo -e "Logout with timer."
-# echo -e "Enable or not the option that allows to disconnect an user after a given time:"
-# echo -e "\t$ snap set $SNAP_NAME logout-with-timer='true'"
-# echo -e "\n"
-# echo -e "Logout in."
-# echo -e "Logout in how many days:"
-# echo -e "\t$ snap set $SNAP_NAME logout-in='1'"
-# echo -e "\n"
-# echo -e "Logout on hours."
-# echo -e "Logout in how many hours:"
-# echo -e "\t$ snap set $SNAP_NAME logout-on-hours='9'"
-# echo -e "\n"
-# echo -e "Logout on minutes."
-# echo -e "Logout in how many minutes:"
-# echo -e "\t$ snap set $SNAP_NAME logout-on-minutes='5'"
-# echo -e "\n"
+echo -e "Enable/Disable syncing of admin status based on LDAP groups."
+echo -e "\t$ snap set $SNAP_NAME ldap-sync-admin-status='true'"
+echo -e "\n"
+echo -e "Comma separated list of admin group names to sync."
+echo -e "\t$ snap set $SNAP_NAME ldap-sync-admin-groups='group1,group2'"
+echo -e "\n"
+echo -e "Logout with timer."
+echo -e "Enable or not the option that allows to disconnect an user after a given time:"
+echo -e "\t$ snap set $SNAP_NAME logout-with-timer='true'"
+echo -e "\n"
+echo -e "Logout in."
+echo -e "Logout in how many days:"
+echo -e "\t$ snap set $SNAP_NAME logout-in='1'"
+echo -e "\n"
+echo -e "Logout on hours."
+echo -e "Logout in how many hours:"
+echo -e "\t$ snap set $SNAP_NAME logout-on-hours='9'"
+echo -e "\n"
+echo -e "Logout on minutes."
+echo -e "Logout in how many minutes:"
+echo -e "\t$ snap set $SNAP_NAME logout-on-minutes='5'"
+echo -e "\n"
 echo -e "Default authentication method."
 echo -e "The default authentication method used if a user does not exist to create and authenticate. Method can be password or ldap."
 echo -e "\t$ snap set $SNAP_NAME default-authentication-method='ldap'"

+ 1 - 1
snapcraft.yaml

@@ -206,7 +206,7 @@ parts:
             cp -r .build/bundle/* $SNAPCRAFT_PART_INSTALL/
             cp .build/bundle/.node_version.txt $SNAPCRAFT_PART_INSTALL/
             rm $SNAPCRAFT_PART_INSTALL/lib/node_modules/wekan
-            execstack --clear-execstack $SNAPCRAFT_PART_INSTALL/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
+            rm $SNAPCRAFT_PART_INSTALL/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
         organize:
             README: README.wekan
         prime:

+ 1 - 0
stacksmith/user-scripts/build.sh

@@ -92,6 +92,7 @@ sudo -u wekan ${meteor} npm install
 sudo -u wekan ${meteor} build --directory /home/wekan/app_build
 sudo cp /home/wekan/app/fix-download-unicode/cfs_access-point.txt /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js
 sudo chown wekan:wekan /home/wekan/app_build/bundle/programs/server/packages/cfs_access-point.js
+sudo rm /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
 cd /home/wekan/app_build/bundle/programs/server/
 sudo npm install
 sudo chown -R wekan:wekan ./node_modules

+ 6 - 0
start-wekan.bat

@@ -248,6 +248,12 @@ REM # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create
 REM # example :
 REM SET LDAP_DEFAULT_DOMAIN=
 
+REM # Enable/Disable syncing of admin status based on ldap groups:
+REM SET LDAP_SYNC_ADMIN_STATUS=true
+
+REM # Comma separated list of admin group names to sync.
+REM SET LDAP_SYNC_ADMIN_GROUPS=group1,group2
+
 REM ------------------------------------------------
 
 REM # LOGOUT_WITH_TIMER : Enables or not the option logout with timer

+ 4 - 0
start-wekan.sh

@@ -265,6 +265,10 @@ function wekan_repo_check(){
       # LDAP_DEFAULT_DOMAIN : The default domain of the ldap it is used to create email if the field is not map correctly with the LDAP_SYNC_USER_DATA_FIELDMAP
       # example :
       #export LDAP_DEFAULT_DOMAIN=
+      # Enable/Disable syncing of admin status based on ldap groups:
+      #export LDAP_SYNC_ADMIN_STATUS=true
+      # Comma separated list of admin group names to sync.
+      #export LDAP_SYNC_ADMIN_GROUPS=group1,group2
       # LOGOUT_WITH_TIMER : Enables or not the option logout with timer
       # example : LOGOUT_WITH_TIMER=true
       #export LOGOUT_WITH_TIMER=