From bb17feaa17ae2c655f79138ae3cffe16cd9f6ef3 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Wed, 7 Aug 2024 21:32:40 +0200 Subject: [PATCH 1/2] Checklist, hide checked checklist items (configureable at each checklist) --- client/components/cards/checklists.jade | 23 ++++++++++++++++------- client/components/cards/checklists.js | 14 +++++++++----- imports/i18n/data/en.i18n.json | 4 +++- models/cards.js | 8 ++++---- models/checklists.js | 18 ++++++++++++++++-- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade index 5958f4cf5..9e2e91dd7 100644 --- a/client/components/cards/checklists.jade +++ b/client/components/cards/checklists.jade @@ -10,17 +10,17 @@ template(name="checklists") a.add-checklist-top.js-open-inlined-form(title="{{_ 'add-checklist'}}") i.fa.fa-plus if currentUser.isBoardMember - .material-toggle-switch(title="{{_ 'hide-checked-items'}}") + .material-toggle-switch(title="{{_ 'hide-finished-checklist'}}") //span.toggle-switch-title - if card.hideCheckedChecklistItems - input.toggle-switch(type="checkbox" id="toggleHideCheckedChecklistItems" checked="checked") + if card.hideFinishedChecklistIfItemsAreHidden + input.toggle-switch(type="checkbox" id="toggleHideFinishedChecklist" checked="checked") else - input.toggle-switch(type="checkbox" id="toggleHideCheckedChecklistItems") - label.toggle-label(for="toggleHideCheckedChecklistItems") + input.toggle-switch(type="checkbox" id="toggleHideFinishedChecklist") + label.toggle-label(for="toggleHideFinishedChecklist") .card-checklist-items each checklist in checklists - if checklist.showChecklist card.hideCheckedChecklistItems + if checklist.showChecklist card.hideFinishedChecklistIfItemsAreHidden +checklistDetail(checklist = checklist card = card) if canModifyCard @@ -120,7 +120,7 @@ template(name="checklistItems") i.fa.fa-plus template(name='checklistItemDetail') - .js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if card.hideCheckedChecklistItems}} invisible{{/if}}{{/if}}" + .js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if checklist.hideCheckedChecklistItems}} invisible{{/if}}{{/if}}" role="checkbox" aria-checked="{{#if item.isFinished }}true{{else}}false{{/if}}" tabindex="0") if canModifyCard .check-box-container @@ -148,6 +148,15 @@ template(name="checklistActionsPopup") a.js-copy-checklist.copy-checklist i.fa.fa-copy | {{_ "copyChecklist"}} ... + a.js-hide-checked-checklist-items + i.fa.fa-eye-slash + | {{_ "hideCheckedChecklistItems"}} ... + .material-toggle-switch(title="{{_ 'hide-checked-items'}}") + if checklist.hideCheckedChecklistItems + input.toggle-switch(type="checkbox" id="toggleHideCheckedChecklistItems_{{checklist._id}}" checked="checked") + else + input.toggle-switch(type="checkbox" id="toggleHideCheckedChecklistItems_{{checklist._id}}") + label.toggle-label(for="toggleHideCheckedChecklistItems_{{checklist._id}}") template(name="copyChecklistPopup") +copyAndMoveChecklist diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index 403874abb..f539c4005 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -220,6 +220,10 @@ BlazeComponent.extendComponent({ 'focus .js-add-checklist-item': this.focusChecklistItem, // add and delete checklist / checklist-item 'click .js-open-inlined-form': this.closeAllInlinedForms, + 'click #toggleHideFinishedChecklist'(event) { + event.preventDefault(); + this.data().card.toggleHideFinishedChecklist(); + }, keydown: this.pressKey, }, ]; @@ -274,11 +278,6 @@ Template.checklists.helpers({ const ret = card.checklists(); return ret; }, - hideCheckedChecklistItems() { - const card = ReactiveCache.getCard(this.cardId); - const ret = card.hideCheckedChecklistItems ?? false; - return ret; - }, }); BlazeComponent.extendComponent({ @@ -313,6 +312,11 @@ BlazeComponent.extendComponent({ }), 'click .js-move-checklist': Popup.open('moveChecklist'), 'click .js-copy-checklist': Popup.open('copyChecklist'), + 'click .js-hide-checked-checklist-items'(event) { + event.preventDefault(); + this.data().checklist.toggleHideCheckedChecklistItems(); + Popup.back(); + }, } ] } diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json index 10fc42d2a..f47f16b57 100644 --- a/imports/i18n/data/en.i18n.json +++ b/imports/i18n/data/en.i18n.json @@ -958,6 +958,7 @@ "delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has", "delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list", "hide-checked-items": "Hide checked items", + "hide-finished-checklist": "Hide finished checklist", "task": "Task", "create-task": "Create Task", "ok": "OK", @@ -1251,5 +1252,6 @@ "convert-to-markdown": "Convert to markdown", "import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments", "collapse": "Collapse", - "uncollapse": "Uncollapse" + "uncollapse": "Uncollapse", + "hideCheckedChecklistItems": "Hide checked checklist items" } diff --git a/models/cards.js b/models/cards.js index 3d6a90d73..9da59a4e4 100644 --- a/models/cards.js +++ b/models/cards.js @@ -477,9 +477,9 @@ Cards.attachSchema( type: Boolean, defaultValue: false, }, - hideCheckedChecklistItems: { + hideFinishedChecklistIfItemsAreHidden: { /** - * hide the checked checklist-items? + * hide completed checklist? */ type: Boolean, optional: true, @@ -2186,10 +2186,10 @@ Cards.mutations({ }; }, - toggleHideCheckedChecklistItems() { + toggleHideFinishedChecklist() { return { $set: { - hideCheckedChecklistItems: !this.hideCheckedChecklistItems, + hideFinishedChecklistIfItemsAreHidden: !this.hideFinishedChecklistIfItemsAreHidden, } }; }, diff --git a/models/checklists.js b/models/checklists.js index 52852bd68..2326eceeb 100644 --- a/models/checklists.js +++ b/models/checklists.js @@ -63,6 +63,13 @@ Checklists.attachSchema( type: Number, decimal: true, }, + hideCheckedChecklistItems: { + /** + * hide the checked checklist-items? + */ + type: Boolean, + optional: true, + }, }), ); @@ -118,9 +125,9 @@ Checklists.helpers({ isFinished() { return 0 !== this.itemCount() && this.itemCount() === this.finishedCount(); }, - showChecklist(hideCheckedChecklistItems) { + showChecklist(hideFinishedChecklistIfItemsAreHidden) { let ret = true; - if (this.isFinished() && hideCheckedChecklistItems === true) { + if (this.isFinished() && hideFinishedChecklistIfItemsAreHidden === true && (this.hideCheckedChecklistItems === true || this.hideAllChecklistItems)) { ret = false; } return ret; @@ -198,6 +205,13 @@ Checklists.mutations({ }, }; }, + toggleHideCheckedChecklistItems() { + return { + $set: { + hideCheckedChecklistItems: !this.hideCheckedChecklistItems, + } + }; + }, }); if (Meteor.isServer) { From 0783b733b0a13439a0ced8958388b637f984bce0 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Mon, 12 Aug 2024 19:21:08 +0200 Subject: [PATCH 2/2] Checklist, hide all checklist items possible, regardless if the checklist item is finished or not --- client/components/cards/checklists.jade | 11 ++++++++++- client/components/cards/checklists.js | 5 +++++ imports/i18n/data/en.i18n.json | 3 ++- models/checklists.js | 20 +++++++++++++++++++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade index 9e2e91dd7..e943e338f 100644 --- a/client/components/cards/checklists.jade +++ b/client/components/cards/checklists.jade @@ -120,7 +120,7 @@ template(name="checklistItems") i.fa.fa-plus template(name='checklistItemDetail') - .js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if checklist.hideCheckedChecklistItems}} invisible{{/if}}{{/if}}" + .js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if checklist.hideCheckedChecklistItems}} invisible{{/if}}{{/if}}{{#if checklist.hideAllChecklistItems}} is-checked invisible{{/if}}" role="checkbox" aria-checked="{{#if item.isFinished }}true{{else}}false{{/if}}" tabindex="0") if canModifyCard .check-box-container @@ -157,6 +157,15 @@ template(name="checklistActionsPopup") else input.toggle-switch(type="checkbox" id="toggleHideCheckedChecklistItems_{{checklist._id}}") label.toggle-label(for="toggleHideCheckedChecklistItems_{{checklist._id}}") + a.js-hide-all-checklist-items + i.fa.fa-ban + | {{_ "hideAllChecklistItems"}} ... + .material-toggle-switch(title="{{_ 'hideAllChecklistItems'}}") + if checklist.hideAllChecklistItems + input.toggle-switch(type="checkbox" id="toggleHideAllChecklistItems_{{checklist._id}}" checked="checked") + else + input.toggle-switch(type="checkbox" id="toggleHideAllChecklistItems_{{checklist._id}}") + label.toggle-label(for="toggleHideAllChecklistItems_{{checklist._id}}") template(name="copyChecklistPopup") +copyAndMoveChecklist diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index f539c4005..6762eab02 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -317,6 +317,11 @@ BlazeComponent.extendComponent({ this.data().checklist.toggleHideCheckedChecklistItems(); Popup.back(); }, + 'click .js-hide-all-checklist-items'(event) { + event.preventDefault(); + this.data().checklist.toggleHideAllChecklistItems(); + Popup.back(); + }, } ] } diff --git a/imports/i18n/data/en.i18n.json b/imports/i18n/data/en.i18n.json index f47f16b57..f9b0afaae 100644 --- a/imports/i18n/data/en.i18n.json +++ b/imports/i18n/data/en.i18n.json @@ -1253,5 +1253,6 @@ "import-board-zip": "Add .zip file that has board JSON files, and board name subdirectories with attachments", "collapse": "Collapse", "uncollapse": "Uncollapse", - "hideCheckedChecklistItems": "Hide checked checklist items" + "hideCheckedChecklistItems": "Hide checked checklist items", + "hideAllChecklistItems": "Hide all checklist items" } diff --git a/models/checklists.js b/models/checklists.js index 2326eceeb..d30dcc1be 100644 --- a/models/checklists.js +++ b/models/checklists.js @@ -70,6 +70,13 @@ Checklists.attachSchema( type: Boolean, optional: true, }, + hideAllChecklistItems: { + /** + * hide all checklist items ? + */ + type: Boolean, + optional: true, + }, }), ); @@ -123,7 +130,11 @@ Checklists.helpers({ return ret; }, isFinished() { - return 0 !== this.itemCount() && this.itemCount() === this.finishedCount(); + let ret = this.hideAllChecklistItems; + if (!ret) { + ret = 0 !== this.itemCount() && this.itemCount() === this.finishedCount(); + } + return ret; }, showChecklist(hideFinishedChecklistIfItemsAreHidden) { let ret = true; @@ -212,6 +223,13 @@ Checklists.mutations({ } }; }, + toggleHideAllChecklistItems() { + return { + $set: { + hideAllChecklistItems: !this.hideAllChecklistItems, + } + }; + }, }); if (Meteor.isServer) {