Skip to content

Commit 181f45f

Browse files
authored
feat(settings): add option to preserve original item order (#1772)
Add `preserveOrder` option to settingsPage that skips alphabetical sorting, keeping items in their defined array order.
1 parent b48c229 commit 181f45f

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

src/components/settingsPage.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,26 @@ import searchBar from "./searchbar";
2121
* @property {()=>void} restoreList restore list to original state
2222
*/
2323

24+
/**
25+
* @typedef {Object} SettingsPageOptions
26+
* @property {boolean} [preserveOrder] - If true, items are listed in the order provided instead of alphabetical
27+
*/
28+
2429
/**
2530
* Creates a settings page
2631
* @param {string} title
2732
* @param {ListItem[]} settings
2833
* @param {(key, value) => void} callback called when setting is changed
2934
* @param {'united'|'separate'} [type='united']
35+
* @param {SettingsPageOptions} [options={}]
3036
* @returns {SettingsPage}
3137
*/
3238
export default function settingsPage(
3339
title,
3440
settings,
3541
callback,
3642
type = "united",
43+
options = {},
3744
) {
3845
let hideSearchBar = () => {};
3946
const $page = Page(title);
@@ -96,7 +103,7 @@ export default function settingsPage(
96103
actionStack.remove(title);
97104
};
98105

99-
listItems($list, settings, callback);
106+
listItems($list, settings, callback, options);
100107
$page.body = $list;
101108

102109
/**@type {HTMLElement[]} */
@@ -190,15 +197,18 @@ export default function settingsPage(
190197
* @param {HTMLUListElement} $list
191198
* @param {Array<ListItem>} items
192199
* @param {()=>void} callback called when setting is changed
200+
* @param {SettingsPageOptions} [options={}]
193201
*/
194-
function listItems($list, items, callback) {
202+
function listItems($list, items, callback, options = {}) {
195203
const $items = [];
196204

197-
// sort settings by text before rendering
198-
items.sort((acc, cur) => {
199-
if (!acc?.text || !cur?.text) return 0;
200-
return acc.text.localeCompare(cur.text);
201-
});
205+
// sort settings by text before rendering (unless preserveOrder is true)
206+
if (!options.preserveOrder) {
207+
items.sort((acc, cur) => {
208+
if (!acc?.text || !cur?.text) return 0;
209+
return acc.text.localeCompare(cur.text);
210+
});
211+
}
202212
items.forEach((item) => {
203213
const $setting = Ref();
204214
const $settingName = Ref();

src/settings/terminalSettings.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,9 @@ export default function terminalSettings() {
188188
},
189189
];
190190

191-
return settingsPage(title, items, callback);
191+
return settingsPage(title, items, callback, undefined, {
192+
preserveOrder: true,
193+
});
192194

193195
/**
194196
* Callback for settings page when an item is clicked

0 commit comments

Comments
 (0)