diff --git a/src/public/app/widgets/type_widgets/options/code_notes/code_mime_types.js b/src/public/app/widgets/type_widgets/options/code_notes/code_mime_types.js index 909b62a86..9baf696f8 100644 --- a/src/public/app/widgets/type_widgets/options/code_notes/code_mime_types.js +++ b/src/public/app/widgets/type_widgets/options/code_notes/code_mime_types.js @@ -7,10 +7,31 @@ const TPL = `

${t('code_mime_types.title')}

-`; + + + +`; let idCtr = 1; // global, since this can be shown in multiple dialogs +function groupMimeTypesAlphabetically(ungroupedMimeTypes) { + const result = {}; + ungroupedMimeTypes = ungroupedMimeTypes.toSorted((a, b) => a.title > b.title); + + for (const mimeType of ungroupedMimeTypes) { + const initial = mimeType.title.charAt(0).toUpperCase(); + if (!result[initial]) { + result[initial] = []; + } + result[initial].push(mimeType); + } + return result; +} + export default class CodeMimeTypesOptions extends OptionsWidget { doRender() { this.$widget = $(TPL); @@ -19,36 +40,29 @@ export default class CodeMimeTypesOptions extends OptionsWidget { async optionsLoaded(options) { this.$mimeTypes.empty(); - let index = -1; - let prevInitial = ""; - for (const mimeType of mimeTypesService.getMimeTypes()) { - const id = "code-mime-type-" + (idCtr++); - index++; - - // Append a heading to group items by the first letter, excepting for the - // first item ("Plain Text"). Note: this code assumes the items are already - // in alphabetical ordered. - if (index > 0) { - const initial = mimeType.title.charAt(0).toUpperCase(); - - if (initial !== prevInitial) { - this.$mimeTypes.append($("
").text(initial)); - prevInitial = initial; - } + const groupedMimeTypes = groupMimeTypesAlphabetically(mimeTypesService.getMimeTypes()); + + for (const [ initial, mimeTypes ] of Object.entries(groupedMimeTypes)) { + const $section = $("
"); + $section.append($("
").text(initial)); + + for (const mimeType of mimeTypes) { + const id = "code-mime-type-" + (idCtr++); + $section.append($("
  • ") + .append($('') + .attr("id", id) + .attr("data-mime-type", mimeType.mime) + .prop("checked", mimeType.enabled)) + .on('change', () => this.save()) + .append("   ") + .append($('
  • ") - .append($('') - .attr("id", id) - .attr("data-mime-type", mimeType.mime) - .prop("checked", mimeType.enabled)) - .on('change', () => this.save()) - .append("   ") - .append($('