Merge branch 'devel'

This commit is contained in:
Lauri Ojansivu 2018-05-23 22:55:29 +03:00
commit 05020241aa
7 changed files with 151 additions and 167 deletions

View file

@ -1,3 +1,11 @@
# v1.01 2018-05-23 Wekan release
This release possibly fixes the following bugs, please test:
* [Possible quickfix for all customFields Import errors, please test](https://github.com/wekan/wekan/pull/1653).
Thanks to GitHub users feuerball11 and xet7 for their contributions.
# v1.00 2018-05-21 Wekan release
This release fixes the following bugs:

View file

@ -86,18 +86,17 @@ class AdvancedFilter {
constructor() {
this._dep = new Tracker.Dependency();
this._filter = '';
this._lastValide={};
this._lastValide = {};
}
set(str)
{
set(str) {
this._filter = str;
this._dep.changed();
}
reset() {
this._filter = '';
this._lastValide={};
this._lastValide = {};
this._dep.changed();
}
@ -106,75 +105,63 @@ class AdvancedFilter {
return this._filter !== '';
}
_filterToCommands(){
_filterToCommands() {
const commands = [];
let current = '';
let string = false;
let wasString = false;
let ignore = false;
for (let i = 0; i < this._filter.length; i++)
{
for (let i = 0; i < this._filter.length; i++) {
const char = this._filter.charAt(i);
if (ignore)
{
if (ignore) {
ignore = false;
continue;
}
if (char === '\'')
{
if (char === '\'') {
string = !string;
if (string) wasString = true;
continue;
}
if (char === '\\')
{
if (char === '\\') {
ignore = true;
continue;
}
if (char === ' ' && !string)
{
commands.push({'cmd':current, 'string':wasString});
if (char === ' ' && !string) {
commands.push({ 'cmd': current, 'string': wasString });
wasString = false;
current = '';
continue;
}
current += char;
}
if (current !== '')
{
commands.push({'cmd':current, 'string':wasString});
if (current !== '') {
commands.push({ 'cmd': current, 'string': wasString });
}
return commands;
}
_fieldNameToId(field)
{
const found = CustomFields.findOne({'name':field});
_fieldNameToId(field) {
const found = CustomFields.findOne({ 'name': field });
return found._id;
}
_arrayToSelector(commands)
{
_arrayToSelector(commands) {
try {
//let changed = false;
this._processSubCommands(commands);
}
catch (e){return this._lastValide;}
this._lastValide = {$or: commands};
return {$or: commands};
catch (e) { return this._lastValide; }
this._lastValide = { $or: commands };
return { $or: commands };
}
_processSubCommands(commands)
{
_processSubCommands(commands) {
const subcommands = [];
let level = 0;
let start = -1;
for (let i = 0; i < commands.length; i++)
{
if (commands[i].cmd)
{
switch (commands[i].cmd)
{
for (let i = 0; i < commands.length; i++) {
if (commands[i].cmd) {
switch (commands[i].cmd) {
case '(':
{
level++;
@ -190,8 +177,7 @@ class AdvancedFilter {
}
default:
{
if (level > 0)
{
if (level > 0) {
subcommands.push(commands[i]);
commands.splice(i, 1);
i--;
@ -201,8 +187,7 @@ class AdvancedFilter {
}
}
}
if (start !== -1)
{
if (start !== -1) {
this._processSubCommands(subcommands);
if (subcommands.length === 1)
commands.splice(start, 0, subcommands[0]);
@ -213,22 +198,18 @@ class AdvancedFilter {
this._processLogicalOperators(commands);
}
_processConditions(commands)
{
for (let i = 0; i < commands.length; i++)
{
if (!commands[i].string && commands[i].cmd)
{
switch (commands[i].cmd)
{
_processConditions(commands) {
for (let i = 0; i < commands.length; i++) {
if (!commands[i].string && commands[i].cmd) {
switch (commands[i].cmd) {
case '=':
case '==':
case '===':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value':str};
commands.splice(i-1, 1);
const field = commands[i - 1].cmd;
const str = commands[i + 1].cmd;
commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': str };
commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@ -237,10 +218,10 @@ class AdvancedFilter {
case '!=':
case '!==':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $not: str }};
commands.splice(i-1, 1);
const field = commands[i - 1].cmd;
const str = commands[i + 1].cmd;
commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $not: str } };
commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@ -251,10 +232,10 @@ class AdvancedFilter {
case 'Gt':
case 'GT':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $gt: str } };
commands.splice(i-1, 1);
const field = commands[i - 1].cmd;
const str = commands[i + 1].cmd;
commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $gt: str } };
commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@ -266,10 +247,10 @@ class AdvancedFilter {
case 'Gte':
case 'GTE':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $gte: str } };
commands.splice(i-1, 1);
const field = commands[i - 1].cmd;
const str = commands[i + 1].cmd;
commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $gte: str } };
commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@ -280,10 +261,10 @@ class AdvancedFilter {
case 'Lt':
case 'LT':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $lt: str } };
commands.splice(i-1, 1);
const field = commands[i - 1].cmd;
const str = commands[i + 1].cmd;
commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $lt: str } };
commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@ -295,10 +276,10 @@ class AdvancedFilter {
case 'Lte':
case 'LTE':
{
const field = commands[i-1].cmd;
const str = commands[i+1].cmd;
commands[i] = {'customFields._id':this._fieldNameToId(field), 'customFields.value': { $lte: str } };
commands.splice(i-1, 1);
const field = commands[i - 1].cmd;
const str = commands[i + 1].cmd;
commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { $lte: str } };
commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@ -310,24 +291,20 @@ class AdvancedFilter {
}
}
_processLogicalOperators(commands)
{
for (let i = 0; i < commands.length; i++)
{
if (!commands[i].string && commands[i].cmd)
{
switch (commands[i].cmd)
{
_processLogicalOperators(commands) {
for (let i = 0; i < commands.length; i++) {
if (!commands[i].string && commands[i].cmd) {
switch (commands[i].cmd) {
case 'or':
case 'Or':
case 'OR':
case '|':
case '||':
{
const op1 = commands[i-1];
const op2 = commands[i+1];
commands[i] = {$or: [op1, op2]};
commands.splice(i-1, 1);
const op1 = commands[i - 1];
const op2 = commands[i + 1];
commands[i] = { $or: [op1, op2] };
commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@ -339,10 +316,10 @@ class AdvancedFilter {
case '&':
case '&&':
{
const op1 = commands[i-1];
const op2 = commands[i+1];
commands[i] = {$and: [op1, op2]};
commands.splice(i-1, 1);
const op1 = commands[i - 1];
const op2 = commands[i + 1];
commands[i] = { $and: [op1, op2] };
commands.splice(i - 1, 1);
commands.splice(i, 1);
//changed = true;
i--;
@ -354,9 +331,9 @@ class AdvancedFilter {
case 'NOT':
case '!':
{
const op1 = commands[i+1];
commands[i] = {$not: op1};
commands.splice(i+1, 1);
const op1 = commands[i + 1];
commands[i] = { $not: op1 };
commands.splice(i + 1, 1);
//changed = true;
i--;
break;
@ -412,12 +389,10 @@ Filter = {
this._fields.forEach((fieldName) => {
const filter = this[fieldName];
if (filter._isActive()) {
if (filter.subField !== '')
{
if (filter.subField !== '') {
filterSelector[`${fieldName}.${filter.subField}`] = filter._getMongoSelector();
}
else
{
else {
filterSelector[fieldName] = filter._getMongoSelector();
}
emptySelector[fieldName] = filter._getEmptySelector();
@ -427,7 +402,7 @@ Filter = {
}
});
const exceptionsSelector = {_id: {$in: this._exceptions}};
const exceptionsSelector = { _id: { $in: this._exceptions } };
this._exceptionsDep.depend();
const selectors = [exceptionsSelector];
@ -438,7 +413,7 @@ Filter = {
if (includeEmptySelectors) selectors.push(emptySelector);
if (this.advanced._isActive()) selectors.push(this.advanced._getMongoSelector());
return {$or: selectors};
return { $or: selectors };
},
mongoSelector(additionalSelector) {
@ -446,7 +421,7 @@ Filter = {
if (_.isUndefined(additionalSelector))
return filterSelector;
else
return {$and: [filterSelector, additionalSelector]};
return { $and: [filterSelector, additionalSelector] };
},
reset() {

View file

@ -28,10 +28,10 @@
"activities": "Aktivitäten",
"activity": "Aktivität",
"activity-added": "hat %s zu %s hinzugefügt",
"activity-archived": "%s in den Papierkorb verschoben",
"activity-archived": "hat %s in den Papierkorb verschoben",
"activity-attached": "hat %s an %s angehängt",
"activity-created": "hat %s erstellt",
"activity-customfield-created": "Benutzerdefiniertes Feld erstellen %s",
"activity-customfield-created": "hat das benutzerdefinierte Feld %s erstellt",
"activity-excluded": "hat %s von %s ausgeschlossen",
"activity-imported": "hat %s in %s von %s importiert",
"activity-imported-board": "hat %s von %s importiert",
@ -184,7 +184,7 @@
"custom-field-dropdown-options-placeholder": "Drücken Sie die Eingabetaste, um weitere Optionen hinzuzufügen",
"custom-field-dropdown-unknown": "(unbekannt)",
"custom-field-number": "Zahl",
"custom-field-text": "Test",
"custom-field-text": "Text",
"custom-fields": "Benutzerdefinierte Felder",
"date": "Datum",
"decline": "Ablehnen",
@ -378,7 +378,7 @@
"starred-boards-description": "Markierte Boards erscheinen oben in ihrer Boardliste.",
"subscribe": "Abonnieren",
"team": "Team",
"this-board": "dieses Board",
"this-board": "diesem Board",
"this-card": "diese Karte",
"spent-time-hours": "Aufgewendete Zeit (Stunden)",
"overtime-hours": "Mehrarbeit (Stunden)",

View file

@ -3,17 +3,17 @@
"act-activity-notify": "[Wekan] Notificação de Atividade",
"act-addAttachment": "anexo __attachment__ de __card__",
"act-addChecklist": "added checklist __checklist__ no __card__",
"act-addChecklistItem": "added __checklistItem__ to checklist __checklist__ on __card__",
"act-addChecklistItem": "adicionado __checklistitem__ para a lista de checagem __checklist__ em __card__",
"act-addComment": "comentou em __card__: __comment__",
"act-createBoard": "criou __board__",
"act-createCard": "__card__ adicionado à __list__",
"act-createCustomField": "created custom field __customField__",
"act-createCustomField": "criado campo customizado __customField__",
"act-createList": "__list__ adicionada à __board__",
"act-addBoardMember": "__member__ adicionado à __board__",
"act-archivedBoard": "__board__ moved to Recycle Bin",
"act-archivedCard": "__card__ moved to Recycle Bin",
"act-archivedList": "__list__ moved to Recycle Bin",
"act-archivedSwimlane": "__swimlane__ moved to Recycle Bin",
"act-archivedBoard": "__board__ movido para a lixeira",
"act-archivedCard": "__card__ movido para a lixeira",
"act-archivedList": "__list__ movido para a lixeira",
"act-archivedSwimlane": "__swimlane__ movido para a lixeira",
"act-importBoard": "__board__ importado",
"act-importCard": "__card__ importado",
"act-importList": "__list__ importada",
@ -28,10 +28,10 @@
"activities": "Atividades",
"activity": "Atividade",
"activity-added": "adicionou %s a %s",
"activity-archived": "%s moved to Recycle Bin",
"activity-archived": "%s movido para a lixeira",
"activity-attached": "anexou %s a %s",
"activity-created": "criou %s",
"activity-customfield-created": "created custom field %s",
"activity-customfield-created": "criado campo customizado %s",
"activity-excluded": "excluiu %s de %s",
"activity-imported": "importado %s em %s de %s",
"activity-imported-board": "importado %s de %s",
@ -47,7 +47,7 @@
"add-attachment": "Adicionar Anexos",
"add-board": "Adicionar Quadro",
"add-card": "Adicionar Cartão",
"add-swimlane": "Add Swimlane",
"add-swimlane": "Adicionar Swimlane",
"add-checklist": "Adicionar Checklist",
"add-checklist-item": "Adicionar um item à lista de verificação",
"add-cover": "Adicionar Capa",
@ -66,19 +66,19 @@
"and-n-other-card_plural": "E __count__ outros cartões",
"apply": "Aplicar",
"app-is-offline": "O Wekan está carregando, por favor espere. Recarregar a página irá causar perda de dado. Se o Wekan não carregar por favor verifique se o servidor Wekan não está parado.",
"archive": "Move to Recycle Bin",
"archive-all": "Move All to Recycle Bin",
"archive-board": "Move Board to Recycle Bin",
"archive-card": "Move Card to Recycle Bin",
"archive-list": "Move List to Recycle Bin",
"archive-swimlane": "Move Swimlane to Recycle Bin",
"archive-selection": "Move selection to Recycle Bin",
"archiveBoardPopup-title": "Move Board to Recycle Bin?",
"archived-items": "Recycle Bin",
"archived-boards": "Boards in Recycle Bin",
"archive": "Mover para a lixeira",
"archive-all": "Mover tudo para a lixeira",
"archive-board": "Mover quadro para a lixeira",
"archive-card": "Mover cartão para a lixeira",
"archive-list": "Mover lista para a lixeira",
"archive-swimlane": "Mover Swimlane para a lixeira",
"archive-selection": "Mover seleção para a lixeira",
"archiveBoardPopup-title": "Mover o quadro para a lixeira?",
"archived-items": "Lixeira",
"archived-boards": "Quadros na lixeira",
"restore-board": "Restaurar Quadro",
"no-archived-boards": "No Boards in Recycle Bin.",
"archives": "Recycle Bin",
"no-archived-boards": "Não há quadros na lixeira",
"archives": "Lixeira",
"assign-member": "Atribuir Membro",
"attached": "anexado",
"attachment": "Anexo",
@ -104,16 +104,16 @@
"board-view-lists": "Listas",
"bucket-example": "\"Bucket List\", por exemplo",
"cancel": "Cancelar",
"card-archived": "This card is moved to Recycle Bin.",
"card-archived": "Este cartão foi movido para a lixeira",
"card-comments-title": "Este cartão possui %s comentários.",
"card-delete-notice": "A exclusão será permanente. Você perderá todas as ações associadas a este cartão.",
"card-delete-pop": "Todas as ações serão removidas da lista de Atividades e vocês não poderá re-abrir o cartão. Não há como desfazer.",
"card-delete-suggest-archive": "You can move a card Recycle Bin to remove it from the board and preserve the activity.",
"card-delete-suggest-archive": "Você pode mover um cartão para fora da lixeira e movê-lo para o quadro e preservar a atividade.",
"card-due": "Data fim",
"card-due-on": "Finaliza em",
"card-spent": "Tempo Gasto",
"card-edit-attachments": "Editar anexos",
"card-edit-custom-fields": "Edit custom fields",
"card-edit-custom-fields": "Editar campos customizados",
"card-edit-labels": "Editar etiquetas",
"card-edit-members": "Editar membros",
"card-labels-title": "Alterar etiquetas do cartão.",
@ -121,8 +121,8 @@
"card-start": "Data início",
"card-start-on": "Começa em",
"cardAttachmentsPopup-title": "Anexar a partir de",
"cardCustomField-datePopup-title": "Change date",
"cardCustomFieldsPopup-title": "Edit custom fields",
"cardCustomField-datePopup-title": "Mudar data",
"cardCustomFieldsPopup-title": "Editar campos customizados",
"cardDeletePopup-title": "Excluir Cartão?",
"cardDetailsActionsPopup-title": "Ações do cartão",
"cardLabelsPopup-title": "Etiquetas",
@ -146,7 +146,7 @@
"clipboard": "Área de Transferência ou arraste e solte",
"close": "Fechar",
"close-board": "Fechar Quadro",
"close-board-pop": "You will be able to restore the board by clicking the “Recycle Bin” button from the home header.",
"close-board-pop": "Você poderá restaurar o quadro clicando no botão lixeira no cabeçalho da página inicial",
"color-black": "preto",
"color-blue": "azul",
"color-green": "verde",
@ -172,25 +172,25 @@
"createBoardPopup-title": "Criar Quadro",
"chooseBoardSourcePopup-title": "Importar quadro",
"createLabelPopup-title": "Criar Etiqueta",
"createCustomField": "Create Field",
"createCustomFieldPopup-title": "Create Field",
"createCustomField": "Criar campo",
"createCustomFieldPopup-title": "Criar campo",
"current": "atual",
"custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
"custom-field-checkbox": "Checkbox",
"custom-field-delete-pop": "Não existe desfazer. Isso irá remover o campo customizado de todos os cartões e destruir seu histórico",
"custom-field-checkbox": "Caixa de seleção",
"custom-field-date": "Data",
"custom-field-dropdown": "Dropdown List",
"custom-field-dropdown-none": "(none)",
"custom-field-dropdown-options": "List Options",
"custom-field-dropdown-options-placeholder": "Press enter to add more options",
"custom-field-dropdown-unknown": "(unknown)",
"custom-field-number": "Number",
"custom-field-text": "Text",
"custom-fields": "Custom Fields",
"custom-field-dropdown": "Lista suspensa",
"custom-field-dropdown-none": "(nada)",
"custom-field-dropdown-options": "Lista de opções",
"custom-field-dropdown-options-placeholder": "Pressione enter para adicionar mais opções",
"custom-field-dropdown-unknown": "(desconhecido)",
"custom-field-number": "Número",
"custom-field-text": "Texto",
"custom-fields": "Campos customizados",
"date": "Data",
"decline": "Rejeitar",
"default-avatar": "Avatar padrão",
"delete": "Excluir",
"deleteCustomFieldPopup-title": "Delete Custom Field?",
"deleteCustomFieldPopup-title": "Deletar campo customizado?",
"deleteLabelPopup-title": "Excluir Etiqueta?",
"description": "Descrição",
"disambiguateMultiLabelPopup-title": "Desambiguar ações de etiquetas",
@ -205,7 +205,7 @@
"soft-wip-limit": "Limite de WIP",
"editCardStartDatePopup-title": "Altera data de início",
"editCardDueDatePopup-title": "Altera data fim",
"editCustomFieldPopup-title": "Edit Field",
"editCustomFieldPopup-title": "Editar campo",
"editCardSpentTimePopup-title": "Editar tempo gasto",
"editLabelPopup-title": "Alterar Etiqueta",
"editNotificationPopup-title": "Editar Notificações",
@ -242,12 +242,12 @@
"filter-clear": "Limpar filtro",
"filter-no-label": "Sem labels",
"filter-no-member": "Sem membros",
"filter-no-custom-fields": "No Custom Fields",
"filter-no-custom-fields": "Não há campos customizados",
"filter-on": "Filtro está ativo",
"filter-on-desc": "Você está filtrando cartões neste quadro. Clique aqui para editar o filtro.",
"filter-to-selection": "Filtrar esta seleção",
"advanced-filter-label": "Advanced Filter",
"advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. Also you can combine multiple conditions. For Example: F1 == V1 || F1 = V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 and ( F2 == V2 || F2 == V3 )",
"advanced-filter-label": "Filtro avançado",
"advanced-filter-description": "Um Filtro Avançado permite escrever uma string contendo os seguintes operadores: == != <= >= && || () Um espaço é utilizado como separador entre os operadores. Você pode filtrar todos os campos customizados digitando seus nomes e valores. Por exemplo: campo1 == valor1. Nota: se campos ou valores contém espaços, você precisa encapsular eles em aspas simples. Por exemplo: 'campo 1' == 'valor 1'. Você também pode combinar múltiplas condições. Por exemplo: F1 == V1 || F1 == V2. Normalmente todos os operadores são interpretados da esquerda para a direita. Você pode mudar a ordem ao incluir parênteses. Por exemplo: F1 == V1 e (F2 == V2 || F2 == V3)",
"fullname": "Nome Completo",
"header-logo-title": "Voltar para a lista de quadros.",
"hide-system-messages": "Esconde mensagens de sistema",
@ -287,17 +287,17 @@
"leave-board-pop": "Tem a certeza de que pretende sair de __boardTitle__? Você será removido de todos os cartões neste quadro.",
"leaveBoardPopup-title": "Sair do Quadro ?",
"link-card": "Vincular a este cartão",
"list-archive-cards": "Move all cards in this list to Recycle Bin",
"list-archive-cards-pop": "This will remove all the cards in this list from the board. To view cards in Recycle Bin and bring them back to the board, click “Menu” > “Recycle Bin”.",
"list-archive-cards": "Mover todos os cartões nesta lista para a lixeira",
"list-archive-cards-pop": "Isso irá remover todos os cartões nesta lista do quadro. Para visualizar cartões na lixeira e trazê-los de volta ao quadro, clique em \"Menu\" > \"Lixeira\".",
"list-move-cards": "Mover todos os cartões desta lista",
"list-select-cards": "Selecionar todos os cartões nesta lista",
"listActionPopup-title": "Listar Ações",
"swimlaneActionPopup-title": "Swimlane Actions",
"swimlaneActionPopup-title": "Ações de Swimlane",
"listImportCardPopup-title": "Importe um cartão do Trello",
"listMorePopup-title": "Mais",
"link-list": "Vincular a esta lista",
"list-delete-pop": "Todas as ações serão removidas da lista de atividades e você não poderá recuperar a lista. Não há como desfazer.",
"list-delete-suggest-archive": "You can move a list to Recycle Bin to remove it from the board and preserve the activity.",
"list-delete-suggest-archive": "Você pode mover a lista para a lixeira para removê-la do quadro e preservar a atividade.",
"lists": "Listas",
"swimlanes": "Swimlanes",
"log-out": "Sair",
@ -317,9 +317,9 @@
"muted-info": "Você nunca receberá qualquer notificação desse board",
"my-boards": "Meus Quadros",
"name": "Nome",
"no-archived-cards": "No cards in Recycle Bin.",
"no-archived-lists": "No lists in Recycle Bin.",
"no-archived-swimlanes": "No swimlanes in Recycle Bin.",
"no-archived-cards": "Não há cartões na lixeira",
"no-archived-lists": "Não há listas na lixeira",
"no-archived-swimlanes": "Não há swimlanes na lixeira",
"no-results": "Nenhum resultado.",
"normal": "Normal",
"normal-desc": "Pode ver e editar cartões. Não pode alterar configurações.",
@ -384,12 +384,12 @@
"overtime-hours": "Tempo extras (Horas)",
"overtime": "Tempo extras",
"has-overtime-cards": "Tem cartões de horas extras",
"has-spenttime-cards": "Has spent time cards",
"has-spenttime-cards": "Gastou cartões de tempo",
"time": "Tempo",
"title": "Título",
"tracking": "Tracking",
"tracking-info": "Você será notificado se houver qualquer alteração em cards em que você é o criador ou membro",
"type": "Type",
"type": "Tipo",
"unassign-member": "Membro não associado",
"unsaved-description": "Você possui uma descrição não salva",
"unwatch": "Deixar de observar",
@ -398,12 +398,12 @@
"uploaded-avatar": "Avatar carregado",
"username": "Nome de usuário",
"view-it": "Visualizar",
"warn-list-archived": "warning: this card is in an list at Recycle Bin",
"warn-list-archived": "Aviso: este cartão está em uma lista na lixeira",
"watch": "Observar",
"watching": "Observando",
"watching-info": "Você será notificado em qualquer alteração desse board",
"welcome-board": "Board de Boas Vindas",
"welcome-swimlane": "Milestone 1",
"welcome-swimlane": "Marco 1",
"welcome-list1": "Básico",
"welcome-list2": "Avançado",
"what-to-do": "O que você gostaria de fazer?",
@ -454,19 +454,19 @@
"hours": "horas",
"minutes": "minutos",
"seconds": "segundos",
"show-field-on-card": "Show this field on card",
"show-field-on-card": "Mostrar este campo no cartão",
"yes": "Sim",
"no": "Não",
"accounts": "Contas",
"accounts-allowEmailChange": "Permitir Mudança de Email",
"accounts-allowUserNameChange": "Allow Username Change",
"accounts-allowUserNameChange": "Permitir alteração de nome de usuário",
"createdAt": "Criado em",
"verified": "Verificado",
"active": "Ativo",
"card-received": "Received",
"card-received-on": "Received on",
"card-end": "End",
"card-end-on": "Ends on",
"editCardReceivedDatePopup-title": "Change received date",
"editCardEndDatePopup-title": "Change end date"
"card-received": "Recebido",
"card-received-on": "Recebido em",
"card-end": "Fim",
"card-end-on": "Termina em",
"editCardReceivedDatePopup-title": "Modificar data de recebimento",
"editCardEndDatePopup-title": "Mudar data de fim"
}

View file

@ -220,6 +220,7 @@ Cards.helpers({
}).fetch();
// match right definition to each field
if (!this.customFields) return [];
return this.customFields.map((customField) => {
return {
_id: customField._id,

View file

@ -1,6 +1,6 @@
{
"name": "wekan",
"version": "1.00.0",
"version": "1.01.0",
"description": "The open-source Trello-like kanban",
"private": true,
"scripts": {

View file

@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
appTitle = (defaultText = "Wekan"),
# The name of the app as it is displayed to the user.
appVersion = 85,
appVersion = 86,
# Increment this for every release.
appMarketingVersion = (defaultText = "1.00.0~2018-05-21"),
appMarketingVersion = (defaultText = "1.01.0~2018-05-23"),
# Human-readable presentation of the app version.
minUpgradableAppVersion = 0,