瀏覽代碼

Merge branch 'master' into devel

Maxime Quandalle 9 年之前
父節點
當前提交
0f014c954c

+ 5 - 5
History.md

@@ -13,15 +13,15 @@ security. It also features the following improvements:
   by Sandstorm);
   by Sandstorm);
 * Cards multi-selection to facilitate batch actions such as moving all the cards
 * Cards multi-selection to facilitate batch actions such as moving all the cards
   of selection, or attaching a label or a member to them;
   of selection, or attaching a label or a member to them;
+* Automatic drafts saving synced with the server;
 * Keyboard navigation, press `?` to read the list of available shortcuts;
 * Keyboard navigation, press `?` to read the list of available shortcuts;
 * The possibility to restore archived boards, lists, and cards.
 * The possibility to restore archived boards, lists, and cards.
 
 
 Starting from this release we will also distribute official docker images on
 Starting from this release we will also distribute official docker images on
-both the
-[GitHub release page](https://github.com/wekan/wekan/releases)
-and on the
-[DockerHub](https://hub.docker.com/r/mquandalle/wekan). We also improved
-Sandstorm integration with the support of its build-in sharing model.
+both the [GitHub release page](https://github.com/wekan/wekan/releases) and on
+the [DockerHub](https://hub.docker.com/r/mquandalle/wekan). We also configured
+Heroku one-click install and improved Sandstorm integration with the integration
+of its build-in sharing model.
 
 
 New languages supported: Chinese, Finnish, Spanish, Korean, and Russian.
 New languages supported: Chinese, Finnish, Spanish, Korean, and Russian.
 
 

+ 25 - 14
README.md

@@ -1,27 +1,38 @@
 # Wekan
 # Wekan
 
 
-[![Join the chat at https://gitter.im/wekan/wekan](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/wekan/wekan?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![Join the chat][gitter_badge]][gitter_chat]
 
 
-<!-- XXX Need to improve this introduction -->
+Wekan is an open-source and collaborative kanban board application.
 
 
-Wekan is an open-source *kanban* board that let you organize things in cards,
-and cards in lists. You can use it alone, or with your team and family thanks to
-our real-time synchronisation feature. Wekan is a land of liberty and you can
-implement all sort of workflows on it using tags, comments, member assignation,
-and many more.
+Whether you’re maintaining a personal todo list, planning your holidays with
+some friends, or working in a team on your next revolutionary idea, Kanban
+boards are an unbeatable tool to keep your things organized. They give you a
+visual overview of the current state of your project, and make you productive by
+allowing you to focus on the few items that matter the most.
 
 
-[![Our roadmap is self-hosted on LibreBoard][thumbnail]][roadmap]
+[![Our roadmap is self-hosted on Wekan][screenshot]][roadmap]
+
+Wekan supports most features you would expect of it including a real-time user
+interface, cards comments, member assignations, customizable labels, filtered
+views, and more.
 
 
 Since it is a free software, you don’t have to trust us with your data and can
 Since it is a free software, you don’t have to trust us with your data and can
 install Wekan on your own computer or server. In fact we encourage you to do
 install Wekan on your own computer or server. In fact we encourage you to do
-that by providing one-click installation for the
-[Sandstorm](https://sandstorm.io) platform and verified
-[Docker](https://www.docker.com) images.
+that by providing one-click installation on Heroku or [Sandstorm]
+[sandstorm_market] platforms and verified [Docker][docker_image] images.
+
+[![Deploy][heroku_button]][heroku_deploy]
 
 
 Wekan is released under the very permissive [MIT license](LICENSE), and made
 Wekan is released under the very permissive [MIT license](LICENSE), and made
 with [Meteor](https://www.meteor.com).
 with [Meteor](https://www.meteor.com).
 
 
-[Our roadmap is self-hosted on LibreBoard][roadmap]
+[Our roadmap is self-hosted on Wekan][roadmap]
 
 
-[thumbnail]: http://i.imgur.com/IIdHUmW.png
-[roadmap]: http://libreboard.com/boards/MeSsFJaSqeuo9M6bs/libreboard-roadmap
+[screenshot]: http://i.imgur.com/cI4jW2h.png
+[gitter_badge]: https://badges.gitter.im/Join%20Chat.svg
+[gitter_chat]: https://gitter.im/wekan/wekan
+[roadmap]: http://try.wekan.io/b/MeSsFJaSqeuo9M6bs/wekan-roadmap
+[sandstorm_market]: https://oasis.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h
+[docker_image]: https://hub.docker.com/r/mquandalle/wekan/
+[heroku_button]: https://www.herokucdn.com/deploy/button.png
+[heroku_deploy]: https://heroku.com/deploy?template=https://github.com/wekan/wekan/tree/master

+ 19 - 0
app.json

@@ -0,0 +1,19 @@
+{
+  "name": "Wekan",
+  "description": "The open-source Trello-like kanban",
+  "repository": "https://github.com/wekan/wekan",
+  "logo": "https://raw.githubusercontent.com/wekan/wekan/master/meta/icons/wekan-150.png",
+  "keywords": ["productivity", "tool", "team", "kanban"],
+  "website": "http://wekan.io",
+  "env": {
+    "BUILDPACK_URL": "https://github.com/AdmitHub/meteor-buildpack-horse.git",
+    "ROOT_URL": {
+      "description": "IMPORTANT! Please replace <App Name> with the value provided on the top. This will be the full URL of your Wekan app.",
+      "value": "https://<App Name>.herokuapp.com"
+    }
+  },
+  "addons": [
+    "mongolab",
+    "logentries"
+  ]
+}

+ 7 - 1
client/components/boards/boardBody.js

@@ -68,7 +68,13 @@ BlazeComponent.extendComponent({
 
 
       // Click-and-drag action
       // Click-and-drag action
       'mousedown .board-canvas'(evt) {
       'mousedown .board-canvas'(evt) {
-        if ($(evt.target).closest('a,.js-list-header').length === 0) {
+        // Translating the board canvas using the click-and-drag action can
+        // conflict with the build-in browser mechanism to select text. We
+        // define a list of elements in which we disable the dragging because
+        // the user will legitimately expect to be able to select some text with
+        // his mouse.
+        const noDragInside = ['a', 'input', 'textarea', 'p', '.js-list-header'];
+        if ($(evt.target).closest(noDragInside.join(',')).length === 0) {
           this._isDragging = true;
           this._isDragging = true;
           this._lastDragPositionX = evt.clientX;
           this._lastDragPositionX = evt.clientX;
         }
         }

+ 3 - 0
client/components/cards/cardDetails.js

@@ -96,6 +96,9 @@ BlazeComponent.extendComponent({
   _getUnsavedEditKey() {
   _getUnsavedEditKey() {
     return {
     return {
       fieldName: 'cardDescription',
       fieldName: 'cardDescription',
+      // XXX Recovering the currentCard identifier form a session variable is
+      // fragile because this variable may change for instance if the route
+      // change. We should use some component props instead.
       docId: Session.get('currentCard'),
       docId: Session.get('currentCard'),
     };
     };
   }
   }

+ 1 - 1
client/components/sidebar/sidebar.jade

@@ -42,7 +42,7 @@ template(name="labelsWidget")
     .board-widget-content
     .board-widget-content
       each currentBoard.labels
       each currentBoard.labels
           a.card-label(class="card-label-{{color}}"
           a.card-label(class="card-label-{{color}}"
-            class="{{#if currentUser.isBoardMember}}js-add-labels{{/if}}")
+            class="{{#if currentUser.isBoardMember}}js-label{{/if}}")
             span.card-label-name= name
             span.card-label-name= name
       if currentUser.isBoardAdmin
       if currentUser.isBoardAdmin
         a.card-label.add-label.js-add-label
         a.card-label.add-label.js-add-label

+ 2 - 2
client/config/router.js

@@ -40,11 +40,11 @@ FlowRouter.route('/b/:id/:slug', {
 FlowRouter.route('/b/:boardId/:slug/:cardId', {
 FlowRouter.route('/b/:boardId/:slug/:cardId', {
   name: 'card',
   name: 'card',
   action(params) {
   action(params) {
+    EscapeActions.executeUpTo('inlinedForm');
+
     Session.set('currentBoard', params.boardId);
     Session.set('currentBoard', params.boardId);
     Session.set('currentCard', params.cardId);
     Session.set('currentCard', params.cardId);
 
 
-    EscapeActions.executeUpTo('inlinedForm');
-
     BlazeLayout.render('defaultLayout', { content: 'board' });
     BlazeLayout.render('defaultLayout', { content: 'board' });
   },
   },
 });
 });

+ 3 - 3
i18n/fr.i18n.json

@@ -24,7 +24,7 @@
     "added": "Ajouté",
     "added": "Ajouté",
     "addMemberPopup-title": "Membres",
     "addMemberPopup-title": "Membres",
     "admin": "Admin",
     "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 membres et changer les paramètres du tableau.",
     "all-boards": "Tous les tableaux",
     "all-boards": "Tous les tableaux",
     "and-n-other-card": "Et __count__ autre carte",
     "and-n-other-card": "Et __count__ autre carte",
     "and-n-other-card_plural": "Et __count__ autres cartes",
     "and-n-other-card_plural": "Et __count__ autres cartes",
@@ -43,7 +43,7 @@
     "attachment-delete-pop": "La suppression d'une pièce jointe est définitive. Elle ne peut être annulée.",
     "attachment-delete-pop": "La suppression d'une pièce jointe est définitive. Elle ne peut être annulée.",
     "attachmentDeletePopup-title": "Supprimer la pièce jointe ?",
     "attachmentDeletePopup-title": "Supprimer la pièce jointe ?",
     "attachments": "Pièces jointes",
     "attachments": "Pièces jointes",
-    "avatar-too-big": "L’avatar est trop gros (70Kb max)",
+    "avatar-too-big": "La taille du fichier de l’avatar est trop importante (70 Ko au maximum)",
     "back": "Retour",
     "back": "Retour",
     "board-change-color": "Changer la couleur",
     "board-change-color": "Changer la couleur",
     "board-nb-stars": "%s étoiles",
     "board-nb-stars": "%s étoiles",
@@ -195,6 +195,6 @@
     "uploaded-avatar": "Avatar téléchargé",
     "uploaded-avatar": "Avatar téléchargé",
     "username": "Nom d'utilisateur",
     "username": "Nom d'utilisateur",
     "view-it": "Le voir",
     "view-it": "Le voir",
-    "warn-list-archived": "attention: cette carte est dans une liste archivée",
+    "warn-list-archived": "Attention : cette carte est dans une liste archivée",
     "what-to-do": "Que voulez-vous faire ?"
     "what-to-do": "Que voulez-vous faire ?"
 }
 }

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

@@ -1,6 +1,6 @@
 {
 {
     "actions": "Ações",
     "actions": "Ações",
-    "activities": "Activities",
+    "activities": "Atividades",
     "activity": "Atividade",
     "activity": "Atividade",
     "activity-added": "adicionou %s a %s",
     "activity-added": "adicionou %s a %s",
     "activity-archived": "arquivou %s",
     "activity-archived": "arquivou %s",
@@ -14,30 +14,30 @@
     "activity-sent": "enviou %s de %s",
     "activity-sent": "enviou %s de %s",
     "activity-unjoined": "deixou %s",
     "activity-unjoined": "deixou %s",
     "add": "Novo",
     "add": "Novo",
-    "add-attachment": "Add an attachment",
+    "add-attachment": "Adicionar um anexo",
     "add-board": "Criar um quadro novo",
     "add-board": "Criar um quadro novo",
-    "add-card": "Add a card",
+    "add-card": "Adicionar um cartão",
     "add-cover": "Adicionar Capa",
     "add-cover": "Adicionar Capa",
-    "add-label": "Add the label",
-    "add-list": "Add a list",
-    "add-members": "Add Members",
+    "add-label": "Adicionar a Etiqueta",
+    "add-list": "Adicionar uma lista",
+    "add-members": "Adicionar Membros",
     "added": "Criado",
     "added": "Criado",
     "addMemberPopup-title": "Membros",
     "addMemberPopup-title": "Membros",
     "admin": "Administrador",
     "admin": "Administrador",
     "admin-desc": "Pode ver e editar cartões, remover membros e alterar configurações do quadro.",
     "admin-desc": "Pode ver e editar cartões, remover membros e alterar configurações do quadro.",
-    "all-boards": "All boards",
+    "all-boards": "Todos os quadros",
     "and-n-other-card": "And __count__ other card",
     "and-n-other-card": "And __count__ other card",
     "and-n-other-card_plural": "And __count__ other cards",
     "and-n-other-card_plural": "And __count__ other cards",
     "archive": "Arquivar",
     "archive": "Arquivar",
     "archive-all": "Arquivar Tudo",
     "archive-all": "Arquivar Tudo",
-    "archive-board": "Archive Board",
-    "archive-card": "Archive Card",
+    "archive-board": "Arquivar Quadro",
+    "archive-card": "Arquivar Cartão",
     "archive-list": "Arquivar esta lista",
     "archive-list": "Arquivar esta lista",
-    "archive-selection": "Archive selection",
+    "archive-selection": "Arquivar seleção",
     "archiveBoardPopup-title": "Fechar Quadro?",
     "archiveBoardPopup-title": "Fechar Quadro?",
     "archived-items": "Itens Arquivados",
     "archived-items": "Itens Arquivados",
-    "archives": "Archives",
-    "assign-member": "Assign member",
+    "archives": "Arquivos",
+    "assign-member": "Atribuir Membro",
     "attached": "anexado",
     "attached": "anexado",
     "attachment": "Anexo",
     "attachment": "Anexo",
     "attachment-delete-pop": "Excluir um anexo é permanente. Não será possível recuperá-lo.",
     "attachment-delete-pop": "Excluir um anexo é permanente. Não será possível recuperá-lo.",
@@ -45,15 +45,15 @@
     "attachments": "Anexos",
     "attachments": "Anexos",
     "avatar-too-big": "The avatar is too large (70Kb max)",
     "avatar-too-big": "The avatar is too large (70Kb max)",
     "back": "Voltar",
     "back": "Voltar",
-    "board-change-color": "Change color",
+    "board-change-color": "Alterar cor",
     "board-nb-stars": "%s stars",
     "board-nb-stars": "%s stars",
     "board-not-found": "Quadro não encontrado",
     "board-not-found": "Quadro não encontrado",
-    "board-private-info": "This board will be <strong>private</strong>.",
+    "board-private-info": "Este quadro será <strong>privado</strong>.",
     "board-public-info": "Este quadro será <strong>público</strong>.",
     "board-public-info": "Este quadro será <strong>público</strong>.",
-    "boardChangeColorPopup-title": "Change Board Background",
+    "boardChangeColorPopup-title": "Alterar Tela de Fundo",
     "boardChangeTitlePopup-title": "Renomear Quadro",
     "boardChangeTitlePopup-title": "Renomear Quadro",
     "boardChangeVisibilityPopup-title": "Alterar Visibilidade",
     "boardChangeVisibilityPopup-title": "Alterar Visibilidade",
-    "boardMenuPopup-title": "Board Menu",
+    "boardMenuPopup-title": "Menu do Quadro",
     "boards": "Quadros",
     "boards": "Quadros",
     "bucket-example": "Like “Bucket List” for example",
     "bucket-example": "Like “Bucket List” for example",
     "cancel": "Cancelar",
     "cancel": "Cancelar",
@@ -62,21 +62,21 @@
     "card-delete-notice": "A exclusão será permanente. Você perderá todas as ações associadas a este cartão.",
     "card-delete-notice": "A exclusão será permanente. Você perderá todas as ações associadas a este cartão.",
     "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.",
     "card-delete-pop": "All actions will be removed from the activity feed and you won't be able to re-open the card. There is no undo.",
     "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.",
     "card-delete-suggest-archive": "You can archive a card to remove it from the board and preserve the activity.",
-    "card-edit-attachments": "Edit attachments",
-    "card-edit-labels": "Edit labels",
-    "card-edit-members": "Edit members",
+    "card-edit-attachments": "Editar anexos",
+    "card-edit-labels": "Editar etiquetas",
+    "card-edit-members": "Editar membros",
     "card-labels-title": "Alterar etiquetas do cartão.",
     "card-labels-title": "Alterar etiquetas do cartão.",
     "card-members-title": "Acrescentar ou remover membros do quadro deste cartão.",
     "card-members-title": "Acrescentar ou remover membros do quadro deste cartão.",
-    "cardAttachmentsPopup-title": "Attach From",
+    "cardAttachmentsPopup-title": "Anexar a partir de",
     "cardDeletePopup-title": "Excluir Cartão?",
     "cardDeletePopup-title": "Excluir Cartão?",
     "cardDetailsActionsPopup-title": "Card Actions",
     "cardDetailsActionsPopup-title": "Card Actions",
     "cardLabelsPopup-title": "Etiquetas",
     "cardLabelsPopup-title": "Etiquetas",
     "cardMembersPopup-title": "Membros",
     "cardMembersPopup-title": "Membros",
     "cardMorePopup-title": "Mais",
     "cardMorePopup-title": "Mais",
-    "cards": "Cards",
+    "cards": "Cartões",
     "change-avatar": "Alterar Avatar",
     "change-avatar": "Alterar Avatar",
     "change-password": "Alterar Senha",
     "change-password": "Alterar Senha",
-    "change-permissions": "Change permissions",
+    "change-permissions": "Alterar permissões",
     "changeAvatarPopup-title": "Alterar Avatar",
     "changeAvatarPopup-title": "Alterar Avatar",
     "changeLanguagePopup-title": "Alterar Idioma",
     "changeLanguagePopup-title": "Alterar Idioma",
     "changePasswordPopup-title": "Alterar Senha",
     "changePasswordPopup-title": "Alterar Senha",
@@ -84,10 +84,10 @@
     "click-to-star": "Marcar quadro como favorito.",
     "click-to-star": "Marcar quadro como favorito.",
     "click-to-unstar": "Remover quadro dos favoritos.",
     "click-to-unstar": "Remover quadro dos favoritos.",
     "close": "Fechar",
     "close": "Fechar",
-    "close-board": "Close Board",
+    "close-board": "Fechar Quadro",
     "close-board-pop": "Você pode reabrir um quadro clicando em “Quadros” no menu no cabeçalho, selecionando “Exibir Quadros Fechados”, encontrando-o e clicando em “Reabrir”.",
     "close-board-pop": "Você pode reabrir um quadro clicando em “Quadros” no menu no cabeçalho, selecionando “Exibir Quadros Fechados”, encontrando-o e clicando em “Reabrir”.",
     "comment": "Comentário",
     "comment": "Comentário",
-    "comment-placeholder": "Write a comment",
+    "comment-placeholder": "Escrever um comentário",
     "computer": "Computador",
     "computer": "Computador",
     "create": "Criar",
     "create": "Criar",
     "createBoardPopup-title": "Criar Quadro",
     "createBoardPopup-title": "Criar Quadro",
@@ -103,21 +103,21 @@
     "download": "Baixar",
     "download": "Baixar",
     "edit": "Editar",
     "edit": "Editar",
     "edit-avatar": "Alterar Avatar",
     "edit-avatar": "Alterar Avatar",
-    "edit-profile": "Edit Profile",
+    "edit-profile": "Editar Perfil",
     "editLabelPopup-title": "Alterar Etiqueta",
     "editLabelPopup-title": "Alterar Etiqueta",
-    "editProfilePopup-title": "Edit Profile",
+    "editProfilePopup-title": "Editar Perfil",
     "email": "E-mail",
     "email": "E-mail",
-    "filter": "Filter",
+    "filter": "Filtrar",
     "filter-cards": "Filtrar Cartões",
     "filter-cards": "Filtrar Cartões",
-    "filter-clear": "Clear filter",
-    "filter-on": "Filter is on",
+    "filter-clear": "Limpar filtro",
+    "filter-on": "Filtro está ativo",
     "filter-on-desc": "Você está filtrando cartões neste quadro. Clique aqui para editar o filtro.",
     "filter-on-desc": "Você está filtrando cartões neste quadro. Clique aqui para editar o filtro.",
     "filter-to-selection": "Filter to selection",
     "filter-to-selection": "Filter to selection",
     "fullname": "Nome Completo",
     "fullname": "Nome Completo",
     "header-logo-title": "Voltar para a lista de quadros.",
     "header-logo-title": "Voltar para a lista de quadros.",
     "home": "Início",
     "home": "Início",
     "info": "Informações",
     "info": "Informações",
-    "initials": "Initials",
+    "initials": "Iniciais",
     "joined": "juntou-se",
     "joined": "juntou-se",
     "keyboard-shortcuts": "Keyboard shortcuts",
     "keyboard-shortcuts": "Keyboard shortcuts",
     "label-create": "Criar uma nova etiqueta",
     "label-create": "Criar uma nova etiqueta",
@@ -126,7 +126,7 @@
     "labels": "Etiquetas",
     "labels": "Etiquetas",
     "language": "Idioma",
     "language": "Idioma",
     "last-admin-desc": "Você não pode alterar funções porque deve existir pelo menos um administrador.",
     "last-admin-desc": "Você não pode alterar funções porque deve existir pelo menos um administrador.",
-    "leave-board": "Leave Board",
+    "leave-board": "Sair do Quadro",
     "link-card": "Vincular a este cartão",
     "link-card": "Vincular a este cartão",
     "list-archive-cards": "Archive all cards in this list",
     "list-archive-cards": "Archive all cards in this list",
     "list-archive-cards-pop": "Isto removerá todos os cartões desta lista do quadro. Para visualizar os cartões arquivados e trazê-los de volta para o quadro, clique em “Menu” > “Itens Arquivados”.",
     "list-archive-cards-pop": "Isto removerá todos os cartões desta lista do quadro. Para visualizar os cartões arquivados e trazê-los de volta para o quadro, clique em “Menu” > “Itens Arquivados”.",
@@ -135,13 +135,13 @@
     "listActionPopup-title": "Listar Ações",
     "listActionPopup-title": "Listar Ações",
     "listArchiveCardsPopup-title": "Arquivar Todos Os Cartões Nesta Lista?",
     "listArchiveCardsPopup-title": "Arquivar Todos Os Cartões Nesta Lista?",
     "listMoveCardsPopup-title": "Mover Todos Os Cartões Nesta Lista",
     "listMoveCardsPopup-title": "Mover Todos Os Cartões Nesta Lista",
-    "lists": "Lists",
+    "lists": "Listas",
     "log-out": "Sair",
     "log-out": "Sair",
     "loginPopup-title": "Entrar",
     "loginPopup-title": "Entrar",
     "memberMenuPopup-title": "Member Settings",
     "memberMenuPopup-title": "Member Settings",
     "members": "Membros",
     "members": "Membros",
     "menu": "Menu",
     "menu": "Menu",
-    "moveCardPopup-title": "Move Card",
+    "moveCardPopup-title": "Mover Cartão",
     "multi-selection": "Multi-Selection",
     "multi-selection": "Multi-Selection",
     "my-boards": "Meus Quadros",
     "my-boards": "Meus Quadros",
     "name": "Nome",
     "name": "Nome",
@@ -169,7 +169,7 @@
     "removeMemberPopup-title": "Remover Membro?",
     "removeMemberPopup-title": "Remover Membro?",
     "rename": "Renomear",
     "rename": "Renomear",
     "rename-board": "Renomear Quadro",
     "rename-board": "Renomear Quadro",
-    "restore": "Restore",
+    "restore": "Restaurar",
     "save": "Salvar",
     "save": "Salvar",
     "search": "Buscar",
     "search": "Buscar",
     "select-color": "Selecione uma cor",
     "select-color": "Selecione uma cor",

二進制
meta/icons/wekan-150.png


+ 1 - 1
sandstorm-pkgdef.capnp

@@ -25,7 +25,7 @@ const pkgdef :Spk.PackageDefinition = (
     appVersion = 5,
     appVersion = 5,
     # Increment this for every release.
     # Increment this for every release.
 
 
-    appMarketingVersion = (defaultText = "0.9.0-rc2"),
+    appMarketingVersion = (defaultText = "0.9.0"),
     # Human-readable presentation of the app version.
     # Human-readable presentation of the app version.
 
 
     minUpgradableAppVersion = 0,
     minUpgradableAppVersion = 0,