@object-ui/plugin-view 3.0.2 → 3.0.3
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/.turbo/turbo-build.log +5 -5
- package/CHANGELOG.md +11 -0
- package/dist/index.js +367 -347
- package/dist/index.umd.cjs +2 -2
- package/package.json +7 -7
- package/src/ObjectView.tsx +32 -16
package/dist/index.umd.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(I,b){typeof exports=="object"&&typeof module<"u"?b(exports,require("react"),require("@object-ui/core"),require("@object-ui/plugin-grid"),require("@object-ui/plugin-form"),require("@object-ui/components"),require("lucide-react"),require("@object-ui/react")):typeof define=="function"&&define.amd?define(["exports","react","@object-ui/core","@object-ui/plugin-grid","@object-ui/plugin-form","@object-ui/components","lucide-react","@object-ui/react"],b):(I=typeof globalThis<"u"?globalThis:I||self,b(I.ObjectUIPluginView={},I.React,I.core,I.pluginGrid,I.pluginForm,I.components,I.lucideReact,I.react))})(this,(function(I,b,J,Me,me,l,R,je){"use strict";function ze(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const d in e)if(d!=="default"){const o=Object.getOwnPropertyDescriptor(e,d);Object.defineProperty(n,d,o.get?o:{enumerable:!0,get:()=>e[d]})}}return n.default=e,Object.freeze(n)}const A=ze(b);var se={exports:{}},re={};var xe;function Be(){if(xe)return re;xe=1;var e=Symbol.for("react.transitional.element"),n=Symbol.for("react.fragment");function d(o,w,g){var F=null;if(g!==void 0&&(F=""+g),w.key!==void 0&&(F=""+w.key),"key"in w){g={};for(var y in w)y!=="key"&&(g[y]=w[y])}else g=w;return w=g.ref,{$$typeof:e,type:o,key:F,ref:w!==void 0?w:null,props:g}}return re.Fragment=n,re.jsx=d,re.jsxs=d,re}var le={};var he;function Ue(){return he||(he=1,process.env.NODE_ENV!=="production"&&(function(){function e(r){if(r==null)return null;if(typeof r=="function")return r.$$typeof===De?null:r.displayName||r.name||null;if(typeof r=="string")return r;switch(r){case k:return"Fragment";case u:return"Profiler";case D:return"StrictMode";case ye:return"Suspense";case ue:return"SuspenseList";case q:return"Activity"}if(typeof r=="object")switch(typeof r.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),r.$$typeof){case s:return"Portal";case L:return r.displayName||"Context";case x:return(r._context.displayName||"Context")+".Consumer";case Z:var f=r.render;return r=r.displayName,r||(r=f.displayName||f.name||"",r=r!==""?"ForwardRef("+r+")":"ForwardRef"),r;case z:return f=r.displayName||null,f!==null?f:e(r.type)||"Memo";case de:f=r._payload,r=r._init;try{return e(r(f))}catch{}}return null}function n(r){return""+r}function d(r){try{n(r);var f=!1}catch{f=!0}if(f){f=console;var v=f.error,j=typeof Symbol=="function"&&Symbol.toStringTag&&r[Symbol.toStringTag]||r.constructor.name||"Object";return v.call(f,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",j),n(r)}}function o(r){if(r===k)return"<>";if(typeof r=="object"&&r!==null&&r.$$typeof===de)return"<...>";try{var f=e(r);return f?"<"+f+">":"<...>"}catch{return"<...>"}}function w(){var r=B.A;return r===null?null:r.getOwner()}function g(){return Error("react-stack-top-frame")}function F(r){if(Q.call(r,"key")){var f=Object.getOwnPropertyDescriptor(r,"key").get;if(f&&f.isReactWarning)return!1}return r.key!==void 0}function y(r,f){function v(){E||(E=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",f))}v.isReactWarning=!0,Object.defineProperty(r,"key",{get:v,configurable:!0})}function T(){var r=e(this.type);return $[r]||($[r]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),r=this.props.ref,r!==void 0?r:null}function N(r,f,v,j,ee,te){var _=v.ref;return r={$$typeof:V,type:r,key:f,props:v,_owner:j},(_!==void 0?_:null)!==null?Object.defineProperty(r,"ref",{enumerable:!1,get:T}):Object.defineProperty(r,"ref",{enumerable:!1,value:null}),r._store={},Object.defineProperty(r._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(r,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(r,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:ee}),Object.defineProperty(r,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:te}),Object.freeze&&(Object.freeze(r.props),Object.freeze(r)),r}function C(r,f,v,j,ee,te){var _=f.children;if(_!==void 0)if(j)if(H(_)){for(j=0;j<_.length;j++)a(_[j]);Object.freeze&&Object.freeze(_)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else a(_);if(Q.call(f,"key")){_=e(r);var G=Object.keys(f).filter(function(ve){return ve!=="key"});j=0<G.length?"{key: someKey, "+G.join(": ..., ")+": ...}":"{key: someKey}",h[_+j]||(G=0<G.length?"{"+G.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
|
|
2
2
|
let props = %s;
|
|
3
3
|
<%s {...props} />
|
|
4
4
|
React keys must be passed directly to JSX without using spread:
|
|
5
5
|
let props = %s;
|
|
6
|
-
<%s key={someKey} {...props} />`,j,_,W,_),h[_+j]=!0)}if(_=null,v!==void 0&&(c(v),_=""+v),F(p)&&(c(p.key),_=""+p.key),"key"in p){v={};for(var ae in p)ae!=="key"&&(v[ae]=p[ae])}else v=p;return _&&y(v,typeof r=="function"?r.displayName||r.name||"Unknown":r),N(r,_,v,w(),ee,te)}function s(r){S(r)?r._store&&(r._store.validated=1):typeof r=="object"&&r!==null&&r.$$typeof===de&&(r._payload.status==="fulfilled"?S(r._payload.value)&&r._payload.value._store&&(r._payload.value._store.validated=1):r._store&&(r._store.validated=1))}function S(r){return typeof r=="object"&&r!==null&&r.$$typeof===V}var m=b,V=Symbol.for("react.transitional.element"),o=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),A=Symbol.for("react.strict_mode"),d=Symbol.for("react.profiler"),x=Symbol.for("react.consumer"),L=Symbol.for("react.context"),Z=Symbol.for("react.forward_ref"),ye=Symbol.for("react.suspense"),ue=Symbol.for("react.suspense_list"),M=Symbol.for("react.memo"),de=Symbol.for("react.lazy"),q=Symbol.for("react.activity"),De=Symbol.for("react.client.reference"),z=m.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Q=Object.prototype.hasOwnProperty,G=Array.isArray,ne=console.createTask?console.createTask:function(){return null};m={react_stack_bottom_frame:function(r){return r()}};var T,R={},ie=m.react_stack_bottom_frame.bind(m,g)(),ce=ne(u(g)),h={};le.Fragment=k,le.jsx=function(r,p,v){var j=1e4>z.recentlyCreatedOwnerStacks++;return C(r,p,v,!1,j?Error("react-stack-top-frame"):ie,j?ne(u(r)):ce)},le.jsxs=function(r,p,v){var j=1e4>z.recentlyCreatedOwnerStacks++;return C(r,p,v,!0,j?Error("react-stack-top-frame"):ie,j?ne(u(r)):ce)}})()),le}var Ce;function qe(){return Ce||(Ce=1,process.env.NODE_ENV==="production"?se.exports=Be():se.exports=Ue()),se.exports}var t=qe();function Se(e){var n,c,u="";if(typeof e=="string"||typeof e=="number")u+=e;else if(typeof e=="object")if(Array.isArray(e)){var w=e.length;for(n=0;n<w;n++)e[n]&&(c=Se(e[n]))&&(u&&(u+=" "),u+=c)}else for(c in e)e[c]&&(u&&(u+=" "),u+=c);return u}function Ye(){for(var e,n,c=0,u="",w=arguments.length;c<w;c++)(e=arguments[c])&&(n=Se(e))&&(u&&(u+=" "),u+=n);return u}const Ne=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Ve=Ye,X=(e,n)=>c=>{var u;if(n?.variants==null)return Ve(e,c?.class,c?.className);const{variants:w,defaultVariants:g}=n,F=Object.keys(w).map(N=>{const C=c?.[N],s=g?.[N];if(C===null)return null;const S=Ne(C)||Ne(s);return w[N][S]}),y=c&&Object.entries(c).reduce((N,C)=>{let[s,S]=C;return S===void 0||(N[s]=S),N},{}),E=n==null||(u=n.compoundVariants)===null||u===void 0?void 0:u.reduce((N,C)=>{let{class:s,className:S,...m}=C;return Object.entries(m).every(V=>{let[o,k]=V;return Array.isArray(k)?k.includes({...g,...y}[o]):{...g,...y}[o]===k})?[...N,s,S]:N},[]);return Ve(e,F,E,c?.class,c?.className)},We={list:"List",detail:"Detail",grid:"Grid",kanban:"Kanban",calendar:"Calendar",timeline:"Timeline",map:"Map"},Ge={list:$.List,detail:$.FileText,grid:$.Grid,kanban:$.LayoutGrid,calendar:$.Calendar,timeline:$.Activity,map:$.Map},He=X("flex gap-4",{variants:{position:{top:"flex-col",bottom:"flex-col-reverse",left:"flex-row",right:"flex-row-reverse"}},defaultVariants:{position:"top"}}),Ke=X("w-full",{variants:{orientation:{horizontal:"w-full",vertical:"w-48"}},defaultVariants:{orientation:"horizontal"}}),Je=X("flex gap-2",{variants:{orientation:{horizontal:"flex-row flex-wrap",vertical:"flex-col"}},defaultVariants:{orientation:"horizontal"}}),Xe=X("",{variants:{orientation:{horizontal:"",vertical:"flex h-auto flex-col items-stretch"}},defaultVariants:{orientation:"horizontal"}});function Ze(e){return e.split("-").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}const Qe={Home:"House"};function et(e){if(!e)return null;const n=Ze(e),c=Qe[n]||n;return $.icons[c]||null}function fe(e){return e.label?e.label:We[e.type]||e.type}function Fe(e){return e.icon?et(e.icon):Ge[e.type]||null}function tt(e){return e.activeView?e.activeView:e.defaultView?e.defaultView:e.views?.[0]?.type}const pe=({schema:e,className:n,onViewChange:c,...u})=>{const w=O.useMemo(()=>e.storageKey?e.storageKey:`view-switcher${e.id?`-${e.id}`:""}`,[e.id,e.storageKey]),[g,F]=O.useState(()=>tt(e));O.useEffect(()=>{if(e.activeView){F(e.activeView);return}if(e.persistPreference)try{const d=localStorage.getItem(w);if(d){const x=e.views.find(L=>L.type===d)?.type;x&&F(x)}}catch{}},[e.activeView,e.persistPreference,e.views,w]),O.useEffect(()=>{if(!(!e.persistPreference||!g||e.activeView))try{localStorage.setItem(w,g)}catch{}},[g,e.activeView,e.persistPreference,w]);const y=O.useCallback(d=>{c?.(d),e.onViewChange&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(e.onViewChange,{detail:{view:d}}))},[c,e.onViewChange]),E=O.useCallback(d=>{F(d),y(d)},[y]),N=g||e.views?.[0]?.type,C=N||"",s=e.views.find(d=>d.type===N)||e.views?.[0],S=e.variant||"tabs",m=e.position||"top",V=m==="left"||m==="right",o=V?"vertical":"horizontal",k=t.jsxs("div",{className:l.cn(Ke({orientation:o})),children:[S==="dropdown"&&t.jsxs(l.Select,{value:C,onValueChange:d=>E(d),children:[t.jsx(l.SelectTrigger,{className:l.cn("w-full",V?"h-10":"h-9"),children:t.jsx(l.SelectValue,{placeholder:"Select view"})}),t.jsx(l.SelectContent,{children:e.views.map((d,x)=>t.jsx(l.SelectItem,{value:d.type,children:fe(d)},`${d.type}-${x}`))})]}),S==="buttons"&&t.jsx("div",{className:l.cn(Je({orientation:o})),children:e.views.map((d,x)=>{const L=d.type===N,Z=Fe(d);return t.jsxs(l.Button,{type:"button",size:"sm",variant:L?"secondary":"ghost",className:l.cn("justify-start gap-2",V?"w-full":""),onClick:()=>E(d.type),children:[Z?t.jsx(Z,{className:"h-4 w-4"}):null,t.jsx("span",{children:fe(d)})]},`${d.type}-${x}`)})}),S==="tabs"&&t.jsx(l.Tabs,{value:C,onValueChange:d=>E(d),children:t.jsx(l.TabsList,{className:l.cn(Xe({orientation:o})),children:e.views.map((d,x)=>{const L=Fe(d);return t.jsxs(l.TabsTrigger,{value:d.type,className:l.cn("gap-2",V?"justify-start":""),children:[L?t.jsx(L,{className:"h-4 w-4"}):null,t.jsx("span",{children:fe(d)})]},`${d.type}-${x}`)})})})]}),A=s?.schema?Array.isArray(s.schema)?t.jsx("div",{className:"space-y-4",children:s.schema.map((d,x)=>t.jsx(je.SchemaRenderer,{schema:d,...u},`${s.type}-${x}`))}):t.jsx(je.SchemaRenderer,{schema:s.schema,...u}):null;return t.jsxs("div",{className:l.cn(He({position:m}),n),children:[t.jsx("div",{className:l.cn("shrink-0",V?"flex flex-col":"flex"),children:k}),t.jsx("div",{className:"flex-1 min-w-0",children:A})]})};let oe=null;try{oe=require("@object-ui/react").SchemaRenderer||null}catch{}const Te=({schema:e,dataSource:n,className:c,views:u,activeViewId:w,onViewChange:g,onRowClick:F,onEdit:y,renderListView:E,toolbarAddon:N})=>{const[C,s]=b.useState(null),[S,m]=b.useState(!1),[V,o]=b.useState("create"),[k,A]=b.useState(null),[d,x]=b.useState(0),[L,Z]=b.useState([]),[ye,ue]=b.useState(!1),[M,de]=b.useState({}),[q,De]=b.useState([]),z=e.listViews,Q=z!=null&&Object.keys(z).length>0,[G,ne]=b.useState(()=>e.defaultListView&&z?.[e.defaultListView]?e.defaultListView:z&&Object.keys(z)[0]||""),T=b.useMemo(()=>!Q||!G?null:z[G]||null,[Q,G,z]),R=b.useMemo(()=>u&&u.length>0?u:null,[u]),ie=R!=null&&R.length>0,ce=w||R?.[0]?.id,h=R?.find(i=>i.id===ce)||R?.[0],r=b.useMemo(()=>T?.type?T.type:h?.type?h.type:e.defaultViewType||"grid",[T,h,e.defaultViewType]),p=e.navigation;b.useEffect(()=>{let i=!0;const f=async()=>{try{const a=await n.getObjectSchema(e.objectName);i&&s(a)}catch(a){console.error("Failed to fetch object schema:",a)}};return e.objectName&&n&&f(),()=>{i=!1}},[e.objectName,n]),b.useEffect(()=>{let i=!0;return(async()=>{if(!(r==="grid"&&!E)&&!(!n||!e.objectName)){ue(!0);try{const a=T?.filter||h?.filter||e.table?.defaultFilters||[],U=Object.entries(M).filter(([,B])=>B!==void 0&&B!==""&&B!==null).map(([B,K])=>[B,"=",K]);let I=[];a.length>0&&U.length>0?I=["and",...a,...U]:U.length===1?I=U[0]:U.length>1?I=["and",...U]:I=a;const H=q.length>0?q.map(B=>({field:B.field,order:B.direction})):T?.sort||h?.sort||e.table?.defaultSort||void 0,D=await n.find(e.objectName,{$filter:I.length>0?I:void 0,$orderby:H,$top:100});let Y=[];Array.isArray(D)?Y=D:D&&typeof D=="object"&&(Array.isArray(D.data)?Y=D.data:Array.isArray(D.records)&&(Y=D.records)),i&&Z(Y)}catch(a){console.error("ObjectView data fetch error:",a)}finally{i&&ue(!1)}}})(),()=>{i=!1}},[e.objectName,n,r,M,q,d,T,h,E]);const v=e.layout||"drawer",j=e.operations||e.table?.operations||{create:!0,read:!0,update:!0,delete:!0},ee=b.useCallback(()=>{v==="page"&&e.onNavigate?e.onNavigate("new","edit"):(o("create"),A(null),m(!0))},[v,e]),te=b.useCallback(i=>{if(y){y(i);return}if(v==="page"&&e.onNavigate){const f=i._id||i.id;e.onNavigate(f,"edit")}else o("edit"),A(i),m(!0)},[v,e,y]),_=b.useCallback(i=>{if(v==="page"&&e.onNavigate){const f=i._id||i.id;e.onNavigate(f,"view")}else o("view"),A(i),m(!0)},[v,e]),W=b.useCallback(i=>{if(F){F(i);return}if(p){if(p.mode==="none"||p.preventNavigation)return;if(p.mode==="new_window"||p.openNewTab){const f=i._id||i.id,a=`/${e.objectName}/${f}`;window.open(a,"_blank");return}if(p.mode==="drawer"){o("view"),A(i),m(!0);return}if(p.mode==="modal"){o("view"),A(i),m(!0);return}if(p.mode==="page"){const f=i._id||i.id;e.onNavigate&&e.onNavigate(f,"view");return}}j.read!==!1&&_(i)},[F,p,j.read,_,e]),ae=b.useCallback(i=>{x(f=>f+1)},[]),ve=b.useCallback(i=>{x(f=>f+1)},[]),at=b.useCallback(()=>{m(!1),A(null),x(i=>i+1)},[]),st=b.useCallback(()=>{m(!1),A(null)},[]);b.useCallback(()=>{x(i=>i+1)},[]);const Pe=b.useMemo(()=>!ie||!R||R.length<=1?null:{type:"view-switcher",variant:"tabs",position:"top",persistPreference:!0,storageKey:`view-pref-${e.objectName}`,defaultView:h?.type||"grid",activeView:h?.type||"grid",views:R.map(i=>{const f={kanban:"kanban",calendar:"calendar",map:"map",gallery:"layout-grid",timeline:"activity",gantt:"gantt-chart",grid:"table",list:"list",detail:"file-text"};return{type:i.type,label:i.label,icon:f[i.type]||"table"}})},[ie,R,h,e.objectName]),ot=b.useCallback(i=>{if(!R)return;const f=R.find(a=>a.type===i);f&&g&&g(f.id)},[R,g]),ut=b.useCallback(i=>{ne(i)},[]);b.useMemo(()=>{if(e.showFilters===!1)return null;const i=e.filterableFields,f=C?.fields||{},U=(i?i.map(I=>[I,f[I]||{label:I}]):Object.entries(f).filter(([,I])=>!I.hidden).slice(0,8)).map(([I,H])=>{const D=H.type||"text";let Y="text",B;return D==="number"||D==="currency"||D==="percent"?Y="number":D==="boolean"||D==="toggle"?Y="boolean":D==="date"||D==="datetime"?Y="date":(D==="select"||H.options)&&(Y="select",B=(H.options||[]).map(K=>typeof K=="string"?{label:K,value:K}:{label:K.label,value:K.value})),{field:I,label:H.label||I,type:Y,placeholder:`Filter ${H.label||I}...`,...B?{options:B}:{}}});return U.length===0?null:{type:"filter-ui",layout:"popover",showClear:!0,showApply:!0,filters:U,values:M}},[e.showFilters,e.filterableFields,C,M]),b.useMemo(()=>{const i=C?.fields||{},f=Object.entries(i).filter(([,a])=>!a.hidden).slice(0,10).map(([a,U])=>({field:a,label:U.label||a}));return f.length===0?null:{type:"sort-ui",variant:"dropdown",multiple:!1,fields:f,sort:q}},[C,q]);const dt=b.useCallback(i=>{const f={objectName:e.objectName,fields:T?.columns||h?.columns||e.table?.fields,className:"h-full w-full",showSearch:!1},a=T?.options||h||{};switch(i){case"kanban":return{type:"object-kanban",...f,groupBy:a.kanban?.groupField||a.groupBy||a.groupField||"status",groupField:a.kanban?.groupField||a.groupField||"status",titleField:a.kanban?.titleField||a.titleField||"name",cardFields:f.fields||[],...a.kanban||{}};case"calendar":return{type:"object-calendar",...f,startDateField:a.calendar?.startDateField||a.startDateField||"start_date",endDateField:a.calendar?.endDateField||a.endDateField||"end_date",titleField:a.calendar?.titleField||a.titleField||"name",...a.calendar||{}};case"gallery":return{type:"object-gallery",...f,imageField:a.gallery?.imageField||a.imageField,titleField:a.gallery?.titleField||a.titleField||"name",subtitleField:a.gallery?.subtitleField||a.subtitleField,...a.gallery||{}};case"timeline":return{type:"object-timeline",...f,dateField:a.timeline?.dateField||a.dateField||"created_at",titleField:a.timeline?.titleField||a.titleField||"name",...a.timeline||{}};case"gantt":return{type:"object-gantt",...f,startDateField:a.gantt?.startDateField||a.startDateField||"start_date",endDateField:a.gantt?.endDateField||a.endDateField||"end_date",progressField:a.gantt?.progressField||a.progressField||"progress",dependenciesField:a.gantt?.dependenciesField||a.dependenciesField||"dependencies",...a.gantt||{}};case"map":return{type:"object-map",...f,locationField:a.map?.locationField||a.locationField||"location",...a.map||{}};default:return null}},[e.objectName,e.table?.fields,T,h]),ct=b.useMemo(()=>({type:"object-grid",objectName:e.objectName,title:e.table?.title,description:e.table?.description,fields:T?.columns||h?.columns||e.table?.fields,columns:T?.columns||h?.columns||e.table?.columns,operations:{...j,create:!1},defaultFilters:T?.filter||h?.filter||e.table?.defaultFilters,defaultSort:T?.sort||h?.sort||e.table?.defaultSort,pageSize:e.table?.pageSize,selectable:e.table?.selectable,className:e.table?.className}),[e,j,T,h]),Ie=()=>{const i=k?k._id||k.id:void 0;return{type:"object-form",objectName:e.objectName,mode:V,recordId:i,title:e.form?.title,description:e.form?.description,fields:e.form?.fields,customFields:e.form?.customFields,groups:e.form?.groups,layout:e.form?.layout,columns:e.form?.columns,showSubmit:e.form?.showSubmit,submitText:e.form?.submitText,showCancel:e.form?.showCancel,cancelText:e.form?.cancelText,showReset:e.form?.showReset,initialValues:e.form?.initialValues,readOnly:e.form?.readOnly||V==="view",className:e.form?.className,onSuccess:at,onCancel:st}},Re=()=>{if(e.form?.title)return e.form.title;const i=C?.label||e.objectName;switch(V){case"create":return`Create ${i}`;case"edit":return`Edit ${i}`;case"view":return`View ${i}`;default:return i}},$e=b.useMemo(()=>{const i=p?.width;return i?typeof i=="number"?`max-w-[${i}px]`:`max-w-[${i}]`:""},[p]),ft=()=>t.jsx(l.Drawer,{open:S,onOpenChange:m,direction:"right",children:t.jsxs(l.DrawerContent,{className:l.cn("w-full sm:max-w-2xl",$e),children:[t.jsxs(l.DrawerHeader,{children:[t.jsx(l.DrawerTitle,{children:Re()}),e.form?.description&&t.jsx(l.DrawerDescription,{children:e.form.description})]}),t.jsx("div",{className:"flex-1 overflow-y-auto px-4 pb-4",children:t.jsx(me.ObjectForm,{schema:Ie(),dataSource:n})})]})}),pt=()=>t.jsx(l.Dialog,{open:S,onOpenChange:m,children:t.jsxs(l.DialogContent,{className:l.cn("max-w-2xl max-h-[90vh] overflow-y-auto",$e),children:[t.jsxs(l.DialogHeader,{children:[t.jsx(l.DialogTitle,{children:Re()}),e.form?.description&&t.jsx(l.DialogDescription,{children:e.form.description})]}),t.jsx(me.ObjectForm,{schema:Ie(),dataSource:n})]})}),bt=b.useMemo(()=>Object.keys(M).some(f=>M[f]!==void 0&&M[f]!==""&&M[f]!==null)?Object.entries(M).filter(([,f])=>f!==void 0&&f!==""&&f!==null).map(([f,a])=>({field:f,operator:"equals",value:a})):T?.filter||h?.filter||e.table?.defaultFilters,[M,T,h,e.table?.defaultFilters]),wt=b.useMemo(()=>q.length>0?q:T?.sort||h?.sort||e.table?.defaultSort,[q,T,h,e.table?.defaultSort]),gt=()=>{const i=`${e.objectName}-${G||h?.id||"default"}-${r}-${d}`;if(E)return E({schema:{type:"list-view",objectName:e.objectName,viewType:r,fields:T?.columns||h?.columns||e.table?.fields,filters:bt,sort:wt,options:T?.options||h},dataSource:n,onEdit:te,onRowClick:W,className:"h-full"});if(r!=="grid"){const f=dt(r);if(f&&oe)return t.jsx(oe,{schema:f,dataSource:n,data:L,loading:ye},i);if(!oe)return t.jsx("div",{className:"flex items-center justify-center h-40 text-muted-foreground",children:t.jsxs("p",{children:["SchemaRenderer not available. Install @object-ui/react to render ",r," views."]})})}return t.jsx(Me.ObjectGrid,{schema:ct,dataSource:n,onRowClick:W,onEdit:j.update!==!1?te:void 0,onDelete:j.delete!==!1?ae:void 0,onBulkDelete:j.delete!==!1?ve:void 0},i)},yt=()=>{if(!Q)return null;const i=Object.entries(z);return i.length<=1?null:t.jsx(l.Tabs,{value:G,onValueChange:ut,className:"w-full",children:t.jsx(l.TabsList,{className:"w-auto",children:i.map(([f,a])=>t.jsx(l.TabsTrigger,{value:f,className:"text-sm",children:a.label||f},f))})})},vt=()=>{const i=e.showCreate!==!1&&j.create!==!1,f=e.showViewSwitcher===!0,a=yt();return!a&&!f&&!i&&!N?null:t.jsxs("div",{className:"flex flex-col gap-3",children:[a,(f||i||N)&&t.jsxs("div",{className:"flex items-center justify-between gap-4",children:[t.jsx("div",{className:"flex items-center gap-2",children:f&&Pe&&t.jsx(pe,{schema:Pe,onViewChange:ot,className:"overflow-x-auto"})}),t.jsxs("div",{className:"flex items-center gap-2",children:[N,i&&t.jsxs(l.Button,{size:"sm",onClick:ee,children:[t.jsx($.Plus,{className:"h-4 w-4"}),"Create"]})]})]})]})},Le=p?.mode==="modal"?"modal":p?.mode==="drawer"?"drawer":v;return t.jsxs("div",{className:l.cn("flex flex-col h-full",c),children:[(e.title||e.description)&&t.jsxs("div",{className:"mb-4 shrink-0",children:[e.title&&t.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:e.title}),e.description&&t.jsx("p",{className:"text-muted-foreground mt-1",children:e.description})]}),t.jsx("div",{className:"mb-4 shrink-0",children:vt()}),t.jsx("div",{className:"flex-1 min-h-0",children:gt()}),Le==="drawer"&&ft(),Le==="modal"&&pt()]})},be=X("flex",{variants:{layout:{inline:"flex-col space-y-4",popover:"items-center",drawer:"items-center"}},defaultVariants:{layout:"inline"}}),rt=e=>e==null||e===""?!0:Array.isArray(e)?e.length===0:typeof e=="object"?Object.values(e).every(n=>n==null||n===""):!1,lt=e=>Array.isArray(e)?{start:e[0]||"",end:e[1]||""}:e&&typeof e=="object"?{start:e.start||"",end:e.end||""}:{start:"",end:""},Ee=({schema:e,className:n,onChange:c})=>{const[u,w]=O.useState(e.values||{}),[g,F]=O.useState(!1);O.useEffect(()=>{e.values&&w(e.values)},[e.values]);const y=O.useCallback(o=>{c?.(o),e.onChange&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(e.onChange,{detail:{values:o}}))},[c,e.onChange]),E=O.useCallback((o,k)=>{const A={...u,[o]:k};w(A),e.showApply||y(A)},[y,e.showApply,u]),N=O.useCallback(()=>{const o={};if(w(o),e.showApply){y(o);return}y(o)},[y,e.showApply]),C=O.useCallback(()=>{y(u),F(!1)},[y,u]),s=O.useMemo(()=>Object.values(u).filter(o=>!rt(o)).length,[u]),S=o=>{const k=o.label||o.field,A=o.placeholder||`Filter by ${k}`;switch(o.type){case"number":return t.jsx(l.Input,{type:"number",value:u[o.field]??"",placeholder:A,onChange:d=>{const x=d.target.value,L=x===""?"":Number(x);E(o.field,L)}});case"select":return t.jsxs(l.Select,{value:u[o.field]!==void 0?String(u[o.field]):"",onValueChange:d=>{const x=o.options?.find(L=>String(L.value)===d);E(o.field,x?x.value:d)},children:[t.jsx(l.SelectTrigger,{children:t.jsx(l.SelectValue,{placeholder:A})}),t.jsx(l.SelectContent,{children:o.options?.map(d=>t.jsx(l.SelectItem,{value:String(d.value),children:d.label},String(d.value)))})]});case"date":return t.jsx(l.Input,{type:"date",value:u[o.field]??"",onChange:d=>E(o.field,d.target.value)});case"date-range":{const d=lt(u[o.field]);return t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(l.Input,{type:"date",value:d.start??"",onChange:x=>{E(o.field,{...d,start:x.target.value})}}),t.jsx(l.Input,{type:"date",value:d.end??"",onChange:x=>{E(o.field,{...d,end:x.target.value})}})]})}case"boolean":return t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(l.Checkbox,{checked:!!u[o.field],onCheckedChange:d=>E(o.field,!!d)}),t.jsx("span",{className:"text-sm text-muted-foreground",children:"Enabled"})]});default:return t.jsx(l.Input,{value:u[o.field]??"",placeholder:A,onChange:d=>E(o.field,d.target.value)})}},m=t.jsxs("div",{className:"space-y-4",children:[t.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:e.filters.map(o=>t.jsxs("div",{className:"space-y-2",children:[t.jsx(l.Label,{className:"text-xs text-muted-foreground",children:o.label||o.field}),S(o)]},o.field))}),(e.showApply||e.showClear)&&t.jsxs("div",{className:"flex items-center justify-end gap-2 border-t pt-3",children:[e.showClear&&t.jsx(l.Button,{type:"button",variant:"ghost",size:"sm",onClick:N,children:"Clear"}),e.showApply&&t.jsx(l.Button,{type:"button",size:"sm",onClick:C,children:"Apply"})]})]}),V=e.layout||"inline";return V==="popover"?t.jsx("div",{className:l.cn(be({layout:V}),n),children:t.jsxs(l.Popover,{open:g,onOpenChange:F,children:[t.jsx(l.PopoverTrigger,{asChild:!0,children:t.jsxs(l.Button,{type:"button",variant:s>0?"secondary":"outline",size:"sm",className:"gap-2",children:[t.jsx($.SlidersHorizontal,{className:"h-4 w-4"}),"Filters",s>0&&t.jsx("span",{className:"inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-primary/10 px-1 text-xs font-medium text-primary",children:s})]})}),t.jsx(l.PopoverContent,{align:"start",className:"w-[520px] p-4",children:m})]})}):V==="drawer"?t.jsxs("div",{className:l.cn(be({layout:V}),n),children:[t.jsxs(l.Button,{type:"button",variant:s>0?"secondary":"outline",size:"sm",className:"gap-2",onClick:()=>F(!0),children:[t.jsx($.SlidersHorizontal,{className:"h-4 w-4"}),"Filters",s>0&&t.jsx("span",{className:"inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-primary/10 px-1 text-xs font-medium text-primary",children:s})]}),t.jsx(l.Drawer,{open:g,onOpenChange:F,children:t.jsxs(l.DrawerContent,{children:[t.jsxs(l.DrawerHeader,{children:[t.jsx(l.DrawerTitle,{children:"Filters"}),t.jsx(l.DrawerDescription,{children:"Refine the data with advanced filters."})]}),t.jsx("div",{className:"px-4 pb-6",children:m})]})})]}):t.jsxs("div",{className:l.cn(be({layout:V}),n),children:[m,!e.showApply&&e.showClear&&t.jsxs(l.Button,{type:"button",variant:"ghost",size:"sm",className:"gap-2",onClick:N,children:[t.jsx($.X,{className:"h-3.5 w-3.5"}),"Clear filters"]})]})},we=X("",{variants:{variant:{buttons:"flex flex-wrap gap-2",dropdown:"flex flex-wrap items-center gap-3",builder:"space-y-3"}},defaultVariants:{variant:"dropdown"}}),ge=e=>e?e.map(n=>({field:n.field,direction:n.direction})):[],_e=e=>e.map(n=>({id:`${n.field}-${n.direction}`,field:n.field,order:n.direction})),nt=e=>e.filter(n=>n.field).map(n=>({field:n.field,direction:n.order})),ke=({schema:e,className:n,onChange:c})=>{const[u,w]=O.useState(()=>ge(e.sort)),[g,F]=O.useState(()=>_e(ge(e.sort)));O.useEffect(()=>{const s=ge(e.sort);w(s),F(_e(s))},[e.sort]);const y=O.useCallback(s=>{w(s),c?.(s),e.onChange&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(e.onChange,{detail:{sort:s}}))},[c,e.onChange]),E=O.useCallback(s=>{const S=u.find(o=>o.field===s),m=!!e.multiple;if(!S){const o=m?[...u,{field:s,direction:"asc"}]:[{field:s,direction:"asc"}];y(o);return}if(S.direction==="asc"){const o=u.map(k=>k.field===s?{...k,direction:"desc"}:k);y(o);return}const V=u.filter(o=>o.field!==s);y(V)},[y,e.multiple,u]);if((e.variant||"dropdown")==="buttons")return t.jsx("div",{className:l.cn(we({variant:"buttons"}),n),children:e.fields.map(s=>{const S=u.find(V=>V.field===s.field),m=S?.direction==="asc"?$.ArrowUp:$.ArrowDown;return t.jsxs(l.Button,{type:"button",variant:S?"secondary":"outline",size:"sm",onClick:()=>E(s.field),className:"gap-2",children:[t.jsx("span",{children:s.label||s.field}),S&&t.jsx(m,{className:"h-3.5 w-3.5"})]},s.field)})});if(e.multiple)return t.jsx("div",{className:l.cn(we({variant:"builder"}),n),children:t.jsx(l.SortBuilder,{fields:e.fields.map(s=>({value:s.field,label:s.label||s.field})),value:g,onChange:s=>{F(s),y(nt(s))}})});const C=u[0];return t.jsxs("div",{className:l.cn(we({variant:"dropdown"}),n),children:[t.jsxs(l.Select,{value:C?.field||"",onValueChange:s=>{if(!s){y([]);return}y([{field:s,direction:C?.direction||"asc"}])},children:[t.jsx(l.SelectTrigger,{className:"w-56",children:t.jsx(l.SelectValue,{placeholder:"Select field"})}),t.jsx(l.SelectContent,{children:e.fields.map(s=>t.jsx(l.SelectItem,{value:s.field,children:s.label||s.field},s.field))})]}),t.jsxs(l.Select,{value:C?.direction||"asc",onValueChange:s=>{C?.field&&y([{field:C.field,direction:s}])},children:[t.jsx(l.SelectTrigger,{className:"w-36",children:t.jsx(l.SelectValue,{})}),t.jsxs(l.SelectContent,{children:[t.jsx(l.SelectItem,{value:"asc",children:"Ascending"}),t.jsx(l.SelectItem,{value:"desc",children:"Descending"})]})]})]})};let Oe=b.createContext(null);try{const e=require("@object-ui/react");e.SchemaRendererContext&&(Oe=e.SchemaRendererContext)}catch{}const Ae=({schema:e})=>{const c=b.useContext(Oe)?.dataSource??null;return t.jsx(Te,{schema:e,dataSource:c})};J.ComponentRegistry.register("object-view",Ae,{namespace:"plugin-view",label:"Object View",category:"view",icon:"LayoutDashboard",inputs:[{name:"objectName",type:"string",label:"Object Name",required:!0},{name:"title",type:"string",label:"Title"},{name:"description",type:"string",label:"Description"},{name:"layout",type:"enum",label:"Form Layout",enum:["drawer","modal","page"]},{name:"defaultViewType",type:"enum",label:"Default View Type",enum:["grid","kanban","gallery","calendar","timeline","gantt","map"]},{name:"defaultListView",type:"string",label:"Default Named View"},{name:"showSearch",type:"boolean",label:"Show Search"},{name:"showFilters",type:"boolean",label:"Show Filters"},{name:"showCreate",type:"boolean",label:"Show Create Button"},{name:"showRefresh",type:"boolean",label:"Show Refresh Button"},{name:"showViewSwitcher",type:"boolean",label:"Show View Switcher"},{name:"listViews",type:"object",label:"Named List Views"},{name:"navigation",type:"object",label:"Navigation Config"},{name:"searchableFields",type:"array",label:"Searchable Fields"},{name:"filterableFields",type:"array",label:"Filterable Fields"}],defaultProps:{layout:"drawer",defaultViewType:"grid",showSearch:!0,showFilters:!0,showCreate:!0,showRefresh:!0,showViewSwitcher:!0}}),J.ComponentRegistry.register("view",Ae,{namespace:"plugin-view",label:"View",category:"view"}),J.ComponentRegistry.register("view-switcher",pe,{namespace:"view",label:"View Switcher",category:"view",icon:"LayoutGrid",inputs:[{name:"views",type:"array",label:"Views",required:!0},{name:"defaultView",type:"string",label:"Default View"},{name:"activeView",type:"string",label:"Active View"},{name:"variant",type:"enum",label:"Variant",enum:["tabs","buttons","dropdown"]},{name:"position",type:"enum",label:"Position",enum:["top","bottom","left","right"]},{name:"persistPreference",type:"boolean",label:"Persist Preference"},{name:"storageKey",type:"string",label:"Storage Key"},{name:"onViewChange",type:"string",label:"On View Change Event"}],defaultProps:{variant:"tabs",position:"top",defaultView:"grid",views:[{type:"grid",label:"Grid",schema:{type:"text",content:"Grid view"}},{type:"list",label:"List",schema:{type:"text",content:"List view"}}]}}),J.ComponentRegistry.register("filter-ui",Ee,{namespace:"view",label:"Filter UI",category:"view",icon:"SlidersHorizontal",inputs:[{name:"filters",type:"array",label:"Filters",required:!0},{name:"values",type:"object",label:"Values"},{name:"onChange",type:"string",label:"On Change Event"},{name:"showClear",type:"boolean",label:"Show Clear Button"},{name:"showApply",type:"boolean",label:"Show Apply Button"},{name:"layout",type:"enum",label:"Layout",enum:["inline","popover","drawer"]}],defaultProps:{layout:"inline",showApply:!1,showClear:!0,filters:[{field:"name",label:"Name",type:"text",placeholder:"Search name"},{field:"status",label:"Status",type:"select",options:[{label:"Open",value:"open"},{label:"Closed",value:"closed"}]},{field:"created_at",label:"Created",type:"date"}]}}),J.ComponentRegistry.register("sort-ui",ke,{namespace:"view",label:"Sort UI",category:"view",icon:"ArrowUpDown",inputs:[{name:"fields",type:"array",label:"Fields",required:!0},{name:"sort",type:"array",label:"Sort"},{name:"onChange",type:"string",label:"On Change Event"},{name:"multiple",type:"boolean",label:"Allow Multiple"},{name:"variant",type:"enum",label:"Variant",enum:["dropdown","buttons"]}],defaultProps:{variant:"dropdown",multiple:!0,fields:[{field:"name",label:"Name"},{field:"created_at",label:"Created At"}],sort:[{field:"name",direction:"asc"}]}});const it=({schema:e,className:n,children:c,dataSource:u,...w})=>{const g=e.props?.columns?{display:"grid",gridTemplateColumns:`repeat(${e.props.columns}, 1fr)`,gap:"1rem"}:void 0;return t.jsx("div",{className:n,style:g,...w,children:c})};J.ComponentRegistry.register("view:simple",it,{namespace:"plugin-view",label:"Simple View",category:"view"}),P.FilterUI=Ee,P.ObjectView=Te,P.SortUI=ke,P.ViewSwitcher=pe,Object.defineProperty(P,Symbol.toStringTag,{value:"Module"})}));
|
|
6
|
+
<%s key={someKey} {...props} />`,j,_,G,_),h[_+j]=!0)}if(_=null,v!==void 0&&(d(v),_=""+v),F(f)&&(d(f.key),_=""+f.key),"key"in f){v={};for(var ae in f)ae!=="key"&&(v[ae]=f[ae])}else v=f;return _&&y(v,typeof r=="function"?r.displayName||r.name||"Unknown":r),N(r,_,v,w(),ee,te)}function a(r){S(r)?r._store&&(r._store.validated=1):typeof r=="object"&&r!==null&&r.$$typeof===de&&(r._payload.status==="fulfilled"?S(r._payload.value)&&r._payload.value._store&&(r._payload.value._store.validated=1):r._store&&(r._store.validated=1))}function S(r){return typeof r=="object"&&r!==null&&r.$$typeof===V}var m=b,V=Symbol.for("react.transitional.element"),s=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),D=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),x=Symbol.for("react.consumer"),L=Symbol.for("react.context"),Z=Symbol.for("react.forward_ref"),ye=Symbol.for("react.suspense"),ue=Symbol.for("react.suspense_list"),z=Symbol.for("react.memo"),de=Symbol.for("react.lazy"),q=Symbol.for("react.activity"),De=Symbol.for("react.client.reference"),B=m.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Q=Object.prototype.hasOwnProperty,H=Array.isArray,ne=console.createTask?console.createTask:function(){return null};m={react_stack_bottom_frame:function(r){return r()}};var E,$={},ie=m.react_stack_bottom_frame.bind(m,g)(),ce=ne(o(g)),h={};le.Fragment=k,le.jsx=function(r,f,v){var j=1e4>B.recentlyCreatedOwnerStacks++;return C(r,f,v,!1,j?Error("react-stack-top-frame"):ie,j?ne(o(r)):ce)},le.jsxs=function(r,f,v){var j=1e4>B.recentlyCreatedOwnerStacks++;return C(r,f,v,!0,j?Error("react-stack-top-frame"):ie,j?ne(o(r)):ce)}})()),le}var Ce;function qe(){return Ce||(Ce=1,process.env.NODE_ENV==="production"?se.exports=Be():se.exports=Ue()),se.exports}var t=qe();function Se(e){var n,d,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var w=e.length;for(n=0;n<w;n++)e[n]&&(d=Se(e[n]))&&(o&&(o+=" "),o+=d)}else for(d in e)e[d]&&(o&&(o+=" "),o+=d);return o}function Ye(){for(var e,n,d=0,o="",w=arguments.length;d<w;d++)(e=arguments[d])&&(n=Se(e))&&(o&&(o+=" "),o+=n);return o}const Ne=e=>typeof e=="boolean"?`${e}`:e===0?"0":e,Ve=Ye,X=(e,n)=>d=>{var o;if(n?.variants==null)return Ve(e,d?.class,d?.className);const{variants:w,defaultVariants:g}=n,F=Object.keys(w).map(N=>{const C=d?.[N],a=g?.[N];if(C===null)return null;const S=Ne(C)||Ne(a);return w[N][S]}),y=d&&Object.entries(d).reduce((N,C)=>{let[a,S]=C;return S===void 0||(N[a]=S),N},{}),T=n==null||(o=n.compoundVariants)===null||o===void 0?void 0:o.reduce((N,C)=>{let{class:a,className:S,...m}=C;return Object.entries(m).every(V=>{let[s,k]=V;return Array.isArray(k)?k.includes({...g,...y}[s]):{...g,...y}[s]===k})?[...N,a,S]:N},[]);return Ve(e,F,T,d?.class,d?.className)},We={list:"List",detail:"Detail",grid:"Grid",kanban:"Kanban",calendar:"Calendar",timeline:"Timeline",map:"Map"},Ge={list:R.List,detail:R.FileText,grid:R.Grid,kanban:R.LayoutGrid,calendar:R.Calendar,timeline:R.Activity,map:R.Map},He=X("flex gap-4",{variants:{position:{top:"flex-col",bottom:"flex-col-reverse",left:"flex-row",right:"flex-row-reverse"}},defaultVariants:{position:"top"}}),Ke=X("w-full",{variants:{orientation:{horizontal:"w-full",vertical:"w-48"}},defaultVariants:{orientation:"horizontal"}}),Je=X("flex gap-2",{variants:{orientation:{horizontal:"flex-row flex-wrap",vertical:"flex-col"}},defaultVariants:{orientation:"horizontal"}}),Xe=X("",{variants:{orientation:{horizontal:"",vertical:"flex h-auto flex-col items-stretch"}},defaultVariants:{orientation:"horizontal"}});function Ze(e){return e.split("-").map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}const Qe={Home:"House"};function et(e){if(!e)return null;const n=Ze(e),d=Qe[n]||n;return R.icons[d]||null}function fe(e){return e.label?e.label:We[e.type]||e.type}function Fe(e){return e.icon?et(e.icon):Ge[e.type]||null}function tt(e){return e.activeView?e.activeView:e.defaultView?e.defaultView:e.views?.[0]?.type}const pe=({schema:e,className:n,onViewChange:d,...o})=>{const w=A.useMemo(()=>e.storageKey?e.storageKey:`view-switcher${e.id?`-${e.id}`:""}`,[e.id,e.storageKey]),[g,F]=A.useState(()=>tt(e));A.useEffect(()=>{if(e.activeView){F(e.activeView);return}if(e.persistPreference)try{const u=localStorage.getItem(w);if(u){const x=e.views.find(L=>L.type===u)?.type;x&&F(x)}}catch{}},[e.activeView,e.persistPreference,e.views,w]),A.useEffect(()=>{if(!(!e.persistPreference||!g||e.activeView))try{localStorage.setItem(w,g)}catch{}},[g,e.activeView,e.persistPreference,w]);const y=A.useCallback(u=>{d?.(u),e.onViewChange&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(e.onViewChange,{detail:{view:u}}))},[d,e.onViewChange]),T=A.useCallback(u=>{F(u),y(u)},[y]),N=g||e.views?.[0]?.type,C=N||"",a=e.views.find(u=>u.type===N)||e.views?.[0],S=e.variant||"tabs",m=e.position||"top",V=m==="left"||m==="right",s=V?"vertical":"horizontal",k=t.jsxs("div",{className:l.cn(Ke({orientation:s})),children:[S==="dropdown"&&t.jsxs(l.Select,{value:C,onValueChange:u=>T(u),children:[t.jsx(l.SelectTrigger,{className:l.cn("w-full",V?"h-10":"h-9"),children:t.jsx(l.SelectValue,{placeholder:"Select view"})}),t.jsx(l.SelectContent,{children:e.views.map((u,x)=>t.jsx(l.SelectItem,{value:u.type,children:fe(u)},`${u.type}-${x}`))})]}),S==="buttons"&&t.jsx("div",{className:l.cn(Je({orientation:s})),children:e.views.map((u,x)=>{const L=u.type===N,Z=Fe(u);return t.jsxs(l.Button,{type:"button",size:"sm",variant:L?"secondary":"ghost",className:l.cn("justify-start gap-2",V?"w-full":""),onClick:()=>T(u.type),children:[Z?t.jsx(Z,{className:"h-4 w-4"}):null,t.jsx("span",{children:fe(u)})]},`${u.type}-${x}`)})}),S==="tabs"&&t.jsx(l.Tabs,{value:C,onValueChange:u=>T(u),children:t.jsx(l.TabsList,{className:l.cn(Xe({orientation:s})),children:e.views.map((u,x)=>{const L=Fe(u);return t.jsxs(l.TabsTrigger,{value:u.type,className:l.cn("gap-2",V?"justify-start":""),children:[L?t.jsx(L,{className:"h-4 w-4"}):null,t.jsx("span",{children:fe(u)})]},`${u.type}-${x}`)})})})]}),D=a?.schema?Array.isArray(a.schema)?t.jsx("div",{className:"space-y-4",children:a.schema.map((u,x)=>t.jsx(je.SchemaRenderer,{schema:u,...o},`${a.type}-${x}`))}):t.jsx(je.SchemaRenderer,{schema:a.schema,...o}):null;return t.jsxs("div",{className:l.cn(He({position:m}),n),children:[t.jsx("div",{className:l.cn("shrink-0",V?"flex flex-col":"flex"),children:k}),t.jsx("div",{className:"flex-1 min-w-0",children:D})]})};let oe=null;try{oe=require("@object-ui/react").SchemaRenderer||null}catch{}const Ee=({schema:e,dataSource:n,className:d,views:o,activeViewId:w,onViewChange:g,onRowClick:F,onEdit:y,renderListView:T,toolbarAddon:N})=>{const[C,a]=b.useState(null),[S,m]=b.useState(!1),[V,s]=b.useState("create"),[k,D]=b.useState(null),[u,x]=b.useState(0),[L,Z]=b.useState([]),[ye,ue]=b.useState(!1),[z,de]=b.useState({}),[q,De]=b.useState([]),B=e.listViews,Q=B!=null&&Object.keys(B).length>0,[H,ne]=b.useState(()=>e.defaultListView&&B?.[e.defaultListView]?e.defaultListView:B&&Object.keys(B)[0]||""),E=b.useMemo(()=>!Q||!H?null:B[H]||null,[Q,H,B]),$=b.useMemo(()=>o&&o.length>0?o:null,[o]),ie=$!=null&&$.length>0,ce=w||$?.[0]?.id,h=$?.find(i=>i.id===ce)||$?.[0],r=b.useMemo(()=>E?.type?E.type:h?.type?h.type:e.defaultViewType||"grid",[E,h,e.defaultViewType]),f=e.navigation;b.useEffect(()=>{let i=!0;const c=async()=>{try{const p=await n.getObjectSchema(e.objectName);i&&a(p)}catch(p){console.error("Failed to fetch object schema:",p)}};return e.objectName&&n&&c(),()=>{i=!1}},[e.objectName,n]),b.useEffect(()=>{let i=!0;return(async()=>{if(!(r==="grid"&&!T)&&!(!n||!e.objectName)){ue(!0);try{const p=E?.filter||h?.filter||e.table?.defaultFilters||[],M=Object.entries(z).filter(([,U])=>U!==void 0&&U!==""&&U!==null).map(([U,K])=>[U,"=",K]);let P=[];p.length>0&&M.length>0?P=["and",...p,...M]:M.length===1?P=M[0]:M.length>1?P=["and",...M]:P=p;const Y=q.length>0?q.map(U=>({field:U.field,order:U.direction})):E?.sort||h?.sort||e.table?.defaultSort||void 0,O=await n.find(e.objectName,{$filter:P.length>0?P:void 0,$orderby:Y,$top:100});let W=[];Array.isArray(O)?W=O:O&&typeof O=="object"&&(Array.isArray(O.data)?W=O.data:Array.isArray(O.records)&&(W=O.records)),i&&Z(W)}catch(p){console.error("ObjectView data fetch error:",p)}finally{i&&ue(!1)}}})(),()=>{i=!1}},[e.objectName,n,r,z,q,u,E,h,T]);const v=e.layout||"drawer",j=e.operations||e.table?.operations||{create:!0,read:!0,update:!0,delete:!0},ee=b.useCallback(()=>{v==="page"&&e.onNavigate?e.onNavigate("new","edit"):(s("create"),D(null),m(!0))},[v,e]),te=b.useCallback(i=>{if(y){y(i);return}if(v==="page"&&e.onNavigate){const c=i._id||i.id;e.onNavigate(c,"edit")}else s("edit"),D(i),m(!0)},[v,e,y]),_=b.useCallback(i=>{if(v==="page"&&e.onNavigate){const c=i._id||i.id;e.onNavigate(c,"view")}else s("view"),D(i),m(!0)},[v,e]),G=b.useCallback(i=>{if(F){F(i);return}if(f){if(f.mode==="none"||f.preventNavigation)return;if(f.mode==="new_window"||f.openNewTab){const c=i._id||i.id,p=`/${e.objectName}/${c}`;window.open(p,"_blank");return}if(f.mode==="drawer"){s("view"),D(i),m(!0);return}if(f.mode==="modal"){s("view"),D(i),m(!0);return}if(f.mode==="page"){const c=i._id||i.id;e.onNavigate&&e.onNavigate(c,"view");return}}j.read!==!1&&_(i)},[F,f,j.read,_,e]),ae=b.useCallback(i=>{x(c=>c+1)},[]),ve=b.useCallback(i=>{x(c=>c+1)},[]),at=b.useCallback(()=>{m(!1),D(null),x(i=>i+1)},[]),st=b.useCallback(()=>{m(!1),D(null)},[]);b.useCallback(()=>{x(i=>i+1)},[]);const Pe=b.useMemo(()=>!ie||!$||$.length<=1?null:{type:"view-switcher",variant:"tabs",position:"top",persistPreference:!0,storageKey:`view-pref-${e.objectName}`,defaultView:h?.type||"grid",activeView:h?.type||"grid",views:$.map(i=>{const c={kanban:"kanban",calendar:"calendar",map:"map",gallery:"layout-grid",timeline:"activity",gantt:"gantt-chart",grid:"table",list:"list",detail:"file-text"};return{type:i.type,label:i.label,icon:c[i.type]||"table"}})},[ie,$,h,e.objectName]),ot=b.useCallback(i=>{if(!$)return;const c=$.find(p=>p.type===i);c&&g&&g(c.id)},[$,g]),ut=b.useCallback(i=>{ne(i)},[]);b.useMemo(()=>{if(e.showFilters===!1)return null;const i=e.filterableFields,c=C?.fields||{},M=(i?i.map(P=>[P,c[P]||{label:P}]):Object.entries(c).filter(([,P])=>!P.hidden).slice(0,8)).map(([P,Y])=>{const O=Y.type||"text";let W="text",U;return O==="number"||O==="currency"||O==="percent"?W="number":O==="boolean"||O==="toggle"?W="boolean":O==="date"||O==="datetime"?W="date":(O==="select"||Y.options)&&(W="select",U=(Y.options||[]).map(K=>typeof K=="string"?{label:K,value:K}:{label:K.label,value:K.value})),{field:P,label:Y.label||P,type:W,placeholder:`Filter ${Y.label||P}...`,...U?{options:U}:{}}});return M.length===0?null:{type:"filter-ui",layout:"popover",showClear:!0,showApply:!0,filters:M,values:z}},[e.showFilters,e.filterableFields,C,z]),b.useMemo(()=>{const i=C?.fields||{},c=Object.entries(i).filter(([,p])=>!p.hidden).slice(0,10).map(([p,M])=>({field:p,label:M.label||p}));return c.length===0?null:{type:"sort-ui",variant:"dropdown",multiple:!1,fields:c,sort:q}},[C,q]);const dt=b.useCallback(i=>{const c={objectName:e.objectName,fields:E?.columns||h?.columns||e.table?.fields,className:"h-full w-full",showSearch:!1},p=E?.options||h||{};if(process.env.NODE_ENV==="development"){const M=["startDateField","endDateField","dateField","groupBy","groupField","locationField","imageField","dependenciesField","progressField","titleField","subtitleField","latitudeField","longitudeField"],P=p[i]||{},Y=M.filter(O=>O in p&&!(O in P));Y.length>0&&console.warn(`[Spec Compliance] View options use flat properties ${JSON.stringify(Y)}. Move them under options.${i} per @objectstack/spec protocol.`)}switch(i){case"kanban":return{type:"object-kanban",...c,groupBy:p.kanban?.groupField||"status",groupField:p.kanban?.groupField||"status",titleField:p.kanban?.titleField||"name",cardFields:c.fields||[],...p.kanban||{}};case"calendar":return{type:"object-calendar",...c,startDateField:p.calendar?.startDateField||"start_date",endDateField:p.calendar?.endDateField||"end_date",titleField:p.calendar?.titleField||"name",...p.calendar||{}};case"gallery":return{type:"object-gallery",...c,imageField:p.gallery?.imageField,titleField:p.gallery?.titleField||"name",subtitleField:p.gallery?.subtitleField,...p.gallery||{}};case"timeline":return{type:"object-timeline",...c,dateField:p.timeline?.dateField||"created_at",titleField:p.timeline?.titleField||"name",...p.timeline||{}};case"gantt":return{type:"object-gantt",...c,startDateField:p.gantt?.startDateField||"start_date",endDateField:p.gantt?.endDateField||"end_date",progressField:p.gantt?.progressField||"progress",dependenciesField:p.gantt?.dependenciesField||"dependencies",...p.gantt||{}};case"map":return{type:"object-map",...c,locationField:p.map?.locationField||"location",...p.map||{}};default:return null}},[e.objectName,e.table?.fields,E,h]),ct=b.useMemo(()=>({type:"object-grid",objectName:e.objectName,title:e.table?.title,description:e.table?.description,fields:E?.columns||h?.columns||e.table?.fields,columns:E?.columns||h?.columns||e.table?.columns,operations:{...j,create:!1},defaultFilters:E?.filter||h?.filter||e.table?.defaultFilters,defaultSort:E?.sort||h?.sort||e.table?.defaultSort,pageSize:e.table?.pageSize,selectable:e.table?.selectable,className:e.table?.className}),[e,j,E,h]),Ie=()=>{const i=k?k._id||k.id:void 0;return{type:"object-form",objectName:e.objectName,mode:V,recordId:i,title:e.form?.title,description:e.form?.description,fields:e.form?.fields,customFields:e.form?.customFields,groups:e.form?.groups,layout:e.form?.layout,columns:e.form?.columns,showSubmit:e.form?.showSubmit,submitText:e.form?.submitText,showCancel:e.form?.showCancel,cancelText:e.form?.cancelText,showReset:e.form?.showReset,initialValues:e.form?.initialValues,readOnly:e.form?.readOnly||V==="view",className:e.form?.className,onSuccess:at,onCancel:st}},$e=()=>{if(e.form?.title)return e.form.title;const i=C?.label||e.objectName;switch(V){case"create":return`Create ${i}`;case"edit":return`Edit ${i}`;case"view":return`View ${i}`;default:return i}},Re=b.useMemo(()=>{const i=f?.width;return i?typeof i=="number"?`max-w-[${i}px]`:`max-w-[${i}]`:""},[f]),ft=()=>t.jsx(l.Drawer,{open:S,onOpenChange:m,direction:"right",children:t.jsxs(l.DrawerContent,{className:l.cn("w-full sm:max-w-2xl",Re),children:[t.jsxs(l.DrawerHeader,{children:[t.jsx(l.DrawerTitle,{children:$e()}),e.form?.description&&t.jsx(l.DrawerDescription,{children:e.form.description})]}),t.jsx("div",{className:"flex-1 overflow-y-auto px-4 pb-4",children:t.jsx(me.ObjectForm,{schema:Ie(),dataSource:n})})]})}),pt=()=>t.jsx(l.Dialog,{open:S,onOpenChange:m,children:t.jsxs(l.DialogContent,{className:l.cn("max-w-2xl max-h-[90vh] overflow-y-auto",Re),children:[t.jsxs(l.DialogHeader,{children:[t.jsx(l.DialogTitle,{children:$e()}),e.form?.description&&t.jsx(l.DialogDescription,{children:e.form.description})]}),t.jsx(me.ObjectForm,{schema:Ie(),dataSource:n})]})}),bt=b.useMemo(()=>Object.keys(z).some(c=>z[c]!==void 0&&z[c]!==""&&z[c]!==null)?Object.entries(z).filter(([,c])=>c!==void 0&&c!==""&&c!==null).map(([c,p])=>({field:c,operator:"equals",value:p})):E?.filter||h?.filter||e.table?.defaultFilters,[z,E,h,e.table?.defaultFilters]),wt=b.useMemo(()=>q.length>0?q:E?.sort||h?.sort||e.table?.defaultSort,[q,E,h,e.table?.defaultSort]),gt=()=>{const i=`${e.objectName}-${H||h?.id||"default"}-${r}-${u}`;if(T)return T({schema:{type:"list-view",objectName:e.objectName,viewType:r,fields:E?.columns||h?.columns||e.table?.fields,filters:bt,sort:wt,options:E?.options||h},dataSource:n,onEdit:te,onRowClick:G,className:"h-full"});if(r!=="grid"){const c=dt(r);if(c&&oe)return t.jsx(oe,{schema:c,dataSource:n,data:L,loading:ye},i);if(!oe)return t.jsx("div",{className:"flex items-center justify-center h-40 text-muted-foreground",children:t.jsxs("p",{children:["SchemaRenderer not available. Install @object-ui/react to render ",r," views."]})})}return t.jsx(Me.ObjectGrid,{schema:ct,dataSource:n,onRowClick:G,onEdit:j.update!==!1?te:void 0,onDelete:j.delete!==!1?ae:void 0,onBulkDelete:j.delete!==!1?ve:void 0},i)},yt=()=>{if(!Q)return null;const i=Object.entries(B);return i.length<=1?null:t.jsx(l.Tabs,{value:H,onValueChange:ut,className:"w-full",children:t.jsx(l.TabsList,{className:"w-auto",children:i.map(([c,p])=>t.jsx(l.TabsTrigger,{value:c,className:"text-sm",children:p.label||c},c))})})},vt=()=>{const i=e.showCreate!==!1&&j.create!==!1,c=e.showViewSwitcher===!0,p=yt();return!p&&!c&&!i&&!N?null:t.jsxs("div",{className:"flex flex-col gap-3",children:[p,(c||i||N)&&t.jsxs("div",{className:"flex items-center justify-between gap-4",children:[t.jsx("div",{className:"flex items-center gap-2",children:c&&Pe&&t.jsx(pe,{schema:Pe,onViewChange:ot,className:"overflow-x-auto"})}),t.jsxs("div",{className:"flex items-center gap-2",children:[N,i&&t.jsxs(l.Button,{size:"sm",onClick:ee,children:[t.jsx(R.Plus,{className:"h-4 w-4"}),"Create"]})]})]})]})},Le=f?.mode==="modal"?"modal":f?.mode==="drawer"?"drawer":v;return t.jsxs("div",{className:l.cn("flex flex-col h-full",d),children:[(e.title||e.description)&&t.jsxs("div",{className:"mb-4 shrink-0",children:[e.title&&t.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:e.title}),e.description&&t.jsx("p",{className:"text-muted-foreground mt-1",children:e.description})]}),t.jsx("div",{className:"mb-4 shrink-0",children:vt()}),t.jsx("div",{className:"flex-1 min-h-0",children:gt()}),Le==="drawer"&&ft(),Le==="modal"&&pt()]})},be=X("flex",{variants:{layout:{inline:"flex-col space-y-4",popover:"items-center",drawer:"items-center"}},defaultVariants:{layout:"inline"}}),rt=e=>e==null||e===""?!0:Array.isArray(e)?e.length===0:typeof e=="object"?Object.values(e).every(n=>n==null||n===""):!1,lt=e=>Array.isArray(e)?{start:e[0]||"",end:e[1]||""}:e&&typeof e=="object"?{start:e.start||"",end:e.end||""}:{start:"",end:""},Te=({schema:e,className:n,onChange:d})=>{const[o,w]=A.useState(e.values||{}),[g,F]=A.useState(!1);A.useEffect(()=>{e.values&&w(e.values)},[e.values]);const y=A.useCallback(s=>{d?.(s),e.onChange&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(e.onChange,{detail:{values:s}}))},[d,e.onChange]),T=A.useCallback((s,k)=>{const D={...o,[s]:k};w(D),e.showApply||y(D)},[y,e.showApply,o]),N=A.useCallback(()=>{const s={};if(w(s),e.showApply){y(s);return}y(s)},[y,e.showApply]),C=A.useCallback(()=>{y(o),F(!1)},[y,o]),a=A.useMemo(()=>Object.values(o).filter(s=>!rt(s)).length,[o]),S=s=>{const k=s.label||s.field,D=s.placeholder||`Filter by ${k}`;switch(s.type){case"number":return t.jsx(l.Input,{type:"number",value:o[s.field]??"",placeholder:D,onChange:u=>{const x=u.target.value,L=x===""?"":Number(x);T(s.field,L)}});case"select":return t.jsxs(l.Select,{value:o[s.field]!==void 0?String(o[s.field]):"",onValueChange:u=>{const x=s.options?.find(L=>String(L.value)===u);T(s.field,x?x.value:u)},children:[t.jsx(l.SelectTrigger,{children:t.jsx(l.SelectValue,{placeholder:D})}),t.jsx(l.SelectContent,{children:s.options?.map(u=>t.jsx(l.SelectItem,{value:String(u.value),children:u.label},String(u.value)))})]});case"date":return t.jsx(l.Input,{type:"date",value:o[s.field]??"",onChange:u=>T(s.field,u.target.value)});case"date-range":{const u=lt(o[s.field]);return t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(l.Input,{type:"date",value:u.start??"",onChange:x=>{T(s.field,{...u,start:x.target.value})}}),t.jsx(l.Input,{type:"date",value:u.end??"",onChange:x=>{T(s.field,{...u,end:x.target.value})}})]})}case"boolean":return t.jsxs("div",{className:"flex items-center gap-2",children:[t.jsx(l.Checkbox,{checked:!!o[s.field],onCheckedChange:u=>T(s.field,!!u)}),t.jsx("span",{className:"text-sm text-muted-foreground",children:"Enabled"})]});default:return t.jsx(l.Input,{value:o[s.field]??"",placeholder:D,onChange:u=>T(s.field,u.target.value)})}},m=t.jsxs("div",{className:"space-y-4",children:[t.jsx("div",{className:"grid gap-4 sm:grid-cols-2",children:e.filters.map(s=>t.jsxs("div",{className:"space-y-2",children:[t.jsx(l.Label,{className:"text-xs text-muted-foreground",children:s.label||s.field}),S(s)]},s.field))}),(e.showApply||e.showClear)&&t.jsxs("div",{className:"flex items-center justify-end gap-2 border-t pt-3",children:[e.showClear&&t.jsx(l.Button,{type:"button",variant:"ghost",size:"sm",onClick:N,children:"Clear"}),e.showApply&&t.jsx(l.Button,{type:"button",size:"sm",onClick:C,children:"Apply"})]})]}),V=e.layout||"inline";return V==="popover"?t.jsx("div",{className:l.cn(be({layout:V}),n),children:t.jsxs(l.Popover,{open:g,onOpenChange:F,children:[t.jsx(l.PopoverTrigger,{asChild:!0,children:t.jsxs(l.Button,{type:"button",variant:a>0?"secondary":"outline",size:"sm",className:"gap-2",children:[t.jsx(R.SlidersHorizontal,{className:"h-4 w-4"}),"Filters",a>0&&t.jsx("span",{className:"inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-primary/10 px-1 text-xs font-medium text-primary",children:a})]})}),t.jsx(l.PopoverContent,{align:"start",className:"w-[520px] p-4",children:m})]})}):V==="drawer"?t.jsxs("div",{className:l.cn(be({layout:V}),n),children:[t.jsxs(l.Button,{type:"button",variant:a>0?"secondary":"outline",size:"sm",className:"gap-2",onClick:()=>F(!0),children:[t.jsx(R.SlidersHorizontal,{className:"h-4 w-4"}),"Filters",a>0&&t.jsx("span",{className:"inline-flex h-5 min-w-[20px] items-center justify-center rounded-full bg-primary/10 px-1 text-xs font-medium text-primary",children:a})]}),t.jsx(l.Drawer,{open:g,onOpenChange:F,children:t.jsxs(l.DrawerContent,{children:[t.jsxs(l.DrawerHeader,{children:[t.jsx(l.DrawerTitle,{children:"Filters"}),t.jsx(l.DrawerDescription,{children:"Refine the data with advanced filters."})]}),t.jsx("div",{className:"px-4 pb-6",children:m})]})})]}):t.jsxs("div",{className:l.cn(be({layout:V}),n),children:[m,!e.showApply&&e.showClear&&t.jsxs(l.Button,{type:"button",variant:"ghost",size:"sm",className:"gap-2",onClick:N,children:[t.jsx(R.X,{className:"h-3.5 w-3.5"}),"Clear filters"]})]})},we=X("",{variants:{variant:{buttons:"flex flex-wrap gap-2",dropdown:"flex flex-wrap items-center gap-3",builder:"space-y-3"}},defaultVariants:{variant:"dropdown"}}),ge=e=>e?e.map(n=>({field:n.field,direction:n.direction})):[],_e=e=>e.map(n=>({id:`${n.field}-${n.direction}`,field:n.field,order:n.direction})),nt=e=>e.filter(n=>n.field).map(n=>({field:n.field,direction:n.order})),ke=({schema:e,className:n,onChange:d})=>{const[o,w]=A.useState(()=>ge(e.sort)),[g,F]=A.useState(()=>_e(ge(e.sort)));A.useEffect(()=>{const a=ge(e.sort);w(a),F(_e(a))},[e.sort]);const y=A.useCallback(a=>{w(a),d?.(a),e.onChange&&typeof window<"u"&&window.dispatchEvent(new CustomEvent(e.onChange,{detail:{sort:a}}))},[d,e.onChange]),T=A.useCallback(a=>{const S=o.find(s=>s.field===a),m=!!e.multiple;if(!S){const s=m?[...o,{field:a,direction:"asc"}]:[{field:a,direction:"asc"}];y(s);return}if(S.direction==="asc"){const s=o.map(k=>k.field===a?{...k,direction:"desc"}:k);y(s);return}const V=o.filter(s=>s.field!==a);y(V)},[y,e.multiple,o]);if((e.variant||"dropdown")==="buttons")return t.jsx("div",{className:l.cn(we({variant:"buttons"}),n),children:e.fields.map(a=>{const S=o.find(V=>V.field===a.field),m=S?.direction==="asc"?R.ArrowUp:R.ArrowDown;return t.jsxs(l.Button,{type:"button",variant:S?"secondary":"outline",size:"sm",onClick:()=>T(a.field),className:"gap-2",children:[t.jsx("span",{children:a.label||a.field}),S&&t.jsx(m,{className:"h-3.5 w-3.5"})]},a.field)})});if(e.multiple)return t.jsx("div",{className:l.cn(we({variant:"builder"}),n),children:t.jsx(l.SortBuilder,{fields:e.fields.map(a=>({value:a.field,label:a.label||a.field})),value:g,onChange:a=>{F(a),y(nt(a))}})});const C=o[0];return t.jsxs("div",{className:l.cn(we({variant:"dropdown"}),n),children:[t.jsxs(l.Select,{value:C?.field||"",onValueChange:a=>{if(!a){y([]);return}y([{field:a,direction:C?.direction||"asc"}])},children:[t.jsx(l.SelectTrigger,{className:"w-56",children:t.jsx(l.SelectValue,{placeholder:"Select field"})}),t.jsx(l.SelectContent,{children:e.fields.map(a=>t.jsx(l.SelectItem,{value:a.field,children:a.label||a.field},a.field))})]}),t.jsxs(l.Select,{value:C?.direction||"asc",onValueChange:a=>{C?.field&&y([{field:C.field,direction:a}])},children:[t.jsx(l.SelectTrigger,{className:"w-36",children:t.jsx(l.SelectValue,{})}),t.jsxs(l.SelectContent,{children:[t.jsx(l.SelectItem,{value:"asc",children:"Ascending"}),t.jsx(l.SelectItem,{value:"desc",children:"Descending"})]})]})]})};let Oe=b.createContext(null);try{const e=require("@object-ui/react");e.SchemaRendererContext&&(Oe=e.SchemaRendererContext)}catch{}const Ae=({schema:e})=>{const d=b.useContext(Oe)?.dataSource??null;return t.jsx(Ee,{schema:e,dataSource:d})};J.ComponentRegistry.register("object-view",Ae,{namespace:"plugin-view",label:"Object View",category:"view",icon:"LayoutDashboard",inputs:[{name:"objectName",type:"string",label:"Object Name",required:!0},{name:"title",type:"string",label:"Title"},{name:"description",type:"string",label:"Description"},{name:"layout",type:"enum",label:"Form Layout",enum:["drawer","modal","page"]},{name:"defaultViewType",type:"enum",label:"Default View Type",enum:["grid","kanban","gallery","calendar","timeline","gantt","map"]},{name:"defaultListView",type:"string",label:"Default Named View"},{name:"showSearch",type:"boolean",label:"Show Search"},{name:"showFilters",type:"boolean",label:"Show Filters"},{name:"showCreate",type:"boolean",label:"Show Create Button"},{name:"showRefresh",type:"boolean",label:"Show Refresh Button"},{name:"showViewSwitcher",type:"boolean",label:"Show View Switcher"},{name:"listViews",type:"object",label:"Named List Views"},{name:"navigation",type:"object",label:"Navigation Config"},{name:"searchableFields",type:"array",label:"Searchable Fields"},{name:"filterableFields",type:"array",label:"Filterable Fields"}],defaultProps:{layout:"drawer",defaultViewType:"grid",showSearch:!0,showFilters:!0,showCreate:!0,showRefresh:!0,showViewSwitcher:!0}}),J.ComponentRegistry.register("view",Ae,{namespace:"plugin-view",label:"View",category:"view"}),J.ComponentRegistry.register("view-switcher",pe,{namespace:"view",label:"View Switcher",category:"view",icon:"LayoutGrid",inputs:[{name:"views",type:"array",label:"Views",required:!0},{name:"defaultView",type:"string",label:"Default View"},{name:"activeView",type:"string",label:"Active View"},{name:"variant",type:"enum",label:"Variant",enum:["tabs","buttons","dropdown"]},{name:"position",type:"enum",label:"Position",enum:["top","bottom","left","right"]},{name:"persistPreference",type:"boolean",label:"Persist Preference"},{name:"storageKey",type:"string",label:"Storage Key"},{name:"onViewChange",type:"string",label:"On View Change Event"}],defaultProps:{variant:"tabs",position:"top",defaultView:"grid",views:[{type:"grid",label:"Grid",schema:{type:"text",content:"Grid view"}},{type:"list",label:"List",schema:{type:"text",content:"List view"}}]}}),J.ComponentRegistry.register("filter-ui",Te,{namespace:"view",label:"Filter UI",category:"view",icon:"SlidersHorizontal",inputs:[{name:"filters",type:"array",label:"Filters",required:!0},{name:"values",type:"object",label:"Values"},{name:"onChange",type:"string",label:"On Change Event"},{name:"showClear",type:"boolean",label:"Show Clear Button"},{name:"showApply",type:"boolean",label:"Show Apply Button"},{name:"layout",type:"enum",label:"Layout",enum:["inline","popover","drawer"]}],defaultProps:{layout:"inline",showApply:!1,showClear:!0,filters:[{field:"name",label:"Name",type:"text",placeholder:"Search name"},{field:"status",label:"Status",type:"select",options:[{label:"Open",value:"open"},{label:"Closed",value:"closed"}]},{field:"created_at",label:"Created",type:"date"}]}}),J.ComponentRegistry.register("sort-ui",ke,{namespace:"view",label:"Sort UI",category:"view",icon:"ArrowUpDown",inputs:[{name:"fields",type:"array",label:"Fields",required:!0},{name:"sort",type:"array",label:"Sort"},{name:"onChange",type:"string",label:"On Change Event"},{name:"multiple",type:"boolean",label:"Allow Multiple"},{name:"variant",type:"enum",label:"Variant",enum:["dropdown","buttons"]}],defaultProps:{variant:"dropdown",multiple:!0,fields:[{field:"name",label:"Name"},{field:"created_at",label:"Created At"}],sort:[{field:"name",direction:"asc"}]}});const it=({schema:e,className:n,children:d,dataSource:o,...w})=>{const g=e.props?.columns?{display:"grid",gridTemplateColumns:`repeat(${e.props.columns}, 1fr)`,gap:"1rem"}:void 0;return t.jsx("div",{className:n,style:g,...w,children:d})};J.ComponentRegistry.register("view:simple",it,{namespace:"plugin-view",label:"Simple View",category:"view"}),I.FilterUI=Te,I.ObjectView=Ee,I.SortUI=ke,I.ViewSwitcher=pe,Object.defineProperty(I,Symbol.toStringTag,{value:"Module"})}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@object-ui/plugin-view",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Object View plugin for Object UI",
|
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"class-variance-authority": "^0.7.1",
|
|
19
19
|
"lucide-react": "^0.563.0",
|
|
20
|
-
"@object-ui/components": "3.0.
|
|
21
|
-
"@object-ui/core": "3.0.
|
|
22
|
-
"@object-ui/plugin-form": "3.0.
|
|
23
|
-
"@object-ui/plugin-grid": "3.0.
|
|
24
|
-
"@object-ui/react": "3.0.
|
|
25
|
-
"@object-ui/types": "3.0.
|
|
20
|
+
"@object-ui/components": "3.0.3",
|
|
21
|
+
"@object-ui/core": "3.0.3",
|
|
22
|
+
"@object-ui/plugin-form": "3.0.3",
|
|
23
|
+
"@object-ui/plugin-grid": "3.0.3",
|
|
24
|
+
"@object-ui/react": "3.0.3",
|
|
25
|
+
"@object-ui/types": "3.0.3"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"react": "^18.0.0 || ^19.0.0",
|
package/src/ObjectView.tsx
CHANGED
|
@@ -586,16 +586,32 @@ export const ObjectView: React.FC<ObjectViewProps> = ({
|
|
|
586
586
|
};
|
|
587
587
|
|
|
588
588
|
// Resolve type-specific options from current named view or active view
|
|
589
|
+
// Per @objectstack/spec, type-specific config MUST be nested under the view type key
|
|
589
590
|
const viewOptions = currentNamedViewConfig?.options || activeView || {};
|
|
590
591
|
|
|
592
|
+
// Dev-mode warning for flat property access violations
|
|
593
|
+
if (process.env.NODE_ENV === 'development') {
|
|
594
|
+
const flatKeys = ['startDateField', 'endDateField', 'dateField', 'groupBy', 'groupField',
|
|
595
|
+
'locationField', 'imageField', 'dependenciesField', 'progressField', 'titleField',
|
|
596
|
+
'subtitleField', 'latitudeField', 'longitudeField'];
|
|
597
|
+
const nestedConfig = viewOptions[viewType] || {};
|
|
598
|
+
const found = flatKeys.filter(k => k in viewOptions && !(k in nestedConfig));
|
|
599
|
+
if (found.length > 0) {
|
|
600
|
+
console.warn(
|
|
601
|
+
`[Spec Compliance] View options use flat properties ${JSON.stringify(found)}. ` +
|
|
602
|
+
`Move them under options.${viewType} per @objectstack/spec protocol.`
|
|
603
|
+
);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
591
607
|
switch (viewType) {
|
|
592
608
|
case 'kanban':
|
|
593
609
|
return {
|
|
594
610
|
type: 'object-kanban',
|
|
595
611
|
...baseProps,
|
|
596
|
-
groupBy: viewOptions.kanban?.groupField ||
|
|
597
|
-
groupField: viewOptions.kanban?.groupField ||
|
|
598
|
-
titleField: viewOptions.kanban?.titleField ||
|
|
612
|
+
groupBy: viewOptions.kanban?.groupField || 'status',
|
|
613
|
+
groupField: viewOptions.kanban?.groupField || 'status',
|
|
614
|
+
titleField: viewOptions.kanban?.titleField || 'name',
|
|
599
615
|
cardFields: baseProps.fields || [],
|
|
600
616
|
...(viewOptions.kanban || {}),
|
|
601
617
|
};
|
|
@@ -603,43 +619,43 @@ export const ObjectView: React.FC<ObjectViewProps> = ({
|
|
|
603
619
|
return {
|
|
604
620
|
type: 'object-calendar',
|
|
605
621
|
...baseProps,
|
|
606
|
-
startDateField: viewOptions.calendar?.startDateField ||
|
|
607
|
-
endDateField: viewOptions.calendar?.endDateField ||
|
|
608
|
-
titleField: viewOptions.calendar?.titleField ||
|
|
622
|
+
startDateField: viewOptions.calendar?.startDateField || 'start_date',
|
|
623
|
+
endDateField: viewOptions.calendar?.endDateField || 'end_date',
|
|
624
|
+
titleField: viewOptions.calendar?.titleField || 'name',
|
|
609
625
|
...(viewOptions.calendar || {}),
|
|
610
626
|
};
|
|
611
627
|
case 'gallery':
|
|
612
628
|
return {
|
|
613
629
|
type: 'object-gallery',
|
|
614
630
|
...baseProps,
|
|
615
|
-
imageField: viewOptions.gallery?.imageField
|
|
616
|
-
titleField: viewOptions.gallery?.titleField ||
|
|
617
|
-
subtitleField: viewOptions.gallery?.subtitleField
|
|
631
|
+
imageField: viewOptions.gallery?.imageField,
|
|
632
|
+
titleField: viewOptions.gallery?.titleField || 'name',
|
|
633
|
+
subtitleField: viewOptions.gallery?.subtitleField,
|
|
618
634
|
...(viewOptions.gallery || {}),
|
|
619
635
|
};
|
|
620
636
|
case 'timeline':
|
|
621
637
|
return {
|
|
622
638
|
type: 'object-timeline',
|
|
623
639
|
...baseProps,
|
|
624
|
-
dateField: viewOptions.timeline?.dateField ||
|
|
625
|
-
titleField: viewOptions.timeline?.titleField ||
|
|
640
|
+
dateField: viewOptions.timeline?.dateField || 'created_at',
|
|
641
|
+
titleField: viewOptions.timeline?.titleField || 'name',
|
|
626
642
|
...(viewOptions.timeline || {}),
|
|
627
643
|
};
|
|
628
644
|
case 'gantt':
|
|
629
645
|
return {
|
|
630
646
|
type: 'object-gantt',
|
|
631
647
|
...baseProps,
|
|
632
|
-
startDateField: viewOptions.gantt?.startDateField ||
|
|
633
|
-
endDateField: viewOptions.gantt?.endDateField ||
|
|
634
|
-
progressField: viewOptions.gantt?.progressField ||
|
|
635
|
-
dependenciesField: viewOptions.gantt?.dependenciesField ||
|
|
648
|
+
startDateField: viewOptions.gantt?.startDateField || 'start_date',
|
|
649
|
+
endDateField: viewOptions.gantt?.endDateField || 'end_date',
|
|
650
|
+
progressField: viewOptions.gantt?.progressField || 'progress',
|
|
651
|
+
dependenciesField: viewOptions.gantt?.dependenciesField || 'dependencies',
|
|
636
652
|
...(viewOptions.gantt || {}),
|
|
637
653
|
};
|
|
638
654
|
case 'map':
|
|
639
655
|
return {
|
|
640
656
|
type: 'object-map',
|
|
641
657
|
...baseProps,
|
|
642
|
-
locationField: viewOptions.map?.locationField ||
|
|
658
|
+
locationField: viewOptions.map?.locationField || 'location',
|
|
643
659
|
...(viewOptions.map || {}),
|
|
644
660
|
};
|
|
645
661
|
default:
|