diff options
author | Carl Schwan <carl@carlschwan.eu> | 2022-05-17 15:39:49 +0300 |
---|---|---|
committer | Carl Schwan <carl@carlschwan.eu> | 2022-05-20 16:55:16 +0300 |
commit | 2727c57ae8d0a2d36d9c5cad39790a6640401cac (patch) | |
tree | 46a21824d74e89475b0cd90a03e444fa0092221a /apps | |
parent | 87ce03db1ac8f1d7313850128528e5b8f06fce66 (diff) |
Port admin federated files sharing to vue
Signed-off-by: Carl Schwan <carl@carlschwan.eu>
Diffstat (limited to 'apps')
-rw-r--r-- | apps/federatedfilesharing/js/settings-admin.js | 11 | ||||
-rw-r--r-- | apps/federatedfilesharing/lib/Settings/Admin.php | 51 | ||||
-rw-r--r-- | apps/federatedfilesharing/src/components/AdminSettings.vue | 129 | ||||
-rw-r--r-- | apps/federatedfilesharing/src/main-admin.js | 44 | ||||
-rw-r--r-- | apps/federatedfilesharing/templates/settings-admin.php | 99 | ||||
-rw-r--r-- | apps/federatedfilesharing/tests/Settings/AdminTest.php | 40 |
6 files changed, 250 insertions, 124 deletions
diff --git a/apps/federatedfilesharing/js/settings-admin.js b/apps/federatedfilesharing/js/settings-admin.js deleted file mode 100644 index 33e03af6a0d..00000000000 --- a/apps/federatedfilesharing/js/settings-admin.js +++ /dev/null @@ -1,11 +0,0 @@ -window.addEventListener('DOMContentLoaded', function() { - - $('#fileSharingSettings input').change(function() { - var value = 'no'; - if (this.checked) { - value = 'yes'; - } - OCP.AppConfig.setValue('files_sharing', $(this).attr('name'), value); - }); - -}); diff --git a/apps/federatedfilesharing/lib/Settings/Admin.php b/apps/federatedfilesharing/lib/Settings/Admin.php index 30fe6f05cf6..aec5d23fdf4 100644 --- a/apps/federatedfilesharing/lib/Settings/Admin.php +++ b/apps/federatedfilesharing/lib/Settings/Admin.php @@ -26,49 +26,52 @@ namespace OCA\FederatedFileSharing\Settings; use OCA\FederatedFileSharing\FederatedShareProvider; use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; use OCP\GlobalScale\IConfig; use OCP\IL10N; +use OCP\IURLGenerator; use OCP\Settings\IDelegatedSettings; class Admin implements IDelegatedSettings { - - /** @var FederatedShareProvider */ - private $fedShareProvider; - - /** @var IConfig */ - private $gsConfig; - - /** @var IL10N */ - private $l; + private FederatedShareProvider $fedShareProvider; + private IConfig $gsConfig; + private IL10N $l; + private IURLGenerator $urlGenerator; + private IInitialState $initialState; /** * Admin constructor. - * - * @param FederatedShareProvider $fedShareProvider - * @param IConfig $globalScaleConfig */ - public function __construct(FederatedShareProvider $fedShareProvider, IConfig $globalScaleConfig, IL10N $l) { + public function __construct( + FederatedShareProvider $fedShareProvider, + IConfig $globalScaleConfig, + IL10N $l, + IURLGenerator $urlGenerator, + IInitialState $initialState + ) { $this->fedShareProvider = $fedShareProvider; $this->gsConfig = $globalScaleConfig; $this->l = $l; + $this->urlGenerator = $urlGenerator; + $this->initialState = $initialState; } /** * @return TemplateResponse */ public function getForm() { - $parameters = [ - 'internalOnly' => $this->gsConfig->onlyInternalFederation(), - 'outgoingServer2serverShareEnabled' => $this->fedShareProvider->isOutgoingServer2serverShareEnabled(), - 'incomingServer2serverShareEnabled' => $this->fedShareProvider->isIncomingServer2serverShareEnabled(), - 'federatedGroupSharingSupported' => $this->fedShareProvider->isFederatedGroupSharingSupported(), - 'outgoingServer2serverGroupShareEnabled' => $this->fedShareProvider->isOutgoingServer2serverGroupShareEnabled(), - 'incomingServer2serverGroupShareEnabled' => $this->fedShareProvider->isIncomingServer2serverGroupShareEnabled(), - 'lookupServerEnabled' => $this->fedShareProvider->isLookupServerQueriesEnabled(), - 'lookupServerUploadEnabled' => $this->fedShareProvider->isLookupServerUploadEnabled(), - ]; - return new TemplateResponse('federatedfilesharing', 'settings-admin', $parameters, ''); + $this->initialState->provideInitialState('internalOnly', $this->gsConfig->onlyInternalFederation()); + $this->initialState->provideInitialState('sharingFederatedDocUrl', $this->urlGenerator->linkToDocs('admin-sharing-federated')); + $this->initialState->provideInitialState('outgoingServer2serverShareEnabled', $this->fedShareProvider->isOutgoingServer2serverShareEnabled()); + $this->initialState->provideInitialState('incomingServer2serverShareEnabled', $this->fedShareProvider->isIncomingServer2serverShareEnabled()); + $this->initialState->provideInitialState('federatedGroupSharingSupported', $this->fedShareProvider->isFederatedGroupSharingSupported()); + $this->initialState->provideInitialState('outgoingServer2serverGroupShareEnabled', $this->fedShareProvider->isOutgoingServer2serverGroupShareEnabled()); + $this->initialState->provideInitialState('incomingServer2serverGroupShareEnabled', $this->fedShareProvider->isIncomingServer2serverGroupShareEnabled()); + $this->initialState->provideInitialState('lookupServerEnabled', $this->fedShareProvider->isLookupServerQueriesEnabled()); + $this->initialState->provideInitialState('lookupServerUploadEnabled', $this->fedShareProvider->isLookupServerUploadEnabled()); + + return new TemplateResponse('federatedfilesharing', 'settings-admin', [], ''); } /** diff --git a/apps/federatedfilesharing/src/components/AdminSettings.vue b/apps/federatedfilesharing/src/components/AdminSettings.vue new file mode 100644 index 00000000000..cd0f6e5beb6 --- /dev/null +++ b/apps/federatedfilesharing/src/components/AdminSettings.vue @@ -0,0 +1,129 @@ +<!-- + - @copyright 2022 Carl Schwan <carl@carlschwan.eu> + - + - @author Carl Schwan <carl@carlschwan.eu> + - + - @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> + <SettingsSection :title="t('federatedfilesharing', 'Federated Cloud Sharing')" + :description="t('federatedfilesharing', 'Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing.')" + :doc-url="sharingFederatedDocUrl"> + <CheckboxRadioSwitch type="switch" + :checked.sync="outgoingServer2serverShareEnabled" + @update:checked="update('outgoing_server2server_share_enabled', outgoingServer2serverShareEnabled)"> + {{ t('federatedfilesharing', 'Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)') }} + </CheckboxRadioSwitch> + + <CheckboxRadioSwitch type="switch" + :checked.sync="incomingServer2serverShareEnabled" + @update:checked="update('incoming_server2server_share_enabled', incomingServer2serverShareEnabled)"> + {{ t('federatedfilesharing', 'Allow users on this server to receive shares from other servers') }} + </CheckboxRadioSwitch> + + <CheckboxRadioSwitch v-if="federatedGroupSharingSupported" + type="switch" + :checked.sync="outgoingServer2serverGroupShareEnabled" + @update:checked="update('outgoing_server2server_group_share_enabled', outgoingServer2serverGroupShareEnabled)"> + {{ t('federatedfilesharing', 'Allow users on this server to send shares to groups on other servers') }} + </CheckboxRadioSwitch> + + <CheckboxRadioSwitch v-if="federatedGroupSharingSupported" + type="switch" + :checked.sync="incomingServer2serverGroupShareEnabled" + @update:checked="update('incoming_server2server_group_share_enabled', incomingServer2serverGroupShareEnabled)"> + {{ t('federatedfilesharing', 'Allow users on this server to receive group shares from other servers') }} + </CheckboxRadioSwitch> + + <CheckboxRadioSwitch type="switch" + :checked.sync="lookupServerEnabled" + @update:checked="update('lookupServerEnabled', lookupServerEnabled)"> + {{ t('federatedfilesharing', 'Search global and public address book for users') }} + </CheckboxRadioSwitch> + + <CheckboxRadioSwitch type="switch" + :checked.sync="lookupServerUploadEnabled" + @update:checked="update('lookupServerUploadEnabled', lookupServerUploadEnabled)"> + {{ t('federatedfilesharing', 'Allow users to publish their data to a global and public address book') }} + </CheckboxRadioSwitch> + </SettingsSection> +</template> + +<script> +import CheckboxRadioSwitch from '@nextcloud/vue/dist/Components/CheckboxRadioSwitch' +import SettingsSection from '@nextcloud/vue/dist/Components/SettingsSection' +import { loadState } from '@nextcloud/initial-state' +import { showError } from '@nextcloud/dialogs' +import axios from '@nextcloud/axios' +import { generateOcsUrl } from '@nextcloud/router' +import confirmPassword from '@nextcloud/password-confirmation' + +export default { + name: 'AdminSettings', + + components: { + CheckboxRadioSwitch, + SettingsSection, + }, + + data() { + return { + outgoingServer2serverShareEnabled: loadState('federatedfilesharing', 'outgoingServer2serverShareEnabled'), + incomingServer2serverShareEnabled: loadState('federatedfilesharing', 'incomingServer2serverShareEnabled'), + outgoingServer2serverGroupShareEnabled: loadState('federatedfilesharing', 'outgoingServer2serverGroupShareEnabled'), + incomingServer2serverGroupShareEnabled: loadState('federatedfilesharing', 'incomingServer2serverGroupShareEnabled'), + federatedGroupSharingSupported: loadState('federatedfilesharing', 'federatedGroupSharingSupported'), + lookupServerEnabled: loadState('federatedfilesharing', 'lookupServerEnabled'), + lookupServerUploadEnabled: loadState('federatedfilesharing', 'lookupServerUploadEnabled'), + internalOnly: loadState('federatedfilesharing', 'internalOnly'), + sharingFederatedDocUrl: loadState('federatedfilesharing', 'sharingFederatedDocUrl'), + } + }, + methods: { + async update(key, value) { + await confirmPassword() + + const url = generateOcsUrl('/apps/provisioning_api/api/v1/config/apps/{appId}/{key}', { + appId: 'files_sharing', + key, + }) + + const stringValue = value ? 'yes' : 'no' + try { + const { data } = await axios.post(url, { + value: stringValue, + }) + this.handleResponse({ + status: data.ocs?.meta?.status, + }) + } catch (e) { + this.handleResponse({ + errorMessage: t('federatedfilesharing', 'Unable to update federated files sharing config'), + error: e, + }) + } + }, + async handleResponse({ status, errorMessage, error }) { + if (status !== 'ok') { + showError(errorMessage) + console.error(errorMessage, error) + } + }, + } +} +</script> diff --git a/apps/federatedfilesharing/src/main-admin.js b/apps/federatedfilesharing/src/main-admin.js new file mode 100644 index 00000000000..ab5ef95e341 --- /dev/null +++ b/apps/federatedfilesharing/src/main-admin.js @@ -0,0 +1,44 @@ +/** + * @copyright 2022 Carl Schwan <carl@carlschwan.eu> + * + * @author Carl Schwan <carl@carlschwan.eu> + * + * @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/>. + * + */ + +import Vue from 'vue' +import { getRequestToken } from '@nextcloud/auth' +import { translate as t } from '@nextcloud/l10n' +import '@nextcloud/dialogs/styles/toast.scss' +import { loadState } from '@nextcloud/initial-state' + +import AdminSettings from './components/AdminSettings' + +__webpack_nonce__ = btoa(getRequestToken()) + +Vue.mixin({ + methods: { + t, + }, +}) + +const internalOnly = loadState('federatedfilesharing', 'internalOnly', false) + +if (!internalOnly) { + const AdminSettingsView = Vue.extend(AdminSettings) + new AdminSettingsView().$mount('#vue-admin-federated') +} diff --git a/apps/federatedfilesharing/templates/settings-admin.php b/apps/federatedfilesharing/templates/settings-admin.php index 093679bc16c..759be989820 100644 --- a/apps/federatedfilesharing/templates/settings-admin.php +++ b/apps/federatedfilesharing/templates/settings-admin.php @@ -1,79 +1,26 @@ <?php -/** @var \OCP\IL10N $l */ -/** @var array $_ */ -script('federatedfilesharing', 'settings-admin'); -style('federatedfilesharing', 'settings-admin'); -?> - -<?php if ($_['internalOnly'] === false): ?> - -<div id="fileSharingSettings" class="section"> - <h2> - <?php p($l->t('Federated Cloud Sharing'));?> - </h2> - <a target="_blank" rel="noreferrer noopener" class="icon-info svg" - title="<?php p($l->t('Open documentation'));?>" - href="<?php p(link_to_docs('admin-sharing-federated')); ?>"></a> +/* + * @copyright 2022 Carl Schwan <carl@carlschwan.eu> + * + * @author Carl Schwan <carl@carlschwan.eu> + * + * @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/>. +*/ - <p class="settings-hint"><?php p($l->t('Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing.')); ?></p> - - <p> - <input type="checkbox" name="outgoing_server2server_share_enabled" id="outgoingServer2serverShareEnabled" class="checkbox" - value="1" <?php if ($_['outgoingServer2serverShareEnabled']) { - print_unescaped('checked="checked"'); -} ?> /> - <label for="outgoingServer2serverShareEnabled"> - <?php p($l->t('Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)'));?> - </label> - </p> - <p> - <input type="checkbox" name="incoming_server2server_share_enabled" id="incomingServer2serverShareEnabled" class="checkbox" - value="1" <?php if ($_['incomingServer2serverShareEnabled']) { - print_unescaped('checked="checked"'); -} ?> /> - <label for="incomingServer2serverShareEnabled"> - <?php p($l->t('Allow users on this server to receive shares from other servers'));?> - </label><br/> - </p> - <?php if ($_['federatedGroupSharingSupported']): ?> - <p> - <input type="checkbox" name="outgoing_server2server_group_share_enabled" id="outgoingServer2serverGroupShareEnabled" class="checkbox" - value="1" <?php if ($_['outgoingServer2serverGroupShareEnabled']) { - print_unescaped('checked="checked"'); -} ?> /> - <label for="outgoingServer2serverGroupShareEnabled"> - <?php p($l->t('Allow users on this server to send shares to groups on other servers'));?> - </label> - </p> - <p> - <input type="checkbox" name="incoming_server2server_group_share_enabled" id="incomingServer2serverGroupShareEnabled" class="checkbox" - value="1" <?php if ($_['incomingServer2serverGroupShareEnabled']) { - print_unescaped('checked="checked"'); -} ?> /> - <label for="incomingServer2serverGroupShareEnabled"> - <?php p($l->t('Allow users on this server to receive group shares from other servers'));?> - </label><br/> - </p> - <?php endif; ?> - <p> - <input type="checkbox" name="lookupServerEnabled" id="lookupServerEnabled" class="checkbox" - value="1" <?php if ($_['lookupServerEnabled']) { - print_unescaped('checked="checked"'); -} ?> /> - <label for="lookupServerEnabled"> - <?php p($l->t('Search global and public address book for users'));?> - </label><br/> - </p> - <p> - <input type="checkbox" name="lookupServerUploadEnabled" id="lookupServerUploadEnabled" class="checkbox" - value="1" <?php if ($_['lookupServerUploadEnabled']) { - print_unescaped('checked="checked"'); -} ?> /> - <label for="lookupServerUploadEnabled"> - <?php p($l->t('Allow users to publish their data to a global and public address book'));?> - </label><br/> - </p> - -</div> +\OCP\Util::addScript('federatedfilesharing', 'vue-settings-admin'); +?> -<?php endif; ?> +<div id="vue-admin-federated"></div> diff --git a/apps/federatedfilesharing/tests/Settings/AdminTest.php b/apps/federatedfilesharing/tests/Settings/AdminTest.php index 0b3a721d7da..04761e35410 100644 --- a/apps/federatedfilesharing/tests/Settings/AdminTest.php +++ b/apps/federatedfilesharing/tests/Settings/AdminTest.php @@ -28,8 +28,10 @@ namespace OCA\FederatedFileSharing\Tests\Settings; use OCA\FederatedFileSharing\FederatedShareProvider; use OCA\FederatedFileSharing\Settings\Admin; use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; use OCP\GlobalScale\IConfig; use OCP\IL10N; +use OCP\IURLGenerator; use Test\TestCase; class AdminTest extends TestCase { @@ -37,17 +39,25 @@ class AdminTest extends TestCase { private $admin; /** @var \OCA\FederatedFileSharing\FederatedShareProvider */ private $federatedShareProvider; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ private $gsConfig; protected function setUp(): void { parent::setUp(); $this->federatedShareProvider = $this->createMock(FederatedShareProvider::class); $this->gsConfig = $this->createMock(IConfig::class); + $this->initialState = $this->createMock(IInitialState::class); + $urlGenerator = $this->createMock(IURLGenerator::class); + $urlGenerator->expects($this->any()) + ->method('linkToDocs') + ->willReturn('doc-link'); + $this->admin = new Admin( $this->federatedShareProvider, $this->gsConfig, - $this->createMock(IL10N::class) + $this->createMock(IL10N::class), + $urlGenerator, + $this->initialState ); } @@ -102,17 +112,21 @@ class AdminTest extends TestCase { $this->gsConfig->expects($this->once())->method('onlyInternalFederation') ->willReturn($state); - $params = [ - 'internalOnly' => $state, - 'outgoingServer2serverShareEnabled' => $state, - 'incomingServer2serverShareEnabled' => $state, - 'lookupServerEnabled' => $state, - 'lookupServerUploadEnabled' => $state, - 'federatedGroupSharingSupported' => $state, - 'outgoingServer2serverGroupShareEnabled' => $state, - 'incomingServer2serverGroupShareEnabled' => $state, - ]; - $expected = new TemplateResponse('federatedfilesharing', 'settings-admin', $params, ''); + $this->initialState->expects($this->exactly(9)) + ->method('provideInitialState') + ->withConsecutive( + ['internalOnly', $state], + ['sharingFederatedDocUrl', 'doc-link'], + ['outgoingServer2serverShareEnabled', $state], + ['incomingServer2serverShareEnabled', $state], + ['federatedGroupSharingSupported', $state], + ['outgoingServer2serverGroupShareEnabled', $state], + ['incomingServer2serverGroupShareEnabled', $state], + ['lookupServerEnabled', $state], + ['lookupServerUploadEnabled', $state], + ); + + $expected = new TemplateResponse('federatedfilesharing', 'settings-admin', [], ''); $this->assertEquals($expected, $this->admin->getForm()); } |