aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorRasmus Fuhse <fuhse@data-quest.de>2024-04-29 14:47:17 +0000
committerRasmus Fuhse <fuhse@data-quest.de>2024-04-29 14:47:17 +0000
commit3abeb6de6112bd177a5f6b96dc944b5637c55b96 (patch)
treed85f043b5814f75bc5944e0e926518787ec58ed0 /app
parent3ffd2f46af742ee26ecf0884ea4729e37b873e93 (diff)
Resolve "Wiki: Einzelne Wikiversionen können nicht mehr gelöscht werden"
Closes #4079 Merge request studip/studip!2925
Diffstat (limited to 'app')
-rw-r--r--app/controllers/course/wiki.php82
-rw-r--r--app/controllers/jsupdater.php5
-rw-r--r--app/views/course/wiki/ask_deleting.php31
-rw-r--r--app/views/course/wiki/history.php20
4 files changed, 127 insertions, 11 deletions
diff --git a/app/controllers/course/wiki.php b/app/controllers/course/wiki.php
index 738d0e7..567e285 100644
--- a/app/controllers/course/wiki.php
+++ b/app/controllers/course/wiki.php
@@ -142,12 +142,21 @@ class Course_WikiController extends AuthenticatedController
Icon::create('settings'),
['data-dialog' => 'width=700']
);
- $action_menu->addButton(
- 'delete',
- _('Seite löschen'),
- Icon::create('trash'),
- ['data-confirm' => _('Wollen Sie wirklich die komplette Seite löschen?'), 'form' => 'delete_page']
- );
+ 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']
+ );
+ }
}
$action_menu->addLink(
'#',
@@ -256,7 +265,10 @@ class Course_WikiController extends AuthenticatedController
"[[ " . $values['name'],
$p2['content']
);
- $p2->store();
+ if ($p2->isDirty()) {
+ $p2['user_id'] = User::findCurrent()->id;
+ $p2->store();
+ }
}
})->validate();
if (Request::isPost()) {
@@ -272,9 +284,17 @@ class Course_WikiController extends AuthenticatedController
$this->render_form($this->form);
}
+ public function ask_deleting_action(WikiPage $page)
+ {
+ if (!$page->isEditable()) {
+ throw new AccessDeniedException();
+ }
+ PageLayout::setTitle(_('Was genau soll gelöscht werden?'));
+ }
+
public function delete_action(WikiPage $page)
{
- if (!Request::isPost() || !CSRFProtection::verifyRequest()) {
+ if (!Request::isPost() || !$page->isEditable() || !CSRFProtection::verifyRequest()) {
throw new AccessDeniedException();
}
$name = $page->name;
@@ -283,6 +303,38 @@ class Course_WikiController extends AuthenticatedController
$this->redirect($this->allpagesURL());
}
+ public function deleteversion_action(WikiPage $page, $version_id = null)
+ {
+ if (!Request::isPost() || !$page->isEditable() || !CSRFProtection::verifyRequest()) {
+ throw new AccessDeniedException();
+ }
+ if ($version_id === null) {
+ $version = $page->versions[0];
+ if ($version) {
+ $page['name'] = $version['name'];
+ $page['content'] = $version['content'];
+ $page['user_id'] = $version['user_id'];
+ $page['chdate'] = $version['mkdate'];
+ $page->store();
+ $version->delete();
+ } else {
+ $page->delete();
+ }
+ } else {
+ $version = WikiVersion::find($version_id);
+ if ($version['page_id'] === $page->id) {
+ $version->delete();
+ }
+ }
+ PageLayout::postSuccess(_('Version wurde gelöscht.'));
+ if (Request::get('redirect_to') === 'page') {
+ $this->redirect($this->page($page));
+ } else {
+ $this->redirect($this->history($page));
+ }
+
+ }
+
public function allpages_action()
{
$this->pages = WikiPage::findBySQL(
@@ -535,8 +587,11 @@ class Course_WikiController extends AuthenticatedController
}
$page->content = \Studip\Markup::markAsHtml(trim(Request::get('content')));
- $page->store();
$user = User::findCurrent();
+ if ($page->isDirty()) {
+ $page['user_id'] = $user->id;
+ $page->store();
+ }
$pageData = [
'page_id' => $page->id,
'user_id' => $user->id
@@ -774,6 +829,10 @@ class Course_WikiController extends AuthenticatedController
'type' => 'no',
'mapper' => function () { return $this->range->id; }
],
+ 'user_id' => [
+ 'type' => 'no',
+ 'mapper' => function () { return User::findCurrent()->id; }
+ ],
'name' => [
'required' => true,
'label' => _('Name der Seite'),
@@ -828,7 +887,10 @@ class Course_WikiController extends AuthenticatedController
'[[ ' . $values['name'] . ' ]]',
$page->content
);
- $page->store();
+ if ($page->isDirty()) {
+ $page['user_id'] = User::findCurrent()->id;
+ $page->store();
+ }
}
}
}
diff --git a/app/controllers/jsupdater.php b/app/controllers/jsupdater.php
index 319edaa..a5425f9 100644
--- a/app/controllers/jsupdater.php
+++ b/app/controllers/jsupdater.php
@@ -299,7 +299,10 @@ class JsupdaterController extends AuthenticatedController
$page->content = \Studip\Markup::markAsHtml(
$pageInfo['wiki_editor_status']['page_content']
);
- $page->store();
+ if ($page->isDirty()) {
+ $page['user_id'] = User::findCurrent()->id;
+ $page->store();
+ }
}
$onlineData = [
'user_id' => $user->id,
diff --git a/app/views/course/wiki/ask_deleting.php b/app/views/course/wiki/ask_deleting.php
new file mode 100644
index 0000000..5afd19f
--- /dev/null
+++ b/app/views/course/wiki/ask_deleting.php
@@ -0,0 +1,31 @@
+<form action="" method="post">
+ <?= CSRFProtection::tokenTag() ?>
+ <div class="file_select_possibilities">
+ <div>
+ <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"
+ data-confirm="<?= _('Wirklich die letzte Änderung löschen?') ?>"
+ formaction="<?= $controller->deleteversionURL($page, ['redirect_to' => 'page']) ?>">
+ <?= _('Nur die letzte Änderung löschen') ?>
+ </button>
+ </div>
+ <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"
+ data-confirm="<?= _('Wollen Sie wirklich die komplette Seite löschen?') ?>"
+ formaction="<?= $controller->deleteURL($page) ?>">
+ <?= _('Ganze Wikiseite löschen') ?>
+ </button>
+ </div>
+ </div>
+ </div>
+</form>
diff --git a/app/views/course/wiki/history.php b/app/views/course/wiki/history.php
index 81fde59..cbd324d 100644
--- a/app/views/course/wiki/history.php
+++ b/app/views/course/wiki/history.php
@@ -45,6 +45,16 @@
<a href="<?= $controller->versiondiff($page) ?>" data-dialog>
<?= Icon::create('log')->asImg(['class' => 'text-bottom']) ?>
</a>
+ <? if ($page->isEditable()) : ?>
+ <form action="<?= $controller->deleteversion($page) ?>"
+ method="post"
+ class="inline"
+ title="<?= _('Version löschen') ?>"
+ data-confirm="<?= _('Wirklich diese Version löschen?') ?>">
+ <?= CSRFProtection::tokenTag() ?>
+ <?= Icon::create('trash')->asInput() ?>
+ </form>
+ <? endif ?>
</td>
</tr>
<? foreach ($page->versions as $i => $version) : ?>
@@ -69,6 +79,16 @@
<a href="<?= $controller->versiondiff($page, $version->id) ?>" data-dialog>
<?= Icon::create('log')->asImg(['class' => 'text-bottom']) ?>
</a>
+ <? if ($page->isEditable()) : ?>
+ <form action="<?= $controller->deleteversion($page, $version->id) ?>"
+ method="post"
+ class="inline"
+ title="<?= _('Version löschen') ?>"
+ data-confirm="<?= _('Wirklich diese Version löschen?') ?>">
+ <?= CSRFProtection::tokenTag() ?>
+ <?= Icon::create('trash')->asInput() ?>
+ </form>
+ <? endif ?>
</td>
</tr>
<? endforeach ?>