Changeset 3434554
- Timestamp:
- 01/07/2026 05:24:35 PM (6 weeks ago)
- Location:
- bookster-extra-options/trunk
- Files:
-
- 3 added
- 2 deleted
- 10 edited
-
assets/dist/extra-options/QuantityInput-de42f710.js (deleted)
-
assets/dist/extra-options/admin.js (modified) (1 diff)
-
assets/dist/extra-options/frontend.js (modified) (1 diff)
-
assets/dist/extra-options/loadExtraBooking-BwOyuAjL.js (added)
-
assets/dist/extra-options/style.css (modified) (1 diff)
-
assets/images (added)
-
assets/images/folder-plus.svg (added)
-
bookster-extra-options.php (modified) (3 diffs)
-
composer.json (deleted)
-
languages/bookster-extra-options.pot (modified) (8 diffs)
-
readme.txt (modified) (3 diffs)
-
src/Engine/Enqueue.php (modified) (3 diffs)
-
src/Engine/ExtraBookingRequestLogic.php (modified) (3 diffs)
-
src/Services/ExtrasService.php (modified) (1 diff)
-
vendor/composer/installed.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
bookster-extra-options/trunk/assets/dist/extra-options/admin.js
r3244338 r3434554 1 import{_ as e, R as t,a,b as r,c as n,r as o,d as l,E as i,e as s,Q as c,f as m}from"./QuantityInput-de42f710.js";const u=e.createStore()(e.immer(e.devtools((e=>({openExtraDrawer:!1,isSaving:null,newExtra:()=>{e((e=>{e.openExtraDrawer=!0}))},editExtra:async t=>{e((e=>{e.selectedRow=t,e.openExtraDrawer=!0}))},closeExtraDrawer:()=>{e((e=>{e.selectedRow=void 0,e.openExtraDrawer=!1}))},updatePosition:async t=>{e((e=>{e.isSaving=t}))}})))));function d({className:o,...l}){const[i,s]=e.useSearchParams(),c=i.get("keywords");return t.createElement("div",{className:a.clsx("bw-relative",o)},t.createElement(a.InputPrefix,null,t.createElement(r.Search,null)),t.createElement(a.Input,{size:"medium",className:"bw-ps-10",withStatus:!1,value:c??"",onChange:e=>{const t=e.target.value??"";var a;a=t,s((e=>(e.set("keywords",a),e)))},placeholder:n.__("Search","bookster"),...l}))}function b({className:l,...i}){const[s,c]=o.useState(!1),[m,u]=e.useSearchParams(),d=m.get("status"),b=e=>{u((t=>(""===e?t.delete("status"):t.set("status",e),t)))};return t.createElement(a.Combobox,{open:s,onOpenChange:c},t.createElement(a.ComboboxTrigger,{size:"medium",withStatus:!1,className:a.clsx("bw-w-auto bw-gap-1 bw-rounded bw-border-dashed bw-border-gray-500/30 bw-bg-gray-50 bw-pe-2 bw-ps-2 bw-text-sm",l),...i},t.createElement(r.Circle,{className:"h-2 w-2 bw-text-gray-500"}),t.createElement("span",{className:"bw-text-gray-500"},"Status"),d&&t.createElement(a.Separator,{orientation:"vertical",className:"bw-mx-1.5 bw-h-[14px] bw-bg-gray-500/15"}),"active"===d&&t.createElement(a.Badge,{variant:"outline",color:"success"},n.__("Active","bookster-extra-options"),t.createElement(r.X,{className:"bw-ml-2 bw-h-2 bw-w-2 bw-text-gray-500/80 hover:bw-text-error",strokeWidth:"3",onClick:e=>{e.stopPropagation(),b("")}})),"inactive"===d&&t.createElement(a.Badge,{variant:"outline",color:"error"},n.__("Inactive","bookster-extra-options"),t.createElement(r.X,{className:"bw-ml-2 bw-h-2 bw-w-2 bw-text-gray-500/80 hover:bw-text-error",strokeWidth:"3",onClick:e=>{e.stopPropagation(),b("")}}))),t.createElement(a.ComboboxPortalContent,{className:"bw-w-[10rem] bw-p-0 bw-shadow-md",side:"bottom",align:"start"},t.createElement(a.Command,{loop:!0},t.createElement(a.CommandList,null,t.createElement(a.CommandEmpty,null,n.__("No results found.","bookster-extra-options")),t.createElement(a.CommandGroup,{className:"[&_[cmdk-item]]:bw-pl-5"},t.createElement(a.ComboboxItem,{value:"active",isActive:"active"===d,onSelect:()=>b("active")},n.__("Active","bookster-extra-options"),t.createElement(a.ComboboxItemIcon,null)),t.createElement(a.ComboboxItem,{value:"inactive",isActive:"inactive"===d,onSelect:()=>b("inactive")},n.__("Inactive","bookster-extra-options"),t.createElement(a.ComboboxItemIcon,null)))))))}function w(){const e=u((e=>e.newExtra));return t.createElement("div",{className:"bw-mb-2.5 bw-flex bw-flex-nowrap bw-items-center bw-gap-4 bw-px-6"},t.createElement(b,null),t.createElement(d,{className:"bw-ms-auto bw-w-72 bw-min-w-44 bw-flex-shrink"}),t.createElement(a.Button,{variant:"outline",size:"medium",onClick:()=>e(),className:"bw-border-gray-300 bw-bg-white bw-font-medium bw-text-gray-900"},t.createElement(r.Plus,{strokeWidth:"2",className:"bw-h-2.5 bw-w-2.5"}),n.__("New Extra","bookster-extra-options")))}var p=booksterModules.antd;function v(){const e=window.booksterPublicData.generalSettings.time_slot_step%60;return 0===e?60:e>0&&e<=30?e:e>30&&e<60?e%30:5}function x({onDelete:e,disabled:n}){return t.createElement(a.Popover,null,t.createElement(a.PopoverTrigger,{asChild:!0},t.createElement(a.Button,{className:"bw-me-auto",disabled:n,size:"icon",color:"error",variant:"outline",tabIndex:-1},t.createElement(r.Trash,null))),t.createElement(a.PopoverPortalContent,null,t.createElement("div",{className:"bw-flex bw-items-start bw-gap-2"},t.createElement(r.AlertCircle,{className:"bw-mt-px bw-text-warning"}),"Deleting this Service Extra"),t.createElement("div",{className:"bw-mt-3 bw-flex bw-flex-row bw-justify-end bw-gap-2"},t.createElement(a.PopoverClose,{asChild:!0},t.createElement(a.Button,{size:"small",color:"error",variant:"outline",onClick:()=>{e()}},"Delete")))))}function g({formNamePrefix:e,service:r}){if(!r.service_id)return null;const[n,l]=o.useState(!0),i=p.Form.useFormInstance(),s=p.Form.useWatch(e,i);return o.useEffect((()=>{void 0!==s&&l(!s.includes(r.service_id))}),[s,r.service_id]),t.createElement(t.Fragment,null,t.createElement("div",{className:a.cx("bw-block bw-cursor-pointer bw-select-none bw-overflow-hidden bw-text-ellipsis bw-whitespace-nowrap bw-rounded-sm bw-border-0 bw-border-l-4 bw-border-solid bw-p-4 bw-text-primary bw-shadow bw-transition-shadow bw-duration-200 bw-ease-in-out hover:bw-shadow-md",n?"bw-bg-primary/10":"bw-grayscale"),style:{borderLeftColor:r.theme_color},onClick:function(){const t=[...i.getFieldValue(e)];if(n)t.push(r.service_id);else{const e=null==t?void 0:t.indexOf(r.service_id);t.splice(e,1)}i.setFieldValue(e,t),l(!n)}},r.name))}function E({formNamePrefix:e,category:r}){const n=p.Form.useFormInstance(),l=p.Form.useWatch(e,n),i=o.useMemo((()=>{if(!l||0===l.length)return{checkAll:!0,indeterminate:!1};const e=r.services.filter((e=>e.service_category_id===r.service_category_id)).map((e=>e.service_id)),t=e.every((e=>l.includes(e)));return{checkAll:!t,indeterminate:e.some((e=>l.includes(e)))&&!t}}),[l]);return t.createElement("div",{className:"bw-flex bw-items-center bw-gap-2"},t.createElement(a.Checkbox,{id:`category-${r.service_category_id}`,checked:i.indeterminate?"indeterminate":i.checkAll,onClick:()=>(e=>{const t=e.services.filter((t=>t.service_category_id===e.service_category_id)).map((e=>e.service_id));if(i.checkAll&&!i.indeterminate){const e=[...l];e.push(...t),n.setFieldsValue({unavailable_services:e})}else{const e=l.filter((e=>!t.includes(e)));n.setFieldsValue({unavailable_services:e})}})(r)}),t.createElement(a.Label,{htmlFor:`category-${r.service_category_id}`},t.createElement("span",{className:"bw-text-gray-500"},"Category"),": ",r.name))}function f({formNamePrefix:n}){const o=e.useActiveServices();return t.createElement("div",{className:"bw-divide-y bw-divide-gray-100 bw-rounded bw-border"},o.map((e=>t.createElement(a.Collapsible,{key:e.service_category_id,defaultOpen:!0},t.createElement("div",{className:"bw-flex bw-w-full bw-justify-between bw-bg-gray-50 bw-p-3"},t.createElement(E,{formNamePrefix:n,category:e}),t.createElement(a.CollapsibleTrigger,{asChild:!0},t.createElement(r.ChevronDown,{className:"bw-transition-transform data-[state=open]:bw-rotate-180"}))),t.createElement(a.CollapsibleContent,{forceMountWithAnimation:!0},t.createElement("div",{className:"bw-grid bw-grid-cols-6 bw-gap-x-4 bw-gap-y-4 bw-border-t bw-p-4"},e.services.map((e=>t.createElement("div",{className:"bw-col-span-3 sm:bw-col-span-2",key:e.service_id},t.createElement(g,{service:e,formNamePrefix:n}))))))))))}function _({formNamePrefix:n,allLabel:l}){const i=p.Form.useFormInstance(),s=p.Form.useWatch(n,i),c=e.useActiveServices(),m=o.useMemo((()=>{const e=[];return c.forEach((t=>{t.services.forEach((a=>{a.service_category_id===t.service_category_id&&e.push(a.service_id)}))})),e}),[c]),u=o.useMemo((()=>{if(!s||0===s.length)return{checkAll:!0,indeterminate:!1};const e=m.every((e=>s.includes(e)));return{checkAll:!e,indeterminate:m.some((e=>s.includes(e)))&&!e}}),[s]);return t.createElement(t.Fragment,null,t.createElement("div",{className:"bw-mb-5 bw-mt-1 bw-inline-flex bw-items-center bw-gap-2"},t.createElement(a.Checkbox,{id:"check-all",checked:u.indeterminate?"indeterminate":u.checkAll,onClick:()=>{if(u.checkAll&&!u.indeterminate){const e=[...s];e.push(...m),i.setFieldsValue({unavailable_services:e})}else{const e=s.filter((e=>!m.includes(e)));i.setFieldsValue({unavailable_services:e})}}}),t.createElement(a.Label,{htmlFor:"check-all"},l),t.createElement(a.Tooltip,{content:"Available only apply to Customer Booking Form. For Manager, there is no restriction."},t.createElement(r.HelpCircle,{className:"bw-text-info"}))),t.createElement(f,{formNamePrefix:n}))}function y(){return t.createElement(p.Form.Item,{name:"unavailable_services"},t.createElement(_,{formNamePrefix:["unavailable_services"],allLabel:"This Extra is available for all Services"}))}function k({value:r,onChange:n,...o}){const l=r??0;return t.createElement(a.InputNumber,{precision:e.NUMBER_OF_DECIMALS,decimalSeparator:e.DECIMAL_SEPARATOR,min:0,step:5,value:l,onChange:e=>{n&&n(e)},"data-negative":l<0,...o})}function h({coverSrc:e,onSelectCover:o,onRemoveCover:l}){const i=window.booksterMeta.appPath.bookster.assets+"/images/empty.png";return t.createElement(t.Fragment,null,t.createElement(a.Button,{onClick:()=>{if(!S)return;const e=window.wp.media.frames.downloadable_file=window.wp.media({title:"Choose an image",multiple:!1});e.on("select",(function(){const t=e.state().get("selection").first().toJSON(),a=t.sizes.full||t.sizes.thumbnail;o({id:t.id,url:a.url})})),e.open()},size:"small",variant:"outline",className:"bw-group/cover-picker bw-flex bw-h-[60px] bw-w-full bw-items-center bw-justify-center bw-rounded bw-border-dashed bw-border-gray-300 bw-bg-gray-50 bw-text-gray-900"},t.createElement("img",{src:window.booksterMeta.appPath.bookster.assets+"/images/figures/upload-img.svg",className:"bw-duration-200 group-hover/cover-picker:bw-scale-125"}),t.createElement("span",{className:"bw-text-sm bw-duration-200 group-hover/cover-picker:bw-translate-x-1 group-hover/cover-picker:bw-text-primary"},n.__("Upload Image","bookster-extra-options"))),e&&e!==i&&t.createElement("div",{className:"bw-mt-[10px] bw-flex bw-h-5 bw-w-full bw-items-center bw-justify-start bw-gap-2 bw-rounded bw-border bw-border-gray-300 bw-object-cover bw-px-2 bw-py-[18px] "},t.createElement("img",{className:a.cx("bw-block bw-h-[24px] bw-w-[34px] bw-rounded-xs bw-object-cover"),src:e||i,alt:n.__("Extra cover","bookster-extra-options")}),t.createElement("span",{className:"bw-text-sm"},(e||i).split("/").pop()||""),t.createElement(r.MinusCircle,{className:"bw-ms-auto bw-h-4 bw-w-4 bw-cursor-pointer bw-text-gray-500 hover:bw-text-error",onClick:e=>{e.stopPropagation(),l(i)}})))}const S=function(){const e=window.booksterMeta.auth.wpUserInfo;return e.isLoggedIn?e.caps:[]}().includes("upload_files");function C(){const e=p.Form.useFormInstance(),l=u((e=>e.openExtraDrawer)),i=u((e=>e.selectedRow)),[s,c]=o.useState("");return o.useEffect((()=>{l&&c((null==i?void 0:i.transient_cover_url)?i.transient_cover_url:"")}),[l,i]),t.createElement(t.Fragment,null,t.createElement(h,{coverSrc:s,onSelectCover:t=>{e.setFieldValue("cover_id",+t.id),c(t.url)},onRemoveCover:t=>{e.setFieldValue("cover_id",null),c(t)}}),t.createElement(p.Form.Item,{name:"cover_id",hidden:!0},t.createElement(a.Input,null)),t.createElement(a.FormItem,{name:"name",label:"Extra Name",rules:[{required:!0}],className:"bw-pt-3"},t.createElement(a.Input,{placeholder:n.__("Enter Extra Name","bookster-extra-options"),autoFocus:!0})),t.createElement("div",{className:"bw-grid bw-grid-cols-2 bw-gap-x-5 sm:bw-grid-cols-3"},t.createElement("div",null,t.createElement(p.Form.Item,{name:"duration",label:"Extra Duration",rules:[{required:!0}]},t.createElement(a.InputNumber,{min:0,addonAfter:"mins",step:v()}))),t.createElement("div",null,t.createElement(p.Form.Item,{name:"price",label:"Extra Price",rules:[{required:!0}]},t.createElement(k,{className:"bw-w-full"}))),t.createElement("div",null,t.createElement(a.FormItem,{name:["quantity","max"],label:"Quantity",rules:[{required:!0},{validator:function(e,t){return null==t||t>0?Promise.resolve():Promise.reject("Extra Max Quantity must be greater than 0")}}],tooltip:n.__("Maximum quantity of extra that can be added to the cart.","bookster-extra-options")},t.createElement(a.InputNumber,{min:0,precision:0,step:1,className:"bw-w-full"})))),t.createElement(a.FormItem,{name:"description",label:n.__("Description","bookster-extra-options")},t.createElement(a.Textarea,{rows:2,placeholder:n.__("Please enter Extra description","bookster-extra-options"),maxLength:150})),t.createElement("div",{className:"bw-mb-3 bw-mt-5 bw-divide-y bw-divide-gray-100 bw-rounded bw-border bw-p-4"},t.createElement("div",{className:"bw-flex bw-items-center bw-gap-4 bw-leading-none"},t.createElement("div",{className:"bw-me-auto"},t.createElement(a.Label,{htmlFor:"activated",className:"bw-cursor-pointer bw-text-sm bw-leading-none bw-text-gray-900"},n.__("Active","bookster-extra-options")),t.createElement(a.Tooltip,{content:n.__("Archiving Service to avoid Deleting referencing Appointment, Analytics Data in the past.","bookster-extra-options"),side:"right"},t.createElement(r.HelpCircle,{className:"bw-ms-1 bw-h-2.5 bw-w-2.5 bw-text-gray-500"})),t.createElement("p",{className:"bw-mt-2 bw-text-xs bw-leading-none bw-text-gray-500"},n.__("The service is available for booking.","bookster-extra-options"))),t.createElement(a.Separator,{orientation:"vertical"}),t.createElement(p.Form.Item,{label:"Active",name:"activated",valuePropName:"checked",rules:[{required:!0}],trigger:"onCheckedChange",noStyle:!0},t.createElement(a.Switch,{id:"activated"})))))}async function N(t){return await e.api.post("extras",{json:t}).json()}async function F(t){return await e.api.delete(`extras/${t}`).json()}async function A(t){return await e.api.delete("extras/bulk-action",{json:{ids:t}}).json()}async function I(){return await e.api.get("extras/public").json()}window.booksterPublicData.paymentSettings.currency_symbol;const M=[];function D(){const r=u((e=>e.openExtraDrawer)),n=u((e=>e.closeExtraDrawer)),{selectedExtra:l,createExtraMutation:i,updateExtraMutation:s,deleteExtraMutation:c,isFormLoading:m}=function(){const t=u((e=>e.selectedRow)),a=e.useQueryClient(),{data:r,refetch:n}=e.useQuery({queryKey:["extra",{id:null==t?void 0:t.extra_id}],queryFn:async()=>{if(!(null==t?void 0:t.extra_id))return null;const e=await I();return a.setQueryData(["extras"],e.data),e.data.find((e=>e.extra_id===(null==t?void 0:t.extra_id)))},initialData:t??null});o.useEffect((()=>{(null==t?void 0:t.extra_id)&&n()}),[null==t?void 0:t.extra_id]);const l=e.useMutation({mutationFn:N,onSuccess:e=>{a.setQueryData(["extras"],e.data)}}),i=e.useMutation({mutationFn:({id:t,values:a})=>async function(t,a){return await e.api.patch(`extras/${t}`,{json:a}).json()}(t,a),onSuccess:e=>{const r=null==e?void 0:e.data.find((e=>e.extra_id===(null==t?void 0:t.extra_id)));a.setQueryData(["extra",{id:null==r?void 0:r.extra_id}],r),a.setQueryData(["extras"],e.data)}}),s=e.useMutation({mutationFn:F,onSuccess:e=>{a.setQueryData(["extras"],e.data)}});return{selectedExtra:r,createExtraMutation:l,updateExtraMutation:i,deleteExtraMutation:s,isFormLoading:l.isLoading||i.isLoading||s.isLoading}}(),[d]=p.Form.useForm();return o.useEffect((()=>{if(r){d.resetFields();const e=l?function(e){var t;const a="disable"===(null==(t=e.quantity)?void 0:t.activated)?1:e.quantity.max;return{...e,quantity:{max:a}}}(l):{name:"",activated:!0,transient_cover_url:"",quantity:{max:1},price:40,duration:v(),unavailable_services:[],description:""};d.setFieldsValue(e)}}),[r,l]),t.createElement(a.Drawer,{open:r,onOpenChange:e=>{e||n()}},t.createElement(a.DrawerPortalContent,null,t.createElement(a.DrawerHeader,null,t.createElement(a.DrawerTitle,null,r?l?"Edit Service Extra":"New Service Extra":"Closing"),t.createElement(a.DrawerCloseIcon,null)),t.createElement(a.DrawerBody,null,t.createElement(a.LoadingOverlay,{loading:m}),t.createElement(p.Form,{form:d,disabled:m,layout:"vertical",scrollToFirstError:!0,onFinish:t=>{!async function(t){try{(null==l?void 0:l.extra_id)?await s.mutateAsync({id:l.extra_id,values:t}):await i.mutateAsync(t),a.toast.success("Extra has been Saved Successfully!"),n()}catch(r){a.toast.error(await e.getErrorMsg(r))}}(t)}},t.createElement(a.Tabs,{defaultValue:"general"},t.createElement(a.TabsList,{"aria-label":"tabs settings",className:"-bw-mt-1"},t.createElement(a.CompactLineTabsTrigger,{value:"general"},"General"),t.createElement(a.CompactLineTabsTrigger,{value:"available"},"Available")),t.createElement(a.TabsContent,{value:"general"},t.createElement(C,null)),t.createElement(a.TabsContent,{value:"available"},t.createElement(y,null))),t.createElement("button",{type:"submit",className:"bw-hidden"}))),t.createElement(a.DrawerFooter,null,l?t.createElement(x,{disabled:m,onDelete:async function(){if(null==l?void 0:l.extra_id)try{await c.mutateAsync(l.extra_id),a.toast.success("Service Extra has been Deleted Successfully!"),n()}catch(t){a.toast.error(await e.getErrorMsg(t))}}}):null,t.createElement(a.DrawerClose,{asChild:!0},t.createElement(a.Button,{key:"back",tabIndex:-1,variant:"soft",size:"large",className:"bw-min-w-[7rem]",onClick:n},"Cancel")),t.createElement(a.Button,{key:"submit",disabled:m,onClick:()=>d.submit(),size:"large",className:"bw-min-w-[7rem]"},"Save"))))}const P=o.forwardRef((({isSaving:e,className:n,...o},l)=>t.createElement("span",{className:a.cx("bw-ms-3 bw-inline-flex bw-items-center bw-gap-2 bw-text-base bw-font-normal bw-text-gray-500",!1===e&&"bw-text-success",n),...o,ref:l},null===e&&null,!1===e&&t.createElement(t.Fragment,null,t.createElement(r.CheckCircle,null)," Saved"),!0===e&&t.createElement(t.Fragment,null,t.createElement(r.Loader2,{className:"bw-animate-spin"})," Saving..."))));function T(){const e=u((e=>e.isSaving));return t.createElement("div",{className:"bw-my-4 bw-flex bw-flex-wrap bw-items-center bw-gap-3 bw-px-6 bw-capitalize"},t.createElement("h2",{className:"bw-flex bw-flex-auto bw-items-center bw-text-xl bw-font-medium bw-leading-8"},n.__("Services extra","bookster-extra-options"),t.createElement(P,{isSaving:e})))}function O({ids:l}){const{toast:i}=a.useToast(),s=e.useQueryClient(),[c,m]=o.useState(!1),u=e.useIsMutating({mutationKey:["extras"]}),d=e.useMutation({mutationKey:["extras",l,"delete"],mutationFn:A,onSuccess:()=>{s.invalidateQueries({queryKey:["extra"]}),s.invalidateQueries({queryKey:["extras"]})}});return t.createElement(a.Popover,{open:c,onOpenChange:m},t.createElement(a.PopoverTrigger,{asChild:!0},t.createElement(a.Button,{color:"error",variant:"link"},d.isLoading?t.createElement(r.Loader2,{className:"bw-h-4 bw-w-4 bw-animate-spin"}):t.createElement(r.Trash,{className:"bw-h-4 bw-w-4"}),n.__("Delete Data","bookster-extra-options"))),t.createElement(a.ConfirmPopoverContent,null,t.createElement(r.AlertFilled,{className:"bw-text-error"}),t.createElement(a.ConfirmPopoverTitle,null,n.__("Delete Multiple Extras","bookster-extra-options")),t.createElement(a.ConfirmPopoverDescription,null,n.sprintf(n.__("This action cannot be undone. This will permanently delete %s extras.","bookster-extra-options"),l.length)),t.createElement(a.ConfirmPopoverActions,null,t.createElement(a.PopoverClose,{asChild:!0},t.createElement(a.Button,{variant:"soft"},n.__("Cancel","bookster-extra-options"))),t.createElement(a.Button,{variant:"fill",onClick:async function(){if(l&&0!==l.length&&!u)try{await d.mutateAsync(l),m(!1),i.success("Extra Rows has been Deleted Successfully!")}catch(t){i.error(await e.getErrorMsg(t))}}},n.__("Confirm Delete","bookster-extra-options")))))}const q=e.createColumnHelper(),B=[q.accessor("extra_id",{id:"select",size:56,header:({table:e})=>t.createElement(a.TableCheckboxWrapper,null,t.createElement(a.Checkbox,{checked:e.getIsAllRowsSelected(),onClick:e.getToggleAllPageRowsSelectedHandler()})),cell:({row:e})=>t.createElement(a.TableCheckboxWrapper,null,t.createElement(a.Checkbox,{checked:e.getIsSelected(),onClick:e.getToggleSelectedHandler()}))}),q.accessor("name",{id:"name",header:()=>n.__("Name Service","bookster-extra-options"),cell:({row:e})=>t.createElement("div",{className:"bw-flex bw-items-center bw-gap-1.5"},t.createElement(a.Avatar,{className:"bw-h-[30px] bw-w-[32px] bw-rounded-xs"},t.createElement(a.AvatarImage,{src:e.original.transient_cover_url}),t.createElement(a.AvatarFallback,{className:"bw-text-xs"},t.createElement(r.User,{className:"bw-h-3 bw-w-3"}))),e.original.name),filterFn:(e,t,a)=>!a||e.original.name.toLowerCase().includes(a.toLowerCase())}),q.accessor("duration",{header:()=>n.__("Duration","bookster-extra-options"),cell:({row:e})=>`${e.original.duration} mins`}),q.accessor("quantity",{header:()=>n.__("Quantity","bookster-extra-options"),cell:({row:e})=>{const t=e.original.quantity;return"disable"===(null==t?void 0:t.activated)||1===(null==t?void 0:t.max)?1:`1~${t.max}`}}),q.accessor("price",{header:()=>n.__("Price","bookster-extra-options"),cell:({row:t})=>{const a=t.original.price;return a?e.formatPrice(a):"-"}}),q.accessor("activated",{header:()=>n.__("Status","bookster-extra-options"),filterFn:(e,t,a)=>!a||("active"===a?e.original.activated:!e.original.activated),cell:({row:e})=>t.createElement(a.Badge,{variant:"outline",color:e.original.activated?"success":"error",size:"large"},e.original.activated?n.__("Active","bookster-extra-options"):n.__("Inactive","bookster-extra-options"))}),q.accessor("extra_id",{id:"actions",size:40,header:"",cell:()=>t.createElement(a.TableActionWrapper,null,t.createElement(a.Tooltip,{content:n.__("Edit Extra","bookster-extra-options")},t.createElement(a.TableActionLink,null)))})];function R({row:r,onEdit:n}){const{setNodeRef:l,attributes:i,listeners:s,isDragging:c,transform:m,transition:u}=e.useSortable({id:r.id,data:{type:"extra",extra:r.original}}),d=o.useCallback((e=>{e.stopPropagation(),n(r.original)}),[r.original]),b={transition:u,transform:e.dndCSS.Transform.toString(m?{...m,scaleX:1,scaleY:1}:m)};return t.createElement(a.TableRow,{isSelected:r.getIsSelected(),style:b,className:a.cx("bw-cursor-grab",c&&"bw-opacity-50"),onClick:d,ref:l,...i,...s},r.getVisibleCells().map((r=>t.createElement(a.TableCell,{key:r.id},e.flexRender(r.column.columnDef.cell,r.getContext())))))}function H(){const[r]=e.useSearchParams(),l=r.get("keywords"),i=a.useDebounce(l,{wait:500}),s=r.get("status"),c=o.useMemo((()=>[]),[]),[m,d]=o.useState({}),[b,w]=o.useState(null),p=u((e=>e.editExtra)),v=u((e=>e.updatePosition)),[x,g]=o.useState(void 0),{data:E,isLoading:f}=e.useQuery({queryKey:["extras"],queryFn:async()=>(await I()).data,keepPreviousData:!0}),_=e.useReactTable({data:E||c,columns:B,getRowId:e=>e.extra_id.toString(),getCoreRowModel:e.getCoreRowModel(),getFilteredRowModel:e.getFilteredRowModel(),state:{rowSelection:m,columnFilters:[{id:"activated",value:s},{id:"name",value:i}]},onRowSelectionChange:d,manualPagination:!0,autoResetPageIndex:!1}),y=e.useSensors(e.useSensor(e.MouseSensor,{}),e.useSensor(e.TouchSensor,{}),e.useSensor(e.KeyboardSensor,{}),e.useSensor(e.PointerSensor,{activationConstraint:{distance:5}})),k=o.useMemo((()=>(null==E?void 0:E.map((e=>e.extra_id.toString())))||void 0),[E]);return a.useRemoveSelectOnChange(_,k),t.createElement(e.DndContext,{sensors:y,collisionDetection:e.closestCenter,onDragStart:function(e){var t;"extra"===(null==(t=e.active.data.current)?void 0:t.type)&&(g(e.active.data.current.extra),w(e.active.id))},onDragOver:function(t){var a,r;const{active:n,over:o}=t;if(!o||!E)return;console.log(t);const l=null==(a=n.data.current)?void 0:a.extra.extra_id,i=null==(r=o.data.current)?void 0:r.extra.extra_id,s=E.findIndex((e=>e.extra_id===l)),c=E.findIndex((e=>e.extra_id===i));if(s===c)return E;const m=function(e,t){if(!E)return[];const a=[...E],r=a.splice(e,1);return a.splice(t,0,...r),a}(s,c);e.queryClient.setQueryData(["extras"],m)},onDragEnd:function(){void 0!==E&&(async function(t){try{v(!0),await async function(t){return await e.api.patch("extras",{json:{extraModels:t}}).json()}(t),v(!1)}catch(r){throw v(null),a.toast.error(await e.getErrorMsg(r)),r}}(E),g(void 0),w(null))}},t.createElement("div",{className:"bw-px-6"},t.createElement(a.Table,null,t.createElement(a.TableHeader,null,t.createElement(a.TableHeadRow,null,_.getLeafHeaders().map((r=>t.createElement(a.TableHead,{key:r.id},e.flexRender(r.column.columnDef.header,r.getContext())))))),t.createElement(a.TableBody,null,t.createElement(e.SortableContext,{items:_.getRowModel().rows.map((e=>e.id)),strategy:e.verticalListSortingStrategy},_.getRowModel().rows.map((e=>t.createElement(R,{key:e.id,row:e,onEdit:p})))),(f||0===(null==E?void 0:E.length))&&t.createElement(a.TableRow,{className:"bw-pointer-events-none"},t.createElement(a.TableCell,{colSpan:100,className:"bw-h-60 bw-justify-center bw-text-center"},t.createElement("span",{className:"bw-text-2xl bw-font-medium bw-text-gray-500"},f?n.__("Loading...","bookster-extra-options"):n.__("No Data Found","bookster-extra-options")))))),t.createElement(a.TableToaster,null,t.createElement(a.TableToast,{open:Object.keys(m).length>0,onOpenChange:e=>{e||_.resetRowSelection()}},t.createElement(a.TableToastClose,null),t.createElement(a.TableToastTitle,null,Object.keys(m).length," ",n.__("Selected","bookster-extra-options")),t.createElement(a.Separator,{orientation:"vertical"}),t.createElement(O,{ids:Object.keys(m)})))),t.createElement(e.DragOverlay,null,b&&x?t.createElement(a.Table,null,t.createElement(a.TableBody,null,t.createElement(R,{row:_.getRow(b),onEdit:p}))):null))}function L(){return t.createElement("div",{className:"btr-scrollbar-md bw-relative bw-flex bw-h-full bw-flex-col bw-overflow-auto bw-overscroll-none bw-p-0"},t.createElement(T,null),t.createElement(w,null),t.createElement(H,null),t.createElement(D,null))}function V(e){}function j({name:n}){const i=p.Form.useFormInstance(),{roleMode:u,apptForm:d}=s.useApptFormLogic(),{selectedService:b}=s.useSelectedService(),w=function(){const t=function(){const{data:t}=e.useQuery({queryKey:["extras"],queryFn:async()=>(await I()).data,keepPreviousData:!0});return t||M}();return o.useMemo((()=>t.filter((e=>e.activated))),[t])}(),v=p.Form.useWatch([...n,"extraBookingItems"],i)??[],x=e=>{const t=v.find((t=>t.id===e));return void 0!==t?t.quantity:0},g=t=>{var a;a=t,i.setFieldValue([...n,"extraBookingItems"],a),null!==b&&(function(e){const t=d.getFieldsValue(),a=i.getFieldValue(n),r=l.booksterHooks.applyFilters(l.HOOK_NAMES.adminApptForm.detailsReloadBookingValue,{items:[s.makeBasicItem(e)],subtotal:m.ZERO},t,a),o={...a.booking_details,booking:r},c=s.calculateDetails(o);i.setFieldValue([...n,"booking_details","booking"],c.booking),i.setFieldValue([...n,"booking_details","adjustment"],c.adjustment),i.setFieldValue([...n,"booking_details","tax"],c.tax);const u={paid_amount:a.paid_amount,payment_status:a.payment_status},{paid_amount:b,payment_status:w}=s.calculatePayment(u,c.tax.total);i.setFieldValue([...n,"paid_amount"],b),i.setFieldValue([...n,"payment_status"],w)}(b),function(t,a){if(l.booksterHooks.applyFilters(l.ADDON_GROUP_HOOKS_NAME.service.hasMultipleBookings,!1,a))return;let r=0;const n=d.getFieldValue("start_time")?d.getFieldValue("start_time").absMinute:0;t.forEach((e=>{const t=w.find((t=>t.extra_id===e.id));void 0!==t&&(r+=t.duration*e.quantity)})),d.setFieldsValue({end_time:e.bookHelper.booktime.createFromAbsMinute(n+a.duration+r)})}(t,b))},E=o.useMemo((()=>null===b?[]:w.filter((e=>!e.unavailable_services.includes(b.service_id)))),[w,b]),f=o.useMemo((()=>{if(0===E.length)return t.createElement("span",{className:"bw-text-gray-500"},"Unavailable extra on current service...");if(void 0===v||null===b||0===v.length)return t.createElement("span",{role:"placeholder"},"Select Service Extras...");const e=v.map((e=>e.quantity>1?e.title+"(x"+e.quantity+")":e.title));return t.createElement(t.Fragment,null,e.length>2&&t.createElement("span",{className:"bw-text-gray-500"},`${e.length}`," Selected"),e.map((e=>t.createElement(a.Badge,{variant:"fill",color:"base",className:"bw-gap-2 bw-text-sm"},e))))}),[E,v,b]),_=o.useMemo((()=>"manager"!==u||null===b||0===w.filter((e=>!e.unavailable_services.includes(b.service_id))).length),[u,b,w]);return t.createElement(a.FormItem,{className:"bw-col-span-full",label:"Service Extras",tooltip:"Add extra items to the booking detail"},t.createElement(p.Form.Item,{hidden:!0,name:[...n,"extraBookingItems"]},t.createElement(V,null)),t.createElement(a.Popover,null,t.createElement(a.ComboboxTrigger,{withStatus:!1,disabled:_},t.createElement("span",{className:"bw-inline-flex bw-gap-1 bw-overflow-x-auto",style:{scrollbarWidth:"none",msOverflowStyle:"none",scrollbarColor:"transparent transparent"}},f),t.createElement(a.ComboboxIcon,null)),t.createElement(a.PopoverPortal,null,t.createElement(a.PopoverContent,{className:"bw-flex bw-w-[var(--radix-popover-trigger-width)] bw-min-w-[24rem] bw-flex-col bw-gap-2",side:"bottom",align:"start"},t.createElement("div",{className:"bw-grid bw-grid-cols-1 bw-gap-2 bw-px-2"},null!==b&&void 0!==v&&E.map((e=>t.createElement("div",{className:"bw-grid bw-cursor-pointer bw-grid-cols-2 bw-items-center bw-gap-2",key:e.extra_id,onClick:()=>(e=>{let t=[...v];void 0===t.find((t=>t.id===e.extra_id))?t.push({id:e.extra_id,title:e.name,unitPrice:e.price,quantity:1,amount:e.price}):t=t.filter((t=>t.id!==e.extra_id)),g(t)})(e)},t.createElement("div",{className:"bw-flex bw-items-center"},t.createElement(r.Check,{className:a.cx("bw-mr-2 bw-h-4 bw-w-4 bw-flex-none",void 0!==v.find((t=>t.id===e.extra_id))?"bw-opacity-100":"bw-opacity-0")}),t.createElement(a.Label,null,e.name)),t.createElement("div",{className:"bw-flex bw-justify-end"},t.createElement(c,{quantity:x(e.extra_id),decrement:()=>function(e){let t=[...v];const a=t.findIndex((t=>t.id===e.extra_id));if(-1!==a){const r=t[a].quantity;r>1?t[a].quantity=r-1:1===r&&(t=t.filter((t=>t.id!==e.extra_id))),g(t)}}(e),increment:()=>function(e){const t=[...v],a=t.findIndex((t=>t.id===e.extra_id));if(-1!==a){const r=t[a].quantity;r<e.quantity.max&&(t[a].quantity=r+1)}else t.push({id:e.extra_id,title:e.name,unitPrice:e.price,quantity:1,amount:e.price});g(t)}(e)}))))))))))}function K(){const{selectedService:e,hasMultipleBookings:a}=s.useSelectedService(),r=s.useBookingsValue();return!a&&1===r.length||!e?t.createElement(j,{name:["bookings",0]}):null}e.queryClient.prefetchQuery({queryKey:["extras"],queryFn:async()=>(await I()).data}),l.booksterHooks.addFilter(l.HOOK_NAMES.router.managerRouter,"bookster-extra-options",(e=>(e.push({path:"services/extras",element:t.createElement(L,null)}),e))),l.booksterHooks.addFilter(l.HOOK_NAMES.layout.ManagerMenuSubItems_+"services","bookster-extra-options",(r=>[...r,t.createElement(e.NavLink,{to:"/services/extras",className:"bw-no-underline"},(({isActive:e})=>t.createElement(a.SidebarMenuSubButton,{isActive:e},n.__("Service Extras","bookster-extra-options"))))])),l.booksterHooks.addFilter(l.HOOK_NAMES.adminApptForm.AdditionalBookingFields,"bookster-extra-options",((e,a)=>[...e,t.createElement(j,{name:a})]),20),l.booksterHooks.addFilter(l.HOOK_NAMES.adminApptForm.AfterService,"bookster-extra-options",(e=>[...e,t.createElement(K,null)]),20),l.booksterHooks.addFilter(l.HOOK_NAMES.adminApptForm.initFormValues,"bookster-extra-options",((e,t)=>{const a=(null==t?void 0:t.bookings)||[];return{...e,bookings:e.bookings.map((e=>{const t=a.find((t=>t.customer_id===e.customer_id));return{...e,extraBookingItems:(null==t?void 0:t.extraBookingItems)||[]}}))}})),l.booksterHooks.addFilter(l.HOOK_NAMES.adminApptForm.initBookingValues,"bookster-extra-options",(e=>({...e,extraBookingItems:[]}))),l.booksterHooks.addAction(l.HOOK_NAMES.adminApptForm.doChangeService,"bookster-extra-options",(e=>{1===e.getFieldValue("bookings").length&&e.setFieldValue(["bookings",0,"extraBookingItems"],[])})),l.booksterHooks.addFilter(l.HOOK_NAMES.adminApptForm.detailsReloadBookingValue,"bookster-extra-options",((t,a,r)=>{const n=r.extraBookingItems;if(void 0===n||0===n.length)return t;const o=e.queryClient.getQueryData(["extras"]);return n.forEach((a=>{if(void 0!==a.id){const r=null==o?void 0:o.find((e=>e.extra_id===a.id));r&&t.items.push({id:e.genUniqueId(),title:r.name,quantity:a.quantity,unitPrice:m.Decimal.fromNumber(r.price),amount:m.ZERO})}})),t})),l.booksterHooks.addFilter(l.HOOK_NAMES.adminApptForm.prepareBookingsInput,"bookster-extra-options",((e,t)=>e.map((e=>{const a=t.bookings.find((t=>t.customer_id===e.customer_id));return void 0===(null==a?void 0:a.extraBookingItems)?{...e,extraBookingItems:[]}:{...e,extraBookingItems:a.extraBookingItems}})))),l.booksterHooks.addFilter(l.HOOK_NAMES.customize.initialPreviewConfig,"bookster-extra-options",(e=>{const t=e.process.steps.map((e=>"service"===e.name?{...e,acts:[...e.acts,i.selectExtras]}:e));return{...e,process:{...e.process,steps:t}}}),30),l.booksterHooks.addFilter(l.ADDON_PROCESS_HOOKS_NAME.bookingForm.serviceActHidden,"bookster-extra-options",((t,a,r)=>a!==i.selectExtras?t:!!(e.queryClient.getQueryData(["extras"])??[]).filter((e=>e.activated)).every((e=>!e.unavailable_services.includes(r.service_id)))||t));1 import{_ as e,a as t,b as a,c as r,r as n,d as o,E as s,g as l,u as i,e as c,l as m,f as u}from"./loadExtraBooking-BwOyuAjL.js";const d=e.createStore()(e.immer(e.devtools((e=>({selectedRow:void 0,openExtraDrawer:!1,newExtra:()=>{e((e=>{e.openExtraDrawer=!0}))},editExtra:async t=>{e((e=>{e.selectedRow=t,e.openExtraDrawer=!0}))},closeExtraDrawer:()=>{e((e=>{e.selectedRow=void 0,e.openExtraDrawer=!1}))}})))));function b({className:n,...o}){const[s,l]=e.useSearchParams(),i=s.get("keywords");return React.createElement("div",{className:t.clsx("bw:relative",n)},React.createElement(t.InputPrefix,null,React.createElement(a.Search,null)),React.createElement(t.Input,{size:"medium",className:"bw:ps-10",withStatus:!1,value:i??"",onChange:e=>{const t=e.target.value??"";var a;a=t,l((e=>(e.set("keywords",a),e)))},placeholder:r.__("Search","bookster"),...o}))}function w({className:o,...s}){const[l,i]=n.useState(!1),[c,m]=e.useSearchParams(),u=c.get("status"),d=e=>{m(void 0===e||e===u?e=>(e.delete("status"),e):t=>(t.set("status",e),t))};return React.createElement(t.Combobox,{open:l,onOpenChange:i},React.createElement(t.ComboboxTrigger,{size:"medium",withStatus:!1,className:t.clsx("bw:w-auto bw:gap-2 bw:rounded-base bw:border-dashed bw:border-gray-500/30 bw:bg-gray-50 bw:pe-[3px] bw:ps-2 bw:text-sm",o),...s},React.createElement(a.Circle,{className:"bw:text-gray-500 h-2 w-2"}),React.createElement("span",{className:"bw:pl-[2px] bw:pr-1 bw:text-gray-500"},"Status"),u&&React.createElement(t.Separator,{orientation:"vertical",className:"bw:mr-1.5 bw:h-[14px] bw:bg-gray-500/15"}),"active"===u&&React.createElement(t.Badge,{variant:"outline",color:"success",size:"large",className:"bw:h-[26px] bw:text-xs"},r.__("Active","bookster-extra-options"),React.createElement(a.X,{className:"bw:ml-2 bw:h-2 bw:w-2 bw:text-gray-500/20 bw:hover:text-error",strokeWidth:"3",onClick:e=>{e.stopPropagation(),d(void 0)}})),"inactive"===u&&React.createElement(t.Badge,{variant:"outline",color:"error",size:"large",className:"bw:h-[26px] bw:text-xs"},r.__("Inactive","bookster-extra-options"),React.createElement(a.X,{className:"bw:ml-2 bw:h-2 bw:w-2 bw:text-gray-500/20 bw:hover:text-error",strokeWidth:"3",onClick:e=>{e.stopPropagation(),d(void 0)}}))),React.createElement(t.ComboboxPortalContent,{className:"bw:w-[10rem] bw:p-0 bw:shadow-md",side:"bottom",align:"start"},React.createElement(t.Command,{loop:!0},React.createElement(t.CommandList,null,React.createElement(t.CommandEmpty,null,r.__("No results found.","bookster-extra-options")),React.createElement(t.CommandGroup,{className:"bw:[&_[cmdk-item]]:pl-5"},React.createElement(t.ComboboxItem,{value:"active",isActive:"active"===u,onSelect:()=>d("active")},r.__("Active","bookster-extra-options"),React.createElement(t.ComboboxItemIcon,null)),React.createElement(t.ComboboxItem,{value:"inactive",isActive:"inactive"===u,onSelect:()=>d("inactive")},r.__("Inactive","bookster-extra-options"),React.createElement(t.ComboboxItemIcon,null)))))))}function x(){const e=d((e=>e.newExtra));return React.createElement("div",{className:"bw:mb-2.5 bw:flex bw:flex-nowrap bw:items-center bw:gap-4 bw:px-6"},React.createElement(w,null),React.createElement(b,{className:"bw:ms-auto bw:w-72 bw:min-w-44 bw:shrink"}),React.createElement(t.Button,{variant:"outline",size:"medium",onClick:()=>e(),className:"bw:border-gray-300 bw:bg-white bw:font-medium bw:text-gray-900"},React.createElement(a.Plus,{strokeWidth:"2",className:"bw:h-2.5 bw:w-2.5"}),r.__("New Extra","bookster-extra-options")))}var p,v,g=v?p:(v=1,p=booksterModules.antd);function E(){const e=window.booksterPublicData.generalSettings.time_slot_step%60;return 0===e?60:e>0&&e<=30?e:e>30&&e<60?e%30:5}function f({onDelete:e,disabled:o}){const[s,l]=n.useState(!1);return React.createElement(t.Popover,{open:s,onOpenChange:l},React.createElement(t.PopoverTrigger,{asChild:!0},React.createElement(t.Button,{key:"more",variant:"trivial",size:"icon",className:"bw:me-auto bw:h-9 bw:w-9",tabIndex:-1,disabled:o},React.createElement(a.Trash,null))),React.createElement(t.ConfirmPopoverContent,{className:"bw:z-[100]"},React.createElement(a.AlertFilled,{className:"bw:text-error"}),React.createElement(t.ConfirmPopoverTitle,null,r.__("Delete Extra","bookster-extra-options")),React.createElement(t.ConfirmPopoverDescription,null,r.__("This action cannot be undone. This will permanently delete this extra.","bookster-extra-options")),React.createElement(t.ConfirmPopoverActions,null,React.createElement(t.PopoverClose,{asChild:!0},React.createElement(t.Button,{variant:"soft"},r.__("Cancel","bookster-extra-options"))),React.createElement(t.Button,{variant:"fill",onClick:e},r.__("Confirm Delete","bookster-extra-options")))))}function _({children:e,className:a,...r}){return React.createElement("div",{className:t.cx("btr-scrollbar-sm bw:mb-16 bw:grow bw:overflow-y-auto",a),...r},e)}function h({children:e,className:a,...r}){return React.createElement("div",{className:t.cx("bw:absolute bw:bottom-[65px] bw:left-0 bw:flex bw:h-14 bw:w-full bw:items-center bw:gap-2 bw:bg-white bw:px-5 bw:shadow-[0px_-2px_10px_rgba(0,0,0,0.04)] bw:[&>label]:text-sm",a),...r},e)}function R({children:e,className:a,...r}){return React.createElement("div",{className:t.cx("bw:flex bw:h-9 bw:items-center bw:rounded-base bw:border bw:border-gray-100 bw:px-2.5 bw:text-sm",a),...r},e)}function y({children:e,className:a,...r}){return React.createElement("div",{className:t.cx("bw:rounded-base",a),...r},e)}function k({children:e,className:a,...r}){return React.createElement("div",{className:t.cx("bw:p-2.5 bw:bg-[#F4F5F9] bw:rounded-sm bw:mb-1 bw:flex bw:items-center bw:justify-between bw:gap-2 bw:font-medium bw:uppercase bw:text-gray-500 bw:[&>[role=checkbox]]:flex-none bw:[&>label]:grow bw:[&>label]:cursor-pointer bw:[&>label]:text-xs",a),...r},e)}function N({children:e,className:a,...r}){return React.createElement("div",{...r},React.createElement("div",{className:t.cx("bw:flex bw:flex-col bw:gap-y-1 bw:pb-4",a)},e))}function S({children:e,className:a,...r}){return React.createElement("label",{className:t.cx("bw:flex bw:h-[34px] bw:cursor-pointer bw:items-center bw:gap-2 bw:rounded-sm bw:text-gray-900 bw:duration-300 bw:hover:bg-gray-50 bw:[&_[role=checkbox]]:flex-none bw:[&_span]:truncate bw:[&_span]:text-sm",a),...r},e)}function C({children:e,className:a,...r}){return React.createElement(t.Button,{size:"small",variant:"outline",className:t.cx("bw:flex bw:h-[60px] bw:w-full bw:items-center bw:justify-center bw:rounded-base bw:border-dashed bw:border-gray-300 bw:bg-gray-50 bw:text-sm bw:text-gray-900 bw:[&_img]:duration-200 bw:[&_img]:hover:scale-125 bw:[&_span]:duration-200 bw:[&_span]:hover:translate-x-1 bw:[&_span]:hover:text-primary",a),...r},e)}function F({children:e,className:a,...r}){return React.createElement("div",{className:t.cx("bw:mt-[10px] bw:flex bw:h-5 bw:w-full bw:items-center bw:justify-start bw:gap-2 bw:rounded-base bw:border bw:border-gray-300 bw:object-cover bw:px-2 bw:py-[18px] bw:text-sm bw:[&_img]:block bw:[&_img]:h-[24px] bw:[&_img]:w-[34px] bw:[&_img]:rounded-xs bw:[&_img]:object-cover bw:[&_span]:truncate bw:[&_svg]:ms-auto bw:[&_svg]:h-4 bw:[&_svg]:w-4 bw:[&_svg]:flex-none bw:[&_svg]:cursor-pointer bw:[&_svg]:text-gray-500 bw:hover:[&_svg]:text-error",a),...r},e)}function A({formNamePrefix:a,service:r,className:n}){if(!r.service_id)return null;const o=g.Form.useFormInstance(),s=g.Form.useWatch(a,o),l=void 0===s||!s.includes(r.service_id);return React.createElement(S,{className:t.cx("bw:p-2.5 bw:flex bw:justify-between",n),htmlFor:`service-${r.service_id}`},React.createElement("div",{className:"bw:flex bw:items-center bw:gap-2"},React.createElement(t.Checkbox,{id:`service-${r.service_id}`,size:"small",checked:l,onCheckedChange:e=>function(e){const t=[...o.getFieldValue(a)];void 0!==t&&(e?o.setFieldValue(a,t.filter((e=>e!==r.service_id))):o.setFieldValue(a,[...t,r.service_id]))}("indeterminate"!==e&&e)}),React.createElement("span",{className:"bw:text-sm"},r.name)),React.createElement("div",{className:"bw:text-right bw:text-[#677080] bw:text-sm"},e.formatPrice(r.price)))}function I({formNamePrefix:e,category:a}){const r=g.Form.useFormInstance(),o=g.Form.useWatch(e,r),s=n.useMemo((()=>{if(!o||0===o.length)return{checkAll:!0,indeterminate:!1};const e=a.services.filter((e=>e.service_category_id===a.service_category_id)).map((e=>e.service_id)),t=e.every((e=>o.includes(e)));return{checkAll:!t,indeterminate:e.some((e=>o.includes(e)))&&!t}}),[o]);return React.createElement(React.Fragment,null,React.createElement(t.Checkbox,{id:`category-${a.service_category_id}`,checked:s.indeterminate?"indeterminate":s.checkAll,onClick:()=>(t=>{const a=t.services.filter((e=>e.service_category_id===t.service_category_id)).map((e=>e.service_id));if(s.checkAll&&!s.indeterminate){const t=[...o];t.push(...a),r.setFieldValue(e,t)}else{const t=o.filter((e=>!a.includes(e)));r.setFieldValue(e,t)}})(a),size:"small"}),React.createElement(t.Label,{htmlFor:`category-${a.service_category_id}`},a.name))}function M({formNamePrefix:o}){const[s,l]=n.useState(""),i=e.useActiveServices(),c=g.Form.useFormInstance(),m=g.Form.useWatch(o,c),{selected:u,total:d}=n.useMemo((()=>{const e=i.reduce(((e,t)=>e+t.services.length),0);return{selected:e-((null==m?void 0:m.length)||0),total:e}}),[m,i]),b=i.some((e=>e.services.some((t=>D(t.name,e.name,s)))));return React.createElement(React.Fragment,null,React.createElement("div",{className:"bw:relative"},React.createElement(t.InputPrefix,{className:"bw:opacity-100"},React.createElement(a.Search,{className:"bw:text-gray-500"})),React.createElement(t.Input,{size:"medium",className:"bw:h-9 bw:ps-10",withStatus:!1,onChange:e=>{l(e.target.value)},placeholder:r.__("Search","bookster-extra-options")})),React.createElement("p",{className:"bw:my-4 bw:text-xs bw:italic bw:text-gray-500"},r.__("Selected services","bookster-extra-options"),": ",u,"/",d),React.createElement(_,{className:"bw:-mx-2.5"},!b&&React.createElement(R,null,r.__("No services found.","bookster-extra-options")),b&&React.createElement(y,null,i.map((e=>{const a=e.services.some((t=>D(t.name,e.name,s)));return React.createElement("div",{className:a?"":"bw:hidden",key:e.service_category_id},React.createElement(k,null,React.createElement(I,{formNamePrefix:o,category:e})),React.createElement(N,null,e.services.map((a=>React.createElement(A,{className:t.cx(!D(a.name,e.name,s)&&"bw:hidden"),key:a.service_id,service:a,formNamePrefix:o})))))})))))}function D(e,t,a){return e.toLowerCase().includes(a.toLowerCase())||t.toLowerCase().includes(a.toLowerCase())}function P({value:o,onChange:s,formNamePrefix:l,allLabel:i}){const c=o??[],m=e.useActiveServices(),u=n.useMemo((()=>{const e=[];return m.forEach((t=>{t.services.forEach((a=>{a.service_category_id===t.service_category_id&&e.push(a.service_id)}))})),e}),[m]),d=n.useMemo((()=>{if(!c||0===c.length)return{checkAll:!0,indeterminate:!1};const e=u.every((e=>c.includes(e)));return{checkAll:!e,indeterminate:u.some((e=>c.includes(e)))&&!e}}),[c]);return React.createElement(React.Fragment,null,React.createElement(M,{formNamePrefix:l}),React.createElement(h,null,React.createElement(t.Checkbox,{id:"check-all-services",checked:d.indeterminate?"indeterminate":d.checkAll,onClick:()=>{if(d.checkAll&&!d.indeterminate){const e=[...c];e.push(...u),null==s||s(e)}else{const e=c.filter((e=>!u.includes(e)));null==s||s(e)}}}),React.createElement(t.Label,{className:"bw:cursor-pointer bw:text-sm",htmlFor:"check-all-services"},i),React.createElement(t.Tooltip,{content:r.__("Available only apply to Customer Booking Form. For Manager, there is no restriction.","bookster-extra-options")},React.createElement(a.HelpCircle,{className:"bw:h-2.5 bw:w-2.5 bw:text-gray-500"}))))}function O(){return React.createElement(g.Form.Item,{name:["unavailable_services"],noStyle:!0},React.createElement(P,{formNamePrefix:["unavailable_services"],allLabel:"Select all"}))}function T({value:a,onChange:r,...n}){const o=a??0;return React.createElement(t.InputNumber,{max:1e8,min:0,step:5,formatter:(t,{userTyping:a,input:r})=>void 0===t?"":!0===a?r:e.formatPrice(t),parser:t=>{if(void 0===t)return 0;let a=null==t?void 0:t.replace(new RegExp(`[^\\d${e.DECIMAL_SEPARATOR}]`,"g"),"");return a=null==a?void 0:a.replace(e.DECIMAL_SEPARATOR,"."),parseFloat(a)},value:o,onChange:e=>{r&&r(e)},"data-negative":o<0,...n})}function B(e){const{defaultId:o,defaultSrc:s}=e,[l,i]=t.useControllableValue(e,{}),[c,m]=n.useState(s),u=null!=l&&o===l?s:c;return React.createElement(React.Fragment,null,React.createElement(C,{onClick:()=>{if(e="upload_files",!function(){const e=window.booksterMeta.auth.wpUserInfo;return e.isLoggedIn?e.caps:[]}().includes(e))return;var e;const t=window.wp.media.frames.downloadable_file=window.wp.media({title:"Choose an image",frame:"select",multiple:!1});t.on("select",(function(){const e=t.state().get("selection").first().toJSON(),a=e.sizes.full||e.sizes.thumbnail;i(+e.id),m(a.url)})),t.open()}},React.createElement("img",{src:window.booksterMeta.appPath.bookster.assets+"/images/figures/upload-img.svg"}),React.createElement("span",null,r.__("Upload Image","bookster-extra-options"))),u&&React.createElement(F,null,React.createElement("img",{src:u,alt:r.__("Image Selected","bookster-extra-options")}),React.createElement("span",null,u.split("/").pop()||""),React.createElement(a.MinusCircle,{onClick:e=>{e.stopPropagation(),i(null),m(void 0)}})))}function H(){const e=d((e=>e.selectedRow));return React.createElement(React.Fragment,null,React.createElement(g.Form.Item,{name:"cover_id",noStyle:!0},React.createElement(B,{defaultId:(null==e?void 0:e.cover_id)??void 0,defaultSrc:(null==e?void 0:e.transient_cover_url)??void 0})),React.createElement(t.FormItem,{name:"name",label:"Extra Name",rules:[{required:!0}],className:"bw:pt-3"},React.createElement(t.Input,{placeholder:r.__("Enter Extra Name","bookster-extra-options"),autoFocus:!0})),React.createElement("div",{className:"bw:grid bw:grid-cols-2 bw:gap-x-5 bw:sm:grid-cols-3"},React.createElement("div",null,React.createElement(g.Form.Item,{name:"duration",label:"Extra Duration",rules:[{required:!0}]},React.createElement(t.InputNumber,{min:0,className:"bw:w-full",formatter:e=>`${e||0} mins`,parser:e=>null==e?void 0:e.replace(/\D/g,""),step:Math.min(E(),15)}))),React.createElement("div",null,React.createElement(g.Form.Item,{name:"price",label:"Extra Price",rules:[{required:!0}]},React.createElement(T,{className:"bw:w-full"}))),React.createElement("div",null,React.createElement(t.FormItem,{name:["quantity","max"],label:"Quantity",rules:[{required:!0},{validator:function(e,t){return null==t||t>0?Promise.resolve():Promise.reject("Extra Max Quantity must be greater than 0")}}],tooltip:r.__("Maximum quantity of extra that can be added to the cart.","bookster-extra-options")},React.createElement(t.InputNumber,{min:0,precision:0,step:1,className:"bw:w-full"})))),React.createElement(t.FormItem,{name:"description",label:r.__("Description","bookster-extra-options")},React.createElement(t.Textarea,{rows:2,placeholder:r.__("Please enter Extra description","bookster-extra-options"),maxLength:150})),React.createElement("div",{className:"bw:mb-3 bw:mt-2 bw:rounded-base bw:border bw:p-4"},React.createElement("div",{className:"bw:flex bw:items-center bw:gap-4 bw:leading-none"},React.createElement("div",{className:"bw:me-auto"},React.createElement(t.Label,{htmlFor:"activated",className:"bw:cursor-pointer bw:text-sm bw:leading-none bw:text-gray-900"},r.__("Active","bookster-extra-options")),React.createElement(t.Tooltip,{content:r.__("Deactivate Service Extra to avoid Deleting referencing Appointment, Analytics Data in the past.","bookster-extra-options"),side:"right"},React.createElement(a.HelpCircle,{className:"bw:ms-1 bw:h-3 bw:w-3 bw:text-gray-500"})),React.createElement("p",{className:"bw:mt-2 bw:text-xs bw:leading-none bw:text-gray-500"},r.__("The Service Extra is available for booking.","bookster-extra-options"))),React.createElement(t.Separator,{orientation:"vertical"}),React.createElement(g.Form.Item,{label:"Active",name:"activated",valuePropName:"checked",rules:[{required:!0}],trigger:"onCheckedChange",noStyle:!0},React.createElement(t.Switch,{id:"activated"})))))}async function q(t){return await e.api.post("extras",{json:t}).json()}async function L(t){return await e.api.delete(`extras/${t}`).json()}async function z(t){return await e.api.delete("extras/bulk-action",{json:{ids:t}}).json()}async function j(){return await e.api.get("extras/public").json()}t.stylex.div("bw:h-[calc(100vh-13rem)] bw:flex-none bw:rounded-s-md bw:border-r bw:border-solid bw:border-gray-100 bw:bg-white bw:p-5 bw:max-xl:w-64 bw:xl:w-56 bw:xl:p-4 bw:2xl:w-64"),t.stylex.div("bw:relative bw:me-auto bw:overflow-y-auto bw:h-[calc(100vh-13rem)]"),t.stylex.div("bw:relative bw:me-auto bw:grid bw:grid-cols-1 bw:gap-5 bw:overflow-y-auto bw:xl:grid-cols-2 bw:xl:gap-4 bw:2xl:grid-cols-[5fr,4fr]"),t.stylex.div("bw:h-[calc(100vh-13rem)] bw:overflow-y-auto bw:rounded-e-md bw:bg-white bw:flex bw:flex-col"),t.stylex.div("bw:px-5 bw:pt-5 bw:mb-7"),t.stylex.div("btr-scrollbar-sm bw:overflow-y-auto bw:overflow-x-hidden bw:px-5 bw:pb-5"),t.stylex.div("bw:h-[calc(100vh-13rem)] bw:overflow-y-auto bw:overflow-x-hidden bw:hidden bw:rounded-md bw:bg-white bw:xl:block"),n.createContext(void 0),t.stylex.p("bw:text-xs bw:text-gray-900 bw:font-medium bw:uppercase"),t.stylex.div("bw:flex bw:flex-col bw:gap-0.5 bw:py-1 bw:mb-3"),t.stylex.div("bw:w-[3px] bw:h-[11px] bw:bg-primary"),t.stylex.h4("bw:mb-2 bw:text-sm bw:leading-none bw:font-medium bw:text-gray-900 bw:uppercase bw:flex bw:items-center bw:gap-2");const V=[];function K(){const a=d((e=>e.openExtraDrawer)),r=d((e=>e.closeExtraDrawer)),{selectedExtra:o,createExtraMutation:s,updateExtraMutation:l,deleteExtraMutation:i,isFormLoading:c}=function(){const t=d((e=>e.selectedRow)),a=e.useQueryClient(),{data:r,refetch:o}=e.useQuery({queryKey:["extra",{id:null==t?void 0:t.extra_id}],queryFn:async()=>{if(!(null==t?void 0:t.extra_id))return null;const e=await j();return a.setQueryData(["extras"],e.data),e.data.find((e=>e.extra_id===(null==t?void 0:t.extra_id)))},initialData:t??null});n.useEffect((()=>{(null==t?void 0:t.extra_id)&&o()}),[null==t?void 0:t.extra_id]);const s=e.useMutation({mutationFn:q,onSuccess:e=>{a.setQueryData(["extras"],e.data)}}),l=e.useMutation({mutationFn:({id:t,values:a})=>async function(t,a){return await e.api.patch(`extras/${t}`,{json:a}).json()}(t,a),onSuccess:e=>{const r=null==e?void 0:e.data.find((e=>e.extra_id===(null==t?void 0:t.extra_id)));a.setQueryData(["extra",{id:null==r?void 0:r.extra_id}],r),a.setQueryData(["extras"],e.data)}}),i=e.useMutation({mutationFn:L,onSuccess:e=>{a.setQueryData(["extras"],e.data)}});return{selectedExtra:r,createExtraMutation:s,updateExtraMutation:l,deleteExtraMutation:i,isFormLoading:s.isLoading||l.isLoading||i.isLoading}}(),[m]=g.Form.useForm();return n.useEffect((()=>{if(a){m.resetFields();const e=o?function(e){var t,a;const r="disable"===(null==(t=e.quantity)?void 0:t.activated)?1:e.quantity.max,n=null==(a=e.unavailable_services)?void 0:a.filter((e=>Number.isInteger(e)));return{...e,quantity:{max:r},unavailable_services:n}}(o):{name:"",activated:!0,transient_cover_url:"",quantity:{max:1},price:40,duration:E(),unavailable_services:[],description:""};m.setFieldsValue(e)}}),[a,o]),React.createElement(t.Drawer,{open:a,onOpenChange:e=>{e||r()}},React.createElement(t.DrawerPortalContent,null,React.createElement(t.DrawerHeader,null,React.createElement(t.DrawerTitle,null,a?o?"Edit Service Extra":"New Service Extra":"Closing"),React.createElement(t.DrawerCloseIcon,null)),React.createElement(t.DrawerBody,null,React.createElement(t.LoadingOverlay,{loading:c}),React.createElement(g.Form,{form:m,disabled:c,layout:"vertical",scrollToFirstError:!0,onFinish:a=>{!async function(a){try{(null==o?void 0:o.extra_id)?await l.mutateAsync({id:o.extra_id,values:a}):await s.mutateAsync(a),t.toast.success("Extra has been Saved Successfully!"),r()}catch(n){t.toast.error(await e.getErrorMsg(n))}}(a)}},React.createElement(t.Tabs,{defaultValue:"general"},React.createElement(t.TabsList,{"aria-label":"tabs settings",className:"bw:-mt-1"},React.createElement(t.CompactLineTabsTrigger,{value:"general"},"General"),React.createElement(t.CompactLineTabsTrigger,{value:"available"},"Available")),React.createElement(t.TabsContent,{value:"general"},React.createElement(H,null)),React.createElement(t.TabsContent,{value:"available"},React.createElement(O,null))),React.createElement("button",{type:"submit",className:"bw:hidden"}))),React.createElement(t.DrawerFooter,null,o?React.createElement(f,{disabled:c,onDelete:async function(){if(null==o?void 0:o.extra_id)try{await i.mutateAsync(o.extra_id),t.toast.success("Service Extra has been Deleted Successfully!"),r()}catch(a){t.toast.error(await e.getErrorMsg(a))}}}):null,React.createElement(t.DrawerClose,{asChild:!0},React.createElement(t.Button,{key:"back",tabIndex:-1,variant:"soft",size:"large",className:"bw:min-w-[7rem]",onClick:r},"Cancel")),React.createElement(t.Button,{key:"submit",disabled:c,onClick:()=>m.submit(),size:"large",className:"bw:min-w-[7rem]"},"Save"))))}const Q=n.forwardRef((({className:r,...o},s)=>{const[l,i]=n.useState("idle"),c=e.useIsMutating({mutationKey:["extras"]})>0;return t.useUpdateEffect((()=>{if(!c){i("saved");const e=setTimeout((()=>{i("idle")}),1e3);return()=>clearTimeout(e)}i("pending")}),[c]),React.createElement("span",{className:t.cx("bw:ms-3 bw:inline-flex bw:items-center bw:gap-2 bw:text-base bw:font-normal bw:text-gray-500","saved"===l&&"bw:text-success",r),...o,ref:s},"idle"===l&&null,"saved"===l&&React.createElement(React.Fragment,null,React.createElement(a.CheckCircle,null)," Saved"),"pending"===l&&React.createElement(React.Fragment,null,React.createElement(a.Loader2,{className:"bw:animate-spin"})," Saving..."))}));function W(){return React.createElement("div",{className:"bw:my-4 bw:flex bw:flex-wrap bw:items-center bw:gap-3 bw:px-6 bw:capitalize"},React.createElement("h2",{className:"bw:flex bw:flex-auto bw:items-center bw:text-xl bw:font-medium bw:leading-8"},r.__("Services extra","bookster-extra-options"),React.createElement(Q,null)))}function $({ids:o}){const{toast:s}=t.useToast(),l=e.useQueryClient(),[i,c]=n.useState(!1),m=e.useIsMutating({mutationKey:["extras"]}),u=e.useMutation({mutationKey:["extras",o,"delete"],mutationFn:z,onSuccess:()=>{l.invalidateQueries({queryKey:["extra"]}),l.invalidateQueries({queryKey:["extras"]})}});return React.createElement(t.Popover,{open:i,onOpenChange:c},React.createElement(t.PopoverTrigger,{asChild:!0},React.createElement(t.Button,{color:"error",variant:"link"},u.isLoading?React.createElement(a.Loader2,{className:"bw:h-4 bw:w-4 bw:animate-spin"}):React.createElement(a.Trash,{className:"bw:h-4 bw:w-4"}),r.__("Delete Data","bookster-extra-options"))),React.createElement(t.ConfirmPopoverContent,null,React.createElement(a.AlertFilled,{className:"bw:text-error"}),React.createElement(t.ConfirmPopoverTitle,null,r.__("Delete Multiple Services Extra","bookster-extra-options")),React.createElement(t.ConfirmPopoverDescription,null,r.sprintf(r.__("This action cannot be undone. This will permanently delete %s extras.","bookster-extra-options"),o.length)),React.createElement(t.ConfirmPopoverActions,null,React.createElement(t.PopoverClose,{asChild:!0},React.createElement(t.Button,{variant:"soft"},r.__("Cancel","bookster-extra-options"))),React.createElement(t.Button,{variant:"fill",onClick:async function(){if(o&&0!==o.length&&!m)try{await u.mutateAsync(o),c(!1),s.success("Extra Rows has been Deleted Successfully!")}catch(t){s.error(await e.getErrorMsg(t))}}},r.__("Confirm Delete","bookster-extra-options")))))}const U=e.createColumnHelper(),G=[U.accessor("extra_id",{id:"select",size:56,header:({table:e})=>React.createElement(t.TableCheckboxWrapper,null,React.createElement(t.Checkbox,{checked:e.getIsAllRowsSelected(),onClick:e.getToggleAllPageRowsSelectedHandler()})),cell:({row:e})=>React.createElement(t.TableCheckboxWrapper,null,React.createElement(t.Checkbox,{checked:e.getIsSelected(),onClick:e.getToggleSelectedHandler()}))}),U.accessor("name",{id:"name",header:()=>r.__("Name Service","bookster-extra-options"),cell:({row:e})=>React.createElement("div",{className:"bw:flex bw:items-center bw:gap-1.5"},React.createElement(t.Avatar,{className:"bw:h-[30px] bw:w-[32px] bw:rounded-xs"},React.createElement(t.AvatarImage,{src:e.original.transient_cover_url}),React.createElement(t.AvatarFallback,{className:"bw:rounded-xs"},React.createElement(a.Box,null))),e.original.name),filterFn:(e,t,a)=>!a||e.original.name.toLowerCase().includes(a.toLowerCase())}),U.accessor("duration",{header:()=>r.__("Duration","bookster-extra-options"),cell:({row:e})=>`${e.original.duration} mins`}),U.accessor("quantity",{header:()=>r.__("Quantity","bookster-extra-options"),cell:({row:e})=>{const t=e.original.quantity;return"disable"===(null==t?void 0:t.activated)||1===(null==t?void 0:t.max)?1:`1~${t.max}`}}),U.accessor("price",{header:()=>r.__("Price","bookster-extra-options"),cell:({row:t})=>{const a=t.original.price;return a?e.formatPrice(a):"-"}}),U.accessor("activated",{header:()=>r.__("Status","bookster-extra-options"),filterFn:(e,t,a)=>!a||("active"===a?e.original.activated:!e.original.activated),cell:({row:e})=>React.createElement(t.Badge,{variant:"outline",color:e.original.activated?"success":"error",size:"large"},e.original.activated?r.__("Active","bookster-extra-options"):r.__("Inactive","bookster-extra-options"))}),U.accessor("extra_id",{id:"actions",size:40,header:"",cell:()=>React.createElement(t.TableActionWrapper,null,React.createElement(t.Tooltip,{content:r.__("Edit Extra","bookster-extra-options")},React.createElement(t.TableActionLink,null)))})];function J({row:a,disabled:r}){const o=d((e=>e.editExtra)),{setNodeRef:s,attributes:l,listeners:i,isDragging:c,transform:m,transition:u}=e.useSortable({id:a.id,data:{type:"extra",extra:a.original},disabled:r}),b=n.useCallback((e=>{e.stopPropagation(),o(a.original)}),[a.original]),w={position:"relative",transition:u,opacity:c?.8:1,zIndex:c?1:0,transform:e.dndCSS.Transform.toString(m)};return React.createElement(t.TableRow,{isSelected:a.getIsSelected(),className:t.clsx(!r&&"bw:cursor-grab",c&&"bw:cursor-grabbing bw:shadow-xl"),style:w,onClick:b,ref:s,...l,...i},a.getVisibleCells().map((a=>React.createElement(t.TableCell,{key:a.id},e.flexRender(a.column.columnDef.cell,a.getContext())))))}function X(){const[a]=e.useSearchParams(),o=a.get("keywords"),s=t.useDebounce(o,{wait:500}),l=a.get("status"),i=n.useMemo((()=>[{id:"activated",value:l},{id:"name",value:s}]),[l,s]),c=!!l||!!s,m=n.useMemo((()=>[]),[]),[u,d]=n.useState({}),{data:b,isLoading:w}=e.useQuery({queryKey:["extras"],queryFn:async()=>(await j()).data,keepPreviousData:!0}),x=e.useReactTable({data:b||m,columns:G,getRowId:e=>e.extra_id.toString(),getCoreRowModel:e.getCoreRowModel(),getFilteredRowModel:e.getFilteredRowModel(),state:{rowSelection:u,columnFilters:i},onRowSelectionChange:d}),p=n.useMemo((()=>(null==b?void 0:b.map((e=>e.extra_id.toString())))||void 0),[b]);t.useRemoveSelectOnChangeFullList(x,p);const v=e.useMutation({mutationKey:["extras","move"],mutationFn:async t=>{await async function(t){return await e.api.patch("extras",{json:{extraModels:t}}).json()}(t)}}),g=e.useSensors(e.useSensor(e.MouseSensor,{}),e.useSensor(e.TouchSensor,{}),e.useSensor(e.KeyboardSensor,{}),e.useSensor(e.PointerSensor,{activationConstraint:{distance:5}}));return React.createElement(e.DndContext,{sensors:g,collisionDetection:e.closestCenter,modifiers:[e.restrictToVerticalAxis],onDragEnd:async function(a){const{active:r,over:n}=a;if(!(r&&n&&r.id!==n.id&&b&&p))return;const o=p.indexOf(r.id),s=p.indexOf(n.id),l=e.arrayMove(b,o,s);e.queryClient.setQueryData(["extras"],l);try{await v.mutateAsync(l)}catch(i){throw t.toast.error(await e.getErrorMsg(i)),i}}},React.createElement("div",{className:"bw:px-6"},React.createElement(t.Table,null,React.createElement(t.TableHeader,null,React.createElement(t.TableHeadRow,null,x.getLeafHeaders().map((a=>React.createElement(t.TableHead,{key:a.id},e.flexRender(a.column.columnDef.header,a.getContext())))))),React.createElement(t.TableBody,null,React.createElement(e.SortableContext,{disabled:c,items:p||[],strategy:e.verticalListSortingStrategy},x.getRowModel().rows.map((e=>React.createElement(J,{key:e.id,row:e,disabled:c})))),(w||0===(null==b?void 0:b.length))&&React.createElement(t.TableRow,{className:"bw:pointer-events-none"},React.createElement(t.TableCell,{colSpan:100,className:"bw:h-60 bw:justify-center bw:text-center"},React.createElement("span",{className:"bw:text-2xl bw:font-medium bw:text-gray-500"},w?r.__("Loading...","bookster-extra-options"):r.__("No Data Found","bookster-extra-options")))))),React.createElement(t.TableToaster,null,React.createElement(t.TableToast,{open:Object.keys(u).length>0,onOpenChange:e=>{e||x.resetRowSelection()}},React.createElement(t.TableToastClose,null),React.createElement(t.TableToastTitle,null,Object.keys(u).length," ",r.__("Selected","bookster-extra-options")),React.createElement(t.Separator,{orientation:"vertical"}),React.createElement($,{ids:Object.keys(u)})))))}function Z(){return React.createElement("div",{className:"btr-scrollbar-md bw:relative bw:flex bw:h-full bw:flex-col bw:overflow-auto bw:overscroll-none bw:p-0"},React.createElement(W,null),React.createElement(x,null),React.createElement(X,null),React.createElement(K,null))}var Y,ee,te=ee?Y:(ee=1,Y=booksterModules.day);let ae;function re(){var t;if(ae)return ae;const a=le.earliest;if(a.date()<20)return ae=a.startOf("month"),ae;const r={weekly:ie,holiday:ce,dayoff:{}},n=a.month();let o=a.clone();do{if(!(null==(t=e.calculateIsDayOff(o,r))?void 0:t.isDayOff))return ae=o.startOf("month"),ae;o=o.add(1,"day")}while(o.month()===n);return ae=o.startOf("month"),ae}const ne=window.booksterMeta.recordLabels,oe={agent_id:1,wp_user_id:null,avatar_id:null,first_name:"Jeremy",last_name:"Johnson",email:"[email protected]",phone:"+146527879832",activated:!0,visibility:"public",priority:10,weekly_schedule_enabled:!1,weekly_schedule:null,dayoff_schedule_enabled:!1,dayoff_schedule:null,transient_avatar_url:"",transient_gallery_urls:[],wp_user_display_name:"",available_agent_services:[],created_at:"",updated_at:""},se={service_id:1,service_category_id:1,name:r.sprintf(r.__("Booking %(service)s title","bookster"),ne),description:r.sprintf(r.__("Booking %(service)s description","bookster"),ne),activated:!0,visibility:"public",price:"100",duration:60,buffer_before:0,buffer_after:0,position:10,cover_id:1,transient_cover_url:"",transient_gallery_urls:[],available_agent_services:[],weekly_schedule_enabled:!1,weekly_schedule:null,created_at:"",updated_at:""},le=function(){const e=te.dayjs().add(1,"minute").startOf("minute"),t=function(e){const[t,a]=window.booksterPublicData.generalSettings.book_restriction_earliest;if("no_restriction"===t||!a)return e;switch(t){case"minutes":case"hours":return e.add(a,t).startOf("minute");case"days":case"months":case"years":return e.add(a,t).startOf("day");default:return e.add(a,t)}}(e),a=function(e){const[t,a]=window.booksterPublicData.generalSettings.book_restriction_latest;if("no_restriction"===t||!a)return null;switch(t){case"minutes":case"hours":return e.add(a,t).endOf("minute");case"days":case"months":case"years":return e.add(a,t).endOf("day");default:return e.add(a,t)}}(e);return{now:e,earliest:t,latest:a}}(),ie=window.booksterPublicData.scheduleSettings.weekly,ce=window.booksterPublicData.holidaysSettings;function me(e){var t;const a=l(),r=null==(t=e.select.service)?void 0:t.service_id,n=r?a.filter((e=>!e.unavailable_services.includes(r))):a;0!==n.length&&(e.addonExtra.select=n.map((e=>({model:e,isSelected:!1,quantity:0}))))}function ue(){const t=i(),a=c.useBookingConfig(),r=a.process.steps,n=e.usePublicActiveServices(),s=e.usePublicActiveAgents(),l=n.find((e=>e.services.length>0));function m(e){let t=se;l&&l.services.length>0&&(t=l.services[0]),e.select.service=t}function u(e){let t=oe;s.length>0&&(t=s[0]),e.select.agent=t}return{jumpToExtra:function(){t.setState((e=>{!function(e){const t=function(e){const t={process:{current:{stepIndex:0,actIndex:0}},select:{service:null,agent:null,bookDate:null,bookTime:null,contact:null,payOption:null},datetime:{timestamps:le,picker:{bookMonth:re(),bookDate:null,bookTime:null}},booked:{state:"idle",transaction:null,appointment:null,customer:null,preview_code:null},customize:{...window.booksterManagerData?window.booksterManagerData.customizeSettings:window.booksterPublicData.customizeSettings,labels:window.booksterMeta.recordLabels}};return o.booksterHooks.applyFilters(o.HOOK_NAMES.bookingForm.bookingInitState,t,e)}(a);delete t.customize,Object.assign(e,t)}(e),e.addonExtra={select:[]};for(let t=0;t<r.length;t++){const a=r[t];switch(a.name){case"service":m(e),e.process.current.stepIndex=t;const r=a.acts.findIndex((e=>"selectExtras"===e));return e.process.current.actIndex=r??0,void me(e);case"agent":u(e)}o.booksterHooks.doAction(o.HOOK_NAMES.customize.setDemoStepValue,a,e)}}))}}}function de(){const e=c.useBookingStore(),{jumpToExtra:a}=ue(),{run:n}=t.useDebounceFn((t=>{e.setState((e=>{e.customize.content.steps.service.extra||(e.customize.content.steps.service.extra={}),e.customize.content.steps.service.extra.title=t}))}),{wait:100,maxWait:200});return React.createElement("div",{onClick:e=>{e.stopPropagation(),a()}},React.createElement(g.Form.Item,{label:React.createElement("span",{className:"bw:capitalize"},r.__("Extra Title","bookster-extra-options")),name:["customize","content","steps","service","extra","title"]},React.createElement(t.Input,{placeholder:r.__("Service Extras","bookster-extra-options"),maxLength:30,onChange:e=>n(e.target.value)})))}function be({quantity:e,decrement:r,increment:n,maxQuantity:o}){return React.createElement("div",{className:"bw:z-50 bw:flex bw:-space-x-px bw:p-[3px]"},React.createElement(t.Button,{size:"icon",variant:"trivial",className:t.cx("bw:h-[26px] bw:w-[26px] bw:border-none bw:bg-gray-50 bw:text-gray-500 bw:hover:rounded-sm bw:hover:bg-white bw:hover:text-info bw:hover:shadow-sm",0===e&&"bw:opacity-50 bw:hover:bg-gray-50 bw:hover:text-gray-500"),onClick:e=>{e.stopPropagation(),r()},disabled:0===e},React.createElement(a.Minus,{className:"bw:h-2.5 bw:w-2.5"})),React.createElement(t.Input,{readOnly:!0,size:"medium",withStatus:!1,className:t.cx("bw:pointer-events-none bw:h-[26px] bw:w-14 bw:rounded-none bw:border-none bw:text-center",e>0&&"bw:font-semibold bw:text-primary"),value:e}),React.createElement(t.Button,{size:"icon",variant:"trivial",className:t.cx("bw:h-[26px] bw:w-[26px] bw:border-none bw:bg-gray-50 bw:text-gray-500 bw:hover:rounded-sm bw:hover:bg-white bw:hover:text-info bw:hover:shadow-sm",e===o&&"bw:opacity-50 bw:hover:bg-gray-50 bw:hover:text-gray-500"),onClick:e=>{e.stopPropagation(),n()},disabled:e===o},React.createElement(a.Plus,{className:"bw:h-2.5 bw:w-2.5"})))}function we(e){}function xe({name:s}){const[l,i]=n.useState(!1),[m,d]=n.useState(""),b=g.Form.useFormInstance(),{roleMode:w,apptForm:x}=c.useApptFormLogic(),{selectedService:p}=c.useSelectedService(),v=function(){const t=function(){const{data:t}=e.useQuery({queryKey:["extras"],queryFn:async()=>(await j()).data,keepPreviousData:!0});return t||V}();return n.useMemo((()=>t.filter((e=>e.activated))),[t])}(),E=g.Form.useWatch([...s,"extraBookingItems"],b)??[],f=e=>{const t=E.find((t=>t.id===e));return void 0!==t?t.quantity:0};function _(e){return e.filter((e=>R.some((t=>t.extra_id===e.id))))}const h=t=>{var a;a=t,b.setFieldValue([...s,"extraBookingItems"],a),null!==p&&(function(e){const t=x.getFieldsValue(),a=b.getFieldValue(s),r=o.booksterHooks.applyFilters(o.HOOK_NAMES.adminApptForm.detailsReloadBookingValue,{items:[c.makeBasicItem(e)],subtotal:u.ZERO},t,a),n={...a.booking_details,booking:r},l=c.calculateDetails(n);b.setFieldValue([...s,"booking_details","booking"],l.booking),b.setFieldValue([...s,"booking_details","adjustment"],l.adjustment),b.setFieldValue([...s,"booking_details","tax"],l.tax);const i={paid_amount:a.paid_amount,payment_status:a.payment_status},{paid_amount:m,payment_status:d}=c.calculatePayment(i,l.tax.total);b.setFieldValue([...s,"paid_amount"],m),b.setFieldValue([...s,"payment_status"],d)}(p),function(t,a){if(o.booksterHooks.applyFilters(o.ADDON_GROUP_HOOKS_NAME.service.hasMultipleBookings,!1,a))return;let r=0;const n=x.getFieldValue("start_time")?x.getFieldValue("start_time").absMinute:0;t.forEach((e=>{const t=v.find((t=>t.extra_id===e.id));void 0!==t&&(r+=t.duration*e.quantity)})),x.setFieldsValue({end_time:e.bookHelper.booktime.createFromAbsMinute(n+a.duration+r)})}(t,p))},R=n.useMemo((()=>null===p?[]:v.filter((e=>e.name.toLowerCase().includes(m.toLowerCase())))),[v,m,p]),y=n.useMemo((()=>0===R.length?React.createElement("span",{role:"placeholder",className:"bw:ms-3"},r.__("Unavailable extra on current service","bookster-extra-options"),"..."):void 0===E||null===p||0===E.length?React.createElement("span",{role:"placeholder",className:"bw:ms-3"},r.__("Select Service Extras...","bookster-extra-options")):React.createElement("div",{className:"bw:flex bw:h-full bw:flex-nowrap bw:items-center bw:gap-1 bw:overflow-hidden"},E.map((e=>React.createElement(t.Badge,{variant:"outline",color:"info",className:"bw:group/badge bw:h-7 bw:gap-2 bw:rounded-sm bw:text-sm bw:text-gray-900 bw:outline-info/35 bw:transition-colors bw:duration-300 bw:first:ms-1 bw:last:me-1 bw:hover:bg-info bw:hover:text-white/80 bw:hover:outline-transparent"},React.createElement(a.X,{className:"bw:h-2 bw:w-2 bw:flex-none bw:text-gray-500/30 bw:duration-300 bw:hover:!text-error bw:group-hover/badge:text-white/50",strokeWidth:"3",onClick:t=>{t.stopPropagation();const a=v.find((t=>t.extra_id===e.id));a&&(e=>{let t=[...E];void 0===t.find((t=>t.id===e.extra_id))?t.push({id:e.extra_id,title:e.name,unitPrice:e.price,quantity:1,amount:e.price}):t=t.filter((t=>t.id!==e.extra_id)),h(t)})(a)}}),React.createElement("span",{className:"bw:max-w-60 bw:truncate"},e.quantity>1?e.title+" x"+e.quantity:e.title)))))),[R,E,p]),k=n.useMemo((()=>"manager"!==w||null===p||0===v.filter((e=>!e.unavailable_services.includes(p.service_id))).length),[w,p,v]);return React.createElement(React.Fragment,null,React.createElement(g.Form.Item,{hidden:!0,name:[...s,"extraBookingItems"]},React.createElement(we,null)),React.createElement(t.FormItem,{className:"bw:col-span-full bw:overflow-auto",label:"Service Extras",tooltip:"Add extra items to the booking detail"},React.createElement(t.Combobox,{open:l,onOpenChange:i},React.createElement(t.ComboboxTrigger,{className:"bw:ps-0",withStatus:!1,disabled:k},y,React.createElement(t.ComboboxIcon,null)),React.createElement(t.ComboboxPortalContent,{className:"bw:w-[var(--radix-popover-trigger-width)] bw:p-0",side:"bottom"},React.createElement(t.Command,{shouldFilter:!1},React.createElement(t.CommandInput,{placeholder:r.__("Search extras...","bookster-extra-options"),value:m,onValueChange:d}),React.createElement(t.CommandList,null,React.createElement(t.CommandGroup,null,0===R.length&&React.createElement("div",{className:"bw:py-6 bw:text-center bw:text-gray-500"},r.__("No extras found.","bookster-extra-options")),null!==p&&void 0!==E&&R.map((e=>React.createElement(t.ComboboxItem,{key:e.extra_id,value:e.extra_id.toString(),className:"bw:!mt-0 bw:flex bw:items-center bw:justify-between bw:rounded-none bw:border-b bw:border-gray-100/30 bw:px-2.5 bw:py-2 bw:first:border-t-0 bw:last:border-b-0 bw:aria-selected:bg-white"},React.createElement("div",{className:""},React.createElement(t.Label,null,e.name),React.createElement("p",{className:"bw:text-xs bw:font-normal bw:text-gray-500"},e.duration," mins")),React.createElement("div",{className:"bw:flex bw:justify-end bw:rounded-theme bw:bg-gray-50"},React.createElement(be,{quantity:f(e.extra_id),decrement:()=>function(e){let t=[...E];const a=t.findIndex((t=>t.id===e.extra_id));if(-1===a)return;const r=t[a].quantity;r>1?t[a].quantity=r-1:1===r&&(t=t.filter((t=>t.id!==e.extra_id))),t=_(t),h(t)}(e),increment:()=>function(e){let t=[...E];const a=t.findIndex((t=>t.id===e.extra_id));if(-1!==a){const r=t[a].quantity;r<e.quantity.max&&(t[a].quantity=r+1)}else t.push({id:e.extra_id,title:e.name,unitPrice:e.price,quantity:1,amount:e.price});t=_(t),h(t)}(e),maxQuantity:e.quantity.max}))))))))))))}function pe(){const{selectedService:e,hasMultipleBookings:t}=c.useSelectedService(),a=c.useBookingsValue();return!t&&1===a.length||!e?React.createElement(xe,{name:["bookings",0]}):null}e.queryClient.prefetchQuery({queryKey:["extras"],queryFn:async()=>(await j()).data}),o.booksterHooks.addFilter(o.HOOK_NAMES.router.managerRouter,"bookster-extra-options",(e=>(e.push({path:"services/extras",element:React.createElement(Z,null)}),e))),o.booksterHooks.addFilter(o.HOOK_NAMES.layout.ManagerMenuSubItems_+"services","bookster-extra-options",(a=>[...a,React.createElement(e.NavLink,{to:"/services/extras",className:"bw:no-underline"},(({isActive:e})=>React.createElement(t.SidebarMenuSubButton,{isActive:e},r.__("Service Extras","bookster-extra-options"))))])),o.booksterHooks.addFilter(o.HOOK_NAMES.adminApptForm.AdditionalBookingFields,"bookster-extra-options",((e,t)=>[...e,React.createElement(xe,{name:t})]),20),o.booksterHooks.addFilter(o.HOOK_NAMES.adminApptForm.AfterService,"bookster-extra-options",(e=>[...e,React.createElement(pe,null)]),20),o.booksterHooks.addFilter(o.HOOK_NAMES.adminApptForm.initFormValues,"bookster-extra-options",((e,t)=>{const a=(null==t?void 0:t.bookings)||[];return{...e,bookings:e.bookings.map((e=>{const t=a.find((t=>t.customer_id===e.customer_id));return{...e,extraBookingItems:(null==t?void 0:t.extraBookingItems)||[]}}))}})),o.booksterHooks.addFilter(o.HOOK_NAMES.adminApptForm.initBookingValues,"bookster-extra-options",(e=>({...e,extraBookingItems:[]}))),o.booksterHooks.addAction(o.HOOK_NAMES.adminApptForm.doChangeService,"bookster-extra-options",(e=>{1===e.getFieldValue("bookings").length&&e.setFieldValue(["bookings",0,"extraBookingItems"],[])})),o.booksterHooks.addFilter(o.HOOK_NAMES.adminApptForm.detailsReloadBookingValue,"bookster-extra-options",((t,a,r)=>{const n=r.extraBookingItems;if(void 0===n||0===n.length)return t;const o=e.queryClient.getQueryData(["extras"]);return n.forEach((e=>{if(void 0!==e.id){const a=null==o?void 0:o.find((t=>t.extra_id===e.id));a&&t.items.push({id:a.extra_id,title:a.name,unitPrice:u.Decimal.fromNumber(a.price),quantity:e.quantity,amount:u.ZERO,meta:{code:"extra",data:{id:a.extra_id}}})}})),t})),o.booksterHooks.addFilter(o.HOOK_NAMES.adminApptForm.prepareBookingsInput,"bookster-extra-options",((e,t)=>e.map((e=>{const a=t.bookings.find((t=>t.customer_id===e.customer_id));return void 0===(null==a?void 0:a.extraBookingItems)?{...e,extraBookingItems:[]}:{...e,extraBookingItems:a.extraBookingItems}})))),m(),o.booksterHooks.addFilter(o.HOOK_NAMES.customize.StepBookingAfterDescription_+"service","bookster-extra-options",(e=>[...e,React.createElement(de,null)]),10),o.booksterHooks.addAction(o.HOOK_NAMES.customize.setDemoStepValue,"bookster-extra-options",((e,t)=>{var a;if("service"!==e.name)return;const r=l();if(!r||0===r.length)return;const n=null==(a=t.select.service)?void 0:a.service_id,o=n?r.filter((e=>!e.unavailable_services.includes(n))):r;if(0===o.length)return;t.addonExtra||(t.addonExtra={select:[]});const s=o[0];t.addonExtra={select:o.map((e=>({model:{...e},isSelected:e.extra_id===s.extra_id,quantity:e.extra_id===s.extra_id?1:0})))}})),o.booksterHooks.addFilter(o.HOOK_NAMES.customize.initialPreviewConfig,"bookster-extra-options",(e=>{const t=e.process.steps.map((e=>"service"===e.name?{...e,acts:[...e.acts,s.selectExtras]}:e));return{...e,process:{...e.process,steps:t}}}),30),o.booksterHooks.addFilter(o.ADDON_PROCESS_HOOKS_NAME.bookingForm.serviceActHidden,"bookster-extra-options",((t,a,r)=>a!==s.selectExtras?t:!!(e.queryClient.getQueryData(["extras"])??[]).filter((e=>e.activated)).every((e=>!e.unavailable_services.includes(r.service_id)))||t)); -
bookster-extra-options/trunk/assets/dist/extra-options/frontend.js
r3244338 r3434554 1 import{d as e,E as t,g as o,e as a,_ as n,r,R as s,a as i,b as l,Q as c,D as b,c as m,f as u}from"./QuantityInput-de42f710.js";function d(){return a.useBookingStore()}function w(e,t){const o=d();return n.useStore(o,e,t)}const p=window.booksterMeta.appPath.bookster.assets+"/images/empty.png",x=r.forwardRef((function({className:e,extra:t,index:o,...a},r){const b=d();return s.createElement("div",{ref:r,...a,onClick:()=>function(e){const t={...e,isSelected:!e.isSelected,quantity:e.isSelected?0:1};b.setState((e=>{e.addonExtra.select[o]=t}))}(t),className:i.cx("bw-relative bw-flex bw-cursor-pointer bw-flex-wrap bw-items-center bw-justify-between bw-gap-2 bw-rounded bw-border bw-border-solid bw-p-3 bw-shadow bw-transition bw-duration-300 bw-ease-in-out hover:bw-border-primary/60",t.isSelected&&"bw-border-primary bw-ring-1 bw-ring-primary/20 hover:bw-border-primary",e)},s.createElement("div",{className:"bw-flex bw-min-w-[66%] bw-flex-1 bw-basis-[66%] bw-items-center bw-gap-2"},s.createElement("img",{className:"bw-aspect-square bw-h-14 bw-rounded bw-object-cover bw-object-center",src:t.model.transient_cover_url||p,alt:"Extra cover image"}),s.createElement("div",{className:"bw-flex bw-flex-col bw-gap-1"},s.createElement("h4",{className:"bw-text-base bw-font-semibold"},t.model.name),s.createElement("div",{className:"bw-flex bw-h-4 bw-flex-nowrap bw-items-center bw-space-x-2"},s.createElement("div",{className:"bw-inline-flex bw-items-center bw-justify-center bw-text-xs bw-text-gray-500"},s.createElement(l.Clock,{className:"bw-mr-1 bw-h-3 bw-w-3"}),s.createElement("span",null,t.model.duration,"min")),s.createElement(i.Separator,{orientation:"vertical"}),s.createElement(i.Badge,{color:"base",variant:"fill"},s.createElement("span",null,n.formatPrice(t.model.price)))))),t.model.quantity.max>1&&s.createElement(c,{quantity:t.quantity,decrement:()=>function(e){const t={...e,isSelected:!(e.quantity<2),quantity:e.quantity>0?e.quantity-1:e.quantity};b.setState((e=>{e.addonExtra.select[o]=t}))}(t),increment:()=>function(e){const t={...e,isSelected:0===e.quantity||e.isSelected,quantity:e.quantity<e.model.quantity.max?e.quantity+1:e.quantity};b.setState((e=>{e.addonExtra.select[o]=t}))}(t)}))}));function k(e){const t=w((e=>e.addonExtra.select)),o=a.useBookingLogic().process,n="desktop"===a.useBookingLayout().formLayout;return s.createElement("div",{...e},s.createElement(a.MainHeader,null),s.createElement(i.ScrollArea,{className:"btr-main-scrollarea"},n&&s.createElement(s.Fragment,null,s.createElement("div",{className:"bw-flex bw-h-14 bw-items-center bw-pl-4 bw-pr-2"},s.createElement("p",{className:"bw-mb-0 bw-flex-grow bw-font-heading bw-text-lg bw-font-semibold bw-text-primary"},o.computed.title)),s.createElement(i.Separator,null)),s.createElement(i.XyzTransitionGroup,{appear:!0,className:"bw-grid bw-gap-4 bw-p-4",xyz:"fade down-4 stagger-0.5"},t.map(((e,t)=>s.createElement(x,{key:e.model.extra_id,index:t,extra:e}))))),s.createElement(a.MainFooter,{submitButton:s.createElement(i.Button,{key:"select-extras-submit",onClick:async function(){o.mutate.nextAct()}},"Confirm")}))}function E(e){return{...e,addonExtra:b}}function g(e){const o=e.process.steps.map((e=>"service"===e.name?{...e,acts:[...e.acts,t.selectExtras]}:e));return{...e,process:{...e.process,steps:o}}}function f(e,o,a,n){return n.process.computed.act===t.selectExtras?{...e,main:{key:"select-extras",node:s.createElement(k,null)}}:e}function y(e,o,n){var r;e.process.computed.act===t.selectExtras&&(e.process.computed.title=m.__("Select Service Extras","bookster-extra-options"));const s=n.addonExtra.select.filter((e=>!0===e.isSelected)).map((e=>({id:e.model.extra_id,title:e.model.name,unitPrice:u.Decimal.fromNumber(e.model.price),quantity:e.quantity,amount:u.Decimal.fromNumber(e.model.price)})));if(void 0===e.input.bookingDetailsValue)return e;if(e.input.bookingDetailsValue.booking.items=[null==(r=e.input.bookingDetailsValue)?void 0:r.booking.items[0],...s],e.input.bookingDetailsValue){const t=a.calculateDetails(e.input.bookingDetailsValue);e.input.bookingDetailsValue=t}return void 0!==e.input.bookingMetaInput&&(e.input.bookingMetaInput.extraBookingItems=s.map((e=>({id:e.id,title:e.title,unitPrice:e.unitPrice.toNumber(),quantity:e.quantity,amount:e.amount.toNumber()})))),e}function S(e,o,a,{newPhase:n,oldPhase:r,oldActName:s,newActName:i}){return(n!==r&&"complete"===r||s===t.selectExtras)&&(o.addonExtra=b),0===o.addonExtra.select.length&&i===t.selectExtras||e}function v(e,a,n,{newActName:r}){var s;if(r!==t.selectExtras)return e;const i=o(),l=null==(s=a.select.service)?void 0:s.service_id,c=l?i.filter((e=>!e.unavailable_services.includes(l))):i;return 0===c.length||(a.addonExtra.select=c.map((e=>({model:e,isSelected:!1,quantity:0}))),!1)}function N(t,o){const a=o.getState().select.service;if(null===t||null===a)return t;if(e.booksterHooks.applyFilters(e.ADDON_GROUP_HOOKS_NAME.service.hasMultipleBookings,!1,a))return t;const n=o.getState().addonExtra.select,r=t.duration+n.reduce((function(e,t){return t.isSelected?e+t.model.duration*t.quantity:e}),0);return{...t,duration:r}}function _(){const e=w((e=>e.addonExtra)),t=r.useMemo((()=>e.select.filter((e=>e.isSelected))),[e.select]);return t.length>0&&s.createElement("p",{className:"bw-flex bw-w-full bw-items-center bw-justify-between bw-gap-2"},s.createElement("span",{className:"bw-text-xs bw-uppercase bw-text-gray-500"},m.__("Extra","bookster-extra-options")),s.createElement("span",{className:"bw-truncate"},t.map(((e,o)=>s.createElement(s.Fragment,null,e.model.name," ",e.quantity>1&&"(x"+e.quantity+")",o+1!==t.length&&", ")))))}e.booksterHooks.addFilter(e.HOOK_NAMES.bookingForm.bookingConfig,"bookster-extra-options",g,30),e.booksterHooks.addFilter(e.HOOK_NAMES.bookingForm.bookingParts,"bookster-extra-options",f),e.booksterHooks.addFilter(e.HOOK_NAMES.bookingForm.bookingInitState,"bookster-extra-options",E),e.booksterHooks.addFilter(e.HOOK_NAMES.bookingForm.bookingLogic,"bookster-extra-options",y,30),e.booksterHooks.addFilter(e.HOOK_NAMES.bookingForm.mutatePrevAct,"bookster-extra-options",S,50),e.booksterHooks.addFilter(e.HOOK_NAMES.bookingForm.mutateNextAct,"bookster-extra-options",v,50),e.booksterHooks.addFilter(e.HOOK_NAMES.bookingForm.bookingDuration,"bookster-extra-options",N),e.booksterHooks.addFilter(e.HOOK_NAMES.bookingForm.SummarySelectAfterService,"bookster-extra-options",(e=>[...e,s.createElement(_,null)]),20),e.booksterHooks.addFilter(e.ADDON_PROCESS_HOOKS_NAME.bookingForm.serviceActHidden,"bookster-extra-options",((e,a,n)=>a!==t.selectExtras?e:!!o().every((e=>e.unavailable_services.includes(n.service_id)))||e));1 import{d as e,E as o,g as s,l as r}from"./loadExtraBooking-BwOyuAjL.js";r(),e.booksterHooks.addFilter(e.ADDON_PROCESS_HOOKS_NAME.bookingForm.serviceActHidden,"bookster-extra-options",((e,r,a)=>r!==o.selectExtras?e:!!s().every((e=>e.unavailable_services.includes(a.service_id)))||e)); -
bookster-extra-options/trunk/assets/dist/extra-options/style.css
r3244338 r3434554 1 div.bookster-root .bw-pointer-events-none{pointer-events:none}div.bookster-root .-bw-mt-1{margin-top:-.25rem}div.bookster-root .bw-mb-2\.5{margin-bottom:.625rem}div.bookster-root .bw-mt-\[10px\]{margin-top:10px}div.bookster-root .bw-mt-px{margin-top:1px}div.bookster-root .bw-aspect-\[16\/6\]{aspect-ratio:16/6}div.bookster-root .bw-aspect-square{aspect-ratio:1/1}div.bookster-root .bw-h-14{height:3.5rem}div.bookster-root .bw-h-16{height:4rem}div.bookster-root .bw-h-2\.5{height:.625rem}div.bookster-root .bw-h-60{height:15rem}div.bookster-root .bw-h-\[14px\]{height:14px}div.bookster-root .bw-h-\[24px\]{height:24px}div.bookster-root .bw-h-\[30px\]{height:30px}div.bookster-root .bw-h-\[60px\]{height:60px}div.bookster-root .bw-min-h-\[8rem\]{min-height:8rem}div.bookster-root .bw-w-14{width:3.5rem}div.bookster-root .bw-w-16{width:4rem}div.bookster-root .bw-w-2\.5{width:.625rem}div.bookster-root .bw-w-72{width:18rem}div.bookster-root .bw-w-\[10rem\]{width:10rem}div.bookster-root .bw-w-\[32px\]{width:32px}div.bookster-root .bw-w-\[34px\]{width:34px}div.bookster-root .bw-w-\[var\(--radix-popover-trigger-width\)\]{width:var(--radix-popover-trigger-width)}div.bookster-root .bw-min-w-44{min-width:11rem}div.bookster-root .bw-min-w-\[24rem\]{min-width:24rem}div.bookster-root .bw-min-w-\[66\%\]{min-width:66%}div.bookster-root .bw-min-w-\[7rem\]{min-width:7rem}div.bookster-root .bw-basis-\[66\%\]{flex-basis:66%}@keyframes bw-spin{to{transform:rotate(1turn)}}div.bookster-root .bw-animate-spin{animation:bw-spin 1s linear infinite}div.bookster-root .bw-cursor-grab{cursor:grab}div.bookster-root .bw-select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}div.bookster-root .bw-auto-rows-fr{grid-auto-rows:minmax(0,1fr)}div.bookster-root .bw-grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}div.bookster-root .bw-grid-cols-\[repeat\(auto-fill\,minmax\(20rem\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(20rem,1fr))}div.bookster-root .bw-gap-1\.5{gap:.375rem}div.bookster-root .bw-gap-x-4{-moz-column-gap:1rem;column-gap:1rem}div.bookster-root .bw-gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}div.bookster-root .bw-gap-y-4{row-gap:1rem}div.bookster-root .-bw-space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(-1px*var(--tw-space-x-reverse))}div.bookster-root .bw-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}div.bookster-root .bw-space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}div.bookster-root .bw-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}div.bookster-root .bw-space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}div.bookster-root .bw-overflow-x-auto{overflow-x:auto}div.bookster-root .bw-overscroll-none{overscroll-behavior:none}div.bookster-root .bw-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.bookster-root .bw-text-ellipsis{text-overflow:ellipsis}div.bookster-root .bw-whitespace-nowrap{white-space:nowrap}div.bookster-root .bw-border-l-4{border-left-width:4px}div.bookster-root .bw-border-gray-500\/30{border-color:rgb(var(--btr-g500)/.3)}div.bookster-root .bw-bg-gray-500\/15{background-color:rgb(var(--btr-g500)/.15)}div.bookster-root .bw-bg-primary\/10{background-color:rgb(var(--btr-p)/.1)}div.bookster-root .bw-object-cover{-o-object-fit:cover;object-fit:cover}div.bookster-root .bw-object-center{-o-object-position:center;object-position:center}div.bookster-root .bw-py-\[18px\]{padding-bottom:18px;padding-top:18px}div.bookster-root .bw-font-heading{font-family:var(--btr-fontf-heading)}div.bookster-root .bw-leading-8{line-height:2rem}div.bookster-root .bw-text-gray-500\/80{color:rgb(var(--btr-g500)/.8)}div.bookster-root .bw-no-underline{text-decoration-line:none}div.bookster-root .bw-opacity-0{opacity:0}div.bookster-root .bw-opacity-100{opacity:1}div.bookster-root .bw-opacity-50{opacity:.5}div.bookster-root .bw-opacity-90{opacity:.9}div.bookster-root .bw-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}div.bookster-root .bw-ring-primary\/20{--tw-ring-color:rgb(var(--btr-p)/.2)}div.bookster-root .bw-grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}div.bookster-root .bw-duration-200{transition-duration:.2s}div.bookster-root .first\:bw-rounded-s:first-child{border-end-start-radius:var(--btr-rounded);border-start-start-radius:var(--btr-rounded)}div.bookster-root .last\:bw-rounded-e:last-child{border-end-end-radius:var(--btr-rounded);border-start-end-radius:var(--btr-rounded)}div.bookster-root .hover\:bw-border-primary\/60:hover{border-color:rgb(var(--btr-p)/.6)}div.bookster-root .bw-group\/cover-picker:hover .group-hover\/cover-picker\:bw-translate-x-1{--tw-translate-x:.25rem}div.bookster-root .bw-group\/cover-picker:hover .group-hover\/cover-picker\:bw-scale-125,div.bookster-root .bw-group\/cover-picker:hover .group-hover\/cover-picker\:bw-translate-x-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}div.bookster-root .bw-group\/cover-picker:hover .group-hover\/cover-picker\:bw-scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}div.bookster-root .bw-group\/cover-picker:hover .group-hover\/cover-picker\:bw-text-primary{color:rgb(var(--btr-p))}div.bookster-root .data-\[state\=open\]\:bw-rotate-180[data-state=open]{--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media (min-width:576px){div.bookster-root .sm\:bw-col-span-2{grid-column:span 2/span 2}div.bookster-root .sm\:bw-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}div.bookster-root .\[\&_\[cmdk-item\]\]\:bw-pl-5 [cmdk-item]{padding-left:1.25rem}1 /*! tailwindcss v4.1.7 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-x-reverse:0;--tw-leading:initial;--tw-outline-style:solid;--tw-border-style:solid}}}@layer theme{:root,:host{--bw-spacing:.25rem;--bw-animate-spin:spin 1s linear infinite}}@layer base,components,utilities;div.bookster-root .bw\:pointer-events-none{pointer-events:none}div.bookster-root .bw\:inset-x-0{inset-inline:calc(var(--bw-spacing)*0)}div.bookster-root .bw\:bottom-0{bottom:calc(var(--bw-spacing)*0)}div.bookster-root .bw\:z-1{z-index:1}div.bookster-root .bw\:z-\[100\]{z-index:100}div.bookster-root .bw\:-mx-2\.5{margin-inline:calc(var(--bw-spacing)*-2.5)}div.bookster-root .bw\:\!mt-0{margin-top:calc(var(--bw-spacing)*0)!important}div.bookster-root .bw\:-mt-1{margin-top:calc(var(--bw-spacing)*-1)}div.bookster-root .bw\:mr-1\.5{margin-right:calc(var(--bw-spacing)*1.5)}div.bookster-root .bw\:ml-2{margin-left:calc(var(--bw-spacing)*2)}div.bookster-root .bw\:aspect-\[16\/10\]{aspect-ratio:16/10}div.bookster-root .bw\:size-4\.5{width:calc(var(--bw-spacing)*4.5);height:calc(var(--bw-spacing)*4.5)}div.bookster-root .bw\:h-7\.5{height:calc(var(--bw-spacing)*7.5)}div.bookster-root .bw\:h-16{height:calc(var(--bw-spacing)*16)}div.bookster-root .bw\:h-60{height:calc(var(--bw-spacing)*60)}div.bookster-root .bw\:h-\[14px\]{height:14px}div.bookster-root .bw\:h-\[26px\]{height:26px}div.bookster-root .bw\:h-\[30px\]{height:30px}div.bookster-root .bw\:w-7\.5{width:calc(var(--bw-spacing)*7.5)}div.bookster-root .bw\:w-14{width:calc(var(--bw-spacing)*14)}div.bookster-root .bw\:w-32{width:calc(var(--bw-spacing)*32)}div.bookster-root .bw\:w-72{width:calc(var(--bw-spacing)*72)}div.bookster-root .bw\:w-\[10rem\]{width:10rem}div.bookster-root .bw\:w-\[26px\]{width:26px}div.bookster-root .bw\:w-\[32px\]{width:32px}div.bookster-root .bw\:w-\[var\(--radix-popover-trigger-width\)\]{width:var(--radix-popover-trigger-width)}div.bookster-root .bw\:max-w-60{max-width:calc(var(--bw-spacing)*60)}div.bookster-root .bw\:min-w-44{min-width:calc(var(--bw-spacing)*44)}div.bookster-root .bw\:min-w-\[7rem\]{min-width:7rem}div.bookster-root .bw\:animate-spin{animation:var(--bw-animate-spin)}div.bookster-root .bw\:cursor-grab{cursor:grab}div.bookster-root .bw\:cursor-grabbing{cursor:grabbing}div.bookster-root .bw\:place-content-center{place-content:center}div.bookster-root .bw\:gap-1\.5{gap:calc(var(--bw-spacing)*1.5)}div.bookster-root .bw\:gap-2\.5{gap:calc(var(--bw-spacing)*2.5)}:where(div.bookster-root .bw\:-space-x-px>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(-1px*var(--tw-space-x-reverse));margin-inline-end:calc(-1px*calc(1 - var(--tw-space-x-reverse)))}div.bookster-root .bw\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}div.bookster-root .bw\:overscroll-none{overscroll-behavior:none}div.bookster-root .bw\:rounded-\[6px\]{border-radius:6px}div.bookster-root .bw\:rounded-\[14px\]{border-radius:14px}div.bookster-root .bw\:border-gray-100\/30{border-color:var(--btr-g100)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:border-gray-100\/30{border-color:color-mix(in oklab,var(--btr-g100)30%,transparent)}}div.bookster-root .bw\:border-gray-500\/30{border-color:var(--btr-g500)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:border-gray-500\/30{border-color:color-mix(in oklab,var(--btr-g500)30%,transparent)}}div.bookster-root .bw\:bg-background{background-color:var(--btr-background)}div.bookster-root .bw\:bg-border\/60{background-color:var(--btr-border)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:bg-border\/60{background-color:color-mix(in oklab,var(--btr-border)60%,transparent)}}div.bookster-root .bw\:bg-gray-500\/15{background-color:var(--btr-g500)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:bg-gray-500\/15{background-color:color-mix(in oklab,var(--btr-g500)15%,transparent)}}div.bookster-root .bw\:stroke-2{stroke-width:2px}div.bookster-root .bw\:stroke-3{stroke-width:3px}div.bookster-root .bw\:object-cover{object-fit:cover}div.bookster-root .bw\:object-center{object-position:center}div.bookster-root .bw\:p-\[3px\]{padding:3px}div.bookster-root .bw\:py-3\.5{padding-block:calc(var(--bw-spacing)*3.5)}div.bookster-root .bw\:ps-10{padding-inline-start:calc(var(--bw-spacing)*10)}div.bookster-root .bw\:pe-\[3px\]{padding-inline-end:3px}div.bookster-root .bw\:pr-1{padding-right:calc(var(--bw-spacing)*1)}div.bookster-root .bw\:pl-\[2px\]{padding-left:2px}div.bookster-root .bw\:text-right{text-align:right}div.bookster-root .bw\:leading-8{--tw-leading:calc(var(--bw-spacing)*8);line-height:calc(var(--bw-spacing)*8)}div.bookster-root .bw\:text-\[\#677080\]{color:#677080}div.bookster-root .bw\:text-background{color:var(--btr-background)}div.bookster-root .bw\:text-body,div.bookster-root .bw\:text-body\/30{color:var(--btr-body)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:text-body\/30{color:color-mix(in oklab,var(--btr-body)30%,transparent)}}div.bookster-root .bw\:text-gray-500\/20{color:var(--btr-g500)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:text-gray-500\/20{color:color-mix(in oklab,var(--btr-g500)20%,transparent)}}div.bookster-root .bw\:text-gray-500\/30{color:var(--btr-g500)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:text-gray-500\/30{color:color-mix(in oklab,var(--btr-g500)30%,transparent)}}div.bookster-root .bw\:text-heading{color:var(--btr-heading)}div.bookster-root .bw\:italic{font-style:italic}div.bookster-root .bw\:no-underline{text-decoration-line:none}div.bookster-root .bw\:\!ring-offset-0{--tw-ring-offset-width:0px!important;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)!important}div.bookster-root .bw\:outline-2{outline-style:var(--tw-outline-style);outline-width:2px}div.bookster-root .bw\:outline-border{outline-color:var(--btr-border)}div.bookster-root .bw\:outline-info\/35{outline-color:var(--btr-in)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:outline-info\/35{outline-color:color-mix(in oklab,var(--btr-in)35%,transparent)}}div.bookster-root .bw\:outline-transparent{outline-color:#0000}@media (hover:hover){div.bookster-root .bw\:group-hover\/badge\:text-white\/50:is(:where(.bw\:group\/badge):hover *){color:#ffffff80}div.bookster-root .bw\:group-hover\/extra-card\:text-active:is(:where(.bw\:group\/extra-card):hover *){color:var(--btr-active)}}div.bookster-root .bw\:first\:ms-1:first-child{margin-inline-start:calc(var(--bw-spacing)*1)}div.bookster-root .bw\:first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}div.bookster-root .bw\:last\:me-1:last-child{margin-inline-end:calc(var(--bw-spacing)*1)}div.bookster-root .bw\:last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){div.bookster-root .bw\:hover\:rounded-sm:hover{border-radius:var(--btr-radius-sm)}div.bookster-root .bw\:hover\:bg-background:hover{background-color:var(--btr-background)}div.bookster-root .bw\:hover\:bg-background-hover:hover{background-color:var(--btr-background-hover)}div.bookster-root .bw\:hover\:bg-border:hover{background-color:var(--btr-border)}div.bookster-root .bw\:hover\:bg-info:hover{background-color:var(--btr-in)}div.bookster-root .bw\:hover\:bg-white:hover{background-color:#fff}div.bookster-root .bw\:hover\:\!text-background:hover{color:var(--btr-background)!important}div.bookster-root .bw\:hover\:\!text-error:hover{color:var(--btr-er)!important}div.bookster-root .bw\:hover\:text-error:hover{color:var(--btr-er)}div.bookster-root .bw\:hover\:text-heading:hover{color:var(--btr-heading)}div.bookster-root .bw\:hover\:text-info:hover{color:var(--btr-in)}div.bookster-root .bw\:hover\:text-white\/80:hover{color:#fffc}div.bookster-root .bw\:hover\:outline-border-hover:hover{outline-color:var(--btr-border-hover)}div.bookster-root .bw\:hover\:outline-transparent:hover{outline-color:#0000}}div.bookster-root .bw\:disabled\:pointer-events-none:disabled{pointer-events:none}div.bookster-root .bw\:disabled\:border-none:disabled{--tw-border-style:none;border-style:none}div.bookster-root .bw\:disabled\:bg-primary\/30:disabled{background-color:var(--btr-p)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:disabled\:bg-primary\/30:disabled{background-color:color-mix(in oklab,var(--btr-p)30%,transparent)}}div.bookster-root .bw\:disabled\:text-background:disabled{color:var(--btr-background)}div.bookster-root .bw\:disabled\:text-heading\/50:disabled{color:var(--btr-heading)}@supports (color:color-mix(in lab,red,red)){div.bookster-root .bw\:disabled\:text-heading\/50:disabled{color:color-mix(in oklab,var(--btr-heading)50%,transparent)}}div.bookster-root .bw\:aria-selected\:bg-white[aria-selected=true]{background-color:#fff}div.bookster-root .bw\:data-\[active\=true\]\:outline-active[data-active=true]{outline-color:var(--btr-active)}@media (hover:hover){div.bookster-root .bw\:data-\[active\=true\]\:hover\:outline-active[data-active=true]:hover{outline-color:var(--btr-active)}}@media (min-width:576px){div.bookster-root .bw\:sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container main (min-width:480px){div.bookster-root .bw\:\@min-\[480px\]\/main\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}div.bookster-root .bw\:\[\&_\[cmdk-item\]\]\:pl-5 [cmdk-item]{padding-left:calc(var(--bw-spacing)*5)}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}} -
bookster-extra-options/trunk/bookster-extra-options.php
r3244338 r3434554 13 13 * Requires Plugins: bookster 14 14 * Description: Official Bookster Service Extra addon - Offer Extra Products, Equipment, Variances to your Customers with Additional Fees 15 * Version: 2. 1.015 * Version: 2.2.0 16 16 * Requires at least: 5.2 17 17 * Requires PHP: 7.2 … … 27 27 } 28 28 29 define( 'BOOKSTER_EXTRA_OPTIONS_VERSION', '2. 1.0' );29 define( 'BOOKSTER_EXTRA_OPTIONS_VERSION', '2.2.0' ); 30 30 31 31 define( 'BOOKSTER_EXTRA_OPTIONS_PLUGIN_FILE', __FILE__ ); … … 67 67 /** Require Dependencies: (min.any < ver < max.any) => OK */ 68 68 $max_bookster_version = '3.0'; 69 $min_bookster_version = '2. 1';69 $min_bookster_version = '2.2'; 70 70 71 71 if ( ! defined( 'BOOKSTER_VERSION' ) ) { -
bookster-extra-options/trunk/languages/bookster-extra-options.pot
r3244338 r3434554 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Bookster Extra Options 2. 1.0\n"5 "Project-Id-Version: Bookster Extra Options 2.2.0\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/bookster-extra-options\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2025- 02-17T01:57:32+00:00\n"12 "POT-Creation-Date: 2025-10-10T09:41:22+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.11.0\n" … … 54 54 msgstr "" 55 55 56 #: src/Engine/ExtraBookingRequestLogic.php: 9756 #: src/Engine/ExtraBookingRequestLogic.php:102 57 57 msgid "Manage" 58 58 msgstr "" … … 75 75 76 76 #: assets/dist/extra-options/admin.js:1 77 msgid "Delete Extra" 78 msgstr "" 79 80 #: assets/dist/extra-options/admin.js:1 81 msgid "This action cannot be undone. This will permanently delete this extra." 82 msgstr "" 83 84 #: assets/dist/extra-options/admin.js:1 85 msgid "Cancel" 86 msgstr "" 87 88 #: assets/dist/extra-options/admin.js:1 89 msgid "Confirm Delete" 90 msgstr "" 91 92 #: assets/dist/extra-options/admin.js:1 93 msgid "Search" 94 msgstr "" 95 96 #: assets/dist/extra-options/admin.js:1 97 msgid "Selected services" 98 msgstr "" 99 100 #: assets/dist/extra-options/admin.js:1 101 msgid "No services found." 102 msgstr "" 103 104 #: assets/dist/extra-options/admin.js:1 105 msgid "Available only apply to Customer Booking Form. For Manager, there is no restriction." 106 msgstr "" 107 108 #: assets/dist/extra-options/admin.js:1 77 109 msgid "Upload Image" 78 110 msgstr "" 79 111 80 112 #: assets/dist/extra-options/admin.js:1 81 msgid " Extra cover"113 msgid "Image Selected" 82 114 msgstr "" 83 115 … … 99 131 100 132 #: assets/dist/extra-options/admin.js:1 101 msgid " Archiving Serviceto avoid Deleting referencing Appointment, Analytics Data in the past."102 msgstr "" 103 104 #: assets/dist/extra-options/admin.js:1 105 msgid "The serviceis available for booking."133 msgid "Deactivate Service Extra to avoid Deleting referencing Appointment, Analytics Data in the past." 134 msgstr "" 135 136 #: assets/dist/extra-options/admin.js:1 137 msgid "The Service Extra is available for booking." 106 138 msgstr "" 107 139 … … 115 147 116 148 #: assets/dist/extra-options/admin.js:1 117 msgid "Delete Multiple Extras"149 msgid "Delete Multiple Services Extra" 118 150 msgstr "" 119 151 … … 123 155 124 156 #: assets/dist/extra-options/admin.js:1 125 msgid "Cancel"126 msgstr ""127 128 #: assets/dist/extra-options/admin.js:1129 msgid "Confirm Delete"130 msgstr ""131 132 #: assets/dist/extra-options/admin.js:1133 157 msgid "Name Service" 134 158 msgstr "" … … 167 191 168 192 #: assets/dist/extra-options/admin.js:1 193 msgid "Extra Title" 194 msgstr "" 195 196 #: assets/dist/extra-options/admin.js:1 169 197 msgid "Service Extras" 170 198 msgstr "" 171 199 172 #: assets/dist/extra-options/frontend.js:1 200 #: assets/dist/extra-options/admin.js:1 201 msgid "Unavailable extra on current service" 202 msgstr "" 203 204 #: assets/dist/extra-options/admin.js:1 205 msgid "Select Service Extras..." 206 msgstr "" 207 208 #: assets/dist/extra-options/admin.js:1 209 msgid "Search extras..." 210 msgstr "" 211 212 #: assets/dist/extra-options/admin.js:1 213 msgid "No extras found." 214 msgstr "" 215 216 #: assets/dist/extra-options/loadExtraBooking-BwOyuAjL.js:1 217 msgid "Booking" 218 msgstr "" 219 220 #: assets/dist/extra-options/loadExtraBooking-BwOyuAjL.js:1 221 msgid "Additional quantity you want?" 222 msgstr "" 223 224 #: assets/dist/extra-options/loadExtraBooking-BwOyuAjL.js:1 225 msgid "This extra option is free of charge." 226 msgstr "" 227 228 #: assets/dist/extra-options/loadExtraBooking-BwOyuAjL.js:1 229 msgid "The price of this extra option will be multiplied by the quantity you choose." 230 msgstr "" 231 232 #: assets/dist/extra-options/loadExtraBooking-BwOyuAjL.js:1 233 msgid "Confirm & Next Step" 234 msgstr "" 235 236 #: assets/dist/extra-options/loadExtraBooking-BwOyuAjL.js:1 173 237 msgid "Select Service Extras" 174 238 msgstr "" 175 176 #: assets/dist/extra-options/frontend.js:1177 msgid "Extra"178 msgstr "" -
bookster-extra-options/trunk/readme.txt
r3290960 r3434554 13 13 This **Extra Options Addon for Bookster** allows you to add extra services to your booking forms to collect additional payments from customers. 14 14 15 **NOTE: [Bookster 2.0.0 or later](https://wordpress.org/plugins/bookster/) is required to use this plugin.**16 17 15 == Features == 18 16 … … 23 21 - **Quantity Selection**: Enable customers to choose multiple extras in one go by allowing them to specify the quantity for each option. 24 22 25 == Installation ==26 Manual installation is easy and takes less than one minute.27 23 28 1. Search for "Bookster Extra Options" and install this plugin. 29 2. Activate the plugin through the ‘Plugins‘ menu in WordPress. 30 3. Go to the **Bookster** > **Addons** menu to set up your extra services! 24 ## Installation 31 25 32 Enjoy! 26 ### Requirements Check 27 28 Before installing, verify you have: 29 30 ✅ Bookster free plugin version 2.2.0 or higher (check **Plugins → Installed Plugins**) 31 ✅ WordPress 5.0 or higher 32 ✅ PayPal Business account (create free at paypal.com if needed) 33 34 ### Step 1: Install the Addon 35 36 **Quick Install:** 37 1. Go to **Plugins → Add New** 38 2. Search for "Bookster Extra Options" 39 3. Click **Install Now** next to Bookster Extra Options plugin 40 4. Click **Activate** when installation completes 41 42 **Upload ZIP:** 43 1. Go to **Plugins → Add New** 44 2. Click **Upload Plugin** 45 3. Choose the ZIP file and click **Install Now** 46 4. Click **Activate Plugin** 33 47 34 48 == Frequently Asked Questions == … … 47 61 == Changelog == 48 62 63 = Jan 07, 2026 – Version 2.2.0 = 64 - New: Integrate with the Booking Template addon 65 - Improved: Better Booking Form UI 66 49 67 = Feb 21, 2025 - Version 2.1.0 = 50 68 - Improved: Compatible with Bookster version 2.1.0 -
bookster-extra-options/trunk/src/Engine/Enqueue.php
r3244338 r3434554 27 27 $this->extras_service = ExtrasService::get_instance(); 28 28 29 add_action( 'bookster_after_enqueue_script', [ $this, 'add_service_extra_meta' ], 10, 1 ); 29 30 add_action( 'bookster_after_enqueue_script', [ $this, 'localized_active_extra' ], 10, 1 ); 30 31 if ( ! $this->enqueue_logic->is_prod() ) { … … 33 34 34 35 add_action( 'init', [ $this, 'register_all_scripts' ] ); 36 add_filter( 'pre_load_script_translations', [ $this, 'use_mo_file_for_script_translations' ], 10, 4 ); 35 37 36 38 add_filter( 'bookster_scripts_dependencies', [ $this, 'add_extra_script' ], 10, 1 ); … … 64 66 65 67 public function localized_active_extra( $script_name ) { 66 if ( ! is_admin() ) { 67 $this->extras_service->localized_active_extras( $script_name ); 68 $this->extras_service->localized_active_extras( $script_name ); 69 } 70 71 /** 72 * Bookster Scripts is split into multiple files. 73 * Thus it's not possible to use JSON file for translations. 74 * 75 * @param string $json_translations 76 * @param string $file 77 * @param string $handle 78 * @param string $domain 79 */ 80 public function use_mo_file_for_script_translations( $json_translations, $file, $handle, $domain ) { 81 $all_handles = [ 82 self::ADMIN_SCRIPT, 83 self::FRONTEND_SCRIPT, 84 ]; 85 86 if ( 'bookster-extra-options' !== $domain || ! in_array( $handle, $all_handles, true ) ) { 87 return $json_translations; 68 88 } 89 90 $translations = get_translations_for_domain( 'bookster-extra-options' ); 91 $messages = [ 92 '' => [ 93 'domain' => 'messages', 94 ], 95 ]; 96 $entries = $translations->entries; 97 foreach ( $entries as $key => $entry ) { 98 $messages[ $entry->singular ] = $entry->translations; 99 } 100 101 return wp_json_encode( 102 [ 103 'domain' => 'messages', 104 'locale_data' => [ 105 'messages' => $messages, 106 ], 107 ] 108 ); 109 } 110 111 public function add_service_extra_meta( $script_name ) { 112 wp_localize_script( 113 $script_name, 114 'booksterExtraOptionsMeta', 115 [ 116 'assetsPath' => BOOKSTER_EXTRA_OPTIONS_PLUGIN_URL . 'assets', 117 ] 118 ); 69 119 } 70 120 } -
bookster-extra-options/trunk/src/Engine/ExtraBookingRequestLogic.php
r3244338 r3434554 4 4 use Bookster_Extra_Options\Features\Utils\SingletonTrait; 5 5 use Bookster\Features\Utils\Decimal; 6 use Bookster\Features\Utils\RandomUtils;7 6 use Bookster\Features\Booking\Details; 8 7 use Bookster\Features\Booking\Details\BookingItem; … … 30 29 add_filter( 'bookster_booking_payload_allowed_keys', [ $this, 'add_payload_allowed_keys_extra' ], 10, 1 ); 31 30 add_filter( 'bookster_booking_duration', [ $this, 'add_duration_extra' ], 10, 3 ); 32 add_filter( 'bookster_make_booking_details', [ $this, 'add_booking_extra' ], 10, 2 );31 add_filter( 'bookster_make_booking_details', [ $this, 'add_booking_extra' ], 30, 2 ); 33 32 } 34 33 … … 49 48 if ( $extra ) { 50 49 $extra_service_items[] = new BookingItem( 51 RandomUtils::gen_unique_id(),50 $extra['extra_id'], 52 51 $extra['name'], 53 52 $extra_item['quantity'], 54 53 Decimal::from_string( $extra['price'] ), 55 Decimal::zero() 54 Decimal::zero(), 55 [ 56 'code' => 'extra', 57 'data' => [ 58 'id' => $extra['extra_id'], 59 ], 60 ] 56 61 ); 57 62 } -
bookster-extra-options/trunk/src/Services/ExtrasService.php
r3170997 r3434554 61 61 } 62 62 } 63 $success = $this->patch_data( $extras ); 64 if ( false === $success ) { 65 throw new \Exception( 'Error Saving Extra' ); 66 } 63 $this->patch_data( $extras ); 67 64 } 68 65 -
bookster-extra-options/trunk/vendor/composer/installed.php
r3244338 r3434554 4 4 'pretty_version' => 'dev-develop', 5 5 'version' => 'dev-develop', 6 'reference' => ' 5b82c01500f2e3ec05a0806ec18d87fcf4034737',6 'reference' => 'c0ed440711045ba5aa83b7dd80e364fbad0761b7', 7 7 'type' => 'library', 8 8 'install_path' => __DIR__ . '/../../', … … 14 14 'pretty_version' => 'dev-develop', 15 15 'version' => 'dev-develop', 16 'reference' => ' 5b82c01500f2e3ec05a0806ec18d87fcf4034737',16 'reference' => 'c0ed440711045ba5aa83b7dd80e364fbad0761b7', 17 17 'type' => 'library', 18 18 'install_path' => __DIR__ . '/../../',
Note: See TracChangeset
for help on using the changeset viewer.