From da2bf4c51033a43918e16b25446edccad319ab8d Mon Sep 17 00:00:00 2001 From: Kia Lam Date: Thu, 19 Aug 2021 18:39:05 -0400 Subject: [PATCH] Validate that start/end datetime creates at least 1 schedule. --- awx/ui/package-lock.json | 14 ++++++------- awx/ui/package.json | 2 +- .../Schedule/shared/ScheduleForm.js | 21 ++++++++++++++++++- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/awx/ui/package-lock.json b/awx/ui/package-lock.json index 806ff65921..7c54c850b5 100644 --- a/awx/ui/package-lock.json +++ b/awx/ui/package-lock.json @@ -29,7 +29,7 @@ "react-error-boundary": "^3.1.3", "react-router-dom": "^5.1.2", "react-virtualized": "^9.21.1", - "rrule": "^2.6.4", + "rrule": "2.6.4", "sanitize-html": "2.4.0", "styled-components": "5.3.0" }, @@ -20990,9 +20990,9 @@ "dev": true }, "node_modules/rrule": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.6.8.tgz", - "integrity": "sha512-cUaXuUPrz9d1wdyzHsBfT1hptKlGgABeCINFXFvulEPqh9Np9BnF3C3lrv9uO54IIr8VDb58tsSF3LhsW+4VRw==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.6.4.tgz", + "integrity": "sha512-sLdnh4lmjUqq8liFiOUXD5kWp/FcnbDLPwq5YAc/RrN6120XOPb86Ae5zxF7ttBVq8O3LxjjORMEit1baluahA==", "dependencies": { "tslib": "^1.10.0" }, @@ -43726,9 +43726,9 @@ } }, "rrule": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.6.8.tgz", - "integrity": "sha512-cUaXuUPrz9d1wdyzHsBfT1hptKlGgABeCINFXFvulEPqh9Np9BnF3C3lrv9uO54IIr8VDb58tsSF3LhsW+4VRw==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.6.4.tgz", + "integrity": "sha512-sLdnh4lmjUqq8liFiOUXD5kWp/FcnbDLPwq5YAc/RrN6120XOPb86Ae5zxF7ttBVq8O3LxjjORMEit1baluahA==", "requires": { "luxon": "^1.21.3", "tslib": "^1.10.0" diff --git a/awx/ui/package.json b/awx/ui/package.json index 9e981eaf13..33374e0d6d 100644 --- a/awx/ui/package.json +++ b/awx/ui/package.json @@ -29,7 +29,7 @@ "react-error-boundary": "^3.1.3", "react-router-dom": "^5.1.2", "react-virtualized": "^9.21.1", - "rrule": "^2.6.4", + "rrule": "2.6.4", "sanitize-html": "2.4.0", "styled-components": "5.3.0" }, diff --git a/awx/ui/src/components/Schedule/shared/ScheduleForm.js b/awx/ui/src/components/Schedule/shared/ScheduleForm.js index 782c192b87..da3a945c15 100644 --- a/awx/ui/src/components/Schedule/shared/ScheduleForm.js +++ b/awx/ui/src/components/Schedule/shared/ScheduleForm.js @@ -30,6 +30,13 @@ import { import FrequencyDetailSubform from './FrequencyDetailSubform'; import SchedulePromptableFields from './SchedulePromptableFields'; import DateTimePicker from './DateTimePicker'; +import buildRuleObj from './buildRuleObj'; + +const NUM_DAYS_PER_FREQUENCY = { + week: 7, + month: 31, + year: 365, +}; const generateRunOnTheDay = (days = []) => { if ( @@ -555,6 +562,19 @@ function ScheduleForm({ startDate, } = values; + if ( + end === 'onDate' && + DateTime.fromISO(endDate) + .diff(DateTime.fromISO(startDate), 'days') + .toObject().days < NUM_DAYS_PER_FREQUENCY[frequency] + ) { + const rule = new RRule(buildRuleObj(values)); + if (rule.all().length === 0) { + errors.startDate = t`Selected date range must have at least 1 schedule occurrence.`; + errors.endDate = t`Selected date range must have at least 1 schedule occurrence.`; + } + } + if ( end === 'onDate' && DateTime.fromISO(startDate) >= DateTime.fromISO(endDate) @@ -569,7 +589,6 @@ function ScheduleForm({ ) { errors.runOn = t`Please select a day number between 1 and 31.`; } - return errors; }} >