// Auto-extracted from backup-page.js (verbatim) — augments BackupPage.prototype. Loaded after the base.
Object.assign(BackupPage.prototype, {
enhanceConfigurationWithPresets() {
this.enhanceEngineDetailsButton();
const lastInput = document.querySelector('#config-section [name="CFG_BACKUP_KEEP_LAST"]');
if (!lastInput) return;
const section = lastInput.closest('.config-category');
if (!section || section.dataset.backupPresetEnhanced === '1') return;
section.dataset.backupPresetEnhanced = '1';
const fieldNames = [
'CFG_BACKUP_KEEP_LAST',
'CFG_BACKUP_KEEP_DAILY',
'CFG_BACKUP_KEEP_WEEKLY',
'CFG_BACKUP_KEEP_MONTHLY',
'CFG_BACKUP_KEEP_YEARLY'
];
const inputs = fieldNames
.map(n => section.querySelector(`[name="${n}"]`))
.filter(Boolean);
if (inputs.length < 5) return;
const wrappers = inputs.map(input => {
return input.closest('.config-field, .field-group, .form-group') || input.parentElement;
});
const extraCustomFields = ['CFG_BACKUP_PRUNE_AFTER_FORGET'];
extraCustomFields.forEach(name => {
const el = section.querySelector(`[name="${name}"]`);
if (el) {
const wrap = el.closest('.config-field, .field-group, .form-group') || el.parentElement;
if (wrap) wrappers.push(wrap);
}
});
const readVals = () => ({
last: inputs[0].value || '',
daily: inputs[1].value || '',
weekly: inputs[2].value || '',
monthly: inputs[3].value || '',
yearly: inputs[4].value || ''
});
const preset = backupRetentionDetectPreset(readVals());
const meta = BACKUP_RETENTION_PRESET_META[preset];
const presetOptions = this.retentionPresetOptions(preset, false);
const block = document.createElement('div');
block.className = 'backup-retention-preset-block';
block.innerHTML = `
`;
const fieldsGrid = section.querySelector('.config-fields');
if (fieldsGrid) {
fieldsGrid.prepend(block);
} else {
section.prepend(block);
}
const applyVisibility = (presetKey) => {
const isCustom = presetKey === 'custom';
wrappers.forEach(w => { if (w) w.style.display = isCustom ? '' : 'none'; });
};
applyVisibility(preset);
const select = block.querySelector('[data-backup-retention-preset]');
const tooltipEl = block.querySelector('[data-retention-tooltip]');
select.addEventListener('change', () => {
const chosen = select.value;
if (tooltipEl) tooltipEl.title = BACKUP_RETENTION_PRESET_META[chosen]?.hint || '';
applyVisibility(chosen);
if (chosen === 'custom') return;
const p = BACKUP_RETENTION_PRESETS[chosen];
const map = { last: 0, daily: 1, weekly: 2, monthly: 3, yearly: 4 };
Object.entries(map).forEach(([k, i]) => {
inputs[i].value = p[k];
inputs[i].dispatchEvent(new Event('input', { bubbles: true }));
inputs[i].dispatchEvent(new Event('change', { bubbles: true }));
});
});
},
retentionPresetOptions(selected, includeInherit = false) {
const defaultKey = includeInherit ? 'inherit-global' : 'self-hosting';
const keys = Object.keys(BACKUP_RETENTION_PRESET_META)
.filter(k => k !== 'inherit-global' || includeInherit);
const ordered = [defaultKey, ...keys.filter(k => k !== defaultKey)];
return ordered.map(k => {
const base = BACKUP_RETENTION_PRESET_META[k].label;
const label = k === defaultKey ? `${base} (default)` : base;
return ``;
}).join('');
},
applyRetentionPreset(selectEl) {
const block = selectEl.closest('[data-retention-prefix]');
const advanced = block?.nextElementSibling;
if (!block) return;
const prefix = block.dataset.retentionPrefix;
const allowInherit = block.dataset.retentionAllowInherit === '1';
const preset = selectEl.value;
const tooltipEl = block.querySelector('[data-retention-tooltip]');
if (tooltipEl) tooltipEl.title = BACKUP_RETENTION_PRESET_META[preset]?.hint || '';
if (preset === 'custom') {
if (advanced) advanced.hidden = false;
} else {
if (advanced) advanced.hidden = true;
const p = BACKUP_RETENTION_PRESETS[preset];
if (p) {
const setField = (suffix, value) => {
const el = document.querySelector(`[name="${prefix}${suffix}"]`);
if (el) {
el.value = value;
el.dispatchEvent(new Event('input', { bubbles: true }));
}
};
setField('KEEP_LAST', p.last);
setField('KEEP_DAILY', p.daily);
setField('KEEP_WEEKLY', p.weekly);
setField('KEEP_MONTHLY', p.monthly);
setField('KEEP_YEARLY', p.yearly);
}
}
// Keep CUSTOM_RETENTION in sync with the preset (location scope only).
if (allowInherit) {
const cr = block.querySelector(`[name="${prefix}CUSTOM_RETENTION"]`);
if (cr) cr.value = preset === 'inherit-global' ? 'false' : 'true';
}
},
});