@licklist/design 0.44.486-dev.66 → 0.44.486-dev.68

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 (26) hide show
  1. package/dist/product-set/control/DateAndRecurrenceInput.d.ts.map +1 -1
  2. package/dist/product-set/control/DateAndRecurrenceInput.js +1 -1
  3. package/dist/product-set/control/ProductSetRecurrenceControl.d.ts +2 -1
  4. package/dist/product-set/control/ProductSetRecurrenceControl.d.ts.map +1 -1
  5. package/dist/product-set/control/ProductSetRecurrenceControl.js +1 -1
  6. package/dist/product-set/form/ProductSetForm.d.ts.map +1 -1
  7. package/dist/product-set/form/ProductSetForm.js +1 -1
  8. package/dist/product-set/utils/index.d.ts +10 -0
  9. package/dist/product-set/utils/index.d.ts.map +1 -1
  10. package/dist/product-set/utils/index.js +1 -1
  11. package/dist/sales/booking/results/components/ResultCard.d.ts.map +1 -1
  12. package/dist/sales/booking/results/components/ResultCard.js +1 -1
  13. package/dist/styles/sales/BookingResults.scss +7 -7
  14. package/dist/zone/form/components/AvailableTimesControl.d.ts +2 -0
  15. package/dist/zone/form/components/AvailableTimesControl.d.ts.map +1 -1
  16. package/dist/zone/form/components/AvailableTimesControl.js +1 -1
  17. package/package.json +1 -1
  18. package/src/product-set/control/DateAndRecurrenceInput.tsx +13 -0
  19. package/src/product-set/control/ProductSetRecurrenceControl.tsx +6 -1
  20. package/src/product-set/form/ProductSetForm.stories.tsx +6 -2
  21. package/src/product-set/form/ProductSetForm.tsx +14 -3
  22. package/src/product-set/utils/index.ts +38 -0
  23. package/src/sales/booking/results/BookingResults.stories.tsx +12 -0
  24. package/src/sales/booking/results/components/ResultCard.tsx +5 -1
  25. package/src/styles/sales/BookingResults.scss +7 -7
  26. package/src/zone/form/components/AvailableTimesControl.tsx +89 -83
@@ -1 +1 @@
1
- {"version":3,"file":"DateAndRecurrenceInput.d.ts","sourceRoot":"","sources":["../../../src/product-set/control/DateAndRecurrenceInput.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAO1C,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uEAAuE,CAAC;AAuB7G,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;CACnD;AAED,UAAU,2BAA2B;IACnC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,4BAA4B,EAAE,OAAO,CAAC;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,sBAAsB,mFAKhC,2BAA2B,gBAiQ7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAC5C,WAAW,EACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBxB,CAAC"}
1
+ {"version":3,"file":"DateAndRecurrenceInput.d.ts","sourceRoot":"","sources":["../../../src/product-set/control/DateAndRecurrenceInput.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAO1C,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uEAAuE,CAAC;AAuB7G,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;CACnD;AAED,UAAU,2BAA2B;IACnC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,4BAA4B,EAAE,OAAO,CAAC;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,sBAAsB,mFAKhC,2BAA2B,gBA8Q7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAC5C,WAAW,EACX,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBxB,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"),a=require("react-bootstrap"),u=require("../../static/Icon.js"),o=require("react-hook-form"),s=require("@react-aria/utils"),l=require("react-use"),c=require("luxon");require("../../static/index.js");var d=require("@dnd-kit/core"),m=require("@dnd-kit/modifiers"),f=require("@dnd-kit/sortable"),v=require("../../modals/confirmation/ConfirmModal.js"),p=require("@licklist/core/dist/Config/Date"),g=require("../../recurring-date-picker-input/RecurringDatePickerInput.js"),T=require("./ProductSetRecurrenceControl.js"),b=require("../../zone/form/components/AvailableTimesControl.js"),_={name:"sameWidth",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var r=e.state,t={width:"".concat(r.rects.reference.width+4,"px"),marginLeft:"-2px",maxWidth:"unset"};Object.assign(r.styles.popper,t)},effect:function(e){var r=e.state,t=r.elements.reference.getBoundingClientRect().width,n={width:"".concat(t,"px"),maxWidth:"unset"};Object.assign(r.elements.popper.style,n)}};exports.DateAndRecurrenceInput=function(e){var x,E,h=e.isEventEditProductSet,q=e.providerHasBookingManagement,D=e.workHours,R=e.isLoading,S=o.useFormContext(),C=S.control,y=S.register,k=S.formState.errors,I=S.getValues,w=S.setValue,A=S.clearErrors,M=r.__read(t.useState([]),2),O=M[0],F=M[1],N=t.useRef(),j=o.useFieldArray({name:"menuRecurrences",control:C,keyName:"_id"}),P=j.fields,V=j.append,L=j.update,W=j.move,B=r.__read(t.useState(!1),2),H=B[0],z=B[1],G=r.__read(t.useState({index:null,values:null}),2),K=G[0],J=G[1],Q=function(){return J({index:null,values:null})},U=t.useRef();l.useClickAway(U,(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)||(z(!1),Q())}));var X=s.useId(),Y=i.useTranslation("Design").t,Z=function(){Q(),z((function(e){return!e}))};return t.useEffect((function(){P.length&&A("menuRecurrences")}),[P,A]),n.createElement(a.Form.Group,null,n.createElement(a.Form.Label,null,Y(h?"whenOverridesAvailable":"productSetAvailable")),n.createElement(a.OverlayTrigger,{show:H,overlay:n.createElement(a.Popover,{id:X,className:"rounded"},n.createElement(a.Popover.Content,{className:"shadow-lg rounded",ref:U},n.createElement(g.RecurringDatePickerInput,{defaultValues:K.values,onChange:function(e){return r.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,a,u,o,s;return r.__generator(this,(function(l){switch(l.label){case 0:return[4,null===(u=N.current)||void 0===u?void 0:u.trigger()];case 1:return l.sent()?!(null==e?void 0:e.startTime)||!(null==e?void 0:e.endTime)||(t=c.DateTime.fromISO(e.startTime),n=c.DateTime.fromISO(e.endTime),i=N.current.getValues().availableTimes,i.every((function(e){var r=c.DateTime.fromFormat(e,p.TIME_FORMAT);return r.diff(t,"minutes").minutes>=0&&r.diff(n,"minutes").minutes<=0})))?(a=r.__assign({rrule:e.rrule,startDate:e.startDate,endDate:e.endDate,startTime:e.startTime,endTime:e.endTime},N.current.getValues()),(null===(o=K.values)||void 0===o?void 0:o.id)&&(a.id=null===(s=K.values)||void 0===s?void 0:s.id),null!==K.index?L(K.index,a):V(a),z((function(){return!1})),Q(),[2]):(N.current.setError("availableTimes",{message:Y("Validation:fieldTimeBetween",{attribute:Y("Design:startTimesSmall"),min:t.toFormat(p.TIME_FORMAT),max:n.toFormat(p.TIME_FORMAT)})}),[2]):[2]}}))}))},onDelete:function(){var e=K.index;z(!1),Q(),setTimeout((function(){var r=I().menuRecurrences;w("menuRecurrences",(void 0===r?[]:r).filter((function(r,t){return t!==e})))}),100)}},q&&n.createElement(b.AvailableTimesControl,{workHours:D,isLoading:R,defaultValues:O,ref:N})))),trigger:"click",placement:"bottom",popperConfig:{modifiers:[_]}},n.createElement("div",{className:"product-set-recurrences"},n.createElement(d.DndContext,{onDragEnd:function(e){var r=e.over,t=e.active;if(r.id!==t.id){var n=P.findIndex((function(e){return String(e._id)===t.id})),i=P.findIndex((function(e){return String(e._id)===r.id}));W(n,i)}},modifiers:[m.restrictToVerticalAxis]},n.createElement(f.SortableContext,{items:null!==(x=null==P?void 0:P.map((function(e){return String(e._id)})))&&void 0!==x?x:[],strategy:f.verticalListSortingStrategy},P.map((function(e,r){return n.createElement(T.ProductSetRecurrenceControl,{key:e._id,menuRecurrence:e,onEdit:function(){return function(e,r){Q(),setTimeout((function(){J({index:r,values:e}),F(e.availableTimes||[]),z((function(){return!0}))}),100)}(e,r)}})})))),(!h||(null==P?void 0:P.length)<1)&&n.createElement("div",{className:"product-set-recurrence-icon-wrapper",role:"button",tabIndex:0,onClick:Z,onKeyDown:Z},n.createElement(u.default,{type:"plus-circle",height:"1rem",className:"product-set-recurrence-icon-add mr-2"}),Y("addDates")),n.createElement(a.Form.Control,r.__assign({type:"hidden"},y("menuRecurrences",{required:{value:!0,message:Y("Validation:fieldMinNumber",{attribute:Y("dates"),min:1})}}))),n.createElement("div",{className:"manual-form-error"},null===(E=k.menuRecurrences)||void 0===E?void 0:E.message))))},exports.sameWidthPopperModifier=_;
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"),a=require("react-bootstrap"),o=require("../../static/Icon.js"),u=require("react-hook-form"),l=require("@react-aria/utils"),s=require("react-use"),c=require("luxon");require("../../static/index.js");var d=require("@dnd-kit/core"),m=require("@dnd-kit/modifiers"),v=require("@dnd-kit/sortable"),f=require("../../modals/confirmation/ConfirmModal.js"),g=require("@licklist/core/dist/Config/Date"),p=require("../../recurring-date-picker-input/RecurringDatePickerInput.js"),T=require("./ProductSetRecurrenceControl.js"),b=require("../../zone/form/components/AvailableTimesControl.js"),x={name:"sameWidth",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var r=e.state,t={width:"".concat(r.rects.reference.width+4,"px"),marginLeft:"-2px",maxWidth:"unset"};Object.assign(r.styles.popper,t)},effect:function(e){var r=e.state,t=r.elements.reference.getBoundingClientRect().width,n={width:"".concat(t,"px"),maxWidth:"unset"};Object.assign(r.elements.popper.style,n)}};exports.DateAndRecurrenceInput=function(e){var E,_,R,h,q,D=e.isEventEditProductSet,S=e.providerHasBookingManagement,C=e.workHours,y=e.isLoading,k=u.useFormContext(),I=k.control,M=k.register,w=k.formState.errors,A=k.getValues,O=k.setValue,F=k.clearErrors,N=r.__read(t.useState([]),2),j=N[0],P=N[1],V=t.useRef(),L=u.useFieldArray({name:"menuRecurrences",control:I,keyName:"_id"}),W=L.fields,B=L.append,H=L.update,z=L.move,G=r.__read(t.useState(!1),2),K=G[0],J=G[1],Q=r.__read(t.useState({index:null,values:null}),2),U=Q[0],X=Q[1],Y=function(){return X({index:null,values:null})},Z=t.useRef();s.useClickAway(Z,(function(e){var r,t,n;f.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)||(J(!1),Y())}));var $=l.useId(),ee=i.useTranslation("Design").t,re=function(){Y(),J((function(e){return!e}))};return t.useEffect((function(){W.length&&F("menuRecurrences")}),[W,F]),n.createElement(a.Form.Group,null,n.createElement(a.Form.Label,null,ee(D?"whenOverridesAvailable":"productSetAvailable")),n.createElement(a.OverlayTrigger,{show:K,overlay:n.createElement(a.Popover,{id:$,className:"rounded"},n.createElement(a.Popover.Content,{className:"shadow-lg rounded",ref:Z},n.createElement(p.RecurringDatePickerInput,{defaultValues:U.values,onChange:function(e){return r.__awaiter(void 0,void 0,void 0,(function(){var t,n,i,a,o,u,l;return r.__generator(this,(function(s){switch(s.label){case 0:return[4,null===(o=V.current)||void 0===o?void 0:o.trigger()];case 1:return s.sent()?!(null==e?void 0:e.startTime)||!(null==e?void 0:e.endTime)||(t=c.DateTime.fromISO(e.startTime),n=c.DateTime.fromISO(e.endTime),i=V.current.getValues().availableTimes,i.every((function(e){var r=c.DateTime.fromFormat(e,g.TIME_FORMAT);return r.diff(t,"minutes").minutes>=0&&r.diff(n,"minutes").minutes<=0})))?(a=r.__assign({rrule:e.rrule,startDate:e.startDate,endDate:e.endDate,startTime:e.startTime,endTime:e.endTime},V.current.getValues()),(null===(u=U.values)||void 0===u?void 0:u.id)&&(a.id=null===(l=U.values)||void 0===l?void 0:l.id),null!==U.index?H(U.index,a):B(a),J((function(){return!1})),Y(),[2]):(V.current.setError("availableTimes",{message:ee("Validation:fieldTimeBetween",{attribute:ee("Design:startTimesSmall"),min:t.toFormat(g.TIME_FORMAT),max:n.toFormat(g.TIME_FORMAT)})}),[2]):[2]}}))}))},onDelete:function(){var e=U.index;J(!1),Y(),setTimeout((function(){var r=A().menuRecurrences;O("menuRecurrences",(void 0===r?[]:r).filter((function(r,t){return t!==e})))}),100)}},S&&n.createElement(b.AvailableTimesControl,{workHours:C,isLoading:y,defaultValues:j,ref:V,errorMessage:null===(R=null===(_=null===(E=null==w?void 0:w.menuRecurrences)||void 0===E?void 0:E["".concat(null==U?void 0:U.index)])||void 0===_?void 0:_.availableTimes)||void 0===R?void 0:R.message,clearErrorMessage:function(){return F("menuRecurrences.".concat(null==U?void 0:U.index,".availableTimes"))}})))),trigger:"click",placement:"bottom",popperConfig:{modifiers:[x]}},n.createElement("div",{className:"product-set-recurrences"},n.createElement(d.DndContext,{onDragEnd:function(e){var r=e.over,t=e.active;if(r.id!==t.id){var n=W.findIndex((function(e){return String(e._id)===t.id})),i=W.findIndex((function(e){return String(e._id)===r.id}));z(n,i)}},modifiers:[m.restrictToVerticalAxis]},n.createElement(v.SortableContext,{items:null!==(h=null==W?void 0:W.map((function(e){return String(e._id)})))&&void 0!==h?h:[],strategy:v.verticalListSortingStrategy},W.map((function(e,r){var t,i,a;return n.createElement(T.ProductSetRecurrenceControl,{key:e._id,menuRecurrence:e,onEdit:function(){return function(e,r){Y(),setTimeout((function(){X({index:r,values:e}),P(e.availableTimes||[]),J((function(){return!0}))}),100)}(e,r)},errorMessage:null===(a=null===(i=null===(t=null==w?void 0:w.menuRecurrences)||void 0===t?void 0:t["".concat(r)])||void 0===i?void 0:i.availableTimes)||void 0===a?void 0:a.message})})))),(!D||(null==W?void 0:W.length)<1)&&n.createElement("div",{className:"product-set-recurrence-icon-wrapper",role:"button",tabIndex:0,onClick:re,onKeyDown:re},n.createElement(o.default,{type:"plus-circle",height:"1rem",className:"product-set-recurrence-icon-add mr-2"}),ee("addDates")),n.createElement(a.Form.Control,r.__assign({type:"hidden"},M("menuRecurrences",{required:{value:!0,message:ee("Validation:fieldMinNumber",{attribute:ee("dates"),min:1})}}))),n.createElement("div",{className:"manual-form-error"},null===(q=w.menuRecurrences)||void 0===q?void 0:q.message))))},exports.sameWidthPopperModifier=x;
@@ -5,6 +5,7 @@ export interface ProductSetRecurrenceControlProps {
5
5
  _id: string;
6
6
  } & Partial<ProductSetRecurrence>;
7
7
  onEdit?: (onEdit: Partial<ProductSetRecurrence>) => void;
8
+ errorMessage?: string;
8
9
  }
9
- export declare const ProductSetRecurrenceControl: ({ menuRecurrence, onEdit, }: ProductSetRecurrenceControlProps) => JSX.Element;
10
+ export declare const ProductSetRecurrenceControl: ({ menuRecurrence, onEdit, errorMessage, }: ProductSetRecurrenceControlProps) => JSX.Element;
10
11
  //# sourceMappingURL=ProductSetRecurrenceControl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductSetRecurrenceControl.d.ts","sourceRoot":"","sources":["../../../src/product-set/control/ProductSetRecurrenceControl.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uEAAuE,CAAC;AAM7G,MAAM,WAAW,gCAAgC;IAC/C,cAAc,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;CAC1D;AAED,eAAO,MAAM,2BAA2B,gCAGrC,gCAAgC,gBAsElC,CAAC"}
1
+ {"version":3,"file":"ProductSetRecurrenceControl.d.ts","sourceRoot":"","sources":["../../../src/product-set/control/ProductSetRecurrenceControl.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uEAAuE,CAAC;AAM7G,MAAM,WAAW,gCAAgC;IAC/C,cAAc,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAC;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,2BAA2B,8CAIrC,gCAAgC,gBAyElC,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"),r=e(require("react")),n=require("react-i18next"),a=require("../../static/Icon.js");require("../../static/index.js");var i=require("@dnd-kit/sortable"),l=require("@dnd-kit/utilities"),c=e(require("rrule")),s=require("react-intl");exports.ProductSetRecurrenceControl=function(e){var u=e.menuRecurrence,o=e.onEdit,d=s.useIntl().formatDate,m=n.useTranslation("Design").t,f=i.useSortable({id:String(u._id)}),p=f.attributes,x=f.listeners,b=f.setNodeRef,g=f.transform,E=f.transition;return r.createElement("div",t.__assign({className:"sortable-tree-root",style:{transform:l.CSS.Translate.toString(g),transition:E}},p,x,{ref:b,role:"button",tabIndex:0}),r.createElement("div",{key:u.rrule,className:"product-set-recurrence d-flex flex-column mr-0 mb-3 p-3 px-4 flex-grow-1"},r.createElement("span",{className:"d-flex flex-row align-items-center"},r.createElement(a.default,{type:"calendar",height:"1rem",className:"product-set-recurrence-icon-calendar"}),r.createElement("span",{className:"product-set-recurrence-title d-flex flex-grow-1"},m("from")," ",d(u.startDate,{dateStyle:"medium"})," ",u.endDate&&r.createElement(r.Fragment,null,"- ",d(u.endDate,{dateStyle:"medium"}))),r.createElement("div",{className:"d-inline-flex",role:"button",tabIndex:0,onClick:function(){return o(u)},onKeyDown:function(){return o(u)}},r.createElement(a.default,{type:"ellipsis-h",height:"1rem",className:"product-set-recurrence-icon-more"}))),r.createElement("span",{className:"product-set-recurrence-description"},function(e){return c.fromString(e.rrule).toText()}(u))))};
1
+ "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var r=require("tslib"),t=e(require("react")),n=require("react-i18next"),a=require("../../static/Icon.js");require("../../static/index.js");var l=require("@dnd-kit/sortable"),c=require("@dnd-kit/utilities"),i=e(require("rrule")),s=require("react-intl");exports.ProductSetRecurrenceControl=function(e){var o=e.menuRecurrence,u=e.onEdit,d=e.errorMessage,m=s.useIntl().formatDate,f=n.useTranslation("Design").t,p=l.useSortable({id:String(o._id)}),x=p.attributes,b=p.listeners,g=p.setNodeRef,E=p.transform,N=p.transition;return t.createElement("div",r.__assign({className:"sortable-tree-root flex-column",style:{transform:c.CSS.Translate.toString(E),transition:N}},x,b,{ref:g,role:"button",tabIndex:0}),t.createElement("div",{key:o.rrule,className:"product-set-recurrence d-flex flex-column mr-0 mb-3 p-3 px-4 flex-grow-1"},t.createElement("span",{className:"d-flex flex-row align-items-center"},t.createElement(a.default,{type:"calendar",height:"1rem",className:"product-set-recurrence-icon-calendar"}),t.createElement("span",{className:"product-set-recurrence-title d-flex flex-grow-1"},f("from")," ",m(o.startDate,{dateStyle:"medium"})," ",o.endDate&&t.createElement(t.Fragment,null,"- ",m(o.endDate,{dateStyle:"medium"}))),t.createElement("div",{className:"d-inline-flex",role:"button",tabIndex:0,onClick:function(){return u(o)},onKeyDown:function(){return u(o)}},t.createElement(a.default,{type:"ellipsis-h",height:"1rem",className:"product-set-recurrence-icon-more"}))),t.createElement("span",{className:"product-set-recurrence-description"},function(e){return i.fromString(e.rrule).toText()}(o))),t.createElement("div",{className:"manual-form-error ".concat(!d&&"d-none")},d))};
@@ -1 +1 @@
1
- {"version":3,"file":"ProductSetForm.d.ts","sourceRoot":"","sources":["../../../src/product-set/form/ProductSetForm.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAI1F,OAAO,EAAE,WAAW,EAAE,MAAM,8DAA8D,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAK5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oFAAoF,CAAC;AACtI,OAAO,EAAE,IAAI,EAAE,MAAM,wDAAwD,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAEtF,OAAO,EAEL,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAG5D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB;AACD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;CACZ;AACD,MAAM,WAAW,oBACf,SAAQ,UAAU,EAChB,MAAM,EACN,uBAAuB;IACzB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,mBACf,SAAQ,aAAa,EACnB,uBAAuB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,mBAAmB,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC5D,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC5D,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,4BAA4B,CAAC,EAAE,gCAAgC,CAAC,sBAAsB,CAAC,CAAC;IACxF,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,EAC7B,WAAW,EACX,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,cAAsB,EACtB,YAAiB,EACjB,4BAA4B,EAC5B,KAAK,EACL,cAAc,EACd,SAAS,EACT,GAAG,MAAM,EACV,EAAE,mBAAmB,eA0HrB"}
1
+ {"version":3,"file":"ProductSetForm.d.ts","sourceRoot":"","sources":["../../../src/product-set/form/ProductSetForm.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,8DAA8D,CAAC;AAI1F,OAAO,EAAE,WAAW,EAAE,MAAM,8DAA8D,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAK5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,oFAAoF,CAAC;AACtI,OAAO,EAAE,IAAI,EAAE,MAAM,wDAAwD,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAEtF,OAAO,EAEL,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAG5D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;CACpB;AACD,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;CACZ;AACD,MAAM,WAAW,oBACf,SAAQ,UAAU,EAChB,MAAM,EACN,uBAAuB;IACzB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,mBACf,SAAQ,aAAa,EACnB,uBAAuB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,mBAAmB,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC5D,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC5D,gBAAgB,CAAC,EAAE,UAAU,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,4BAA4B,CAAC,EAAE,gCAAgC,CAAC,sBAAsB,CAAC,CAAC;IACxF,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,wBAAgB,cAAc,CAAC,EAC7B,WAAW,EACX,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,cAAsB,EACtB,YAAiB,EACjB,4BAA4B,EAC5B,KAAK,EACL,cAAc,EACd,SAAS,EACT,GAAG,MAAM,EACV,EAAE,mBAAmB,eAqIrB"}
@@ -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"),o=require("react"),r=e(o),n=require("react-i18next"),a=require("react-bootstrap"),i=require("react-hook-form"),s=e(require("@licklist/plugins/dist/services/Form/FormErrorService")),l=require("lodash"),d=require("../../modals/dialog/Dialog.js"),u=require("../../modals/dialog/DialogContext.js"),m=require("./context.js"),c=require("../utils/index.js"),p=require("../control/ProductSetControl.js");exports.ProductSetForm=function(e){var v=e.companyName,g=e.isLoading,E=e.defaultValues,f=e.onSubmitAndRedirect,w=e.onSubmitNoRedirect,S=e.productGroupList,b=e.serverErrors,C=e.providerHasMap,h=void 0!==C&&C,q=e.venueMapSets,T=void 0===q?[]:q,k=e.providerHasBookingManagement,D=e.zones,L=e.isCreateAction,M=e.workHours,x=t.__rest(e,["companyName","isLoading","defaultValues","onSubmitAndRedirect","onSubmitNoRedirect","productGroupList","serverErrors","providerHasMap","venueMapSets","providerHasBookingManagement","zones","isCreateAction","workHours"]),H=n.useTranslation("Design").t,P=u.useDialogContext(),A=P.isShownDialog,F=P.onBeforeUnload,N=P.onPopState,B=P.onApproveDialog,_=P.onDeclineDialog,j=i.useForm({defaultValues:E,mode:"onChange"}),y=j.setError,R=j.reset,z=j.watch();return o.useEffect((function(){E&&!l.isEqual(E,z)&&R(E)}),[E]),o.useEffect((function(){b&&s.handleServerErrors(b,y)}),[b,y]),o.useEffect((function(){return window.history.pushState(null,"",window.location.pathname),window.addEventListener("beforeunload",F),window.addEventListener("popstate",N),function(){window.removeEventListener("beforeunload",F),window.removeEventListener("popstate",N)}}),[]),r.createElement(m.ProductSetContextProvider,{productGroupList:S,providerHasMap:h,venueMapSets:T,providerHasBookingManagement:k,zones:D},r.createElement(d.Dialog,{isActive:A,title:H("Design:leavePage"),content:H("Design:changesNotBeSaved"),onApprove:B,onDecline:_}),r.createElement(i.FormProvider,t.__assign({},j),r.createElement(a.Form,{onSubmit:j.handleSubmit(f)},r.createElement(m.ProductSetLoadingContext.Consumer,null,(function(e){var o=e.isLoading;return r.createElement(r.Fragment,null,r.createElement(p.ProductSetControl,t.__assign({},x,{smsTemplates:c.getFilteredTemplates(null==x?void 0:x.smsTemplates,null==z?void 0:z.smsTemplates),emailTemplates:c.getFilteredTemplates(null==x?void 0:x.emailTemplates,null==z?void 0:z.emailTemplates),showEmailTemplate:!!(null==x?void 0:x.emailTemplates),showSmsTemplate:!!(null==x?void 0:x.smsTemplates),isLoading:g,isCreateAction:L,companyName:v,workHours:M,providerHasBookingManagement:k})),r.createElement(a.Row,null,r.createElement(a.Col,{md:6,sm:12}),r.createElement(a.Col,{className:"product-set-save-btn-wrapper p-0 pl-4 d-flex mw-100",md:6,sm:12},w&&r.createElement(a.Button,{className:"product-set-save-btn mt-5 ml-5 d-no dne d-md-block",onClick:j.handleSubmit(w),disabled:g||o||!z.name},H("save")),r.createElement(a.Button,{className:"product-set-save-btn mt-5 ml-5 d-no dne d-md-block",type:"submit",disabled:g||o||!z.name},H("saveAndClose")))))})))))};
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"),o=require("react"),r=e(o),n=require("react-i18next"),a=require("react-bootstrap"),i=require("react-hook-form"),s=e(require("@licklist/plugins/dist/services/Form/FormErrorService")),l=require("lodash"),u=require("../../modals/dialog/Dialog.js"),d=require("../../modals/dialog/DialogContext.js"),m=require("./context.js"),c=require("../utils/index.js"),p=require("../control/ProductSetControl.js");exports.ProductSetForm=function(e){var v=e.companyName,g=e.isLoading,E=e.defaultValues,f=e.onSubmitAndRedirect,b=e.onSubmitNoRedirect,w=e.productGroupList,S=e.serverErrors,h=e.providerHasMap,C=void 0!==h&&h,T=e.venueMapSets,k=void 0===T?[]:T,q=e.providerHasBookingManagement,D=e.zones,L=e.isCreateAction,M=e.workHours,x=t.__rest(e,["companyName","isLoading","defaultValues","onSubmitAndRedirect","onSubmitNoRedirect","productGroupList","serverErrors","providerHasMap","venueMapSets","providerHasBookingManagement","zones","isCreateAction","workHours"]),A=n.useTranslation("Design").t,H=d.useDialogContext(),P=H.isShownDialog,F=H.onBeforeUnload,N=H.onPopState,B=H.onApproveDialog,_=H.onDeclineDialog,j=i.useForm({defaultValues:E,mode:"onChange"}),y=j.setError,R=j.reset,z=j.watch(),G=function(e){return function(t){c.checkAvailableTimesErrors({values:t,setError:y,t:A})||e(t)}};return o.useEffect((function(){E&&!l.isEqual(E,z)&&R(E)}),[E]),o.useEffect((function(){S&&s.handleServerErrors(S,y)}),[S,y]),o.useEffect((function(){return window.history.pushState(null,"",window.location.pathname),window.addEventListener("beforeunload",F),window.addEventListener("popstate",N),function(){window.removeEventListener("beforeunload",F),window.removeEventListener("popstate",N)}}),[]),r.createElement(m.ProductSetContextProvider,{productGroupList:w,providerHasMap:C,venueMapSets:k,providerHasBookingManagement:q,zones:D},r.createElement(u.Dialog,{isActive:P,title:A("Design:leavePage"),content:A("Design:changesNotBeSaved"),onApprove:B,onDecline:_}),r.createElement(i.FormProvider,t.__assign({},j),r.createElement(a.Form,{onSubmit:j.handleSubmit(G(f))},r.createElement(m.ProductSetLoadingContext.Consumer,null,(function(e){var o=e.isLoading;return r.createElement(r.Fragment,null,r.createElement(p.ProductSetControl,t.__assign({},x,{smsTemplates:c.getFilteredTemplates(null==x?void 0:x.smsTemplates,null==z?void 0:z.smsTemplates),emailTemplates:c.getFilteredTemplates(null==x?void 0:x.emailTemplates,null==z?void 0:z.emailTemplates),showEmailTemplate:!!(null==x?void 0:x.emailTemplates),showSmsTemplate:!!(null==x?void 0:x.smsTemplates),isLoading:g,isCreateAction:L,companyName:v,workHours:M,providerHasBookingManagement:q})),r.createElement(a.Row,null,r.createElement(a.Col,{md:6,sm:12}),r.createElement(a.Col,{className:"product-set-save-btn-wrapper p-0 pl-4 d-flex mw-100",md:6,sm:12},b&&r.createElement(a.Button,{className:"product-set-save-btn mt-5 ml-5 d-no dne d-md-block",onClick:j.handleSubmit(G(b)),disabled:g||o||!z.name},A("save")),r.createElement(a.Button,{className:"product-set-save-btn mt-5 ml-5 d-no dne d-md-block",type:"submit",disabled:g||o||!z.name},A("saveAndClose")))))})))))};
@@ -1,9 +1,19 @@
1
1
  import { EmailTemplate } from "@licklist/core/dist/DataMapper/Notification/EmailTemplateDataMapper";
2
2
  import { SmsTemplate } from "@licklist/core/dist/DataMapper/Notification/SmsTemplateDataMapper";
3
+ import { TFunction } from "i18next";
4
+ import { UseFormSetError } from "react-hook-form";
3
5
  import { TemplateItem } from "../control/ProductSetControl";
6
+ import { ProductSetFormValues } from "../form/ProductSetForm";
7
+ interface CheckAvailableTimesErrors {
8
+ values: ProductSetFormValues;
9
+ setError: UseFormSetError<ProductSetFormValues>;
10
+ t: TFunction;
11
+ }
4
12
  export declare const moveArrayElements: <T>(array: T[], prevIndex: number, nextIndex: number) => T[];
5
13
  export declare const sortArrayByIndex: <T>(array: T[]) => (T & {
6
14
  sort: number;
7
15
  })[];
8
16
  export declare const getFilteredTemplates: (templates?: EmailTemplate[] | SmsTemplate[], formTemplates?: TemplateItem[]) => TemplateItem[] | undefined;
17
+ export declare const checkAvailableTimesErrors: ({ values, setError, t, }: CheckAvailableTimesErrors) => boolean;
18
+ export {};
9
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/product-set/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAC;AACpG,OAAO,EAAE,WAAW,EAAE,MAAM,mEAAmE,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,eAAO,MAAM,iBAAiB,6BAEjB,MAAM,aACN,MAAM,QAQlB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;IAE5B,CAAC;AAEF,eAAO,MAAM,oBAAoB,eACnB,aAAa,EAAE,GAAG,WAAW,EAAE,kBAC3B,YAAY,EAAE,KAC7B,YAAY,EAAE,GAAG,SAmBnB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/product-set/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qEAAqE,CAAC;AACpG,OAAO,EAAE,WAAW,EAAE,MAAM,mEAAmE,CAAC;AAChG,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,UAAU,yBAAyB;IACjC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,QAAQ,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAChD,CAAC,EAAE,SAAS,CAAC;CACd;AAED,eAAO,MAAM,iBAAiB,6BAEjB,MAAM,aACN,MAAM,QAQlB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;IAE5B,CAAC;AAEF,eAAO,MAAM,oBAAoB,eACnB,aAAa,EAAE,GAAG,WAAW,EAAE,kBAC3B,YAAY,EAAE,KAC7B,YAAY,EAAE,GAAG,SAmBnB,CAAC;AAEF,eAAO,MAAM,yBAAyB,6BAInC,yBAAyB,YAuB3B,CAAC"}
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var i=require("tslib");exports.getFilteredTemplates=function(i,e){var n;if(i)return null===(n=null==i?void 0:i.filter((function(i){return i.notification.isActive&&!(null==e?void 0:e.find((function(e){return e.value.notification.type===i.notification.type})))})))||void 0===n?void 0:n.map((function(i){var e;return{id:null==i?void 0:i.id,value:i,label:null===(e=null==i?void 0:i.notification)||void 0===e?void 0:e.name}}))},exports.moveArrayElements=function(e,n,t){var r=i.__spreadArray([],i.__read(e),!1);return r.splice(t,0,r.splice(n,1)[0]),r},exports.sortArrayByIndex=function(e){return e.map((function(e,n){return i.__assign(i.__assign({},e),{sort:n})}))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("tslib");exports.checkAvailableTimesErrors=function(e){var i,n,r=e.values,t=e.setError,o=e.t,l=!1;return(null===(i=null==r?void 0:r.steps)||void 0===i?void 0:i.some((function(e){return!!(null==e?void 0:e.productCategories.some((function(e){return!!(null==e?void 0:e.zoneId)})))})))?(null===(n=null==r?void 0:r.menuRecurrences)||void 0===n||n.forEach((function(e,i){var n;(null===(n=null==e?void 0:e.availableTimes)||void 0===n?void 0:n.length)||(l=!0,t("menuRecurrences.".concat(i,".availableTimes"),{type:"validate",message:o("Validation:fieldMinNumber",{attribute:o("startTimes"),min:1})}))})),l):l},exports.getFilteredTemplates=function(e,i){var n;if(e)return null===(n=null==e?void 0:e.filter((function(e){return e.notification.isActive&&!(null==i?void 0:i.find((function(i){return i.value.notification.type===e.notification.type})))})))||void 0===n?void 0:n.map((function(e){var i;return{id:null==e?void 0:e.id,value:e,label:null===(i=null==e?void 0:e.notification)||void 0===i?void 0:i.name}}))},exports.moveArrayElements=function(i,n,r){var t=e.__spreadArray([],e.__read(i),!1);return t.splice(r,0,t.splice(n,1)[0]),t},exports.sortArrayByIndex=function(i){return i.map((function(i,n){return e.__assign(e.__assign({},i),{sort:n})}))};
@@ -1 +1 @@
1
- {"version":3,"file":"ResultCard.d.ts","sourceRoot":"","sources":["../../../../../src/sales/booking/results/components/ResultCard.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,sDAAsD,CAAC;AAK7E,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAIF,eAAO,MAAM,UAAU,uCAIpB,eAAe,gBAmDjB,CAAC"}
1
+ {"version":3,"file":"ResultCard.d.ts","sourceRoot":"","sources":["../../../../../src/sales/booking/results/components/ResultCard.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,sDAAsD,CAAC;AAM7E,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC,CAAC;AAIF,eAAO,MAAM,UAAU,uCAIpB,eAAe,gBAsDjB,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=e(require("react")),r=require("@licklist/core/dist/Config"),l=require("react-i18next"),a=require("../../../../static/Icon.js"),n=e(require("clsx")),i=require("luxon"),s=require("@licklist/plugins/dist/utils/formatDate");exports.ResultCard=function(e){var c,u,o,m=e.order,d=e.className,p=e.onCardClick,E=l.useTranslation("Design").t,f=m.id,v=m.people,N=m.user,q=m.status,D=m.startDate,x=(null===(c=m.products.map((function(e){return e.name})))||void 0===c?void 0:c.join(", "))||"",g=function(){p&&p(f)};return t.createElement("div",{className:n("result-card",d),onClick:g,onKeyUp:g,role:"button",tabIndex:0},t.createElement("div",{className:"card-content"},t.createElement("div",{className:"order-id"},f),t.createElement("div",{className:"order-people"},t.createElement(a.default,{type:"user",width:"10",height:"11"}),v),t.createElement("div",{className:"order-description"},t.createElement("p",{className:"name"},N.firstName," ",N.lastName),N.email&&t.createElement("p",null,N.email),(null===(u=N.userDetail)||void 0===u?void 0:u.phone)&&t.createElement("p",null,null===(o=N.userDetail)||void 0===o?void 0:o.phone),t.createElement("p",null,"------"),t.createElement("p",null,E("activity"),": "),t.createElement("p",null,E("staff"),": "),t.createElement("p",null,E("status"),": ",E(q)),t.createElement("p",null,E("date"),": ",s.formatDateStringForEvent(D,!1)),t.createElement("p",null,E("time"),": ",i.DateTime.fromISO(D).toFormat(r.TIME_FORMAT)),t.createElement("p",{className:"products",title:x},E("products"),": ",x))))};
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=e(require("react")),r=require("@licklist/core/dist/Config"),l=require("react-i18next"),a=require("../../../../static/Icon.js"),i=e(require("clsx")),n=require("luxon"),s=require("@licklist/plugins/dist/utils/formatDate"),c=require("@licklist/plugins/dist/utils/sourceTitle");exports.ResultCard=function(e){var u,o,m,d=e.order,p=e.className,E=e.onCardClick,f=l.useTranslation("Design").t,v=d.id,N=d.people,q=d.user,g=d.status,D=d.startDate,x=d.products,T=d.source,h=(null===(u=x.map((function(e){return e.name})))||void 0===u?void 0:u.join(", "))||"",k=function(){E&&E(v)};return t.createElement("div",{className:i("result-card",p),onClick:k,onKeyUp:k,role:"button",tabIndex:0},t.createElement("div",{className:"card-content"},t.createElement("div",{className:"order-id"},v),t.createElement("div",{className:"order-people"},t.createElement(a.default,{type:"user",width:"10",height:"11"}),N),t.createElement("div",{className:"order-description"},t.createElement("p",{className:"name"},q.firstName," ",q.lastName),q.email&&t.createElement("p",null,q.email),(null===(o=q.userDetail)||void 0===o?void 0:o.phone)&&t.createElement("p",null,null===(m=q.userDetail)||void 0===m?void 0:m.phone),t.createElement("p",null,"------"),t.createElement("p",null,f("activity"),": "),t.createElement("p",null,f("staff"),": "),t.createElement("p",null,f("status"),": ",f(g)),t.createElement("p",null,f("date"),": ",s.formatDateStringForEvent(D,!1)),t.createElement("p",null,f("time"),": ",n.DateTime.fromISO(D).toFormat(r.TIME_FORMAT)),t.createElement("p",{className:"products",title:h},f("products"),": ",h),t.createElement("p",null,f("source"),": ",f(c.getOrderSourceTitle(T))))))};
@@ -5,14 +5,14 @@
5
5
  flex-wrap: wrap;
6
6
 
7
7
  .result-card {
8
- height: 12.125rem;
8
+ height: 12.825rem;
9
9
  border: 1px solid $gray-400;
10
10
  max-width: calc(50% - 0.75rem);
11
11
  flex: 0 0 calc(50% - 0.75rem);
12
12
  transition: ease-in 0.25s;
13
13
  border-radius: 0.25rem;
14
14
  box-shadow: 0px 0px 0.125rem 0px rgb(0 0 0 / 20%);
15
-
15
+
16
16
  .card-content {
17
17
  width: 100%;
18
18
  height: 100%;
@@ -28,7 +28,7 @@
28
28
  position: absolute;
29
29
  left: 0.5rem;
30
30
  top: 0.125rem;
31
- font-weight: 600;
31
+ font-weight: 600;
32
32
  }
33
33
 
34
34
  .order-people {
@@ -43,7 +43,7 @@
43
43
  height: 1.75rem;
44
44
  font-size: 0.625rem;
45
45
  line-height: 0.625rem;
46
- color: #6D6D6D;
46
+ color: #6d6d6d;
47
47
  font-weight: 600;
48
48
 
49
49
  svg {
@@ -64,7 +64,7 @@
64
64
  }
65
65
 
66
66
  .products {
67
- display: inline-block;
67
+ display: block;
68
68
  width: 80%;
69
69
  white-space: nowrap;
70
70
  overflow: hidden;
@@ -74,7 +74,7 @@
74
74
 
75
75
  &:hover {
76
76
  box-shadow: 0px 0px 0.5rem 0px rgb(0 0 0 / 20%);
77
- cursor: pointer;
77
+ cursor: pointer;
78
78
  }
79
79
  }
80
80
 
@@ -93,4 +93,4 @@
93
93
  }
94
94
  }
95
95
  }
96
- }
96
+ }
@@ -14,6 +14,8 @@ type AvailableTimesControlProps = {
14
14
  defaultValues?: string[];
15
15
  startTime?: string;
16
16
  endTime?: string;
17
+ errorMessage?: string;
18
+ clearErrorMessage: () => void;
17
19
  };
18
20
  type AvailableTimesForm = {
19
21
  availableTimes: string[];
@@ -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;AAGf,OAAO,EAAE,eAAe,EAAW,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4DAA4D,CAAC;AAGtF,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,6GA0FhC,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;AAGtF,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;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B,CAAC;AAEF,KAAK,kBAAkB,GAAG;IAAE,cAAc,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEvD,eAAO,MAAM,qBAAqB,6GA8FjC,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"),n=require("react-hook-form"),s=require("@react-aria/utils"),o=require("../utils/dates.js"),u=t.forwardRef((function(e,u){var c,m=e.isLoading,d=e.workHours,f=e.defaultValues,b=void 0===f?[]:f,v=s.useId(),g=i.useTranslation(["Design","Validation"]).t,p=n.useForm({mode:"onChange"}),h=p.register,E=p.formState.errors,k=p.reset,T=p.trigger,_=p.getValues,q=p.setValue,y=p.watch,C=p.setError,F=y("availableTimes")||[],V=t.useMemo((function(){return o.getCheckboxesByWorkHours(d)}),[d]);t.useImperativeHandle(u,(function(){return{trigger:T,getValues:_,setError:C}}));return t.useEffect((function(){b&&k({availableTimes:b})}),[b]),a.createElement(l.Form.Group,{controlId:v},a.createElement(l.Form.Label,null,g("Design:startTimes")),a.createElement("div",{className:"zone-available-times"},V.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:F.includes(e),onChange:function(){return function(e){F.includes(e)?q("availableTimes",F.filter((function(r){return r!==e}))):q("availableTimes",r.__spreadArray(r.__spreadArray([],r.__read(F),!1),[e],!1))}(e)},disabled:m}),a.createElement(l.Form.Check.Label,null,e))}))),a.createElement(l.Form.Control,r.__assign({type:"hidden"},h("availableTimes",{required:{value:!0,message:g("Validation:fieldMinNumber",{attribute:g("startTimes"),min:1})}}))),a.createElement("div",{className:"manual-form-error"},null===(c=E.availableTimes)||void 0===c?void 0:c.message))}));exports.AvailableTimesControl=u;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,r=require("tslib"),a=require("react"),t=(e=a)&&"object"==typeof e&&"default"in e?e.default:e,i=require("react-i18next"),o=require("react-bootstrap"),s=require("react-hook-form"),n=require("@react-aria/utils"),l=require("../utils/dates.js"),u=a.forwardRef((function(e,u){var c,m=e.isLoading,d=e.workHours,f=e.defaultValues,v=void 0===f?[]:f,g=e.errorMessage,b=e.clearErrorMessage,p=n.useId(),E=i.useTranslation(["Design","Validation"]).t,h=s.useForm({mode:"onChange"}),k=h.register,_=h.formState.errors,y=h.reset,C=h.trigger,T=h.getValues,q=h.setValue,F=h.watch,x=h.setError,V=F("availableTimes")||[],I=a.useMemo((function(){return l.getCheckboxesByWorkHours(d)}),[d]);a.useImperativeHandle(u,(function(){return{trigger:C,getValues:T,setError:x}}));return a.useEffect((function(){v&&y({availableTimes:v})}),[v]),t.createElement(o.Form.Group,{controlId:p},t.createElement(o.Form.Label,null,E("Design:startTimes")),t.createElement("div",{className:"zone-available-times"},I.map((function(e){return t.createElement(o.Form.Check,{key:e,inline:!0,custom:!0,id:e},t.createElement(o.Form.Check.Input,{type:"checkbox",value:e,checked:V.includes(e),onChange:function(){return function(e){var a=V.includes(e);g&&b(),q("availableTimes",a?V.filter((function(r){return r!==e})):r.__spreadArray(r.__spreadArray([],r.__read(V),!1),[e],!1))}(e)},disabled:m}),t.createElement(o.Form.Check.Label,null,e))}))),t.createElement(o.Form.Control,r.__assign({type:"hidden"},k("availableTimes"))),t.createElement("div",{className:"manual-form-error"},(null===(c=_.availableTimes)||void 0===c?void 0:c.message)||g))}));exports.AvailableTimesControl=u;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@licklist/design",
3
- "version": "0.44.486-dev.66",
3
+ "version": "0.44.486-dev.68",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+ssh://git@bitbucket.org/artelogicsoft/licklist_design.git"
@@ -234,6 +234,15 @@ export const DateAndRecurrenceInput = ({
234
234
  isLoading={isLoading}
235
235
  defaultValues={availableTimes}
236
236
  ref={availableTimesFormRef}
237
+ errorMessage={
238
+ errors?.menuRecurrences?.[`${editState?.index}`]
239
+ ?.availableTimes?.message
240
+ }
241
+ clearErrorMessage={() =>
242
+ clearErrors(
243
+ `menuRecurrences.${editState?.index}.availableTimes`
244
+ )
245
+ }
237
246
  />
238
247
  )}
239
248
  </RecurringDatePickerInput>
@@ -261,6 +270,10 @@ export const DateAndRecurrenceInput = ({
261
270
  key={menuRecurrence._id}
262
271
  menuRecurrence={menuRecurrence}
263
272
  onEdit={() => handleOnEdit(menuRecurrence, index)}
273
+ errorMessage={
274
+ errors?.menuRecurrences?.[`${index}`]?.availableTimes
275
+ ?.message
276
+ }
264
277
  />
265
278
  ))}
266
279
  </SortableContext>
@@ -11,11 +11,13 @@ import { Icon } from "../../static";
11
11
  export interface ProductSetRecurrenceControlProps {
12
12
  menuRecurrence?: { _id: string } & Partial<ProductSetRecurrence>;
13
13
  onEdit?: (onEdit: Partial<ProductSetRecurrence>) => void;
14
+ errorMessage?: string;
14
15
  }
15
16
 
16
17
  export const ProductSetRecurrenceControl = ({
17
18
  menuRecurrence,
18
19
  onEdit,
20
+ errorMessage,
19
21
  }: ProductSetRecurrenceControlProps) => {
20
22
  const { formatDate } = useIntl();
21
23
  const { t } = useTranslation("Design");
@@ -30,7 +32,7 @@ export const ProductSetRecurrenceControl = ({
30
32
 
31
33
  return (
32
34
  <div
33
- className="sortable-tree-root"
35
+ className="sortable-tree-root flex-column"
34
36
  style={{
35
37
  transform: CSS.Translate.toString(transform),
36
38
  transition,
@@ -84,6 +86,9 @@ export const ProductSetRecurrenceControl = ({
84
86
  {getHumanReadableDate(menuRecurrence)}
85
87
  </span>
86
88
  </div>
89
+ <div className={`manual-form-error ${!errorMessage && "d-none"}`}>
90
+ {errorMessage}
91
+ </div>
87
92
  </div>
88
93
  );
89
94
  };
@@ -23,13 +23,17 @@ export default {
23
23
  export const Default: Story<ProductSetFormProps> = (args) => {
24
24
  const providerHasMap = boolean("providerHasMap", true);
25
25
 
26
- return <ProductSetForm {...args} providerHasMap={providerHasMap} />;
26
+ return (
27
+ <ProductSetForm {...args} providerHasMap={providerHasMap} isCreateAction />
28
+ );
27
29
  };
28
30
 
29
31
  export const Empty: Story<ProductSetFormProps> = (args) => {
30
32
  const providerHasMap = boolean("providerHasMap", true);
31
33
 
32
- return <ProductSetForm {...args} providerHasMap={providerHasMap} />;
34
+ return (
35
+ <ProductSetForm {...args} providerHasMap={providerHasMap} isCreateAction />
36
+ );
33
37
  };
34
38
 
35
39
  export const Valid: Story<ProductSetFormProps> = (args) => {
@@ -21,7 +21,7 @@ import {
21
21
  import { Step } from "../types";
22
22
  import { ProductSetContextProvider, ProductSetLoadingContext } from "./context";
23
23
  import { SelectItem } from "../../types/generic/SelectItem";
24
- import { getFilteredTemplates } from "../utils";
24
+ import { checkAvailableTimesErrors, getFilteredTemplates } from "../utils";
25
25
 
26
26
  export interface WithIsLoading {
27
27
  isLoading: boolean;
@@ -86,6 +86,15 @@ export function ProductSetForm({
86
86
  const { setError, reset } = form;
87
87
  const formValues = form.watch();
88
88
 
89
+ const submitHandler = (onSubmit: (values: ProductSetFormValues) => void) => {
90
+ return (values: ProductSetFormValues) => {
91
+ if (checkAvailableTimesErrors({ values, setError, t })) {
92
+ return;
93
+ }
94
+ onSubmit(values);
95
+ };
96
+ };
97
+
89
98
  useEffect(() => {
90
99
  if (!defaultValues || isEqual(defaultValues, formValues)) {
91
100
  return;
@@ -130,7 +139,7 @@ export function ProductSetForm({
130
139
  />
131
140
 
132
141
  <FormProvider {...form}>
133
- <Form onSubmit={form.handleSubmit(onSubmitAndRedirect)}>
142
+ <Form onSubmit={form.handleSubmit(submitHandler(onSubmitAndRedirect))}>
134
143
  <ProductSetLoadingContext.Consumer>
135
144
  {({ isLoading: contextIsLoading }) => {
136
145
  return (
@@ -163,7 +172,9 @@ export function ProductSetForm({
163
172
  {onSubmitNoRedirect && (
164
173
  <Button
165
174
  className="product-set-save-btn mt-5 ml-5 d-no dne d-md-block"
166
- onClick={form.handleSubmit(onSubmitNoRedirect)}
175
+ onClick={form.handleSubmit(
176
+ submitHandler(onSubmitNoRedirect)
177
+ )}
167
178
  disabled={
168
179
  isLoading || contextIsLoading || !formValues.name
169
180
  }
@@ -1,6 +1,15 @@
1
1
  import { EmailTemplate } from "@licklist/core/dist/DataMapper/Notification/EmailTemplateDataMapper";
2
2
  import { SmsTemplate } from "@licklist/core/dist/DataMapper/Notification/SmsTemplateDataMapper";
3
+ import { TFunction } from "i18next";
4
+ import { UseFormSetError } from "react-hook-form";
3
5
  import { TemplateItem } from "../control/ProductSetControl";
6
+ import { ProductSetFormValues } from "../form/ProductSetForm";
7
+
8
+ interface CheckAvailableTimesErrors {
9
+ values: ProductSetFormValues;
10
+ setError: UseFormSetError<ProductSetFormValues>;
11
+ t: TFunction;
12
+ }
4
13
 
5
14
  export const moveArrayElements = <T>(
6
15
  array: T[],
@@ -42,3 +51,32 @@ export const getFilteredTemplates = (
42
51
  label: template?.notification?.name,
43
52
  }));
44
53
  };
54
+
55
+ export const checkAvailableTimesErrors = ({
56
+ values,
57
+ setError,
58
+ t,
59
+ }: CheckAvailableTimesErrors) => {
60
+ let hasError = false;
61
+
62
+ const hasCategoryWithZone = values?.steps?.some(
63
+ (step) => !!step?.productCategories.some((category) => !!category?.zoneId)
64
+ );
65
+ if (!hasCategoryWithZone) {
66
+ return hasError;
67
+ }
68
+
69
+ values?.menuRecurrences?.forEach((recurrence, index: number) => {
70
+ if (!recurrence?.availableTimes?.length) {
71
+ hasError = true;
72
+ setError(`menuRecurrences.${index}.availableTimes` as const, {
73
+ type: "validate",
74
+ message: t("Validation:fieldMinNumber", {
75
+ attribute: t("startTimes"),
76
+ min: 1,
77
+ }),
78
+ });
79
+ }
80
+ });
81
+ return hasError;
82
+ };
@@ -4,6 +4,10 @@ import { Event } from "@licklist/core/dist/DataMapper/Provider/EventDataMapper";
4
4
  import { User } from "@licklist/core/dist/DataMapper/User/UserDataMapper";
5
5
  import { Product } from "@licklist/core/dist/DataMapper/Product/ProductDataMapper";
6
6
  import { Order } from "@licklist/core/dist/DataMapper/Order/OrderDataMapper";
7
+ import {
8
+ ORDER_SOURCE_IFRAME,
9
+ ORDER_SOURCE_MANUAL,
10
+ } from "@licklist/core/src/DataMapper/Order/OrderDataMapper";
7
11
  import { BookingResults } from "./BookingResults";
8
12
 
9
13
  export default {
@@ -21,6 +25,7 @@ Default.args = {
21
25
  {
22
26
  id: 1,
23
27
  people: 2,
28
+ source: ORDER_SOURCE_MANUAL,
24
29
  products: [
25
30
  {
26
31
  id: 1,
@@ -60,6 +65,7 @@ Default.args = {
60
65
  {
61
66
  id: 2,
62
67
  people: 10,
68
+ source: ORDER_SOURCE_MANUAL,
63
69
  products: [
64
70
  {
65
71
  id: 2,
@@ -100,6 +106,8 @@ Default.args = {
100
106
  {
101
107
  id: 3,
102
108
  people: 10,
109
+ source: ORDER_SOURCE_MANUAL,
110
+
103
111
  products: [
104
112
  {
105
113
  id: 3,
@@ -151,6 +159,7 @@ Default.args = {
151
159
  {
152
160
  id: 4,
153
161
  people: 10,
162
+ source: ORDER_SOURCE_MANUAL,
154
163
  products: [
155
164
  {
156
165
  id: 3,
@@ -182,6 +191,7 @@ Default.args = {
182
191
  {
183
192
  id: 5,
184
193
  people: 10,
194
+ source: ORDER_SOURCE_IFRAME,
185
195
  products: [
186
196
  {
187
197
  id: 3,
@@ -209,6 +219,7 @@ Default.args = {
209
219
  {
210
220
  id: 6,
211
221
  people: 10,
222
+ source: ORDER_SOURCE_IFRAME,
212
223
  products: [
213
224
  {
214
225
  id: 3,
@@ -235,6 +246,7 @@ Default.args = {
235
246
  {
236
247
  id: 7,
237
248
  people: 10,
249
+ source: ORDER_SOURCE_IFRAME,
238
250
  products: [
239
251
  {
240
252
  id: 3,
@@ -5,6 +5,7 @@ import { DateTime } from "luxon";
5
5
  import { Order } from "@licklist/core/dist/DataMapper/Order/OrderDataMapper";
6
6
  import { TIME_FORMAT } from "@licklist/core/dist/Config";
7
7
  import { formatDateStringForEvent } from "@licklist/plugins/dist/utils/formatDate";
8
+ import { getOrderSourceTitle } from "@licklist/plugins/dist/utils/sourceTitle";
8
9
  import Icon from "../../../../static/Icon";
9
10
 
10
11
  export type ResultCardProps = {
@@ -21,7 +22,7 @@ export const ResultCard = ({
21
22
  onCardClick,
22
23
  }: ResultCardProps) => {
23
24
  const { t } = useTranslation("Design");
24
- const { id, people, user, status, startDate, products } = order;
25
+ const { id, people, user, status, startDate, products, source } = order;
25
26
 
26
27
  const productList = products.map((product) => product.name)?.join(", ") || "";
27
28
 
@@ -66,6 +67,9 @@ export const ResultCard = ({
66
67
  <p className="products" title={productList}>
67
68
  {t("products")}: {productList}
68
69
  </p>
70
+ <p>
71
+ {t("source")}: {t(getOrderSourceTitle(source))}
72
+ </p>
69
73
  </div>
70
74
  </div>
71
75
  </div>
@@ -5,14 +5,14 @@
5
5
  flex-wrap: wrap;
6
6
 
7
7
  .result-card {
8
- height: 12.125rem;
8
+ height: 12.825rem;
9
9
  border: 1px solid $gray-400;
10
10
  max-width: calc(50% - 0.75rem);
11
11
  flex: 0 0 calc(50% - 0.75rem);
12
12
  transition: ease-in 0.25s;
13
13
  border-radius: 0.25rem;
14
14
  box-shadow: 0px 0px 0.125rem 0px rgb(0 0 0 / 20%);
15
-
15
+
16
16
  .card-content {
17
17
  width: 100%;
18
18
  height: 100%;
@@ -28,7 +28,7 @@
28
28
  position: absolute;
29
29
  left: 0.5rem;
30
30
  top: 0.125rem;
31
- font-weight: 600;
31
+ font-weight: 600;
32
32
  }
33
33
 
34
34
  .order-people {
@@ -43,7 +43,7 @@
43
43
  height: 1.75rem;
44
44
  font-size: 0.625rem;
45
45
  line-height: 0.625rem;
46
- color: #6D6D6D;
46
+ color: #6d6d6d;
47
47
  font-weight: 600;
48
48
 
49
49
  svg {
@@ -64,7 +64,7 @@
64
64
  }
65
65
 
66
66
  .products {
67
- display: inline-block;
67
+ display: block;
68
68
  width: 80%;
69
69
  white-space: nowrap;
70
70
  overflow: hidden;
@@ -74,7 +74,7 @@
74
74
 
75
75
  &:hover {
76
76
  box-shadow: 0px 0px 0.5rem 0px rgb(0 0 0 / 20%);
77
- cursor: pointer;
77
+ cursor: pointer;
78
78
  }
79
79
  }
80
80
 
@@ -93,4 +93,4 @@
93
93
  }
94
94
  }
95
95
  }
96
- }
96
+ }
@@ -23,6 +23,8 @@ type AvailableTimesControlProps = {
23
23
  defaultValues?: string[];
24
24
  startTime?: string;
25
25
  endTime?: string;
26
+ errorMessage?: string;
27
+ clearErrorMessage: () => void;
26
28
  };
27
29
 
28
30
  type AvailableTimesForm = { availableTimes: string[] };
@@ -30,91 +32,95 @@ type AvailableTimesForm = { availableTimes: string[] };
30
32
  export const AvailableTimesControl = forwardRef<
31
33
  AvailableTimesControlRef,
32
34
  AvailableTimesControlProps
33
- >(({ isLoading, workHours, defaultValues = [] }, ref) => {
34
- const nameId = useId();
35
- const { t } = useTranslation(["Design", "Validation"]);
36
-
37
- const {
38
- register,
39
- formState: { errors },
40
- reset,
41
- trigger,
42
- getValues,
43
- setValue,
44
- watch,
45
- setError,
46
- } = useForm<AvailableTimesForm>({ mode: "onChange" });
47
-
48
- const availableTimes = watch("availableTimes") || [];
49
-
50
- const checkboxes = useMemo(
51
- () => getCheckboxesByWorkHours(workHours),
52
- [workHours]
53
- );
54
-
55
- useImperativeHandle(ref, () => {
56
- return {
35
+ >(
36
+ (
37
+ {
38
+ isLoading,
39
+ workHours,
40
+ defaultValues = [],
41
+ errorMessage,
42
+ clearErrorMessage,
43
+ },
44
+ ref
45
+ ) => {
46
+ const nameId = useId();
47
+ const { t } = useTranslation(["Design", "Validation"]);
48
+
49
+ const {
50
+ register,
51
+ formState: { errors },
52
+ reset,
57
53
  trigger,
58
54
  getValues,
55
+ setValue,
56
+ watch,
59
57
  setError,
58
+ } = useForm<AvailableTimesForm>({ mode: "onChange" });
59
+
60
+ const availableTimes = watch("availableTimes") || [];
61
+
62
+ const checkboxes = useMemo(
63
+ () => getCheckboxesByWorkHours(workHours),
64
+ [workHours]
65
+ );
66
+
67
+ useImperativeHandle(ref, () => {
68
+ return {
69
+ trigger,
70
+ getValues,
71
+ setError,
72
+ };
73
+ });
74
+
75
+ const onChange = (option: string) => {
76
+ const isAlreadyChecked = availableTimes.includes(option);
77
+ if (errorMessage) {
78
+ clearErrorMessage();
79
+ }
80
+ if (isAlreadyChecked) {
81
+ setValue(
82
+ "availableTimes",
83
+ availableTimes.filter((value) => value !== option)
84
+ );
85
+
86
+ return;
87
+ }
88
+
89
+ setValue("availableTimes", [...availableTimes, option]);
60
90
  };
61
- });
62
-
63
- const onChange = (option: string) => {
64
- const isAlreadyChecked = availableTimes.includes(option);
65
-
66
- if (isAlreadyChecked) {
67
- setValue(
68
- "availableTimes",
69
- availableTimes.filter((value) => value !== option)
70
- );
71
-
72
- return;
73
- }
74
-
75
- setValue("availableTimes", [...availableTimes, option]);
76
- };
77
-
78
- useEffect(() => {
79
- if (!defaultValues) return;
80
-
81
- reset({ availableTimes: defaultValues });
82
- // eslint-disable-next-line react-hooks/exhaustive-deps
83
- }, [defaultValues]);
84
-
85
- return (
86
- <Form.Group controlId={nameId}>
87
- <Form.Label>{t("Design:startTimes")}</Form.Label>
88
- <div className="zone-available-times">
89
- {checkboxes.map((option) => {
90
- return (
91
- <Form.Check key={option} inline custom id={option}>
92
- <Form.Check.Input
93
- type="checkbox"
94
- value={option}
95
- checked={availableTimes.includes(option)}
96
- onChange={() => onChange(option)}
97
- disabled={isLoading}
98
- />
99
- <Form.Check.Label>{option}</Form.Check.Label>
100
- </Form.Check>
101
- );
102
- })}
103
- </div>
104
91
 
105
- <Form.Control
106
- type="hidden"
107
- {...register("availableTimes", {
108
- required: {
109
- value: true,
110
- message: t("Validation:fieldMinNumber", {
111
- attribute: t("startTimes"),
112
- min: 1,
113
- }),
114
- },
115
- })}
116
- />
117
- <div className="manual-form-error">{errors.availableTimes?.message}</div>
118
- </Form.Group>
119
- );
120
- });
92
+ useEffect(() => {
93
+ if (!defaultValues) return;
94
+
95
+ reset({ availableTimes: defaultValues });
96
+ // eslint-disable-next-line react-hooks/exhaustive-deps
97
+ }, [defaultValues]);
98
+
99
+ return (
100
+ <Form.Group controlId={nameId}>
101
+ <Form.Label>{t("Design:startTimes")}</Form.Label>
102
+ <div className="zone-available-times">
103
+ {checkboxes.map((option) => {
104
+ return (
105
+ <Form.Check key={option} inline custom id={option}>
106
+ <Form.Check.Input
107
+ type="checkbox"
108
+ value={option}
109
+ checked={availableTimes.includes(option)}
110
+ onChange={() => onChange(option)}
111
+ disabled={isLoading}
112
+ />
113
+ <Form.Check.Label>{option}</Form.Check.Label>
114
+ </Form.Check>
115
+ );
116
+ })}
117
+ </div>
118
+
119
+ <Form.Control type="hidden" {...register("availableTimes")} />
120
+ <div className="manual-form-error">
121
+ {errors.availableTimes?.message || errorMessage}
122
+ </div>
123
+ </Form.Group>
124
+ );
125
+ }
126
+ );