PageSourceSearch

https://app.zoca.com/assets/AddonGroupsList-Dof07uOy.js

js zoca.com collected 2026-09-30 09:43:41 UTC 10,443 bytes, 1 lines download raw bytes

1import{R as _,r as f,j as e}from"./vendor-react-Dw2zQmPu.js";import{C as z}from"./card-B8ye2dFa.js";import{u as B,a as y,b as S,h as H}from"./vendor-tanstack-Dk5vt_tN.js";import{o as $,b as P,Z as R,R as K}from"./app-core-DTTgVEgu.js";import{B as p}from"./button-CFi0D1K4.js";import{C as V}from"./CatalogEmptyState-3i1od_VR.js";import{B as q}from"./badge-CeMSLKTm.js";import{D,a as w,d as G,b as O}from"./dialog-BvmB9skF.js";import{D as X,b as W,a as Y,f as Z}from"./drawer-CX599GCC.js";import{D as J,a as ee,b as se,c as ne}from"./dropdown-menu-CM3Fw2BS.js";import{u as te}from"./useResponsiveHook-ByWCJmBO.js";import{t as g,an as L,X as ie,bD as I,bv as re,ao as oe,ae}from"./vendor-ui-mAy9LocR.js";import{f as le,A as k,a as ce,h as de}from"./addonGroupsApi-Bfe3H9MY.js";import{u as U}from"./vendor-router-CtopkIuN.js";import{A as me}from"./AddonSkeletonLoader-C8AGVyZs.js";import{dK as ue}from"./app-shared-QFLrTdTF.js";import{s as pe}from"./serviceCatalogQuery-rq7x8H2J.js";import{a as xe,b as he}from"./addonGroupQueries-BK0abEe1.js";import"./commonjs-helpers-C05_-Ghz.js";import"./vendor-radix-guzGw5-0.js";import"./app-cn-C2LL9ulS.js";import"./vendor-utils-CQ_dDVxl.js";import"./vendor-redux-CqVJnD2r.js";import"./vite-preload-helper-BXl3LOEh.js";import"./skeleton-BJiIkxs-.js";import"./skeletonRows-bFntY3QY.js";import"./vendor-lodash-DVjWl2dU.js";function E({groupId:s}){const n=$(d=>d.user.locationInfo)?.entityId??"",o=B(),i=y({mutationKey:[k.DELETE_ADDON_GROUP,s],mutationFn:le}),r=y({mutationKey:[k.ARCHIVE_ADDON_GROUP,s],mutationFn:ce}),m=y({mutationKey:[k.UNARCHIVE_ADDON_GROUP,s],mutationFn:de}),c=()=>{o.invalidateQueries({queryKey:[k.GET_ALL_ADDON_GROUPS,n]})},N=()=>{!n||!s||i.mutate({entityId:n,groupId:s},{onSuccess:()=>{g.success("Add-on group deleted successfully"),c()},onError:d=>{const a=P(d)??"Failed to delete add-on group";g.error(a)}})},x=()=>{!n||!s||r.mutate({entityId:n,groupId:s},{onSuccess:()=>{g.success("Add-on group archived"),c()},onError:d=>{const a=P(d)??"Failed to archive add-on group";g.error(a)}})},A=()=>{!n||!s||m.mutate({entityId:n,groupId:s},{onSuccess:()=>{g.success("Add-on group restored"),c()},onError:()=>g.error("Failed to restore add-on group")})},h=()=>{},v=d=>{},j=h,C=h;return{onDeleteAddonGroup:N,onArchiveAddonGroup:x,onUnarchiveAddonGroup:A,isDeleting:i.isPending,isArchiving:r.isPending,isUnarchiving:m.isPending,trackMenuOpen:v,trackEditClick:j,trackDeleteClick:C}}const F=({options:s,isArchived:t,onEditGroup:n,onArchiveClick:o,renderItem:i})=>e.jsxs(e.Fragment,{children:[i({onClick:()=>{s.trackEditClick(),n()},children:e.jsxs(e.Fragment,{children:[e.jsx(I,{})," Edit"]})}),i(t?{onClick:()=>s.onUnarchiveAddonGroup(),children:e.jsxs(e.Fragment,{children:[e.jsx(re,{})," Unarchive"]})}:{onClick:o,children:e.jsxs(e.Fragment,{children:[e.jsx(oe,{})," Archive"]})})]}),fe=({groupId:s,groupName:t,isArchived:n,onEditGroup:o,onArchiveClick:i})=>{const r=E({groupId:s});return e.jsxs(J,{onOpenChange:r.trackMenuOpen,children:[e.jsx(ee,{asChild:!0,children:e.jsx(p,{size:"icon",variant:"ghost",className:"size-8","aria-label":"Group options",children:e.jsx(L,{})})}),e.jsx(se,{align:"end",children:e.jsx(F,{options:r,isArchived:n,onEditGroup:o,onArchiveClick:i,renderItem:({onClick:m,children:c})=>e.jsx(ne,{onClick:m,children:c})})})]})},ve=({groupId:s,groupName:t,isArchived:n,onEditGroup:o,onArchiveClick:i})=>{const r=E({groupId:s});return e.jsxs(X,{onOpenChange:r.trackMenuOpen,children:[e.jsx(W,{asChild:!0,children:e.jsx(p,{size:"icon",variant:"ghost",className:"size-8","aria-label":"Group options",children:e.jsx(L,{})})}),e.jsx(Y,{hideHandle:!0,children:e.jsxs("div",{className:"p-4 flex flex-col gap-3",children:[e.jsxs("div",{className:"flex justify-between items-center gap-2",children:[e.jsx("h3",{className:"font-semibold text-base",children:t}),e.jsx(Z,{asChild:!0,children:e.jsx(p,{variant:"outline",size:"icon",children:e.jsx(ie,{})})})]}),e.jsx("div",{className:"flex flex-col items-center gap-3",children:e.jsx(F,{options:r,isArchived:n,onEditGroup:o,onArchiveClick:i,renderItem:({onClick:m,children:c})=>e.jsx(p,{variant:"outline",className:"w-full",onClick:m,children:c})})})]})})]})};function je(s,t){return s.map(n=>
1t.get(n)).filter(Boolean)}function ge(s){return s==null||s===0?"Free":`$${(s/100).toFixed(s%100===0?0:2)}`}function Ne(s){if(s==null||s===0)return"No extra time";if(s<60)return`${s} min`;const t=Math.floor(s/60),n=s%60;return n===0?`${t} hr`:`${t} hr ${n} min`}const Ae=s=>{const t=s.minSelection,n=s.maxSelection;return t==null&&n==null?"Optional":t!=null&&n!=null?`Pick ${t}–${n}`:t!=null?`Pick ${t}+`:`Pick up to ${n}`},b=3,Ce=({group:s,serviceNameMap:t=new Map})=>{const n=U(),o=te(),i=o==="sm"||o==="md",r=!s.isActive,[m,c]=f.useState(!1),[N,x]=f.useState(!1),[A,h]=f.useState(!1),v=()=>{s?.id&&n(`${R.addonGroup}?id=${s.id}`)},j=f.useCallback(()=>{h(!0)},[]),C=f.useCallback(T=>{T.stopPropagation(),c(!0)},[]),d=s.addons??[],a=s.serviceIds??[],u=je(a,t),l=u.length>b,M=u.slice(0,b).join(", "),Q=u.length-b;return e.jsxs("div",{className:"flex w-full items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex min-w-0 flex-1 flex-col gap-1.5",children:[e.jsx("p",{className:"line-clamp-1 text-sm font-semibold tracking-[-0.02em] text-gray-900",children:s.name}),u.length>0&&e.jsxs("p",{className:"line-clamp-1 text-xs font-medium tracking-[-0.02em] text-gray-600",children:["Available with: ",l?`${M}, and `:M,l&&e.jsxs("button",{type:"button",onClick:()=>x(!0),className:"cursor-pointer font-semibold text-violet-600 hover:underline",children:[Q," more"]})]}),d.length>0&&e.jsxs("button",{type:"button",onClick:C,className:"w-fit cursor-pointer text-xs font-semibold tracking-[-0.02em] text-violet-600 select-none hover:underline",children:[d.length," add-on option",d.length!==1?"s":""]})]}),e.jsxs("div",{className:"relative flex shrink-0 items-center gap-3",children:[e.jsx(q,{variant:"default",className:"status-neutral",children:Ae(s)}),i?e.jsx(ve,{groupId:s.id,groupName:s.name,isArchived:r,onEditGroup:v,onArchiveClick:j}):e.jsx(fe,{groupId:s.id,groupName:s.name,isArchived:r,onEditGroup:v,onArchiveClick:j})]}),e.jsx(ke,{open:m,onOpenChange:c,groupName:s.name,addons:d,onEdit:v}),e.jsx(ye,{open:N,onOpenChange:x,groupName:s.name,serviceNames:u}),e.jsx(be,{open:A,onOpenChange:h,groupId:s.id,groupName:s.name,serviceCount:a.length})]})},ke=({open:s,onOpenChange:t,groupName:n,addons:o,onEdit:i})=>e.jsx(D,{open:s,onOpenChange:t,children:e.jsxs(w,{className:"max-w-md max-h-[80vh] flex flex-col p-0",children:[e.jsxs(G,{className:"px-6 pt-6 pb-4 shrink-0",children:[e.jsx(O,{children:n}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:[o.length," add-on option",o.length!==1?"s":""]})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:e.jsx("div",{className:"divide-y",children:o.map(r=>e.jsxs("div",{className:"flex items-center justify-between px-6 py-3",children:[e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsx("span",{className:"text-sm font-medium truncate",children:r.name}),r.description&&e.jsx("span",{className:"text-xs text-muted-foreground line-clamp-1",children:r.description})]}),e.jsxs("div",{className:"flex flex-col items-end shrink-0 ml-4",children:[e.jsx("span",{className:"text-sm font-medium",children:ge(r.surchargeCents)}),e.jsx("span",{className:"text-xs text-muted-foreground",children:Ne(r.durationMinutes)})]})]},r.id))})}),e.jsxs("div",{className:"flex gap-3 px-6 py-4 border-t shrink-0",children:[e.jsx(p,{variant:"outline",className:"flex-1",onClick:()=>t(!1),children:"Close"}),e.jsxs(p,{className:"flex-1",onClick:()=>{t(!1),i()},children:[e.jsx(I,{size:16}),"Edit"]})]})]})}),ye=({open:s,onOpenChange:t,groupName:n,serviceNames:o})=>e.jsx(D,{open:s,onOpenChange:t,children:e.jsxs(w,{className:"max-w-md max-h-[80vh] flex flex-col p-0",children:[e.jsxs(G,{className:"px-6 pt-6 pb-4 shrink-0",children:[e.jsx(O,{children:n}),e.jsxs("p",{className:"text-sm text-muted-foreground",children:["Available with ",o.length," service",o.length!==1?"s":""]})]}),e.jsx("div",{className:"flex-1 min-h-0 overflow-y-auto",children:e.jsx("div",{className:"divide-y",children:o.map(i=>e.jsx("div",{className:"px-6 py-3",children:e.jsx("span",{className:"text-sm",children:i})},i))})}),e.jsx("div",{className:"flex justify-end px-6 py-4 border-t shrink-0",children:e.jsx(p,{variant:"outline",onClick:()=>t(!1),children:"Close"})})]})}),be=({open:s,onOpenChange:t,groupId:n,groupName:o,serviceCount:i})=>{const r=E({groupId:n}),m=()=>{r.onArchiveAddonGroup(),t(!1)};return e.jsx(D,{open:s,onOpenChange:t,children:e.jsxs(w,{className:"max-w-md",children:[e.jsx(G,{children:e.jsx(O,{children:"Archive add-on group"})}),e.jsx("p",{className:"text-sm text-gray-600",children:i>0?`This add-on group is attached to ${i} service${i!==1?"s":""}. Archiving it will unlink all services and clients will no longer see this add-on group during booking.`:"Are you sure you want to archive this add-on group?"}),e.jsxs("div",{className:"flex justify-end gap-2 pt-2",children:[e.jsx(p,{variant:"outline",onClick:()=>t(!1),children:"Cancel"}),e.jsx(p,{variant:"destructive",onClick:m,disabled:r.isArchiving,children:r.isArchiving?"Archiv
1ing…":i>0?"Unlink services and archive group":"Archive group"})]})]})})},De=_.memo(Ce),we=({showArchived:s=!1,hideEmptyState:t=!1,searchText:n=""})=>{const o=f.useDeferredValue(n.trim().toLowerCase()),i=U(),r=K(),c=$(a=>a.user.locationInfo)?.entityId??"",N=ue(),{data:x=[],isLoading:A}=S(xe(c,{isActive:!s})),h=H({queries:x.map(a=>he(c,a.id))}),v=f.useMemo(()=>{const a=new Map;for(const l of h)l.data&&a.set(l.data.id,l.data);const u=x.map(l=>a.get(l.id)??{...l,addons:[],serviceIds:[]});return o?u.filter(l=>l.name?.toLowerCase().includes(o)):u},[x,h,o]),{data:j=[]}=S({...pe(c)}),C=f.useMemo(()=>{const a=new Map;for(const u of j)for(const l of u.services??[])l.id&&l.name&&a.set(l.id,l.name);return a},[j]),d=()=>i(r(R.addonGroup));return A?e.jsx(me,{}):x.length===0?t||s?null:e.jsx(V,{title:"No add-on groups yet",description:"Add-ons are grouped so they can be assigned to and used across different services",children:N&&e.jsxs(p,{onClick:d,children:[e.jsx(ae,{size:16}),"Create Group"]})}):e.jsx("div",{className:"flex flex-col gap-3",children:v.map(a=>e.jsx(z,{variant:"surface",className:"relative flex items-center p-4",children:e.jsx(De,{group:a,serviceNameMap:C})},a.id))})},ss=_.memo(we);export{ss as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.