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) {