[UI][PLUGIN][DeleteNote][EVENT] Add 'AddExtraNoteActions' event, which can be leveraged to add extra actions on each note, but which are normally collapsed

This commit is contained in:
Hugo Sales 2021-12-04 11:59:45 +00:00
parent 969df371dd
commit 1457aa8220
Signed by: someonewithpc
GPG Key ID: 7D0C7EAFC9D835A0
5 changed files with 75 additions and 2 deletions

View File

@ -0,0 +1,36 @@
<?php
declare(strict_types = 1);
// {{{ License
// This file is part of GNU social - https://www.gnu.org/software/social
//
// GNU social 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.
//
// GNU social 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 GNU social. If not, see <http://www.gnu.org/licenses/>.
// }}}
namespace Plugin\DeleteNote\Controller;
use App\Core\Controller;
use App\Util\Exception\NotImplementedException;
use Symfony\Component\HttpFoundation\Request;
class DeleteNote extends Controller
{
public function __invoke(Request $request)
{
throw new NotImplementedException;
}
}

View File

@ -26,6 +26,8 @@ use App\Core\Event;
use App\Core\Form; use App\Core\Form;
use function App\Core\I18n\_m; use function App\Core\I18n\_m;
use App\Core\Modules\NoteHandlerPlugin; use App\Core\Modules\NoteHandlerPlugin;
use App\Core\Router\RouteLoader;
use App\Core\Router\Router;
use App\Entity\Note; use App\Entity\Note;
use App\Util\Common; use App\Util\Common;
use App\Util\Exception\RedirectException; use App\Util\Exception\RedirectException;
@ -46,13 +48,28 @@ use Symfony\Component\HttpFoundation\Request;
*/ */
class DeleteNote extends NoteHandlerPlugin class DeleteNote extends NoteHandlerPlugin
{ {
// TODO: Refactoring to link instead of a form public function onAddRoute(RouteLoader $r)
{
$r->connect(id: 'delete_note', uri_path: '/object/note/{id<\d+>}/delete', target: Controller\DeleteNote::class);
return Event::next;
}
public function onAddExtraNoteActions(Request $request, Note $note, array &$actions)
{
$actions[] = [
'title' => _m('Delete note'),
'classes' => '',
'url' => Router::url('delete_note', ['id' => $note->getId()]),
];
}
/** /**
* HTML rendering event that adds the repeat form as a note * HTML rendering event that adds the repeat form as a note
* action, if a user is logged in * action, if a user is logged in
* *
* @throws RedirectException * @throws RedirectException
*/ */
// TODO: Refactoring to link instead of a form
/* public function onAddNoteActions(Request $request, Note $note, array &$actions) /* public function onAddNoteActions(Request $request, Note $note, array &$actions)
{ {
if (($user = Common::user()) === null) { if (($user = Common::user()) === null) {

View File

@ -64,6 +64,7 @@ class Extension extends AbstractExtension
new TwigFunction('active', [Runtime::class, 'isCurrentRouteActive']), new TwigFunction('active', [Runtime::class, 'isCurrentRouteActive']),
new TwigFunction('is_route', [Runtime::class, 'isCurrentRoute']), new TwigFunction('is_route', [Runtime::class, 'isCurrentRoute']),
new TwigFunction('get_note_actions', [Runtime::class, 'getNoteActions']), new TwigFunction('get_note_actions', [Runtime::class, 'getNoteActions']),
new TwigFunction('get_extra_note_actions', [Runtime::class, 'getExtraNoteActions']),
new TwigFunction('show_stylesheets', [Runtime::class, 'getShowStylesheets']), new TwigFunction('show_stylesheets', [Runtime::class, 'getShowStylesheets']),
new TwigFunction('handle_event', [Runtime::class, 'handleEvent']), new TwigFunction('handle_event', [Runtime::class, 'handleEvent']),
new TwigFunction('config', [Runtime::class, 'getConfig']), new TwigFunction('config', [Runtime::class, 'getConfig']),

View File

@ -72,6 +72,13 @@ class Runtime implements RuntimeExtensionInterface, EventSubscriberInterface
return $actions; return $actions;
} }
public function getExtraNoteActions(Note $note)
{
$extra_actions = [];
Event::handle('AddExtraNoteActions', [$this->request, $note, &$extra_actions]);
return $extra_actions;
}
/** /**
* @codeCoverageIgnore * @codeCoverageIgnore
*/ */

View File

@ -4,6 +4,18 @@
{% for current_action in get_note_actions(note) %} {% for current_action in get_note_actions(note) %}
<a title="{{ current_action["title"] | trans }}" class="{{ current_action["classes"] }}" href="{{ current_action["url"] }}"></a> <a title="{{ current_action["title"] | trans }}" class="{{ current_action["classes"] }}" href="{{ current_action["url"] }}"></a>
{% endfor %} {% endfor %}
<details>
<summary>
{{ icon('kebab', 'icon icon-extra-note-actions') | raw }} {# button-container #}
</summary>
<ul>
{% for current_action in get_extra_note_actions(note) %}
<li>
<a class="{{ current_action["classes"] }}" href="{{ current_action["url"] }}">{{ current_action['title'] }}</a>
</li>
{% endfor %}
</ul>
</details>
</div> </div>
{% endif %} {% endif %}
{% endblock note_actions %} {% endblock note_actions %}