aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/src/models/Tab.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files/src/models/Tab.js')
-rw-r--r--apps/files/src/models/Tab.js102
1 files changed, 53 insertions, 49 deletions
diff --git a/apps/files/src/models/Tab.js b/apps/files/src/models/Tab.js
index 670c72e3a3a..b67d51f277f 100644
--- a/apps/files/src/models/Tab.js
+++ b/apps/files/src/models/Tab.js
@@ -1,55 +1,43 @@
/**
- * @copyright Copyright (c) 2019 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/>.
- *
+ * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
*/
+import DOMPurify from 'dompurify'
export default class Tab {
- #id
- #name
- #icon
- #mount
- #update
- #destroy
- #enabled
- #scrollBottomReached
+ _id
+ _name
+ _icon
+ _iconSvgSanitized
+ _mount
+ _setIsActive
+ _update
+ _destroy
+ _enabled
+ _scrollBottomReached
/**
* Create a new tab instance
*
- * @param {Object} options destructuring object
+ * @param {object} options destructuring object
* @param {string} options.id the unique id of this tab
* @param {string} options.name the translated tab name
- * @param {string} options.icon the vue component
+ * @param {?string} options.icon the icon css class
+ * @param {?string} options.iconSvg the icon in svg format
* @param {Function} options.mount function to mount the tab
+ * @param {Function} [options.setIsActive] function to forward the active state of the tab
* @param {Function} options.update function to update the tab
* @param {Function} options.destroy function to destroy the tab
* @param {Function} [options.enabled] define conditions whether this tab is active. Must returns a boolean
* @param {Function} [options.scrollBottomReached] executed when the tab is scrolled to the bottom
*/
- constructor({ id, name, icon, mount, update, destroy, enabled, scrollBottomReached } = {}) {
+ constructor({ id, name, icon, iconSvg, mount, setIsActive, update, destroy, enabled, scrollBottomReached } = {}) {
if (enabled === undefined) {
enabled = () => true
}
if (scrollBottomReached === undefined) {
- scrollBottomReached = () => {}
+ scrollBottomReached = () => { }
}
// Sanity checks
@@ -59,12 +47,15 @@ export default class Tab {
if (typeof name !== 'string' || name.trim() === '') {
throw new Error('The name argument is not a valid string')
}
- if (typeof icon !== 'string' || icon.trim() === '') {
- throw new Error('The icon argument is not a valid string')
+ if ((typeof icon !== 'string' || icon.trim() === '') && typeof iconSvg !== 'string') {
+ throw new Error('Missing valid string for icon or iconSvg argument')
}
if (typeof mount !== 'function') {
throw new Error('The mount argument should be a function')
}
+ if (setIsActive !== undefined && typeof setIsActive !== 'function') {
+ throw new Error('The setIsActive argument should be a function')
+ }
if (typeof update !== 'function') {
throw new Error('The update argument should be a function')
}
@@ -78,47 +69,60 @@ export default class Tab {
throw new Error('The scrollBottomReached argument should be a function')
}
- this.#id = id
- this.#name = name
- this.#icon = icon
- this.#mount = mount
- this.#update = update
- this.#destroy = destroy
- this.#enabled = enabled
- this.#scrollBottomReached = scrollBottomReached
+ this._id = id
+ this._name = name
+ this._icon = icon
+ this._mount = mount
+ this._setIsActive = setIsActive
+ this._update = update
+ this._destroy = destroy
+ this._enabled = enabled
+ this._scrollBottomReached = scrollBottomReached
+
+ if (typeof iconSvg === 'string') {
+ this._iconSvgSanitized = DOMPurify.sanitize(iconSvg)
+ }
}
get id() {
- return this.#id
+ return this._id
}
get name() {
- return this.#name
+ return this._name
}
get icon() {
- return this.#icon
+ return this._icon
+ }
+
+ get iconSvg() {
+ return this._iconSvgSanitized
}
get mount() {
- return this.#mount
+ return this._mount
+ }
+
+ get setIsActive() {
+ return this._setIsActive || (() => undefined)
}
get update() {
- return this.#update
+ return this._update
}
get destroy() {
- return this.#destroy
+ return this._destroy
}
get enabled() {
- return this.#enabled
+ return this._enabled
}
get scrollBottomReached() {
- return this.#scrollBottomReached
+ return this._scrollBottomReached
}
}