Skip to content

Commit 3c544e6

Browse files
Persist view state (expanded/collapsed) of sidebar elements in browser local storage
1 parent 6328163 commit 3c544e6

File tree

3 files changed

+80
-39
lines changed

3 files changed

+80
-39
lines changed

src/moin/static/js/common.js

Lines changed: 78 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
function MoinMoin() {
88
"use strict";
99
}
10+
1011
// Utility function to add a message to moin flash area. Message can be removed by clicking on it.
1112
MoinMoin.prototype.MOINFLASHINFO = "moin-flash moin-flash-info";
1213
MoinMoin.prototype.MOINFLASHWARNING = "moin-flash moin-flash-warning";
@@ -19,14 +20,12 @@ MoinMoin.prototype.moinFlashMessage = function (classes, message) {
1920
});
2021
};
2122

22-
2323
// if /template/dictionary.js has not been loaded, untranslated strings will be returned by _(...)
2424
function _(text) {
2525
"use strict";
2626
return $.i18n._(text);
2727
}
2828

29-
3029
// return true if browser localStorage is available
3130
function localStorageAvailable() {
3231
"use strict";
@@ -41,44 +40,70 @@ function localStorageAvailable() {
4140
}
4241
}
4342

44-
// executed when user clicks button to toggle modify textarea between fixed/variable width fonts
45-
function moinFontChange() {
43+
// executed on page ready, if this is a modify view add action to Cancel button
44+
function cancelEdit() {
4645
"use strict";
47-
$(".moin-edit-content").toggleClass("moin-fixed-width");
46+
$('.moin-cancel').click(function () {
47+
// do not ask to leave page; any edits will be lost, but browser back button may restore edits
48+
$('#moin-modify').removeClass('moin-changed-input');
49+
window.location = $('#moin-wiki-root').val() + '/' + $('#moin-item-name').val();
50+
});
51+
}
52+
53+
// Initial user settings
54+
MoinMoin.prototype.userSettings = {
55+
'user-actions-collapsed': true,
56+
'view-options-collapsed': true,
57+
'item-actions-collapsed': true
58+
};
59+
60+
MoinMoin.prototype.loadUserSettings = function () {
4861
if (localStorageAvailable()) {
49-
if ($(".moin-edit-content").hasClass("moin-fixed-width")) {
50-
localStorage.setItem("moin-textarea-font", "moin-fixed-width");
51-
} else {
52-
localStorage.setItem("moin-textarea-font", "");
62+
let jsonData = localStorage.getItem("moin-user-settings");
63+
if (jsonData) {
64+
this.userSettings = JSON.parse(jsonData);
5365
}
5466
}
5567
}
5668

57-
// executed on page ready, change textarea font to last saved value fixed/proportional
58-
function moinFontChangeOnReady() {
59-
"use strict";
60-
if ($(".moin-edit-content")) {
61-
if (localStorageAvailable()) {
62-
if (localStorage.getItem("moin-textarea-font") === "moin-fixed-width") {
63-
$(".moin-edit-content").addClass("moin-fixed-width");
64-
} else {
65-
$(".moin-edit-content").removeClass("moin-fixed-width");
66-
}
67-
}
69+
MoinMoin.prototype.saveUserSettings = function () {
70+
if (localStorageAvailable()) {
71+
localStorage.setItem("moin-user-settings", JSON.stringify(this.userSettings));
6872
}
6973
}
7074

75+
MoinMoin.prototype.applyUserSettings = function () {
7176

72-
// executed on page ready, if this is a modify view add action to Cancel button
73-
function cancelEdit() {
74-
"use strict";
75-
$('.moin-cancel').click(function () {
76-
// do not ask to leave page; any edits will be lost, but browser back button may restore edits
77-
$('#moin-modify').removeClass('moin-changed-input');
78-
window.location = $('#moin-wiki-root').val() + '/' + $('#moin-item-name').val();
79-
});
80-
}
77+
if (this.userSettings['user-actions-collapsed']) {
78+
$('#moin-user-actions').addClass('hidden');
79+
$('.moin-useractions > i').removeClass('fa-rotate-90');
80+
} else {
81+
$('#moin-user-actions').removeClass('hidden');
82+
$('.moin-useractions > i').addClass('fa-rotate-90');
83+
}
84+
85+
if (this.userSettings['view-options-collapsed']) {
86+
$('#moin-view-options').addClass('hidden');
87+
$('.moin-viewoptions > i').removeClass('fa-rotate-90');
88+
} else {
89+
$('#moin-view-options').removeClass('hidden');
90+
$('.moin-viewoptions > i').addClass('fa-rotate-90');
91+
}
92+
93+
if (this.userSettings['item-actions-collapsed']) {
94+
$('#moin-item-actions').addClass('hidden');
95+
$('.moin-itemactions > i').removeClass('fa-rotate-90');
96+
} else {
97+
$('#moin-item-actions').removeClass('hidden');
98+
$('.moin-itemactions > i').addClass('fa-rotate-90');
99+
}
81100

101+
if (this.userSettings["textarea-use-fixed-width-font"]) {
102+
$(".moin-edit-content").addClass("moin-fixed-width");
103+
} else {
104+
$(".moin-edit-content").removeClass("moin-fixed-width");
105+
}
106+
}
82107

83108
// Highlight currently selected link in side panel. Executed on page load
84109
MoinMoin.prototype.selected_link = function () {
@@ -760,6 +785,9 @@ $(document).ready(function () {
760785
"use strict";
761786
var moin = new MoinMoin();
762787

788+
moin.loadUserSettings()
789+
moin.applyUserSettings();
790+
763791
moin.diffScroll();
764792
moin.selected_link();
765793
moin.initTransclusionOverlays();
@@ -781,26 +809,41 @@ $(document).ready(function () {
781809
moin.toggleSubtree(this);
782810
});
783811

784-
$('.moin-useractions').click(function () {
812+
$('.moin-useractions').click(function (event) {
813+
event.preventDefault();
785814
$('#moin-user-actions').toggleClass('hidden');
786815
$('.moin-useractions > i').toggleClass('fa-rotate-90');
787-
return false;
816+
moin.userSettings['user-actions-collapsed'] = $('#moin-user-actions').hasClass('hidden');
817+
moin.saveUserSettings();
788818
});
789819

790-
$('.moin-viewoptions').click(function () {
820+
$('.moin-viewoptions').click(function (event) {
821+
event.preventDefault();
791822
$('#moin-view-options').toggleClass('hidden');
792823
$('.moin-viewoptions > i').toggleClass('fa-rotate-90');
793-
return false;
824+
moin.userSettings['view-options-collapsed'] = $('#moin-view-options').hasClass('hidden');
825+
moin.saveUserSettings();
794826
});
795827

796-
$('.moin-itemactions').click(function () {
828+
$('.moin-itemactions').click(function (event) {
829+
event.preventDefault();
797830
$('#moin-item-actions').toggleClass('hidden');
798831
$('.moin-itemactions > i').toggleClass('fa-rotate-90');
799-
return false;
832+
moin.userSettings['item-actions-collapsed'] = $('#moin-item-actions').hasClass('hidden');
833+
moin.saveUserSettings();
834+
});
835+
836+
// executed when user clicks button to toggle modify textarea between fixed/variable width fonts
837+
$('#moin-toggle-fixed-font-button').on('click', function (event) {
838+
event.preventDefault();
839+
$(".moin-edit-content").toggleClass("moin-fixed-width");
840+
moin.userSettings['textarea-use-fixed-width-font'] = $(".moin-edit-content").hasClass("moin-fixed-width");
841+
moin.saveUserSettings();
800842
});
801843

802844
moin.enhanceUserSettings();
803845
moin.enhanceEdit();
846+
804847
$('.moin-sortable').tablesorter();
805848

806849
$('#moin-modify').on('change keyup keydown', 'input, textarea, select', function (e) {
@@ -859,8 +902,6 @@ $(document).ready(function () {
859902
}
860903
});
861904

862-
moinFontChangeOnReady();
863-
864905
$('textarea.moin-autosize').autosize();
865906

866907
showAllOptions();

src/moin/templates/modify_text.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
{% macro data_editor(form, item_name) %}
1818
{% set textarea_rows = '1' if edit_rows == '0' else edit_rows %}
1919
{% set cls = 'moin-edit-content moin-autosize' if edit_rows == '0' else 'moin-edit-content' %}
20-
<input type="button" onclick="moinFontChange()" value="{{ _('Toggle font width') }}" class="moin-button moin-textarea-font" >
20+
<input type="button" id="moin-toggle-fixed-font-button" value="{{ _('Toggle font width') }}" class="moin-button moin-textarea-font" >
2121
{{ gen.textarea(form['data_text'], rows=textarea_rows|string, class=cls, **kwargs) }}
2222
{{ base_editor(form) }}
2323
<br>

src/moin/themes/basic/templates/modify_text.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{% from "modify_binary.html" import data_editor as base_editor %}
22

33
{% macro basic_data_editor(form, item_name) %}
4-
<input type="button" onclick="moinFontChange()" value="{{ _('Toggle font width') }}" class="moin-button moin-textarea-font" >
4+
<input type="button" id="moin-toggle-fixed-font-button" value="{{ _('Toggle font width') }}" class="moin-button moin-textarea-font" >
55
{{ gen.textarea(form['data_text'], rows=form.rows|string, cols=form.cols|string, class="moin-edit-content", **kwargs) }}
66
{{ base_editor(form) }}
77
<br>

0 commit comments

Comments
 (0)