Compare commits

..
6 Commits
13 changed files with 99 additions and 67 deletions
+3 -1
View File
@@ -10,12 +10,13 @@ import Editor from './Editor';
import styles from './AddStep.module.scss';
const AddStep = React.memo(({ onCreate, onBack }) => {
const AddStep = React.memo(({ defaultData, onCreate, onBack }) => {
const [t] = useTranslation();
const [data, handleFieldChange] = useForm(() => ({
name: '',
color: LabelColors[0],
...defaultData,
}));
const handleSubmit = useCallback(() => {
@@ -46,6 +47,7 @@ const AddStep = React.memo(({ onCreate, onBack }) => {
});
AddStep.propTypes = {
defaultData: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
onCreate: PropTypes.func.isRequired,
onBack: PropTypes.func.isRequired,
};
@@ -84,7 +84,15 @@ const LabelsStep = React.memo(
if (step) {
switch (step.type) {
case StepTypes.ADD:
return <AddStep onCreate={onCreate} onBack={handleBack} />;
return (
<AddStep
defaultData={{
name: search,
}}
onCreate={onCreate}
onBack={handleBack}
/>
);
case StepTypes.EDIT: {
const currentItem = items.find((item) => item.id === step.params.id);
+17 -16
View File
@@ -4,11 +4,11 @@ export default {
dateFns,
format: {
date: 'd/M/yyyy',
date: 'd.MM.yyyy',
time: 'p',
dateTime: '$t(format:date) $t(format:time)',
longDate: 'MMM d',
longDateTime: "d MMMM 'at' p",
longDate: 'd. MMM',
longDateTime: "d. MMMM 'um' p",
},
translation: {
@@ -23,7 +23,7 @@ export default {
administrator: 'Administrator',
all: 'Alle',
allChangesWillBeAutomaticallySavedAfterConnectionRestored:
'Alle Änderungen werden automatisch gespeichert,<br />sobald die Verbindung wiederhergestellt wurde',
'Alle Änderungen werden automatisch gespeichert, sobald die Verbindung wiederhergestellt wurde.',
areYouSureYouWantToDeleteThisAttachment:
'Sind Sie sicher, dass Sie diesen Anhang löschen möchten?',
areYouSureYouWantToDeleteThisBoard: 'Sind Sie sicher, dass Sie dieses Board löschen möchten?',
@@ -55,10 +55,11 @@ export default {
color: 'Farbe',
createBoard_title: 'Board erstellen',
createLabel_title: 'Label erstellen',
createNewOneOrSelectExistingOne: 'Ein Neues erstellen, oder <br />ein Bestehendes auswählen',
createNewOneOrSelectExistingOne:
'Erstellen Sie ein neues oder wählen Sie ein bestehendes aus.',
createProject_title: 'Projekt erstellen',
createTextFile_title: 'Textdatei erstellen',
currentPassword: 'Derzeitiges Password',
currentPassword: 'Derzeitiges Passwort',
dangerZone_title: 'Gefährlicher Bereich',
date: 'Datum',
dueDate_title: 'Fälligkeitsdatum',
@@ -73,18 +74,18 @@ export default {
deleteUser_title: 'Benutzer löschen',
description: 'Beschreibung',
detectAutomatically: 'Automatische Erkennung',
dropFileToUpload: 'Datei ablegen, um hochzuladen',
dropFileToUpload: 'Datei ablegen, um sie hochzuladen',
editAttachment_title: 'Anhang bearbieten',
editAvatar_title: 'Avatar bearbeiten',
editBoard_title: 'Board bearbeiten',
editDueDate_title: 'Fälligkeitsdatum bearbeiten',
editEmail_title: 'E-Mail bearbeiten',
editEmail_title: 'E-Mail-Adresse bearbeiten',
editLabel_title: 'Label bearbeiten',
editPassword_title: 'Passwort ändern',
editTimer_title: 'Timer bearbeiten',
editUsername_title: 'Benutzername ändern',
email: 'E-Mail',
emailAlreadyInUse: 'E-Mail bereits in Verwendung',
email: 'E-Mail-Adresse',
emailAlreadyInUse: 'E-Mail-Adresse bereits in Verwendung',
enterCardTitle: 'Kartentitel eingeben...',
enterDescription: 'Beschreibung eingeben...',
enterFilename: 'Dateiname eingeben',
@@ -108,7 +109,7 @@ export default {
minutes: 'Minuten',
moveCard_title: 'Karte verschieben',
name: 'Name',
newEmail: 'Neue E-Mail',
newEmail: 'Neue E-Mail-Adresse',
newPassword: 'Neues Passwort',
newUsername: 'Neuer Benutzername',
noConnectionToServer: 'Keine Verbindung zum Server',
@@ -140,10 +141,10 @@ export default {
time: 'Zeit',
timer: 'Timer',
title: 'Titel',
userActions_title: 'Benutzerraktionen',
userActions_title: 'Benutzeraktionen',
userAddedThisCardToList: '<0>{{user}}</0><1> hat diese Karte hinzugefügt zu {{list}}</1>',
userLeftNewCommentToCard:
'{{user}} hat einen neuen Kommentar verfasst «{{comment}}» to <2>{{card}}</2>',
'{{user}} hat einen neuen Kommentar verfasst: «{{comment}}» in <2>{{card}}</2>',
userMovedCardFromListToList:
'{{user}} bewegte <2>{{card}}</2> von {{fromList}} nach {{toList}}',
userMovedThisCardFromListToList:
@@ -190,7 +191,7 @@ export default {
edit: 'Bearbeiten',
editDueDate_title: 'Fälligkeitsdatum bearbeiten',
editDescription_title: 'Beschreibung ändern',
editEmail_title: 'E-Mail bearbeiten',
editEmail_title: 'E-Mail-Adresse bearbeiten',
editPassword_title: 'Passwort ändern',
editTimer_title: 'Timer bearbeiten',
editTitle_title: 'Titel bearbeiten',
@@ -199,7 +200,7 @@ export default {
leaveBoard: 'Board verlassen',
leaveProject: 'Projekt verlassen',
logOut_title: 'Ausloggen',
makeCover_title: 'als Vorschau festlegen',
makeCover_title: 'Als Vorschau festlegen',
move: 'Verschieben',
moveCard_title: 'Karte bewegen',
remove: 'Löschen',
@@ -216,7 +217,7 @@ export default {
start: 'Start',
stop: 'Stopp',
subscribe: 'Abonnieren',
unsubscribe: 'Deabonnieren',
unsubscribe: 'De-abonnieren',
uploadNewAvatar: 'Neuen Avatar hochladen',
uploadNewImage: 'Neues Bild hochladen',
},
+3 -3
View File
@@ -1,14 +1,14 @@
export default {
translation: {
common: {
emailOrUsername: 'E-mail oder Benutzername',
invalidEmailOrUsername: 'Ungültige E-mail oder Benutzername',
emailOrUsername: 'E-Mail-Adresse oder Benutzername',
invalidEmailOrUsername: 'Ungültige E-Mail-Adresse oder Benutzername',
invalidPassword: 'Ungültiges Passwort',
logInToPlanka: 'Einloggen',
noInternetConnection: 'Keine Internetverbindung',
pageNotFound_title: 'Seite nicht gefunden',
password: 'Passwort',
projectManagement: 'Projekt Management',
projectManagement: 'Projekt-Management',
serverConnectionFailed: 'Serververbindung fehlgeschlagen',
unknownError: 'Unbekannter Fehler, bitte später erneut versuchen',
},
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "planka",
"version": "1.8.3",
"version": "1.8.4",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "planka",
"version": "1.8.3",
"version": "1.8.4",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "planka",
"version": "1.8.3",
"version": "1.8.4",
"private": true,
"homepage": "https://plankanban.github.io/planka",
"repository": {
+11 -11
View File
@@ -7,7 +7,7 @@ module.exports = {
let boardMemberships = await sails.helpers.users.getBoardMemberships(currentUser.id);
let membershipBoardIds = sails.helpers.utils.mapRecords(boardMemberships, 'boardId');
const membershipBoardIds = sails.helpers.utils.mapRecords(boardMemberships, 'boardId');
let membershipBoards = await sails.helpers.boards.getMany({
id: membershipBoardIds,
@@ -21,16 +21,6 @@ module.exports = {
membershipProjectIds = sails.helpers.utils.mapRecords(membershipProjects);
membershipBoards = membershipBoards.filter((membershipBoard) =>
membershipProjectIds.includes(membershipBoard.projectId),
);
membershipBoardIds = sails.helpers.utils.mapRecords(membershipBoards);
boardMemberships = boardMemberships.filter((boardMembership) =>
membershipBoardIds.includes(boardMembership.boardId),
);
const projectIds = [...managerProjectIds, ...membershipProjectIds];
const projects = [...managerProjects, ...membershipProjects];
@@ -40,7 +30,17 @@ module.exports = {
const users = await sails.helpers.users.getMany(userIds);
const managerBoards = await sails.helpers.projects.getBoards(managerProjectIds);
membershipBoards = membershipBoards.filter((membershipBoard) =>
membershipProjectIds.includes(membershipBoard.projectId),
);
const boards = [...managerBoards, ...membershipBoards];
const boardIds = sails.helpers.utils.mapRecords(boards);
boardMemberships = boardMemberships.filter((boardMembership) =>
boardIds.includes(boardMembership.boardId),
);
return {
items: projects,
@@ -1,3 +1,5 @@
const { v4: uuid } = require('uuid');
module.exports = {
inputs: {
record: {
@@ -29,18 +31,9 @@ module.exports = {
const boardMembership = await BoardMembership.destroyOne(inputs.record.id);
if (boardMembership) {
const notify = (room) => {
sails.sockets.broadcast(
`user:${boardMembership.userId}`,
'boardMembershipDelete',
{
item: boardMembership,
},
inputs.request,
);
const notifyBoard = () => {
sails.sockets.broadcast(
`board:${boardMembership.boardId}`,
room,
'boardMembershipDelete',
{
item: boardMembership,
@@ -54,15 +47,31 @@ module.exports = {
inputs.project.id,
);
if (!isProjectManager) {
sails.sockets.removeRoomMembersFromRooms(
`@user:${boardMembership.userId}`,
`board:${boardMembership.boardId}`,
() => {
notify(`board:${boardMembership.boardId}`);
},
);
}
notify(`user:${boardMembership.userId}`);
if (isProjectManager) {
notifyBoard();
} else {
// TODO: also remove if unsubscribed to user
const tempRoom = uuid();
sails.sockets.addRoomMembersToRooms(`board:${boardMembership.boardId}`, tempRoom, () => {
sails.sockets.removeRoomMembersFromRooms(
`user:${boardMembership.userId}`,
`board:${boardMembership.boardId}`,
notifyBoard,
tempRoom,
() => {
notify(tempRoom);
sails.sockets.removeRoomMembersFromRooms(tempRoom, tempRoom);
},
);
});
}
}
+9 -2
View File
@@ -17,16 +17,23 @@ module.exports = {
const board = await Board.archiveOne(inputs.record.id);
if (board) {
sails.sockets.leaveAll(`board:${board.id}`);
sails.sockets.removeRoomMembersFromRooms(`board:${board.id}`, `board:${board.id}`);
const managerUserIds = await sails.helpers.projects.getManagerUserIds(board.projectId);
const memberUserIds = await sails.helpers.boards.getMemberUserIds(board.id);
const userIds = _.union(managerUserIds, memberUserIds);
userIds.forEach((userId) => {
sails.sockets.broadcast(
`project:${board.projectId}`,
`user:${userId}`,
'boardDelete',
{
item: board,
},
inputs.request,
);
});
}
return board;
+4 -3
View File
@@ -25,9 +25,10 @@ module.exports = {
},
async fn(inputs) {
const userIds = await sails.helpers.projects.getManagerAndBoardMemberUserIds(
inputs.record.projectId,
);
const managerUserIds = await sails.helpers.projects.getManagerUserIds(inputs.record.projectId);
const memberUserIds = await sails.helpers.boards.getMemberUserIds(inputs.record.id);
const userIds = _.union(managerUserIds, memberUserIds);
if (!_.isUndefined(inputs.values.position)) {
const boards = await sails.helpers.projects.getBoards(
+1 -1
View File
@@ -26,7 +26,7 @@ module.exports = {
const userIds = _.union(managerUserIds, memberUserIds);
userIds.forEach((userId) => {
sails.sockets.removeRoomMembersFromRooms(`user:${userId}`, boardRooms);
sails.sockets.removeRoomMembersFromRooms(`@user:${userId}`, boardRooms);
sails.sockets.broadcast(
`user:${userId}`,
+2 -2
View File
@@ -123,13 +123,13 @@ module.exports = {
if (user.id === inputs.user.id && inputs.request && inputs.request.isSocket) {
const tempRoom = uuid();
sails.sockets.addRoomMembersToRooms(`user:${user.id}`, tempRoom, () => {
sails.sockets.addRoomMembersToRooms(`@user:${user.id}`, tempRoom, () => {
sails.sockets.leave(inputs.request, tempRoom, () => {
sails.sockets.leaveAll(tempRoom);
});
});
} else {
sails.sockets.leaveAll(`user:${user.id}`);
sails.sockets.leaveAll(`@user:${user.id}`);
}
}
+4
View File
@@ -59,6 +59,10 @@ module.exports = function defineCurrentUserHook(sails) {
accessToken,
currentUser,
});
if (req.isSocket) {
sails.sockets.join(req, `@user:${currentUser.id}`);
}
}
}