Compare commits

...
17 changed files with 139 additions and 45 deletions
+2 -2
View File
@@ -15,13 +15,13 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.2.2 version: 0.2.3
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using. # follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes. # It is recommended to use it with quotes.
appVersion: "1.19.1" appVersion: "1.19.2"
dependencies: dependencies:
- alias: postgresql - alias: postgresql
+1 -1
View File
@@ -1 +1 @@
REACT_APP_VERSION=1.19.1 REACT_APP_VERSION=1.19.2
+6 -1
View File
@@ -57,10 +57,15 @@ updateCard.failure = (id, error) => ({
}, },
}); });
const handleCardUpdate = (card) => ({ const handleCardUpdate = (card, isFetched, cardMemberships, cardLabels, tasks, attachments) => ({
type: ActionTypes.CARD_UPDATE_HANDLE, type: ActionTypes.CARD_UPDATE_HANDLE,
payload: { payload: {
card, card,
isFetched,
cardMemberships,
cardLabels,
tasks,
attachments,
}, },
}); });
-3
View File
@@ -195,9 +195,6 @@ export default {
CARD_UPDATE__SUCCESS: 'CARD_UPDATE__SUCCESS', CARD_UPDATE__SUCCESS: 'CARD_UPDATE__SUCCESS',
CARD_UPDATE__FAILURE: 'CARD_UPDATE__FAILURE', CARD_UPDATE__FAILURE: 'CARD_UPDATE__FAILURE',
CARD_UPDATE_HANDLE: 'CARD_UPDATE_HANDLE', CARD_UPDATE_HANDLE: 'CARD_UPDATE_HANDLE',
CARD_TRANSFER: 'CARD_TRANSFER',
CARD_TRANSFER__SUCCESS: 'CARD_TRANSFER__SUCCESS',
CARD_TRANSFER__FAILURE: 'CARD_TRANSFER__FAILURE',
CARD_DUPLICATE: 'CARD_DUPLICATE', CARD_DUPLICATE: 'CARD_DUPLICATE',
CARD_DUPLICATE__SUCCESS: 'CARD_DUPLICATE__SUCCESS', CARD_DUPLICATE__SUCCESS: 'CARD_DUPLICATE__SUCCESS',
CARD_DUPLICATE__FAILURE: 'CARD_DUPLICATE__FAILURE', CARD_DUPLICATE__FAILURE: 'CARD_DUPLICATE__FAILURE',
+2
View File
@@ -192,6 +192,8 @@ export default {
deleteTask: 'Aufgabe löschen', deleteTask: 'Aufgabe löschen',
deleteTask_title: 'Aufgabe löschen', deleteTask_title: 'Aufgabe löschen',
deleteUser: 'Benutzer löschen', deleteUser: 'Benutzer löschen',
duplicate: 'Kopieren',
duplicateCard_title: 'Karte kopieren',
edit: 'Bearbeiten', edit: 'Bearbeiten',
editDueDate_title: 'Fälligkeitsdatum bearbeiten', editDueDate_title: 'Fälligkeitsdatum bearbeiten',
editDescription_title: 'Beschreibung ändern', editDescription_title: 'Beschreibung ändern',
+27 -4
View File
@@ -15,6 +15,16 @@ export default {
translation: { translation: {
common: { common: {
aboutPlanka: 'Plankáról',
account: 'Fiók',
actions: 'Műveletek',
addAttachment_title: 'Melléklet hozzáadása',
addComment: 'Megjegyzés hozzáadása',
addManager_title: 'Menedzser hozzáadása',
addMember_title: 'Tag létrehozása',
addUser_title: 'Felhasználó hozzáadása',
administrator: 'Rendszergazda',
all: 'Összes',
allChangesWillBeAutomaticallySavedAfterConnectionRestored: allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'Az összes változás automatikusan mentésre kerül a kapcsolat helyreállása után.', 'Az összes változás automatikusan mentésre kerül a kapcsolat helyreállása után.',
areYouSureYouWantToDeleteThisAttachment: 'Biztosan törölni szeretné ezt a mellékletet?', areYouSureYouWantToDeleteThisAttachment: 'Biztosan törölni szeretné ezt a mellékletet?',
@@ -29,7 +39,7 @@ export default {
areYouSureYouWantToLeaveBoard: 'Biztosan el akarja hagyni a táblát?', areYouSureYouWantToLeaveBoard: 'Biztosan el akarja hagyni a táblát?',
areYouSureYouWantToLeaveProject: 'Biztosan el akarja hagyni a projektet?', areYouSureYouWantToLeaveProject: 'Biztosan el akarja hagyni a projektet?',
areYouSureYouWantToRemoveThisManagerFromProject: areYouSureYouWantToRemoveThisManagerFromProject:
'Biztosan eltávolítja ezt a vezetőt a projektből?', 'Biztosan eltávolítja ezt a menedzsert a projektből?',
areYouSureYouWantToRemoveThisMemberFromBoard: 'Biztosan eltávolítja ezt a tagot a tábláról?', areYouSureYouWantToRemoveThisMemberFromBoard: 'Biztosan eltávolítja ezt a tagot a tábláról?',
attachment: 'Melléklet', attachment: 'Melléklet',
attachments: 'Mellékletek', attachments: 'Mellékletek',
@@ -44,6 +54,7 @@ export default {
cardNotFound_title: 'Kártya nem található', cardNotFound_title: 'Kártya nem található',
cardOrActionAreDeleted: 'A kártya vagy művelet törölve lett.', cardOrActionAreDeleted: 'A kártya vagy művelet törölve lett.',
color: 'Szín', color: 'Szín',
copy_inline: 'másolás',
createBoard_title: 'Tábla létrehozása', createBoard_title: 'Tábla létrehozása',
createLabel_title: 'Címke létrehozása', createLabel_title: 'Címke létrehozása',
createNewOneOrSelectExistingOne: 'Hozzon létre egy újat, vagy válasszon ki egy meglévőt.', createNewOneOrSelectExistingOne: 'Hozzon létre egy újat, vagy válasszon ki egy meglévőt.',
@@ -52,6 +63,7 @@ export default {
currentPassword: 'Jelenlegi jelszó', currentPassword: 'Jelenlegi jelszó',
dangerZone_title: 'Veszélyzóna', dangerZone_title: 'Veszélyzóna',
date: 'Dátum', date: 'Dátum',
dueDate: 'Határidő',
dueDate_title: 'Esedékesség dátuma', dueDate_title: 'Esedékesség dátuma',
deleteAttachment_title: 'Melléklet törlése', deleteAttachment_title: 'Melléklet törlése',
deleteBoard_title: 'Tábla törlése', deleteBoard_title: 'Tábla törlése',
@@ -97,13 +109,17 @@ export default {
language: 'Nyelv', language: 'Nyelv',
leaveBoard_title: 'Tábla elhagyása', leaveBoard_title: 'Tábla elhagyása',
leaveProject_title: 'Projekt elhagyása', leaveProject_title: 'Projekt elhagyása',
linkIsCopied: 'Link másolva',
list: 'Lista', list: 'Lista',
listActions_title: 'Lista műveletek', listActions_title: 'Lista műveletek',
managers: 'Vezetők', managers: 'Menedzserek',
managerActions_title: 'Menedzseri műveletek',
members: 'Tagok', members: 'Tagok',
memberActions_title: 'Tag műveletek',
minutes: 'Percek', minutes: 'Percek',
moveCard_title: 'Kártya áthelyezése', moveCard_title: 'Kártya áthelyezése',
name: 'Név', name: 'Név',
newestFirst: 'Újabbak előre',
newEmail: 'Új e-mail', newEmail: 'Új e-mail',
newPassword: 'Új jelszó', newPassword: 'Új jelszó',
newUsername: 'Új felhasználónév', newUsername: 'Új felhasználónév',
@@ -113,6 +129,7 @@ export default {
noProjects: 'Nincsenek projektek', noProjects: 'Nincsenek projektek',
notifications: 'Értesítések', notifications: 'Értesítések',
noUnreadNotifications: 'Nincsenek olvasatlan értesítések.', noUnreadNotifications: 'Nincsenek olvasatlan értesítések.',
oldestFirst: 'Régebbi előre',
openBoard_title: 'Tábla megnyitása', openBoard_title: 'Tábla megnyitása',
optional_inline: 'opcionális', optional_inline: 'opcionális',
organization: 'Szervezet', organization: 'Szervezet',
@@ -122,17 +139,19 @@ export default {
'Tipp: nyomja meg a Ctrl-V (Cmd-V a Mac-en) billentyűkombinációt a vágólapról történő melléklet hozzáadásához.', 'Tipp: nyomja meg a Ctrl-V (Cmd-V a Mac-en) billentyűkombinációt a vágólapról történő melléklet hozzáadásához.',
project: 'Projekt', project: 'Projekt',
projectNotFound_title: 'Projekt nem található', projectNotFound_title: 'Projekt nem található',
removeManager_title: 'Vezető eltávolítása', removeManager_title: 'Menedzser eltávolítása',
removeMember_title: 'Tag eltávolítása', removeMember_title: 'Tag eltávolítása',
searchLabels: 'Címkék keresése...', searchLabels: 'Címkék keresése...',
searchMembers: 'Tagok keresése...', searchMembers: 'Tagok keresése...',
searchUsers: 'Felhasználók keresése...', searchUsers: 'Felhasználók keresése...',
searchCards: 'Kártyák keresése..',
seconds: 'Másodpercek', seconds: 'Másodpercek',
selectBoard: 'Válassza ki a táblát', selectBoard: 'Válassza ki a táblát',
selectList: 'Válassza ki a listát', selectList: 'Válassza ki a listát',
selectPermissions_title: 'Jogosultságok kiválasztása', selectPermissions_title: 'Jogosultságok kiválasztása',
selectProject: 'Válassza ki a projektet', selectProject: 'Válassza ki a projektet',
settings: 'Beállítások', settings: 'Beállítások',
sortList_title: 'Rendezés listában',
stopwatch: 'Stopper', stopwatch: 'Stopper',
subscribeToMyOwnCardsByDefault: 'Alapértelmezés szerint feliratkozás a saját kártyáimra', subscribeToMyOwnCardsByDefault: 'Alapértelmezés szerint feliratkozás a saját kártyáimra',
taskActions_title: 'Feladat műveletek', taskActions_title: 'Feladat műveletek',
@@ -170,6 +189,7 @@ export default {
addTask: 'Feladat hozzáadása', addTask: 'Feladat hozzáadása',
addToCard: 'Kártyához hozzáadása', addToCard: 'Kártyához hozzáadása',
addUser: 'Felhasználó hozzáadása', addUser: 'Felhasználó hozzáadása',
copyLink_title: 'Link másolása',
createBoard: 'Tábla létrehozása', createBoard: 'Tábla létrehozása',
createFile: 'Fájl létrehozása', createFile: 'Fájl létrehozása',
createLabel: 'Címke létrehozása', createLabel: 'Címke létrehozása',
@@ -191,6 +211,8 @@ export default {
deleteTask: 'Feladat törlése', deleteTask: 'Feladat törlése',
deleteTask_title: 'Feladat törlése', deleteTask_title: 'Feladat törlése',
deleteUser: 'Felhasználó törlése', deleteUser: 'Felhasználó törlése',
duplicate: 'Másolás',
duplicateCard_title: 'Kártya másolása',
edit: 'Szerkesztés', edit: 'Szerkesztés',
editDueDate_title: 'Esedékesség dátumának szerkesztése', editDueDate_title: 'Esedékesség dátumának szerkesztése',
editDescription_title: 'Leírás szerkesztése', editDescription_title: 'Leírás szerkesztése',
@@ -214,12 +236,13 @@ export default {
removeCover_title: 'Borító eltávolítása', removeCover_title: 'Borító eltávolítása',
removeFromBoard: 'Eltávolítás a tábláról', removeFromBoard: 'Eltávolítás a tábláról',
removeFromProject: 'Eltávolítás a projektről', removeFromProject: 'Eltávolítás a projektről',
removeManager: 'Vezető eltávolítása', removeManager: 'Menedzser eltávolítása',
removeMember: 'Tag eltávolítása', removeMember: 'Tag eltávolítása',
save: 'Mentés', save: 'Mentés',
showAllAttachments: 'Összes melléklet megjelenítése ({{hidden}} rejtve)', showAllAttachments: 'Összes melléklet megjelenítése ({{hidden}} rejtve)',
showDetails: 'Részletek megjelenítése', showDetails: 'Részletek megjelenítése',
showFewerAttachments: 'Kevesebb melléklet megjelenítése', showFewerAttachments: 'Kevesebb melléklet megjelenítése',
sortList_title: 'Rendezés listában',
start: 'Indítás', start: 'Indítás',
stop: 'Megállítás', stop: 'Megállítás',
subscribe: 'Feliratkozás', subscribe: 'Feliratkozás',
+1
View File
@@ -28,6 +28,7 @@ export default class extends BaseModel {
case ActionTypes.CORE_INITIALIZE: case ActionTypes.CORE_INITIALIZE:
case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE:
case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE:
case ActionTypes.CARD_UPDATE_HANDLE:
if (payload.attachments) { if (payload.attachments) {
payload.attachments.forEach((attachment) => { payload.attachments.forEach((attachment) => {
Attachment.upsert(attachment); Attachment.upsert(attachment);
+7 -4
View File
@@ -1,3 +1,4 @@
import orderBy from 'lodash/orderBy';
import { attr, fk, many } from 'redux-orm'; import { attr, fk, many } from 'redux-orm';
import BaseModel from './BaseModel'; import BaseModel from './BaseModel';
@@ -218,10 +219,6 @@ export default class extends BaseModel {
} }
} }
getOrderedMembershipsQuerySet() {
return this.memberships.orderBy('createdAt');
}
getOrderedLabelsQuerySet() { getOrderedLabelsQuerySet() {
return this.labels.orderBy('position'); return this.labels.orderBy('position');
} }
@@ -230,6 +227,12 @@ export default class extends BaseModel {
return this.lists.orderBy('position'); return this.lists.orderBy('position');
} }
getOrderedMembershipsModelArray() {
return orderBy(this.memberships.toModelArray(), (boardMembershipModel) =>
boardMembershipModel.user.name.toLocaleLowerCase(),
);
}
getMembershipModelForUser(userId) { getMembershipModelForUser(userId) {
return this.memberships return this.memberships
.filter({ .filter({
+34 -3
View File
@@ -180,7 +180,6 @@ export default class extends BaseModel {
break; break;
case ActionTypes.CARD_CREATE: case ActionTypes.CARD_CREATE:
case ActionTypes.CARD_UPDATE__SUCCESS: case ActionTypes.CARD_UPDATE__SUCCESS:
case ActionTypes.CARD_UPDATE_HANDLE:
Card.upsert(payload.card); Card.upsert(payload.card);
break; break;
@@ -202,8 +201,40 @@ export default class extends BaseModel {
break; break;
} }
case ActionTypes.CARD_UPDATE: case ActionTypes.CARD_UPDATE: {
Card.withId(payload.id).update(payload.data); const cardModel = Card.withId(payload.id);
// TODO: introduce separate action?
if (payload.data.boardId && payload.data.boardId !== cardModel.boardId) {
cardModel.deleteWithRelated();
} else {
cardModel.update(payload.data);
}
break;
}
case ActionTypes.CARD_UPDATE_HANDLE:
if (payload.isFetched) {
const cardModel = Card.withId(payload.card.id);
if (cardModel) {
cardModel.deleteWithRelated();
}
}
Card.upsert(payload.card);
if (payload.cardMemberships) {
payload.cardMemberships.forEach(({ cardId, userId }) => {
Card.withId(cardId).users.add(userId);
});
}
if (payload.cardLabels) {
payload.cardLabels.forEach(({ cardId, labelId }) => {
Card.withId(cardId).labels.add(labelId);
});
}
break; break;
case ActionTypes.CARD_DUPLICATE: { case ActionTypes.CARD_DUPLICATE: {
+1
View File
@@ -27,6 +27,7 @@ export default class extends BaseModel {
case ActionTypes.CORE_INITIALIZE: case ActionTypes.CORE_INITIALIZE:
case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE:
case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE:
case ActionTypes.CARD_UPDATE_HANDLE:
if (payload.tasks) { if (payload.tasks) {
payload.tasks.forEach((task) => { payload.tasks.forEach((task) => {
Task.upsert(task); Task.upsert(task);
+1 -1
View File
@@ -298,7 +298,7 @@ export default class extends BaseModel {
static getOrderedUndeletedQuerySet() { static getOrderedUndeletedQuerySet() {
return this.filter({ return this.filter({
deletedAt: null, deletedAt: null,
}).orderBy('createdAt'); }).orderBy((user) => user.name.toLocaleLowerCase());
} }
getOrderedProjectManagersQuerySet() { getOrderedProjectManagersQuerySet() {
+23 -2
View File
@@ -81,9 +81,30 @@ export function* updateCurrentCard(data) {
yield call(updateCard, cardId, data); yield call(updateCard, cardId, data);
} }
// TODO: handle card transfer
export function* handleCardUpdate(card) { export function* handleCardUpdate(card) {
yield put(actions.handleCardUpdate(card)); let fetch = false;
if (card.boardId) {
const prevCard = yield select(selectors.selectCardById, card.id);
fetch = !prevCard || prevCard.boardId !== card.boardId;
}
let cardMemberships;
let cardLabels;
let tasks;
let attachments;
if (fetch) {
try {
({
item: card, // eslint-disable-line no-param-reassign
included: { cardMemberships, cardLabels, tasks, attachments },
} = yield call(request, api.getCard, card.id));
} catch (error) {
fetch = false;
}
}
yield put(actions.handleCardUpdate(card, fetch, cardMemberships, cardLabels, tasks, attachments));
} }
export function* moveCard(id, listId, index = 0) { export function* moveCard(id, listId, index = 0) {
+1 -4
View File
@@ -55,10 +55,7 @@ export const selectMembershipsForCurrentBoard = createSelector(
return boardModel; return boardModel;
} }
return boardModel return boardModel.getOrderedMembershipsModelArray().map((boardMembershipModel) => ({
.getOrderedMembershipsQuerySet()
.toModelArray()
.map((boardMembershipModel) => ({
...boardMembershipModel.ref, ...boardMembershipModel.ref,
isPersisted: !isLocalId(boardMembershipModel.id), isPersisted: !isLocalId(boardMembershipModel.id),
user: { user: {
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "planka", "name": "planka",
"version": "1.19.1", "version": "1.19.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "planka", "name": "planka",
"version": "1.19.1", "version": "1.19.2",
"hasInstallScript": true, "hasInstallScript": true,
"license": "AGPL-3.0", "license": "AGPL-3.0",
"dependencies": { "dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "planka", "name": "planka",
"version": "1.19.1", "version": "1.19.2",
"private": true, "private": true,
"homepage": "https://plankanban.github.io/planka", "homepage": "https://plankanban.github.io/planka",
"repository": { "repository": {
+9
View File
@@ -204,6 +204,15 @@ module.exports = {
), ),
); );
sails.sockets.broadcast(
`board:${inputs.record.boardId}`,
'cardDelete', // TODO: introduce separate event
{
item: inputs.record,
},
inputs.request,
);
sails.sockets.broadcast(`board:${card.boardId}`, 'cardUpdate', { sails.sockets.broadcast(`board:${card.boardId}`, 'cardUpdate', {
item: card, item: card,
}); });
@@ -116,6 +116,7 @@ async function sendWebhook(webhook, event, data, user) {
user: sails.helpers.utils.jsonifyRecord(user), user: sails.helpers.utils.jsonifyRecord(user),
}); });
try {
const response = await fetch(webhook.url, { const response = await fetch(webhook.url, {
headers, headers,
body, body,
@@ -129,6 +130,9 @@ async function sendWebhook(webhook, event, data, user) {
`Webhook ${webhook.url} failed with status ${response.status} and message: ${message}`, `Webhook ${webhook.url} failed with status ${response.status} and message: ${message}`,
); );
} }
} catch (e) {
sails.log.error(`Webhook ${webhook.url} failed with error message: ${e.message}`);
}
} }
module.exports = { module.exports = {