@licklist/design 0.44.485-dev.99 → 0.44.486-dev.1
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/date-time-button/DateContent.js +1 -1
- package/dist/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.d.ts.map +1 -1
- package/dist/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.js +1 -1
- package/dist/recurring-date-picker-input/RecurringDatePickerInput.d.ts.map +1 -1
- package/dist/recurring-date-picker-input/RecurringDatePickerInput.js +1 -1
- package/dist/zone/form/components/AvailableTimesControl.d.ts +7 -0
- package/dist/zone/form/components/AvailableTimesControl.d.ts.map +1 -1
- package/dist/zone/form/components/AvailableTimesControl.js +1 -1
- package/dist/zone/form/components/ZoneRecurrencesControl.d.ts.map +1 -1
- package/dist/zone/form/components/ZoneRecurrencesControl.js +1 -1
- package/package.json +1 -1
- package/src/date-time-button/DateContent.tsx +1 -1
- package/src/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.tsx +62 -11
- package/src/recurring-date-picker-input/RecurringDatePickerInput.tsx +1 -0
- package/src/zone/form/components/AvailableTimesControl.tsx +6 -1
- package/src/zone/form/components/ZoneRecurrencesControl.tsx +33 -5
|
@@ -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"),r=e(require("react")),i=require("@licklist/core/dist/Config"),a=e(require("clsx")),
|
|
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"),r=e(require("react")),i=require("@licklist/core/dist/Config"),a=require("react-i18next"),o=e(require("clsx")),s=require("@licklist/plugins/dist/utils/formatDate"),l=require("date-fns");exports.DateContent=function(e){var n=e.date,c=e.isDisabled,d=e.isSelected,u=a.useTranslation("Design").t,f=t.__read(n.toFormat(i.DAY_NUMBER_WITH_MONTH).split(" "),2),m=f[0],D=f[1];return r.createElement("div",{className:"weekday-info"},r.createElement("div",null,l.isToday(n.toJSDate())?u("today"):l.isTomorrow(n.toJSDate())?u("tomorrow"):n.toFormat(i.DAY_OF_WEEK)),r.createElement("div",{className:o("descriptions",d&&"selected",c&&"disabled")},"".concat(s.getDayWithOrdinal(+m)," ").concat(D)))};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RecurrenceIntervalAndFrequencyInput.d.ts","sourceRoot":"","sources":["../../src/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"RecurrenceIntervalAndFrequencyInput.d.ts","sourceRoot":"","sources":["../../src/recurring-date-picker-input/RecurrenceIntervalAndFrequencyInput.tsx"],"names":[],"mappings":";AAQA,UAAU,wCAAwC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,iBAAS,mCAAmC,CAAC,EAC3C,QAAgB,EAChB,OAAO,EACP,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,GACb,EAAE,wCAAwC,eA+I1C;AAED,eAAe,mCAAmC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("tslib"),a=require("react"),l=(e=a)&&"object"==typeof e&&"default"in e?e.default:e,r=require("react-i18next"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("tslib"),a=require("react"),l=(e=a)&&"object"==typeof e&&"default"in e?e.default:e,r=require("@licklist/core/dist/Config"),n=require("react-i18next"),i=require("react-bootstrap"),o=require("react-hook-form"),m=require("luxon");exports.default=function(e){var s,d,u,c=e.disabled,f=void 0!==c&&c,D=e.minDate,F=e.startDateLabel,E=e.startTimeLabel,v=e.endDateLabel,T=e.endTimeLabel,b=n.useTranslation(["Design","Notification","App"]).t,g=o.useFormContext(),p=g.getValues,_=g.formState.errors,C=g.register,q=g.trigger,y=p("startDate"),L=p("endDate"),h=p("startTime"),x=p("endTime");return a.useEffect((function(){y&&L&&q("endDate")}),[y]),a.useEffect((function(){q("endTime")}),[h]),l.createElement(l.Fragment,null,l.createElement(i.Row,null,l.createElement(i.Col,{xs:12,sm:6},l.createElement(i.Form.Group,null,l.createElement(i.Form.Label,null,null!=F?F:b("Design:fromDate")),l.createElement(i.Form.Control,t.__assign({type:"date"},C("startDate",{required:!0}),{defaultValue:y,className:y&&"date-input-with-value",disabled:f,min:D,isInvalid:Boolean(_.startDate)})),l.createElement(i.Form.Control.Feedback,{type:"invalid"},null===(s=_.startDate)||void 0===s?void 0:s.message))),l.createElement(i.Col,{xs:12,sm:6},l.createElement(i.Form.Group,null,l.createElement(i.Form.Label,null,null!=v?v:b("Design:toDate")),l.createElement(i.Form.Control,t.__assign({type:"date"},C("endDate",{required:!0,validate:function(e){if(!y||!e)return!0;var t=m.DateTime.fromFormat(y,r.DATE_FORMAT);return m.DateTime.fromFormat(e,r.DATE_FORMAT).diff(t,["days"]).days>=0||"".concat(b("Validation:fieldLaterDate",{attribute:b("Design:endDateSmall"),min:b("Design:startDateSmall")}))}}),{defaultValue:L,className:L&&"date-input-with-value",disabled:f,min:y||void 0,isInvalid:Boolean(_.endDate)})),l.createElement(i.Form.Control.Feedback,{type:"invalid"},null===(d=_.endDate)||void 0===d?void 0:d.message)))),l.createElement(i.Row,{className:"align-items-center"},l.createElement(i.Col,{xs:12,sm:6},l.createElement(i.Form.Group,null,l.createElement(i.Form.Label,null,null!=E?E:b("Design:availableFrom")),l.createElement(i.Form.Control,t.__assign({type:"time"},C("startTime",{required:!1}),{placeholder:"hh:mm",defaultValue:h,disabled:f,isInvalid:Boolean(_.startTime)})))),l.createElement(i.Col,{xs:12,sm:6},l.createElement(i.Form.Group,null,l.createElement(i.Form.Label,null,null!=T?T:b("Design:availableTo")),l.createElement(i.Form.Control,t.__assign({type:"time"},C("endTime",{required:!1,validate:function(e){if(!h||!e)return!0;var t=m.DateTime.fromFormat(h,r.TIME_FORMAT);return m.DateTime.fromFormat(e,r.TIME_FORMAT).diff(t,["minutes"]).minutes>0||"".concat(b("Validation:fieldLaterDate",{attribute:b("Design:endTimeSmall"),min:b("Design:startTimeSmall")}))}}),{placeholder:"hh:mm",defaultValue:x,disabled:f,isInvalid:Boolean(_.endTime)})),l.createElement(i.Form.Control.Feedback,{type:"invalid"},null===(u=_.endTime)||void 0===u?void 0:u.message)))))};
|
|
@@ -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;AAclD,OAAO,EAAyB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIpE,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;CAClB;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;CAChB;AAED,wBAAgB,wBAAwB,CAAC,EACvC,QAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,gBAAkC,EAClC,8BAAsC,EACtC,QAAQ,EACR,OAAO,GACR,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;AAclD,OAAO,EAAyB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIpE,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;CAClB;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;CAChB;AAED,wBAAgB,wBAAwB,CAAC,EACvC,QAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,gBAAkC,EAClC,8BAAsC,EACtC,QAAQ,EACR,OAAO,GACR,EAAE,iBAAiB,CAAC,6BAA6B,CAAC,eAmLlD"}
|
|
@@ -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"),
|
|
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("react-intl"),v=require("@licklist/core/dist/Config/Date"),D=require("@licklist/plugins/dist/hooks/Value/usePreviousValue"),y=require("./RecurrenceIntervalAndFrequencyInput.js"),p=require("./utils.js"),T=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&&p.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=f.useIntl(),v=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"]),v(a.map((function(e){return n.apply(void 0,t.__spreadArray([],t.__read(e),!1))})),{style:"long",type:"unit"})}}}),[d,c,s,v,D])},k=function(e,t){var n=o.DateTime.fromFormat("".concat(e," ").concat(t),v.DATE_TIME_FORMAT);if(n.isValid)return n;var r=o.DateTime.fromFormat("".concat(e," ").concat(t),v.DATE_TIME_FULL_FORMAT);return r.isValid?r:""};exports.RecurringDatePickerInput=function(e){var f,v,p,b,_,E,F=e.disabled,w=void 0!==F&&F,h=e.onChange,V=e.onDelete,A=e.defaultValues,I=e.initialFrequency,x=void 0===I?c.Frequency.DAILY:I,j=e.setInitialStartDateAfterSelect,L=void 0!==j&&j,R=e.children,M=e.minDate,S=a.useTranslation(["Design"]).t,N=u.useForm({defaultValues:q({rrule:null!==(f=null==A?void 0:A.rrule)&&void 0!==f?f:"",startDate:null!==(v=null==A?void 0:A.startDate)&&void 0!==v?v:"",endDate:null!==(p=null==A?void 0:A.endDate)&&void 0!==p?p:"",startTime:null!==(b=null==A?void 0:A.startTime)&&void 0!==b?b:"",endTime:null!==(_=null==A?void 0:A.endTime)&&void 0!==_?_:"",initialFrequency:null!==(E=null==A?void 0:A.freq)&&void 0!==E?E:x}),mode:"onChange"}),C=N.watch,P=N.setValue,W=N.handleSubmit,B=C("startDate"),Y=C("endDate"),O=C("startTime"),Q=C("endTime"),U=C("byweekday"),J=D.usePreviousValue(B),K=g({startDate:B,endDate:Y,startTime:O,endTime:Q,byWeekDay:U}),z=function(e){var n=k(Y,Q||"23:59:59"),r=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,a=m.optionsToString({until:n instanceof o.DateTime&&n.isValid?null==n?void 0:n.toJSDate():null,byweekday:r,count:e.count,freq:(null==r?void 0:r.length)?c.Frequency.WEEKLY:c.Frequency.DAILY,interval:e.interval}).replace("RRULE:","");h(t.__assign(t.__assign({},e),{rrule:a}))};return n.useEffect((function(){var e,t;if(L&&(!J||B)&&!B&&U&&U.length&&!Number.isNaN(null===(e=U[0])||void 0===e?void 0:e.weekday)){var n=(null===(t=U[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?P("startDate",a.toSQLDate()):P("startDate",a.plus({week:1}).toSQLDate())}}),[U,L]),r.createElement(u.FormProvider,t.__assign({},N),r.createElement(l.Form,{noValidate:!0,onSubmit:function(e){return e.preventDefault(),e.stopPropagation(),W(z)(e)}},r.createElement(T.default,{date:B,disabled:w}),r.createElement(y.default,{disabled:w,minDate:M}),R,r.createElement("div",{className:"d-inline-flex align-items-center w-100"},r.createElement(i,{type:"submit"},S("Design:apply")),r.createElement("div",{className:"d-flex flex-grow-1 text-muted mx-3 flex-column"},r.createElement("div",null,K&&"lasts ".concat(K))),A&&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(V)}})}))))))};
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import { UseFormSetError } from "react-hook-form";
|
|
2
3
|
import { WorkHour } from "@licklist/core/dist/DataMapper/Provider/WorkHourDataMapper";
|
|
3
4
|
export type AvailableTimesControlRef = {
|
|
4
5
|
trigger: () => Promise<boolean>;
|
|
5
6
|
getValues: () => {
|
|
6
7
|
availableTimes: string[];
|
|
7
8
|
};
|
|
9
|
+
setError: UseFormSetError<AvailableTimesForm>;
|
|
8
10
|
};
|
|
9
11
|
type AvailableTimesControlProps = {
|
|
10
12
|
isLoading: boolean;
|
|
11
13
|
workHours?: WorkHour[];
|
|
12
14
|
defaultValues?: string[];
|
|
15
|
+
startTime?: string;
|
|
16
|
+
endTime?: string;
|
|
17
|
+
};
|
|
18
|
+
type AvailableTimesForm = {
|
|
19
|
+
availableTimes: string[];
|
|
13
20
|
};
|
|
14
21
|
export declare const AvailableTimesControl: React.ForwardRefExoticComponent<AvailableTimesControlProps & React.RefAttributes<AvailableTimesControlRef>>;
|
|
15
22
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AvailableTimesControl.d.ts","sourceRoot":"","sources":["../../../../src/zone/form/components/AvailableTimesControl.tsx"],"names":[],"mappings":"AAAA,OAAO,KAKN,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AvailableTimesControl.d.ts","sourceRoot":"","sources":["../../../../src/zone/form/components/AvailableTimesControl.tsx"],"names":[],"mappings":"AAAA,OAAO,KAKN,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,eAAe,EAAW,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAItF,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM;QAAE,cAAc,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC9C,QAAQ,EAAE,eAAe,CAAC,kBAAkB,CAAC,CAAC;CAC/C,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IAAE,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEvD,eAAO,MAAM,qBAAqB,6GA8FhC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("tslib"),t=require("react"),a=(e=t)&&"object"==typeof e&&"default"in e?e.default:e,i=require("react-i18next"),l=require("react-bootstrap"),s=require("react-hook-form"),n=require("@react-aria/utils"),u=require("@licklist/plugins/dist/utils/time"),o=require("../utils/dates.js"),c=t.forwardRef((function(e,c){var m,d=e.isLoading,f=e.workHours,v=e.defaultValues,b=void 0===v?[]:v,g=n.useId(),p=i.useTranslation(["Design","Validation"]).t,h=s.useForm({mode:"onChange"}),T=h.register,k=h.formState.errors,
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("tslib"),t=require("react"),a=(e=t)&&"object"==typeof e&&"default"in e?e.default:e,i=require("react-i18next"),l=require("react-bootstrap"),s=require("react-hook-form"),n=require("@react-aria/utils"),u=require("@licklist/plugins/dist/utils/time"),o=require("../utils/dates.js"),c=t.forwardRef((function(e,c){var m,d=e.isLoading,f=e.workHours,v=e.defaultValues,b=void 0===v?[]:v,g=n.useId(),p=i.useTranslation(["Design","Validation"]).t,h=s.useForm({mode:"onChange"}),T=h.register,k=h.formState.errors,E=h.reset,_=h.trigger,q=h.getValues,y=h.setValue,C=h.watch,F=h.setError,V=C("availableTimes")||[],x=t.useMemo((function(){return o.getCheckboxesByWorkHours(f)}),[f]);t.useImperativeHandle(c,(function(){return{trigger:_,getValues:q,setError:F}}));return t.useEffect((function(){b&&E({availableTimes:b})}),[b]),a.createElement(l.Form.Group,{controlId:g},a.createElement(l.Form.Label,null,p("Design:startTimes")),a.createElement("div",{className:"zone-available-times"},x.map((function(e){return a.createElement(l.Form.Check,{key:e,inline:!0,custom:!0,id:e},a.createElement(l.Form.Check.Input,{type:"checkbox",value:e,checked:V.includes(u.calculateTimeWithOffset(e)),onChange:function(){return function(e){var t=u.calculateTimeWithOffset(e);V.includes(t)?y("availableTimes",V.filter((function(e){return e!==t}))):y("availableTimes",r.__spreadArray(r.__spreadArray([],r.__read(V),!1),[t],!1))}(e)},disabled:d}),a.createElement(l.Form.Check.Label,null,e))}))),a.createElement(l.Form.Control,r.__assign({type:"hidden"},T("availableTimes",{required:{value:!0,message:p("Validation:fieldMinNumber",{attribute:p("startTimes"),min:1})}}))),a.createElement("div",{className:"manual-form-error"},null===(m=k.availableTimes)||void 0===m?void 0:m.message))}));exports.AvailableTimesControl=c;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZoneRecurrencesControl.d.ts","sourceRoot":"","sources":["../../../../src/zone/form/components/ZoneRecurrencesControl.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,kEAAkE,CAAC;AAMlG,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;
|
|
1
|
+
{"version":3,"file":"ZoneRecurrencesControl.d.ts","sourceRoot":"","sources":["../../../../src/zone/form/components/ZoneRecurrencesControl.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,kEAAkE,CAAC;AAMlG,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAoBtF,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;CAC7C;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,sBAAsB,8BAGhC,0BAA0B,gBAkP5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("tslib"),t=require("react"),n=(e=t)&&"object"==typeof e&&"default"in e?e.default:e,i=require("react-i18next"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("tslib"),t=require("react"),n=(e=t)&&"object"==typeof e&&"default"in e?e.default:e,i=require("@licklist/core/dist/Config"),a=require("react-i18next"),o=require("react-bootstrap"),u=require("../../../static/Icon.js"),l=require("react-hook-form"),s=require("@react-aria/utils"),c=require("react-use"),d=require("luxon");require("../../../static/index.js");var m=require("@dnd-kit/core"),f=require("@dnd-kit/sortable"),v=require("../../../modals/confirmation/ConfirmModal.js"),g=require("../../../recurring-date-picker-input/RecurringDatePickerInput.js"),T=require("../../../product-set/control/DateAndRecurrenceInput.js"),p=require("@licklist/plugins/dist/utils/time"),_=require("./ZoneRecurrenceControl.js"),E=require("./AvailableTimesControl.js");exports.ZoneRecurrencesControl=function(e){var b,q,C=e.workHours,D=e.isLoading,R=void 0!==D&&D,x=l.useFormContext(),I=x.control,k=x.register,y=x.formState.errors,S=x.getValues,A=x.setValue,h=x.clearErrors,F=l.useFieldArray({name:"zoneRecurrences",control:I,keyName:"_id"}),M=F.fields,N=F.append,O=F.update,z=F.move,w=r.__read(t.useState(!1),2),j=w[0],V=w[1],L=r.__read(t.useState({index:null,values:null}),2),P=L[0],Z=L[1],H=function(){return Z({index:null,values:null})},W=r.__read(t.useState([]),2),B=W[0],G=W[1],K=t.useRef(),J=t.useRef();c.useClickAway(K,(function(e){var r,t,n;v.CONFIRM_MODAL_ACTIONS.includes(null===(n=null===(t=null===(r=e.target)||void 0===r?void 0:r.attributes)||void 0===t?void 0:t.getNamedItem("data-id"))||void 0===n?void 0:n.value)||(V(!1),H())}));var Q=s.useId(),U=a.useTranslation(["Design","Validation"]).t,X=function(){H(),V((function(e){return!e}))};return t.useEffect((function(){M.length&&h("zoneRecurrences")}),[M,h]),n.createElement(o.Form.Group,null,n.createElement(o.Form.Label,null,U("zoneAvailable")),n.createElement(o.OverlayTrigger,{show:j,overlay:n.createElement(o.Popover,{id:Q,className:"rounded"},n.createElement(o.Popover.Content,{className:"shadow-lg rounded",ref:K},n.createElement(g.RecurringDatePickerInput,{defaultValues:P.values,onChange:function(e){return r.__awaiter(void 0,void 0,void 0,(function(){var t,n,a,o,u,l,s;return r.__generator(this,(function(c){switch(c.label){case 0:return[4,null===(u=J.current)||void 0===u?void 0:u.trigger()];case 1:return c.sent()?(t=d.DateTime.fromFormat(e.startTime,i.TIME_FORMAT),n=d.DateTime.fromFormat(e.endTime,i.TIME_FORMAT),a=J.current.getValues().availableTimes,a.every((function(e){var r=d.DateTime.fromFormat(p.calculateTimeWithOffset(e,p.DIRECTION_TO_LOCAL),i.TIME_FORMAT);return r.diff(t,"minutes").minutes>=0&&r.diff(n,"minutes").minutes<=0}))?(o=r.__assign({rrule:e.rrule,startDate:e.startDate,endDate:e.endDate,startTime:e.startTime,endTime:e.endTime},J.current.getValues()),(null===(l=P.values)||void 0===l?void 0:l.id)&&(o.id=null===(s=P.values)||void 0===s?void 0:s.id),null!==P.index?O(P.index,o):N(o),V((function(){return!1})),H(),[2]):(J.current.setError("availableTimes",{message:U("Validation:fieldTimeBetween",{attribute:U("Design:startTimesSmall"),min:null==e?void 0:e.startTime,max:null==e?void 0:e.endTime})}),[2])):[2]}}))}))},onDelete:function(){var e=P.index;V(!1),H(),setTimeout((function(){var r=S().zoneRecurrences;A("zoneRecurrences",(void 0===r?[]:r).filter((function(r,t){return t!==e})))}),100)},setInitialStartDateAfterSelect:!0},n.createElement(E.AvailableTimesControl,{workHours:C,isLoading:R,defaultValues:B,ref:J})))),trigger:"click",placement:"bottom",popperConfig:{modifiers:[T.sameWidthPopperModifier]}},n.createElement("div",{className:"zone-recurrences"},n.createElement(m.DndContext,{onDragEnd:function(e){var r=e.over,t=e.active;if(r.id!==t.id){var n=M.findIndex((function(e){return String(e._id)===t.id})),i=M.findIndex((function(e){return String(e._id)===r.id}));z(n,i)}}},n.createElement(f.SortableContext,{items:null!==(b=null==M?void 0:M.map((function(e){return String(e._id)})))&&void 0!==b?b:[],strategy:f.verticalListSortingStrategy},null==M?void 0:M.map((function(e,r){return n.createElement(_.ZoneRecurrenceControl,{key:e._id,zoneRecurrence:e,onEdit:function(){return function(e,r){H(),setTimeout((function(){Z({index:r,values:e}),G(e.availableTimes||[]),V((function(){return!0}))}),100)}(e,r)}})})))),n.createElement("div",{className:"zone-recurrence-icon-wrapper",role:"button",tabIndex:0,onClick:X,onKeyDown:X},n.createElement(u.default,{type:"plus-circle",height:"1rem",className:"zone-recurrence-icon-add mr-2"}),U("addDates")),n.createElement(o.Form.Control,r.__assign({type:"hidden"},k("zoneRecurrences",{required:{value:!0,message:U("Validation:fieldMinNumber",{attribute:U("dates"),min:1})}}))),n.createElement("div",{className:"manual-form-error"},null===(q=y.zoneRecurrences)||void 0===q?void 0:q.message))))};
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ import clsx from "clsx";
|
|
|
4
4
|
import { isToday, isTomorrow } from "date-fns";
|
|
5
5
|
import { DateTime } from "luxon";
|
|
6
6
|
import React from "react";
|
|
7
|
-
import { useTranslation } from "react-i18next
|
|
7
|
+
import { useTranslation } from "react-i18next";
|
|
8
8
|
import { DateTimeButtonProps } from "./DateTimeButton";
|
|
9
9
|
|
|
10
10
|
type DateContentProps = Pick<
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { useEffect } from "react";
|
|
2
|
+
import { DateTime } from "luxon";
|
|
2
3
|
import { Col, Form, Row } from "react-bootstrap";
|
|
3
4
|
import { useTranslation } from "react-i18next";
|
|
4
5
|
import { useFormContext } from "react-hook-form";
|
|
6
|
+
import { DATE_FORMAT, TIME_FORMAT } from "@licklist/core/dist/Config";
|
|
5
7
|
import { RecurringDatePickerInputValues } from "./RecurringDatePickerInput";
|
|
6
8
|
|
|
7
9
|
interface RecurrenceIntervalAndFrequencyInputProps {
|
|
@@ -25,9 +27,9 @@ function RecurrenceIntervalAndFrequencyInput({
|
|
|
25
27
|
|
|
26
28
|
const {
|
|
27
29
|
getValues,
|
|
28
|
-
setValue,
|
|
29
30
|
formState: { errors },
|
|
30
31
|
register,
|
|
32
|
+
trigger,
|
|
31
33
|
} = useFormContext<RecurringDatePickerInputValues>();
|
|
32
34
|
|
|
33
35
|
const startDate = getValues("startDate");
|
|
@@ -35,9 +37,22 @@ function RecurrenceIntervalAndFrequencyInput({
|
|
|
35
37
|
const startTime = getValues("startTime");
|
|
36
38
|
const endTime = getValues("endTime");
|
|
37
39
|
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (!startDate || !endDate) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
trigger(`endDate`);
|
|
45
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
46
|
+
}, [startDate]);
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
trigger("endTime");
|
|
50
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
51
|
+
}, [startTime]);
|
|
52
|
+
|
|
38
53
|
return (
|
|
39
54
|
<>
|
|
40
|
-
<Row
|
|
55
|
+
<Row>
|
|
41
56
|
<Col xs={12} sm={6}>
|
|
42
57
|
<Form.Group>
|
|
43
58
|
<Form.Label>{startDateLabel ?? t("Design:fromDate")}</Form.Label>
|
|
@@ -47,9 +62,6 @@ function RecurrenceIntervalAndFrequencyInput({
|
|
|
47
62
|
defaultValue={startDate}
|
|
48
63
|
className={startDate && "date-input-with-value"}
|
|
49
64
|
disabled={disabled}
|
|
50
|
-
onChange={({ target: { value } }) => {
|
|
51
|
-
setValue("startDate", value);
|
|
52
|
-
}}
|
|
53
65
|
min={minDate}
|
|
54
66
|
isInvalid={Boolean(errors.startDate)}
|
|
55
67
|
/>
|
|
@@ -64,13 +76,29 @@ function RecurrenceIntervalAndFrequencyInput({
|
|
|
64
76
|
<Form.Label>{endDateLabel ?? t("Design:toDate")}</Form.Label>
|
|
65
77
|
<Form.Control
|
|
66
78
|
type="date"
|
|
67
|
-
{...register("endDate", {
|
|
79
|
+
{...register("endDate", {
|
|
80
|
+
required: true,
|
|
81
|
+
validate: (date) => {
|
|
82
|
+
if (!startDate || !date) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
const currentStartDate = DateTime.fromFormat(
|
|
86
|
+
startDate,
|
|
87
|
+
DATE_FORMAT
|
|
88
|
+
);
|
|
89
|
+
const currentEndDate = DateTime.fromFormat(date, DATE_FORMAT);
|
|
90
|
+
return currentEndDate.diff(currentStartDate, ["days"]).days >=
|
|
91
|
+
0
|
|
92
|
+
? true
|
|
93
|
+
: `${t(`Validation:fieldLaterDate`, {
|
|
94
|
+
attribute: t("Design:endDateSmall"),
|
|
95
|
+
min: t("Design:startDateSmall"),
|
|
96
|
+
})}`;
|
|
97
|
+
},
|
|
98
|
+
})}
|
|
68
99
|
defaultValue={endDate}
|
|
69
100
|
className={endDate && "date-input-with-value"}
|
|
70
101
|
disabled={disabled}
|
|
71
|
-
onChange={({ target: { value } }) => {
|
|
72
|
-
setValue("endDate", value);
|
|
73
|
-
}}
|
|
74
102
|
min={startDate || undefined}
|
|
75
103
|
isInvalid={Boolean(errors.endDate)}
|
|
76
104
|
/>
|
|
@@ -103,12 +131,35 @@ function RecurrenceIntervalAndFrequencyInput({
|
|
|
103
131
|
<Form.Label>{endTimeLabel ?? t("Design:availableTo")}</Form.Label>
|
|
104
132
|
<Form.Control
|
|
105
133
|
type="time"
|
|
106
|
-
{...register("endTime", {
|
|
134
|
+
{...register("endTime", {
|
|
135
|
+
required: false,
|
|
136
|
+
validate: (time) => {
|
|
137
|
+
if (!startTime || !time) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
const currentStartTime = DateTime.fromFormat(
|
|
141
|
+
startTime,
|
|
142
|
+
TIME_FORMAT
|
|
143
|
+
);
|
|
144
|
+
const currentEndTime = DateTime.fromFormat(time, TIME_FORMAT);
|
|
145
|
+
|
|
146
|
+
return currentEndTime.diff(currentStartTime, ["minutes"])
|
|
147
|
+
.minutes > 0
|
|
148
|
+
? true
|
|
149
|
+
: `${t(`Validation:fieldLaterDate`, {
|
|
150
|
+
attribute: t("Design:endTimeSmall"),
|
|
151
|
+
min: t("Design:startTimeSmall"),
|
|
152
|
+
})}`;
|
|
153
|
+
},
|
|
154
|
+
})}
|
|
107
155
|
placeholder="hh:mm"
|
|
108
156
|
defaultValue={endTime}
|
|
109
157
|
disabled={disabled}
|
|
110
158
|
isInvalid={Boolean(errors.endTime)}
|
|
111
159
|
/>
|
|
160
|
+
<Form.Control.Feedback type="invalid">
|
|
161
|
+
{errors.endTime?.message}
|
|
162
|
+
</Form.Control.Feedback>
|
|
112
163
|
</Form.Group>
|
|
113
164
|
</Col>
|
|
114
165
|
</Row>
|
|
@@ -6,7 +6,7 @@ import React, {
|
|
|
6
6
|
} from "react";
|
|
7
7
|
import { useTranslation } from "react-i18next";
|
|
8
8
|
import { Form } from "react-bootstrap";
|
|
9
|
-
import { useForm } from "react-hook-form";
|
|
9
|
+
import { UseFormSetError, useForm } from "react-hook-form";
|
|
10
10
|
import { useId } from "@react-aria/utils";
|
|
11
11
|
import { WorkHour } from "@licklist/core/dist/DataMapper/Provider/WorkHourDataMapper";
|
|
12
12
|
import { calculateTimeWithOffset } from "@licklist/plugins/dist/utils/time";
|
|
@@ -15,12 +15,15 @@ import { getCheckboxesByWorkHours } from "../utils/dates";
|
|
|
15
15
|
export type AvailableTimesControlRef = {
|
|
16
16
|
trigger: () => Promise<boolean>;
|
|
17
17
|
getValues: () => { availableTimes: string[] };
|
|
18
|
+
setError: UseFormSetError<AvailableTimesForm>;
|
|
18
19
|
};
|
|
19
20
|
|
|
20
21
|
type AvailableTimesControlProps = {
|
|
21
22
|
isLoading: boolean;
|
|
22
23
|
workHours?: WorkHour[];
|
|
23
24
|
defaultValues?: string[];
|
|
25
|
+
startTime?: string;
|
|
26
|
+
endTime?: string;
|
|
24
27
|
};
|
|
25
28
|
|
|
26
29
|
type AvailableTimesForm = { availableTimes: string[] };
|
|
@@ -40,6 +43,7 @@ export const AvailableTimesControl = forwardRef<
|
|
|
40
43
|
getValues,
|
|
41
44
|
setValue,
|
|
42
45
|
watch,
|
|
46
|
+
setError,
|
|
43
47
|
} = useForm<AvailableTimesForm>({ mode: "onChange" });
|
|
44
48
|
|
|
45
49
|
const availableTimes = watch("availableTimes") || [];
|
|
@@ -53,6 +57,7 @@ export const AvailableTimesControl = forwardRef<
|
|
|
53
57
|
return {
|
|
54
58
|
trigger,
|
|
55
59
|
getValues,
|
|
60
|
+
setError,
|
|
56
61
|
};
|
|
57
62
|
});
|
|
58
63
|
|
|
@@ -11,6 +11,12 @@ import {
|
|
|
11
11
|
} from "@dnd-kit/sortable";
|
|
12
12
|
import { DndContext } from "@dnd-kit/core";
|
|
13
13
|
import { WorkHour } from "@licklist/core/dist/DataMapper/Provider/WorkHourDataMapper";
|
|
14
|
+
import { DateTime } from "luxon";
|
|
15
|
+
import { TIME_FORMAT } from "@licklist/core/dist/Config";
|
|
16
|
+
import {
|
|
17
|
+
calculateTimeWithOffset,
|
|
18
|
+
DIRECTION_TO_LOCAL,
|
|
19
|
+
} from "@licklist/plugins/dist/utils/time";
|
|
14
20
|
import { CONFIRM_MODAL_ACTIONS } from "../../../modals/confirmation/ConfirmModal";
|
|
15
21
|
import { Icon } from "../../../static";
|
|
16
22
|
import {
|
|
@@ -45,7 +51,6 @@ export const ZoneRecurrencesControl = ({
|
|
|
45
51
|
setValue,
|
|
46
52
|
clearErrors,
|
|
47
53
|
} = useFormContext<DateAndRecurrenceInputValues>();
|
|
48
|
-
|
|
49
54
|
const { fields, append, update, move } = useFieldArray({
|
|
50
55
|
name: "zoneRecurrences",
|
|
51
56
|
control,
|
|
@@ -81,18 +86,41 @@ export const ZoneRecurrencesControl = ({
|
|
|
81
86
|
|
|
82
87
|
const popoverId = useId()!;
|
|
83
88
|
|
|
84
|
-
const { t } = useTranslation("Design");
|
|
89
|
+
const { t } = useTranslation(["Design", "Validation"]);
|
|
85
90
|
|
|
86
91
|
// in this method we should fulfill the form with a proper data
|
|
87
92
|
const handleRecurringDateChange = async (
|
|
88
93
|
next: RecurringDatePickerInputValues
|
|
89
94
|
) => {
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
if (!
|
|
95
|
+
const isAvailableTimesFormValid =
|
|
96
|
+
await availableTimesFormRef.current?.trigger();
|
|
97
|
+
if (!isAvailableTimesFormValid) {
|
|
93
98
|
return;
|
|
94
99
|
}
|
|
100
|
+
const startTime = DateTime.fromFormat(next.startTime, TIME_FORMAT);
|
|
101
|
+
const endTime = DateTime.fromFormat(next.endTime, TIME_FORMAT);
|
|
102
|
+
const { availableTimes } = availableTimesFormRef.current.getValues();
|
|
103
|
+
const validAvalilableTimes = availableTimes.every((time) => {
|
|
104
|
+
const currentAvailableTime = DateTime.fromFormat(
|
|
105
|
+
calculateTimeWithOffset(time, DIRECTION_TO_LOCAL),
|
|
106
|
+
TIME_FORMAT
|
|
107
|
+
);
|
|
108
|
+
return (
|
|
109
|
+
currentAvailableTime.diff(startTime, "minutes").minutes >= 0 &&
|
|
110
|
+
currentAvailableTime.diff(endTime, "minutes").minutes <= 0
|
|
111
|
+
);
|
|
112
|
+
});
|
|
113
|
+
if (!validAvalilableTimes) {
|
|
114
|
+
availableTimesFormRef.current.setError("availableTimes", {
|
|
115
|
+
message: t("Validation:fieldTimeBetween", {
|
|
116
|
+
attribute: t("Design:startTimesSmall"),
|
|
117
|
+
min: next?.startTime,
|
|
118
|
+
max: next?.endTime,
|
|
119
|
+
}),
|
|
120
|
+
});
|
|
95
121
|
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
96
124
|
const values = {
|
|
97
125
|
rrule: next.rrule,
|
|
98
126
|
startDate: next.startDate,
|