Port admin federated files sharing to vue

Signed-off-by: Carl Schwan <carl@carlschwan.eu>
This commit is contained in:
Carl Schwan 2022-05-17 14:39:49 +02:00
parent 87ce03db1a
commit 2727c57ae8
12 changed files with 281 additions and 127 deletions

View File

@ -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);
});
});

View File

@ -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', [], '');
}
/**

View File

@ -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>

View File

@ -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')
}

View File

@ -1,79 +1,26 @@
<?php
/** @var \OCP\IL10N $l */
/** @var array $_ */
script('federatedfilesharing', 'settings-admin');
style('federatedfilesharing', 'settings-admin');
/*
* @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/>.
*/
\OCP\Util::addScript('federatedfilesharing', 'vue-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>
<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>
<?php endif; ?>
<div id="vue-admin-federated"></div>

View File

@ -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());
}

4
dist/core-common.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,21 @@
/**
* @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/>.
*
*/

File diff suppressed because one or more lines are too long

View File

@ -68,6 +68,9 @@ module.exports = {
oauth2: {
oauth2: path.join(__dirname, 'apps/oauth2/src', 'main.js'),
},
federatedfilesharing: {
'vue-settings-admin': path.join(__dirname, 'apps/federatedfilesharing/src', 'main-admin.js'),
},
settings: {
'vue-settings-admin-basic-settings': path.join(__dirname, 'apps/settings/src', 'main-admin-basic-settings.js'),
'vue-settings-admin-delegation': path.join(__dirname, 'apps/settings/src', 'main-admin-delegation.js'),