{"version":3,"sources":["../../../../src/primitives/Scheduling/Admin/TimeOffList.tsx"],"names":[],"mappings":";;;AAkCA,MAAM,cAA0B,EAAE,SAAA,EAAW,IAAI,OAAA,EAAS,EAAA,EAAI,QAAQ,EAAA,EAAG;AAElE,SAAS,qBAAA,CAAsB;AAAA,EACpC,KAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA,GAAW,eAAA;AAAA,EACX,WAAA,GAAc;AAChB,CAAA,EAA+B;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAqB,WAAW,CAAA;AAG1D,EAAA,MAAM,IAAA,GAAO,QAAQ,MAAM;AACzB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAA;AAAA,MAAO,CAAC,QAC1C,UAAA,KAAe,IAAA,GAAO,IAAI,WAAA,KAAgB,IAAA,GAAO,IAAI,WAAA,KAAgB;AAAA,KACvE;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,EAAE,SAAA,GAAY,CAAA,CAAE,SAAA,GAAY,EAAA,GAAK,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,GAAY,IAAI,CAAE,CAAA;AAC5F,IAAA,OAAO,QAAA;AAAA,EACT,GAAG,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,UAAU,CAAC,CAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,OAAO,CAAA,KAAkC;AACtD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,CAAC,MAAM,OAAA,EAAS;AAIxC,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,SAAS,CAAA,cAAA,CAAA;AACtC,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,cAAA,CAAA;AAClC,IAAA,IAAI,cAAc,SAAA,EAAW;AAC7B,IAAA,MAAM,KAAA,CAAM,QAAQ,MAAA,CAAO;AAAA,MACzB,WAAA,EAAa,UAAA;AAAA,MACb,SAAA,EAAW,WAAA;AAAA,MACX,OAAA,EAAS,SAAA;AAAA,MACT,MAAA,EAAQ,MAAM,MAAA,IAAU;AAAA,KACK,CAAA;AAC/B,IAAA,QAAA,CAAS,WAAW,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,EAAA,KAAe;AACnC,IAAA,MAAM,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,OAAA,CAAQ,KAAA,mBACb,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,EAAgB,IAAA,EAAK,OAAA,EAClC,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,KAAA,EACjB,CAAA,GACE,IAAA;AAAA,IAEH,KAAK,MAAA,KAAW,CAAA,uBACd,KAAA,EAAA,EACE,QAAA,EAAA,UAAA,wBACE,GAAA,EAAA,EAAE,QAAA,EAAA,sEAAA,EAAoE,CAAA,EAE3E,CAAA,GAEA,KAAK,GAAA,CAAI,CAAC,wBACR,IAAA,CAAC,KAAA,EAAA,EAAiB,WAAW,YAAA,EAC3B,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAM,uBAAa,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,SAAS,CAAA,EAAE,CAAA;AAAA,sBAC7E,GAAA,CAAC,UAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBACP,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,UAAA,GAAa,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA,GAAI,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAE,CAAA;AAAA,MACxE,IAAI,MAAA,mBAAS,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,GAAA,CAAI,QAAO,CAAA,GAAU,IAAA;AAAA,sBAC1C,GAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG,SAAA,EAAW,eAAA,EAC7D,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EAAA,EAPQ,GAAA,CAAI,EAQd,CACD,CAAA;AAAA,oBAGH,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,WAAW,YAAA,EACjC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,OAAO,KAAA,CAAM,SAAA;AAAA,UACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAM,CAAE,CAAA;AAAA,UAC5E,SAAA,EAAW,cAAA;AAAA,UACX,YAAA,EAAW;AAAA;AAAA,OACb;AAAA,sBACA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,QAAA,EAAQ,IAAA;AAAA,UACR,OAAO,KAAA,CAAM,OAAA;AAAA,UACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,OAAM,CAAE,CAAA;AAAA,UAC1E,SAAA,EAAW,cAAA;AAAA,UACX,YAAA,EAAW;AAAA;AAAA,OACb;AAAA,sBACA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAY,mBAAA;AAAA,UACZ,OAAO,KAAA,CAAM,MAAA;AAAA,UACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,OAAM,CAAE,CAAA;AAAA,UACzE,SAAA,EAAW,cAAA;AAAA,UACX,YAAA,EAAW;AAAA;AAAA,OACb;AAAA,0BACC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,kBAAA,IAAsB,iBACpD,QAAA,EAAA,QAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,cAAc,GAAA,EAAqB;AAC1C,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAA,CAAK,GAAG,CAAA,CAAE,mBAAmB,KAAA,CAAA,EAAW;AAAA,MACjD,OAAA,EAAS,OAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,GAAA,EAAK;AAAA,KACN,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF","file":"TimeOffList.mjs","sourcesContent":["import { useMemo, useState, type FormEvent, type ReactNode } from 'react';\nimport type { UseSchedulingAdminResult } from '../../../hooks/useSchedulingAdmin';\nimport type { SchedulingTimeOff } from '../../../types/scheduling';\n\nexport interface SchedulingTimeOffListProps {\n  admin: UseSchedulingAdminResult;\n  /**\n   * Resource whose time-off blocks we're editing. Pass `null` for site-wide\n   * blocks (rows where `resource_id is null`) — used by the \"Salon closures\"\n   * panel.\n   */\n  resourceId: string | null;\n  className?: string;\n  rowClassName?: string;\n  inputClassName?: string;\n  buttonClassName?: string;\n  addButtonClassName?: string;\n  errorClassName?: string;\n  emptyState?: ReactNode;\n  /**\n   * How to format the date for display in the row. Default uses\n   * `Intl.DateTimeFormat` with the visitor's locale + `weekday: 'short'`.\n   */\n  formatDate?: (iso: string) => ReactNode;\n  addLabel?: ReactNode;\n  removeLabel?: ReactNode;\n}\n\ninterface DraftEntry {\n  starts_at: string; // YYYY-MM-DD (date input)\n  ends_at: string;\n  reason: string;\n}\n\nconst EMPTY_DRAFT: DraftEntry = { starts_at: '', ends_at: '', reason: '' };\n\nexport function SchedulingTimeOffList({\n  admin,\n  resourceId,\n  className,\n  rowClassName,\n  inputClassName,\n  buttonClassName,\n  addButtonClassName,\n  errorClassName,\n  emptyState,\n  formatDate,\n  addLabel = '+ Add closure',\n  removeLabel = 'Remove',\n}: SchedulingTimeOffListProps) {\n  const [draft, setDraft] = useState<DraftEntry>(EMPTY_DRAFT);\n\n  // Filter + sort by starts_at so soonest-coming closures show first.\n  const rows = useMemo(() => {\n    const filtered = admin.timeOff.list.filter((row) =>\n      resourceId === null ? row.resource_id === null : row.resource_id === resourceId,\n    );\n    filtered.sort((a, b) => (a.starts_at < b.starts_at ? -1 : a.starts_at > b.starts_at ? 1 : 0));\n    return filtered;\n  }, [admin.timeOff.list, resourceId]);\n\n  const submit = async (e: FormEvent<HTMLFormElement>) => {\n    e.preventDefault();\n    if (!draft.starts_at || !draft.ends_at) return;\n    // The schema stores `starts_at` and `ends_at` as ISO timestamps. The\n    // <input type=\"date\"> gives us YYYY-MM-DD only — append a time so the\n    // resulting timestamp is unambiguous (closures are full-day).\n    const startsAtIso = `${draft.starts_at}T00:00:00.000Z`;\n    const endsAtIso = `${draft.ends_at}T23:59:59.999Z`;\n    if (startsAtIso > endsAtIso) return;\n    await admin.timeOff.create({\n      resource_id: resourceId,\n      starts_at: startsAtIso,\n      ends_at: endsAtIso,\n      reason: draft.reason || null,\n    } as Partial<SchedulingTimeOff>);\n    setDraft(EMPTY_DRAFT);\n  };\n\n  const remove = async (id: string) => {\n    await admin.timeOff.remove(id);\n  };\n\n  return (\n    <div className={className}>\n      {admin.timeOff.error ? (\n        <div className={errorClassName} role=\"alert\">\n          {admin.timeOff.error}\n        </div>\n      ) : null}\n\n      {rows.length === 0 ? (\n        <div>\n          {emptyState ?? (\n            <p>No closures scheduled. Add a date range below to block off bookings.</p>\n          )}\n        </div>\n      ) : (\n        rows.map((row) => (\n          <div key={row.id} className={rowClassName}>\n            <span>{formatDate ? formatDate(row.starts_at) : defaultFormat(row.starts_at)}</span>\n            <span>→</span>\n            <span>{formatDate ? formatDate(row.ends_at) : defaultFormat(row.ends_at)}</span>\n            {row.reason ? <span>{row.reason}</span> : null}\n            <button type=\"button\" onClick={() => remove(row.id)} className={buttonClassName}>\n              {removeLabel}\n            </button>\n          </div>\n        ))\n      )}\n\n      <form onSubmit={submit} className={rowClassName}>\n        <input\n          type=\"date\"\n          required\n          value={draft.starts_at}\n          onChange={(e) => setDraft((prev) => ({ ...prev, starts_at: e.target.value }))}\n          className={inputClassName}\n          aria-label=\"Closure starts on\"\n        />\n        <input\n          type=\"date\"\n          required\n          value={draft.ends_at}\n          onChange={(e) => setDraft((prev) => ({ ...prev, ends_at: e.target.value }))}\n          className={inputClassName}\n          aria-label=\"Closure ends on\"\n        />\n        <input\n          type=\"text\"\n          placeholder=\"Reason (optional)\"\n          value={draft.reason}\n          onChange={(e) => setDraft((prev) => ({ ...prev, reason: e.target.value }))}\n          className={inputClassName}\n          aria-label=\"Closure reason\"\n        />\n        <button type=\"submit\" className={addButtonClassName ?? buttonClassName}>\n          {addLabel}\n        </button>\n      </form>\n    </div>\n  );\n}\n\nfunction defaultFormat(iso: string): string {\n  try {\n    return new Date(iso).toLocaleDateString(undefined, {\n      weekday: 'short',\n      month: 'short',\n      day: 'numeric',\n    });\n  } catch {\n    return iso;\n  }\n}\n"]}