parent
1e043d5a24
commit
4ec0afd0e7
@ -0,0 +1,63 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net> |
||||
* |
||||
* @author Julius Härtl <jus@bitgrid.net> |
||||
* |
||||
* @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/>. |
||||
* |
||||
*/ |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
|
||||
namespace OCA\Dashboard\Controller; |
||||
|
||||
use OCP\AppFramework\Http\JSONResponse; |
||||
use OCP\AppFramework\OCSController; |
||||
use OCP\IConfig; |
||||
use OCP\IRequest; |
||||
|
||||
class LayoutApiController extends OCSController { |
||||
|
||||
/** @var IConfig */ |
||||
private $config; |
||||
/** @var string */ |
||||
private $userId; |
||||
|
||||
public function __construct( |
||||
string $appName, |
||||
IRequest $request, |
||||
IConfig $config, |
||||
$userId |
||||
) { |
||||
parent::__construct($appName, $request); |
||||
|
||||
$this->config = $config; |
||||
$this->userId = $userId; |
||||
} |
||||
|
||||
/** |
||||
* @NoAdminRequired |
||||
* |
||||
* @param string $layout |
||||
* @return JSONResponse |
||||
*/ |
||||
public function create(string $layout): JSONResponse { |
||||
$this->config->setUserValue($this->userId, 'dashboard', 'layout', $layout); |
||||
return new JSONResponse(['layout' => $layout]); |
||||
} |
||||
} |
||||
@ -0,0 +1,99 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net> |
||||
* |
||||
* @author Julius Härtl <jus@bitgrid.net> |
||||
* |
||||
* @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/>. |
||||
* |
||||
*/ |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
|
||||
namespace OCA\Dashboard\Service; |
||||
|
||||
|
||||
use OCP\Files\File; |
||||
use OCP\Files\IAppData; |
||||
use OCP\Files\IRootFolder; |
||||
use OCP\Files\NotFoundException; |
||||
use OCP\Files\SimpleFS\ISimpleFile; |
||||
|
||||
class BackgroundService { |
||||
|
||||
const SHIPPED_BACKGROUNDS = [ |
||||
'anatoly-mikhaltsov-butterfly-wing-scale-5k.jpg', |
||||
'bernie-cetonia-aurata-take-off-composition-8k.jpg', |
||||
'eduardo-neves-pedra-azul-5k.jpg', |
||||
'europeanspaceagency-baltic-blooms-6k.jpg', |
||||
'europeanspaceagency-barents-bloom-2k.jpg', |
||||
'europeanspaceagency-colourful-queensland-6k.jpg', |
||||
'europeanspaceagency-namib-desert-6k.jpg', |
||||
'europeanspaceagency-peruvian-andes-6k.jpg', |
||||
'flickr-148302424@N05-36591009215.jpg', |
||||
'flickr-andymag-26451722126.jpg', |
||||
'flickr-angietrenz-24259359268.jpg', |
||||
'flickr-coconut-cove-mixed-2k.jpg', |
||||
'flickr-dejankrsmanovic-42971456774.jpg', |
||||
'flickr-paszczak000-8715851521.jpg', |
||||
'flickr-xomeox-sewage-3k.jpg', |
||||
'flickr-zalexandra-7948897538.jpg', |
||||
'hannes-fritz-flippity-floppity-4k.jpg', |
||||
'hannes-fritz-parkour-4k.jpg', |
||||
'hannes-fritz-roulette-4k.jpg', |
||||
'hannes-fritz-sea-spray-6k.jpg', |
||||
'insa-wulf-radial-4k.jpg', |
||||
'microcosmos-lab-microcrystals-5k.jpg', |
||||
'nasa-goddard-antarctica-melts-6k.jpg', |
||||
'nasa-goddard-iceberg-greenland-4k.jpg', |
||||
'pexels-snapwire-forest-4k-cc0.jpg', |
||||
'yana-sichikova-sergey-ovachev-stone-flower-2k.jpg', |
||||
]; |
||||
|
||||
public function __construct(IRootFolder $rootFolder, IAppData $appData, $userId) { |
||||
$this->userFolder = $rootFolder->getUserFolder($userId); |
||||
try { |
||||
$this->dashboardUserFolder = $appData->getFolder($userId); |
||||
} catch (NotFoundException $e) { |
||||
$this->dashboardUserFolder = $appData->newFolder($userId); |
||||
} |
||||
} |
||||
|
||||
public function setFileBackground($path) { |
||||
$file = $this->userFolder->get($path); |
||||
$newFile = $this->dashboardUserFolder->newFile('background.jpg', $file->fopen('r')); |
||||
} |
||||
|
||||
public function setUrlBackground($url) { |
||||
if (substr($url, 0, 1) === '/') { |
||||
$url = \OC::$server->getURLGenerator()->getAbsoluteURL($url); |
||||
} |
||||
|
||||
$client = \OC::$server->getHTTPClientService()->newClient(); |
||||
$response = $client->get($url); |
||||
$content = $response->getBody(); |
||||
$newFile = $this->dashboardUserFolder->newFile('background.jpg', $content); |
||||
} |
||||
|
||||
/** |
||||
* @throws NotFoundException |
||||
*/ |
||||
public function getBackground(): ISimpleFile { |
||||
return $this->dashboardUserFolder->getFile('background.jpg'); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,127 @@ |
||||
<!-- |
||||
- @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net> |
||||
- |
||||
- @author Julius Härtl <jus@bitgrid.net> |
||||
- |
||||
- @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> |
||||
<div class="background-selector"> |
||||
<div v-if="loading">Loading</div> |
||||
<div v-for="background in shippedBackgrounds" |
||||
:key="background" |
||||
class="background" |
||||
@click="setUrl(background)"> |
||||
<img :src="background"> |
||||
</div> |
||||
<div class="background" @click="pickFile"> |
||||
<a> |
||||
{{ t('dashboard', 'Pick an image from your files') }} |
||||
</a> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import axios from '@nextcloud/axios' |
||||
import { generateUrl, generateFilePath } from '@nextcloud/router' |
||||
import { loadState } from '@nextcloud/initial-state' |
||||
|
||||
const prefixWithBaseUrl = (url) => generateFilePath('dashboard', '', 'img/') + url |
||||
const shippedBackgroundList = loadState('dashboard', 'shippedBackgrounds') |
||||
|
||||
export default { |
||||
name: 'BackgroundSettings', |
||||
data() { |
||||
return { |
||||
backgroundImage: generateUrl('/apps/dashboard/background') + '?v=' + Date.now(), |
||||
loading: false, |
||||
} |
||||
}, |
||||
computed: { |
||||
shippedBackgrounds() { |
||||
return shippedBackgroundList.map((item) => { |
||||
return prefixWithBaseUrl(item) |
||||
}) |
||||
}, |
||||
}, |
||||
methods: { |
||||
async update() { |
||||
const date = Date.now() |
||||
this.backgroundImage = generateUrl('/apps/dashboard/background') + '?v=' + date |
||||
const image = new Image() |
||||
image.onload = () => { |
||||
this.$emit('updateBackground', date) |
||||
this.loading = false |
||||
} |
||||
image.src = this.backgroundImage |
||||
}, |
||||
setDefault() { |
||||
console.debug('SetDefault') |
||||
this.update() |
||||
}, |
||||
async setUrl(url) { |
||||
this.loading = true |
||||
console.debug('SetUrl ' + url) |
||||
await axios.post(generateUrl('/apps/dashboard/background'), { url }) |
||||
this.update() |
||||
}, |
||||
async setFile(path) { |
||||
this.loading = true |
||||
console.debug('SetFile ' + path) |
||||
await axios.post(generateUrl('/apps/dashboard/background'), { path }) |
||||
this.update() |
||||
}, |
||||
pickFile() { |
||||
window.OC.dialogs.filepicker(t('dashboard', 'Insert from {productName}', { productName: OC.theme.name }), (path, type) => { |
||||
if (type === OC.dialogs.FILEPICKER_TYPE_CHOOSE) { |
||||
this.setFile(path) |
||||
} |
||||
}, false, ['image/png', 'image/gif', 'image/jpeg', 'image/svg'], true, OC.dialogs.FILEPICKER_TYPE_CHOOSE) |
||||
}, |
||||
}, |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="scss"> |
||||
|
||||
.background-selector { |
||||
display: flex; |
||||
flex-wrap: wrap; |
||||
|
||||
.background { |
||||
width: 140px; |
||||
padding: 15px; |
||||
border-radius: var(--border-radius); |
||||
text-align: center; |
||||
|
||||
&.current { |
||||
background-image: var(--color-background-dark); |
||||
} |
||||
|
||||
& img { |
||||
width: 140px; |
||||
} |
||||
|
||||
&:hover { |
||||
background-color: var(--color-background-hover); |
||||
} |
||||
} |
||||
} |
||||
|
||||
</style> |
||||
Loading…
Reference in new issue