Feat: Plug-in talk specific filters for unified search

Signed-off-by: fenn-cs <fenn25.fn@gmail.com>
Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
This commit is contained in:
fenn-cs 2024-02-10 22:55:34 +01:00 коммит произвёл Maksim Sukharev
Родитель 72e729fcab
Коммит 3e2851117f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 6349D071889BD1D5
4 изменённых файлов: 156 добавлений и 0 удалений

Просмотреть файл

@ -116,6 +116,7 @@ use OCA\Talk\Search\ConversationSearch;
use OCA\Talk\Search\CurrentMessageSearch;
use OCA\Talk\Search\MessageSearch;
use OCA\Talk\Search\UnifiedSearchCSSLoader;
use OCA\Talk\Search\UnifiedSearchFilterPlugin;
use OCA\Talk\Settings\Personal;
use OCA\Talk\Share\Listener as ShareListener;
use OCA\Talk\Signaling\Listener as SignalingListener;
@ -175,6 +176,7 @@ class Application extends App implements IBootstrap {
$context->registerEventListener(\OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent::class, UnifiedSearchCSSLoader::class);
$context->registerEventListener(\OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent::class, DeckPluginLoader::class);
$context->registerEventListener(\OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent::class, MapsPluginLoader::class);
$context->registerEventListener(\OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent::class, UnifiedSearchFilterPlugin::class);
$context->registerEventListener(RegisterOperationsEvent::class, RegisterOperationsListener::class);
$context->registerEventListener(BeforeTemplateRenderedEvent::class, PublicShareTemplateLoader::class);
$context->registerEventListener(BeforeTemplateRenderedEvent::class, PublicShareAuthTemplateLoader::class);

Просмотреть файл

@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2024 Fon E. Noel NFEBE <me@nfebe.com>
*
* @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/>.
*
*/
namespace OCA\Talk\Search;
use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\IRequest;
use OCP\Util;
/**
* @template-implements IEventListener<Event>
*/
class UnifiedSearchFilterPlugin implements IEventListener {
public function __construct(
private IRequest $request,
) {
}
public function handle(Event $event): void {
if (!($event instanceof BeforeTemplateRenderedEvent)) {
return;
}
if (!$event->isLoggedIn()) {
return;
}
Util::addScript('spreed', 'talk-search');
}
}

100
src/search.js Normal file
Просмотреть файл

@ -0,0 +1,100 @@
/*
* @copyright Copyright (c) 2024 Fon E. Noel NFEBE <me@nfebe.com>
*
* @author Vincent Petry <me@nfebe.com>
*
* @license AGPL-3.0-or-later
*
* 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/>.
*
*/
import Vue from 'vue'
import { getRequestToken } from '@nextcloud/auth'
import { emit } from '@nextcloud/event-bus'
import { translate, translatePlural } from '@nextcloud/l10n'
import { generateFilePath, imagePath } from '@nextcloud/router'
import '@nextcloud/dialogs/style.css'
(function(OC, OCP, t, n) {
/**
*
*/
function init() {
if (!OCP.UnifiedSearch) {
return
}
console.debug('Initializing unified search plugin-filters from talk')
OCP.UnifiedSearch.registerFilterAction({
id: 'talk-message',
label: t('spreed', 'In conversation'),
icon: imagePath('spreed', 'app.svg'),
callback: () => {
const container = document.createElement('div')
container.id = 'spreed-unified-search-conversation-select'
const body = document.getElementById('body-user')
body.appendChild(container)
const RoomSelector = () => import('./components/RoomSelector.vue')
const vm = new Vue({
el: container,
render: h => h(RoomSelector, {
props: {
dialogTitle: t('spreed', 'Select conversation'),
isPlugin: true,
},
}),
})
vm.$root.$on('close', () => {
vm.$el.remove()
vm.$destroy()
})
vm.$root.$on('select', (conversation) => {
vm.$el.remove()
vm.$destroy()
emit('nextcloud:unified-search:add-filter', {
id: 'talk-message',
payload: conversation,
filterUpdateText: t('spreed', 'Search in conversation: {conversation}', { conversation: conversation.displayName }),
filterParams: { conversation: conversation.token }
})
})
},
})
}
// CSP config for webpack dynamic chunk loading
// eslint-disable-next-line
__webpack_nonce__ = btoa(getRequestToken())
// Correct the root of the app for chunk loading
// OC.linkTo matches the apps folders
// OC.generateUrl ensure the index.php (or not)
// We do not want the index.php since we're loading files
// eslint-disable-next-line
__webpack_public_path__ = generateFilePath('spreed', '', 'js/')
Vue.prototype.t = translate
Vue.prototype.n = translatePlural
Vue.prototype.OC = OC
Vue.prototype.OCP = OCP
document.addEventListener('DOMContentLoaded', init)
})(window.OC, window.OCP, t, n)

Просмотреть файл

@ -32,6 +32,7 @@ module.exports = mergeWithRules({
dashboard: path.join(__dirname, 'src', 'dashboard.js'),
deck: path.join(__dirname, 'src', 'deck.js'),
maps: path.join(__dirname, 'src', 'maps.js'),
search: path.join(__dirname, 'src', 'search.js'),
},
output: {