diff --git a/app/controllers/course/wiki.php b/app/controllers/course/wiki.php index 926f641fe4fbd61fe13bfc6d470daa71f3d5e6f6..ddda49af86fb6dc6f4ad39017eb3d738eb19c188 100644 --- a/app/controllers/course/wiki.php +++ b/app/controllers/course/wiki.php @@ -164,20 +164,22 @@ class Course_WikiController extends AuthenticatedController Icon::create('settings'), ['data-dialog' => 'width=700'] ); - if (count($this->page->versions) > 0) { - $action_menu->addLink( - $this->ask_deletingURL($this->page), - _('Seite / Version löschen'), - Icon::create('trash'), - ['data-dialog' => 'size=auto'] - ); - } else { - $action_menu->addButton( - 'delete', - _('Seite löschen'), - Icon::create('trash'), - ['data-confirm' => _('Wollen Sie wirklich die komplette Seite löschen?'), 'form' => 'delete_page'] - ); + if ($this->page->isDeletable()) { + if (count($this->page->versions) > 0) { + $action_menu->addLink( + $this->ask_deletingURL($this->page), + _('Seite / Version löschen'), + Icon::create('trash'), + ['data-dialog' => 'size=auto'] + ); + } else { + $action_menu->addButton( + 'delete', + _('Seite löschen'), + Icon::create('trash'), + ['data-confirm' => _('Wollen Sie wirklich die komplette Seite löschen?'), 'form' => 'delete_page'] + ); + } } } $this->contentBarVueApp = $this->contentBarVueApp->withSlot('menu', $action_menu->render()); diff --git a/app/views/course/wiki/ask_deleting.php b/app/views/course/wiki/ask_deleting.php index 5afd19fe1f4755ef4d7dff6f939036818b716a68..915e689199f3245d71ec237fb48e47c6f1da6259 100644 --- a/app/views/course/wiki/ask_deleting.php +++ b/app/views/course/wiki/ask_deleting.php @@ -1,31 +1,37 @@ +<?php +/** + * @var Course_WikiController $controller + * @var WikiPage $page + */ +?> <form action="" method="post"> <?= CSRFProtection::tokenTag() ?> <div class="file_select_possibilities"> <div> + <? if (count($page->versions) > 0 && $page->versions->first()->isDeletable()): ?> <div class="clickable"> - <?= Icon::create('archive2')->asInput(50, [ - 'formaction' => $controller->deleteversionURL($page, ['redirect_to' => 'page']), - 'data-confirm' => _('Wirklich die letzte Änderung löschen?') - ]) ?> <button - class="undecorated" + class="as-link" data-confirm="<?= _('Wirklich die letzte Änderung löschen?') ?>" - formaction="<?= $controller->deleteversionURL($page, ['redirect_to' => 'page']) ?>"> + formaction="<?= $controller->deleteversionURL($page, ['redirect_to' => 'page']) ?>" + > + <?= Icon::create('archive2')->asImg(50) ?> <?= _('Nur die letzte Änderung löschen') ?> </button> </div> + <? endif; ?> + <? if ($page->isDeletable()): ?> <div class="clickable"> - <?= Icon::create('wiki')->asInput(50, [ - 'formaction' => $controller->deleteURL($page), - 'data-confirm' => _('Wollen Sie wirklich die komplette Seite löschen?') - ]) ?> <button - class="undecorated" + class="as-link" data-confirm="<?= _('Wollen Sie wirklich die komplette Seite löschen?') ?>" - formaction="<?= $controller->deleteURL($page) ?>"> + formaction="<?= $controller->deleteURL($page) ?>" + > + <?= Icon::create('wiki')->asImg(50) ?> <?= _('Ganze Wikiseite löschen') ?> </button> </div> + <? endif; ?> </div> </div> </form> diff --git a/lib/models/WikiPage.php b/lib/models/WikiPage.php index bb41d1b19e7830fb43a4a01cfa46ecfa2c5c6531..6cb4c8a2cf98b4552ba8e7ce2c9f5a7c3738d3f5 100644 --- a/lib/models/WikiPage.php +++ b/lib/models/WikiPage.php @@ -13,19 +13,23 @@ * * @property int $id alias for pk * @property int $page_id database column - * @property string $course_id database column - * @property string|null $user_id database column + * @property string $range_id database column * @property string $name database column * @property string $content database column - * @property string|null $ancestor database column - * @property int|null $chdate database column - * @property int $version database column + * @property string|null $parent_id database column + * @property string $read_permission database column + * @property string $write_permission database column + * @property string $user_id database column + * @property int|null $locked_since database column + * @property string|null $locked_by_user_id database column * @property int|null $mkdate database column + * @property int|null $chdate database column + * * @property User|null $user belongs_to User * @property Course $course belongs_to Course * @property WikiVersion[]|SimpleORMapCollection $versions * @property WikiOnlineEditingUser[]|SimpleORMapCollection $onlineeditingusers - * @property-read WikiPage $parent additional field + * @property-read WikiPage|null $parent additional field * @property-read WikiPage[] $children additional field * @property-read WikiVersion|null $predecessor additional field * @property-read int $versionnumber additional field @@ -179,16 +183,18 @@ class WikiPage extends SimpleORMap implements PrivacyObject if ($user_id === null && User::findCurrent()) { $user_id = User::findCurrent()->id; } - if ($GLOBALS['perm']->have_studip_perm( - 'dozent', - $this->range_id, - $user_id - )) { - return true; + + if ( + !$user_id + || !$GLOBALS['perm']->have_studip_perm('user', $this->range_id, $user_id) + ) { + return false; } + if ($this->write_permission === 'all') { return true; } + if (in_array($this->write_permission, ['tutor', 'dozent'])) { return $GLOBALS['perm']->have_studip_perm( $this->write_permission, @@ -200,6 +206,37 @@ class WikiPage extends SimpleORMap implements PrivacyObject } } + public function isDeletable(?string $user_id = null): bool + { + if ($user_id === null && User::findCurrent()) { + $user_id = User::findCurrent()->id; + } + + if (!$user_id) { + return false; + } + + $permission = $this->write_permission; + if ($permission === 'all') { + $permission = 'tutor'; + } + + if ( + in_array($permission, ['tutor', 'dozent']) + && $GLOBALS['perm']->have_studip_perm( + $this->write_permission, + $this->range_id, + $user_id + ) + ) { + return true; + } + + return $this->user_id === $user_id + && $this->versions->every(function (WikiVersion $version) use ($user_id): bool { + return $version->user_id === $user_id; + }); + } /** * Export available data of a given user into a storage object diff --git a/lib/models/WikiVersion.php b/lib/models/WikiVersion.php index 289c57d8abab4f64ee91f6894d97bc426cf6b3a2..2adb9580950be6a6ddaddfb9a842bdd2e8114cc8 100644 --- a/lib/models/WikiVersion.php +++ b/lib/models/WikiVersion.php @@ -13,11 +13,19 @@ * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 * @category Stud.IP * - * @property string page_id database column - * @property string id alias column for user_id - * @property string last_lifesign computed column read/write + * @property int $id alias column for user_id + * @property int $version_id database column + * @property int $page_id database column + * @property string $name database column + * @property string $content database column + * @property string $user_id database column + * @property int $mkdate database column * * @property WikiPage $page + * @property User $user + * @property WikiPage|null $predecessor + * @property WikiPage|null $successor + * @property int|null $versionnumber */ class WikiVersion extends SimpleORMap { @@ -63,4 +71,33 @@ class WikiVersion extends SimpleORMap ]; parent::configure($config); } + + public function isDeletable(?string $user_id = null): bool + { + if ($user_id === null && User::findCurrent()) { + $user_id = User::findCurrent()->id; + } + + if (!$user_id) { + return false; + } + + if ($this->user_id === $user_id) { + return true; + } + + $permission = $this->page->write_permission; + if ($permission === 'all') { + $permission = 'tutor'; + } + + return in_array($permission, ['tutor', 'dozent']) + && $GLOBALS['perm']->have_studip_perm( + $this->page->write_permission, + $this->page->range_id, + $user_id + ); + + + } } diff --git a/resources/assets/stylesheets/scss/files.scss b/resources/assets/stylesheets/scss/files.scss index 03c062116c335068c65d6fbe3c29bfcd15618361..31dadfb88e549d47fe48c10e26fbccc3b9477f72 100644 --- a/resources/assets/stylesheets/scss/files.scss +++ b/resources/assets/stylesheets/scss/files.scss @@ -126,6 +126,12 @@ div.file_select_possibilities, margin-left: auto; margin-right: auto; } + + button img { + display: block; + margin-left: auto; + margin-right: auto; + } } > .important-item {