allow deletion of option by option owner and dsiplay owner
Signed-off-by: dartcafe <github@dartcafe.de>
This commit is contained in:
Родитель
834eec043f
Коммит
26f90b4126
|
@ -28,6 +28,7 @@ namespace OCA\Polls\Db;
|
|||
use JsonSerializable;
|
||||
|
||||
use OCP\AppFramework\Db\Entity;
|
||||
use OCP\IUser;
|
||||
|
||||
/**
|
||||
* @method int getId()
|
||||
|
@ -111,6 +112,8 @@ class Option extends Entity implements JsonSerializable {
|
|||
'id' => intval($this->id),
|
||||
'pollId' => intval($this->pollId),
|
||||
'owner' => $this->owner,
|
||||
'ownerDisplayName' => $this->getDisplayName(),
|
||||
'ownerIsNoUser' => !$this->ownerIsUser(),
|
||||
'released' => $this->released,
|
||||
'pollOptionText' => htmlspecialchars_decode($this->pollOptionText),
|
||||
'timestamp' => intval($timestamp),
|
||||
|
@ -126,4 +129,13 @@ class Option extends Entity implements JsonSerializable {
|
|||
'isBookedUp' => $this->isBookedUp,
|
||||
];
|
||||
}
|
||||
|
||||
private function getDisplayName(): string {
|
||||
return \OC::$server->getUserManager()->get($this->owner) instanceof IUser
|
||||
? \OC::$server->getUserManager()->get($this->owner)->getDisplayName()
|
||||
: $this->owner;
|
||||
}
|
||||
private function ownerIsUser(): string {
|
||||
return !!\OC::$server->getUserManager()->get($this->owner) instanceof IUser;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
<!--
|
||||
- @copyright Copyright (c) 2018 René Gieling <github@dartcafe.de>
|
||||
-
|
||||
- @author René Gieling <github@dartcafe.de>
|
||||
-
|
||||
- @license GNU AGPL version 3 or any later version
|
||||
-
|
||||
- This program is free software: you can redistribute it and/or modify
|
||||
- it under the terms of the GNU Affero General Public License as
|
||||
- published by the Free Software Foundation, either version 3 of the
|
||||
- License, or (at your option) any later version.
|
||||
-
|
||||
- This program is distributed in the hope that it will be useful,
|
||||
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
- GNU Affero General Public License for more details.
|
||||
-
|
||||
- You should have received a copy of the GNU Affero General Public License
|
||||
- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="option-item-owner">
|
||||
<Actions v-if="!acl.allowEdit && acl.userId === option.owner" class="action">
|
||||
<ActionButton icon="icon-delete" @click="removeOption(option)">
|
||||
{{ t('polls', 'Delete your proposal') }}
|
||||
</ActionButton>
|
||||
</Actions>
|
||||
<Avatar v-else-if="option.owner && option.owner !== pollOwner"
|
||||
:user="option.owner"
|
||||
:display-name="option.ownerDisplayName"
|
||||
:is-no-user="option.ownerIsNoUser"
|
||||
disable-menu
|
||||
:tooltip-message="t('polls', '{displayName}\'s proposal', { displayName: option.ownerDisplayName })" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapState, mapGetters } from 'vuex'
|
||||
import { Actions, ActionButton, Avatar } from '@nextcloud/vue'
|
||||
import { removeOption } from '../../mixins/optionMixins'
|
||||
|
||||
export default {
|
||||
name: 'OptionItemOwner',
|
||||
|
||||
components: {
|
||||
Avatar,
|
||||
Actions,
|
||||
ActionButton,
|
||||
},
|
||||
|
||||
mixins: [
|
||||
removeOption,
|
||||
],
|
||||
|
||||
props: {
|
||||
option: {
|
||||
type: Object,
|
||||
default: undefined,
|
||||
},
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState({
|
||||
pollOwner: state => state.poll.owner,
|
||||
acl: state => state.poll.acl,
|
||||
}),
|
||||
|
||||
...mapGetters({
|
||||
}),
|
||||
},
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
.option-item-owner {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: 21px;
|
||||
font-size: 0;
|
||||
align-self: stretch;
|
||||
min-width: 24px;
|
||||
}
|
||||
|
||||
</style>
|
|
@ -36,7 +36,7 @@
|
|||
</ActionButton>
|
||||
</Actions>
|
||||
</UserItem>
|
||||
|
||||
<div v-if="acl.allowAddOptions" class="owner" />
|
||||
<div v-if="acl.allowEdit && closed" class="confirm" />
|
||||
</div>
|
||||
|
||||
|
@ -55,7 +55,7 @@
|
|||
:class="{currentuser: participant.userId === acl.userId}">
|
||||
<VoteItem :user-id="participant.userId" :option="option" />
|
||||
</div>
|
||||
|
||||
<OptionItemOwner v-if="acl.allowAddOptions" :option="option" class="owner" />
|
||||
<Actions v-if="acl.allowEdit && closed" class="action confirm">
|
||||
<ActionButton v-if="closed" :icon="option.confirmed ? 'icon-polls-confirmed' : 'icon-polls-unconfirmed'"
|
||||
@click="confirmOption(option)">
|
||||
|
@ -85,6 +85,7 @@ import ButtonDiv from '../Base/ButtonDiv'
|
|||
import CalendarPeek from '../Calendar/CalendarPeek'
|
||||
import Counter from '../Options/Counter'
|
||||
import Confirmation from '../Options/Confirmation'
|
||||
import OptionItemOwner from '../Options/OptionItemOwner'
|
||||
import UserMenu from '../User/UserMenu'
|
||||
import VoteItem from './VoteItem'
|
||||
import VoteTableHeaderItem from './VoteTableHeaderItem'
|
||||
|
@ -103,6 +104,7 @@ export default {
|
|||
UserMenu,
|
||||
VoteTableHeaderItem,
|
||||
VoteItem,
|
||||
OptionItemOwner,
|
||||
},
|
||||
|
||||
mixins: [confirmOption],
|
||||
|
@ -195,6 +197,12 @@ export default {
|
|||
order: 20;
|
||||
}
|
||||
|
||||
.owner {
|
||||
display: flex;
|
||||
height: 56px;
|
||||
order: 19;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
flex: 1;
|
||||
order: 1;
|
||||
|
|
Загрузка…
Ссылка в новой задаче