@ukhomeoffice/cop-react-form-renderer 5.49.0 → 5.49.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/FormComponent/FormComponent.test.js +75 -0
- package/dist/utils/Component/getComponent.js +1 -0
- package/dist/utils/Component/getDefaultValueFromConfig.js +1 -1
- package/dist/utils/Validate/validateDate.js +35 -41
- package/dist/utils/Validate/validateDate.test.js +21 -1
- package/dist/utils/Validate/validateTime.js +22 -25
- package/dist/utils/Validate/validateTime.test.js +10 -0
- package/package.json +1 -1
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
4
5
|
var _react = _interopRequireDefault(require("react"));
|
|
5
6
|
var _setupTests = require("../../setupTests");
|
|
6
7
|
var _FormComponent = _interopRequireDefault(require("./FormComponent"));
|
|
8
|
+
var _models = require("../../models");
|
|
7
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
10
|
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
9
11
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
@@ -347,5 +349,78 @@ describe('components', function () {
|
|
|
347
349
|
}
|
|
348
350
|
}, _callee9);
|
|
349
351
|
})));
|
|
352
|
+
it('should correctly handle a nested file input on change event within a nested container', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() {
|
|
353
|
+
var ID, NESTED_CONTAINER_ID, NESTED_ID, COMPONENT, DATA, ON_CHANGE_ARGS, ON_CHANGE_COUNT, ON_CHANGE, _renderWithValidation10, container, c, formGroup, fieldSet, input, FILE_EXTENSION, FILE_NAME, FILE_TYPE, str, blob, FILE;
|
|
354
|
+
return _regeneratorRuntime().wrap(function _callee10$(_context10) {
|
|
355
|
+
while (1) switch (_context10.prev = _context10.next) {
|
|
356
|
+
case 0:
|
|
357
|
+
ID = 'component';
|
|
358
|
+
NESTED_CONTAINER_ID = 'nested-container-component';
|
|
359
|
+
NESTED_ID = 'nested-component';
|
|
360
|
+
COMPONENT = {
|
|
361
|
+
id: ID,
|
|
362
|
+
fieldId: ID,
|
|
363
|
+
type: _models.ComponentTypes.CHECKBOXES,
|
|
364
|
+
label: 'Checkboxes component',
|
|
365
|
+
data: {
|
|
366
|
+
options: [{
|
|
367
|
+
value: 'EPSILON',
|
|
368
|
+
label: 'Epsilon Label'
|
|
369
|
+
}, {
|
|
370
|
+
value: 'GAMMA',
|
|
371
|
+
label: 'Gamma Label',
|
|
372
|
+
nested: [{
|
|
373
|
+
id: NESTED_CONTAINER_ID,
|
|
374
|
+
fieldId: NESTED_CONTAINER_ID,
|
|
375
|
+
type: _models.ComponentTypes.CONTAINER,
|
|
376
|
+
components: [{
|
|
377
|
+
id: NESTED_ID,
|
|
378
|
+
fieldId: NESTED_ID,
|
|
379
|
+
label: 'File upload',
|
|
380
|
+
type: _models.ComponentTypes.FILE
|
|
381
|
+
}]
|
|
382
|
+
}]
|
|
383
|
+
}]
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
DATA = {
|
|
387
|
+
component: 'GAMMA'
|
|
388
|
+
};
|
|
389
|
+
ON_CHANGE_ARGS = [];
|
|
390
|
+
ON_CHANGE_COUNT = 0;
|
|
391
|
+
ON_CHANGE = function ON_CHANGE(_ref13) {
|
|
392
|
+
var target = _ref13.target;
|
|
393
|
+
ON_CHANGE_ARGS.push(target);
|
|
394
|
+
ON_CHANGE_COUNT += 1;
|
|
395
|
+
};
|
|
396
|
+
_renderWithValidation10 = (0, _setupTests.renderWithValidation)( /*#__PURE__*/_react.default.createElement(_FormComponent.default, {
|
|
397
|
+
"data-testid": ID,
|
|
398
|
+
component: COMPONENT,
|
|
399
|
+
value: DATA[ID],
|
|
400
|
+
onChange: ON_CHANGE,
|
|
401
|
+
formData: DATA
|
|
402
|
+
})), container = _renderWithValidation10.container; // Get hold of the file input.
|
|
403
|
+
c = container.childNodes[0];
|
|
404
|
+
formGroup = c.childNodes[0];
|
|
405
|
+
fieldSet = formGroup.childNodes[2];
|
|
406
|
+
input = fieldSet.childNodes[2].childNodes[0].childNodes[0].childNodes[2].childNodes[0];
|
|
407
|
+
FILE_EXTENSION = 'json';
|
|
408
|
+
FILE_NAME = "test.".concat(FILE_EXTENSION);
|
|
409
|
+
FILE_TYPE = 'application/JSON';
|
|
410
|
+
str = JSON.stringify({
|
|
411
|
+
alpha: 'bravo'
|
|
412
|
+
});
|
|
413
|
+
blob = new Blob([str]);
|
|
414
|
+
FILE = new File([blob], FILE_NAME, {
|
|
415
|
+
type: FILE_TYPE
|
|
416
|
+
});
|
|
417
|
+
_userEvent.default.upload(input, FILE);
|
|
418
|
+
expect(ON_CHANGE_COUNT).toEqual(3);
|
|
419
|
+
case 21:
|
|
420
|
+
case "end":
|
|
421
|
+
return _context10.stop();
|
|
422
|
+
}
|
|
423
|
+
}, _callee10);
|
|
424
|
+
})));
|
|
350
425
|
});
|
|
351
426
|
});
|
|
@@ -79,7 +79,7 @@ var setupDefaultObjectValue = function setupDefaultObjectValue(defaultObject, da
|
|
|
79
79
|
// be used as field names to get values from data.
|
|
80
80
|
if (defaultObj.sourced) {
|
|
81
81
|
var _result;
|
|
82
|
-
(_result = result) !== null && _result !== void 0 ? _result :
|
|
82
|
+
result = (_result = result) !== null && _result !== void 0 ? _result : {};
|
|
83
83
|
Object.keys(defaultObj.sourced).every(function (key) {
|
|
84
84
|
var sourcedValue = typeof defaultObj.sourced[key] === 'string' && (0, _getSourceData.default)(data, defaultObj.sourced[key]);
|
|
85
85
|
if (sourcedValue === undefined && defaultObj.skipIfSourceInvalid) {
|
|
@@ -31,7 +31,7 @@ var maxMonthDays = exports.maxMonthDays = function maxMonthDays(month, year) {
|
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
33
33
|
* Checks if a date passed is a valid date.
|
|
34
|
-
* This will validate for 'leap years', missing components, invalid day,
|
|
34
|
+
* This will validate for 'leap years', missing components, invalid day, month or year components.
|
|
35
35
|
* EXAMPLE USE : const { message, propsInError } = validateDate('2-11-2020')
|
|
36
36
|
*
|
|
37
37
|
* Note that an empty string is not considered invalid. You should use
|
|
@@ -56,53 +56,47 @@ var validateDate = function validateDate(date) {
|
|
|
56
56
|
year = _formattedDate$split2[2];
|
|
57
57
|
var intDay = parseInt(day, 10);
|
|
58
58
|
var intMonth = parseInt(month, 10);
|
|
59
|
+
var badProps = [];
|
|
60
|
+
var messages = [];
|
|
59
61
|
if (year.length === 0) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
if (year.length !== 4) {
|
|
68
|
-
return {
|
|
69
|
-
message: 'Year must be 4 numbers',
|
|
70
|
-
propsInError: {
|
|
71
|
-
year: true
|
|
72
|
-
}
|
|
73
|
-
};
|
|
62
|
+
badProps.push('year');
|
|
63
|
+
messages.push('Date must include a year');
|
|
64
|
+
} else if (year.length !== 4) {
|
|
65
|
+
badProps.push('year');
|
|
66
|
+
messages.push('Year must be 4 numbers');
|
|
74
67
|
}
|
|
75
68
|
if (month.length === 0) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
if (intMonth > 12 || intMonth < 1) {
|
|
84
|
-
return {
|
|
85
|
-
message: 'Month must be between 1 and 12',
|
|
86
|
-
propsInError: {
|
|
87
|
-
month: true
|
|
88
|
-
}
|
|
89
|
-
};
|
|
69
|
+
badProps.push('month');
|
|
70
|
+
messages.push('Date must include a month');
|
|
71
|
+
} else if (intMonth > 12 || intMonth < 1) {
|
|
72
|
+
badProps.push('month');
|
|
73
|
+
messages.push('Month must be between 1 and 12');
|
|
90
74
|
}
|
|
91
75
|
if (day.length === 0) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
76
|
+
badProps.push('day');
|
|
77
|
+
messages.push('Date must include a day');
|
|
78
|
+
} else {
|
|
79
|
+
var maxDays = maxMonthDays(month, year);
|
|
80
|
+
if (intDay > maxDays || intDay < 1) {
|
|
81
|
+
badProps.push('day');
|
|
82
|
+
messages.push("Day must be between 1 and ".concat(maxDays));
|
|
83
|
+
}
|
|
98
84
|
}
|
|
99
|
-
|
|
100
|
-
|
|
85
|
+
if (badProps.length > 0) {
|
|
86
|
+
// return single error or generic error if multiple problem
|
|
87
|
+
var propsInError = {};
|
|
88
|
+
if (badProps.includes('day')) {
|
|
89
|
+
propsInError.day = true;
|
|
90
|
+
}
|
|
91
|
+
if (badProps.includes('month')) {
|
|
92
|
+
propsInError.month = true;
|
|
93
|
+
}
|
|
94
|
+
if (badProps.includes('year')) {
|
|
95
|
+
propsInError.year = true;
|
|
96
|
+
}
|
|
101
97
|
return {
|
|
102
|
-
message:
|
|
103
|
-
propsInError:
|
|
104
|
-
day: true
|
|
105
|
-
}
|
|
98
|
+
message: badProps.length === 1 ? messages[0] : 'Enter a valid date',
|
|
99
|
+
propsInError: propsInError
|
|
106
100
|
};
|
|
107
101
|
}
|
|
108
102
|
if ((0, _dayjs.default)(formattedDate, _utils.DATE_FORMAT).format(_utils.DATE_FORMAT) !== formattedDate) {
|
|
@@ -55,7 +55,8 @@ describe('utils', function () {
|
|
|
55
55
|
});
|
|
56
56
|
});
|
|
57
57
|
test('should return an error if the year contains more than 4 numbers', function () {
|
|
58
|
-
|
|
58
|
+
// 20202 is not a leap year,so 29th Feb not valid
|
|
59
|
+
var output = (0, _validateDate.default)('28-02-20202', 'DD-MM-YYYY');
|
|
59
60
|
expect(output).toEqual({
|
|
60
61
|
message: 'Year must be 4 numbers',
|
|
61
62
|
propsInError: {
|
|
@@ -99,6 +100,25 @@ describe('utils', function () {
|
|
|
99
100
|
}
|
|
100
101
|
});
|
|
101
102
|
});
|
|
103
|
+
test('should handle multiple errors', function () {
|
|
104
|
+
var output = (0, _validateDate.default)('45-13-2020', 'DD-MM-YYYY');
|
|
105
|
+
expect(output).toEqual({
|
|
106
|
+
message: 'Enter a valid date',
|
|
107
|
+
propsInError: {
|
|
108
|
+
day: true,
|
|
109
|
+
month: true
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
var output2 = (0, _validateDate.default)('45-13-', 'DD-MM-YYYY');
|
|
113
|
+
expect(output2).toEqual({
|
|
114
|
+
message: 'Enter a valid date',
|
|
115
|
+
propsInError: {
|
|
116
|
+
day: true,
|
|
117
|
+
month: true,
|
|
118
|
+
year: true
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
102
122
|
test('should correctly identify the maximum numbers of days in a given month and year', function () {
|
|
103
123
|
var max = (0, _validateDate.maxMonthDays)('02', '2024');
|
|
104
124
|
expect(max).toEqual(29);
|
|
@@ -37,36 +37,33 @@ var validateTime = function validateTime(time) {
|
|
|
37
37
|
minute = _formattedDate$split2[1];
|
|
38
38
|
var intHour = parseInt(hour, 10);
|
|
39
39
|
var intMinute = parseInt(minute, 10);
|
|
40
|
+
var badProps = [];
|
|
41
|
+
var messages = [];
|
|
40
42
|
if (hour.length === 0) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
if (intHour > 23 || intHour < 0) {
|
|
49
|
-
return {
|
|
50
|
-
message: 'Hour must be between 0 and 23',
|
|
51
|
-
propsInError: {
|
|
52
|
-
hour: true
|
|
53
|
-
}
|
|
54
|
-
};
|
|
43
|
+
badProps.push('hour');
|
|
44
|
+
messages.push('Time must include a hour');
|
|
45
|
+
} else if (intHour > 23 || intHour < 0) {
|
|
46
|
+
badProps.push('hour');
|
|
47
|
+
messages.push('Hour must be between 0 and 23');
|
|
55
48
|
}
|
|
56
49
|
if (minute.length === 0) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
};
|
|
50
|
+
badProps.push('minute');
|
|
51
|
+
messages.push('Time must include a minute');
|
|
52
|
+
} else if (intMinute > 59 || intMinute < 0) {
|
|
53
|
+
badProps.push('minute');
|
|
54
|
+
messages.push('Minute must be between 0 and 59');
|
|
63
55
|
}
|
|
64
|
-
if (
|
|
56
|
+
if (badProps.length > 0) {
|
|
57
|
+
var propsInError = {};
|
|
58
|
+
if (badProps.includes('hour')) {
|
|
59
|
+
propsInError.hour = true;
|
|
60
|
+
}
|
|
61
|
+
if (badProps.includes('minute')) {
|
|
62
|
+
propsInError.minute = true;
|
|
63
|
+
}
|
|
65
64
|
return {
|
|
66
|
-
message:
|
|
67
|
-
propsInError:
|
|
68
|
-
minute: true
|
|
69
|
-
}
|
|
65
|
+
message: badProps.length > 1 ? 'Enter a valid time' : messages[0],
|
|
66
|
+
propsInError: propsInError
|
|
70
67
|
};
|
|
71
68
|
}
|
|
72
69
|
return {
|
|
@@ -54,6 +54,16 @@ describe('utils', function () {
|
|
|
54
54
|
}
|
|
55
55
|
});
|
|
56
56
|
});
|
|
57
|
+
test('should report multiple errors', function () {
|
|
58
|
+
var output = (0, _validateTime.default)('24:75');
|
|
59
|
+
expect(output).toEqual({
|
|
60
|
+
message: 'Enter a valid time',
|
|
61
|
+
propsInError: {
|
|
62
|
+
hour: true,
|
|
63
|
+
minute: true
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
57
67
|
});
|
|
58
68
|
});
|
|
59
69
|
});
|