parent
ab266a7798
commit
7781779770
@ -0,0 +1,12 @@ |
||||
{ |
||||
"presets": [ |
||||
[ |
||||
"env", |
||||
{ |
||||
"targets": { |
||||
"browsers": ["last 2 versions", "not ie <= 11"] |
||||
} |
||||
} |
||||
] |
||||
] |
||||
} |
@ -0,0 +1,9 @@ |
||||
root = true |
||||
|
||||
[*] |
||||
charset = utf-8 |
||||
indent_style = tab |
||||
indent_size = 4 |
||||
end_of_line = lf |
||||
insert_final_newline = true |
||||
trim_trailing_whitespace = true |
@ -0,0 +1,16 @@ |
||||
module.exports = { |
||||
env: { |
||||
browser: true, |
||||
es6: true |
||||
}, |
||||
extends: 'eslint:recommended', |
||||
parserOptions: { |
||||
sourceType: 'module' |
||||
}, |
||||
rules: { |
||||
indent: ['error', 'tab'], |
||||
'linebreak-style': ['error', 'unix'], |
||||
quotes: ['error', 'single'], |
||||
semi: ['error', 'always'] |
||||
} |
||||
}; |
@ -0,0 +1,12 @@ |
||||
.DS_Store |
||||
node_modules/ |
||||
dist/ |
||||
npm-debug.log |
||||
yarn-error.log |
||||
|
||||
# Editor directories and files |
||||
.idea |
||||
*.suo |
||||
*.ntvs* |
||||
*.njsproj |
||||
*.sln |
@ -0,0 +1,3 @@ |
||||
{ |
||||
"esversion": 6 |
||||
} |
@ -0,0 +1,26 @@ |
||||
all: dev-setup build-js-production |
||||
|
||||
dev-setup: clean clean-dev npm-init |
||||
|
||||
npm-init: |
||||
npm install
|
||||
|
||||
npm-update: |
||||
npm update
|
||||
|
||||
build-js: |
||||
npm run dev
|
||||
|
||||
build-js-production: |
||||
npm run build
|
||||
|
||||
watch-js: |
||||
npm run watch
|
||||
|
||||
clean: |
||||
rm -f js/accessibility.js
|
||||
rm -f js/accessibility.js.map
|
||||
|
||||
clean-dev: |
||||
rm -rf node_modules
|
||||
|
@ -0,0 +1,22 @@ |
||||
# Accessibility ♿ |
||||
|
||||
> This app provide multiple features to ease the use of nextcloud. |
||||
|
||||
## Build Setup |
||||
|
||||
``` bash |
||||
# install dependencies |
||||
make dev-setup |
||||
|
||||
# build for development |
||||
make build-js |
||||
|
||||
# build for development and watch edits |
||||
make watch-js |
||||
|
||||
# build for production with minification |
||||
make build-js-production |
||||
|
||||
# clean output files |
||||
make clean |
||||
``` |
@ -0,0 +1,24 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2018 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/>. |
||||
* |
||||
*/ |
||||
|
||||
$app = new \OCA\Accessibility\AppInfo\Application(); |
@ -0,0 +1,22 @@ |
||||
<?xml version="1.0"?> |
||||
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> |
||||
<id>accessibility</id> |
||||
<name>Accessibility</name> |
||||
<summary>Accessibility options for nextcloud</summary> |
||||
<description><![CDATA[Provides multiple accessibilities options to ease your use of nextcloud]]></description> |
||||
<version>1.0.0</version> |
||||
<licence>agpl</licence> |
||||
<author>John Molakvoæ</author> |
||||
<namespace>Accessibility</namespace> |
||||
<category>accessibility</category> |
||||
<dependencies> |
||||
<nextcloud min-version="14" max-version="14"/> |
||||
</dependencies> |
||||
<default_enable/> |
||||
<bugs>https://github.com/nextcloud/server/issues</bugs> |
||||
<settings> |
||||
<personal>OCA\Accessibility\Settings\Personal</personal> |
||||
<personal-section>OCA\Accessibility\Settings\PersonalSection</personal-section> |
||||
</settings> |
||||
</info> |
@ -0,0 +1,28 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2018 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/>. |
||||
* |
||||
*/ |
||||
|
||||
return [ |
||||
'routes' => [ |
||||
['name' => 'accessibility#getCss', 'url' => '/css/user.css', 'verb' => 'GET'], |
||||
], |
||||
]; |
@ -0,0 +1,14 @@ |
||||
// Revert lighten/darken |
||||
@function nc-darken($color, $value) { |
||||
@return lighten($color, $value); |
||||
} |
||||
|
||||
@function nc-lighten($color, $value) { |
||||
@return darken($color, $value); |
||||
} |
||||
|
||||
// SCSS variables |
||||
$color-main-text: #d8d8d8; |
||||
$color-main-background: #181818; |
||||
$color-loading-light: #777; |
||||
$color-loading-dark: #ccc; |
@ -0,0 +1,15 @@ |
||||
@font-face { |
||||
font-family: 'OpenDyslexic'; |
||||
font-style: normal; |
||||
font-weight: 300; |
||||
src: url('../fonts/OpenDyslexic-Regular.woff') format('woff'); |
||||
} |
||||
|
||||
@font-face { |
||||
font-family: 'OpenDyslexic'; |
||||
font-style: normal; |
||||
font-weight: 600; |
||||
src: url('../fonts/OpenDyslexic-Bold.woff') format('woff'); |
||||
} |
||||
|
||||
$font-face: OpenDyslexic, 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif; |
@ -0,0 +1,39 @@ |
||||
.preview-list { |
||||
display: flex; |
||||
} |
||||
.preview { |
||||
display: flex; |
||||
flex-direction: column; |
||||
width: 300px; |
||||
border: 1px solid var(--color-border); |
||||
padding: 10px; |
||||
border-radius: var(--border-radius); |
||||
transition: all 200ms ease-in-out; |
||||
filter: drop-shadow(0 1px 2px var(--color-box-shadow)); |
||||
background-color: var(--color-main-background); |
||||
opacity: 0.9; |
||||
&:not(:last-child) { |
||||
margin-right: 20px; |
||||
} |
||||
&, |
||||
* { |
||||
cursor: pointer; |
||||
user-select: none; |
||||
} |
||||
&:hover, |
||||
&.selected { |
||||
background-color: var(--color-background-dark); |
||||
filter: drop-shadow(0 1px 4px var(--color-box-shadow)); |
||||
opacity: 1; |
||||
} |
||||
.preview-image { |
||||
width: 100%; |
||||
height: 150px; |
||||
background-position: center; |
||||
background-size: cover; |
||||
background-repeat: no-repeat; |
||||
} |
||||
p { |
||||
text-align: justify; |
||||
} |
||||
} |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 65 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 34 KiB |
@ -0,0 +1,83 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* @copyright Copyright (c) 2018 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/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Accessibility; |
||||
|
||||
use OCP\IL10N; |
||||
use OCP\IURLGenerator; |
||||
|
||||
class AccessibilityProvider { |
||||
|
||||
/** @var string */ |
||||
protected $appName; |
||||
|
||||
/** @var IURLGenerator */ |
||||
private $urlGenerator; |
||||
|
||||
/** @var IL10N */ |
||||
private $l; |
||||
|
||||
/** |
||||
* Account constructor. |
||||
* |
||||
* @param string $appName |
||||
* @param IURLGenerator $urlGenerator |
||||
* @param IL10N $l |
||||
*/ |
||||
public function __construct(string $appName, |
||||
IURLGenerator $urlGenerator, |
||||
IL10N $l) { |
||||
$this->appName = $appName; |
||||
$this->urlGenerator = $urlGenerator; |
||||
$this->l = $l; |
||||
} |
||||
|
||||
public function getThemes() { |
||||
return array( |
||||
[ |
||||
'id' => 'highcontrast', |
||||
'img' => $this->urlGenerator->imagePath($this->appName, 'theme-highcontrast.jpg'), |
||||
'title' => $this->l->t('High Contrast theme'), |
||||
'text' => $this->l->t('A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased.') |
||||
], [ |
||||
'id' => 'dark', |
||||
'img' => $this->urlGenerator->imagePath($this->appName, 'theme-dark.jpg'), |
||||
'title' => $this->l->t('Dark theme'), |
||||
'text' => $this->l->t('A dark theme to ease your eyes by reducing the overall luminosity and brightness of your navigation. This is suitable for people who use computes a lot or in low luminosity spaces.') |
||||
] |
||||
); |
||||
} |
||||
|
||||
public function getFonts() { |
||||
return array( |
||||
[ |
||||
'id' => 'dyslexic', |
||||
'img' => $this->urlGenerator->imagePath($this->appName, 'font-opendyslexic.jpg'), |
||||
'title' => $this->l->t('Dyslexia font'), |
||||
'text' => $this->l->t('OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia. The typeface was created by Abelardo Gonzalez, who released it through an open-source license.') |
||||
] |
||||
); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,39 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2018 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/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Accessibility\AppInfo; |
||||
|
||||
use OCP\AppFramework\App; |
||||
|
||||
class Application extends App { |
||||
|
||||
/** @var string */ |
||||
protected $appName = 'accessibility'; |
||||
|
||||
public function __construct() { |
||||
parent::__construct($this->appName); |
||||
|
||||
// Inject the fake css on all pages |
||||
\OCP\Util::addStyle('accessibility', 'user', true); |
||||
} |
||||
} |
@ -0,0 +1,168 @@ |
||||
<?php |
||||
declare (strict_types = 1); |
||||
/** |
||||
* @copyright Copyright (c) 2018 John Molakvoæ (skjnldsv) <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/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Accessibility\Controller; |
||||
|
||||
use Leafo\ScssPhp\Compiler; |
||||
use Leafo\ScssPhp\Exception\ParserException; |
||||
use Leafo\ScssPhp\Formatter\Crunched; |
||||
use OCP\AppFramework\Controller; |
||||
use OCP\AppFramework\Http; |
||||
use OCP\AppFramework\Http\DataDisplayResponse; |
||||
use OCP\AppFramework\Utility\ITimeFactory; |
||||
use OCP\IConfig; |
||||
use OCP\ILogger; |
||||
use OCP\IRequest; |
||||
use OCP\IURLGenerator; |
||||
use OCP\IUserManager; |
||||
use OCP\IUserSession; |
||||
|
||||
class AccessibilityController extends Controller { |
||||
|
||||
/** @var string */ |
||||
protected $appName; |
||||
|
||||
/** @var string */ |
||||
protected $serverRoot; |
||||
|
||||
/** @var IConfig */ |
||||
private $config; |
||||
|
||||
/** @var IUserManager */ |
||||
private $userManager; |
||||
|
||||
/** @var ILogger */ |
||||
private $logger; |
||||
|
||||
/** @var IURLGenerator */ |
||||
private $urlGenerator; |
||||
|
||||
/** @var ITimeFactory */ |
||||
protected $timeFactory; |
||||
|
||||
/** @var IUserSession */ |
||||
private $userSession; |
||||
|
||||
/** |
||||
* Account constructor. |
||||
* |
||||
* @param string $appName |
||||
* @param IRequest $request |
||||
* @param IConfig $config |
||||
* @param IUserManager $userManager |
||||
* @param ILogger $logger |
||||
* @param IURLGenerator $urlGenerator |
||||
* @param ITimeFactory $timeFactory |
||||
* @param IUserSession $userSession |
||||
*/ |
||||
public function __construct(string $appName, |
||||
IRequest $request, |
||||
IConfig $config, |
||||
IUserManager $userManager, |
||||
ILogger $logger, |
||||
IURLGenerator $urlGenerator, |
||||
ITimeFactory $timeFactory, |
||||
IUserSession $userSession) { |
||||
parent::__construct($appName, $request); |
||||
$this->config = $config; |
||||
$this->userManager = $userManager; |
||||
$this->logger = $logger; |
||||
$this->urlGenerator = $urlGenerator; |
||||
$this->timeFactory = $timeFactory; |
||||
$this->userSession = $userSession; |
||||
|
||||
$this->serverRoot = \OC::$SERVERROOT; |
||||
$this->appRoot = \OC_App::getAppPath($this->appName); |
||||
} |
||||
|
||||
/** |
||||
* @NoAdminRequired |
||||
* @NoCSRFRequired |
||||
* |
||||
* @return DataResponse |
||||
*/ |
||||
public function getCss(): DataDisplayResponse { |
||||
|
||||
$css = ''; |
||||
$imports = ''; |
||||
|
||||
foreach ($this->getUserValues() as $scssFile) { |
||||
if ($scssFile !== false) { |
||||
$imports .= '@import "' . $scssFile . '";'; |
||||
} |
||||
} |
||||
|
||||
if ($imports !== '') { |
||||
$scss = new Compiler(); |
||||
$scss->setImportPaths([ |
||||
$this->appRoot . '/css/', |
||||
$this->serverRoot . '/core/css/' |
||||
]); |
||||
|
||||
// Continue after throw |
||||
$scss->setIgnoreErrors(true); |
||||
$scss->setFormatter(Crunched::class); |
||||
|
||||
// Compile |
||||
try { |
||||
$css .= $scss->compile( |
||||
$imports . |
||||
'@import "variables.scss";' . |
||||
'@import "css-variables.scss";' |
||||
); |
||||
} catch (ParserException $e) { |
||||
$this->logger->error($e->getMessage(), ['app' => 'core']); |
||||
} |
||||
} |
||||
|
||||
// We don't want to override vars with url since path is different |
||||
$css = $this->filterOutRule('/--[a-z-:]+url\([^;]+\)/mi', $css); |
||||
|
||||
$response = new DataDisplayResponse($css, Http::STATUS_OK, ['Content-Type' => 'text/css']); |
||||
|
||||
$ttl = 31536000; |
||||
$response->addHeader('Cache-Control', 'max-age=' . $ttl . ', immutable'); |
||||
|
||||
$expires = new \DateTime(); |
||||
$expires->setTimestamp($this->timeFactory->getTime()); |
||||
$expires->add(new \DateInterval('PT' . $ttl . 'S')); |
||||
$response->addHeader('Expires', $expires->format(\DateTime::RFC1123)); |
||||
$response->addHeader('Pragma', 'cache'); |
||||
|
||||
return $response; |
||||
} |
||||
|
||||
private function getUserValues() { |
||||
$userTheme = $this->config->getUserValue($this->userSession->getUser()->getUID(), 'accessibility', 'theme', false); |
||||
$userFont = $this->config->getUserValue($this->userSession->getUser()->getUID(), 'accessibility', 'font', false); |
||||
|
||||
return [ |
||||
'theme' => $userTheme, |
||||
'font' => $userFont |
||||
]; |
||||
} |
||||
|
||||
private function filterOutRule(string $rule, string $css) { |
||||
return preg_replace($rule, '', $css); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,113 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2018 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/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Accessibility\Settings; |
||||
|
||||
use OCA\Accessibility\AccessibilityProvider; |
||||
use OCP\AppFramework\Http\TemplateResponse; |
||||
use OCP\IConfig; |
||||
use OCP\IL10N; |
||||
use OCP\IURLGenerator; |
||||
use OCP\IUserSession; |
||||
use OCP\Settings\ISettings; |
||||
|
||||
class Personal implements ISettings { |
||||
|
||||
/** @var string */ |
||||
protected $appName; |
||||
|
||||
/** @var IConfig */ |
||||
private $config; |
||||
|
||||
/** @var IUserSession */ |
||||
private $userSession; |
||||
|
||||
/** @var IL10N */ |
||||
private $l; |
||||
|
||||
/** @var IURLGenerator */ |
||||
private $urlGenerator; |
||||
|
||||
/** @var AccessibilityProvider */ |
||||
private $accessibilityProvider; |
||||
|
||||
/** |
||||
* Settings constructor. |
||||
* |
||||
* @param string $appName |
||||
* @param IConfig $config |
||||
* @param IUserSession $userSession |
||||
* @param IL10N $l |
||||
* @param IURLGenerator $urlGenerator |
||||
* @param AccessibilityProvider $accessibilityProvider |
||||
*/ |
||||
public function __construct(string $appName, |
||||
IConfig $config, |
||||
IUserSession $userSession, |
||||
IL10N $l, |
||||
IURLGenerator $urlGenerator, |
||||
AccessibilityProvider $accessibilityProvider) { |
||||
$this->appName = $appName; |
||||
$this->config = $config; |
||||
$this->userSession = $userSession; |
||||
$this->l = $l; |
||||
$this->urlGenerator = $urlGenerator; |
||||
$this->accessibilityProvider = $accessibilityProvider; |
||||
} |
||||
|
||||
/** |
||||
* @return TemplateResponse returns the instance with all parameters set, ready to be rendered |
||||
* @since 9.1 |
||||
*/ |
||||
public function getForm() { |
||||
|
||||
$serverData = [ |
||||
'themes' => $this->accessibilityProvider->getThemes(), |
||||
'fonts' => $this->accessibilityProvider->getFonts(), |
||||
'theme' => $this->config->getUserValue($this->userSession->getUser()->getUID(), 'accessibility', 'theme', 'dark'), |
||||
'font' => $this->config->getUserValue($this->userSession->getUser()->getUID(), 'accessibility', 'font', false) |
||||
]; |
||||
|
||||
return new TemplateResponse('accessibility', 'settings-personal', ['serverData' => $serverData]); |
||||
} |
||||
|
||||
/** |
||||
* @return string the section ID, e.g. 'sharing' |
||||
* @since 9.1 |
||||
*/ |
||||
public function getSection() { |
||||
return 'accessibility'; |
||||
} |
||||
|
||||
/** |
||||
* @return int whether the form should be rather on the top or bottom of |
||||
* the admin section. The forms are arranged in ascending order of the |
||||
* priority values. It is required to return a value between 0 and 100. |
||||
* |
||||
* E.g.: 70 |
||||
* @since 9.1 |
||||
*/ |
||||
public function getPriority() { |
||||
return 40; |
||||
} |
||||
} |
@ -0,0 +1,94 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2018 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/>. |
||||
* |
||||
*/ |
||||
|
||||
namespace OCA\Accessibility\Settings; |
||||
|
||||
use OCP\IL10N; |
||||
use OCP\IURLGenerator; |
||||
use OCP\Settings\IIconSection; |
||||
|
||||
class PersonalSection implements IIconSection { |
||||
|
||||
/** @var IURLGenerator */ |
||||
private $urlGenerator; |
||||
|
||||
/** @var IL10N */ |
||||
private $l; |
||||
|
||||
/** |
||||
* Personal Section constructor. |
||||
* |
||||
* @param IURLGenerator $urlGenerator |
||||
* @param IL10N $l |
||||
*/ |
||||
public function __construct(IURLGenerator $urlGenerator, |
||||
IL10N $l) { |
||||
$this->urlGenerator = $urlGenerator; |
||||
$this->l = $l; |
||||
} |
||||
|
||||
/** |
||||
* returns the relative path to an 16*16 icon describing the section. |
||||
* e.g. '/core/img/places/files.svg' |
||||
* |
||||
* @returns string |
||||
* @since 13.0.0 |
||||
*/ |
||||
public function getIcon() { |
||||
return $this->urlGenerator->imagePath('accessibility', 'app-dark.svg'); |
||||
} |
||||
|
||||
/** |
||||
* returns the ID of the section. It is supposed to be a lower case string, |
||||
* e.g. 'ldap' |
||||
* |
||||
* @returns string |
||||
* @since 9.1 |
||||
*/ |
||||
public function getID() { |
||||
return 'accessibility'; |
||||
} |
||||
|
||||
/** |
||||
* returns the translated name as it should be displayed, e.g. 'LDAP / AD |
||||
* integration'. Use the L10N service to translate it. |
||||
* |
||||
* @return string |
||||
* @since 9.1 |
||||
*/ |
||||
public function getName() { |
||||
return $this->l->t('Accessibility'); |
||||
} |
||||
|
||||
/** |
||||
* @return int whether the form should be rather on the top or bottom of |
||||
* the settings navigation. The sections are arranged in ascending order of |
||||
* the priority values. It is required to return a value between 0 and 99. |
||||
* |
||||
* E.g.: 70 |
||||
* @since 9.1 |
||||
*/ |
||||
public function getPriority() { |
||||
return 15; |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,36 @@ |
||||
{ |
||||
"name": "accessibility", |
||||
"description": "Provides multiple accessibilities options to ease your use of nextcloud", |
||||
"version": "1.0.0", |
||||
"author": "John Molakvoæ <skjnldsv@protonmail.com>", |
||||
"license": "agpl", |
||||
"private": true, |
||||
"scripts": { |
||||
"dev": "webpack --config webpack.dev.js", |
||||
"watch": "webpack --progress --watch --config webpack.dev.js", |
||||
"build": "webpack --progress --hide-modules --config webpack.prod.js" |
||||
}, |
||||
"dependencies": { |
||||
"@babel/core": "^7.0.0-beta.51", |
||||
"@babel/preset-env": "^7.0.0-beta.51", |
||||
"vue": "^2.5.16" |
||||
}, |
||||
"browserslist": [ |
||||
"last 2 versions", |
||||
"not ie <= 11" |
||||
], |
||||
"devDependencies": { |
||||
"babel-core": "^6.26.3", |
||||
"babel-loader": "^8.0.0-beta.3", |
||||
"babel-preset-env": "^1.7.0", |
||||
"css-loader": "^0.28.11", |
||||
"file-loader": "^1.1.11", |
||||
"node-sass": "^4.9.0", |
||||
"sass-loader": "^7.0.3", |
||||
"vue-loader": "^15.2.4", |
||||
"vue-template-compiler": "^2.5.16", |
||||
"webpack": "^4.12.0", |
||||
"webpack-cli": "^3.0.4", |
||||
"webpack-merge": "^4.1.2" |
||||
} |
||||
} |
@ -0,0 +1,76 @@ |
||||
<template> |
||||
<div id="accessibility"> |
||||
<div id="themes" class="section"> |
||||
<h2>{{t('accessibility', 'Themes')}}</h2> |
||||
<div class="themes-list preview-list"> |
||||
<preview v-for="preview in themes" :preview="preview" |
||||
:key="preview.id" :selected="selected.theme" |
||||
v-on:select="selectTheme"></preview> |
||||
</div> |
||||
</div> |
||||
<div id="fonts" class="section"> |
||||
<h2>{{t('accessibility', 'Fonts')}}</h2> |
||||
<div class="fonts-list preview-list"> |
||||
<preview v-for="preview in fonts" :preview="preview" |
||||
:key="preview.id" :selected="selected.font" |
||||
v-on:select="selectFont"></preview> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
import preview from './components/itemPreview'; |
||||
|
||||
export default { |
||||
name: 'app', |
||||
components: { preview }, |
||||
beforeMount() { |
||||
// importing server data into the app |
||||
const serverDataElmt = document.getElementById('serverData'); |
||||
if (serverDataElmt !== null) { |
||||
this.serverData = JSON.parse( |
||||
document.getElementById('serverData').dataset.server |
||||
); |
||||
} |
||||
}, |
||||
data() { |
||||
return { |
||||
serverData: [] |
||||
}; |
||||
}, |
||||
computed: { |
||||
themes() { |
||||
return this.serverData.themes; |
||||
}, |
||||
fonts() { |
||||
return this.serverData.fonts; |
||||
}, |
||||
selected() { |
||||
return { |
||||
theme: this.serverData.theme, |
||||
font: this.serverData.font |
||||
}; |
||||
} |
||||
}, |
||||
methods: { |
||||
selectTheme(id) { |
||||
this.selectItem('theme', id); |
||||
}, |
||||
selectFont(id) { |
||||
this.selectItem('font', id); |
||||
}, |
||||
|
||||
/** |
||||
* Commit a change |
||||
* |
||||
* @param {string} type type of the change (font or theme) |
||||
* @param {string} id the data of the change |
||||
*/ |
||||
selectItem(type, id) { |
||||
this.serverData[type] = id; |
||||
console.log(type, id); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,24 @@ |
||||
<template> |
||||
<div :class="{preview: true, selected: preview.id === selected}" |
||||
@click="selectItem"> |
||||
<div class="preview-image" :style="{backgroundImage: 'url(' + preview.img + ')'}"></div> |
||||
<h3>{{preview.title}}</h3> |
||||
<p>{{preview.text}}</p> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'itemPreview', |
||||
props: ['preview', 'selected'], |
||||
methods: { |
||||
selectItem() { |
||||
this.$emit( |
||||
'select', |
||||
// if we clicked the already selected one: disable it |
||||
this.preview.id === this.selected ? false : this.preview.id |
||||
); |
||||
} |
||||
} |
||||
}; |
||||
</script> |
@ -0,0 +1,11 @@ |
||||
import Vue from 'vue'; |
||||
import App from './App.vue'; |
||||
|
||||
/* global t */ |
||||
// bind to window
|
||||
Vue.prototype.t = t; |
||||
|
||||
new Vue({ |
||||
el: '#accessibility', |
||||
render: h => h(App) |
||||
}); |
@ -0,0 +1,29 @@ |
||||
<?php |
||||
/** |
||||
* @copyright Copyright (c) 2018 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/>. |
||||
* |
||||
*/ |
||||
|
||||
script('accessibility', 'accessibility'); |
||||
style('accessibility', 'style'); |
||||
?> |
||||
|
||||
<span id="serverData" data-server="<?php p(json_encode($_['serverData']));?>"></span>
|
||||
<span id="accessibility"></span> |
@ -0,0 +1,46 @@ |
||||
const path = require('path'); |
||||
const { VueLoaderPlugin } = require(`vue-loader`); |
||||
|
||||
module.exports = { |
||||
entry: path.join(__dirname, `src`, `main.js`), |
||||
output: { |
||||
path: path.resolve(__dirname, './js'), |
||||
publicPath: '/js/', |
||||
filename: 'accessibility.js' |
||||
}, |
||||
module: { |
||||
rules: [ |
||||
{ |
||||
test: /\.css$/, |
||||
use: ['vue-style-loader', 'css-loader'] |
||||
}, |
||||
{ |
||||
test: /\.scss$/, |
||||
use: ['vue-style-loader', 'css-loader', 'sass-loader'] |
||||
}, |
||||
{ |
||||
test: /\.vue$/, |
||||
loader: 'vue-loader' |
||||
}, |
||||
{ |
||||
test: /\.js$/, |
||||
loader: 'babel-loader', |
||||
exclude: /node_modules/ |
||||
}, |
||||
{ |
||||
test: /\.(png|jpg|gif|svg)$/, |
||||
loader: 'file-loader', |
||||
options: { |
||||
name: '[name].[ext]?[hash]' |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
plugins: [new VueLoaderPlugin()], |
||||
resolve: { |
||||
alias: { |
||||
vue$: 'vue/dist/vue.esm.js' |
||||
}, |
||||
extensions: ['*', '.js', '.vue', '.json'] |
||||
} |
||||
}; |
@ -0,0 +1,12 @@ |
||||
const merge = require('webpack-merge'); |
||||
const common = require('./webpack.common.js'); |
||||
|
||||
module.exports = merge(common, { |
||||
mode: 'development', |
||||
devServer: { |
||||
historyApiFallback: true, |
||||
noInfo: true, |
||||
overlay: true |
||||
}, |
||||
devtool: '#eval-source-map' |
||||
}); |
@ -0,0 +1,7 @@ |
||||
const merge = require('webpack-merge'); |
||||
const common = require('./webpack.common.js'); |
||||
|
||||
module.exports = merge(common, { |
||||
mode: 'production', |
||||
devtool: '#source-map' |
||||
}); |
Loading…
Reference in new issue