@object-ui/plugin-calendar 4.0.6 → 4.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @object-ui/plugin-calendar
2
2
 
3
+ ## 4.0.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 7c9b85c: Fix compatibility with the framework's normalized Expression envelope format.
8
+
9
+ `@objectstack/spec` now emits predicate (`visible` / `enabled`) and template
10
+ (`titleFormat`) fields as `{ dialect, source }` envelopes instead of bare
11
+ strings. The previous implementation assumed strings and crashed the record
12
+ detail view (`TypeError: titleFormat.replace is not a function`) and printed
13
+ `Failed to evaluate expression: ${[object Object]}` for every action visibility
14
+ predicate.
15
+ - `@object-ui/core`: `ExpressionEvaluator.evaluate` / `evaluateCondition` now
16
+ unwrap Expression envelopes transparently.
17
+ - `@object-ui/react`: new `toPredicateInput()` helper to safely normalize
18
+ `boolean | string | Expression` predicate inputs into the `${expr}` form
19
+ expected by `useCondition`.
20
+ - `@object-ui/components`: `action-bar`, `action-button`, `action-group`,
21
+ `action-icon`, `action-menu` renderers use `toPredicateInput()` instead of
22
+ template-literal interpolation that produced `${[object Object]}`.
23
+ - `@object-ui/plugin-detail`, `@object-ui/plugin-kanban`,
24
+ `@object-ui/plugin-calendar`, `@object-ui/app-shell`,
25
+ `@object-ui/console`: title-format helpers accept both legacy strings and
26
+ the new `{ source }` envelope.
27
+
28
+ All changes are backward-compatible — legacy bare strings continue to work.
29
+
30
+ - Updated dependencies [7c9b85c]
31
+ - Updated dependencies [fd15918]
32
+ - @object-ui/core@4.0.7
33
+ - @object-ui/react@4.0.7
34
+ - @object-ui/components@4.0.7
35
+ - @object-ui/i18n@4.0.7
36
+ - @object-ui/fields@4.0.7
37
+ - @object-ui/types@4.0.7
38
+ - @object-ui/mobile@4.0.7
39
+
3
40
  ## 4.0.6
4
41
 
5
42
  ### Patch Changes
package/dist/index.js CHANGED
@@ -591,7 +591,7 @@ var J = ({ schema: e, dataSource: t, className: s, data: d, loading: f, onEventC
591
591
  ]);
592
592
  let ee = i(() => {
593
593
  if (!X || !S.length) return [];
594
- let { startDateField: e, endDateField: t, titleField: n, colorField: r } = X, i = k?.titleFormat, a = k?.NAME_FIELD_KEY, o = [
594
+ let { startDateField: e, endDateField: t, titleField: n, colorField: r } = X, i = k?.titleFormat, a = typeof i == "string" ? i : i && typeof i == "object" && typeof i.source == "string" ? i.source : void 0, o = k?.NAME_FIELD_KEY, s = [
595
595
  "name",
596
596
  "full_name",
597
597
  "fullName",
@@ -600,23 +600,23 @@ var J = ({ schema: e, dataSource: t, className: s, data: d, loading: f, onEventC
600
600
  "label",
601
601
  "display_name",
602
602
  "displayName"
603
- ], s = (e, t) => {
603
+ ], c = (e, t) => {
604
604
  let n = "[-\\u2013\\u2014|/·,:]", r = !1, i = e.replace(/\{([^{}]+)\}/g, (e, n) => {
605
605
  let i = t[n.trim()];
606
606
  return i != null && i !== "" ? (r = !0, String(i)) : "\0";
607
607
  });
608
608
  return r ? i.replace(RegExp(`\\s*${n}\\s*`, "g"), "").replace(RegExp(`\\s*${n}\\s*`, "g"), "").replace(RegExp("\0", "g"), "").replace(/\s+/g, " ").trim() : "";
609
- }, c = (e) => {
609
+ }, l = (e) => {
610
610
  let t;
611
- if (n && (t = e[n], typeof t == "string" && (t = t.trim())), !t && i) {
612
- let n = s(i, e);
611
+ if (n && (t = e[n], typeof t == "string" && (t = t.trim())), !t && a) {
612
+ let n = c(a, e);
613
613
  n && (t = n);
614
614
  }
615
- if (!t && a) {
616
- let n = e[a];
615
+ if (!t && o) {
616
+ let n = e[o];
617
617
  typeof n == "string" ? t = n.trim() : n && (t = n);
618
618
  }
619
- if (!t) for (let n of o) {
619
+ if (!t) for (let n of s) {
620
620
  let r = e[n], i = typeof r == "string" ? r.trim() : r;
621
621
  if (i) {
622
622
  t = i;
@@ -626,13 +626,13 @@ var J = ({ schema: e, dataSource: t, className: s, data: d, loading: f, onEventC
626
626
  return t || "Untitled";
627
627
  };
628
628
  return S.map((n, i) => {
629
- let a = n[e], o = t ? n[t] : null, s = c(n), l = r ? n[r] : void 0;
629
+ let a = n[e], o = t ? n[t] : null, s = l(n), c = r ? n[r] : void 0;
630
630
  return {
631
631
  id: n.id || n._id || `event-${i}`,
632
632
  title: s,
633
633
  start: a ? new Date(a) : /* @__PURE__ */ new Date(),
634
634
  end: o ? new Date(o) : void 0,
635
- color: l,
635
+ color: c,
636
636
  allDay: !o,
637
637
  data: n
638
638
  };
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`),require(`@object-ui/core`),require(`@object-ui/react`),require(`lucide-react`),require(`@object-ui/components`),require(`@object-ui/i18n`),require(`react/jsx-runtime`),require(`@object-ui/mobile`)):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`lucide-react`,`@object-ui/components`,`@object-ui/i18n`,`react/jsx-runtime`,`@object-ui/mobile`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginCalendar={},e.React,e.ObjectUICore,e.ObjectUIReact,e.LucideReact,e.ObjectUIComponents,e._object_ui_i18n,e.react_jsx_runtime,e._object_ui_mobile))})(this,function(e,t,n,r,i,a,o,s,c){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var l=Object.create,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor,f=Object.getOwnPropertyNames,p=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,h=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=f(t),a=0,o=i.length,s;a<o;a++)s=i[a],!m.call(e,s)&&s!==n&&u(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=d(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:l(p(e)),h(t||!e||!e.__esModule?u(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);var g=`bg-blue-500 text-white`,_=new Date,v={"calendar.today":`Today`,"calendar.month":`Month`,"calendar.week":`Week`,"calendar.day":`Day`,"calendar.newEvent":`New event`,"calendar.moreEvents":`+{{count}} more`};function y(){try{let e=(0,o.useObjectTranslation)();return e.t(`calendar.today`)===`calendar.today`?{t:(e,t)=>{let n=v[e]||e;if(t)for(let[e,r]of Object.entries(t))n=n.replace(`{{${e}}}`,String(r));return n},language:`en`}:{t:e.t,language:e.language}}catch{return{t:(e,t)=>{let n=v[e]||e;if(t)for(let[e,r]of Object.entries(t))n=n.replace(`{{${e}}}`,String(r));return n},language:`en`}}}function b({events:e=[],view:n=`month`,currentDate:r=_,locale:o=`default`,onEventClick:c,onDateClick:l,onViewChange:u,onNavigate:d,onAddClick:f,onEventDrop:p,className:m}){let[h,g]=t.useState(n),[v,b]=t.useState(r),{t:S,language:C}=y(),w=o===`default`?C:o;t.useEffect(()=>{b(r)},[r]),t.useEffect(()=>{g(n)},[n]);let O=t.useRef(u);O.current=u,t.useEffect(()=>{let e=window.matchMedia(`(max-width: 639px)`),t=e=>{e.matches&&(g(`day`),O.current?.(`day`))};return t(e),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]);let k=()=>{let e=new Date(v);h===`month`?e.setMonth(e.getMonth()-1):h===`week`?e.setDate(e.getDate()-7):e.setDate(e.getDate()-1),b(e),d?.(e)},A=()=>{let e=new Date(v);h===`month`?e.setMonth(e.getMonth()+1):h===`week`?e.setDate(e.getDate()+7):e.setDate(e.getDate()+1),b(e),d?.(e)},j=()=>{let e=new Date;b(e),d?.(e)},M=e=>{g(e),u?.(e)},N=()=>{if(h===`month`)return v.toLocaleDateString(w,{month:`long`,year:`numeric`});if(h===`week`){let e=x(v),t=new Date(e);return t.setDate(t.getDate()+6),`${e.toLocaleDateString(w,{month:`short`,day:`numeric`})} - ${t.toLocaleDateString(w,{month:`short`,day:`numeric`,year:`numeric`})}`}else return v.toLocaleDateString(w,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})},P=t.useRef(0);return(0,s.jsxs)(`div`,{role:`region`,"aria-label":`Calendar`,className:(0,a.cn)(`flex flex-col h-full bg-background min-w-0 overflow-hidden`,m),children:[(0,s.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 p-2 sm:p-4 border-b min-w-0`,children:[(0,s.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,s.jsxs)(`div`,{className:`flex items-center bg-muted/50 rounded-lg p-1 gap-1`,children:[(0,s.jsx)(a.Button,{variant:`ghost`,size:`sm`,onClick:j,className:`h-8`,"aria-label":`Go to today`,children:S(`calendar.today`)}),(0,s.jsx)(`div`,{className:`h-4 w-px bg-border mx-1`}),(0,s.jsx)(a.Button,{variant:`ghost`,size:`icon`,"aria-label":`Previous period`,onClick:k,className:`h-8 w-8`,children:(0,s.jsx)(i.ChevronLeftIcon,{className:`h-4 w-4`})}),(0,s.jsx)(a.Button,{variant:`ghost`,size:`icon`,"aria-label":`Next period`,onClick:A,className:`h-8 w-8`,children:(0,s.jsx)(i.ChevronRightIcon,{className:`h-4 w-4`})})]}),(0,s.jsxs)(a.Popover,{children:[(0,s.jsx)(a.PopoverTrigger,{asChild:!0,children:(0,s.jsxs)(a.Button,{variant:`ghost`,"aria-label":`Current date: ${N()}`,className:(0,a.cn)(`text-base sm:text-xl font-semibold h-auto px-2 sm:px-3 py-1 hover:bg-muted/50 transition-colors`,`flex items-center gap-2`),children:[(0,s.jsx)(i.CalendarIcon,{className:`h-5 w-5 text-muted-foreground`}),(0,s.jsx)(`span`,{children:N()})]})}),(0,s.jsx)(a.PopoverContent,{className:`w-auto p-0`,align:`start`,children:(0,s.jsx)(a.Calendar,{mode:`single`,selected:v,onSelect:e=>{e&&(b(e),d?.(e))},initialFocus:!0,fromYear:2e3,toYear:2050})})]})]}),(0,s.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,s.jsxs)(a.Select,{value:h,onValueChange:M,children:[(0,s.jsx)(a.SelectTrigger,{className:`w-32 bg-background`,children:(0,s.jsx)(a.SelectValue,{})}),(0,s.jsxs)(a.SelectContent,{children:[(0,s.jsx)(a.SelectItem,{value:`day`,children:S(`calendar.day`)}),(0,s.jsx)(a.SelectItem,{value:`week`,children:S(`calendar.week`)}),(0,s.jsx)(a.SelectItem,{value:`month`,children:S(`calendar.month`)})]})]}),f&&(0,s.jsxs)(a.Button,{onClick:f,size:`sm`,className:`gap-1`,children:[(0,s.jsx)(i.PlusIcon,{className:`h-4 w-4`}),S(`calendar.newEvent`)]})]})]}),(0,s.jsxs)(`div`,{className:`flex-1 overflow-auto`,onTouchStart:e=>{P.current=e.touches[0].clientX},onTouchEnd:e=>{let t=P.current-e.changedTouches[0].clientX;if(Math.abs(t)>50){let e=new Date(v);h===`day`?e.setDate(e.getDate()+(t>0?1:-1)):h===`week`?e.setDate(e.getDate()+(t>0?7:-7)):e.setMonth(e.getMonth()+(t>0?1:-1)),b(e),d?.(e)}},children:[h===`month`&&(0,s.jsx)(T,{date:v,events:e,locale:w,onEventClick:c,onDateClick:l,onEventDrop:p}),h===`week`&&(0,s.jsx)(E,{date:v,events:e,locale:w,onEventClick:c,onDateClick:l}),h===`day`&&(0,s.jsx)(D,{date:v,events:e,onEventClick:c,onDateClick:l})]})]})}function x(e){let t=new Date(e),n=t.getDay(),r=t.getDate()-n;return t.setDate(r),t}function S(e){let t=e.getFullYear(),n=e.getMonth(),r=new Date(t,n,1),i=new Date(t,n+1,0),a=r.getDay(),o=[];for(let e=a-1;e>=0;e--){let t=new Date(r.getTime());t.setDate(t.getDate()-(e+1)),o.push(t)}for(let e=1;e<=i.getDate();e++)o.push(new Date(t,n,e));let s=42-o.length;for(let e=1;e<=s;e++){let t=new Date(i.getTime());t.setDate(t.getDate()+e),o.push(t)}return o}function C(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function w(e,t){return t.filter(t=>{let n=new Date(t.start),r=t.end?new Date(t.end):new Date(n),i=new Date(e);i.setHours(0,0,0,0);let a=new Date(e);a.setHours(23,59,59,999);let o=new Date(n);o.setHours(0,0,0,0);let s=new Date(r);return s.setHours(23,59,59,999),i<=s&&a>=o})}function T({date:e,events:n,locale:r=`default`,onEventClick:i,onDateClick:o,onEventDrop:c}){let l=t.useMemo(()=>S(e),[e.getFullYear(),e.getMonth()]),u=t.useMemo(()=>new Date,[]),{t:d}=y(),f=t.useMemo(()=>{let e=new Date(2024,0,7);return Array.from({length:7},(t,n)=>{let i=new Date(e);return i.setDate(i.getDate()+n),i.toLocaleDateString(r,{weekday:`short`})})},[r]),[p,m]=t.useState(null),[h,_]=t.useState(null),v=t.useMemo(()=>{let e=new Map;for(let t of n){let n=new Date(t.start),r=t.end?new Date(t.end):new Date(n);n.setHours(0,0,0,0),r.setHours(0,0,0,0);let i=new Date(n);for(;i<=r;){let n=`${i.getFullYear()}-${i.getMonth()}-${i.getDate()}`,r=e.get(n);r?r.push(t):e.set(n,[t]),i.setDate(i.getDate()+1)}}return e},[n]),b=(e,t)=>{m(t.id),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,String(t.id))},x=()=>{m(null),_(null)},w=(e,t)=>{e.preventDefault(),e.dataTransfer.dropEffect=`move`,_(t)},T=e=>{e.currentTarget.contains(e.relatedTarget)||_(null)},E=(e,t)=>{if(e.preventDefault(),_(null),m(null),!c)return;let r=e.dataTransfer.getData(`text/plain`),i=n.find(e=>String(e.id)===r);if(!i)return;let a=new Date(i.start),o=new Date(a);o.setHours(0,0,0,0);let s=new Date(t);s.setHours(0,0,0,0);let l=s.getTime()-o.getTime();if(l===0)return;let u=new Date(a.getTime()+l),d;i.end&&(d=new Date(new Date(i.end).getTime()+l)),c(i,u,d)};return(0,s.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,s.jsx)(`div`,{role:`row`,className:`grid grid-cols-7 border-b`,children:f.map(e=>(0,s.jsx)(`div`,{role:`columnheader`,className:`p-2 text-center text-sm font-medium text-muted-foreground border-r last:border-r-0`,children:e},e))}),(0,s.jsx)(`div`,{role:`grid`,"aria-label":`Calendar grid`,className:`grid grid-cols-7 flex-1 auto-rows-fr`,children:l.map((t,n)=>{let r=`${t.getFullYear()}-${t.getMonth()}-${t.getDate()}`,l=v.get(r)||[],f=t.getMonth()===e.getMonth(),m=C(t,u);return(0,s.jsxs)(`div`,{role:`gridcell`,"aria-label":`${t.toLocaleDateString(`default`,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})}${l.length>0?`, ${l.length} event${l.length>1?`s`:``}`:``}`,className:(0,a.cn)(`border-b border-r last:border-r-0 p-2 min-h-[100px] cursor-pointer hover:bg-accent/50`,!f&&`bg-muted/50 text-muted-foreground opacity-50`,h===n&&`ring-2 ring-primary`),onClick:()=>o?.(t),onDragOver:e=>w(e,n),onDragLeave:T,onDrop:e=>E(e,t),children:[(0,s.jsx)(`div`,{className:(0,a.cn)(`text-sm font-medium mb-2`,m&&`inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground h-6 w-6`),...m?{"aria-current":`date`}:{},children:t.getDate()}),(0,s.jsxs)(`div`,{className:`space-y-1`,children:[l.slice(0,3).map(e=>(0,s.jsx)(`div`,{role:`button`,title:e.title,"aria-label":e.title,draggable:!!c,onDragStart:t=>b(t,e),onDragEnd:x,className:(0,a.cn)(`text-xs px-2 py-1 rounded truncate cursor-pointer hover:opacity-80`,e.color?.startsWith(`#`)?`text-white`:e.color||g,p===e.id&&`opacity-50`),style:e.color&&e.color.startsWith(`#`)?{backgroundColor:e.color}:void 0,onClick:t=>{t.stopPropagation(),i?.(e)},children:e.title},e.id)),l.length>3&&(0,s.jsx)(`div`,{className:`text-xs text-muted-foreground px-2`,children:d(`calendar.moreEvents`,{count:l.length-3})})]})]},n)})})]})}function E({date:e,events:n,locale:r=`default`,onEventClick:i,onDateClick:o}){let c=t.useRef(null),l=e=>{o&&(c.current=setTimeout(()=>{o(e)},500))},u=()=>{c.current&&=(clearTimeout(c.current),null)},d=x(e),f=Array.from({length:7},(e,t)=>{let n=new Date(d);return n.setDate(n.getDate()+t),n}),p=new Date;return(0,s.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,s.jsx)(`div`,{className:`grid grid-cols-7 border-b`,children:f.map(e=>{let t=C(e,p);return(0,s.jsxs)(`div`,{className:`p-3 text-center border-r last:border-r-0`,children:[(0,s.jsx)(`div`,{className:`text-sm font-medium text-muted-foreground`,children:e.toLocaleDateString(r,{weekday:`short`})}),(0,s.jsx)(`div`,{className:(0,a.cn)(`text-lg font-semibold mt-1`,t&&`inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground h-8 w-8`),children:e.getDate()})]},e.toISOString())})}),(0,s.jsx)(`div`,{role:`grid`,className:`grid grid-cols-7 flex-1`,children:f.map(e=>{let t=w(e,n);return(0,s.jsx)(`div`,{role:`gridcell`,"aria-label":`${e.toLocaleDateString(`default`,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})}${t.length>0?`, ${t.length} event${t.length>1?`s`:``}`:``}`,className:`border-r last:border-r-0 p-2 min-h-[400px] cursor-pointer hover:bg-accent/50`,onClick:()=>o?.(e),onTouchStart:()=>l(e),onTouchEnd:u,children:(0,s.jsx)(`div`,{className:`space-y-2`,children:t.map(e=>(0,s.jsxs)(`div`,{role:`button`,title:e.title,"aria-label":e.title,className:(0,a.cn)(`text-xs sm:text-sm px-2 sm:px-3 py-1.5 sm:py-2 rounded cursor-pointer hover:opacity-80`,e.color?.startsWith(`#`)?`text-white`:e.color||g),style:e.color&&e.color.startsWith(`#`)?{backgroundColor:e.color}:void 0,onClick:t=>{t.stopPropagation(),i?.(e)},children:[(0,s.jsx)(`div`,{className:`font-medium truncate`,children:e.title}),!e.allDay&&(0,s.jsx)(`div`,{className:`text-xs opacity-90 mt-1`,children:e.start.toLocaleTimeString(`default`,{hour:`numeric`,minute:`2-digit`})})]},e.id))})},e.toISOString())})})]})}function D({date:e,events:n,onEventClick:r,onDateClick:i}){let o=w(e,n),c=Array.from({length:24},(e,t)=>t),l=t.useRef(null),u=t=>{i&&(l.current=setTimeout(()=>{let n=new Date(e);n.setHours(t,0,0,0),i(n)},500))},d=()=>{l.current&&=(clearTimeout(l.current),null)};return(0,s.jsx)(`div`,{className:`flex flex-col h-full`,children:(0,s.jsx)(`div`,{role:`list`,className:`flex-1 overflow-auto`,children:c.map(e=>{let t=o.filter(t=>t.allDay?e===0:t.start.getHours()===e);return(0,s.jsxs)(`div`,{role:`listitem`,className:`flex border-b min-h-[60px]`,children:[(0,s.jsx)(`div`,{className:`w-20 p-2 text-sm text-muted-foreground border-r`,children:e===0?`12 AM`:e<12?`${e} AM`:e===12?`12 PM`:`${e-12} PM`}),(0,s.jsx)(`div`,{className:`flex-1 p-2 space-y-2`,onTouchStart:()=>u(e),onTouchEnd:d,children:t.map(e=>(0,s.jsxs)(`div`,{title:e.title,"aria-label":e.title,className:(0,a.cn)(`px-2 sm:px-3 py-1.5 sm:py-2 rounded cursor-pointer hover:opacity-80`,e.color?.startsWith(`#`)?`text-white`:e.color||g),style:e.color&&e.color.startsWith(`#`)?{backgroundColor:e.color}:void 0,onClick:()=>r?.(e),children:[(0,s.jsx)(`div`,{className:`font-medium truncate`,children:e.title}),!e.allDay&&(0,s.jsxs)(`div`,{className:`text-xs opacity-90 mt-1`,children:[e.start.toLocaleTimeString(`default`,{hour:`numeric`,minute:`2-digit`}),e.end&&` - ${e.end.toLocaleTimeString(`default`,{hour:`numeric`,minute:`2-digit`})}`]})]},e.id))})]},e)})})})}function O(e){return`data`in e&&e.data?e.data:`staticData`in e&&e.staticData?{provider:`value`,items:e.staticData}:e.objectName?{provider:`object`,object:e.objectName}:null}function k(e){if(e){if(typeof e==`string`){let t=e.split(` `),n=t[0],r=t[1]?.toLowerCase()===`desc`?`desc`:`asc`;return{[n]:r}}if(Array.isArray(e))return e.reduce((e,t)=>(t.field&&t.order&&(e[t.field]=t.order),e),{})}}function A(e){return`filter`in e&&e.filter&&typeof e.filter==`object`&&`calendar`in e.filter?e.filter.calendar:e.calendar?e.calendar:e.startDateField||e.dateField?{startDateField:e.startDateField||e.dateField,endDateField:e.endDateField||e.endField,titleField:e.titleField,colorField:e.colorField,allDayField:e.allDayField}:null}var j=({schema:e,dataSource:i,className:o,data:l,loading:u,onEventClick:d,onRowClick:f,onDateClick:p,onNavigate:m,onViewChange:h,onEventDrop:g,locale:_})=>{let v=Array.isArray(l),[y,x]=(0,t.useState)(v?l:[]),[S,C]=(0,t.useState)(v?u??!1:!0),[w,T]=(0,t.useState)(null),[E,D]=(0,t.useState)(null),[j,M]=(0,t.useState)(new Date),N=(0,a.useIsMobile)(),P=e.defaultView,[F,I]=(0,t.useState)(()=>{let e=P===`day`||!P;return typeof window<`u`&&window.innerWidth<768&&e?`month`:P||`month`});(0,t.useEffect)(()=>{N&&F===`day`&&(P===`day`||!P)&&I(`month`)},[N]);let[L,R]=(0,t.useState)(0);(0,t.useEffect)(()=>{if(!v&&!(!i?.onMutation||!e.objectName))return i.onMutation(t=>{t.resource===e.objectName&&R(e=>e+1)})},[i,e.objectName,v]);let{ref:z,isRefreshing:B,pullDistance:V}=(0,c.usePullToRefresh)({onRefresh:(0,t.useCallback)(async()=>{R(e=>e+1)},[]),enabled:!!i&&!!e.objectName}),H=(0,t.useMemo)(()=>O(e),[e.data,e.staticData,e.objectName]),U=(0,t.useMemo)(()=>A(e),[e.filter,e.calendar,e.dateField,e.endField,e.titleField,e.colorField]),W=H?.provider===`value`,G=(0,t.useRef)(null);G.current=E,(0,t.useEffect)(()=>{v&&x(l)},[l,v]),(0,t.useEffect)(()=>{v&&u!==void 0&&C(u)},[u,v]),(0,t.useEffect)(()=>{if(v)return;let t=!0;return(async()=>{try{if(!t)return;if(C(!0),W&&H?.provider===`value`){t&&(x(H.items),C(!1));return}if(!i||typeof i.find!=`function`)throw Error(`DataSource required for object/api providers`);if(H?.provider===`object`){let r=H.object,a=(0,n.buildExpandFields)(G.current?.fields),o=(0,n.extractRecords)(await i.find(r,{$filter:e.filter,$orderby:k(e.sort),...a.length>0?{$expand:a}:{}}));t&&x(o)}else H?.provider===`api`&&(console.warn(`API provider not yet implemented for ObjectCalendar`),t&&x([]));t&&C(!1)}catch(e){console.error(`[ObjectCalendar] Error fetching data:`,e),t&&(T(e),C(!1))}})(),()=>{t=!1}},[v,H,i,W,e.filter,e.sort,L]),(0,t.useEffect)(()=>{!W&&i&&(async()=>{try{if(!i)return;let t=H?.provider===`object`?H.object:e.objectName;if(!t)return;D(await i.getObjectSchema(t))}catch(e){console.error(`Failed to fetch object schema:`,e)}})()},[e.objectName,i,W,H]);let K=(0,t.useMemo)(()=>{if(!U||!y.length)return[];let{startDateField:e,endDateField:t,titleField:n,colorField:r}=U,i=E?.titleFormat,a=E?.NAME_FIELD_KEY,o=[`name`,`full_name`,`fullName`,`title`,`subject`,`label`,`display_name`,`displayName`],s=(e,t)=>{let n=`[-\\u2013\\u2014|/·,:]`,r=!1,i=e.replace(/\{([^{}]+)\}/g,(e,n)=>{let i=t[n.trim()];return i!=null&&i!==``?(r=!0,String(i)):`\0`});return r?i.replace(RegExp(`\\s*${n}\\s*`,`g`),``).replace(RegExp(`\\s*${n}\\s*`,`g`),``).replace(RegExp(`\0`,`g`),``).replace(/\s+/g,` `).trim():``},c=e=>{let t;if(n&&(t=e[n],typeof t==`string`&&(t=t.trim())),!t&&i){let n=s(i,e);n&&(t=n)}if(!t&&a){let n=e[a];typeof n==`string`?t=n.trim():n&&(t=n)}if(!t)for(let n of o){let r=e[n],i=typeof r==`string`?r.trim():r;if(i){t=i;break}}return t||`Untitled`};return y.map((n,i)=>{let a=n[e],o=t?n[t]:null,s=c(n),l=r?n[r]:void 0;return{id:n.id||n._id||`event-${i}`,title:s,start:a?new Date(a):new Date,end:o?new Date(o):void 0,color:l,allDay:!o,data:n}}).filter(e=>!isNaN(e.start.getTime()))},[y,U,E]);(0,t.useCallback)(()=>{p?.(new Date)},[p]);let q=(0,r.useNavigationOverlay)({navigation:e.navigation,objectName:e.objectName,onRowClick:f});return S?(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsx)(`div`,{className:`text-muted-foreground`,children:`Loading calendar...`})})}):w?(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsxs)(`div`,{className:`text-destructive`,children:[`Error: `,w.message]})})}):U?(0,s.jsxs)(`div`,{ref:z,className:o,children:[V>0&&(0,s.jsx)(`div`,{className:`flex items-center justify-center text-xs text-muted-foreground`,style:{height:V},children:B?`Refreshing…`:`Pull to refresh`}),(0,s.jsx)(`div`,{className:`border rounded-lg bg-background h-[calc(100vh-120px)] sm:h-[calc(100vh-160px)] md:h-[calc(100vh-200px)] min-h-[400px] sm:min-h-[600px]`,children:(0,s.jsx)(b,{events:K,currentDate:j,view:F,locale:_,onEventClick:e=>{q.handleClick(e.data),d?.(e.data)},onDateClick:p,onNavigate:e=>{M(e),m?.(e)},onViewChange:e=>{I(e),h?.(e)},onAddClick:void 0,onEventDrop:g?(e,t,n)=>{g(e.data,t,n)}:void 0})}),q.isOverlay&&(0,s.jsx)(a.NavigationOverlay,{...q,title:`Event Details`,children:e=>(0,s.jsx)(`div`,{className:`space-y-3`,children:Object.entries(e).map(([e,t])=>(0,s.jsxs)(`div`,{className:`flex flex-col`,children:[(0,s.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:e.replace(/_/g,` `)}),(0,s.jsx)(`span`,{className:`text-sm`,children:String(t??`—`)})]},e))})})]}):(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsx)(`div`,{className:`text-muted-foreground`,children:`Calendar configuration required. Please specify startDateField and titleField.`})})})};n.ComponentRegistry.register(`calendar-view`,({schema:e,className:n,onAction:r,...i})=>{let a=t.default.useMemo(()=>!e.data||!Array.isArray(e.data)?[]:e.data.map((t,n)=>{let r=e.titleField||`title`,i=e.startDateField||`start`,a=e.endDateField||`end`,o=e.colorField||`color`,s=e.allDayField||`allDay`;return{id:t.id||t._id||n,title:t[r]||`Untitled Event`,start:new Date(t[i]),end:t[a]?new Date(t[a]):void 0,allDay:t[s],color:t[o],data:t}}),[e.data,e.titleField,e.startDateField,e.endDateField,e.colorField,e.allDayField]);return(0,s.jsx)(b,{className:n,events:a,onEventClick:e=>{r?.({type:`event-click`,payload:e})},...i})},{namespace:`plugin-calendar`,label:`Calendar View`,inputs:[{name:`data`,type:`array`,label:`Data`,description:`Array of record objects to display as events`},{name:`titleField`,type:`string`,label:`Title Field`,defaultValue:`title`,description:`Field name to use for event title`},{name:`startDateField`,type:`string`,label:`Start Date Field`,defaultValue:`start`,description:`Field name for event start date`},{name:`endDateField`,type:`string`,label:`End Date Field`,defaultValue:`end`,description:`Field name for event end date (optional)`},{name:`allDayField`,type:`string`,label:`All Day Field`,defaultValue:`allDay`,description:`Field name for all-day flag`},{name:`colorField`,type:`string`,label:`Color Field`,defaultValue:`color`,description:`Field name for event color`},{name:`colorMapping`,type:`object`,label:`Color Mapping`,description:`Map field values to colors (e.g., {meeting: "blue", deadline: "red"})`},{name:`view`,type:`enum`,enum:[`month`,`week`,`day`],defaultValue:`month`,label:`View Mode`,description:`Calendar view mode (month, week, or day)`},{name:`currentDate`,type:`string`,label:`Current Date`,description:`ISO date string for initial calendar date`},{name:`allowCreate`,type:`boolean`,label:`Allow Create`,defaultValue:!1,description:`Allow creating events by clicking on dates`},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{view:`month`,titleField:`title`,startDateField:`start`,endDateField:`end`,allDayField:`allDay`,colorField:`color`,allowCreate:!1,data:[{id:1,title:`Team Meeting`,start:new Date(new Date().setHours(10,0,0,0)).toISOString(),end:new Date(new Date().setHours(11,0,0,0)).toISOString(),color:`#3b82f6`,allDay:!1},{id:2,title:`Project Deadline`,start:new Date(new Date().setDate(new Date().getDate()+3)).toISOString(),color:`#ef4444`,allDay:!0},{id:3,title:`Conference`,start:new Date(new Date().setDate(new Date().getDate()+7)).toISOString(),end:new Date(new Date().setDate(new Date().getDate()+9)).toISOString(),color:`#10b981`,allDay:!0}],className:`h-[600px] border rounded-lg`}});var M=({schema:e,...t})=>{let{dataSource:n}=(0,r.useSchemaContext)()||{};return(0,s.jsx)(j,{schema:e,dataSource:n,...t})};n.ComponentRegistry.register(`object-calendar`,M,{namespace:`plugin-calendar`,label:`Object Calendar`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`calendar`,type:`object`,label:`Calendar Config`,description:`startDateField, endDateField, titleField, colorField`}]}),n.ComponentRegistry.register(`calendar`,M,{namespace:`view`,label:`Calendar View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`calendar`,type:`object`,label:`Calendar Config`,description:`startDateField, endDateField, titleField, colorField`}]}),e.CalendarView=b,e.ObjectCalendar=j,e.ObjectCalendarRenderer=M});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`react`),require(`@object-ui/core`),require(`@object-ui/react`),require(`lucide-react`),require(`@object-ui/components`),require(`@object-ui/i18n`),require(`react/jsx-runtime`),require(`@object-ui/mobile`)):typeof define==`function`&&define.amd?define([`exports`,`react`,`@object-ui/core`,`@object-ui/react`,`lucide-react`,`@object-ui/components`,`@object-ui/i18n`,`react/jsx-runtime`,`@object-ui/mobile`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.ObjectUIPluginCalendar={},e.React,e.ObjectUICore,e.ObjectUIReact,e.LucideReact,e.ObjectUIComponents,e._object_ui_i18n,e.react_jsx_runtime,e._object_ui_mobile))})(this,function(e,t,n,r,i,a,o,s,c){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var l=Object.create,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor,f=Object.getOwnPropertyNames,p=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,h=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=f(t),a=0,o=i.length,s;a<o;a++)s=i[a],!m.call(e,s)&&s!==n&&u(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=d(t,s))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:l(p(e)),h(t||!e||!e.__esModule?u(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);var g=`bg-blue-500 text-white`,_=new Date,v={"calendar.today":`Today`,"calendar.month":`Month`,"calendar.week":`Week`,"calendar.day":`Day`,"calendar.newEvent":`New event`,"calendar.moreEvents":`+{{count}} more`};function y(){try{let e=(0,o.useObjectTranslation)();return e.t(`calendar.today`)===`calendar.today`?{t:(e,t)=>{let n=v[e]||e;if(t)for(let[e,r]of Object.entries(t))n=n.replace(`{{${e}}}`,String(r));return n},language:`en`}:{t:e.t,language:e.language}}catch{return{t:(e,t)=>{let n=v[e]||e;if(t)for(let[e,r]of Object.entries(t))n=n.replace(`{{${e}}}`,String(r));return n},language:`en`}}}function b({events:e=[],view:n=`month`,currentDate:r=_,locale:o=`default`,onEventClick:c,onDateClick:l,onViewChange:u,onNavigate:d,onAddClick:f,onEventDrop:p,className:m}){let[h,g]=t.useState(n),[v,b]=t.useState(r),{t:S,language:C}=y(),w=o===`default`?C:o;t.useEffect(()=>{b(r)},[r]),t.useEffect(()=>{g(n)},[n]);let O=t.useRef(u);O.current=u,t.useEffect(()=>{let e=window.matchMedia(`(max-width: 639px)`),t=e=>{e.matches&&(g(`day`),O.current?.(`day`))};return t(e),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]);let k=()=>{let e=new Date(v);h===`month`?e.setMonth(e.getMonth()-1):h===`week`?e.setDate(e.getDate()-7):e.setDate(e.getDate()-1),b(e),d?.(e)},A=()=>{let e=new Date(v);h===`month`?e.setMonth(e.getMonth()+1):h===`week`?e.setDate(e.getDate()+7):e.setDate(e.getDate()+1),b(e),d?.(e)},j=()=>{let e=new Date;b(e),d?.(e)},M=e=>{g(e),u?.(e)},N=()=>{if(h===`month`)return v.toLocaleDateString(w,{month:`long`,year:`numeric`});if(h===`week`){let e=x(v),t=new Date(e);return t.setDate(t.getDate()+6),`${e.toLocaleDateString(w,{month:`short`,day:`numeric`})} - ${t.toLocaleDateString(w,{month:`short`,day:`numeric`,year:`numeric`})}`}else return v.toLocaleDateString(w,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})},P=t.useRef(0);return(0,s.jsxs)(`div`,{role:`region`,"aria-label":`Calendar`,className:(0,a.cn)(`flex flex-col h-full bg-background min-w-0 overflow-hidden`,m),children:[(0,s.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 p-2 sm:p-4 border-b min-w-0`,children:[(0,s.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,s.jsxs)(`div`,{className:`flex items-center bg-muted/50 rounded-lg p-1 gap-1`,children:[(0,s.jsx)(a.Button,{variant:`ghost`,size:`sm`,onClick:j,className:`h-8`,"aria-label":`Go to today`,children:S(`calendar.today`)}),(0,s.jsx)(`div`,{className:`h-4 w-px bg-border mx-1`}),(0,s.jsx)(a.Button,{variant:`ghost`,size:`icon`,"aria-label":`Previous period`,onClick:k,className:`h-8 w-8`,children:(0,s.jsx)(i.ChevronLeftIcon,{className:`h-4 w-4`})}),(0,s.jsx)(a.Button,{variant:`ghost`,size:`icon`,"aria-label":`Next period`,onClick:A,className:`h-8 w-8`,children:(0,s.jsx)(i.ChevronRightIcon,{className:`h-4 w-4`})})]}),(0,s.jsxs)(a.Popover,{children:[(0,s.jsx)(a.PopoverTrigger,{asChild:!0,children:(0,s.jsxs)(a.Button,{variant:`ghost`,"aria-label":`Current date: ${N()}`,className:(0,a.cn)(`text-base sm:text-xl font-semibold h-auto px-2 sm:px-3 py-1 hover:bg-muted/50 transition-colors`,`flex items-center gap-2`),children:[(0,s.jsx)(i.CalendarIcon,{className:`h-5 w-5 text-muted-foreground`}),(0,s.jsx)(`span`,{children:N()})]})}),(0,s.jsx)(a.PopoverContent,{className:`w-auto p-0`,align:`start`,children:(0,s.jsx)(a.Calendar,{mode:`single`,selected:v,onSelect:e=>{e&&(b(e),d?.(e))},initialFocus:!0,fromYear:2e3,toYear:2050})})]})]}),(0,s.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,s.jsxs)(a.Select,{value:h,onValueChange:M,children:[(0,s.jsx)(a.SelectTrigger,{className:`w-32 bg-background`,children:(0,s.jsx)(a.SelectValue,{})}),(0,s.jsxs)(a.SelectContent,{children:[(0,s.jsx)(a.SelectItem,{value:`day`,children:S(`calendar.day`)}),(0,s.jsx)(a.SelectItem,{value:`week`,children:S(`calendar.week`)}),(0,s.jsx)(a.SelectItem,{value:`month`,children:S(`calendar.month`)})]})]}),f&&(0,s.jsxs)(a.Button,{onClick:f,size:`sm`,className:`gap-1`,children:[(0,s.jsx)(i.PlusIcon,{className:`h-4 w-4`}),S(`calendar.newEvent`)]})]})]}),(0,s.jsxs)(`div`,{className:`flex-1 overflow-auto`,onTouchStart:e=>{P.current=e.touches[0].clientX},onTouchEnd:e=>{let t=P.current-e.changedTouches[0].clientX;if(Math.abs(t)>50){let e=new Date(v);h===`day`?e.setDate(e.getDate()+(t>0?1:-1)):h===`week`?e.setDate(e.getDate()+(t>0?7:-7)):e.setMonth(e.getMonth()+(t>0?1:-1)),b(e),d?.(e)}},children:[h===`month`&&(0,s.jsx)(T,{date:v,events:e,locale:w,onEventClick:c,onDateClick:l,onEventDrop:p}),h===`week`&&(0,s.jsx)(E,{date:v,events:e,locale:w,onEventClick:c,onDateClick:l}),h===`day`&&(0,s.jsx)(D,{date:v,events:e,onEventClick:c,onDateClick:l})]})]})}function x(e){let t=new Date(e),n=t.getDay(),r=t.getDate()-n;return t.setDate(r),t}function S(e){let t=e.getFullYear(),n=e.getMonth(),r=new Date(t,n,1),i=new Date(t,n+1,0),a=r.getDay(),o=[];for(let e=a-1;e>=0;e--){let t=new Date(r.getTime());t.setDate(t.getDate()-(e+1)),o.push(t)}for(let e=1;e<=i.getDate();e++)o.push(new Date(t,n,e));let s=42-o.length;for(let e=1;e<=s;e++){let t=new Date(i.getTime());t.setDate(t.getDate()+e),o.push(t)}return o}function C(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function w(e,t){return t.filter(t=>{let n=new Date(t.start),r=t.end?new Date(t.end):new Date(n),i=new Date(e);i.setHours(0,0,0,0);let a=new Date(e);a.setHours(23,59,59,999);let o=new Date(n);o.setHours(0,0,0,0);let s=new Date(r);return s.setHours(23,59,59,999),i<=s&&a>=o})}function T({date:e,events:n,locale:r=`default`,onEventClick:i,onDateClick:o,onEventDrop:c}){let l=t.useMemo(()=>S(e),[e.getFullYear(),e.getMonth()]),u=t.useMemo(()=>new Date,[]),{t:d}=y(),f=t.useMemo(()=>{let e=new Date(2024,0,7);return Array.from({length:7},(t,n)=>{let i=new Date(e);return i.setDate(i.getDate()+n),i.toLocaleDateString(r,{weekday:`short`})})},[r]),[p,m]=t.useState(null),[h,_]=t.useState(null),v=t.useMemo(()=>{let e=new Map;for(let t of n){let n=new Date(t.start),r=t.end?new Date(t.end):new Date(n);n.setHours(0,0,0,0),r.setHours(0,0,0,0);let i=new Date(n);for(;i<=r;){let n=`${i.getFullYear()}-${i.getMonth()}-${i.getDate()}`,r=e.get(n);r?r.push(t):e.set(n,[t]),i.setDate(i.getDate()+1)}}return e},[n]),b=(e,t)=>{m(t.id),e.dataTransfer.effectAllowed=`move`,e.dataTransfer.setData(`text/plain`,String(t.id))},x=()=>{m(null),_(null)},w=(e,t)=>{e.preventDefault(),e.dataTransfer.dropEffect=`move`,_(t)},T=e=>{e.currentTarget.contains(e.relatedTarget)||_(null)},E=(e,t)=>{if(e.preventDefault(),_(null),m(null),!c)return;let r=e.dataTransfer.getData(`text/plain`),i=n.find(e=>String(e.id)===r);if(!i)return;let a=new Date(i.start),o=new Date(a);o.setHours(0,0,0,0);let s=new Date(t);s.setHours(0,0,0,0);let l=s.getTime()-o.getTime();if(l===0)return;let u=new Date(a.getTime()+l),d;i.end&&(d=new Date(new Date(i.end).getTime()+l)),c(i,u,d)};return(0,s.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,s.jsx)(`div`,{role:`row`,className:`grid grid-cols-7 border-b`,children:f.map(e=>(0,s.jsx)(`div`,{role:`columnheader`,className:`p-2 text-center text-sm font-medium text-muted-foreground border-r last:border-r-0`,children:e},e))}),(0,s.jsx)(`div`,{role:`grid`,"aria-label":`Calendar grid`,className:`grid grid-cols-7 flex-1 auto-rows-fr`,children:l.map((t,n)=>{let r=`${t.getFullYear()}-${t.getMonth()}-${t.getDate()}`,l=v.get(r)||[],f=t.getMonth()===e.getMonth(),m=C(t,u);return(0,s.jsxs)(`div`,{role:`gridcell`,"aria-label":`${t.toLocaleDateString(`default`,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})}${l.length>0?`, ${l.length} event${l.length>1?`s`:``}`:``}`,className:(0,a.cn)(`border-b border-r last:border-r-0 p-2 min-h-[100px] cursor-pointer hover:bg-accent/50`,!f&&`bg-muted/50 text-muted-foreground opacity-50`,h===n&&`ring-2 ring-primary`),onClick:()=>o?.(t),onDragOver:e=>w(e,n),onDragLeave:T,onDrop:e=>E(e,t),children:[(0,s.jsx)(`div`,{className:(0,a.cn)(`text-sm font-medium mb-2`,m&&`inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground h-6 w-6`),...m?{"aria-current":`date`}:{},children:t.getDate()}),(0,s.jsxs)(`div`,{className:`space-y-1`,children:[l.slice(0,3).map(e=>(0,s.jsx)(`div`,{role:`button`,title:e.title,"aria-label":e.title,draggable:!!c,onDragStart:t=>b(t,e),onDragEnd:x,className:(0,a.cn)(`text-xs px-2 py-1 rounded truncate cursor-pointer hover:opacity-80`,e.color?.startsWith(`#`)?`text-white`:e.color||g,p===e.id&&`opacity-50`),style:e.color&&e.color.startsWith(`#`)?{backgroundColor:e.color}:void 0,onClick:t=>{t.stopPropagation(),i?.(e)},children:e.title},e.id)),l.length>3&&(0,s.jsx)(`div`,{className:`text-xs text-muted-foreground px-2`,children:d(`calendar.moreEvents`,{count:l.length-3})})]})]},n)})})]})}function E({date:e,events:n,locale:r=`default`,onEventClick:i,onDateClick:o}){let c=t.useRef(null),l=e=>{o&&(c.current=setTimeout(()=>{o(e)},500))},u=()=>{c.current&&=(clearTimeout(c.current),null)},d=x(e),f=Array.from({length:7},(e,t)=>{let n=new Date(d);return n.setDate(n.getDate()+t),n}),p=new Date;return(0,s.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,s.jsx)(`div`,{className:`grid grid-cols-7 border-b`,children:f.map(e=>{let t=C(e,p);return(0,s.jsxs)(`div`,{className:`p-3 text-center border-r last:border-r-0`,children:[(0,s.jsx)(`div`,{className:`text-sm font-medium text-muted-foreground`,children:e.toLocaleDateString(r,{weekday:`short`})}),(0,s.jsx)(`div`,{className:(0,a.cn)(`text-lg font-semibold mt-1`,t&&`inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground h-8 w-8`),children:e.getDate()})]},e.toISOString())})}),(0,s.jsx)(`div`,{role:`grid`,className:`grid grid-cols-7 flex-1`,children:f.map(e=>{let t=w(e,n);return(0,s.jsx)(`div`,{role:`gridcell`,"aria-label":`${e.toLocaleDateString(`default`,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`})}${t.length>0?`, ${t.length} event${t.length>1?`s`:``}`:``}`,className:`border-r last:border-r-0 p-2 min-h-[400px] cursor-pointer hover:bg-accent/50`,onClick:()=>o?.(e),onTouchStart:()=>l(e),onTouchEnd:u,children:(0,s.jsx)(`div`,{className:`space-y-2`,children:t.map(e=>(0,s.jsxs)(`div`,{role:`button`,title:e.title,"aria-label":e.title,className:(0,a.cn)(`text-xs sm:text-sm px-2 sm:px-3 py-1.5 sm:py-2 rounded cursor-pointer hover:opacity-80`,e.color?.startsWith(`#`)?`text-white`:e.color||g),style:e.color&&e.color.startsWith(`#`)?{backgroundColor:e.color}:void 0,onClick:t=>{t.stopPropagation(),i?.(e)},children:[(0,s.jsx)(`div`,{className:`font-medium truncate`,children:e.title}),!e.allDay&&(0,s.jsx)(`div`,{className:`text-xs opacity-90 mt-1`,children:e.start.toLocaleTimeString(`default`,{hour:`numeric`,minute:`2-digit`})})]},e.id))})},e.toISOString())})})]})}function D({date:e,events:n,onEventClick:r,onDateClick:i}){let o=w(e,n),c=Array.from({length:24},(e,t)=>t),l=t.useRef(null),u=t=>{i&&(l.current=setTimeout(()=>{let n=new Date(e);n.setHours(t,0,0,0),i(n)},500))},d=()=>{l.current&&=(clearTimeout(l.current),null)};return(0,s.jsx)(`div`,{className:`flex flex-col h-full`,children:(0,s.jsx)(`div`,{role:`list`,className:`flex-1 overflow-auto`,children:c.map(e=>{let t=o.filter(t=>t.allDay?e===0:t.start.getHours()===e);return(0,s.jsxs)(`div`,{role:`listitem`,className:`flex border-b min-h-[60px]`,children:[(0,s.jsx)(`div`,{className:`w-20 p-2 text-sm text-muted-foreground border-r`,children:e===0?`12 AM`:e<12?`${e} AM`:e===12?`12 PM`:`${e-12} PM`}),(0,s.jsx)(`div`,{className:`flex-1 p-2 space-y-2`,onTouchStart:()=>u(e),onTouchEnd:d,children:t.map(e=>(0,s.jsxs)(`div`,{title:e.title,"aria-label":e.title,className:(0,a.cn)(`px-2 sm:px-3 py-1.5 sm:py-2 rounded cursor-pointer hover:opacity-80`,e.color?.startsWith(`#`)?`text-white`:e.color||g),style:e.color&&e.color.startsWith(`#`)?{backgroundColor:e.color}:void 0,onClick:()=>r?.(e),children:[(0,s.jsx)(`div`,{className:`font-medium truncate`,children:e.title}),!e.allDay&&(0,s.jsxs)(`div`,{className:`text-xs opacity-90 mt-1`,children:[e.start.toLocaleTimeString(`default`,{hour:`numeric`,minute:`2-digit`}),e.end&&` - ${e.end.toLocaleTimeString(`default`,{hour:`numeric`,minute:`2-digit`})}`]})]},e.id))})]},e)})})})}function O(e){return`data`in e&&e.data?e.data:`staticData`in e&&e.staticData?{provider:`value`,items:e.staticData}:e.objectName?{provider:`object`,object:e.objectName}:null}function k(e){if(e){if(typeof e==`string`){let t=e.split(` `),n=t[0],r=t[1]?.toLowerCase()===`desc`?`desc`:`asc`;return{[n]:r}}if(Array.isArray(e))return e.reduce((e,t)=>(t.field&&t.order&&(e[t.field]=t.order),e),{})}}function A(e){return`filter`in e&&e.filter&&typeof e.filter==`object`&&`calendar`in e.filter?e.filter.calendar:e.calendar?e.calendar:e.startDateField||e.dateField?{startDateField:e.startDateField||e.dateField,endDateField:e.endDateField||e.endField,titleField:e.titleField,colorField:e.colorField,allDayField:e.allDayField}:null}var j=({schema:e,dataSource:i,className:o,data:l,loading:u,onEventClick:d,onRowClick:f,onDateClick:p,onNavigate:m,onViewChange:h,onEventDrop:g,locale:_})=>{let v=Array.isArray(l),[y,x]=(0,t.useState)(v?l:[]),[S,C]=(0,t.useState)(v?u??!1:!0),[w,T]=(0,t.useState)(null),[E,D]=(0,t.useState)(null),[j,M]=(0,t.useState)(new Date),N=(0,a.useIsMobile)(),P=e.defaultView,[F,I]=(0,t.useState)(()=>{let e=P===`day`||!P;return typeof window<`u`&&window.innerWidth<768&&e?`month`:P||`month`});(0,t.useEffect)(()=>{N&&F===`day`&&(P===`day`||!P)&&I(`month`)},[N]);let[L,R]=(0,t.useState)(0);(0,t.useEffect)(()=>{if(!v&&!(!i?.onMutation||!e.objectName))return i.onMutation(t=>{t.resource===e.objectName&&R(e=>e+1)})},[i,e.objectName,v]);let{ref:z,isRefreshing:B,pullDistance:V}=(0,c.usePullToRefresh)({onRefresh:(0,t.useCallback)(async()=>{R(e=>e+1)},[]),enabled:!!i&&!!e.objectName}),H=(0,t.useMemo)(()=>O(e),[e.data,e.staticData,e.objectName]),U=(0,t.useMemo)(()=>A(e),[e.filter,e.calendar,e.dateField,e.endField,e.titleField,e.colorField]),W=H?.provider===`value`,G=(0,t.useRef)(null);G.current=E,(0,t.useEffect)(()=>{v&&x(l)},[l,v]),(0,t.useEffect)(()=>{v&&u!==void 0&&C(u)},[u,v]),(0,t.useEffect)(()=>{if(v)return;let t=!0;return(async()=>{try{if(!t)return;if(C(!0),W&&H?.provider===`value`){t&&(x(H.items),C(!1));return}if(!i||typeof i.find!=`function`)throw Error(`DataSource required for object/api providers`);if(H?.provider===`object`){let r=H.object,a=(0,n.buildExpandFields)(G.current?.fields),o=(0,n.extractRecords)(await i.find(r,{$filter:e.filter,$orderby:k(e.sort),...a.length>0?{$expand:a}:{}}));t&&x(o)}else H?.provider===`api`&&(console.warn(`API provider not yet implemented for ObjectCalendar`),t&&x([]));t&&C(!1)}catch(e){console.error(`[ObjectCalendar] Error fetching data:`,e),t&&(T(e),C(!1))}})(),()=>{t=!1}},[v,H,i,W,e.filter,e.sort,L]),(0,t.useEffect)(()=>{!W&&i&&(async()=>{try{if(!i)return;let t=H?.provider===`object`?H.object:e.objectName;if(!t)return;D(await i.getObjectSchema(t))}catch(e){console.error(`Failed to fetch object schema:`,e)}})()},[e.objectName,i,W,H]);let K=(0,t.useMemo)(()=>{if(!U||!y.length)return[];let{startDateField:e,endDateField:t,titleField:n,colorField:r}=U,i=E?.titleFormat,a=typeof i==`string`?i:i&&typeof i==`object`&&typeof i.source==`string`?i.source:void 0,o=E?.NAME_FIELD_KEY,s=[`name`,`full_name`,`fullName`,`title`,`subject`,`label`,`display_name`,`displayName`],c=(e,t)=>{let n=`[-\\u2013\\u2014|/·,:]`,r=!1,i=e.replace(/\{([^{}]+)\}/g,(e,n)=>{let i=t[n.trim()];return i!=null&&i!==``?(r=!0,String(i)):`\0`});return r?i.replace(RegExp(`\\s*${n}\\s*`,`g`),``).replace(RegExp(`\\s*${n}\\s*`,`g`),``).replace(RegExp(`\0`,`g`),``).replace(/\s+/g,` `).trim():``},l=e=>{let t;if(n&&(t=e[n],typeof t==`string`&&(t=t.trim())),!t&&a){let n=c(a,e);n&&(t=n)}if(!t&&o){let n=e[o];typeof n==`string`?t=n.trim():n&&(t=n)}if(!t)for(let n of s){let r=e[n],i=typeof r==`string`?r.trim():r;if(i){t=i;break}}return t||`Untitled`};return y.map((n,i)=>{let a=n[e],o=t?n[t]:null,s=l(n),c=r?n[r]:void 0;return{id:n.id||n._id||`event-${i}`,title:s,start:a?new Date(a):new Date,end:o?new Date(o):void 0,color:c,allDay:!o,data:n}}).filter(e=>!isNaN(e.start.getTime()))},[y,U,E]);(0,t.useCallback)(()=>{p?.(new Date)},[p]);let q=(0,r.useNavigationOverlay)({navigation:e.navigation,objectName:e.objectName,onRowClick:f});return S?(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsx)(`div`,{className:`text-muted-foreground`,children:`Loading calendar...`})})}):w?(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsxs)(`div`,{className:`text-destructive`,children:[`Error: `,w.message]})})}):U?(0,s.jsxs)(`div`,{ref:z,className:o,children:[V>0&&(0,s.jsx)(`div`,{className:`flex items-center justify-center text-xs text-muted-foreground`,style:{height:V},children:B?`Refreshing…`:`Pull to refresh`}),(0,s.jsx)(`div`,{className:`border rounded-lg bg-background h-[calc(100vh-120px)] sm:h-[calc(100vh-160px)] md:h-[calc(100vh-200px)] min-h-[400px] sm:min-h-[600px]`,children:(0,s.jsx)(b,{events:K,currentDate:j,view:F,locale:_,onEventClick:e=>{q.handleClick(e.data),d?.(e.data)},onDateClick:p,onNavigate:e=>{M(e),m?.(e)},onViewChange:e=>{I(e),h?.(e)},onAddClick:void 0,onEventDrop:g?(e,t,n)=>{g(e.data,t,n)}:void 0})}),q.isOverlay&&(0,s.jsx)(a.NavigationOverlay,{...q,title:`Event Details`,children:e=>(0,s.jsx)(`div`,{className:`space-y-3`,children:Object.entries(e).map(([e,t])=>(0,s.jsxs)(`div`,{className:`flex flex-col`,children:[(0,s.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wide`,children:e.replace(/_/g,` `)}),(0,s.jsx)(`span`,{className:`text-sm`,children:String(t??`—`)})]},e))})})]}):(0,s.jsx)(`div`,{className:o,children:(0,s.jsx)(`div`,{className:`flex items-center justify-center h-96`,children:(0,s.jsx)(`div`,{className:`text-muted-foreground`,children:`Calendar configuration required. Please specify startDateField and titleField.`})})})};n.ComponentRegistry.register(`calendar-view`,({schema:e,className:n,onAction:r,...i})=>{let a=t.default.useMemo(()=>!e.data||!Array.isArray(e.data)?[]:e.data.map((t,n)=>{let r=e.titleField||`title`,i=e.startDateField||`start`,a=e.endDateField||`end`,o=e.colorField||`color`,s=e.allDayField||`allDay`;return{id:t.id||t._id||n,title:t[r]||`Untitled Event`,start:new Date(t[i]),end:t[a]?new Date(t[a]):void 0,allDay:t[s],color:t[o],data:t}}),[e.data,e.titleField,e.startDateField,e.endDateField,e.colorField,e.allDayField]);return(0,s.jsx)(b,{className:n,events:a,onEventClick:e=>{r?.({type:`event-click`,payload:e})},...i})},{namespace:`plugin-calendar`,label:`Calendar View`,inputs:[{name:`data`,type:`array`,label:`Data`,description:`Array of record objects to display as events`},{name:`titleField`,type:`string`,label:`Title Field`,defaultValue:`title`,description:`Field name to use for event title`},{name:`startDateField`,type:`string`,label:`Start Date Field`,defaultValue:`start`,description:`Field name for event start date`},{name:`endDateField`,type:`string`,label:`End Date Field`,defaultValue:`end`,description:`Field name for event end date (optional)`},{name:`allDayField`,type:`string`,label:`All Day Field`,defaultValue:`allDay`,description:`Field name for all-day flag`},{name:`colorField`,type:`string`,label:`Color Field`,defaultValue:`color`,description:`Field name for event color`},{name:`colorMapping`,type:`object`,label:`Color Mapping`,description:`Map field values to colors (e.g., {meeting: "blue", deadline: "red"})`},{name:`view`,type:`enum`,enum:[`month`,`week`,`day`],defaultValue:`month`,label:`View Mode`,description:`Calendar view mode (month, week, or day)`},{name:`currentDate`,type:`string`,label:`Current Date`,description:`ISO date string for initial calendar date`},{name:`allowCreate`,type:`boolean`,label:`Allow Create`,defaultValue:!1,description:`Allow creating events by clicking on dates`},{name:`className`,type:`string`,label:`CSS Class`}],defaultProps:{view:`month`,titleField:`title`,startDateField:`start`,endDateField:`end`,allDayField:`allDay`,colorField:`color`,allowCreate:!1,data:[{id:1,title:`Team Meeting`,start:new Date(new Date().setHours(10,0,0,0)).toISOString(),end:new Date(new Date().setHours(11,0,0,0)).toISOString(),color:`#3b82f6`,allDay:!1},{id:2,title:`Project Deadline`,start:new Date(new Date().setDate(new Date().getDate()+3)).toISOString(),color:`#ef4444`,allDay:!0},{id:3,title:`Conference`,start:new Date(new Date().setDate(new Date().getDate()+7)).toISOString(),end:new Date(new Date().setDate(new Date().getDate()+9)).toISOString(),color:`#10b981`,allDay:!0}],className:`h-[600px] border rounded-lg`}});var M=({schema:e,...t})=>{let{dataSource:n}=(0,r.useSchemaContext)()||{};return(0,s.jsx)(j,{schema:e,dataSource:n,...t})};n.ComponentRegistry.register(`object-calendar`,M,{namespace:`plugin-calendar`,label:`Object Calendar`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`calendar`,type:`object`,label:`Calendar Config`,description:`startDateField, endDateField, titleField, colorField`}]}),n.ComponentRegistry.register(`calendar`,M,{namespace:`view`,label:`Calendar View`,category:`view`,inputs:[{name:`objectName`,type:`string`,label:`Object Name`,required:!0},{name:`calendar`,type:`object`,label:`Calendar Config`,description:`startDateField, endDateField, titleField, colorField`}]}),e.CalendarView=b,e.ObjectCalendar=j,e.ObjectCalendarRenderer=M});
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectCalendar.d.ts","sourceRoot":"","sources":["../../../../src/ObjectCalendar.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAC;AAO/F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,wBAAwB;IACxB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAAC;IAC1C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6GAA6G;IAC7G,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;IACxD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkFD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAsWxD,CAAC"}
1
+ {"version":3,"file":"ObjectCalendar.d.ts","sourceRoot":"","sources":["../../../../src/ObjectCalendar.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAC;AAO/F,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,wBAAwB;IACxB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAAC;IAC1C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6GAA6G;IAC7G,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,2FAA2F;IAC3F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;IACxD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkFD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA4WxD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@object-ui/plugin-calendar",
3
- "version": "4.0.6",
3
+ "version": "4.0.7",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Calendar view plugins for Object UI - includes both ObjectQL-integrated and standalone calendar components",
@@ -25,13 +25,13 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "lucide-react": "^1.14.0",
28
- "@object-ui/components": "4.0.6",
29
- "@object-ui/core": "4.0.6",
30
- "@object-ui/fields": "4.0.6",
31
- "@object-ui/i18n": "4.0.6",
32
- "@object-ui/mobile": "4.0.6",
33
- "@object-ui/react": "4.0.6",
34
- "@object-ui/types": "4.0.6"
28
+ "@object-ui/components": "4.0.7",
29
+ "@object-ui/core": "4.0.7",
30
+ "@object-ui/fields": "4.0.7",
31
+ "@object-ui/i18n": "4.0.7",
32
+ "@object-ui/mobile": "4.0.7",
33
+ "@object-ui/react": "4.0.7",
34
+ "@object-ui/types": "4.0.7"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "react": "^18.0.0 || ^19.0.0",
@@ -44,7 +44,7 @@
44
44
  "typescript": "^6.0.3",
45
45
  "vite": "^8.0.10",
46
46
  "vite-plugin-dts": "^5.0.0",
47
- "@object-ui/data-objectstack": "4.0.6"
47
+ "@object-ui/data-objectstack": "4.0.7"
48
48
  },
49
49
  "keywords": [
50
50
  "objectui",