Prevent normal user deleting or modifying too much.

Allow normal user to export board.

Thanks to Samunosuke, pgh2357 and xet7 !

Related #3377
This commit is contained in:
Lauri Ojansivu 2020-12-15 11:52:57 +02:00
parent f6c0700633
commit 4a205fcfcb
13 changed files with 129 additions and 96 deletions

View file

@ -7,9 +7,10 @@ template(name="archivedBoards")
each archivedBoards each archivedBoards
li.archived-lists-item li.archived-lists-item
div.board-header-btns div.board-header-btns
button.board-header-btn.js-delete-board if currentUser.isBoardAdmin
i.fa.fa-trash-o button.board-header-btn.js-delete-board
| {{_ 'delete-board'}} i.fa.fa-trash-o
| {{_ 'delete-board'}}
button.board-header-btn.js-restore-board button.board-header-btn.js-restore-board
i.fa.fa-undo i.fa.fa-undo
| {{_ 'restore-board'}} | {{_ 'restore-board'}}

View file

@ -211,7 +211,12 @@ BlazeComponent.extendComponent({
} }
// Disable drag-dropping if the current user is not a board member // Disable drag-dropping if the current user is not a board member
$swimlanesDom.sortable('option', 'disabled', !userIsMember()); //$swimlanesDom.sortable('option', 'disabled', !userIsMember());
$swimlanesDom.sortable(
'option',
'disabled',
!Meteor.user().isBoardAdmin(),
);
}); });
function userIsMember() { function userIsMember() {

View file

@ -46,9 +46,10 @@ template(name="attachmentsGalery")
| {{_ 'remove-cover'}} | {{_ 'remove-cover'}}
else else
| {{_ 'add-cover'}} | {{_ 'add-cover'}}
a.js-confirm-delete if currentUser.isBoardAdmin
i.fa.fa-close a.js-confirm-delete
| {{_ 'delete'}} i.fa.fa-close
| {{_ 'delete'}}
if currentUser.isBoardMember if currentUser.isBoardMember
unless currentUser.isCommentOnly unless currentUser.isCommentOnly

View file

@ -354,10 +354,11 @@ template(name="cardDetailsActionsPopup")
a.js-start-voting a.js-start-voting
i.fa.fa-thumbs-up i.fa.fa-thumbs-up
| {{_ 'card-edit-voting'}} | {{_ 'card-edit-voting'}}
li if currentBoard.isBoardAdmin
a.js-custom-fields li
i.fa.fa-list-alt a.js-custom-fields
| {{_ 'card-edit-custom-fields'}} i.fa.fa-list-alt
| {{_ 'card-edit-custom-fields'}}
//li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}} //li: a.js-received-date {{_ 'editCardReceivedDatePopup-title'}}
//li: a.js-start-date {{_ 'editCardStartDatePopup-title'}} //li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
//li: a.js-due-date {{_ 'editCardDueDatePopup-title'}} //li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
@ -382,10 +383,11 @@ template(name="cardDetailsActionsPopup")
| {{_ 'moveCardToBottom-title'}} | {{_ 'moveCardToBottom-title'}}
hr hr
ul.pop-over-list ul.pop-over-list
li if currentBoard.isBoardAdmin
a.js-move-card li
i.fa.fa-arrow-right a.js-move-card
| {{_ 'moveCardPopup-title'}} i.fa.fa-arrow-right
| {{_ 'moveCardPopup-title'}}
unless currentUser.isWorker unless currentUser.isWorker
li li
a.js-copy-card a.js-copy-card
@ -562,7 +564,8 @@ template(name="cardMorePopup")
br br
| {{_ 'added'}} | {{_ 'added'}}
span.date(title=card.createdAt) {{ moment createdAt 'LLL' }} span.date(title=card.createdAt) {{ moment createdAt 'LLL' }}
a.js-delete(title="{{_ 'card-delete-notice'}}") {{_ 'delete'}} if currentUser.isBoardAdmin
a.js-delete(title="{{_ 'card-delete-notice'}}") {{_ 'delete'}}
template(name="setCardColorPopup") template(name="setCardColorPopup")
form.edit-label form.edit-label
@ -609,7 +612,8 @@ template(name="cardStartVotingPopup")
button.primary.js-submit {{_ 'save'}} button.primary.js-submit {{_ 'save'}}
if getVoteQuestion if getVoteQuestion
button.js-remove-vote.negate.wide.right {{_ 'delete'}} if currentUser.isBoardAdmin
button.js-remove-vote.negate.wide.right {{_ 'delete'}}
template(name="positiveVoteMembersPopup") template(name="positiveVoteMembersPopup")
ul.pop-over-list.js-card-member-list ul.pop-over-list.js-card-member-list

View file

@ -37,7 +37,8 @@ template(name="checklistDetail")
.checklist-title .checklist-title
span span
if canModifyCard if canModifyCard
a.js-delete-checklist.toggle-delete-checklist-dialog {{_ "delete"}}... if currentUser.isBoardAdmin
a.js-delete-checklist.toggle-delete-checklist-dialog {{_ "delete"}}...
if canModifyCard if canModifyCard
h2.title.js-open-inlined-form.is-editable h2.title.js-open-inlined-form.is-editable
@ -59,9 +60,10 @@ template(name="checklistDeleteDialog")
| {{_ 'confirm-checklist-delete-dialog'}} | {{_ 'confirm-checklist-delete-dialog'}}
span {{checklist.title}} span {{checklist.title}}
| ? | ?
.js-checklist-delete-buttons if currentUser.isBoardAdmin
button.confirm-checklist-delete(type="button") {{_ 'delete'}} .js-checklist-delete-buttons
button.toggle-delete-checklist-dialog(type="button") {{_ 'cancel'}} button.confirm-checklist-delete(type="button") {{_ 'delete'}}
button.toggle-delete-checklist-dialog(type="button") {{_ 'cancel'}}
template(name="addChecklistItemForm") template(name="addChecklistItemForm")
textarea.js-add-checklist-item(rows='1' autofocus) textarea.js-add-checklist-item(rows='1' autofocus)
@ -80,7 +82,8 @@ template(name="editChecklistItemForm")
a.fa.fa-times-thin.js-close-inlined-form a.fa.fa-times-thin.js-close-inlined-form
span(title=createdAt) {{ moment createdAt }} span(title=createdAt) {{ moment createdAt }}
if canModifyCard if canModifyCard
a.js-delete-checklist-item {{_ "delete"}}... if currentUser.isBoardAdmin
a.js-delete-checklist-item {{_ "delete"}}...
template(name="checklistItems") template(name="checklistItems")
.checklist-items.js-checklist-items .checklist-items.js-checklist-items

View file

@ -2,10 +2,10 @@ template(name="subtasks")
h3.card-details-item-title h3.card-details-item-title
i.fa.fa-sitemap i.fa.fa-sitemap
| {{_ 'subtasks'}} | {{_ 'subtasks'}}
if toggleDeleteDialog.get if currentUser.isBoardAdmin
.board-overlay#card-details-overlay if toggleDeleteDialog.get
+subtaskDeleteDialog(subtask = subtaskToDelete) .board-overlay#card-details-overlay
+subtaskDeleteDialog(subtask = subtaskToDelete)
.card-subtasks-items .card-subtasks-items
each subtask in currentCard.subtasks each subtask in currentCard.subtasks
@ -28,7 +28,8 @@ template(name="subtaskDetail")
span span
a.js-view-subtask(title="{{ subtask.title }}") {{_ "view-it"}} a.js-view-subtask(title="{{ subtask.title }}") {{_ "view-it"}}
if canModifyCard if canModifyCard
a.js-delete-subtask.toggle-delete-subtask-dialog {{_ "delete"}}... if currentUser.isBoardAdmin
a.js-delete-subtask.toggle-delete-subtask-dialog {{_ "delete"}}...
if canModifyCard if canModifyCard
h2.title.js-open-inlined-form.is-editable h2.title.js-open-inlined-form.is-editable
@ -68,7 +69,8 @@ template(name="editSubtaskItemForm")
a.fa.fa-times-thin.js-close-inlined-form a.fa.fa-times-thin.js-close-inlined-form
span(title=createdAt) {{ moment createdAt }} span(title=createdAt) {{ moment createdAt }}
if canModifyCard if canModifyCard
a.js-delete-subtask-item {{_ "delete"}}... if currentUser.isBoardAdmin
a.js-delete-subtask-item {{_ "delete"}}...
template(name="subtasksItems") template(name="subtasksItems")
.subtasks-items.js-subtasks-items .subtasks-items.js-subtasks-items

View file

@ -43,8 +43,9 @@ template(name="listHeader")
if canSeeAddCard if canSeeAddCard
a.js-add-card.fa.fa-plus.list-header-plus-icon a.js-add-card.fa.fa-plus.list-header-plus-icon
a.fa.fa-navicon.js-open-list-menu a.fa.fa-navicon.js-open-list-menu
if showDesktopDragHandles if currentUser.isBoardAdmin
a.list-header-handle.handle.fa.fa-arrows.js-list-handle if showDesktopDragHandles
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
template(name="editListTitleForm") template(name="editListTitleForm")
.list-composer .list-composer
@ -115,8 +116,9 @@ template(name="listMorePopup")
input.inline-input(type="text" readonly value="{{ rootUrl }}") input.inline-input(type="text" readonly value="{{ rootUrl }}")
| {{_ 'added'}} | {{_ 'added'}}
span.date(title=list.createdAt) {{ moment createdAt 'LLL' }} span.date(title=list.createdAt) {{ moment createdAt 'LLL' }}
unless currentUser.isWorker //unless currentUser.isWorker
a.js-delete {{_ 'delete'}} // if currentUser.isBoardAdmin
// a.js-delete {{_ 'delete'}}
template(name="listDeletePopup") template(name="listDeletePopup")
p {{_ "list-delete-pop"}} p {{_ "list-delete-pop"}}

View file

@ -269,14 +269,16 @@ template(name="outgoingWebhooksPopup")
template(name="boardMenuPopup") template(name="boardMenuPopup")
ul.pop-over-list ul.pop-over-list
li if currentUser.isBoardAdmin
a.js-open-rules-view(title="{{_ 'rules'}}") li
i.fa.fa-magic a.js-open-rules-view(title="{{_ 'rules'}}")
| {{_ 'rules'}} i.fa.fa-magic
li | {{_ 'rules'}}
a.js-custom-fields if currentUser.isBoardAdmin
i.fa.fa-list-alt li
| {{_ 'custom-fields'}} a.js-custom-fields
i.fa.fa-list-alt
| {{_ 'custom-fields'}}
li li
a.js-open-archives a.js-open-archives
i.fa.fa-archive i.fa.fa-archive
@ -297,14 +299,14 @@ template(name="boardMenuPopup")
i.fa.fa-flag i.fa.fa-flag
| {{_ 'language'}} | {{_ 'language'}}
unless isSandstorm unless isSandstorm
if currentUser.isBoardAdmin hr
hr ul.pop-over-list
ul.pop-over-list if withApi
if withApi li
li a.js-export-board
a.js-export-board i.fa.fa-share-alt
i.fa.fa-share-alt | {{_ 'export-board'}}
| {{_ 'export-board'}} if currentUser.isBoardAdmin
li li
a.js-outgoing-webhooks a.js-outgoing-webhooks
i.fa.fa-globe i.fa.fa-globe
@ -317,7 +319,8 @@ template(name="boardMenuPopup")
a.js-subtask-settings a.js-subtask-settings
i.fa.fa-sitemap i.fa.fa-sitemap
| {{_ 'subtask-settings'}} | {{_ 'subtask-settings'}}
unless currentBoard.isTemplatesBoard unless currentBoard.isTemplatesBoard
if currentUser.isBoardAdmin
hr hr
ul.pop-over-list ul.pop-over-list
li li
@ -329,20 +332,22 @@ template(name="boardMenuPopup")
if isSandstorm if isSandstorm
hr hr
ul.pop-over-list ul.pop-over-list
li if currentUser.isMember
a.js-export-board li
i.fa.fa-share-alt a.js-export-board
| {{_ 'export-board'}} i.fa.fa-share-alt
li | {{_ 'export-board'}}
a.js-import-board li
i.fa.fa-share-alt a.js-import-board
i.fa.fa-sign-in i.fa.fa-share-alt
| {{_ 'import-board-c'}} i.fa.fa-sign-in
li | {{_ 'import-board-c'}}
a.js-archive-board if currentUser.isBoardAdmin
i.fa.fa-arrow-right li
i.fa.fa-archive a.js-archive-board
| {{_ 'archive-board'}} i.fa.fa-arrow-right
i.fa.fa-archive
| {{_ 'archive-board'}}
li li
a.js-outgoing-webhooks a.js-outgoing-webhooks
i.fa.fa-globe i.fa.fa-globe

View file

@ -5,8 +5,9 @@ template(name="archivesSidebar")
unless isWorker unless isWorker
p.quiet p.quiet
a.js-restore-all-cards {{_ 'restore-all'}} a.js-restore-all-cards {{_ 'restore-all'}}
| - if currentUser.isBoardAdmin
a.js-delete-all-cards {{_ 'delete-all'}} | -
a.js-delete-all-cards {{_ 'delete-all'}}
each archivedCards each archivedCards
.minicard-wrapper.js-minicard .minicard-wrapper.js-minicard
+minicard(this) +minicard(this)
@ -14,8 +15,9 @@ template(name="archivesSidebar")
unless isWorker unless isWorker
p.quiet p.quiet
a.js-restore-card {{_ 'restore'}} a.js-restore-card {{_ 'restore'}}
| - if currentUser.isBoardAdmin
a.js-delete-card {{_ 'delete'}} | -
a.js-delete-card {{_ 'delete'}}
if cardIsInArchivedList if cardIsInArchivedList
p.quiet.small ({{_ 'warn-list-archived'}}) p.quiet.small ({{_ 'warn-list-archived'}})
else else
@ -25,8 +27,9 @@ template(name="archivesSidebar")
unless isWorker unless isWorker
p.quiet p.quiet
a.js-restore-all-lists {{_ 'restore-all'}} a.js-restore-all-lists {{_ 'restore-all'}}
| - if currentUser.isBoardAdmin
a.js-delete-all-lists {{_ 'delete-all'}} | -
a.js-delete-all-lists {{_ 'delete-all'}}
ul.archived-lists ul.archived-lists
each archivedLists each archivedLists
li.archived-lists-item li.archived-lists-item
@ -35,8 +38,9 @@ template(name="archivesSidebar")
unless isWorker unless isWorker
p.quiet p.quiet
a.js-restore-list {{_ 'restore'}} a.js-restore-list {{_ 'restore'}}
| - if currentUser.isBoardAdmin
a.js-delete-list {{_ 'delete'}} | -
a.js-delete-list {{_ 'delete'}}
else else
li.no-items-message {{_ 'no-archived-lists'}} li.no-items-message {{_ 'no-archived-lists'}}
@ -44,8 +48,9 @@ template(name="archivesSidebar")
unless isWorker unless isWorker
p.quiet p.quiet
a.js-restore-all-swimlanes {{_ 'restore-all'}} a.js-restore-all-swimlanes {{_ 'restore-all'}}
| - if currentUser.isBoardAdmin
a.js-delete-all-swimlanes {{_ 'delete-all'}} | -
a.js-delete-all-swimlanes {{_ 'delete-all'}}
ul.archived-lists ul.archived-lists
each archivedSwimlanes each archivedSwimlanes
li.archived-lists-item li.archived-lists-item
@ -54,8 +59,9 @@ template(name="archivesSidebar")
unless isWorker unless isWorker
p.quiet p.quiet
a.js-restore-swimlane {{_ 'restore'}} a.js-restore-swimlane {{_ 'restore'}}
| - if currentUser.isBoardAdmin
a.js-delete-swimlane {{_ 'delete'}} | -
a.js-delete-swimlane {{_ 'delete'}}
else else
li.no-items-message {{_ 'no-archived-swimlanes'}} li.no-items-message {{_ 'no-archived-swimlanes'}}
else else

View file

@ -155,7 +155,7 @@ template(name="multiselectionSidebar")
i.fa.fa-check i.fa.fa-check
else if someSelectedElementHave 'member' _id else if someSelectedElementHave 'member' _id
i.fa.fa-ellipsis-h i.fa.fa-ellipsis-h
unless currentUser.isWorker if currentUser.isBoardAdmin
hr hr
a.sidebar-btn.js-move-selection a.sidebar-btn.js-move-selection
i.fa.fa-share i.fa.fa-share

View file

@ -15,8 +15,9 @@ template(name="swimlaneFixedHeader")
= title = title
.swimlane-header-menu .swimlane-header-menu
unless currentUser.isCommentOnly unless currentUser.isCommentOnly
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon if currentUser.isBoardAdmin
a.fa.fa-navicon.js-open-swimlane-menu a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon
a.fa.fa-navicon.js-open-swimlane-menu
unless isMiniScreen unless isMiniScreen
if showDesktopDragHandles if showDesktopDragHandles
a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle

View file

@ -45,18 +45,19 @@ template(name="listsGroup")
template(name="addListForm") template(name="addListForm")
unless currentUser.isWorker unless currentUser.isWorker
.list.list-composer.js-list-composer(class="{{#if isMiniScreen}}mini-list{{/if}}") .list.list-composer.js-list-composer(class="{{#if isMiniScreen}}mini-list{{/if}}")
.list-header-add if currentUser.isBoardAdmin
+inlinedForm(autoclose=false) .list-header-add
input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}" +inlinedForm(autoclose=false)
autocomplete="off" autofocus) input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
.edit-controls.clearfix autocomplete="off" autofocus)
button.primary.confirm(type="submit") {{_ 'save'}} .edit-controls.clearfix
unless currentBoard.isTemplatesBoard button.primary.confirm(type="submit") {{_ 'save'}}
unless currentBoard.isTemplateBoard unless currentBoard.isTemplatesBoard
span.quiet unless currentBoard.isTemplateBoard
| {{_ 'or'}} span.quiet
a.js-list-template {{_ 'template'}} | {{_ 'or'}}
else a.js-list-template {{_ 'template'}}
a.open-list-composer.js-open-inlined-form else
i.fa.fa-plus a.open-list-composer.js-open-inlined-form
| {{_ 'add-list'}} i.fa.fa-plus
| {{_ 'add-list'}}

View file

@ -122,7 +122,8 @@ function initSortable(boardComponent, $listsDom) {
'option', 'option',
'disabled', 'disabled',
// Disable drag-dropping when user is not member/is worker // Disable drag-dropping when user is not member/is worker
!userIsMember() || Meteor.user().isWorker(), //!userIsMember() || Meteor.user().isWorker(),
!Meteor.user().isBoardAdmin(),
// Not disable drag-dropping while in multi-selection mode // Not disable drag-dropping while in multi-selection mode
// MultiSelection.isActive() || !userIsMember(), // MultiSelection.isActive() || !userIsMember(),
); );
@ -274,12 +275,13 @@ Template.swimlane.helpers({
} }
}, },
canSeeAddList() { canSeeAddList() {
return ( return Meteor.user().isBoardAdmin();
/*
Meteor.user() && Meteor.user() &&
Meteor.user().isBoardMember() && Meteor.user().isBoardMember() &&
!Meteor.user().isCommentOnly() && !Meteor.user().isCommentOnly() &&
!Meteor.user().isWorker() !Meteor.user().isWorker()
); */
}, },
}); });