Signed-off-by: Jan C. Borchardt <hey@jancborchardt.net>tags/v20.0.0beta4
@@ -1,2 +1,2 @@ | |||
!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/js/",t(t.s=164)}({164:function(e,n,r){r.p=OC.linkTo("files_sharing","js/dist/"),r.nc=btoa(OC.requestToken),window.OCP.Collaboration.registerType("file",{action:function(){return new Promise((function(e,n){OC.dialogs.filepicker(t("files_sharing","Link to a file"),(function(t){OC.Files.getClient().getFileInfo(t).then((function(n,t){e(t.id)})).fail((function(){n(new Error("Cannot get fileinfo"))}))}),!1,null,!1,OC.dialogs.FILEPICKER_TYPE_CHOOSE,"",{allowDirectoryChooser:!0})}))},typeString:t("files_sharing","Link to a file"),typeIconClass:"icon-files-dark"})}}); | |||
!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/js/",t(t.s=151)}({151:function(e,n,r){r.p=OC.linkTo("files_sharing","js/dist/"),r.nc=btoa(OC.requestToken),window.OCP.Collaboration.registerType("file",{action:function(){return new Promise((function(e,n){OC.dialogs.filepicker(t("files_sharing","Link to a file"),(function(t){OC.Files.getClient().getFileInfo(t).then((function(n,t){e(t.id)})).fail((function(){n(new Error("Cannot get fileinfo"))}))}),!1,null,!1,OC.dialogs.FILEPICKER_TYPE_CHOOSE,"",{allowDirectoryChooser:!0})}))},typeString:t("files_sharing","Link to a file"),typeIconClass:"icon-files-dark"})}}); | |||
//# sourceMappingURL=collaboration.js.map |
@@ -1,2 +1,2 @@ | |||
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/js/",r(r.s=282)}({282:function(e,t){Object.assign(OC,{Share:{SHARE_TYPE_USER:0,SHARE_TYPE_GROUP:1,SHARE_TYPE_LINK:3,SHARE_TYPE_EMAIL:4,SHARE_TYPE_REMOTE:6,SHARE_TYPE_CIRCLE:7,SHARE_TYPE_GUEST:8,SHARE_TYPE_REMOTE_GROUP:9,SHARE_TYPE_ROOM:10}})}}); | |||
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="/js/",r(r.s=277)}({277:function(e,t){Object.assign(OC,{Share:{SHARE_TYPE_USER:0,SHARE_TYPE_GROUP:1,SHARE_TYPE_LINK:3,SHARE_TYPE_EMAIL:4,SHARE_TYPE_REMOTE:6,SHARE_TYPE_CIRCLE:7,SHARE_TYPE_GUEST:8,SHARE_TYPE_REMOTE_GROUP:9,SHARE_TYPE_ROOM:10}})}}); | |||
//# sourceMappingURL=main.js.map |
@@ -79,5 +79,7 @@ return [ | |||
['name' => 'WebAuthn#startRegistration', 'url' => '/settings/api/personal/webauthn/registration', 'verb' => 'GET' , 'root' => ''], | |||
['name' => 'WebAuthn#finishRegistration', 'url' => '/settings/api/personal/webauthn/registration', 'verb' => 'POST' , 'root' => ''], | |||
['name' => 'WebAuthn#deleteRegistration', 'url' => '/settings/api/personal/webauthn/registration/{id}', 'verb' => 'DELETE' , 'root' => ''], | |||
['name' => 'Reasons#getPdf', 'url' => '/settings/download/reasons', 'verb' => 'GET', 'root' => ''], | |||
] | |||
]; |
@@ -25,6 +25,7 @@ return array( | |||
'OCA\\Settings\\Controller\\LogSettingsController' => $baseDir . '/../lib/Controller/LogSettingsController.php', | |||
'OCA\\Settings\\Controller\\MailSettingsController' => $baseDir . '/../lib/Controller/MailSettingsController.php', | |||
'OCA\\Settings\\Controller\\PersonalSettingsController' => $baseDir . '/../lib/Controller/PersonalSettingsController.php', | |||
'OCA\\Settings\\Controller\\ReasonsController' => $baseDir . '/../lib/Controller/ReasonsController.php', | |||
'OCA\\Settings\\Controller\\TwoFactorSettingsController' => $baseDir . '/../lib/Controller/TwoFactorSettingsController.php', | |||
'OCA\\Settings\\Controller\\UsersController' => $baseDir . '/../lib/Controller/UsersController.php', | |||
'OCA\\Settings\\Controller\\WebAuthnController' => $baseDir . '/../lib/Controller/WebAuthnController.php', |
@@ -40,6 +40,7 @@ class ComposerStaticInitSettings | |||
'OCA\\Settings\\Controller\\LogSettingsController' => __DIR__ . '/..' . '/../lib/Controller/LogSettingsController.php', | |||
'OCA\\Settings\\Controller\\MailSettingsController' => __DIR__ . '/..' . '/../lib/Controller/MailSettingsController.php', | |||
'OCA\\Settings\\Controller\\PersonalSettingsController' => __DIR__ . '/..' . '/../lib/Controller/PersonalSettingsController.php', | |||
'OCA\\Settings\\Controller\\ReasonsController' => __DIR__ . '/..' . '/../lib/Controller/ReasonsController.php', | |||
'OCA\\Settings\\Controller\\TwoFactorSettingsController' => __DIR__ . '/..' . '/../lib/Controller/TwoFactorSettingsController.php', | |||
'OCA\\Settings\\Controller\\UsersController' => __DIR__ . '/..' . '/../lib/Controller/UsersController.php', | |||
'OCA\\Settings\\Controller\\WebAuthnController' => __DIR__ . '/..' . '/../lib/Controller/WebAuthnController.php', |
@@ -161,6 +161,37 @@ select { | |||
} | |||
// Button for 'Reasons to use Nextcloud in your organization' | |||
.development-notice { | |||
text-align: center; | |||
} | |||
.link-button { | |||
display: inline-block; | |||
margin: 16px; | |||
padding: 14px 20px; | |||
background-color: var(--color-primary); | |||
color: #fff; | |||
border-radius: var(--border-radius-pill); | |||
border: 1px solid var(--color-primary); | |||
box-shadow: 0 2px 9px var(--color-box-shadow); | |||
&:active, | |||
&:hover, | |||
&:focus { | |||
color: var(--color-primary); | |||
background-color: var(--color-primary-text); | |||
border-color: var(--color-primary) !important; | |||
} | |||
&.icon-file { | |||
padding-left: 48px; | |||
background-position: 24px; | |||
} | |||
} | |||
@media (min-width: 1200px) and (max-width: 1400px) { | |||
#personal-settings { | |||
display: grid; |
@@ -0,0 +1,46 @@ | |||
<?php | |||
declare(strict_types=1); | |||
/** | |||
* @copyright Copyright (c) 2020, Roeland Jago Douma <roeland@famdouma.nl> | |||
* | |||
* @author Roeland Jago Douma <roeland@famdouma.nl> | |||
* | |||
* @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\Settings\Controller; | |||
use OCP\AppFramework\Controller; | |||
use OCP\AppFramework\Http\DataDisplayResponse; | |||
class ReasonsController extends Controller { | |||
/** | |||
* @NoCSRFRequired | |||
* @NoAdminRequired | |||
* @NoSubAdminRequired | |||
*/ | |||
public function getPdf() { | |||
$data = file_get_contents(__DIR__ . '/../../data/Reasons to use Nextcloud.pdf'); | |||
$resp = new DataDisplayResponse($data); | |||
$resp->addHeader('Content-Type', 'application/pdf'); | |||
return $resp; | |||
} | |||
} |
@@ -24,24 +24,72 @@ | |||
namespace OCA\Settings\Settings\Personal; | |||
use OCA\Viewer\Event\LoadViewer; | |||
use OCP\AppFramework\Http\TemplateResponse; | |||
use OCP\AppFramework\Services\IInitialState; | |||
use OCP\EventDispatcher\IEventDispatcher; | |||
use OCP\Files\IRootFolder; | |||
use OCP\IURLGenerator; | |||
use OCP\IUserSession; | |||
use OCP\Settings\ISettings; | |||
use OCP\Support\Subscription\IRegistry; | |||
use OCP\Util; | |||
class ServerDevNotice implements ISettings { | |||
/** @var IRegistry */ | |||
private $registry; | |||
public function __construct(IRegistry $registry) { | |||
/** @var IEventDispatcher */ | |||
private $eventDispatcher; | |||
/** @var IRootFolder */ | |||
private $rootFolder; | |||
/** @var IUserSession */ | |||
private $userSession; | |||
/** @var IInitialState */ | |||
private $initialState; | |||
/** @var IURLGenerator */ | |||
private $urlGenerator; | |||
public function __construct(IRegistry $registry, | |||
IEventDispatcher $eventDispatcher, | |||
IRootFolder $rootFolder, | |||
IUserSession $userSession, | |||
IInitialState $initialState, | |||
IURLGenerator $urlGenerator) { | |||
$this->registry = $registry; | |||
$this->eventDispatcher = $eventDispatcher; | |||
$this->rootFolder = $rootFolder; | |||
$this->userSession = $userSession; | |||
$this->initialState = $initialState; | |||
$this->urlGenerator = $urlGenerator; | |||
} | |||
/** | |||
* @return TemplateResponse | |||
*/ | |||
public function getForm() { | |||
return new TemplateResponse('settings', 'settings/personal/development.notice'); | |||
$userFolder = $this->rootFolder->getUserFolder($this->userSession->getUser()->getUID()); | |||
$hasInitialState = false; | |||
// If the Reasons to use Nextcloud.pdf file is here, let's init Viewer | |||
if ($userFolder->nodeExists('Reasons to use Nextcloud.pdf')) { | |||
$this->eventDispatcher->dispatch(LoadViewer::class, new LoadViewer()); | |||
$hasInitialState = true; | |||
} | |||
// Always load the script | |||
Util::addScript('settings', 'vue-settings-nextcloud-pdf'); | |||
$this->initialState->provideInitialState('has-reasons-use-nextcloud-pdf', $hasInitialState); | |||
return new TemplateResponse('settings', 'settings/personal/development.notice', [ | |||
'reasons-use-nextcloud-pdf-link' => $this->urlGenerator->linkToRoute('settings.Reasons.getPdf') | |||
]); | |||
} | |||
/** |
@@ -0,0 +1,36 @@ | |||
/** | |||
* @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com> | |||
* | |||
* @author John Molakvoæ <skjnldsv@protonmail.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/>. | |||
* | |||
*/ | |||
import { loadState } from '@nextcloud/initial-state' | |||
const hasPdf = loadState('settings', 'has-reasons-use-nextcloud-pdf') === true | |||
window.addEventListener('DOMContentLoaded', function() { | |||
const link = document.getElementById('open-reasons-use-nextcloud-pdf') | |||
if (link && hasPdf) { | |||
link.addEventListener('click', function(event) { | |||
event.preventDefault() | |||
OCA.Viewer.open({ | |||
path: '/Reasons to use Nextcloud.pdf', | |||
}) | |||
}) | |||
} | |||
}) |
@@ -1,4 +1,7 @@ | |||
<div class="section"> | |||
<div class="section development-notice"> | |||
<p> | |||
<a href="<?php p($_['reasons-use-nextcloud-pdf-link']); ?>" id="open-reasons-use-nextcloud-pdf" class="link-button icon-file" target="_blank">Reasons to use Nextcloud in your organization</a> | |||
</p> | |||
<p> | |||
<?php print_unescaped(str_replace( | |||
[ |
@@ -37,7 +37,6 @@ use OCP\IRequest; | |||
use OCP\IUser; | |||
use OCP\IUserSession; | |||
use OCP\Settings\IManager; | |||
use OCP\Support\Subscription\IRegistry; | |||
use PHPUnit\Framework\MockObject\MockObject; | |||
use Test\TestCase; | |||
@@ -87,7 +86,7 @@ class AdminSettingsControllerTest extends TestCase { | |||
$this->subAdmin | |||
); | |||
$user = \OC::$server->getUserManager()->createUser($this->adminUid, 'olo'); | |||
$user = \OC::$server->getUserManager()->createUser($this->adminUid, 'mylongrandompassword'); | |||
\OC_User::setUserId($user->getUID()); | |||
\OC::$server->getGroupManager()->createGroup('admin')->addUser($user); | |||
} | |||
@@ -100,7 +99,6 @@ class AdminSettingsControllerTest extends TestCase { | |||
public function testIndex() { | |||
$user = $this->createMock(IUser::class); | |||
$registry = $this->createMock(IRegistry::class); | |||
$this->userSession | |||
->method('getUser') | |||
->willReturn($user); | |||
@@ -125,7 +123,7 @@ class AdminSettingsControllerTest extends TestCase { | |||
->expects($this->once()) | |||
->method('getAdminSettings') | |||
->with('test') | |||
->willReturn([5 => new ServerDevNotice($registry)]); | |||
->willReturn([5 => $this->createMock(ServerDevNotice::class)]); | |||
$idx = $this->adminSettingsController->index('test'); | |||
@@ -5,7 +5,8 @@ module.exports = { | |||
'settings-apps-users-management': path.join(__dirname, 'src', 'main-apps-users-management'), | |||
'settings-admin-security': path.join(__dirname, 'src', 'main-admin-security'), | |||
'settings-personal-security': path.join(__dirname, 'src', 'main-personal-security'), | |||
'settings-personal-webauthn': path.join(__dirname, 'src', 'main-personal-webauth') | |||
'settings-personal-webauthn': path.join(__dirname, 'src', 'main-personal-webauth'), | |||
'settings-nextcloud-pdf': path.join(__dirname, 'src', 'main-nextcloud-pdf'), | |||
}, | |||
output: { | |||
path: path.resolve(__dirname, './js'), |