@bigbinary/neeto-molecules 1.0.8 → 1.0.9

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.
Files changed (39) hide show
  1. package/dist/BrowserSupport.cjs.js +2 -1462
  2. package/dist/BrowserSupport.js +2 -1456
  3. package/dist/Columns.cjs.js +1 -183
  4. package/dist/Columns.js +1 -177
  5. package/dist/CustomDomain.cjs.js +2 -753
  6. package/dist/CustomDomain.js +2 -727
  7. package/dist/DateFormat.cjs.js +1 -46
  8. package/dist/DateFormat.js +1 -40
  9. package/dist/DateRangeFilter.cjs.js +1 -234
  10. package/dist/DateRangeFilter.js +1 -227
  11. package/dist/DynamicVariables.cjs.js +1 -112
  12. package/dist/DynamicVariables.js +1 -106
  13. package/dist/EmailPreview.cjs.js +1 -89
  14. package/dist/EmailPreview.js +1 -83
  15. package/dist/ErrorPage.cjs.js +1 -189
  16. package/dist/ErrorPage.js +1 -165
  17. package/dist/IpRestriction.cjs.js +1 -3578
  18. package/dist/IpRestriction.js +1 -3552
  19. package/dist/KeyboardShortcuts.cjs.js +6 -2193
  20. package/dist/KeyboardShortcuts.js +6 -2186
  21. package/dist/LoginPage.cjs.js +1 -598
  22. package/dist/LoginPage.js +1 -573
  23. package/dist/NeetoWidget.cjs.js +3 -86957
  24. package/dist/NeetoWidget.js +3 -86931
  25. package/dist/PublishBlock.cjs.js +2 -184
  26. package/dist/PublishBlock.js +2 -178
  27. package/dist/Schedule.cjs.js +1 -950
  28. package/dist/Schedule.js +1 -919
  29. package/dist/ShareViaEmail.cjs.js +2 -2832
  30. package/dist/ShareViaEmail.js +2 -2805
  31. package/dist/ShareViaLink.cjs.js +2 -1243
  32. package/dist/ShareViaLink.js +2 -1237
  33. package/dist/Sidebar.cjs.js +1 -222
  34. package/dist/Sidebar.js +1 -195
  35. package/dist/TimeFormat.cjs.js +1 -11
  36. package/dist/TimeFormat.js +1 -5
  37. package/package.json +2 -1
  38. package/src/translations/en.json +0 -1
  39. package/types/ShareViaEmail.d.ts +9 -2
package/dist/Schedule.js CHANGED
@@ -1,919 +1 @@
1
- import React, { useState, useEffect, useImperativeHandle, forwardRef } from 'react';
2
- import { findIndexBy, isPresent, toLabelAndValue, isNotPresent, noop } from '@bigbinary/neeto-commons-frontend/pure';
3
- import { FieldArray, ErrorMessage, useFormikContext, Formik, Form as Form$1 } from 'formik';
4
- import { uniq, pluck, difference, append, without, identity, pick, assoc } from 'ramda';
5
- import { timeFormat, joinHyphenCase } from '@bigbinary/neeto-commons-frontend/utils';
6
- import { Typography, Button, Dropdown, Label, Checkbox as Checkbox$1, Tooltip } from '@bigbinary/neetoui';
7
- import { useTranslation } from 'react-i18next';
8
- import dayjs from 'dayjs';
9
- import i18next from 'i18next';
10
- import * as yup from 'yup';
11
- import customParseFormat from 'dayjs/plugin/customParseFormat';
12
- import timezone from 'dayjs/plugin/timezone';
13
- import utc from 'dayjs/plugin/utc';
14
- import weekday from 'dayjs/plugin/weekday';
15
- import { Delete, Plus, Copy, MenuVertical } from '@bigbinary/neeto-icons';
16
- import { Select, Checkbox } from '@bigbinary/neetoui/formik';
17
-
18
- var DAYS = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"];
19
- var DEFAULT_SLOT_INTERVAL = 30;
20
- var MY_PROFILE_URL = "/auth/profile/edit";
21
-
22
- function _arrayWithHoles(arr) {
23
- if (Array.isArray(arr)) return arr;
24
- }
25
-
26
- function _iterableToArrayLimit(arr, i) {
27
- var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
28
- if (null != _i) {
29
- var _s,
30
- _e,
31
- _x,
32
- _r,
33
- _arr = [],
34
- _n = !0,
35
- _d = !1;
36
- try {
37
- if (_x = (_i = _i.call(arr)).next, 0 === i) {
38
- if (Object(_i) !== _i) return;
39
- _n = !1;
40
- } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);
41
- } catch (err) {
42
- _d = !0, _e = err;
43
- } finally {
44
- try {
45
- if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return;
46
- } finally {
47
- if (_d) throw _e;
48
- }
49
- }
50
- return _arr;
51
- }
52
- }
53
-
54
- function _arrayLikeToArray$1(arr, len) {
55
- if (len == null || len > arr.length) len = arr.length;
56
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
57
- return arr2;
58
- }
59
-
60
- function _unsupportedIterableToArray$1(o, minLen) {
61
- if (!o) return;
62
- if (typeof o === "string") return _arrayLikeToArray$1(o, minLen);
63
- var n = Object.prototype.toString.call(o).slice(8, -1);
64
- if (n === "Object" && o.constructor) n = o.constructor.name;
65
- if (n === "Map" || n === "Set") return Array.from(o);
66
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen);
67
- }
68
-
69
- function _nonIterableRest() {
70
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
71
- }
72
-
73
- function _slicedToArray(arr, i) {
74
- return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray$1(arr, i) || _nonIterableRest();
75
- }
76
-
77
- function _classCallCheck(instance, Constructor) {
78
- if (!(instance instanceof Constructor)) {
79
- throw new TypeError("Cannot call a class as a function");
80
- }
81
- }
82
-
83
- function _typeof(obj) {
84
- "@babel/helpers - typeof";
85
-
86
- return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
87
- return typeof obj;
88
- } : function (obj) {
89
- return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
90
- }, _typeof(obj);
91
- }
92
-
93
- function _toPrimitive(input, hint) {
94
- if (_typeof(input) !== "object" || input === null) return input;
95
- var prim = input[Symbol.toPrimitive];
96
- if (prim !== undefined) {
97
- var res = prim.call(input, hint || "default");
98
- if (_typeof(res) !== "object") return res;
99
- throw new TypeError("@@toPrimitive must return a primitive value.");
100
- }
101
- return (hint === "string" ? String : Number)(input);
102
- }
103
-
104
- function _toPropertyKey(arg) {
105
- var key = _toPrimitive(arg, "string");
106
- return _typeof(key) === "symbol" ? key : String(key);
107
- }
108
-
109
- function _defineProperties(target, props) {
110
- for (var i = 0; i < props.length; i++) {
111
- var descriptor = props[i];
112
- descriptor.enumerable = descriptor.enumerable || false;
113
- descriptor.configurable = true;
114
- if ("value" in descriptor) descriptor.writable = true;
115
- Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
116
- }
117
- }
118
- function _createClass(Constructor, protoProps, staticProps) {
119
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
120
- if (staticProps) _defineProperties(Constructor, staticProps);
121
- Object.defineProperty(Constructor, "prototype", {
122
- writable: false
123
- });
124
- return Constructor;
125
- }
126
-
127
- var INTERVALS = ["year", "quarter", "month", "week", "day", "hour", "minute", "second"];
128
-
129
- function _defineProperty(obj, key, value) {
130
- key = _toPropertyKey(key);
131
- if (key in obj) {
132
- Object.defineProperty(obj, key, {
133
- value: value,
134
- enumerable: true,
135
- configurable: true,
136
- writable: true
137
- });
138
- } else {
139
- obj[key] = value;
140
- }
141
- return obj;
142
- }
143
-
144
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
145
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
146
- var REMOVE_SELECT_DOWN_ARROW = {
147
- DropdownIndicator: function DropdownIndicator() {
148
- return null;
149
- },
150
- IndicatorSeparator: function IndicatorSeparator() {
151
- return null;
152
- }
153
- };
154
- var BLUR_TEXT_WHEN_SELECT_MENU_IS_OPEN = {
155
- singleValue: function singleValue(base, state) {
156
- return _objectSpread(_objectSpread({}, base), {}, {
157
- color: state.selectProps.menuIsOpen ? "#c2c8cc" : base.color
158
- });
159
- }
160
- };
161
- var SLOT_TIME_FORMAT = "hh:mm A";
162
- var END_OF_DAY = "11:59 PM";
163
-
164
- var DayjsRange = /*#__PURE__*/function () {
165
- function DayjsRange(startDate, endDate) {
166
- _classCallCheck(this, DayjsRange);
167
- var _ref = startDate > endDate ? {
168
- s: endDate,
169
- e: startDate
170
- } : {
171
- s: startDate,
172
- e: endDate
173
- },
174
- s = _ref.s,
175
- e = _ref.e;
176
- this.startDate = s;
177
- this.endDate = e;
178
- }
179
- _createClass(DayjsRange, [{
180
- key: "isValidRange",
181
- value: function isValidRange() {
182
- return this.startDate.isValid() && this.endDate.isValid();
183
- }
184
- }, {
185
- key: "isOverlap",
186
- value: function isOverlap(other) {
187
- if (!(other instanceof DayjsRange) || !other.isValidRange()) {
188
- return false;
189
- }
190
- return this.startDate < other.endDate && this.endDate > other.startDate;
191
- }
192
- }, {
193
- key: "toArrayOfTimeIntervals",
194
- value: function toArrayOfTimeIntervals() {
195
- var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 15;
196
- var startTime = this.startDate;
197
- var endTime = this.endDate.add(1, "days");
198
- var allTimes = [];
199
- while (startTime < endTime) {
200
- allTimes.push(startTime.format(SLOT_TIME_FORMAT));
201
- startTime = startTime.add(interval, "minutes");
202
- }
203
- return allTimes;
204
- }
205
- }]);
206
- return DayjsRange;
207
- }();
208
- function extendDayjs(dayjs) {
209
- dayjs.range = function range(start, end) {
210
- var dayjsObject = this;
211
- if (typeof start === "string" && INTERVALS.includes(start)) {
212
- return new DayjsRange(dayjs(dayjsObject).startOf(start), dayjs(dayjsObject).endOf(start));
213
- }
214
- return new DayjsRange(start, end);
215
- };
216
- dayjs.range.constructor = DayjsRange;
217
-
218
- // Returns timeIntervals in 12 hour clock format for the whole day with both AM or PM suffixed
219
- dayjs.timeIntervalsForDay = function (interval) {
220
- var _ref2 = [dayjs("00:00 AM", SLOT_TIME_FORMAT), dayjs("00:00 AM", SLOT_TIME_FORMAT)],
221
- startOfDay = _ref2[0],
222
- endOfDay = _ref2[1];
223
- var allIntervalsForADay = dayjs.range(startOfDay, endOfDay).toArrayOfTimeIntervals(interval);
224
- return allIntervalsForADay;
225
- };
226
- return dayjs;
227
- }
228
-
229
- dayjs.extend(utc);
230
- dayjs.extend(timezone);
231
- dayjs.extend(customParseFormat);
232
- dayjs.extend(weekday);
233
-
234
- // Add range and overlap functions to dayjs
235
- var dayjsExtended = extendDayjs(dayjs);
236
-
237
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
238
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
239
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
240
- yup.addMethod(yup.array, "ensureSlotsCantOverlap", function () {
241
- return this.test("ensureSlotsCantOverlap", function (periods) {
242
- var _checkForOverlapBetwe = checkForOverlapBetweenPeriods(periods),
243
- isOverlapping = _checkForOverlapBetwe.exists,
244
- range1 = _checkForOverlapBetwe.range1,
245
- range2 = _checkForOverlapBetwe.range2;
246
- if (!isOverlapping) return true;
247
- var _findIndicesOfOverlap = findIndicesOfOverlappingRangesInPeriods({
248
- range1: range1,
249
- range2: range2,
250
- periods: periods
251
- }),
252
- firstIndex = _findIndicesOfOverlap.firstIndex,
253
- secondIndex = _findIndicesOfOverlap.secondIndex;
254
- var firstError = this.createError({
255
- path: "".concat(this.path, "[").concat(firstIndex, "]"),
256
- message: i18next.t("neetoMolecules.schedule.errors.period.overlap", {
257
- start: timeFormat.time(range2.startDate),
258
- end: timeFormat.time(range2.endDate)
259
- })
260
- });
261
- var secondError = this.createError({
262
- path: "".concat(this.path, "[").concat(secondIndex, "]"),
263
- message: i18next.t("neetoMolecules.schedule.errors.period.overlap", {
264
- start: timeFormat.time(range1.startDate),
265
- end: timeFormat.time(range1.endDate)
266
- })
267
- });
268
- return new yup.ValidationError([firstError, secondError]);
269
- });
270
- });
271
- var isFromAndToSame = function isFromAndToSame(startTime, endTime) {
272
- if (!startTime || !endTime) return true;
273
- return dayjs(startTime, SLOT_TIME_FORMAT).isSame(dayjs(endTime, SLOT_TIME_FORMAT));
274
- };
275
- var getScheduleValidationSchema = function getScheduleValidationSchema() {
276
- return yup.object().shape({
277
- wdays: yup.array().of(yup.object().shape({
278
- periods: yup.array().of(yup.object().shape({
279
- startTime: yup.string().required(i18next.t("neetoMolecules.schedule.errors.period.startTime")),
280
- endTime: yup.string().required(i18next.t("neetoMolecules.schedule.errors.period.endTime")).test("ensureToTimeNotBehindFromTime", i18next.t("neetoMolecules.schedule.errors.period.isBehind"), function (value) {
281
- var startTime = this.parent.startTime;
282
- if (isFromAndToSame(value, startTime)) return true;
283
- return isTimeBehind(startTime, value);
284
- })
285
- }).test("ensureTimeNotSame", i18next.t("neetoMolecules.schedule.errors.period.sameTime"), function (value) {
286
- var startTime = value.startTime,
287
- endTime = value.endTime;
288
- return !isFromAndToSame(startTime, endTime);
289
- })).ensureSlotsCantOverlap()
290
- }))
291
- });
292
- };
293
- var getUserTimeZone = function getUserTimeZone() {
294
- var _window$globalProps;
295
- return (_window$globalProps = window.globalProps) === null || _window$globalProps === void 0 ? void 0 : _window$globalProps.user.timeZone;
296
- };
297
- var getTimeZoneAndTime = function getTimeZoneAndTime() {
298
- var timeZone = getUserTimeZone();
299
- return "".concat(timeZone, ": ").concat(dayjs().tz(timeZone).format(SLOT_TIME_FORMAT));
300
- };
301
- var isTimeBehind = function isTimeBehind(timeA, timeB) {
302
- return dayjs(timeA, SLOT_TIME_FORMAT).isBefore(dayjs(timeB, SLOT_TIME_FORMAT));
303
- };
304
- var sortPeriodsByKey = function sortPeriodsByKey(_ref) {
305
- var periods = _ref.periods,
306
- key = _ref.key,
307
- _ref$order = _ref.order,
308
- order = _ref$order === void 0 ? "desc" : _ref$order;
309
- return periods.slice().sort(function (periodA, periodB) {
310
- var isPeriodBehind = isTimeBehind({
311
- timeA: periodA[key],
312
- timeB: periodB[key]
313
- });
314
- if (order === "desc") return isPeriodBehind ? 1 : -1;
315
- return isPeriodBehind ? -1 : 1;
316
- });
317
- };
318
-
319
- /**
320
- * Check for overlapping between entered periods
321
- * @typedef {Object} Slots
322
- * @property {Array<{startTime:string, endTime: string}>} periods - startTime and endTime
323
- * @param {Slots} periods - changed time periods
324
- * @return {{exists: boolean, range1: DayjsRange | null, range2:DayjsRange | null }} - overlapped ranges if exists
325
- */
326
- var checkForOverlapBetweenPeriods = function checkForOverlapBetweenPeriods(periods) {
327
- var response = {
328
- exists: false,
329
- range1: null,
330
- range2: null
331
- };
332
- if (!(periods !== null && periods !== void 0 && periods.length)) return response;
333
- var slotsSortedByStartTime = sortPeriodsByKey({
334
- periods: periods,
335
- key: "startTime"
336
- });
337
- var _iterator = _createForOfIteratorHelper(slotsSortedByStartTime.slice(0, -1).entries()),
338
- _step;
339
- try {
340
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
341
- var _step$value = _slicedToArray(_step.value, 2),
342
- index = _step$value[0],
343
- value = _step$value[1];
344
- var seg1 = value;
345
- var seg2 = slotsSortedByStartTime[index + 1];
346
- var range1 = dayjsExtended.range(dayjsExtended(seg1.startTime, SLOT_TIME_FORMAT), dayjsExtended(seg1.endTime, SLOT_TIME_FORMAT));
347
- var range2 = dayjsExtended.range(dayjsExtended(seg2.startTime, SLOT_TIME_FORMAT), dayjsExtended(seg2.endTime, SLOT_TIME_FORMAT));
348
- if (range1.isOverlap(range2)) {
349
- response = {
350
- exists: true,
351
- range1: range1,
352
- range2: range2
353
- };
354
- break;
355
- }
356
- }
357
- } catch (err) {
358
- _iterator.e(err);
359
- } finally {
360
- _iterator.f();
361
- }
362
- return response;
363
- };
364
- var findIndicesOfOverlappingRangesInPeriods = function findIndicesOfOverlappingRangesInPeriods(_ref2) {
365
- var range1 = _ref2.range1,
366
- range2 = _ref2.range2,
367
- periods = _ref2.periods;
368
- var firstIndex = findIndexBy({
369
- startTime: range1.startDate.format(SLOT_TIME_FORMAT)
370
- }, periods);
371
- var secondIndex = periods.findIndex(function (slot, index) {
372
- return index > firstIndex && slot.startTime === range2.startDate.format(SLOT_TIME_FORMAT);
373
- });
374
- return {
375
- firstIndex: firstIndex,
376
- secondIndex: secondIndex
377
- };
378
- };
379
-
380
- var DisplayAvailability = function DisplayAvailability(_ref) {
381
- var periods = _ref.periods;
382
- var _useTranslation = useTranslation(),
383
- t = _useTranslation.t;
384
- return /*#__PURE__*/React.createElement("div", {
385
- className: "w-full space-y-4"
386
- }, DAYS.map(function (day) {
387
- var _sortPeriodsByKey;
388
- return /*#__PURE__*/React.createElement("div", {
389
- className: "neeto-ui-rounded-md neeto-ui-shadow-s flex w-full items-start justify-start border border-gray-300 py-4 px-12",
390
- key: day
391
- }, /*#__PURE__*/React.createElement(Typography, {
392
- className: "mt-0.5 w-16 text-gray-700",
393
- "data-cy": joinHyphenCase(day, "day-text"),
394
- style: "h5",
395
- weight: "semibold"
396
- }, t("neetoMolecules.schedule.days.".concat(day))), /*#__PURE__*/React.createElement("div", {
397
- className: "flex w-9/12 flex-col items-center space-y-4"
398
- }, isPresent(periods[day]) ? (_sortPeriodsByKey = sortPeriodsByKey({
399
- periods: periods[day],
400
- key: "startTime",
401
- order: "asc"
402
- })) === null || _sortPeriodsByKey === void 0 ? void 0 : _sortPeriodsByKey.map(function (period) {
403
- return /*#__PURE__*/React.createElement("div", {
404
- className: "flex items-center space-x-4",
405
- key: period.id
406
- }, /*#__PURE__*/React.createElement(Typography, {
407
- className: "w-24 text-right text-gray-700",
408
- lineHeight: "relaxed",
409
- style: "h5",
410
- weight: "semibold",
411
- "data-cy": joinHyphenCase(day, period.startTime, "start-time-text")
412
- }, period.startTime), /*#__PURE__*/React.createElement(Typography, {
413
- className: "text-gray-600",
414
- component: "span"
415
- }, "-"), /*#__PURE__*/React.createElement(Typography, {
416
- className: "w-24 text-left text-gray-700",
417
- lineHeight: "relaxed",
418
- style: "h5",
419
- weight: "semibold",
420
- "data-cy": joinHyphenCase(day, period.endTime, "start-time-text")
421
- }, period.endTime));
422
- }) : /*#__PURE__*/React.createElement(Typography, {
423
- className: "mx-8 mt-0.5 text-gray-700",
424
- "data-cy": joinHyphenCase(day, "unavailable-time-text"),
425
- lineHeight: "relaxed",
426
- style: "h5"
427
- }, t("neetoMolecules.schedule.unavailable"))));
428
- }));
429
- };
430
-
431
- function _arrayWithoutHoles(arr) {
432
- if (Array.isArray(arr)) return _arrayLikeToArray$1(arr);
433
- }
434
-
435
- function _iterableToArray(iter) {
436
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
437
- }
438
-
439
- function _nonIterableSpread() {
440
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
441
- }
442
-
443
- function _toConsumableArray(arr) {
444
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray$1(arr) || _nonIterableSpread();
445
- }
446
-
447
- var buildSlotIntervals = function buildSlotIntervals(_ref) {
448
- var interval = _ref.interval,
449
- bookedSlots = _ref.bookedSlots,
450
- slotType = _ref.slotType,
451
- _ref$selectedValue = _ref.selectedValue,
452
- selectedValue = _ref$selectedValue === void 0 ? null : _ref$selectedValue;
453
- var selectedOption = {
454
- label: selectedValue,
455
- value: selectedValue
456
- };
457
- var allIntervalsForADay = dayjsExtended.timeIntervalsForDay(interval);
458
- allIntervalsForADay.push(END_OF_DAY);
459
- var uniqBookedSlots = uniq(pluck(slotType, bookedSlots));
460
- var slotsAvailableForBooking = difference(allIntervalsForADay, uniqBookedSlots);
461
- var slots = slotsAvailableForBooking.map(toLabelAndValue);
462
- return selectedValue ? sortSlots([selectedOption].concat(_toConsumableArray(slots))) : slots;
463
- };
464
- var sortSlots = function sortSlots(slots) {
465
- return slots.sort(function (a, b) {
466
- return isTimeBehind(a["value"], b["value"]) ? -1 : 1;
467
- });
468
- };
469
- var slotsSelectComponentDefaultValue = function slotsSelectComponentDefaultValue(slot) {
470
- return slot ? toLabelAndValue(slot) : "";
471
- };
472
- var padZeroes = function padZeroes(str) {
473
- return str.length % 2 === 0 ? str : "0".concat(str);
474
- };
475
- var customFilter = function customFilter(option, searchTerm) {
476
- if (isNotPresent(searchTerm)) return true;
477
- var doesNumberMatches = option.value.replace(":", "").startsWith(padZeroes(searchTerm.replaceAll(/\D+/gi, "")));
478
- var doesAmPmMatches = option.value.includes(searchTerm.toUpperCase().replaceAll(/[^a-z]/gi, ""));
479
- return doesNumberMatches && doesAmPmMatches;
480
- };
481
- var generateNewPeriod = function generateNewPeriod(periods, wday) {
482
- var lastEndTime = periods[periods.length - 1].endTime;
483
- var newStartTime = dayjsExtended(lastEndTime, SLOT_TIME_FORMAT).add(1, "hour");
484
- var newEndTime = dayjsExtended(newStartTime, SLOT_TIME_FORMAT).add(1, "hour");
485
- return {
486
- startTime: dayjsExtended(newStartTime).format(SLOT_TIME_FORMAT),
487
- endTime: dayjsExtended(newEndTime).format(SLOT_TIME_FORMAT),
488
- wday: wday
489
- };
490
- };
491
- var addDefaultPeriod = function addDefaultPeriod(wday) {
492
- return {
493
- wday: wday,
494
- startTime: "09:00 AM",
495
- endTime: "05:00 PM"
496
- };
497
- };
498
-
499
- var ScheduleRow = function ScheduleRow(_ref) {
500
- var values = _ref.values,
501
- setFieldValue = _ref.setFieldValue,
502
- wdayIndex = _ref.wdayIndex,
503
- day = _ref.day;
504
- var _useTranslation = useTranslation(),
505
- t = _useTranslation.t;
506
- var handleAddRow = function handleAddRow(arrayHelpers) {
507
- if (isNotPresent(values.wdays[wdayIndex].periods)) {
508
- arrayHelpers.push(addDefaultPeriod(day));
509
- } else {
510
- arrayHelpers.push(generateNewPeriod(values.wdays[wdayIndex].periods, day));
511
- }
512
- setFieldValue("wdays[".concat(wdayIndex, "].available"), true);
513
- };
514
- var handleDeleteRow = function handleDeleteRow(arrayHelpers, index) {
515
- var isLastRowDeleted = values.wdays[wdayIndex].periods.length === 1;
516
- arrayHelpers.remove(index);
517
- setFieldValue("wdays[".concat(wdayIndex, "].available"), !isLastRowDeleted);
518
- };
519
- return /*#__PURE__*/React.createElement(FieldArray, {
520
- name: "wdays[".concat(wdayIndex, "].periods"),
521
- render: function render(arrayHelpers) {
522
- var _values$wdays$wdayInd, _values$wdays$wdayInd2;
523
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
524
- className: "flex w-full items-start justify-between"
525
- }, isNotPresent((_values$wdays$wdayInd = values.wdays[wdayIndex]) === null || _values$wdays$wdayInd === void 0 ? void 0 : _values$wdays$wdayInd.periods) ? /*#__PURE__*/React.createElement("div", {
526
- className: "mx-auto mt-1 flex w-80 items-center justify-center"
527
- }, /*#__PURE__*/React.createElement(Typography, {
528
- className: "text-gray-700",
529
- lineHeight: "relaxed",
530
- style: "h5"
531
- }, t("neetoMolecules.schedule.unavailable"))) : /*#__PURE__*/React.createElement("div", {
532
- className: "w-full space-y-4"
533
- }, (_values$wdays$wdayInd2 = values.wdays[wdayIndex].periods) === null || _values$wdays$wdayInd2 === void 0 ? void 0 : _values$wdays$wdayInd2.map(function (period, index) {
534
- return /*#__PURE__*/React.createElement("div", {
535
- className: "mx-auto flex w-80 flex-col",
536
- key: "wdays[".concat(wdayIndex, "].periods[").concat(index, "]")
537
- }, /*#__PURE__*/React.createElement("div", {
538
- className: "flex min-w-full items-start space-x-3"
539
- }, /*#__PURE__*/React.createElement(Select, {
540
- isClearable: true,
541
- isSearchable: true,
542
- className: "w-full",
543
- components: REMOVE_SELECT_DOWN_ARROW,
544
- filterOption: customFilter,
545
- name: "wdays[".concat(wdayIndex, "].periods[").concat(index, "].startTime"),
546
- placeholder: t("neetoMolecules.schedule.startTime"),
547
- styles: BLUR_TEXT_WHEN_SELECT_MENU_IS_OPEN,
548
- options: buildSlotIntervals({
549
- interval: DEFAULT_SLOT_INTERVAL,
550
- bookedSlots: values.wdays[wdayIndex].periods,
551
- slotType: "startTime",
552
- selectedValue: period === null || period === void 0 ? void 0 : period.startTime
553
- }),
554
- value: slotsSelectComponentDefaultValue(period === null || period === void 0 ? void 0 : period.startTime),
555
- onChange: function onChange(e) {
556
- return setFieldValue("wdays[".concat(wdayIndex, "].periods[").concat(index, "].startTime"), (e === null || e === void 0 ? void 0 : e.value) || "");
557
- }
558
- }), /*#__PURE__*/React.createElement(Select, {
559
- isClearable: true,
560
- isSearchable: true,
561
- className: "w-full",
562
- components: REMOVE_SELECT_DOWN_ARROW,
563
- filterOption: customFilter,
564
- name: "wdays[".concat(wdayIndex, "].periods[").concat(index, "].endTime"),
565
- placeholder: t("neetoMolecules.schedule.endTime"),
566
- styles: BLUR_TEXT_WHEN_SELECT_MENU_IS_OPEN,
567
- options: buildSlotIntervals({
568
- interval: DEFAULT_SLOT_INTERVAL,
569
- bookedSlots: values.wdays[wdayIndex].periods,
570
- slotType: "endTime",
571
- selectedValue: period === null || period === void 0 ? void 0 : period.endTime
572
- }),
573
- value: slotsSelectComponentDefaultValue(period === null || period === void 0 ? void 0 : period.endTime),
574
- onChange: function onChange(e) {
575
- return setFieldValue("wdays[".concat(wdayIndex, "].periods[").concat(index, "].endTime"), (e === null || e === void 0 ? void 0 : e.value) || "");
576
- }
577
- }), /*#__PURE__*/React.createElement(Delete, {
578
- className: "mt-2 w-16 cursor-pointer hover:text-red-700",
579
- "data-cy": "delete-period-button",
580
- size: 20,
581
- onClick: function onClick() {
582
- return handleDeleteRow(arrayHelpers, index);
583
- }
584
- })), /*#__PURE__*/React.createElement(ErrorMessage, {
585
- name: "wdays[".concat(wdayIndex, "].periods[").concat(index, "]")
586
- }, function (message) {
587
- return _typeof(message) !== "object" && /*#__PURE__*/React.createElement("span", {
588
- className: "mt-1 w-11/12 px-2 text-xs text-red-500"
589
- }, message);
590
- }));
591
- }))), /*#__PURE__*/React.createElement(Button, {
592
- className: "flex-shrink-0",
593
- "data-cy": "add-new-period-button",
594
- icon: Plus,
595
- tooltipProps: {
596
- content: t("neetoMolecules.schedule.addNewPeriod"),
597
- position: "top",
598
- hideAfter: 5000
599
- },
600
- onClick: function onClick() {
601
- return handleAddRow(arrayHelpers);
602
- }
603
- }));
604
- }
605
- });
606
- };
607
-
608
- var Form = function Form(_ref) {
609
- var day = _ref.day,
610
- handleCopy = _ref.handleCopy,
611
- values = _ref.values,
612
- setFieldValue = _ref.setFieldValue,
613
- index = _ref.index;
614
- var _useState = useState([]),
615
- _useState2 = _slicedToArray(_useState, 2),
616
- deletedPeriods = _useState2[0],
617
- setDeletedPeriods = _useState2[1];
618
- var _useState3 = useState([]),
619
- _useState4 = _slicedToArray(_useState3, 2),
620
- wdaysToCopy = _useState4[0],
621
- setWdaysToCopy = _useState4[1];
622
- var _useTranslation = useTranslation(),
623
- t = _useTranslation.t;
624
- var restoreDeletedPeriods = function restoreDeletedPeriods(setFieldValue) {
625
- setFieldValue("wdays[".concat(index, "].periods"), deletedPeriods);
626
- };
627
- var uncheckCheckbox = function uncheckCheckbox(setFieldValue, values) {
628
- var _values$wdays$index$p;
629
- setFieldValue("wdays[".concat(index, "].available"), false);
630
- setFieldValue("wdays[".concat(index, "].periods"), []);
631
- if ((_values$wdays$index$p = values.wdays[index].periods[0]) !== null && _values$wdays$index$p !== void 0 && _values$wdays$index$p.id) {
632
- setDeletedPeriods(values.wdays[index].periods.filter(function (item) {
633
- return item.startTime && item.endTime;
634
- }).map(identity));
635
- }
636
- };
637
- var checkCheckbox = function checkCheckbox(setFieldValue) {
638
- var _deletedPeriods$;
639
- setFieldValue("wdays[".concat(index, "].available"), true);
640
- if ((_deletedPeriods$ = deletedPeriods[0]) !== null && _deletedPeriods$ !== void 0 && _deletedPeriods$.startTime) {
641
- restoreDeletedPeriods(setFieldValue);
642
- } else if (isNotPresent(values.wdays[index].periods)) {
643
- setFieldValue("wdays[".concat(index, "].periods"), [addDefaultPeriod(day)]);
644
- } else {
645
- setFieldValue("wdays[".concat(index, "].periods"), [""]);
646
- }
647
- };
648
- var handleCheckbox = function handleCheckbox(setFieldValue, values) {
649
- if (values.wdays[index].available) {
650
- uncheckCheckbox(setFieldValue, values);
651
- } else {
652
- checkCheckbox(setFieldValue);
653
- }
654
- };
655
- var handleCopyChange = function handleCopyChange(e, day) {
656
- return setWdaysToCopy(e.target.checked ? append(day) : without([day]));
657
- };
658
- return /*#__PURE__*/React.createElement("div", {
659
- className: "border neeto-ui-rounded-md neeto-ui-shadow-s w-full border-gray-300 px-6"
660
- }, /*#__PURE__*/React.createElement("div", {
661
- className: "my-4 flex w-full items-start space-x-4"
662
- }, /*#__PURE__*/React.createElement("div", {
663
- className: "mt-1 flex w-16 items-center justify-start"
664
- }, /*#__PURE__*/React.createElement(Checkbox, {
665
- "aria-label": "wdays[".concat(index, "].available"),
666
- checked: values.wdays[index].available,
667
- "data-cy": joinHyphenCase(day, "weekly-hours-checkbox"),
668
- id: "day",
669
- name: "wdays[".concat(index, "].available"),
670
- onChange: function onChange() {
671
- return handleCheckbox(setFieldValue, values);
672
- }
673
- }), /*#__PURE__*/React.createElement(Typography, {
674
- className: "ml-2 capitalize",
675
- component: "span",
676
- "data-cy": joinHyphenCase(day, "day-text"),
677
- style: "body2",
678
- weight: "semibold"
679
- }, t("neetoMolecules.schedule.days.".concat(day)))), /*#__PURE__*/React.createElement(ScheduleRow, {
680
- day: day,
681
- setFieldValue: setFieldValue,
682
- values: values,
683
- wdayIndex: index
684
- }), /*#__PURE__*/React.createElement(Dropdown, {
685
- closeOnSelect: true,
686
- buttonStyle: "secondary",
687
- icon: Copy,
688
- position: "right-start",
689
- buttonProps: {
690
- tooltipProps: {
691
- content: t("neetoMolecules.schedule.copyScheduleTooltip"),
692
- position: "top",
693
- hideAfter: 5000
694
- },
695
- className: "flex-shrink-0",
696
- "data-testid": joinHyphenCase(day, "copy-schedule-icon")
697
- },
698
- onClose: function onClose() {
699
- return setWdaysToCopy([]);
700
- }
701
- }, /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(Typography, {
702
- style: "h5"
703
- }, t("neetoMolecules.schedule.copySchedule"))), DAYS.filter(function (copyDay) {
704
- return copyDay !== day;
705
- }).map(function (day) {
706
- return /*#__PURE__*/React.createElement("li", {
707
- key: day,
708
- onClick: function onClick(e) {
709
- return e.stopPropagation();
710
- }
711
- }, /*#__PURE__*/React.createElement(Label, {
712
- className: "w-full cursor-pointer capitalize"
713
- }, /*#__PURE__*/React.createElement(Checkbox$1, {
714
- checked: wdaysToCopy.includes(day),
715
- id: day,
716
- label: t("neetoMolecules.schedule.days.".concat(day)),
717
- onChange: function onChange(e) {
718
- return handleCopyChange(e, day);
719
- }
720
- })));
721
- }), /*#__PURE__*/React.createElement("li", null, /*#__PURE__*/React.createElement(Button, {
722
- disabled: isNotPresent(wdaysToCopy),
723
- label: "Submit",
724
- size: "small",
725
- onClick: function onClick() {
726
- handleCopy({
727
- values: values,
728
- index: index,
729
- setFieldValue: setFieldValue,
730
- wdaysToCopy: wdaysToCopy
731
- });
732
- setWdaysToCopy([]);
733
- }
734
- })))));
735
- };
736
-
737
- var Fields = function Fields(_ref) {
738
- var handleCopy = _ref.handleCopy,
739
- handleValuesChanged = _ref.handleValuesChanged,
740
- scheduleRef = _ref.scheduleRef;
741
- var _useFormikContext = useFormikContext(),
742
- values = _useFormikContext.values,
743
- setFieldValue = _useFormikContext.setFieldValue,
744
- resetForm = _useFormikContext.resetForm,
745
- errors = _useFormikContext.errors;
746
- useEffect(function () {
747
- return handleValuesChanged(values);
748
- }, [values]);
749
- useImperativeHandle(scheduleRef, function () {
750
- return {
751
- resetForm: resetForm,
752
- errors: errors
753
- };
754
- });
755
- return /*#__PURE__*/React.createElement(FieldArray, {
756
- name: "wdays",
757
- render: function render() {
758
- return /*#__PURE__*/React.createElement("div", {
759
- className: "space-y-4"
760
- }, values.wdays.map(function (item, index) {
761
- return /*#__PURE__*/React.createElement(Form, {
762
- day: DAYS.find(function (day) {
763
- return day === item.wday;
764
- }),
765
- handleCopy: handleCopy,
766
- index: index,
767
- key: item.wday,
768
- setFieldValue: setFieldValue,
769
- values: values
770
- });
771
- }));
772
- }
773
- });
774
- };
775
-
776
- var Header = function Header(_ref) {
777
- var isEditing = _ref.isEditing,
778
- setIsEditing = _ref.setIsEditing;
779
- var _useFormikContext = useFormikContext(),
780
- dirty = _useFormikContext.dirty,
781
- resetForm = _useFormikContext.resetForm,
782
- submitForm = _useFormikContext.submitForm,
783
- isSubmitting = _useFormikContext.isSubmitting;
784
- var _useTranslation = useTranslation(),
785
- t = _useTranslation.t;
786
- var _useState = useState(getTimeZoneAndTime()),
787
- _useState2 = _slicedToArray(_useState, 2),
788
- timeZoneAndTime = _useState2[0],
789
- setTimeZoneAndTime = _useState2[1];
790
- var Menu = Dropdown.Menu,
791
- MenuItem = Dropdown.MenuItem;
792
- var handleReset = function handleReset() {
793
- if (dirty) resetForm();else setIsEditing(false);
794
- };
795
- useEffect(function () {
796
- var time = setInterval(function () {
797
- setTimeZoneAndTime(getTimeZoneAndTime());
798
- }, 30000);
799
- return function () {
800
- return clearInterval(time);
801
- };
802
- }, []);
803
- return /*#__PURE__*/React.createElement("div", {
804
- className: "mb-4 flex justify-between"
805
- }, isEditing ? /*#__PURE__*/React.createElement("div", {
806
- className: "flex items-center space-x-4"
807
- }, /*#__PURE__*/React.createElement(Button, {
808
- style: "secondary",
809
- label: !dirty ? t("neetoMolecules.common.actions.cancel") : t("neetoMolecules.common.actions.reset"),
810
- onClick: handleReset
811
- }), /*#__PURE__*/React.createElement(Button, {
812
- "data-cy": "weekly-hours-save-changes-button",
813
- disabled: !dirty || isSubmitting,
814
- label: t("neetoMolecules.common.actions.saveChanges"),
815
- loading: isSubmitting,
816
- onClick: submitForm
817
- })) : /*#__PURE__*/React.createElement("div", {
818
- className: "flex items-center gap-x-2"
819
- }, /*#__PURE__*/React.createElement(Typography, {
820
- className: "text-gray-800",
821
- style: "h3",
822
- weight: "semibold"
823
- }, t("neetoMolecules.schedule.weeklyHours")), /*#__PURE__*/React.createElement(Dropdown, {
824
- icon: MenuVertical,
825
- buttonProps: {
826
- style: "text",
827
- "data-testid": "weekly-hours-edit-dropdown-icon"
828
- }
829
- }, /*#__PURE__*/React.createElement(Menu, null, /*#__PURE__*/React.createElement(MenuItem.Button, {
830
- "data-cy": "weekly-hours-edit-link",
831
- onClick: function onClick() {
832
- return setIsEditing(true);
833
- }
834
- }, t("neetoMolecules.common.actions.edit"))))), /*#__PURE__*/React.createElement("div", {
835
- className: "flex items-center space-x-2"
836
- }, /*#__PURE__*/React.createElement(Tooltip, {
837
- content: t("neetoMolecules.schedule.timezoneTooltip"),
838
- position: "bottom"
839
- }, /*#__PURE__*/React.createElement(Typography, {
840
- style: "h4",
841
- weight: "medium"
842
- }, timeZoneAndTime)), /*#__PURE__*/React.createElement(Dropdown, {
843
- icon: MenuVertical,
844
- buttonProps: {
845
- style: "text",
846
- className: "flex-shrink-0"
847
- }
848
- }, /*#__PURE__*/React.createElement(Menu, null, /*#__PURE__*/React.createElement(MenuItem.Button, {
849
- onClick: function onClick() {
850
- return window.location.href = MY_PROFILE_URL;
851
- }
852
- }, t("neetoMolecules.common.actions.changeTimezone"))))));
853
- };
854
-
855
- var Schedule = /*#__PURE__*/forwardRef(function (_ref, scheduleRef) {
856
- var periods = _ref.periods,
857
- _ref$handleSubmit = _ref.handleSubmit,
858
- handleSubmit = _ref$handleSubmit === void 0 ? noop : _ref$handleSubmit,
859
- _ref$isEditing = _ref.isEditing,
860
- isEditing = _ref$isEditing === void 0 ? false : _ref$isEditing,
861
- setIsEditing = _ref.setIsEditing,
862
- _ref$showHeader = _ref.showHeader,
863
- showHeader = _ref$showHeader === void 0 ? true : _ref$showHeader,
864
- _ref$handleValuesChan = _ref.handleValuesChanged,
865
- handleValuesChanged = _ref$handleValuesChan === void 0 ? noop : _ref$handleValuesChan;
866
- var handleCopy = function handleCopy(_ref2) {
867
- var _values$wdays$index$p;
868
- var values = _ref2.values,
869
- index = _ref2.index,
870
- setFieldValue = _ref2.setFieldValue,
871
- wdaysToCopy = _ref2.wdaysToCopy;
872
- var newPeriods = (_values$wdays$index$p = values.wdays[index].periods) === null || _values$wdays$index$p === void 0 ? void 0 : _values$wdays$index$p.map(pick(["startTime", "endTime"]));
873
- wdaysToCopy.forEach(function (wday) {
874
- var dayIndex = DAYS.indexOf(wday);
875
- setFieldValue("wdays[".concat(dayIndex, "].available"), isPresent(values.wdays[index].periods));
876
- setFieldValue("wdays[".concat(dayIndex, "].periods"), newPeriods.map(function (period) {
877
- return assoc("wday", wday, period);
878
- }));
879
- });
880
- };
881
- var getInitialFormValues = function getInitialFormValues() {
882
- return DAYS.map(function (wday) {
883
- var _periods$wday;
884
- return {
885
- periods: sortPeriodsByKey({
886
- periods: periods[wday],
887
- key: "startTime",
888
- order: "asc"
889
- }),
890
- available: !!((_periods$wday = periods[wday]) !== null && _periods$wday !== void 0 && _periods$wday.length),
891
- wday: wday
892
- };
893
- });
894
- };
895
- return /*#__PURE__*/React.createElement("div", {
896
- className: "neeto-ui-border-gray-200 w-41 flex-shrink-0"
897
- }, /*#__PURE__*/React.createElement(Formik, {
898
- enableReinitialize: true,
899
- initialValues: {
900
- wdays: getInitialFormValues()
901
- },
902
- validationSchema: getScheduleValidationSchema(),
903
- onSubmit: function onSubmit(values) {
904
- return handleSubmit(values, getInitialFormValues());
905
- }
906
- }, /*#__PURE__*/React.createElement(React.Fragment, null, showHeader && /*#__PURE__*/React.createElement(Header, {
907
- isEditing: isEditing,
908
- setIsEditing: setIsEditing
909
- }), isEditing || !showHeader ? /*#__PURE__*/React.createElement(Form$1, null, /*#__PURE__*/React.createElement(Fields, {
910
- handleCopy: handleCopy,
911
- handleValuesChanged: handleValuesChanged,
912
- scheduleRef: scheduleRef
913
- })) : /*#__PURE__*/React.createElement(DisplayAvailability, {
914
- periods: periods
915
- }))));
916
- });
917
- Schedule.displayName = "Schedule";
918
-
919
- export { Schedule as default };
1
+ import e,{useState as t,useEffect as n,useImperativeHandle as r,forwardRef as a}from"react";import{findIndexBy as o,isPresent as i,toLabelAndValue as l,isNotPresent as s,noop as c}from"@bigbinary/neeto-commons-frontend/pure";import{FieldArray as u,ErrorMessage as d,useFormikContext as m,Formik as f,Form as y}from"formik";import{uniq as p,pluck as v,difference as h,append as b,without as w,identity as g,pick as x,assoc as E}from"ramda";import{timeFormat as T,joinHyphenCase as k}from"@bigbinary/neeto-commons-frontend/utils";import{Typography as S,Button as O,Dropdown as j,Label as N,Checkbox as C,Tooltip as M}from"@bigbinary/neetoui";import{useTranslation as I}from"react-i18next";import A from"dayjs";import P from"i18next";import*as D from"yup";import V from"dayjs/plugin/customParseFormat";import F from"dayjs/plugin/timezone";import z from"dayjs/plugin/utc";import B from"dayjs/plugin/weekday";import{Delete as H,Plus as R,Copy as q,MenuVertical as U}from"@bigbinary/neeto-icons";import{Select as $,Checkbox as W}from"@bigbinary/neetoui/formik";var Z=["monday","tuesday","wednesday","thursday","friday","saturday","sunday"];function G(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function J(e,t){if(e){if("string"==typeof e)return G(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?G(e,t):void 0}}function K(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,o,i,l=[],s=!0,c=!1;try{if(o=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=o.call(n)).done)&&(l.push(r.value),l.length!==t);s=!0);}catch(e){c=!0,a=e}finally{try{if(!s&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw a}}return l}}(e,t)||J(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function L(e){return L="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},L(e)}function Q(e){var t=function(e,t){if("object"!==L(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==L(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===L(t)?t:String(t)}function X(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,Q(r.key),r)}}var Y=["year","quarter","month","week","day","hour","minute","second"];function _(e,t,n){return(t=Q(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function te(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ee(Object(n),!0).forEach((function(t){_(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ee(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var ne={DropdownIndicator:function(){return null},IndicatorSeparator:function(){return null}},re={singleValue:function(e,t){return te(te({},e),{},{color:t.selectProps.menuIsOpen?"#c2c8cc":e.color})}},ae="hh:mm A",oe=function(){function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e);var r=t>n?{s:n,e:t}:{s:t,e:n},a=r.s,o=r.e;this.startDate=a,this.endDate=o}var t,n,r;return t=e,n=[{key:"isValidRange",value:function(){return this.startDate.isValid()&&this.endDate.isValid()}},{key:"isOverlap",value:function(t){return!!(t instanceof e&&t.isValidRange())&&this.startDate<t.endDate&&this.endDate>t.startDate}},{key:"toArrayOfTimeIntervals",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:15,t=this.startDate,n=this.endDate.add(1,"days"),r=[];t<n;)r.push(t.format(ae)),t=t.add(e,"minutes");return r}}],n&&X(t.prototype,n),r&&X(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();A.extend(z),A.extend(F),A.extend(V),A.extend(B);var ie=function(e){return e.range=function(t,n){return"string"==typeof t&&Y.includes(t)?new oe(e(this).startOf(t),e(this).endOf(t)):new oe(t,n)},e.range.constructor=oe,e.timeIntervalsForDay=function(t){var n=[e("00:00 AM",ae),e("00:00 AM",ae)],r=n[0],a=n[1];return e.range(r,a).toArrayOfTimeIntervals(t)},e}(A);function le(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(!e)return;if("string"==typeof e)return se(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return se(e,t)}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return i=e.done,e},e:function(e){l=!0,o=e},f:function(){try{i||null==n.return||n.return()}finally{if(l)throw o}}}}function se(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}D.addMethod(D.array,"ensureSlotsCantOverlap",(function(){return this.test("ensureSlotsCantOverlap",(function(e){var t=fe(e),n=t.exists,r=t.range1,a=t.range2;if(!n)return!0;var o=ye({range1:r,range2:a,periods:e}),i=o.firstIndex,l=o.secondIndex,s=this.createError({path:"".concat(this.path,"[").concat(i,"]"),message:P.t("neetoMolecules.schedule.errors.period.overlap",{start:T.time(a.startDate),end:T.time(a.endDate)})}),c=this.createError({path:"".concat(this.path,"[").concat(l,"]"),message:P.t("neetoMolecules.schedule.errors.period.overlap",{start:T.time(r.startDate),end:T.time(r.endDate)})});return new D.ValidationError([s,c])}))}));var ce=function(e,t){return!e||!t||A(e,ae).isSame(A(t,ae))},ue=function(){var e,t=null===(e=window.globalProps)||void 0===e?void 0:e.user.timeZone;return"".concat(t,": ").concat(A().tz(t).format(ae))},de=function(e,t){return A(e,ae).isBefore(A(t,ae))},me=function(e){var t=e.periods,n=e.key,r=e.order,a=void 0===r?"desc":r;return t.slice().sort((function(e,t){var r=de({timeA:e[n],timeB:t[n]});return"desc"===a?r?1:-1:r?-1:1}))},fe=function(e){var t={exists:!1,range1:null,range2:null};if(null==e||!e.length)return t;var n,r=me({periods:e,key:"startTime"}),a=le(r.slice(0,-1).entries());try{for(a.s();!(n=a.n()).done;){var o=K(n.value,2),i=o[0],l=o[1],s=r[i+1],c=ie.range(ie(l.startTime,ae),ie(l.endTime,ae)),u=ie.range(ie(s.startTime,ae),ie(s.endTime,ae));if(c.isOverlap(u)){t={exists:!0,range1:c,range2:u};break}}}catch(e){a.e(e)}finally{a.f()}return t},ye=function(e){var t=e.range1,n=e.range2,r=e.periods,a=o({startTime:t.startDate.format(ae)},r),i=r.findIndex((function(e,t){return t>a&&e.startTime===n.startDate.format(ae)}));return{firstIndex:a,secondIndex:i}},pe=function(t){var n=t.periods,r=I().t;return e.createElement("div",{className:"w-full space-y-4"},Z.map((function(t){var a;return e.createElement("div",{className:"neeto-ui-rounded-md neeto-ui-shadow-s flex w-full items-start justify-start border border-gray-300 py-4 px-12",key:t},e.createElement(S,{className:"mt-0.5 w-16 text-gray-700","data-cy":k(t,"day-text"),style:"h5",weight:"semibold"},r("neetoMolecules.schedule.days.".concat(t))),e.createElement("div",{className:"flex w-9/12 flex-col items-center space-y-4"},i(n[t])?null===(a=me({periods:n[t],key:"startTime",order:"asc"}))||void 0===a?void 0:a.map((function(n){return e.createElement("div",{className:"flex items-center space-x-4",key:n.id},e.createElement(S,{className:"w-24 text-right text-gray-700",lineHeight:"relaxed",style:"h5",weight:"semibold","data-cy":k(t,n.startTime,"start-time-text")},n.startTime),e.createElement(S,{className:"text-gray-600",component:"span"},"-"),e.createElement(S,{className:"w-24 text-left text-gray-700",lineHeight:"relaxed",style:"h5",weight:"semibold","data-cy":k(t,n.endTime,"start-time-text")},n.endTime))})):e.createElement(S,{className:"mx-8 mt-0.5 text-gray-700","data-cy":k(t,"unavailable-time-text"),lineHeight:"relaxed",style:"h5"},r("neetoMolecules.schedule.unavailable"))))})))};function ve(e){return function(e){if(Array.isArray(e))return G(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||J(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var he=function(e){var t=e.interval,n=e.bookedSlots,r=e.slotType,a=e.selectedValue,o=void 0===a?null:a,i={label:o,value:o},s=ie.timeIntervalsForDay(t);s.push("11:59 PM");var c=p(v(r,n)),u=h(s,c).map(l);return o?be([i].concat(ve(u))):u},be=function(e){return e.sort((function(e,t){return de(e.value,t.value)?-1:1}))},we=function(e){return e?l(e):""},ge=function(e,t){if(s(t))return!0;var n,r=e.value.replace(":","").startsWith((n=t.replaceAll(/\D+/gi,"")).length%2==0?n:"0".concat(n)),a=e.value.includes(t.toUpperCase().replaceAll(/[^a-z]/gi,""));return r&&a},xe=function(e){return{wday:e,startTime:"09:00 AM",endTime:"05:00 PM"}},Ee=function(t){var n=t.values,r=t.setFieldValue,a=t.wdayIndex,o=t.day,i=I().t,l=function(e){var t,i,l,c,u;s(n.wdays[a].periods)?e.push(xe(o)):e.push((t=n.wdays[a].periods,i=o,l=t[t.length-1].endTime,c=ie(l,ae).add(1,"hour"),u=ie(c,ae).add(1,"hour"),{startTime:ie(c).format(ae),endTime:ie(u).format(ae),wday:i})),r("wdays[".concat(a,"].available"),!0)};return e.createElement(u,{name:"wdays[".concat(a,"].periods"),render:function(t){var o,c;return e.createElement(e.Fragment,null,e.createElement("div",{className:"flex w-full items-start justify-between"},s(null===(o=n.wdays[a])||void 0===o?void 0:o.periods)?e.createElement("div",{className:"mx-auto mt-1 flex w-80 items-center justify-center"},e.createElement(S,{className:"text-gray-700",lineHeight:"relaxed",style:"h5"},i("neetoMolecules.schedule.unavailable"))):e.createElement("div",{className:"w-full space-y-4"},null===(c=n.wdays[a].periods)||void 0===c?void 0:c.map((function(o,l){return e.createElement("div",{className:"mx-auto flex w-80 flex-col",key:"wdays[".concat(a,"].periods[").concat(l,"]")},e.createElement("div",{className:"flex min-w-full items-start space-x-3"},e.createElement($,{isClearable:!0,isSearchable:!0,className:"w-full",components:ne,filterOption:ge,name:"wdays[".concat(a,"].periods[").concat(l,"].startTime"),placeholder:i("neetoMolecules.schedule.startTime"),styles:re,options:he({interval:30,bookedSlots:n.wdays[a].periods,slotType:"startTime",selectedValue:null==o?void 0:o.startTime}),value:we(null==o?void 0:o.startTime),onChange:function(e){return r("wdays[".concat(a,"].periods[").concat(l,"].startTime"),(null==e?void 0:e.value)||"")}}),e.createElement($,{isClearable:!0,isSearchable:!0,className:"w-full",components:ne,filterOption:ge,name:"wdays[".concat(a,"].periods[").concat(l,"].endTime"),placeholder:i("neetoMolecules.schedule.endTime"),styles:re,options:he({interval:30,bookedSlots:n.wdays[a].periods,slotType:"endTime",selectedValue:null==o?void 0:o.endTime}),value:we(null==o?void 0:o.endTime),onChange:function(e){return r("wdays[".concat(a,"].periods[").concat(l,"].endTime"),(null==e?void 0:e.value)||"")}}),e.createElement(H,{className:"mt-2 w-16 cursor-pointer hover:text-red-700","data-cy":"delete-period-button",size:20,onClick:function(){return function(e,t){var o=1===n.wdays[a].periods.length;e.remove(t),r("wdays[".concat(a,"].available"),!o)}(t,l)}})),e.createElement(d,{name:"wdays[".concat(a,"].periods[").concat(l,"]")},(function(t){return"object"!==L(t)&&e.createElement("span",{className:"mt-1 w-11/12 px-2 text-xs text-red-500"},t)})))})))),e.createElement(O,{className:"flex-shrink-0","data-cy":"add-new-period-button",icon:R,tooltipProps:{content:i("neetoMolecules.schedule.addNewPeriod"),position:"top",hideAfter:5e3},onClick:function(){return l(t)}}))}})},Te=function(n){var r=n.day,a=n.handleCopy,o=n.values,i=n.setFieldValue,l=n.index,c=K(t([]),2),u=c[0],d=c[1],m=K(t([]),2),f=m[0],y=m[1],p=I().t,v=function(e){var t;e("wdays[".concat(l,"].available"),!0),null!==(t=u[0])&&void 0!==t&&t.startTime?function(e){e("wdays[".concat(l,"].periods"),u)}(e):s(o.wdays[l].periods)?e("wdays[".concat(l,"].periods"),[xe(r)]):e("wdays[".concat(l,"].periods"),[""])},h=function(e,t){t.wdays[l].available?function(e,t){var n;e("wdays[".concat(l,"].available"),!1),e("wdays[".concat(l,"].periods"),[]),null!==(n=t.wdays[l].periods[0])&&void 0!==n&&n.id&&d(t.wdays[l].periods.filter((function(e){return e.startTime&&e.endTime})).map(g))}(e,t):v(e)};return e.createElement("div",{className:"border neeto-ui-rounded-md neeto-ui-shadow-s w-full border-gray-300 px-6"},e.createElement("div",{className:"my-4 flex w-full items-start space-x-4"},e.createElement("div",{className:"mt-1 flex w-16 items-center justify-start"},e.createElement(W,{"aria-label":"wdays[".concat(l,"].available"),checked:o.wdays[l].available,"data-cy":k(r,"weekly-hours-checkbox"),id:"day",name:"wdays[".concat(l,"].available"),onChange:function(){return h(i,o)}}),e.createElement(S,{className:"ml-2 capitalize",component:"span","data-cy":k(r,"day-text"),style:"body2",weight:"semibold"},p("neetoMolecules.schedule.days.".concat(r)))),e.createElement(Ee,{day:r,setFieldValue:i,values:o,wdayIndex:l}),e.createElement(j,{closeOnSelect:!0,buttonStyle:"secondary",icon:q,position:"right-start",buttonProps:{tooltipProps:{content:p("neetoMolecules.schedule.copyScheduleTooltip"),position:"top",hideAfter:5e3},className:"flex-shrink-0","data-testid":k(r,"copy-schedule-icon")},onClose:function(){return y([])}},e.createElement("li",null,e.createElement(S,{style:"h5"},p("neetoMolecules.schedule.copySchedule"))),Z.filter((function(e){return e!==r})).map((function(t){return e.createElement("li",{key:t,onClick:function(e){return e.stopPropagation()}},e.createElement(N,{className:"w-full cursor-pointer capitalize"},e.createElement(C,{checked:f.includes(t),id:t,label:p("neetoMolecules.schedule.days.".concat(t)),onChange:function(e){return function(e,t){return y(e.target.checked?b(t):w([t]))}(e,t)}})))})),e.createElement("li",null,e.createElement(O,{disabled:s(f),label:"Submit",size:"small",onClick:function(){a({values:o,index:l,setFieldValue:i,wdaysToCopy:f}),y([])}})))))},ke=function(t){var a=t.handleCopy,o=t.handleValuesChanged,i=t.scheduleRef,l=m(),s=l.values,c=l.setFieldValue,d=l.resetForm,f=l.errors;return n((function(){return o(s)}),[s]),r(i,(function(){return{resetForm:d,errors:f}})),e.createElement(u,{name:"wdays",render:function(){return e.createElement("div",{className:"space-y-4"},s.wdays.map((function(t,n){return e.createElement(Te,{day:Z.find((function(e){return e===t.wday})),handleCopy:a,index:n,key:t.wday,setFieldValue:c,values:s})})))}})},Se=function(r){var a=r.isEditing,o=r.setIsEditing,i=m(),l=i.dirty,s=i.resetForm,c=i.submitForm,u=i.isSubmitting,d=I().t,f=K(t(ue()),2),y=f[0],p=f[1],v=j.Menu,h=j.MenuItem;return n((function(){var e=setInterval((function(){p(ue())}),3e4);return function(){return clearInterval(e)}}),[]),e.createElement("div",{className:"mb-4 flex justify-between"},a?e.createElement("div",{className:"flex items-center space-x-4"},e.createElement(O,{style:"secondary",label:d(l?"neetoMolecules.common.actions.reset":"neetoMolecules.common.actions.cancel"),onClick:function(){l?s():o(!1)}}),e.createElement(O,{"data-cy":"weekly-hours-save-changes-button",disabled:!l||u,label:d("neetoMolecules.common.actions.saveChanges"),loading:u,onClick:c})):e.createElement("div",{className:"flex items-center gap-x-2"},e.createElement(S,{className:"text-gray-800",style:"h3",weight:"semibold"},d("neetoMolecules.schedule.weeklyHours")),e.createElement(j,{icon:U,buttonProps:{style:"text","data-testid":"weekly-hours-edit-dropdown-icon"}},e.createElement(v,null,e.createElement(h.Button,{"data-cy":"weekly-hours-edit-link",onClick:function(){return o(!0)}},d("neetoMolecules.common.actions.edit"))))),e.createElement("div",{className:"flex items-center space-x-2"},e.createElement(M,{content:d("neetoMolecules.schedule.timezoneTooltip"),position:"bottom"},e.createElement(S,{style:"h4",weight:"medium"},y)),e.createElement(j,{icon:U,buttonProps:{style:"text",className:"flex-shrink-0"}},e.createElement(v,null,e.createElement(h.Button,{onClick:function(){return window.location.href="/auth/profile/edit"}},d("neetoMolecules.common.actions.changeTimezone"))))))},Oe=a((function(t,n){var r=t.periods,a=t.handleSubmit,o=void 0===a?c:a,l=t.isEditing,s=void 0!==l&&l,u=t.setIsEditing,d=t.showHeader,m=void 0===d||d,p=t.handleValuesChanged,v=void 0===p?c:p,h=function(){return Z.map((function(e){var t;return{periods:me({periods:r[e],key:"startTime",order:"asc"}),available:!(null===(t=r[e])||void 0===t||!t.length),wday:e}}))};return e.createElement("div",{className:"neeto-ui-border-gray-200 w-41 flex-shrink-0"},e.createElement(f,{enableReinitialize:!0,initialValues:{wdays:h()},validationSchema:D.object().shape({wdays:D.array().of(D.object().shape({periods:D.array().of(D.object().shape({startTime:D.string().required(P.t("neetoMolecules.schedule.errors.period.startTime")),endTime:D.string().required(P.t("neetoMolecules.schedule.errors.period.endTime")).test("ensureToTimeNotBehindFromTime",P.t("neetoMolecules.schedule.errors.period.isBehind"),(function(e){var t=this.parent.startTime;return!!ce(e,t)||de(t,e)}))}).test("ensureTimeNotSame",P.t("neetoMolecules.schedule.errors.period.sameTime"),(function(e){var t=e.startTime,n=e.endTime;return!ce(t,n)}))).ensureSlotsCantOverlap()}))}),onSubmit:function(e){return o(e,h())}},e.createElement(e.Fragment,null,m&&e.createElement(Se,{isEditing:s,setIsEditing:u}),s||!m?e.createElement(y,null,e.createElement(ke,{handleCopy:function(e){var t,n=e.values,r=e.index,a=e.setFieldValue,o=e.wdaysToCopy,l=null===(t=n.wdays[r].periods)||void 0===t?void 0:t.map(x(["startTime","endTime"]));o.forEach((function(e){var t=Z.indexOf(e);a("wdays[".concat(t,"].available"),i(n.wdays[r].periods)),a("wdays[".concat(t,"].periods"),l.map((function(t){return E("wday",e,t)})))}))},handleValuesChanged:v,scheduleRef:n})):e.createElement(pe,{periods:r}))))}));Oe.displayName="Schedule";export{Oe as default};