diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index ee8ac4193..a84c843c2 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -1714,10 +1714,29 @@ BlazeComponent.extendComponent({ EscapeActions.register( 'detailsPane', () => { + // if card description diverges from database due to editing + // ask user whether changes should be applied + if(currentUser.profile.rescueCardDescription== true) + { + currentDescription = document.getElementsByClassName("editor js-new-description-input").item(0) + if (currentDescription?.value && !(currentDescription.value === Utils.getCurrentCard().getDescription())) + { + if (confirm(TAPi18n.__('rescue-card-description-dialogue'))) { + Utils.getCurrentCard().setDescription(document.getElementsByClassName("editor js-new-description-input").item(0).value); + // Save it! + console.log(document.getElementsByClassName("editor js-new-description-input").item(0).value); + console.log("current description",Utils.getCurrentCard().getDescription()); + } else { + // Do nothing! + console.log('Description changes were not saved to the database.'); + } + } + } if (Session.get('cardDetailsIsDragging')) { // Reset dragging status as the mouse landed outside the cardDetails template area and this will prevent a mousedown event from firing Session.set('cardDetailsIsDragging', false); Session.set('cardDetailsIsMouseDown', false); + } else { // Prevent close card when the user is selecting text and moves the mouse cursor outside the card detail area Utils.goBoardId(Session.get('currentBoard')); diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index 4d7bd89a5..7b2414bf1 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -180,6 +180,13 @@ template(name="changeSettingsPopup") option(selected="true", value="#{day.value}") #{day.name} else option(value="#{day.value}") #{day.name} + label.bold.clear + | {{_ 'card-settings'}} + ul#cards.card-description-rescued + a.flex.js-rescue-card-description(title="{{_ 'rescue-card-description'}}") + b   + #rescue-card-description.materialCheckBox.left(class="{{#if rescueCardDescription}}is-checked{{/if}}", value=rescueCardDescription) + span {{_ 'rescue-card-description'}} input.js-apply-user-settings.left(type="submit" value="{{_ 'apply'}}") template(name="userDeletePopup") diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index b3745ac61..ad5bb89a0 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -297,6 +297,16 @@ Template.changeSettingsPopup.helpers({ return false; } }, + rescueCardDescription() { + currentUser = Meteor.user(); + if (currentUser) { + return (currentUser.profile || {}).rescueCardDescription; + } else if (window.localStorage.getItem('rescueCardDescription')) { + return true; + } else { + return false; + } + }, showCardsCountAt() { currentUser = Meteor.user(); if (currentUser) { @@ -356,6 +366,9 @@ Template.changeSettingsPopup.events({ window.localStorage.setItem('hasHiddenSystemMessages', 'true'); } }, + 'click .js-rescue-card-description'() { + Meteor.call('toggleRescueCardDescription') + }, 'click .js-apply-user-settings'(event, templateInstance) { event.preventDefault(); let minLimit = parseInt( diff --git a/imports/i18n/data/de.i18n.json b/imports/i18n/data/de.i18n.json index 58d435e19..e09019e99 100644 --- a/imports/i18n/data/de.i18n.json +++ b/imports/i18n/data/de.i18n.json @@ -541,6 +541,9 @@ "rename": "Umbenennen", "rename-board": "Board umbenennen", "restore": "Wiederherstellen", + "rescue-card-description": "Vor dem Schließen Dialog für ungespeicherte Änderungen von Kartenbeschreibungen anzeigen", + "rescue-card-description-dialogue": "Aktuelle Kartenbeschreibung mit ihren Änderungen überschreiben?", + "card-settings": "Karteneinstellungen", "save": "Speichern", "search": "Suchen", "rules": "Regeln", @@ -1178,4 +1181,4 @@ "action": "Aktion", "board-title": "Board-Titel", "attachmentRenamePopup-title": "Umbenennen" -} \ No newline at end of file +} diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json index bedffe666..b48ae3dcb 100644 --- a/imports/i18n/data/en.i18n.json +++ b/imports/i18n/data/en.i18n.json @@ -541,6 +541,9 @@ "rename": "Rename", "rename-board": "Rename Board", "restore": "Restore", + "rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions", + "rescue-card-description-dialogue": "Overwrite current card description with your changes?", + "card-settings":"Card Settings", "save": "Save", "search": "Search", "rules": "Rules", diff --git a/models/users.js b/models/users.js index ac7faee48..b15c0ca61 100644 --- a/models/users.js +++ b/models/users.js @@ -337,6 +337,13 @@ Users.attachSchema( type: Date, optional: true, }, + 'profile.rescueCardDescription': { + /** + * show dialog for saving card description on unintentional card closing + */ + type: Boolean, + optional: true, + }, 'profile.showCardsCountAt': { /** * showCardCountAt field of the user @@ -794,6 +801,11 @@ Users.helpers({ return profile.hiddenMinicardLabelText || false; }, + hasRescuedCardDescription(){ + const profile = this.profile || {}; + return profile.rescueCardDescription || false; + }, + getEmailBuffer() { const { emailBuffer = [] } = this.profile || {}; return emailBuffer; @@ -1004,6 +1016,13 @@ Users.mutations({ }, }; }, + toggleRescueCardDescription(value = false) { + return { + $set: { + 'profile.rescueCardDescription': !value, + }, + }; + }, addNotification(activityId) { return { @@ -1103,6 +1122,10 @@ Meteor.methods({ const user = Meteor.user(); user.toggleLabelText(user.hasHiddenMinicardLabelText()); }, + toggleRescueCardDescription() { + const user = Meteor.user(); + user.toggleRescueCardDescription(user.hasRescuedCardDescription()); + }, changeLimitToShowCardsCount(limit) { check(limit, Number); Meteor.user().setShowCardsCountAt(limit);