diff options
author | Gary Kim <gary@garykim.dev> | 2020-02-26 23:22:57 +0800 |
---|---|---|
committer | Gary Kim <gary@garykim.dev> | 2020-03-22 22:34:49 +0800 |
commit | 98eeb57a04726a5cdffac94903f494731c6a782e (patch) | |
tree | 9af0241b640c8ce81487c6887a28b5e01e525a4d /apps/files/src | |
parent | 019ba27943a44a5c3b80ffac02c5568ee47af6cc (diff) | |
download | nextcloud-server-98eeb57a04726a5cdffac94903f494731c6a782e.tar.gz nextcloud-server-98eeb57a04726a5cdffac94903f494731c6a782e.zip |
Add OCA.Files.Settings for Files Settings
Signed-off-by: Gary Kim <gary@garykim.dev>
Diffstat (limited to 'apps/files/src')
-rw-r--r-- | apps/files/src/components/Setting.vue | 41 | ||||
-rw-r--r-- | apps/files/src/files-app-settings.js | 53 | ||||
-rw-r--r-- | apps/files/src/models/Setting.js | 69 | ||||
-rw-r--r-- | apps/files/src/services/Settings.js | 56 | ||||
-rw-r--r-- | apps/files/src/views/Settings.vue | 48 |
5 files changed, 267 insertions, 0 deletions
diff --git a/apps/files/src/components/Setting.vue b/apps/files/src/components/Setting.vue new file mode 100644 index 00000000000..acd7e8d1bce --- /dev/null +++ b/apps/files/src/components/Setting.vue @@ -0,0 +1,41 @@ +<!-- + - @copyright Copyright (c) 2020 Gary Kim <gary@garykim.dev> + - + - @author Gary Kim <gary@garykim.dev> + - + - @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 /> +</template> +<script> +export default { + name: 'Setting', + props: { + el: { + type: Function, + required: true, + } + }, + mounted() { + this.$el.appendChild(this.el()) + } +} +</script> +<style> +</style> diff --git a/apps/files/src/files-app-settings.js b/apps/files/src/files-app-settings.js new file mode 100644 index 00000000000..6d77c310695 --- /dev/null +++ b/apps/files/src/files-app-settings.js @@ -0,0 +1,53 @@ +/** + * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev> + * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author Gary Kim <gary@garykim.dev> + * + * @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 Settings from './services/Settings' +import SettingsView from './views/Settings' +import Setting from './models/Setting' + +Vue.prototype.t = t + +// Init Files App Settings Service +if (!window.OCA.Files) { + window.OCA.Files = {} +} +Object.assign(window.OCA.Files, { Settings: new Settings() }) +Object.assign(window.OCA.Files.Settings, { Setting }) + +window.addEventListener('DOMContentLoaded', () => { + // Init Vue app + // eslint-disable-next-line + new Vue({ + el: '#files-app-settings', + render: h => h(SettingsView), + }) + + const appSettingsHeader = document.getElementById('app-settings-header') + if (appSettingsHeader) { + appSettingsHeader.addEventListener('click', e => { + const opened = e.currentTarget.children[0].classList.contains('opened') + OCA.Files.Settings.settings.forEach(e => opened ? e.close() : e.open()) + }) + } +}) diff --git a/apps/files/src/models/Setting.js b/apps/files/src/models/Setting.js new file mode 100644 index 00000000000..64c81ee5013 --- /dev/null +++ b/apps/files/src/models/Setting.js @@ -0,0 +1,69 @@ +/** + * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev> + * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author Gary Kim <gary@garykim.dev> + * + * @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/>. + * + */ + +export default class Setting { + + #close + #el + #name + #open + + /** + * Create a new files app setting + * + * @since 19.0.0 + * @param {string} name the name of this setting + * @param {Function} component.el function that returns an unmounted dom element to be added + * @param {Function} [component.open] callback for when setting is added + * @param {Function} [component.close] callback for when setting is closed + */ + constructor(name, { el, open, close }) { + this.#name = name + this.#el = el + this.#open = open + this.#close = close + if (typeof this.#open !== 'function') { + this.#open = () => {} + } + if (typeof this.#close !== 'function') { + this.#close = () => {} + } + } + + get name() { + return this.#name + } + + get el() { + return this.#el + } + + get open() { + return this.#open + } + + get close() { + return this.#close + } + +} diff --git a/apps/files/src/services/Settings.js b/apps/files/src/services/Settings.js new file mode 100644 index 00000000000..7d8961b35ab --- /dev/null +++ b/apps/files/src/services/Settings.js @@ -0,0 +1,56 @@ +/** + * @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev> + * + * @author Gary Kim <gary@garykim.dev> + * + * @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/>. + * + */ + +export default class Settings { + + #settings + + constructor() { + this.#settings = [] + console.debug('OCA.Files.Settings initialized') + } + + /** + * Register a new setting + * + * @since 19.0.0 + * @param {OCA.Files.Settings.Setting} view element to add to settings + * @returns {boolean} whether registering was successful + */ + register(view) { + if (this.#settings.filter(e => e.name === view.name).length > 0) { + console.error('A setting with the same name is already registered') + return false + } + this.#settings.push(view) + return true + } + + /** + * All settings elements + * @returns {OCA.Files.Settings.Setting[]} All currently registered settings + */ + get settings() { + return this.#settings + } + +} diff --git a/apps/files/src/views/Settings.vue b/apps/files/src/views/Settings.vue new file mode 100644 index 00000000000..793ad293ad1 --- /dev/null +++ b/apps/files/src/views/Settings.vue @@ -0,0 +1,48 @@ +<!-- + - @copyright Copyright (c) 2019 Gary Kim <gary@garykim.dev> + - + - @author Gary Kim <gary@garykim.dev> + - + - @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 id="files-app-extra-settings"> + <template v-for="setting in settings"> + <Setting :el="setting.el" :key="setting.name" /> + </template> + </div> +</template> + +<script> +import Setting from '../components/Setting' + +export default { + name: 'Settings', + components: { + Setting + }, + data() { + return { + settings: OCA.Files.Settings.settings + } + } +} +</script> + +<style lang="scss" scoped> + +</style> |