diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index 3650edb77..0d9fa6213 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -148,22 +148,45 @@ var gZenMarketplaceManager = { if (!(await IOUtils.exists(themePath)) || !theme.preferences) { return []; } - return this._getValidPreferences(await IOUtils.readJSON(themePath)); + + let themePreferences = await IOUtils.readJSON(themePath); + + // compat mode for old preferences, all of them can only be checkboxes + if (typeof themePreferences === 'object' && !Array.isArray(themePreferences)) { + console.warn( + `[ZenThemeMarketplaceManager]: Warning, ${theme.name} uses legacy preferences, please migrate them to the new preferences style, as legacy preferences might be removed at a future release. More information at: ` + ); + themePreferences = Object.entries(themePreferences).map(([property, label]) => { + return { + property, + label, + type: 'checkbox', + }; + }); + } + + return this._getValidPreferences(themePreferences); }, _getBrowser() { if (!this.__browser) { - this.__browser = Services.wm.getMostRecentWindow("navigator:browser") + this.__browser = Services.wm.getMostRecentWindow('navigator:browser'); } - return this.__browser + return this.__browser; }, async _buildThemesList() { if (!this.themesList) return; + console.log('ZenThemeMarketplaceParent(settings): Building themes list'); + let themes = await this._getThemes(); + this.themesList.innerHTML = ''; + + const browser = this._getBrowser(); + for (let theme of Object.values(themes)) { const fragment = window.MozXULElement.parseXULToFragment(` @@ -177,7 +200,40 @@ var gZenMarketplaceManager = { `); - fragment.querySelector('.zenThemeMarketplaceItemTitle').textContent = `${theme.name} (v${theme.version || '1.0.0'})`; + + const themeName = `${theme.name} (v${theme.version || '1.0.0'})`; + + const base = fragment.querySelector('.zenThemeMarketplaceItem'); + + const dialog = document.createElement('dialog'); + const mainDialogDiv = document.createElement('div'); + const headerDiv = document.createElement('div'); + const headerTitle = document.createElement('h3'); + const closeButton = document.createElement('button'); + const contentDiv = document.createElement('div'); + + mainDialogDiv.className = 'zenThemeMarketplaceItemPreferenceDialog'; + headerDiv.className = 'zenThemeMarketplaceItemPreferenceDialogTopBar'; + headerTitle.textContent = themeName; + headerTitle.className = 'zenThemeMarketplaceItemTitle'; + closeButton.id = `${theme.name}-modal-close`; + closeButton.textContent = 'Close'; + contentDiv.id = `${theme.name}-preferences-content`; + contentDiv.className = 'zenThemeMarketplaceItemPreferenceDialogContent'; + + headerDiv.appendChild(headerTitle); + headerDiv.appendChild(closeButton); + + mainDialogDiv.appendChild(headerDiv); + mainDialogDiv.appendChild(contentDiv); + dialog.appendChild(mainDialogDiv); + base.appendChild(dialog); + + closeButton.addEventListener('click', () => { + dialog.close(); + }); + + fragment.querySelector('.zenThemeMarketplaceItemTitle').textContent = themeName; fragment.querySelector('.zenThemeMarketplaceItemDescription').textContent = theme.description; fragment.querySelector('.zenThemeMarketplaceItemUninstallButton').addEventListener('click', async (event) => { if (!confirm('Are you sure you want to remove this theme?')) { @@ -187,27 +243,20 @@ var gZenMarketplaceManager = { const themeId = target.getAttribute('zen-theme-id'); await this.removeTheme(themeId); }); + fragment.querySelector('.zenThemeMarketplaceItemConfigureButton').addEventListener('click', () => { + dialog.showModal(); + }); + if (theme.preferences) { fragment.querySelector('.zenThemeMarketplaceItemConfigureButton').removeAttribute('hidden'); } - fragment.querySelector('.zenThemeMarketplaceItemConfigureButton').addEventListener('click', async (event) => { - const target = event.target; - // Unhide the preferences for this theme. - const preferencesWrapper = target.closest('.zenThemeMarketplaceItem').querySelector('.zenThemeMarketplaceItemPreferences'); - if (preferencesWrapper.hasAttribute('hidden')) { - preferencesWrapper.removeAttribute('hidden'); - } else { - preferencesWrapper.setAttribute('hidden', 'true'); - } - }); const preferences = await this._getThemePreferences(theme); if (preferences.length > 0) { - let preferencesWrapper = document.createXULElement('vbox'); - preferencesWrapper.classList.add('indent'); + const preferencesWrapper = document.createXULElement('vbox'); + preferencesWrapper.classList.add('zenThemeMarketplaceItemPreferences'); - preferencesWrapper.setAttribute('hidden', 'true'); for (let entry of preferences) { const { property, label, type } = entry; @@ -227,14 +276,15 @@ var gZenMarketplaceManager = { menulist.setAttribute('sizetopopup', 'none'); menulist.setAttribute('id', property + '-popup-menulist'); - const savedValue = Services.prefs.getStringPref(property, "none"); + const savedValue = Services.prefs.getStringPref(property, 'none'); menulist.setAttribute('value', savedValue); + menulist.setAttribute('tooltiptext', property); const defaultItem = document.createXULElement('menuitem'); - defaultItem.setAttribute('value', "none"); - defaultItem.setAttribute('label', "none"); + defaultItem.setAttribute('value', 'none'); + defaultItem.setAttribute('label', '-'); menupopup.appendChild(defaultItem); @@ -250,7 +300,6 @@ var gZenMarketplaceManager = { continue; } - const menuitem = document.createXULElement('menuitem'); menuitem.setAttribute('value', value.toString()); @@ -264,27 +313,27 @@ var gZenMarketplaceManager = { menulist.addEventListener('command', () => { const value = menulist.selectedItem.value; - const browser = this._getBrowser() - let element = browser.document.getElementById(theme.name) + let element = browser.document.getElementById(theme.name); if (!element) { - element = browser.document.createElement("div") + element = browser.document.createElement('div'); - element.style.display = "none" - element.setAttribute("id", theme.name) + element.style.display = 'none'; + element.setAttribute('id', theme.name); - browser.document.body.appendChild(element) + browser.document.body.appendChild(element); } - element.setAttribute(property, value) + element.setAttribute(property, value); - Services.prefs.setStringPref(property, value === "none" ? "" : value) + Services.prefs.setStringPref(property, value === 'none' ? '' : value); }); const nameLabel = document.createXULElement('label'); nameLabel.setAttribute('flex', '1'); nameLabel.setAttribute('class', 'zenThemeMarketplaceItemPreferenceLabel'); nameLabel.setAttribute('value', label); + nameLabel.setAttribute('tooltiptext', property); container.appendChild(nameLabel); container.appendChild(menulist); @@ -297,11 +346,7 @@ var gZenMarketplaceManager = { case 'checkbox': { const fragment = window.MozXULElement.parseXULToFragment(` - - - - ${label} - + `); @@ -335,7 +380,7 @@ var gZenMarketplaceManager = { continue; } } - fragment.querySelector('.zenThemeMarketplaceItemContent').appendChild(preferencesWrapper); + contentDiv.appendChild(preferencesWrapper); } this.themesList.appendChild(fragment); } @@ -727,5 +772,5 @@ Preferences.addAll([ id: 'zen.workspaces.individual-pinned-tabs', type: 'bool', default: true, - } + }, ]); diff --git a/src/browser/themes/shared/preferences/zen-preferences.css b/src/browser/themes/shared/preferences/zen-preferences.css index f03bdd81c..7020ec2ab 100644 --- a/src/browser/themes/shared/preferences/zen-preferences.css +++ b/src/browser/themes/shared/preferences/zen-preferences.css @@ -363,7 +363,7 @@ groupbox h2 { position: relative; &::before { - content: ""; + content: ''; position: absolute; top: 50%; left: 50%; @@ -429,6 +429,24 @@ groupbox h2 { margin-left: auto; } +.zenThemeMarketplaceItemPreferenceDialog { + display: flex; + flex-direction: column; + padding: 10px; + min-width: 650px; +} + +.zenThemeMarketplaceItemPreferenceDialogTopBar { + display: flex; + flex-direction: row; + justify-content: space-between; +} + +.zenThemeMarketplaceItemPreferenceDialogContent { + display: flex; + flex-direction: row; +} + /* Disable mozilla's settings */ #dataCollectionCategory,