diff --git a/public/scripts/extensions.js b/public/scripts/extensions.js index c551cc971..7ac782e20 100644 --- a/public/scripts/extensions.js +++ b/public/scripts/extensions.js @@ -378,6 +378,72 @@ function addExtensionScript(name, manifest) { +async function generateExtensionHtml(name, manifest, isActive, isDisabled, isExternal, checkboxClass) { + const displayName = manifest.display_name; + let displayVersion = manifest.version ? ` v${manifest.version}` : ""; + let isUpToDate = true; + if (isExternal) { + let data = await getExtensionVersion(name.replace('third-party', '')); + let branch = data.currentBranchName; + let commitHash = data.currentCommitHash; + isUpToDate = data.isUpToDate; + displayVersion = ` (${branch}-${commitHash.substring(0, 7)})`; + } + + let toggleElement = isActive || isDisabled ? + `` : + ``; + + let updateButton = isExternal && !isUpToDate ? `` : ''; + let extensionHtml = `
+

+ ${updateButton} + + ${DOMPurify.sanitize(displayName)}${displayVersion} + + ${toggleElement} +

`; + + if (isActive && Array.isArray(manifest.optional)) { + const optional = new Set(manifest.optional); + modules.forEach(x => optional.delete(x)); + if (optional.size > 0) { + const optionalString = DOMPurify.sanitize([...optional].join(', ')); + extensionHtml += `

Optional modules: ${optionalString}

`; + } + } else if (!isDisabled) { // Neither active nor disabled + const requirements = new Set(manifest.requires); + modules.forEach(x => requirements.delete(x)); + const requirementsString = DOMPurify.sanitize([...requirements].join(', ')); + extensionHtml += `

Missing modules: ${requirementsString}

`; + } + + return extensionHtml; +} + +async function getExtensionData(extension) { + const name = extension[0]; + const manifest = extension[1]; + const isActive = activeExtensions.has(name); + const isDisabled = extension_settings.disabledExtensions.includes(name); + const isExternal = name.startsWith('third-party'); + + const checkboxClass = isDisabled ? "checkbox_disabled" : ""; + + const extensionHtml = await generateExtensionHtml(name, manifest, isActive, isDisabled, isExternal, checkboxClass); + + return { isExternal, extensionHtml }; +} + + +function getModuleInformation() { + let moduleInfo = modules.length ? `

${DOMPurify.sanitize(modules.join(', '))}

` : '

Not connected to the API!

'; + return ` +

Modules provided by your Extensions API:

+ ${moduleInfo} + `; +} + async function showExtensionsDetails() { let htmlDefault = '

Default Extensions:

'; let htmlExternal = '

External Extensions:

'; @@ -385,63 +451,19 @@ async function showExtensionsDetails() { const extensions = Object.entries(manifests).sort((a, b) => a[1].loading_order - b[1].loading_order); for (const extension of extensions) { - const name = extension[0]; - const manifest = extension[1]; - const isActive = activeExtensions.has(name); - const isDisabled = extension_settings.disabledExtensions.includes(name); - const isExternal = name.startsWith('third-party'); - - const titleClass = isActive ? "extension_enabled" : isDisabled ? "extension_disabled" : "extension_missing"; - const checkboxClass = isDisabled ? "checkbox_disabled" : ""; - - const displayName = manifest.display_name; - let displayVersion = manifest.version ? ` v${manifest.version}` : ""; - let isUpToDate = true; - if (isExternal) { - let data = await getExtensionVersion(name.replace('third-party', '')); - let branch = data.currentBranchName; - let commitHash = data.currentCommitHash; - isUpToDate = data.isUpToDate; - displayVersion = ` (${branch}-${commitHash.substring(0, 7)})`; - } - - let toggleElement = ``; - if (isActive || isDisabled) { - toggleElement = ``; - } - - let updateButton = isExternal && !isUpToDate ? `` : ''; - let extensionHtml = `

${updateButton} ${DOMPurify.sanitize(displayName)}${displayVersion} ${toggleElement}

`; - - if (isActive) { - if (Array.isArray(manifest.optional)) { - const optional = new Set(manifest.optional); - modules.forEach(x => optional.delete(x)); - if (optional.size > 0) { - const optionalString = DOMPurify.sanitize([...optional].join(', ')); - extensionHtml += `

Optional modules: ${optionalString}

`; - } - } - } - else if (!isDisabled) { // Neither active nor disabled - const requirements = new Set(manifest.requires); - modules.forEach(x => requirements.delete(x)); - const requirementsString = DOMPurify.sanitize([...requirements].join(', ')); - extensionHtml += `

Missing modules: ${requirementsString}

` - } - - // Append the HTML to the correct section + const { isExternal, extensionHtml } = await getExtensionData(extension); if (isExternal) { htmlExternal += extensionHtml; } else { htmlDefault += extensionHtml; } } - // Do something with htmlDefault and htmlExternal here - let html = '

Modules provided by your Extensions API:

'; - html += modules.length ? `

${DOMPurify.sanitize(modules.join(', '))}

` : '

Not connected to the API!

'; - html += htmlDefault + htmlExternal; + const html = ` + ${getModuleInformation()} + ${htmlDefault} + ${htmlExternal} + `; callPopup(`
${html}
`, 'text'); }