diff --git a/src/public/javascripts/widgets/collapsible_widget.js b/src/public/javascripts/widgets/collapsible_widget.js index 3978b77f3..9c3108791 100644 --- a/src/public/javascripts/widgets/collapsible_widget.js +++ b/src/public/javascripts/widgets/collapsible_widget.js @@ -1,4 +1,5 @@ import TabAwareWidget from "./tab_aware_widget.js"; +import options from "../services/options.js"; const WIDGET_TPL = `
@@ -33,7 +34,15 @@ export default class CollapsibleWidget extends TabAwareWidget { this.$bodyWrapper = this.$widget.find('.body-wrapper'); this.$bodyWrapper.attr('id', this.componentId); // for toggle to work we need id - this.$bodyWrapper.collapse("show"); + + const widgetName = this.constructor.name; + + if (!options.is(widgetName + 'Collapsed')) { + this.$bodyWrapper.collapse("show"); + } + + this.$bodyWrapper.on('hidden.bs.collapse', () => options.save(widgetName + 'Collapsed', 'true')); + this.$bodyWrapper.on('shown.bs.collapse', () => options.save(widgetName + 'Collapsed', 'false')); this.$body = this.$bodyWrapper.find('.card-body'); diff --git a/src/routes/api/options.js b/src/routes/api/options.js index f39ff8486..69000039b 100644 --- a/src/routes/api/options.js +++ b/src/routes/api/options.js @@ -107,7 +107,9 @@ async function getUserThemes() { } function isAllowed(name) { - return ALLOWED_OPTIONS.has(name) || name.startsWith("keyboardShortcuts"); + return ALLOWED_OPTIONS.has(name) + || name.startsWith("keyboardShortcuts") + || name.endsWith("Collapsed"); } module.exports = { diff --git a/src/services/options.js b/src/services/options.js index 00ca87399..fb42e97b6 100644 --- a/src/services/options.js +++ b/src/services/options.js @@ -41,13 +41,14 @@ async function getOptionBool(name) { async function setOption(name, value) { const option = await require('./repository').getOption(name); - if (!option) { - throw new Error(`Option ${name} doesn't exist`); + if (option) { + option.value = value; + + await option.save(); + } + else { + await createOption(name, value, false); } - - option.value = value; - - await option.save(); } async function createOption(name, value, isSynced) {