@sudobility/entity_pages 0.0.28 → 0.0.30

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/dist/index.esm.js CHANGED
@@ -170,7 +170,7 @@ function J({
170
170
  entity: n,
171
171
  currentUserId: c
172
172
  }) {
173
- const i = n.userRole === "admin", { data: s = [], isLoading: d } = E(
173
+ const i = n.userRole === "owner", { data: s = [], isLoading: d } = E(
174
174
  a,
175
175
  n.entitySlug
176
176
  ), h = F(a), m = A(a), { data: u = [], isLoading: r } = R(a, i ? n.entitySlug : null), l = P(a), y = D(a), f = async (p, b) => {
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(r,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react"),require("@sudobility/components"),require("@sudobility/entity-components"),require("@sudobility/entity_client")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","@sudobility/components","@sudobility/entity-components","@sudobility/entity_client"],e):(r=typeof globalThis<"u"?globalThis:r||self,e(r.EntityPages={},r.jsxRuntime,r.React,r.SudobilityComponents,r.SudobilityEntityComponents,r.SudobilityEntityClient))})(this,(function(r,e,v,x,b,s){"use strict";function M(t){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const i in t)if(i!=="default"){const n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(a,i,n.get?n:{enumerable:!0,get:()=>t[i]})}}return a.default=t,Object.freeze(a)}const N=M(v);function I({title:t,titleId:a,...i},n){return N.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:n,"aria-labelledby":a},i),t?N.createElement("title",{id:a},t):null,N.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4.5v15m7.5-7.5h-15"}))}const k=N.forwardRef(I);function E({client:t,onSelectEntity:a}){const[i,n]=v.useState(!1),[c,g]=v.useState({displayName:"",description:""}),[y,m]=v.useState(null),{data:u=[],isLoading:o}=s.useEntities(t),d=s.useCreateEntity(t),w=u.filter(l=>l.entityType==="personal"),S=u.filter(l=>l.entityType==="organization"),C=async l=>{if(l.preventDefault(),m(null),!c.displayName.trim()){m("Display name is required");return}try{await d.mutateAsync({displayName:c.displayName.trim(),description:c.description.trim()||void 0}),n(!1),g({displayName:"",description:""})}catch(p){m(p.message||"Failed to create organization")}};return e.jsxs(x.Section,{spacing:"lg",maxWidth:"4xl",children:[e.jsxs("div",{className:"flex items-center justify-between mb-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Workspaces"}),e.jsx("p",{className:"text-muted-foreground",children:"Manage your personal and organization workspaces"})]}),e.jsxs("button",{type:"button",onClick:()=>n(!0),className:"flex items-center gap-2 px-4 py-2 rounded-lg bg-primary text-primary-foreground font-medium hover:bg-primary/90 transition-colors",children:[e.jsx(k,{className:"h-4 w-4"}),e.jsx("span",{children:"New Organization"})]})]}),i&&e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"w-full max-w-md rounded-lg bg-background p-6 shadow-lg",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:"Create Organization"}),e.jsxs("form",{onSubmit:C,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:c.displayName,onChange:l=>g(p=>({...p,displayName:l.target.value})),placeholder:"My Organization",className:"w-full px-3 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:"Description (optional)"}),e.jsx("textarea",{value:c.description,onChange:l=>g(p=>({...p,description:l.target.value})),placeholder:"What is this organization for?",rows:3,className:"w-full px-3 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary resize-none"})]}),y&&e.jsx("p",{className:"text-sm text-destructive",children:y}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>{n(!1),g({displayName:"",description:""}),m(null)},className:"px-4 py-2 rounded-lg border hover:bg-muted transition-colors",children:"Cancel"}),e.jsx("button",{type:"submit",disabled:d.isPending,className:"px-4 py-2 rounded-lg bg-primary text-primary-foreground font-medium hover:bg-primary/90 transition-colors disabled:opacity-50",children:d.isPending?"Creating...":"Create"})]})]})]})}),w.length>0&&e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-lg font-semibold mb-3",children:"Personal Workspace"}),e.jsx(b.EntityList,{entities:w,onSelect:a,isLoading:o})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3",children:"Organizations"}),S.length===0&&!o?e.jsxs("div",{className:"text-center py-8 text-muted-foreground border border-dashed rounded-lg",children:[e.jsx("p",{children:"No organizations yet"}),e.jsx("button",{type:"button",onClick:()=>n(!0),className:"mt-2 text-primary hover:underline",children:"Create your first organization"})]}):e.jsx(b.EntityList,{entities:S,onSelect:a,isLoading:o})]})]})}function L({client:t,entity:a,currentUserId:i}){const n=a.userRole==="admin",{data:c=[],isLoading:g}=s.useEntityMembers(t,a.entitySlug),y=s.useUpdateMemberRole(t),m=s.useRemoveMember(t),{data:u=[],isLoading:o}=s.useEntityInvitations(t,n?a.entitySlug:null),d=s.useCreateInvitation(t),w=s.useCancelInvitation(t),S=async(h,f)=>{try{await y.mutateAsync({entitySlug:a.entitySlug,memberId:h,role:f})}catch(j){console.error("Failed to update role:",j)}},C=async h=>{if(confirm("Are you sure you want to remove this member?"))try{await m.mutateAsync({entitySlug:a.entitySlug,memberId:h})}catch(f){console.error("Failed to remove member:",f)}},l=async h=>{await d.mutateAsync({entitySlug:a.entitySlug,request:h})},p=async h=>{try{await w.mutateAsync({entitySlug:a.entitySlug,invitationId:h})}catch(f){console.error("Failed to cancel invitation:",f)}};return a.entityType==="personal"?e.jsx(x.Section,{spacing:"lg",maxWidth:"4xl",children:e.jsxs("div",{className:"text-center py-12 text-muted-foreground",children:[e.jsx("p",{children:"Personal workspaces cannot have additional members."}),e.jsx("p",{className:"mt-2",children:"Create an organization to collaborate with others."})]})}):e.jsxs(x.Section,{spacing:"lg",maxWidth:"4xl",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Members"}),e.jsxs("p",{className:"text-muted-foreground",children:["Manage members and invitations for ",a.displayName]})]}),n&&e.jsxs("div",{className:"rounded-lg border p-4 mb-8",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:"Invite Members"}),e.jsx(b.InvitationForm,{onSubmit:l,isSubmitting:d.isPending})]}),n&&e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-lg font-semibold mb-3",children:"Pending Invitations"}),e.jsx(b.InvitationList,{invitations:u,mode:"admin",onCancel:p,isLoading:o,emptyMessage:"No pending invitations"})]}),e.jsxs("div",{children:[e.jsxs("h2",{className:"text-lg font-semibold mb-3",children:["Current Members (",c.length,")"]}),e.jsx(b.MemberList,{members:c,currentUserId:i,canManage:n,onRoleChange:S,onRemove:C,isLoading:g})]})]})}function P({client:t,onInvitationAccepted:a}){const{data:i=[],isLoading:n}=s.useMyInvitations(t),c=s.useAcceptInvitation(t),g=s.useDeclineInvitation(t),y=async o=>{try{await c.mutateAsync(o),a?.()}catch(d){console.error("Failed to accept invitation:",d)}},m=async o=>{try{await g.mutateAsync(o)}catch(d){console.error("Failed to decline invitation:",d)}},u=i.filter(o=>o.status==="pending").length;return e.jsxs(x.Section,{spacing:"lg",maxWidth:"4xl",children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Invitations"}),e.jsx("p",{className:"text-muted-foreground",children:u>0?`You have ${u} pending invitation${u>1?"s":""}`:"No pending invitations"})]}),e.jsx(b.InvitationList,{invitations:i,mode:"user",onAccept:y,onDecline:m,isLoading:n,emptyMessage:"You don't have any pending invitations"})]})}r.EntityListPage=E,r.InvitationsPage=P,r.MembersManagementPage=L,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(r,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("react/jsx-runtime"),require("react"),require("@sudobility/components"),require("@sudobility/entity-components"),require("@sudobility/entity_client")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react","@sudobility/components","@sudobility/entity-components","@sudobility/entity_client"],e):(r=typeof globalThis<"u"?globalThis:r||self,e(r.EntityPages={},r.jsxRuntime,r.React,r.SudobilityComponents,r.SudobilityEntityComponents,r.SudobilityEntityClient))})(this,(function(r,e,v,x,b,s){"use strict";function M(t){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const i in t)if(i!=="default"){const n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(a,i,n.get?n:{enumerable:!0,get:()=>t[i]})}}return a.default=t,Object.freeze(a)}const N=M(v);function I({title:t,titleId:a,...i},n){return N.createElement("svg",Object.assign({xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor","aria-hidden":"true","data-slot":"icon",ref:n,"aria-labelledby":a},i),t?N.createElement("title",{id:a},t):null,N.createElement("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 4.5v15m7.5-7.5h-15"}))}const k=N.forwardRef(I);function E({client:t,onSelectEntity:a}){const[i,n]=v.useState(!1),[c,g]=v.useState({displayName:"",description:""}),[y,m]=v.useState(null),{data:u=[],isLoading:o}=s.useEntities(t),d=s.useCreateEntity(t),w=u.filter(l=>l.entityType==="personal"),S=u.filter(l=>l.entityType==="organization"),C=async l=>{if(l.preventDefault(),m(null),!c.displayName.trim()){m("Display name is required");return}try{await d.mutateAsync({displayName:c.displayName.trim(),description:c.description.trim()||void 0}),n(!1),g({displayName:"",description:""})}catch(p){m(p.message||"Failed to create organization")}};return e.jsxs(x.Section,{spacing:"lg",maxWidth:"4xl",children:[e.jsxs("div",{className:"flex items-center justify-between mb-8",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Workspaces"}),e.jsx("p",{className:"text-muted-foreground",children:"Manage your personal and organization workspaces"})]}),e.jsxs("button",{type:"button",onClick:()=>n(!0),className:"flex items-center gap-2 px-4 py-2 rounded-lg bg-primary text-primary-foreground font-medium hover:bg-primary/90 transition-colors",children:[e.jsx(k,{className:"h-4 w-4"}),e.jsx("span",{children:"New Organization"})]})]}),i&&e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:e.jsxs("div",{className:"w-full max-w-md rounded-lg bg-background p-6 shadow-lg",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:"Create Organization"}),e.jsxs("form",{onSubmit:C,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:"Display Name"}),e.jsx("input",{type:"text",value:c.displayName,onChange:l=>g(p=>({...p,displayName:l.target.value})),placeholder:"My Organization",className:"w-full px-3 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium mb-1",children:"Description (optional)"}),e.jsx("textarea",{value:c.description,onChange:l=>g(p=>({...p,description:l.target.value})),placeholder:"What is this organization for?",rows:3,className:"w-full px-3 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary resize-none"})]}),y&&e.jsx("p",{className:"text-sm text-destructive",children:y}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>{n(!1),g({displayName:"",description:""}),m(null)},className:"px-4 py-2 rounded-lg border hover:bg-muted transition-colors",children:"Cancel"}),e.jsx("button",{type:"submit",disabled:d.isPending,className:"px-4 py-2 rounded-lg bg-primary text-primary-foreground font-medium hover:bg-primary/90 transition-colors disabled:opacity-50",children:d.isPending?"Creating...":"Create"})]})]})]})}),w.length>0&&e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-lg font-semibold mb-3",children:"Personal Workspace"}),e.jsx(b.EntityList,{entities:w,onSelect:a,isLoading:o})]}),e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold mb-3",children:"Organizations"}),S.length===0&&!o?e.jsxs("div",{className:"text-center py-8 text-muted-foreground border border-dashed rounded-lg",children:[e.jsx("p",{children:"No organizations yet"}),e.jsx("button",{type:"button",onClick:()=>n(!0),className:"mt-2 text-primary hover:underline",children:"Create your first organization"})]}):e.jsx(b.EntityList,{entities:S,onSelect:a,isLoading:o})]})]})}function L({client:t,entity:a,currentUserId:i}){const n=a.userRole==="owner",{data:c=[],isLoading:g}=s.useEntityMembers(t,a.entitySlug),y=s.useUpdateMemberRole(t),m=s.useRemoveMember(t),{data:u=[],isLoading:o}=s.useEntityInvitations(t,n?a.entitySlug:null),d=s.useCreateInvitation(t),w=s.useCancelInvitation(t),S=async(h,f)=>{try{await y.mutateAsync({entitySlug:a.entitySlug,memberId:h,role:f})}catch(j){console.error("Failed to update role:",j)}},C=async h=>{if(confirm("Are you sure you want to remove this member?"))try{await m.mutateAsync({entitySlug:a.entitySlug,memberId:h})}catch(f){console.error("Failed to remove member:",f)}},l=async h=>{await d.mutateAsync({entitySlug:a.entitySlug,request:h})},p=async h=>{try{await w.mutateAsync({entitySlug:a.entitySlug,invitationId:h})}catch(f){console.error("Failed to cancel invitation:",f)}};return a.entityType==="personal"?e.jsx(x.Section,{spacing:"lg",maxWidth:"4xl",children:e.jsxs("div",{className:"text-center py-12 text-muted-foreground",children:[e.jsx("p",{children:"Personal workspaces cannot have additional members."}),e.jsx("p",{className:"mt-2",children:"Create an organization to collaborate with others."})]})}):e.jsxs(x.Section,{spacing:"lg",maxWidth:"4xl",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Members"}),e.jsxs("p",{className:"text-muted-foreground",children:["Manage members and invitations for ",a.displayName]})]}),n&&e.jsxs("div",{className:"rounded-lg border p-4 mb-8",children:[e.jsx("h2",{className:"text-lg font-semibold mb-4",children:"Invite Members"}),e.jsx(b.InvitationForm,{onSubmit:l,isSubmitting:d.isPending})]}),n&&e.jsxs("div",{className:"mb-8",children:[e.jsx("h2",{className:"text-lg font-semibold mb-3",children:"Pending Invitations"}),e.jsx(b.InvitationList,{invitations:u,mode:"admin",onCancel:p,isLoading:o,emptyMessage:"No pending invitations"})]}),e.jsxs("div",{children:[e.jsxs("h2",{className:"text-lg font-semibold mb-3",children:["Current Members (",c.length,")"]}),e.jsx(b.MemberList,{members:c,currentUserId:i,canManage:n,onRoleChange:S,onRemove:C,isLoading:g})]})]})}function P({client:t,onInvitationAccepted:a}){const{data:i=[],isLoading:n}=s.useMyInvitations(t),c=s.useAcceptInvitation(t),g=s.useDeclineInvitation(t),y=async o=>{try{await c.mutateAsync(o),a?.()}catch(d){console.error("Failed to accept invitation:",d)}},m=async o=>{try{await g.mutateAsync(o)}catch(d){console.error("Failed to decline invitation:",d)}},u=i.filter(o=>o.status==="pending").length;return e.jsxs(x.Section,{spacing:"lg",maxWidth:"4xl",children:[e.jsxs("div",{className:"mb-6",children:[e.jsx("h1",{className:"text-2xl font-bold text-foreground",children:"Invitations"}),e.jsx("p",{className:"text-muted-foreground",children:u>0?`You have ${u} pending invitation${u>1?"s":""}`:"No pending invitations"})]}),e.jsx(b.InvitationList,{invitations:i,mode:"user",onAccept:y,onDecline:m,isLoading:n,emptyMessage:"You don't have any pending invitations"})]})}r.EntityListPage=E,r.InvitationsPage=P,r.MembersManagementPage=L,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudobility/entity_pages",
3
- "version": "0.0.28",
3
+ "version": "0.0.30",
4
4
  "description": "Page containers for entity/organization management",
5
5
  "type": "module",
6
6
  "main": "dist/index.umd.js",
@@ -42,15 +42,19 @@
42
42
  "react": "^18.0.0 || ^19.0.0",
43
43
  "react-dom": "^18.0.0 || ^19.0.0",
44
44
  "@tanstack/react-query": "^5.0.0",
45
- "@sudobility/components": "^4.0.156",
46
- "@sudobility/entity_client": "^0.0.14",
47
- "@sudobility/entity-components": "^1.0.6"
45
+ "@sudobility/components": "^4.0.157",
46
+ "@sudobility/entity_client": "^0.0.15",
47
+ "@sudobility/entity-components": "^1.0.6",
48
+ "@heroicons/react": "^2.2.0",
49
+ "@sudobility/types": "^1.9.45"
48
50
  },
49
51
  "devDependencies": {
50
52
  "@eslint/js": "^9.38.0",
51
- "@sudobility/components": "^4.0.156",
53
+ "@heroicons/react": "^2.2.0",
54
+ "@sudobility/components": "^4.0.157",
52
55
  "@sudobility/entity-components": "^1.0.6",
53
- "@sudobility/entity_client": "^0.0.14",
56
+ "@sudobility/entity_client": "^0.0.15",
57
+ "@sudobility/types": "^1.9.45",
54
58
  "@tanstack/react-query": "^5.0.0",
55
59
  "@testing-library/dom": "^10.4.0",
56
60
  "@testing-library/jest-dom": "^6.4.2",
@@ -81,8 +85,5 @@
81
85
  "optionalDependencies": {
82
86
  "@rollup/rollup-linux-x64-gnu": "4.52.5",
83
87
  "@rollup/rollup-linux-x64-musl": "4.52.5"
84
- },
85
- "dependencies": {
86
- "@heroicons/react": "^2.2.0"
87
88
  }
88
89
  }