Compare commits
No commits in common. "main" and "0.1.0-rc.0" have entirely different histories.
main
...
0.1.0-rc.0
1117
LICENSE.md
1117
LICENSE.md
File diff suppressed because it is too large
Load Diff
12
README.md
12
README.md
@ -4,15 +4,3 @@ A plugin to add more pride flags to your Nextcloud!
|
||||
|
||||
The app supports setting pride-flags for various UI elements of your
|
||||
Nextcloud per-user, in the user settings section.
|
||||
|
||||
![Nextcloud showing various elements in pan, trans, lesbian and rainbow pride flags](img/pride_flag_variants.png)
|
||||
|
||||
## Currently supported pride flags
|
||||
|
||||
- 'rainbow' pride flag
|
||||
- trans pride flag
|
||||
- pansexual pride flag
|
||||
- non-binary pride flag
|
||||
- bisexual pride flag
|
||||
- asexual pride flag
|
||||
- lesbian pride flag
|
||||
|
@ -13,26 +13,18 @@ Currently supported "targets":
|
||||
Currently supported pride flags:
|
||||
- Original 6 color rainbow pride flag
|
||||
- Trans pride flag
|
||||
- Pansexual pride flag
|
||||
- Non-binary pride flag
|
||||
- Bisexual pride flag
|
||||
- Asexual pride flag
|
||||
- Lesbian pride flag
|
||||
|
||||
more flags to follow soon!</description>
|
||||
<version>1.1.0</version>
|
||||
<licence>gpl3</licence>
|
||||
<version>0.1.0</version>
|
||||
<licence>cnvpl</licence>
|
||||
<author mail="transcaffeine@finally.coffee" homepage="https://github.com/finally-coffee-nextcloud-pride-flags">transcaffeine</author>
|
||||
<namespace>PrideFlags</namespace>
|
||||
<category>customization</category>
|
||||
<bugs>https://github.com/finally-coffee/nextcloud-pride-flags/issues</bugs>
|
||||
<screenshot>https://raw.githubusercontent.com/finally-coffee/nextcloud-pride-flags/main/img/pride_flag_variants.png</screenshot>
|
||||
<dependencies>
|
||||
<nextcloud min-version="26" max-version="29"/>
|
||||
</dependencies>
|
||||
<settings>
|
||||
<admin-section>OCA\PrideFlags\Settings\AdminSection</admin-section>
|
||||
<admin>OCA\PrideFlags\Settings\AdminSettings</admin>
|
||||
<personal-section>OCA\PrideFlags\Settings\PersonalSection</personal-section>
|
||||
<personal>OCA\PrideFlags\Settings\PersonalSettings</personal>
|
||||
</settings>
|
||||
|
@ -1,10 +1,8 @@
|
||||
<?php
|
||||
<?
|
||||
|
||||
return [
|
||||
'routes' => [
|
||||
['name' => 'settings#get', 'url' => '/settings', 'verb' => 'GET'],
|
||||
['name' => 'settings#set', 'url' => '/settings', 'verb' => 'POST'],
|
||||
['name' => 'settings#getGlobal', 'url' => '/settings/global', 'verb' => 'GET'],
|
||||
['name' => 'settings#setGlobal', 'url' => '/settings/global', 'verb' => 'POST'],
|
||||
]
|
||||
];
|
||||
|
@ -9,14 +9,9 @@ Currently supported "targets":
|
||||
Currently supported pride flags:
|
||||
- Original 6 color rainbow pride flag
|
||||
- Trans pride flag
|
||||
- Pansexual pride flag
|
||||
- Non-binary pride flag
|
||||
- Bisexual pride flag
|
||||
- Asexual pride flag
|
||||
- Lesbian pride flag
|
||||
|
||||
more flags to follow soon!",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"authors": [
|
||||
{
|
||||
"name": "transcaffeine",
|
||||
|
@ -14,10 +14,11 @@
|
||||
fill: var(--image-background-pride-button-gradient);
|
||||
}
|
||||
|
||||
#app-navigation ul > li.active .material-design-icon__svg,
|
||||
.button-vue--vue-primary .material-design-icon__svg,
|
||||
.preview-card__header .material-design-icon__svg,
|
||||
.profile__primary-action-button .material-design-icon__svg,
|
||||
.app-navigation-entry.active .material-design-icon__svg {
|
||||
fill: var(--color-primary-element-text);
|
||||
/*
|
||||
body {
|
||||
--image-background-pride-button: var(--image-background-pride-trans);
|
||||
--image-background-pride-folder: var(--image-background-pride-pride);
|
||||
--image-background-pride-button-gradient: var(--image-background-pride-gradient-pride);
|
||||
--image-background-pride-folder-gradient: var(--image-background-pride-gradient-trans);
|
||||
}
|
||||
*/
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 109 KiB |
@ -1,38 +0,0 @@
|
||||
(function(window) {
|
||||
const folder_selector = document.querySelectorAll('.pride_flags_server_settings .server-settings.folder-flavour select')[0];
|
||||
const button_selector = document.querySelectorAll('.pride_flags_server_settings .server-settings.button-flavour select')[0];
|
||||
const submit_button = document.querySelectorAll('.pride_flags_server_settings .settings-pride-submit');
|
||||
const container = document.querySelector('.pride_flags_server_settings .settings-section');
|
||||
|
||||
function load() {
|
||||
fetch(OC.generateUrl('/apps/pride_flags/settings/global'))
|
||||
.then(res => res.json())
|
||||
.then(({folderVariant, buttonVariant}) => {
|
||||
folder_selector.value = folderVariant;
|
||||
button_selector.value = buttonVariant;
|
||||
container.classList.remove('hidden');
|
||||
});
|
||||
}
|
||||
|
||||
function save() {
|
||||
const payload = {
|
||||
folderVariant: folder_selector.value,
|
||||
buttonVariant: button_selector.value,
|
||||
}
|
||||
fetch(OC.generateUrl('/apps/pride_flags/settings/global'), {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(payload),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"requesttoken": OC.requestToken,
|
||||
}
|
||||
}).then(response => {
|
||||
if (response.ok) {
|
||||
window.location.reload();
|
||||
}
|
||||
})
|
||||
}
|
||||
submit_button.forEach(node => node.addEventListener('click', e => save()));
|
||||
|
||||
load();
|
||||
})(window);
|
@ -1,38 +1,36 @@
|
||||
(function(window) {
|
||||
const folder_selector = document.querySelectorAll('.pride_flags_user_settings .user-settings.folder-flavour select')[0];
|
||||
const button_selector = document.querySelectorAll('.pride_flags_user_settings .user-settings.button-flavour select')[0];
|
||||
const submit_button = document.querySelectorAll('.pride_flags_user_settings .settings-pride-submit');
|
||||
const container = document.querySelector('.pride_flags_user_settings .settings-section');
|
||||
|
||||
function load() {
|
||||
fetch(OC.generateUrl('/apps/pride_flags/settings'))
|
||||
.then(res => res.json())
|
||||
.then(({folderVariant, buttonVariant}) => {
|
||||
folder_selector.value = folderVariant;
|
||||
button_selector.value = buttonVariant;
|
||||
container.classList.remove('hidden');
|
||||
});
|
||||
|
||||
const folder_selector = document.querySelectorAll('.pride_flags_user_settings .user-settings.folder-flavour select')[0];
|
||||
const button_selector = document.querySelectorAll('.pride_flags_user_settings .user-settings.button-flavour select')[0];
|
||||
const submit_button = document.querySelectorAll('.pride_flags_user_settings .settings-pride-submit');
|
||||
|
||||
function load() {
|
||||
fetch(OC.generateUrl('/apps/pride_flags/settings'))
|
||||
.then(res => res.json())
|
||||
.then(({folderVariant, buttonVariant}) => {
|
||||
folder_selector.value = folderVariant;
|
||||
button_selector.value = buttonVariant;
|
||||
});
|
||||
}
|
||||
|
||||
function save() {
|
||||
const payload = {
|
||||
folderVariant: folder_selector.value,
|
||||
buttonVariant: button_selector.value,
|
||||
}
|
||||
|
||||
function save() {
|
||||
const payload = {
|
||||
folderVariant: folder_selector.value,
|
||||
buttonVariant: button_selector.value,
|
||||
fetch(OC.generateUrl('/apps/pride_flags/settings'), {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(payload),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"requesttoken": OC.requestToken,
|
||||
}
|
||||
fetch(OC.generateUrl('/apps/pride_flags/settings'), {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(payload),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"requesttoken": OC.requestToken,
|
||||
}
|
||||
}).then(response => {
|
||||
if (response.ok) {
|
||||
window.location.reload();
|
||||
}
|
||||
})
|
||||
}
|
||||
submit_button.forEach(node => node.addEventListener('click', e => save()));
|
||||
}).then(response => {
|
||||
if (response.ok) {
|
||||
window.location.reload();
|
||||
}
|
||||
})
|
||||
}
|
||||
submit_button.forEach(node => node.addEventListener('click', e => save()));
|
||||
|
||||
load();
|
||||
})(window);
|
||||
load();
|
||||
|
21
js/pride.js
21
js/pride.js
@ -7,27 +7,6 @@ const flags = [
|
||||
id: 'trans',
|
||||
colors: ['#55CDFC', '#F7A8B8', '#FFFFFF', '#F7A8B8', '#55CDFC'],
|
||||
transform: 'rotate(90)'
|
||||
}, {
|
||||
id: 'pan',
|
||||
colors: ['#FE218C', '#FFD800', '#21B1FF'],
|
||||
transform: 'rotate(90)'
|
||||
}, {
|
||||
id: 'nonbinary',
|
||||
colors: ['#FCF434', '#FFFFFF', '#9C59D1', '#2C2C2C'],
|
||||
transform: 'rotate(90)'
|
||||
}, {
|
||||
id: 'bi',
|
||||
// colors: ['#C42A6F', '#915392', '#1437A1'],
|
||||
colors: ['#D60270', '#9B4F96', '#0038A8'],
|
||||
transform: 'rotate(90)'
|
||||
}, {
|
||||
id: 'asexual',
|
||||
colors: ['#000000', '#9F9F9F', '#FFFFFF', '#5E1984'],
|
||||
transform: 'rotate(90)'
|
||||
}, {
|
||||
id: 'lesbian',
|
||||
colors: ['#D52D00', '#EF7627', '#FF9A56', '#FFFFFF', '#D162A4', '#B55690', '#A30262'],
|
||||
transform: 'rotate(90)'
|
||||
}
|
||||
];
|
||||
|
||||
|
@ -14,35 +14,22 @@ use OCP\AppFramework\Http;
|
||||
use OCP\AppFramework\Http\JSONResponse;
|
||||
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
|
||||
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
|
||||
use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting;
|
||||
|
||||
class SettingsController extends Controller {
|
||||
|
||||
public function __construct($appName, IRequest $request, private AppSettings $appSettings, private $userId) {
|
||||
public function __construct($appName, IRequest $request, private AppSettings $appSettings) {
|
||||
parent::__construct($appName, $request);
|
||||
}
|
||||
|
||||
#[NoAdminRequired]
|
||||
#[NoCSRFRequired]
|
||||
public function get(): JSONResponse {
|
||||
return $this->makeJSONResponse(fn () => $this->appSettings->getAll($this->userId));
|
||||
return $this->makeJSONResponse(fn () => $this->appSettings->getAll());
|
||||
}
|
||||
|
||||
#[NoAdminRequired]
|
||||
public function set(string $folderVariant, string $buttonVariant): JSONResponse {
|
||||
$this->appSettings->set($this->userId, $folderVariant, $buttonVariant);
|
||||
return $this->makeJSONResponse(fn () => $this->appSettings->getAll($this->userId));
|
||||
}
|
||||
|
||||
#[AuthorizedAdminSetting]
|
||||
public function setGlobal(string $folderVariant, string $buttonVariant): JSONResponse {
|
||||
$this->appSettings->setGlobal($folderVariant, $buttonVariant);
|
||||
return $this->makeJSONResponse(fn () => $this->appSettings->getGlobal());
|
||||
}
|
||||
|
||||
#[NoCSRFRequired]
|
||||
public function getGlobal(): JSONResponse {
|
||||
return $this->makeJSONResponse(fn () => $this->appSettings->getGlobal());
|
||||
$this->appSettings->set($folderVariant, $buttonVariant);
|
||||
return $this->makeJSONResponse(fn () => $this->appSettings->getAll());
|
||||
}
|
||||
|
||||
protected function makeJSONResponse(Closure $closure): JSONResponse {
|
||||
|
@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\PrideFlags\Settings;
|
||||
|
||||
use OCA\PrideFlags\AppConstants;
|
||||
use OCP\IL10N;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\Settings\IIConSection;
|
||||
|
||||
class AdminSection implements IIconSection {
|
||||
public function __construct(private IL10N $l10n, private IURLGenerator $urlGenerator) {}
|
||||
|
||||
public function getID(): string {
|
||||
return AppConstants::APP_ID;
|
||||
}
|
||||
|
||||
public function getName(): string {
|
||||
return 'Pride Flags';
|
||||
}
|
||||
|
||||
public function getPriority(): int {
|
||||
return 100;
|
||||
}
|
||||
|
||||
public function getIcon(): string {
|
||||
return $this->urlGenerator->imagePath('core', 'actions/settings-dark.svg');
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\PrideFlags\Settings;
|
||||
|
||||
use OCA\PrideFlags\AppConstants;
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
use OCP\Settings\ISettings;
|
||||
use OCP\Util;
|
||||
|
||||
class AdminSettings implements ISettings {
|
||||
public function getForm(): TemplateResponse {
|
||||
Util::addScript(AppConstants::APP_ID, 'pride-settings-global');
|
||||
return new TemplateResponse(AppConstants::APP_ID, 'server-settings', []);
|
||||
}
|
||||
|
||||
public function getSection(): string {
|
||||
return AppConstants::APP_ID;
|
||||
}
|
||||
|
||||
public function getPriority(): int {
|
||||
return 50;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
<?php
|
||||
<?
|
||||
|
||||
namespace OCA\PrideFlags\Settings;
|
||||
|
||||
@ -12,40 +12,23 @@ class AppSettings {
|
||||
public function __construct(private IConfig $config) {
|
||||
}
|
||||
|
||||
public function getStringSetting($userId, string $key, string $default = ''): string {
|
||||
return $this->config->getUserValue(AppConstants::APP_ID, $userId, $key)
|
||||
?: ($this->config->getAppValue(AppConstants::APP_ID, $userId, $key) ?: $default);
|
||||
public function getStringSetting(string $key, string $default = ''): string {
|
||||
return $this->config->getAppValue(AppConstants::APP_ID, $key) ?: $default;
|
||||
}
|
||||
|
||||
public function setStringSetting($userId, string $key, string $value): void {
|
||||
$this->config->setUserValue(AppConstants::APP_ID, $userId, $key, $value);
|
||||
}
|
||||
|
||||
public function setAppStringSetting(string $key, string $value): void {
|
||||
public function setStringSetting(string $key, string $value): void {
|
||||
$this->config->setAppValue(AppConstants::APP_ID, $key, $value);
|
||||
}
|
||||
|
||||
public function getAll($userId): array {
|
||||
public function getAll(): array {
|
||||
return [
|
||||
AppSettings::FOLDER_VARIANT => $this->getStringSetting($userId, AppSettings::FOLDER_VARIANT, 'pride'),
|
||||
AppSettings::BUTTON_VARIANT => $this->getStringSetting($userId, AppSettings::BUTTON_VARIANT, 'trans'),
|
||||
AppSettings::FOLDER_VARIANT => $this->getStringSetting(AppSettings::FOLDER_VARIANT, 'pride'),
|
||||
AppSettings::BUTTON_VARIANT => $this->getStringSetting(AppSettings::BUTTON_VARIANT, 'trans'),
|
||||
];
|
||||
}
|
||||
|
||||
public function getGlobal(): array {
|
||||
return [
|
||||
AppSettings::FOLDER_VARIANT => $this->config->getAppValue(AppConstants::APP_ID, AppSettings::FOLDER_VARIANT, 'pride'),
|
||||
AppSettings::BUTTON_VARIANT => $this->config->getAppValue(AppConstants::APP_ID, AppSettings::BUTTON_VARIANT, 'trans'),
|
||||
];
|
||||
}
|
||||
|
||||
public function set($userId, $folder, $button): void {
|
||||
$this->setStringSetting($userId, AppSettings::FOLDER_VARIANT, $folder);
|
||||
$this->setStringSetting($userId, AppSettings::BUTTON_VARIANT, $button);
|
||||
}
|
||||
|
||||
public function setGlobal($folder, $button): void {
|
||||
$this->setAppStringSetting(AppSettings::FOLDER_VARIANT, $folder);
|
||||
$this->setAppStringSetting(AppSettings::BUTTON_VARIANT, $button);
|
||||
public function set($folder, $button): void {
|
||||
$this->setStringSetting(AppSettings::FOLDER_VARIANT, $folder);
|
||||
$this->setStringSetting(AppSettings::BUTTON_VARIANT, $button);
|
||||
}
|
||||
}
|
||||
|
@ -5,8 +5,7 @@
|
||||
"version": "0.1.0",
|
||||
"description": "Allow users to theme different parts of their nextcloud with pride flags",
|
||||
"license": {
|
||||
"name": "GNU General Public License v3",
|
||||
"url": "https://www.gnu.org/licenses/gpl-3.0.en.html"
|
||||
"name": "cnvpl"
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "pride_flags",
|
||||
"version": "1.1.0",
|
||||
"license": "GPL-3.0-or-later",
|
||||
"version": "0.1.0",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"engines": {
|
||||
"node": "^20.0.0",
|
||||
"npm": "^10.0.0"
|
||||
|
@ -1,30 +0,0 @@
|
||||
<div class="pride_flags_server_settings">
|
||||
<div class="settings-section section hidden">
|
||||
<h2 class="settings_section__name">Server-wide preferences</h2>
|
||||
<div class="server-settings folder-flavour" style="margin-left: 40px; display: flex;">
|
||||
<label for="server-settings-folder-flavour-select" style="display: flex; width: 100px;">Folders</label>
|
||||
<select id="server-settings-folder-flavour-select" style="display: flex; width: 200px;">
|
||||
<option value='pride'>Pride</option>
|
||||
<option value='trans'>Trans Pride</option>
|
||||
<option value='pan'>Pansexual Pride</option>
|
||||
<option value='nonbinary'>Non-binary Pride</option>
|
||||
<option value='bi'>Bisexual Pride</option>
|
||||
<option value='asexual'>Asexual Pride</option>
|
||||
<option value='lesbian'>Lesbian Pride</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="server-settings button-flavour" style="margin-left: 40px; display: flex;">
|
||||
<label for="server-settings-button-flavour-select" style="display: flex; width: 100px;">Buttons</label>
|
||||
<select id="server-settings-button-flavour-select" style="display: flex; width: 200px;">
|
||||
<option value='pride'>Pride</option>
|
||||
<option value='trans'>Trans Pride</option>
|
||||
<option value='pan'>Pansexual Pride</option>
|
||||
<option value='nonbinary'>Non-binary Pride</option>
|
||||
<option value='bi'>Bisexual Pride</option>
|
||||
<option value='asexual'>Asexual Pride</option>
|
||||
<option value='lesbian'>Lesbian Pride</option>
|
||||
</select>
|
||||
</div>
|
||||
<button class="settings-pride-submit button primary" style="margin-left: 40px; display: flex; width: 80px; text-align: center;">Save</button>
|
||||
</div>
|
||||
</div>
|
@ -2,18 +2,13 @@
|
||||
|
||||
?>
|
||||
<div class="pride_flags_user_settings">
|
||||
<div class="settings-section section hidden">
|
||||
<div class="settings-section section">
|
||||
<h2 class="settings_section__name">Personal preferences</h2>
|
||||
<div class="user-settings folder-flavour" style="margin-left: 40px; display: flex;">
|
||||
<label for="user-settings-folder-flavour-select" style="display: flex; width: 100px;">Folders</label>
|
||||
<select id="user-settings-folder-flavour-select" style="display: flex; width: 200px;">
|
||||
<option value='pride'>Pride</option>
|
||||
<option value='trans'>Trans Pride</option>
|
||||
<option value='pan'>Pansexual Pride</option>
|
||||
<option value='nonbinary'>Non-binary Pride</option>
|
||||
<option value='bi'>Bisexual Pride</option>
|
||||
<option value='asexual'>Asexual Pride</option>
|
||||
<option value='lesbian'>Lesbian Pride</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="user-settings button-flavour" style="margin-left: 40px; display: flex;">
|
||||
@ -21,11 +16,6 @@
|
||||
<select id="user-settings-button-flavour-select" style="display: flex; width: 200px;">
|
||||
<option value='pride'>Pride</option>
|
||||
<option value='trans'>Trans Pride</option>
|
||||
<option value='pan'>Pansexual Pride</option>
|
||||
<option value='nonbinary'>Non-binary Pride</option>
|
||||
<option value='bi'>Bisexual Pride</option>
|
||||
<option value='asexual'>Asexual Pride</option>
|
||||
<option value='lesbian'>Lesbian Pride</option>
|
||||
</select>
|
||||
</div>
|
||||
<button class="settings-pride-submit button primary" style="margin-left: 40px; display: flex; width: 80px; text-align: center;">Save</button>
|
||||
|
Loading…
Reference in New Issue
Block a user