- Rename extension to "Outcut" throughout all source files and console logs - Add KEY_PRESETS object (gmail/outlook) and matchesAction() helper to keyboard.js - Rewrite handleKeydown to use preset-based dispatch instead of hardcoded switch - Update updateSettings to re-init when keyboardPreset changes - Add keyboardPreset: 'gmail' default to settings-defaults.js - Replace popup Design Tweaks UI with preset dropdown + dynamic help text - Keep all design tweak content script logic intact (activatable via storage) - Update manifest: version 1.0.0, remove activeTab, add homepage_url
197 lines
5.8 KiB
JavaScript
197 lines
5.8 KiB
JavaScript
// Outcut — Popup Settings Logic
|
|
|
|
(function () {
|
|
'use strict';
|
|
|
|
// Defaults — must stay in sync with content/settings-defaults.js
|
|
// (popup runs in its own JS context, no access to content script globals)
|
|
|
|
var DEFAULTS = {
|
|
// Primary feature
|
|
keyboardMultiSelect: true,
|
|
keyboardPreset: 'gmail',
|
|
|
|
// Design tweaks master toggle
|
|
enableDesignTweaks: false,
|
|
|
|
// Theme & Appearance
|
|
theme: 'swiss',
|
|
colorScheme: 'system',
|
|
accentColor: '',
|
|
|
|
// Density & Spacing
|
|
densityPreset: 'compact',
|
|
compactTopBar: true,
|
|
compactCommandBar: true,
|
|
compactMessageList: true,
|
|
compactReadingPane: true,
|
|
compactFolderPane: true,
|
|
narrowDateColumn: true,
|
|
compressComposeToolbar: true,
|
|
readingPaneMaxWidth: true,
|
|
unifiedHeader: false,
|
|
|
|
// Hide Elements
|
|
hideCopilot: true,
|
|
hideSuggestedReplies: true,
|
|
hidePromoBanners: true,
|
|
hideFocusedOtherTabs: true,
|
|
hideSidebarAppIcons: false,
|
|
hideGroupsSection: false,
|
|
hideMyDayButtons: false,
|
|
hideSenderAvatars: false,
|
|
hideFeatureDiscovery: true,
|
|
hideVivaInsights: true,
|
|
hideUnreadOtherBanner: true,
|
|
hideActivityFeed: true,
|
|
|
|
// Readability
|
|
unreadDistinction: true,
|
|
previewOwnLine: false,
|
|
normalizeFontWeight: true,
|
|
darkModeEmailFix: true,
|
|
messageListFontSize: 'medium',
|
|
|
|
// Behavior
|
|
autoCollapseRibbon: true,
|
|
rememberSidebarState: true,
|
|
suppressContactHover: true,
|
|
autoAdvanceAfterDelete: true,
|
|
autoDismissToasts: '5',
|
|
toastPosition: 'top-right',
|
|
stickyReplyBar: true,
|
|
autoResizeCompose: true,
|
|
throttleNotifications: false,
|
|
|
|
// Quick Actions
|
|
markAllReadButton: true,
|
|
quickFolderJump: true,
|
|
};
|
|
|
|
// --- Keyboard help text ---
|
|
function updateKeyboardHelp(presetName) {
|
|
var helpEl = document.getElementById('keyboardHelpText');
|
|
if (!helpEl) return;
|
|
var presets = {
|
|
gmail: 'j/k navigate, x/Space select, # delete, e archive, Shift+i/u read/unread, v move, f flag, p pin, Esc deselect',
|
|
outlook: 'Arrows navigate, Space select, Del/Backspace delete, e archive, q read/unread, v move, f flag, p pin, Esc deselect'
|
|
};
|
|
helpEl.textContent = presets[presetName] || presets.gmail;
|
|
}
|
|
|
|
// --- Load settings and populate UI ---
|
|
function loadUI() {
|
|
chrome.storage.sync.get(DEFAULTS, function (settings) {
|
|
// Checkboxes
|
|
var checkboxes = document.querySelectorAll('input[type="checkbox"][data-setting]');
|
|
for (var i = 0; i < checkboxes.length; i++) {
|
|
checkboxes[i].checked = !!settings[checkboxes[i].dataset.setting];
|
|
}
|
|
|
|
// Selects
|
|
var selects = document.querySelectorAll('select[data-setting]');
|
|
for (var j = 0; j < selects.length; j++) {
|
|
selects[j].value = settings[selects[j].dataset.setting] || '';
|
|
}
|
|
|
|
// Version
|
|
var manifest = chrome.runtime.getManifest();
|
|
document.getElementById('version').textContent = 'v' + manifest.version;
|
|
|
|
// Update help text based on current preset
|
|
updateKeyboardHelp(settings.keyboardPreset || 'gmail');
|
|
});
|
|
}
|
|
|
|
// --- Save a single setting ---
|
|
function saveSetting(key, value) {
|
|
var obj = {};
|
|
obj[key] = value;
|
|
chrome.storage.sync.set(obj);
|
|
}
|
|
|
|
// --- Section accordion ---
|
|
var sectionHeaders = document.querySelectorAll('.or-section-header');
|
|
for (var s = 0; s < sectionHeaders.length; s++) {
|
|
sectionHeaders[s].addEventListener('click', function () {
|
|
this.parentElement.classList.toggle('open');
|
|
});
|
|
}
|
|
|
|
// --- Checkbox change handlers ---
|
|
var checkboxes = document.querySelectorAll('input[type="checkbox"][data-setting]');
|
|
for (var c = 0; c < checkboxes.length; c++) {
|
|
checkboxes[c].addEventListener('change', function () {
|
|
saveSetting(this.dataset.setting, this.checked);
|
|
});
|
|
}
|
|
|
|
// --- Select change handlers ---
|
|
var selects = document.querySelectorAll('select[data-setting]');
|
|
for (var sl = 0; sl < selects.length; sl++) {
|
|
selects[sl].addEventListener('change', function () {
|
|
var settingKey = this.dataset.setting;
|
|
var value = this.value;
|
|
saveSetting(settingKey, value);
|
|
|
|
if (settingKey === 'keyboardPreset') {
|
|
updateKeyboardHelp(value);
|
|
}
|
|
});
|
|
}
|
|
|
|
// --- Export settings ---
|
|
document.getElementById('exportBtn').addEventListener('click', function () {
|
|
chrome.storage.sync.get(DEFAULTS, function (settings) {
|
|
var blob = new Blob([JSON.stringify(settings, null, 2)], { type: 'application/json' });
|
|
var url = URL.createObjectURL(blob);
|
|
var a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = 'outcut-settings.json';
|
|
a.click();
|
|
URL.revokeObjectURL(url);
|
|
});
|
|
});
|
|
|
|
// --- Import settings ---
|
|
document.getElementById('importBtn').addEventListener('click', function () {
|
|
document.getElementById('importFile').click();
|
|
});
|
|
|
|
document.getElementById('importFile').addEventListener('change', function (e) {
|
|
var file = e.target.files[0];
|
|
if (!file) return;
|
|
|
|
var reader = new FileReader();
|
|
reader.onload = function (event) {
|
|
try {
|
|
var imported = JSON.parse(event.target.result);
|
|
var cleaned = {};
|
|
var defaultKeys = Object.keys(DEFAULTS);
|
|
for (var i = 0; i < defaultKeys.length; i++) {
|
|
if (defaultKeys[i] in imported) cleaned[defaultKeys[i]] = imported[defaultKeys[i]];
|
|
}
|
|
chrome.storage.sync.set(cleaned, function () {
|
|
loadUI();
|
|
});
|
|
} catch (err) {
|
|
alert('Invalid settings file.');
|
|
}
|
|
};
|
|
reader.readAsText(file);
|
|
e.target.value = '';
|
|
});
|
|
|
|
// --- Reset to defaults ---
|
|
document.getElementById('resetBtn').addEventListener('click', function () {
|
|
if (confirm('Reset all settings to defaults?')) {
|
|
chrome.storage.sync.set(DEFAULTS, function () {
|
|
loadUI();
|
|
});
|
|
}
|
|
});
|
|
|
|
// --- Init ---
|
|
loadUI();
|
|
})();
|