@licklist/design 0.63.0-dev.1 → 0.63.1-dev.0
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/recurring-date-picker-input/RecurringDatePickerInput.d.ts.map +1 -1
- package/dist/recurring-date-picker-input/RecurringDatePickerInput.js +1 -1
- package/dist/recurring-date-picker-input/utils.d.ts +3 -9
- package/dist/recurring-date-picker-input/utils.d.ts.map +1 -1
- package/dist/recurring-date-picker-input/utils.js +1 -1
- package/package.json +3 -3
- package/src/recurring-date-picker-input/RecurringDatePickerInput.stories.tsx +13 -7
- package/src/recurring-date-picker-input/RecurringDatePickerInput.tsx +4 -3
- package/src/recurring-date-picker-input/utils.ts +59 -55
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecurringDatePickerInput.d.ts","sourceRoot":"","sources":["../../src/recurring-date-picker-input/RecurringDatePickerInput.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAsB,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACrE,OAAc,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAE,QAAQ,EAAY,MAAM,OAAO,CAAC;AAU3C,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAGtF,OAAO,EAEL,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAIjB,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,wBAAwB,CAAC,EACvC,QAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,gBAAkC,EAClC,8BAAsC,EACtC,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,iBAAiB,CAAC,6BAA6B,CAAC,
|
|
1
|
+
{"version":3,"file":"RecurringDatePickerInput.d.ts","sourceRoot":"","sources":["../../src/recurring-date-picker-input/RecurringDatePickerInput.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAsB,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACrE,OAAc,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAE,QAAQ,EAAY,MAAM,OAAO,CAAC;AAU3C,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAGtF,OAAO,EAEL,kBAAkB,EAEnB,MAAM,SAAS,CAAC;AAIjB,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IACxD,QAAQ,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;CACnC;AAED,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,wBAAwB,CAAC,EACvC,QAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,gBAAkC,EAClC,8BAAsC,EACtC,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,iBAAiB,CAAC,6BAA6B,CAAC,eA8LlD;AAmGD,eAAO,MAAM,iBAAiB,SACtB,MAAM,QACN,MAAM,KACX,QAAQ,GAAG,MAiBb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=require("tslib"),n=require("react"),r=e(n),a=require("react-i18next"),i=e(require("react-bootstrap/Button")),l=require("react-bootstrap"),u=require("react-hook-form"),o=require("luxon"),s=require("../modals/confirmation/ConfirmModal.js");require("../modals/dialog/Dialog.js"),require("../modals/dialog/DialogContext.js");var d=require("../product-set/elements/DeleteFieldButton.js"),c=require("rrule"),m=e(c),f=require("@licklist/core/dist/Config/Date"),v=require("react-intl"),D=require("@licklist/plugins/dist/hooks/Value/usePreviousValue"),y=require("./RecurrenceIntervalAndFrequencyInput.js"),T=require("./utils.js"),p=require("./RecurrenceWeekdaysInput.js");var q=function(e){var n=e.rrule,r=e.startDate,a=e.endDate,i=e.startTime,l=e.endTime,u=e.initialFrequency,o=void 0===u?c.Frequency.DAILY:u;return t.__assign({startDate:r,endDate:a,startTime:i,endTime:l,interval:1,freq:o},n&&T.parseAndValidateRRule({rrule:n,date:r}))},g=function(e){var r=e.startDate,a=e.endDate,i=e.startTime,l=e.endTime,u=e.byWeekDay,s=void 0===u?[]:u,d=k(r,i||"00:00:00"),c=k(a,l||"23:59:59"),m=v.useIntl(),f=m.formatList,D=m.formatNumber;return n.useMemo((function(){if(d instanceof o.DateTime&&c instanceof o.DateTime&&d.isValid&&c.isValid){var e=o.Interval.fromDateTimes(d.set({second:0}),c.set({second:0})).toDuration(["days","hours","minutes"]);if(e.isValid){var n=function(e,t){return D(e,{style:"unit",unit:t,unitDisplay:"long"})},r=o.Interval.fromDateTimes(d.minus({second:1}),c.plus({second:1})).splitBy({days:1});if(!(s.length?r.reduce((function(e,t){return s.some((function(e){return e.weekday+1===t.start.weekday}))?e+1:e}),0):1))return n(0,"minute");var a=[[e.days,"day"],[e.hours,"hour"],[e.minutes,"minute"]].filter((function(e){return t.__read(e,1)[0]}));return a.length||a.push([0,"minute"]),f(a.map((function(e){return n.apply(void 0,t.__spreadArray([],t.__read(e),!1))})),{style:"long",type:"unit"})}}}),[d,c,s,f,D])},k=function(e,t){var n=o.DateTime.fromFormat("".concat(e," ").concat(t),f.DATE_TIME_FORMAT);if(n.isValid)return n;var r=o.DateTime.fromFormat("".concat(e," ").concat(t),f.DATE_TIME_FULL_FORMAT);return r.isValid?r:""};exports.RecurringDatePickerInput=function(e){var v,_,b,F,E,w,h=e.disabled,I=void 0!==h&&h,V=e.onChange,A=e.onDelete,x=e.defaultValues,L=e.initialFrequency,
|
|
1
|
+
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=require("tslib"),n=require("react"),r=e(n),a=require("react-i18next"),i=e(require("react-bootstrap/Button")),l=require("react-bootstrap"),u=require("react-hook-form"),o=require("luxon"),s=require("../modals/confirmation/ConfirmModal.js");require("../modals/dialog/Dialog.js"),require("../modals/dialog/DialogContext.js");var d=require("../product-set/elements/DeleteFieldButton.js"),c=require("rrule"),m=e(c),f=require("@licklist/core/dist/Config/Date"),v=require("react-intl"),D=require("@licklist/plugins/dist/hooks/Value/usePreviousValue"),y=require("./RecurrenceIntervalAndFrequencyInput.js"),T=require("./utils.js"),p=require("./RecurrenceWeekdaysInput.js");var q=function(e){var n=e.rrule,r=e.startDate,a=e.endDate,i=e.startTime,l=e.endTime,u=e.initialFrequency,o=void 0===u?c.Frequency.DAILY:u;return t.__assign({startDate:r,endDate:a,startTime:i,endTime:l,interval:1,freq:o},n&&T.parseAndValidateRRule({rrule:n,date:r}))},g=function(e){var r=e.startDate,a=e.endDate,i=e.startTime,l=e.endTime,u=e.byWeekDay,s=void 0===u?[]:u,d=k(r,i||"00:00:00"),c=k(a,l||"23:59:59"),m=v.useIntl(),f=m.formatList,D=m.formatNumber;return n.useMemo((function(){if(d instanceof o.DateTime&&c instanceof o.DateTime&&d.isValid&&c.isValid){var e=o.Interval.fromDateTimes(d.set({second:0}),c.set({second:0})).toDuration(["days","hours","minutes"]);if(e.isValid){var n=function(e,t){return D(e,{style:"unit",unit:t,unitDisplay:"long"})},r=o.Interval.fromDateTimes(d.minus({second:1}),c.plus({second:1})).splitBy({days:1});if(!(s.length?r.reduce((function(e,t){return s.some((function(e){return e.weekday+1===t.start.weekday}))?e+1:e}),0):1))return n(0,"minute");var a=[[e.days,"day"],[e.hours,"hour"],[e.minutes,"minute"]].filter((function(e){return t.__read(e,1)[0]}));return a.length||a.push([0,"minute"]),f(a.map((function(e){return n.apply(void 0,t.__spreadArray([],t.__read(e),!1))})),{style:"long",type:"unit"})}}}),[d,c,s,f,D])},k=function(e,t){var n=o.DateTime.fromFormat("".concat(e," ").concat(t),f.DATE_TIME_FORMAT);if(n.isValid)return n;var r=o.DateTime.fromFormat("".concat(e," ").concat(t),f.DATE_TIME_FULL_FORMAT);return r.isValid?r:""};exports.RecurringDatePickerInput=function(e){var v,_,b,F,E,w,h=e.disabled,I=void 0!==h&&h,V=e.onChange,A=e.onDelete,x=e.defaultValues,L=e.initialFrequency,R=void 0===L?c.Frequency.DAILY:L,j=e.setInitialStartDateAfterSelect,M=void 0!==j&&j,S=e.children,N=e.minDate,W=e.workHours,C=a.useTranslation(["Design"]).t,O=u.useForm({defaultValues:q({rrule:null!==(v=null==x?void 0:x.rrule)&&void 0!==v?v:"",startDate:null!==(_=null==x?void 0:x.startDate)&&void 0!==_?_:"",endDate:null!==(b=null==x?void 0:x.endDate)&&void 0!==b?b:"",startTime:null!==(F=null==x?void 0:x.startTime)&&void 0!==F?F:"",endTime:null!==(E=null==x?void 0:x.endTime)&&void 0!==E?E:"",initialFrequency:null!==(w=null==x?void 0:x.freq)&&void 0!==w?w:R}),mode:"onChange"}),P=O.watch,B=O.setValue,Y=O.handleSubmit,U=P("startDate"),H=P("endDate"),Q=P("startTime"),J=P("endTime"),K=P("byweekday"),z=D.usePreviousValue(U),G=g({startDate:U,endDate:H,startTime:Q,endTime:J,byWeekDay:K}),X=T.useWorkHoursValidation(K,W),Z=function(e){var n,r=k(H,J||"23:59:59"),a=Array.isArray(e.byweekday)?e.byweekday.map((function(e){return e instanceof c.Weekday?e:new c.Weekday(null==e?void 0:e.weekday)})):e.byweekday,i=(null==e?void 0:e.endTime)?o.DateTime.fromISO(null==e?void 0:e.endTime).toFormat(f.TIME_FULL_FORMAT):"",l=null!==(n=null==e?void 0:e.endDate)&&void 0!==n?n:"",u=m.optionsToString({until:r instanceof o.DateTime&&r.isValid?null==r?void 0:r.toJSDate():null,byweekday:a,count:e.count,freq:(null==a?void 0:a.length)?c.Frequency.WEEKLY:c.Frequency.DAILY,interval:e.interval}).replace("RRULE:","");V(t.__assign(t.__assign({},e),{endDate:l,endTime:i,rrule:u}))};return n.useEffect((function(){var e,t;if(M&&(!z||U)&&!U&&K&&K.length&&!Number.isNaN(null===(e=K[0])||void 0===e?void 0:e.weekday)){var n=(null===(t=K[0])||void 0===t?void 0:t.weekday)+1,r=o.DateTime.local(),a=o.DateTime.local().set({weekday:n});a>=r||n===r.weekday?B("startDate",a.toSQLDate()):B("startDate",a.plus({week:1}).toSQLDate())}}),[K,M]),r.createElement(u.FormProvider,t.__assign({},O),r.createElement(l.Form,{noValidate:!0,onSubmit:function(e){return e.preventDefault(),e.stopPropagation(),Y(Z)(e)}},r.createElement(p.default,{date:U,disabled:I}),r.createElement(y.default,{disabled:I,minDate:N,startTimeRules:X,endTimeRules:X}),S,r.createElement("div",{className:"d-inline-flex align-items-center w-100"},r.createElement(i,{type:"submit"},C("Design:apply")),r.createElement("div",{className:"d-flex flex-grow-1 text-muted mx-3 flex-column"},r.createElement("div",null,G&&"lasts ".concat(G))),x&&r.createElement("div",{className:"d-flex justify-content-end delete-btn"},r.createElement(s.ConfirmModal,null,(function(e){return r.createElement(d.DeleteFieldButton,{onDelete:function(){return e(A)}})}))))))},exports.getDateTimeObject=k;
|
|
@@ -16,15 +16,9 @@ export declare const parseAndValidateRRule: ({ rrule, date, }: {
|
|
|
16
16
|
rrule: string;
|
|
17
17
|
date: string;
|
|
18
18
|
}) => ParsedRRuleOptions;
|
|
19
|
-
export declare const
|
|
20
|
-
|
|
21
|
-
endTimeRules?: undefined;
|
|
19
|
+
export declare const useWorkHoursValidation: (byWeekDay: Weekday[], workHours: WorkHour[] | undefined) => {
|
|
20
|
+
validate?: undefined;
|
|
22
21
|
} | {
|
|
23
|
-
|
|
24
|
-
validate: (date: string) => string | true;
|
|
25
|
-
};
|
|
26
|
-
endTimeRules: {
|
|
27
|
-
validate: (date: string) => string | true;
|
|
28
|
-
};
|
|
22
|
+
validate: (_time: string) => string | true;
|
|
29
23
|
};
|
|
30
24
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/recurring-date-picker-input/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAItF,OAAc,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAElD,eAAO,MAAM,sBAAsB;UAI3B,MAAM;eACD,SAAS;MAClB,OAWH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,SAAS,CAAC,KAAK,GACf,SAAS,CAAC,MAAM,GAChB,SAAS,CAAC,OAAO,GACjB,SAAS,CAAC,MAAM,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,qBAAqB;WAIzB,MAAM;UACP,MAAM;wBAsEb,CAAC;AAEF,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/recurring-date-picker-input/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAItF,OAAc,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAElD,eAAO,MAAM,sBAAsB;UAI3B,MAAM;eACD,SAAS;MAClB,OAWH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,SAAS,CAAC,KAAK,GACf,SAAS,CAAC,MAAM,GAChB,SAAS,CAAC,OAAO,GACjB,SAAS,CAAC,MAAM,CAAC;AAErB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,qBAAqB;WAIzB,MAAM;UACP,MAAM;wBAsEb,CAAC;AAEF,eAAO,MAAM,sBAAsB,cACtB,OAAO,EAAE,aACT,QAAQ,EAAE,GAAG,SAAS;;;sBA4Cb,MAAM;CA4B3B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("@licklist/core/dist/Config"),t=require("react-i18next"),n=require("luxon"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("@licklist/core/dist/Config"),t=require("react-i18next"),n=require("luxon"),u=require("rrule"),i=(e=u)&&"object"==typeof e&&"default"in e?e.default:e,o=require("@licklist/plugins/dist/utils/dateTime"),a=function(e){var r=e.date,t=e.frequency,i=n.DateTime.fromISO(r);return new u.Weekday(i.weekday-1,t!==u.Frequency.MONTHLY?void 0:i.day+7>i.daysInMonth?-1:Math.floor(i.day/7)+1)};exports.getWeekdayForFrequency=a,exports.parseAndValidateRRule=function(e){var r,t,n=e.rrule,o=e.date,d="Unsupported RRule",f=new Set(["interval","freq","byweekday","until","count"]),l=new Set([u.Frequency.DAILY,u.Frequency.WEEKLY,u.Frequency.MONTHLY,u.Frequency.YEARLY]),s=i.parseString(n.includes("EXDATE")?n.split(";EXDATE=")[0]:n);if(Object.keys(s).some((function(e){return!f.has(e)}))||void 0===s.freq||!l.has(s.freq)||s.until&&s.count)throw new Error(d);if(s.byweekday){var c=s.byweekday;if(s.freq===u.Frequency.WEEKLY){if(c.some((function(e){return void 0!==e.n})))throw new Error(d)}else{if(s.freq!==u.Frequency.MONTHLY)throw new Error(d);var y=a({date:o,frequency:u.Frequency.MONTHLY});if(c.length>1||(null===(r=c[0])||void 0===r?void 0:r.weekday)!==y.weekday||(null===(t=c[0])||void 0===t?void 0:t.n)!==y.n)throw new Error(d)}}return{interval:s.interval,freq:s.freq,byweekday:s.byweekday,count:s.count,until:s.until}},exports.useWorkHoursValidation=function(e,u){void 0===e&&(e=[]);var i=t.useTranslation("Validation").t;if(!u)return{};var a=o.fromFormat(r.TIME_FORMAT),d=u.map((function(e,r,t){var u=[],i=a(e.start),o=a(e.end);o>i?u.push(n.Interval.fromDateTimes(i,o)):u.push(n.Interval.fromDateTimes(i,i.endOf("day")));var d=0===r?t.length-1:r-1,f=a(t[d].start),l=a(t[d].end);return f>l&&u.push(n.Interval.fromDateTimes(l.startOf("day"),l)),u}));return[0,7].includes(e.length)||(d=d.filter((function(r,t){return e.find((function(e){return e.weekday===t}))}))),{validate:function(e){var r=a(e),t=d.reduce((function(e,t){return t.some((function(e){return e.contains(r)}))||e.push(t),e}),[]),n=t.flat().filter((function(e){return!e.contains(r)}));return 0===t.length||i("outsideWorkingHours",{attribute:n.map((function(e){return e.toFormat("HH:mm")})).join(", ")})}}};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@licklist/design",
|
|
3
|
-
"version": "0.63.
|
|
3
|
+
"version": "0.63.1-dev.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+ssh://git@bitbucket.org/artelogicsoft/licklist_design.git"
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
"@fortawesome/free-brands-svg-icons": "5.15.2",
|
|
51
51
|
"@fortawesome/free-solid-svg-icons": "5.15.2",
|
|
52
52
|
"@fortawesome/react-fontawesome": "0.1.9",
|
|
53
|
-
"@licklist/core": ">=0.25.1-dev.
|
|
53
|
+
"@licklist/core": ">=0.25.1-dev.2 < 0.25.1",
|
|
54
54
|
"@licklist/eslint-config": "0.4.5",
|
|
55
|
-
"@licklist/plugins": ">=0.28.0-dev.
|
|
55
|
+
"@licklist/plugins": ">=0.28.0-dev.3 < 0.28.0",
|
|
56
56
|
"@mdx-js/react": "1.6.22",
|
|
57
57
|
"@popperjs/core": "2.11.8",
|
|
58
58
|
"@react-aria/utils": "3.9.0",
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Meta, Story } from "@storybook/react";
|
|
3
3
|
import { Card } from "react-bootstrap";
|
|
4
|
+
import { DateTime } from "luxon";
|
|
5
|
+
import { DATE_FORMAT, TIME_FORMAT } from "@licklist/core/dist/Config/Date";
|
|
4
6
|
import {
|
|
5
7
|
RecurringDatePickerInput,
|
|
6
8
|
RecurringDatePickerInputProps,
|
|
7
9
|
} from "./RecurringDatePickerInput";
|
|
8
|
-
import { DateTime } from "luxon";
|
|
9
|
-
import { DATE_FORMAT, TIME_FORMAT } from "@licklist/core/dist/Config/Date";
|
|
10
10
|
|
|
11
11
|
export default {
|
|
12
12
|
title: "RecurringDatePickerInput",
|
|
13
13
|
component: RecurringDatePickerInput,
|
|
14
14
|
} as Meta;
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
extends RecurringDatePickerInputProps {}
|
|
18
|
-
|
|
19
|
-
export const Default: Story<DefaultRecurringDatePickerInputProps> = (args) => {
|
|
16
|
+
export const Default: Story<RecurringDatePickerInputProps> = (args) => {
|
|
20
17
|
return (
|
|
21
18
|
<Card style={{ maxWidth: "max-content" }}>
|
|
22
19
|
<Card.Body>
|
|
@@ -25,7 +22,7 @@ export const Default: Story<DefaultRecurringDatePickerInputProps> = (args) => {
|
|
|
25
22
|
</Card>
|
|
26
23
|
);
|
|
27
24
|
};
|
|
28
|
-
export const Valid: Story<
|
|
25
|
+
export const Valid: Story<RecurringDatePickerInputProps> = (args) => {
|
|
29
26
|
return (
|
|
30
27
|
<Card style={{ maxWidth: "max-content" }}>
|
|
31
28
|
<Card.Body>
|
|
@@ -36,6 +33,15 @@ export const Valid: Story<DefaultRecurringDatePickerInputProps> = (args) => {
|
|
|
36
33
|
};
|
|
37
34
|
Default.args = {
|
|
38
35
|
onChange: (data) => console.log("onSubmit", data),
|
|
36
|
+
workHours: [
|
|
37
|
+
{ start: "20:00", end: "04:00", day: 0, description: "" },
|
|
38
|
+
{ start: "20:00", end: "04:00", day: 1, description: "" },
|
|
39
|
+
{ start: "20:00", end: "04:00", day: 2, description: "" },
|
|
40
|
+
{ start: "20:00", end: "12:00", day: 3, description: "" },
|
|
41
|
+
{ start: "20:00", end: "23:00", day: 4, description: "" },
|
|
42
|
+
{ start: "08:00", end: "12:00", day: 5, description: "" },
|
|
43
|
+
{ start: "10:00", end: "16:00", day: 6, description: "" },
|
|
44
|
+
],
|
|
39
45
|
};
|
|
40
46
|
Valid.args = {
|
|
41
47
|
onChange: (data) => console.log("onSubmit", data),
|
|
@@ -18,7 +18,7 @@ import RecurrenceWeekdaysInput from "./RecurrenceWeekdaysInput";
|
|
|
18
18
|
import {
|
|
19
19
|
parseAndValidateRRule,
|
|
20
20
|
SupportedFrequency,
|
|
21
|
-
|
|
21
|
+
useWorkHoursValidation,
|
|
22
22
|
} from "./utils";
|
|
23
23
|
import { ConfirmModal } from "../modals";
|
|
24
24
|
import { DeleteFieldButton } from "../product-set/elements";
|
|
@@ -91,7 +91,7 @@ export function RecurringDatePickerInput({
|
|
|
91
91
|
byWeekDay,
|
|
92
92
|
});
|
|
93
93
|
|
|
94
|
-
const
|
|
94
|
+
const validator = useWorkHoursValidation(byWeekDay, workHours);
|
|
95
95
|
|
|
96
96
|
const onSubmit = (nextState: RecurringDatePickerInputValues) => {
|
|
97
97
|
const end = getDateTimeObject(endDate, endTime || "23:59:59");
|
|
@@ -197,7 +197,8 @@ export function RecurringDatePickerInput({
|
|
|
197
197
|
<RecurrenceIntervalAndFrequencyInput
|
|
198
198
|
disabled={disabled}
|
|
199
199
|
minDate={minDate}
|
|
200
|
-
{
|
|
200
|
+
startTimeRules={validator}
|
|
201
|
+
endTimeRules={validator}
|
|
201
202
|
/>
|
|
202
203
|
|
|
203
204
|
{children}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TIME_FORMAT } from "@licklist/core/dist/Config";
|
|
2
2
|
import { WorkHour } from "@licklist/core/dist/DataMapper/Provider/WorkHourDataMapper";
|
|
3
|
-
import {
|
|
4
|
-
import { DateTime } from "luxon";
|
|
3
|
+
import { fromFormat } from "@licklist/plugins/dist/utils/dateTime";
|
|
4
|
+
import { DateTime, Interval } from "luxon";
|
|
5
5
|
import { useTranslation } from "react-i18next";
|
|
6
6
|
import RRule, { Frequency, Weekday } from "rrule";
|
|
7
7
|
|
|
@@ -115,74 +115,78 @@ export const parseAndValidateRRule = ({
|
|
|
115
115
|
} as ParsedRRuleOptions;
|
|
116
116
|
};
|
|
117
117
|
|
|
118
|
-
export const
|
|
118
|
+
export const useWorkHoursValidation = (
|
|
119
119
|
byWeekDay: Weekday[] = [],
|
|
120
120
|
workHours: WorkHour[] | undefined
|
|
121
121
|
) => {
|
|
122
122
|
const { t } = useTranslation("Validation");
|
|
123
123
|
if (!workHours) return {};
|
|
124
124
|
|
|
125
|
-
|
|
126
|
-
const selectedWorkHours = byWeekDay.length
|
|
127
|
-
? byWeekDay.map(({ weekday }) =>
|
|
128
|
-
workHours.find(({ day }) => day === weekday)
|
|
129
|
-
)
|
|
130
|
-
: workHours;
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* start time
|
|
134
|
-
*/
|
|
135
|
-
const startTimes = selectedWorkHours
|
|
136
|
-
.map((workhour) => DateTime.fromFormat(workhour.start, TIME_FORMAT))
|
|
137
|
-
.sort(dateTimesSortFn("desc"));
|
|
138
|
-
|
|
139
|
-
const latestStartTime = startTimes[0];
|
|
140
|
-
|
|
141
|
-
const startTimeRules = {
|
|
142
|
-
validate: (date: string) => {
|
|
143
|
-
const selectedDate = DateTime.fromFormat(date, TIME_FORMAT);
|
|
144
|
-
if (selectedDate >= latestStartTime) return true;
|
|
145
|
-
|
|
146
|
-
return t("fieldTimeAfter", {
|
|
147
|
-
attribute: t("Design:startTimeSmall"),
|
|
148
|
-
time: latestStartTime.toFormat(TIME_FORMAT),
|
|
149
|
-
});
|
|
150
|
-
},
|
|
151
|
-
};
|
|
125
|
+
const fromTimeFormat = fromFormat(TIME_FORMAT);
|
|
152
126
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const endTimes = selectedWorkHours
|
|
157
|
-
.map<string>(({ start, end }) => {
|
|
158
|
-
const startDateTime = DateTime.fromFormat(start, TIME_FORMAT);
|
|
159
|
-
const endDateTime = DateTime.fromFormat(end, TIME_FORMAT);
|
|
127
|
+
// map every day to array of intervals describing workhours for that day
|
|
128
|
+
let intervalsByDay = workHours.map((workhour, index, self) => {
|
|
129
|
+
const res: Interval[] = [];
|
|
160
130
|
|
|
161
|
-
|
|
131
|
+
const startTime = fromTimeFormat(workhour.start);
|
|
132
|
+
const endTime = fromTimeFormat(workhour.end);
|
|
162
133
|
|
|
134
|
+
if (endTime > startTime) {
|
|
135
|
+
res.push(Interval.fromDateTimes(startTime, endTime));
|
|
136
|
+
} else {
|
|
163
137
|
// if end is before start, then it means that end is on the next day
|
|
164
138
|
// so count only to the end of current day
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
.map((workhour) => DateTime.fromFormat(workhour, TIME_FORMAT))
|
|
168
|
-
.sort(dateTimesSortFn("asc"));
|
|
139
|
+
res.push(Interval.fromDateTimes(startTime, startTime.endOf("day")));
|
|
140
|
+
}
|
|
169
141
|
|
|
170
|
-
|
|
142
|
+
const prevIndex = index === 0 ? self.length - 1 : index - 1;
|
|
171
143
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
const selectedDate = DateTime.fromFormat(date, TIME_FORMAT);
|
|
175
|
-
if (selectedDate <= earliestEndTime) return true;
|
|
144
|
+
const prevStartTime = fromTimeFormat(self[prevIndex].start);
|
|
145
|
+
const prevEndTime = fromTimeFormat(self[prevIndex].end);
|
|
176
146
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
|
|
147
|
+
// if prevStartTime > prevEndTime then it means that prevEndTime is on the current day
|
|
148
|
+
// so we need to add interval from start of current day to prevEndTime
|
|
149
|
+
if (prevStartTime > prevEndTime) {
|
|
150
|
+
res.push(Interval.fromDateTimes(prevEndTime.startOf("day"), prevEndTime));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return res;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// if length === 0 or length === 7 then all workhours are selected, no need to filter
|
|
157
|
+
if (![0, 7].includes(byWeekDay.length)) {
|
|
158
|
+
intervalsByDay = intervalsByDay.filter((_, index) =>
|
|
159
|
+
byWeekDay.find(({ weekday }) => weekday === index)
|
|
160
|
+
);
|
|
161
|
+
}
|
|
183
162
|
|
|
184
163
|
return {
|
|
185
|
-
|
|
186
|
-
|
|
164
|
+
validate: (_time: string) => {
|
|
165
|
+
const time = fromTimeFormat(_time);
|
|
166
|
+
|
|
167
|
+
const notFittingIntervalsByDay = intervalsByDay.reduce<Interval[][]>(
|
|
168
|
+
(acc, intervalsByDay) => {
|
|
169
|
+
if (!intervalsByDay.some((interval) => interval.contains(time))) {
|
|
170
|
+
acc.push(intervalsByDay);
|
|
171
|
+
}
|
|
172
|
+
return acc;
|
|
173
|
+
},
|
|
174
|
+
[]
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
const notFittingIntervals = notFittingIntervalsByDay
|
|
178
|
+
.flat()
|
|
179
|
+
.filter((interval) => !interval.contains(time));
|
|
180
|
+
|
|
181
|
+
if (notFittingIntervalsByDay.length !== 0) {
|
|
182
|
+
return t("outsideWorkingHours", {
|
|
183
|
+
attribute: notFittingIntervals
|
|
184
|
+
.map((interval) => interval.toFormat("HH:mm"))
|
|
185
|
+
.join(", "),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return true;
|
|
190
|
+
},
|
|
187
191
|
};
|
|
188
192
|
};
|