From ba56114e9fe8f2ab51d278f8f434222b23bf76b7 Mon Sep 17 00:00:00 2001 From: badrAZ Date: Tue, 14 Aug 2018 12:18:41 +0200 Subject: [PATCH] fix(xo-web/backup-ng/new): schedule's name overridden with undefined if it's not been edited (#3288) Fixes #3286 --- CHANGELOG.md | 2 + packages/xo-server/src/api/schedule.js | 2 +- .../xo-web/src/xo-app/backup-ng/new/index.js | 7 +- .../src/xo-app/backup-ng/new/new-schedule.js | 224 ++++++++++-------- .../src/xo-app/backup-ng/new/schedules.js | 2 +- 5 files changed, 128 insertions(+), 109 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd3822b05..91b0a83b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ ### Bug fixes +- [Backup NG form] Fix schedule's name overridden with undefined if it's not been edited [#3286](https://github.com/vatesfr/xen-orchestra/issues/3286) (PR [#3288](https://github.com/vatesfr/xen-orchestra/pull/3288)) + ### Released packages - xo-server v5.25.0 diff --git a/packages/xo-server/src/api/schedule.js b/packages/xo-server/src/api/schedule.js index d0a489e08..763b5ce30 100644 --- a/packages/xo-server/src/api/schedule.js +++ b/packages/xo-server/src/api/schedule.js @@ -49,7 +49,7 @@ set.params = { enabled: { type: 'boolean', optional: true }, id: { type: 'string' }, jobId: { type: 'string', optional: true }, - name: { type: 'string', optional: true }, + name: { type: ['string', 'null'], optional: true }, timezone: { type: 'string', optional: true }, } diff --git a/packages/xo-web/src/xo-app/backup-ng/new/index.js b/packages/xo-web/src/xo-app/backup-ng/new/index.js index ec97e783e..1689284ff 100644 --- a/packages/xo-web/src/xo-app/backup-ng/new/index.js +++ b/packages/xo-web/src/xo-app/backup-ng/new/index.js @@ -132,7 +132,7 @@ const getInitialState = () => ({ snapshotMode: false, srs: [], tags: {}, - tmpSchedule: {}, + tmpSchedule: undefined, vms: [], }) @@ -368,7 +368,7 @@ export default [ }), cancelSchedule: () => state => ({ ...state, - tmpSchedule: {}, + tmpSchedule: undefined, editionMode: undefined, }), editSchedule: (_, schedule) => state => ({ @@ -398,7 +398,6 @@ export default [ settings = propSettings, tmpSchedule, }) => { - name = name !== undefined && name.trim() === '' ? undefined : name if (editionMode === 'creation') { const id = generateRandomId() return { @@ -430,7 +429,7 @@ export default [ editionMode: undefined, schedules, settings: settings.set(id, setting), - tmpSchedule: {}, + tmpSchedule: undefined, } }, setPowerState: (_, powerState) => state => ({ diff --git a/packages/xo-web/src/xo-app/backup-ng/new/new-schedule.js b/packages/xo-web/src/xo-app/backup-ng/new/new-schedule.js index 002c99e9f..451479c53 100644 --- a/packages/xo-web/src/xo-app/backup-ng/new/new-schedule.js +++ b/packages/xo-web/src/xo-app/backup-ng/new/new-schedule.js @@ -1,6 +1,5 @@ import _ from 'intl' import ActionButton from 'action-button' -import defined from 'xo-defined' import moment from 'moment-timezone' import React from 'react' import Scheduler, { SchedulePreview } from 'scheduling' @@ -32,11 +31,20 @@ export default [ exportRetention, formId: generateRandomId(), idInputName: generateRandomId(), - name: undefined, + schedule: undefined, snapshotRetention, timezone, }), effects: { + setSchedule: (_, { name, value }) => ({ + tmpSchedule, + schedule = tmpSchedule, + }) => ({ + schedule: { + ...schedule, + [name]: value, + }, + }), setExportRetention: (_, value) => state => ({ ...state, exportRetention: value, @@ -49,14 +57,17 @@ export default [ ...state, snapshotRetention: value, }), - setSchedule: (_, { cronPattern, timezone }) => state => ({ + setCronTimezone: (_, { cronPattern, timezone }) => state => ({ ...state, cron: cronPattern, timezone, }), - setName: (_, { target: { value } }) => () => ({ - name: value, - }), + setName: ({ setSchedule }, { target: { value } }) => () => { + setSchedule({ + name: 'name', + value: value.trim() === '' ? null : value, + }) + }, }, computed: { isScheduleInvalid: ({ retentionNeeded, scheduleNotEdited }) => @@ -80,27 +91,26 @@ export default [ cron, editionMode, exportRetention, - name, + schedule, snapshotRetention, timezone, }, - { schedule } + { schedule: propSchedule } ) => editionMode !== 'creation' && + schedule === undefined && isEqual( { - copyRetention: schedule.copyRetention, - cron: schedule.cron, - exportRetention: schedule.exportRetention, - name: schedule.name, - snapshotRetention: schedule.snapshotRetention, - timezone: schedule.timezone, + copyRetention: propSchedule.copyRetention, + cron: propSchedule.cron, + exportRetention: propSchedule.exportRetention, + snapshotRetention: propSchedule.snapshotRetention, + timezone: propSchedule.timezone, }, { copyRetention, cron, exportRetention, - name, snapshotRetention, timezone, } @@ -108,93 +118,101 @@ export default [ }, }), injectState, - ({ effects, state }) => ( -
- - - - - { + const { tmpSchedule = {}, schedule = tmpSchedule } = state + const { name } = schedule + + return ( + + + + + + + + {state.exportMode && ( + + + + + )} + {state.copyMode && ( + + + + + )} + {state.snapshotMode && ( + + + + + )} + - - {state.exportMode && ( - - - - - )} - {state.copyMode && ( - - - - - )} - {state.snapshotMode && ( - - - - - )} - - -
- - {_('formSave')} - - - {_('formCancel')} - -
-
-
- ), + +
+ + {_('formSave')} + + + {_('formCancel')} + + + + + ) + }, ].reduceRight((value, decorator) => decorator(value)) diff --git a/packages/xo-web/src/xo-app/backup-ng/new/schedules.js b/packages/xo-web/src/xo-app/backup-ng/new/schedules.js index a7dac7a91..a34b815a1 100644 --- a/packages/xo-web/src/xo-app/backup-ng/new/schedules.js +++ b/packages/xo-web/src/xo-app/backup-ng/new/schedules.js @@ -152,7 +152,7 @@ export default [ )}