update: add policy to update apps separately from platform

This commit is contained in:
Girish Ramakrishnan
2026-03-15 19:09:54 +05:30
parent db974d72d5
commit f334c696cb
24 changed files with 222 additions and 169 deletions
+45 -33
View File
@@ -30,7 +30,8 @@ const taskLogsMenu = ref([]);
const apps = ref([]);
const version = ref('');
const ubuntuVersion = ref('');
const currentPattern = ref('');
const currentSchedule = ref('');
const currentPolicy = ref('');
const updateBusy = ref(false);
const updateError = ref({});
const stopError = ref({});
@@ -55,17 +56,16 @@ const inProgressApps = computed(() => {
const configureDialog = useTemplateRef('configureDialog');
const configureBusy = ref(false);
const configureError = ref('');
const configureType = ref('');
const configurePattern = ref('');
const configurePolicy = ref('');
const configureDays = ref([]);
const configureHours = ref([]);
async function refreshAutoupdatePattern() {
const [error, result] = await updaterModel.getAutoupdatePattern();
async function refreshAutoupdateConfig() {
const [error, result] = await updaterModel.getAutoupdateConfig();
if (error) return console.error(error);
currentPattern.value = result.pattern;
configurePattern.value = result.pattern;
currentSchedule.value = result.schedule;
currentPolicy.value = result.policy;
}
async function refreshApps() {
@@ -87,21 +87,22 @@ async function refreshPendingUpdateInfo() {
}
function onShowConfigure() {
if (currentPattern.value === 'never') {
configureType.value = 'never';
} else {
configureType.value = 'pattern';
const result = parseSchedule(currentPattern.value);
configureDays.value = result.days; // Array of cronDays.id
configureHours.value = result.hours; // Array of cronHours.id
configurePolicy.value = currentPolicy.value || 'never';
if (currentPolicy.value !== 'never') {
const result = parseSchedule(currentSchedule.value);
configureDays.value = result.days;
configureHours.value = result.hours;
}
configureDialog.value.open();
}
async function onSubmitConfigure() {
let pattern = 'never';
if (configureType.value === 'pattern') {
let schedule = currentSchedule.value || '00 00 1,3,5,23 * * *';
const policy = configurePolicy.value;
if (policy !== 'never') {
let daysPattern;
if (configureDays.value.length === 7) daysPattern = '*';
else daysPattern = configureDays.value.join(',');
@@ -110,18 +111,18 @@ async function onSubmitConfigure() {
if (configureHours.value.length === 24) hoursPattern = '*';
else hoursPattern = configureHours.value.join(',');
pattern ='00 00 ' + hoursPattern + ' * * ' + daysPattern;
schedule = '00 00 ' + hoursPattern + ' * * ' + daysPattern;
}
configureBusy.value = true;
const [error] = await updaterModel.setAutoupdatePattern(pattern);
const [error] = await updaterModel.setAutoupdateConfig(schedule, policy);
if (error) {
configureError.value = error.body ? error.body.message : 'Internal error';
configureBusy.value = false;
return console.error(error);
}
await refreshAutoupdatePattern();
await refreshAutoupdateConfig();
configureBusy.value = false;
configureDialog.value.close();
@@ -239,7 +240,7 @@ onMounted(async () => {
ubuntuVersion.value = result.ubuntuVersion;
await refreshPendingUpdateInfo();
await refreshAutoupdatePattern();
await refreshAutoupdateConfig();
await refreshTasks();
ready.value = true;
@@ -288,25 +289,35 @@ onMounted(async () => {
</Dialog>
<Dialog ref="configureDialog"
:title="$t('settings.updateScheduleDialog.title')"
:title="$t('settings.configureUpdates.title')"
:confirm-label="$t('main.dialog.save')"
:confirm-active="configureType === 'never' ? true : (configureHours.length > 0 && configureDays.length > 0)"
:confirm-active="configurePolicy === 'never' ? true : (configureHours.length > 0 && configureDays.length > 0)"
:confirm-busy="configureBusy"
:reject-label="$t('main.dialog.cancel')"
:reject-active="!configureBusy"
reject-style="secondary"
@confirm="onSubmitConfigure()"
>
<FormGroup>
<div description v-html="$t('settings.updateScheduleDialog.description')"></div>
<p class="has-error text-center" v-show="configureError">{{ configureError }}</p>
<Radiobutton v-model="configureType" value="never" :label="$t('settings.updateScheduleDialog.disableCheckbox')" />
<Radiobutton v-model="configureType" value="pattern" :label="$t('settings.updateScheduleDialog.enableCheckbox')"/>
<label>{{ $t('settings.configureUpdates.policy') }}</label>
<div>{{ $t('settings.configureUpdates.policyDescription') }}</div>
<div style="padding-top: 10px">
<Radiobutton v-model="configurePolicy" value="never" :label="$t('settings.updates.disabled')" />
<Radiobutton v-model="configurePolicy" value="apps_only" :label="$t('settings.updates.appsOnly')" />
<Radiobutton v-model="configurePolicy" value="platform_and_apps" :label="$t('settings.updates.platformAndApps')" />
</div>
</FormGroup>
<div v-show="configureType === 'pattern'" style="display: flex; gap: 10px; align-items: center; margin: 10px 0px 0px 25px">
<div>{{ $t('settings.updateScheduleDialog.days') }}: <MultiSelect v-model="configureDays" :options="cronDays" option-label="name" option-key="id"/></div>
<div>{{ $t('settings.updateScheduleDialog.hours') }}: <MultiSelect v-model="configureHours" :options="cronHours" option-label="name" option-key="id"/></div>
<div class="text-small text-danger" v-show="configureType === 'pattern' && !(configureHours.length !== 0 && configureDays.length !== 0)">{{ $t('settings.updateScheduleDialog.selectOne') }}</div>
<FormGroup>
<div v-show="configurePolicy !== 'never'">
<label>{{ $t('settings.configureUpdates.schedule') }}</label>
<div style="display: flex; gap: 10px; align-items: center; margin-top: 12px">
<div>{{ $t('settings.configureUpdates.days') }}: <MultiSelect v-model="configureDays" :options="cronDays" option-label="name" option-key="id"/></div>
<div>{{ $t('settings.configureUpdates.hours') }}: <MultiSelect v-model="configureHours" :options="cronHours" option-label="name" option-key="id"/></div>
<div class="text-small text-danger" v-show="!(configureHours.length !== 0 && configureDays.length !== 0)">{{ $t('settings.updateScheduleDialog.selectOne') }}</div>
</div>
</div>
</FormGroup>
</Dialog>
@@ -321,9 +332,10 @@ onMounted(async () => {
<SettingsItem v-if="ready">
<div>
<label>{{ $t('settings.updates.schedule') }}</label>
<span v-if="currentPattern !== 'never'">{{ prettySchedule(currentPattern) }}</span>
<span v-else>{{ $t('settings.updates.disabled') }}</span>
<label>{{ $t('settings.updates.config') }}</label>
<span v-if="currentPolicy === 'never'">{{ $t('settings.updates.disabled') }}</span>
<span v-else-if="currentPolicy === 'apps_only'">{{ $t('settings.updates.appsOnly') }} - {{ prettySchedule(currentSchedule) }}</span>
<span v-else>{{ $t('settings.updates.platformAndApps') }} - {{ prettySchedule(currentSchedule) }}</span>
</div>
<div style="display: flex; align-items: center">
<Button tool plain @click="onShowConfigure()">{{ $t('main.dialog.edit') }}</Button>
+4 -4
View File
@@ -17,10 +17,10 @@ function create() {
if (error || result.status !== 200) return [error || result];
return [null, result.body.update];
},
async getAutoupdatePattern() {
async getAutoupdateConfig() {
let error, result;
try {
result = await fetcher.get(`${API_ORIGIN}/api/v1/updater/autoupdate_pattern`, { access_token: accessToken });
result = await fetcher.get(`${API_ORIGIN}/api/v1/updater/autoupdate_config`, { access_token: accessToken });
} catch (e) {
error = e;
}
@@ -28,10 +28,10 @@ function create() {
if (error || result.status !== 200) return [error || result];
return [null, result.body];
},
async setAutoupdatePattern(pattern) {
async setAutoupdateConfig(schedule, policy) {
let error, result;
try {
result = await fetcher.post(`${API_ORIGIN}/api/v1/updater/autoupdate_pattern`, { pattern }, { access_token: accessToken });
result = await fetcher.post(`${API_ORIGIN}/api/v1/updater/autoupdate_config`, { schedule, policy }, { access_token: accessToken });
} catch (e) {
error = e;
}