web-mojo 2.3.0 → 2.3.1
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 +124 -0
- package/dist/admin-models.cjs.js +1 -1
- package/dist/admin-models.es.js +1 -1
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.es.js +1 -1
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.es.js +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.es.js +1 -1
- package/dist/chunks/{AssistantPanelView-BG34Qbfj.js → AssistantPanelView-CE6me7sJ.js} +2 -2
- package/dist/chunks/{AssistantPanelView-BG34Qbfj.js.map → AssistantPanelView-CE6me7sJ.js.map} +1 -1
- package/dist/chunks/{AssistantPanelView-DCEV6VeI.js → AssistantPanelView-DvsLAAIF.js} +2 -2
- package/dist/chunks/{AssistantPanelView-DCEV6VeI.js.map → AssistantPanelView-DvsLAAIF.js.map} +1 -1
- package/dist/chunks/{ChatView-B73uox2v.js → ChatView-CXykdAV1.js} +2 -2
- package/dist/chunks/{ChatView-B73uox2v.js.map → ChatView-CXykdAV1.js.map} +1 -1
- package/dist/chunks/{ChatView-W8daOwIo.js → ChatView-ys5MIiBf.js} +2 -2
- package/dist/chunks/{ChatView-W8daOwIo.js.map → ChatView-ys5MIiBf.js.map} +1 -1
- package/dist/chunks/{Collection-BZlmtcuL.js → Collection-BpUmNuDZ.js} +2 -2
- package/dist/chunks/{Collection-BZlmtcuL.js.map → Collection-BpUmNuDZ.js.map} +1 -1
- package/dist/chunks/{Collection-Bwoq6muu.js → Collection-CY6BblFn.js} +2 -2
- package/dist/chunks/{Collection-Bwoq6muu.js.map → Collection-CY6BblFn.js.map} +1 -1
- package/dist/chunks/{ContextMenu-q76hjQb6.js → ContextMenu-PtN50qH2.js} +2 -2
- package/dist/chunks/{ContextMenu-q76hjQb6.js.map → ContextMenu-PtN50qH2.js.map} +1 -1
- package/dist/chunks/{ContextMenu-BPPtuqKk.js → ContextMenu-XQVFU0mL.js} +2 -2
- package/dist/chunks/{ContextMenu-BPPtuqKk.js.map → ContextMenu-XQVFU0mL.js.map} +1 -1
- package/dist/chunks/{DataView-k-7wmk5_.js → DataView-BTi_BZHx.js} +2 -2
- package/dist/chunks/{DataView-k-7wmk5_.js.map → DataView-BTi_BZHx.js.map} +1 -1
- package/dist/chunks/{DataView-BbrwHMV4.js → DataView-WHRh1o6E.js} +2 -2
- package/dist/chunks/{DataView-BbrwHMV4.js.map → DataView-WHRh1o6E.js.map} +1 -1
- package/dist/chunks/{FormView-Dcy7XOtC.js → FormView-BzaGMf5_.js} +3 -3
- package/dist/chunks/{FormView-Dcy7XOtC.js.map → FormView-BzaGMf5_.js.map} +1 -1
- package/dist/chunks/{FormView-DPSuwWMq.js → FormView-DTD-Zy22.js} +3 -3
- package/dist/chunks/{FormView-DPSuwWMq.js.map → FormView-DTD-Zy22.js.map} +1 -1
- package/dist/chunks/{ListView-iGBsD4a7.js → ListView-BsnnTcmC.js} +2 -2
- package/dist/chunks/{ListView-iGBsD4a7.js.map → ListView-BsnnTcmC.js.map} +1 -1
- package/dist/chunks/{ListView-DHC-yBIw.js → ListView-Xf7kO6Me.js} +2 -2
- package/dist/chunks/{ListView-DHC-yBIw.js.map → ListView-Xf7kO6Me.js.map} +1 -1
- package/dist/chunks/{MetricsCountryMapView-CAD9wR_T.js → MetricsCountryMapView-BzGOi1d2.js} +2 -2
- package/dist/chunks/{MetricsCountryMapView-CAD9wR_T.js.map → MetricsCountryMapView-BzGOi1d2.js.map} +1 -1
- package/dist/chunks/{MetricsCountryMapView-Dzk3Yrzx.js → MetricsCountryMapView-C-S00Wiw.js} +2 -2
- package/dist/chunks/{MetricsCountryMapView-Dzk3Yrzx.js.map → MetricsCountryMapView-C-S00Wiw.js.map} +1 -1
- package/dist/chunks/{Modal-DuULCMFZ.js → Modal-GWjyfcz5.js} +3 -3
- package/dist/chunks/Modal-GWjyfcz5.js.map +1 -0
- package/dist/chunks/{Modal-DBJU16cc.js → Modal-wrfWfQhv.js} +3 -3
- package/dist/chunks/Modal-wrfWfQhv.js.map +1 -0
- package/dist/chunks/{Passkeys-CGRZ8ZMv.js → Passkeys-BviQX3_5.js} +2 -2
- package/dist/chunks/{Passkeys-CGRZ8ZMv.js.map → Passkeys-BviQX3_5.js.map} +1 -1
- package/dist/chunks/{Passkeys-Dr8-oSm9.js → Passkeys-gXR1Rc6C.js} +2 -2
- package/dist/chunks/{Passkeys-Dr8-oSm9.js.map → Passkeys-gXR1Rc6C.js.map} +1 -1
- package/dist/chunks/TokenManager-C6aXkRaI.js +2 -0
- package/dist/chunks/TokenManager-C6aXkRaI.js.map +1 -0
- package/dist/chunks/TokenManager-DgvhhTqN.js +2 -0
- package/dist/chunks/TokenManager-DgvhhTqN.js.map +1 -0
- package/dist/chunks/{User-Dg7xpYEI.js → User-B_Urf7U7.js} +2 -2
- package/dist/chunks/{User-Dg7xpYEI.js.map → User-B_Urf7U7.js.map} +1 -1
- package/dist/chunks/{User-DNQhdBtI.js → User-KTBU_5cr.js} +2 -2
- package/dist/chunks/{User-DNQhdBtI.js.map → User-KTBU_5cr.js.map} +1 -1
- package/dist/chunks/{UserProfileView-Bpz3VZmP.js → UserProfileView-BmduMJ86.js} +2 -2
- package/dist/chunks/{UserProfileView-Bpz3VZmP.js.map → UserProfileView-BmduMJ86.js.map} +1 -1
- package/dist/chunks/{UserProfileView-B5nczdfw.js → UserProfileView-COxSyPB0.js} +2 -2
- package/dist/chunks/{UserProfileView-B5nczdfw.js.map → UserProfileView-COxSyPB0.js.map} +1 -1
- package/dist/chunks/{View-Yazho7OL.js → View-C8UWvaSM.js} +2 -2
- package/dist/chunks/{View-Yazho7OL.js.map → View-C8UWvaSM.js.map} +1 -1
- package/dist/chunks/{View-C5n3sIFi.js → View-Cvs2TY7b.js} +2 -2
- package/dist/chunks/{View-C5n3sIFi.js.map → View-Cvs2TY7b.js.map} +1 -1
- package/dist/chunks/{WebApp-CeiDNV6L.js → WebApp-DuwanN2O.js} +2 -2
- package/dist/chunks/{WebApp-CeiDNV6L.js.map → WebApp-DuwanN2O.js.map} +1 -1
- package/dist/chunks/{WebApp-irKlhuFX.js → WebApp-kbRq7dM_.js} +2 -2
- package/dist/chunks/{WebApp-irKlhuFX.js.map → WebApp-kbRq7dM_.js.map} +1 -1
- package/dist/chunks/{admin-B5tf0zOO.js → admin-CszsTA0T.js} +2 -2
- package/dist/chunks/{admin-B5tf0zOO.js.map → admin-CszsTA0T.js.map} +1 -1
- package/dist/chunks/{admin-CGoTpXfs.js → admin-vsKDrnpV.js} +2 -2
- package/dist/chunks/{admin-CGoTpXfs.js.map → admin-vsKDrnpV.js.map} +1 -1
- package/dist/chunks/{exportChart-kQ-we4Cp.js → exportChart-Bkxr7mCe.js} +2 -2
- package/dist/chunks/{exportChart-kQ-we4Cp.js.map → exportChart-Bkxr7mCe.js.map} +1 -1
- package/dist/chunks/{exportChart-BTJBYkOz.js → exportChart-Dn2pioNl.js} +2 -2
- package/dist/chunks/{exportChart-BTJBYkOz.js.map → exportChart-Dn2pioNl.js.map} +1 -1
- package/dist/chunks/{index-BNjCQA7q.js → index-BCWkcyOy.js} +2 -2
- package/dist/chunks/{index-BNjCQA7q.js.map → index-BCWkcyOy.js.map} +1 -1
- package/dist/chunks/{index-DBsIDOAa.js → index-CJeTVskY.js} +2 -2
- package/dist/chunks/{index-DBsIDOAa.js.map → index-CJeTVskY.js.map} +1 -1
- package/dist/chunks/{version-BURwX10Q.js → version-CRFysUYb.js} +2 -2
- package/dist/chunks/{version-BURwX10Q.js.map → version-CRFysUYb.js.map} +1 -1
- package/dist/chunks/{version-CYGIXntv.js → version-uUvnEzFR.js} +2 -2
- package/dist/chunks/{version-CYGIXntv.js.map → version-uUvnEzFR.js.map} +1 -1
- package/dist/core.css +134 -109
- package/dist/css/web-mojo.css +1 -1
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +1 -1
- package/dist/map.cjs.js +1 -1
- package/dist/map.es.js +1 -1
- package/dist/portal.css +32 -0
- package/dist/timeline.cjs.js +1 -1
- package/dist/timeline.es.js +1 -1
- package/dist/user-profile.cjs.js +1 -1
- package/dist/user-profile.es.js +1 -1
- package/dist/web-mojo.lite.iife.js +33 -9
- package/dist/web-mojo.lite.iife.js.map +1 -1
- package/dist/web-mojo.lite.iife.min.js +5 -5
- package/dist/web-mojo.lite.iife.min.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/Modal-DBJU16cc.js.map +0 -1
- package/dist/chunks/Modal-DuULCMFZ.js.map +0 -1
- package/dist/chunks/TokenManager-CcQFvaFD.js +0 -2
- package/dist/chunks/TokenManager-CcQFvaFD.js.map +0 -1
- package/dist/chunks/TokenManager-DEWZqbuo.js +0 -2
- package/dist/chunks/TokenManager-DEWZqbuo.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,M as a}from"./Collection-Bwoq6muu.js";class Group extends a{constructor(e={}){super(e,{endpoint:"/api/group"})}}class GroupList extends e{constructor(e={}){super({ModelClass:Group,endpoint:"/api/group",size:10,...e})}}const t={org:"Organization",division:"Division",department:"Department",team:"Team",merchant:"Merchant",partner:"Partner",client:"Client",iso:"ISO",sales:"Sales",reseller:"Reseller",location:"Location",region:"Region",route:"Route",project:"Project",inventory:"Inventory",test:"Testing",misc:"Miscellaneous",qa:"Quality Assurance"},s=Object.entries(t).map(([e,a])=>({value:e,label:a})),l={create:{title:"Create Group",fields:[{name:"name",type:"text",label:"Group Name",required:!0,placeholder:"Enter group name"},{name:"kind",type:"select",label:"Group Kind",required:!0,options:s},{type:"collection",name:"parent",label:"Parent Group",Collection:GroupList,labelField:"name",valueField:"id",maxItems:10,placeholder:"Search groups...",emptyFetch:!1,debounceMs:300}]},edit:{title:"Edit Group",fields:[{name:"name",type:"text",label:"Group Name",required:!0,placeholder:"Enter group name"},{name:"kind",type:"select",label:"Group Kind",required:!0,options:s},{type:"collection",name:"parent",label:"Parent Group",Collection:GroupList,labelField:"name",valueField:"id",maxItems:10,placeholder:"Search groups...",emptyFetch:!1,debounceMs:300},{name:"metadata.domain",type:"text",label:"Default Domain",placeholder:"Enter Domain"},{name:"metadata.portal",type:"text",label:"Default Portal",placeholder:"Enter Portal URL"},{name:"is_active",type:"switch",label:"Is Active",cols:4}]},detailed:{title:"Group Details",fields:[{type:"header",text:"Profile Information",level:4,class:"text-primary mb-3"},{type:"group",columns:{xs:12,md:4},fields:[{type:"image",name:"avatar",size:"lg",imageSize:{width:200,height:200},placeholder:"Upload your avatar",help:"Square images work best",columns:12},{name:"is_active",type:"switch",label:"Is Active",columns:12}]},{type:"group",columns:{xs:12,md:8},title:"Details",fields:[{name:"name",type:"text",label:"Group Name",required:!0,placeholder:"Enter group name",columns:12},{name:"kind",type:"select",label:"Group Kind",required:!0,columns:12,options:[{value:"org",label:"Organization"},{value:"team",label:"Team"},{value:"department",label:"Department"},{value:"merchant",label:"Merchant"},{value:"iso",label:"ISO"},{value:"group",label:"Group"}]},{type:"collection",name:"parent",label:"Parent Group",Collection:GroupList,labelField:"name",valueField:"id",maxItems:10,placeholder:"Search groups...",emptyFetch:!1,debounceMs:300,columns:12}]},{type:"group",columns:12,title:"Account Settings",class:"pt-3",fields:[{type:"select",name:"metadata.timezone",label:"Timezone",columns:6,value:"America/Los_Angeles",options:[{value:"America/New_York",text:"Eastern Time"},{value:"America/Chicago",text:"Central Time"},{value:"America/Denver",text:"Mountain Time"},{value:"America/Los_Angeles",text:"Pacific Time"},{value:"UTC",text:"UTC"}]},{type:"select",name:"metadata.eod_hour",label:"End of Day Hour",columns:6,options:[{value:0,text:"Midnight"},{value:1,text:"1 AM"},{value:2,text:"2 AM"},{value:3,text:"3 AM"},{value:4,text:"4 AM"},{value:5,text:"5 AM"},{value:6,text:"6 AM"},{value:7,text:"7 AM"},{value:8,text:"8 AM"},{value:9,text:"9 AM"},{value:10,text:"10 AM"},{value:11,text:"11 AM"},{value:12,text:"12 PM"},{value:13,text:"1 PM"},{value:14,text:"2 PM"},{value:15,text:"3 PM"},{value:16,text:"4 PM"},{value:17,text:"5 PM"},{value:18,text:"6 PM"},{value:19,text:"7 PM"},{value:20,text:"8 PM"},{value:21,text:"9 PM"},{value:22,text:"10 PM"},{value:23,text:"11 PM"}]}]},{type:"text",label:"Email Template (Prefix)",name:"metadata.email_template",columns:12}]}};Group.EDIT_FORM=l.edit,Group.ADD_FORM=l.create,Group.CREATE_FORM=l.create,Group.GroupKindOptions=s,Group.GroupKinds=t;const i=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,Group:Group,GroupForms:l,GroupList:GroupList},Symbol.toStringTag,{value:"Module"}));class User extends a{constructor(e={}){super(e,{endpoint:"/api/user"})}hasPermission(e){if(this.get("is_superuser"))return!0;if(Array.isArray(e))return e.some(e=>this.hasPermission(e));const a=e.startsWith("sys."),t=a?e.substring(4):e;return!!this._hasPermission(t)||!(a||!this.member||!this.member.hasPermission(e))}_hasPermission(e){const a=this.get("permissions");if(!a)return!1;if(1==a[e])return!0;const t=User.GRANULAR_TO_CATEGORY[e];return!(!t||1!=a[t])}hasPerm(e){return this.hasPermission(e)}}class UserList extends e{constructor(e={}){super({ModelClass:User,endpoint:"/api/user",...e})}}User.CATEGORY_PERMISSIONS=[{name:"view_admin",label:"Admin Panel",tooltip:"Access the admin panel, assistant, and system tools"},{name:"security",label:"Security",tooltip:"Incidents, events, rules, tickets, firewall, bouncer, GeoIP, system logs"},{name:"users",label:"Users",tooltip:"User records, passkeys, TOTP, API keys, OAuth, devices, locations"},{name:"groups",label:"Groups",tooltip:"Groups, members, group API keys, settings"},{name:"comms",label:"Communications",tooltip:"Email, phone, SMS, push notifications, chat, notifications"},{name:"jobs",label:"Jobs",tooltip:"Jobs, job events, job logs, runners, queue control, system stats"},{name:"metrics",label:"Metrics",tooltip:"Metrics recording, fetching, categories, values, permissions"},{name:"files",label:"Files",tooltip:"File managers, files, renditions, vault files, vault data, S3 buckets"},{name:"assistant",label:"AI Assistant",tooltip:"Access to the AI Assistant"},{name:"comms",label:"Communication",tooltip:"Ability to notify users"}],User.GRANULAR_PERMISSION_TABS=[{label:"Account",permissions:[{name:"view_users",label:"View Users"},{name:"manage_users",label:"Manage Users"},{name:"view_groups",label:"View Groups"},{name:"manage_groups",label:"Manage Groups"},{name:"manage_group",label:"Manage Own Group"},{name:"view_members",label:"View Members"},{name:"manage_settings",label:"Manage Settings"}]},{label:"Communication",permissions:[{name:"manage_chat",label:"Manage Chat"},{name:"manage_aws",label:"Manage Email (AWS)"},{name:"view_notifications",label:"View Notifications"},{name:"manage_notifications",label:"Manage Notifications"},{name:"send_notifications",label:"Send Notifications"},{name:"view_devices",label:"View Push Devices"},{name:"manage_devices",label:"Manage Push Devices"},{name:"manage_push_config",label:"Push Config"},{name:"view_phone_numbers",label:"View Phone Numbers"},{name:"manage_phone_numbers",label:"Manage Phone Numbers"},{name:"manage_phone_config",label:"Phone Config"},{name:"view_sms",label:"View SMS"},{name:"manage_sms",label:"Manage SMS"},{name:"send_sms",label:"Send SMS"}]},{label:"Platform",permissions:[{name:"view_security",label:"View Security"},{name:"manage_security",label:"Manage Security"},{name:"admin",label:"Log Admin"},{name:"view_logs",label:"View Logs"},{name:"manage_logs",label:"Manage Logs"},{name:"view_jobs",label:"View Jobs"},{name:"manage_jobs",label:"Manage Jobs"},{name:"view_metrics",label:"View Metrics"},{name:"manage_metrics",label:"Manage Metrics"},{name:"write_metrics",label:"Write Metrics"},{name:"view_fileman",label:"View File Managers"},{name:"manage_files",label:"Manage Files"},{name:"view_vault",label:"View Vault"},{name:"manage_vault",label:"Manage Vault"},{name:"manage_docit",label:"Manage Docs"},{name:"manage_shortlinks",label:"Manage Shortlinks"}]}],User.CATEGORY_GRANULAR_MAP={security:["view_security","manage_security"],users:["view_users","manage_users","view_members"],groups:["view_groups","manage_groups","manage_group"],comms:["manage_chat","manage_aws","view_notifications","manage_notifications","send_notifications","view_devices","manage_devices","manage_push_config","view_phone_numbers","manage_phone_numbers","manage_phone_config","view_sms","manage_sms","send_sms"],jobs:["view_jobs","manage_jobs"],metrics:["view_metrics","manage_metrics","write_metrics"],files:["view_fileman","manage_files","view_vault","manage_vault"]},User.GRANULAR_TO_CATEGORY={};for(const[c,u]of Object.entries(User.CATEGORY_GRANULAR_MAP))for(const e of u)User.GRANULAR_TO_CATEGORY[e]=c;User.APP_CATEGORY_PERMISSIONS=[],User.APP_GRANULAR_PERMISSIONS=[],User.PERMISSIONS=[...User.CATEGORY_PERMISSIONS,...User.GRANULAR_PERMISSION_TABS.flatMap(e=>e.permissions),...User.APP_CATEGORY_PERMISSIONS,...User.APP_GRANULAR_PERMISSIONS],User.PERMISSION_FIELDS=[...User.PERMISSIONS.map(e=>({name:`permissions.${e.name}`,type:"switch",label:e.label,columns:6}))];const n=e=>({name:`permissions.${e.name}`,type:"switch",label:e.label,columns:6,...e.tooltip?{tooltip:e.tooltip}:{}});User.CATEGORY_PERMISSION_FIELDS=(()=>{const e=[{label:"System",fields:User.CATEGORY_PERMISSIONS.map(n)}];return User.APP_CATEGORY_PERMISSIONS.length>0&&e.push({label:"App",fields:User.APP_CATEGORY_PERMISSIONS.map(n)}),[{type:"tabset",tabs:e}]})(),User.GRANULAR_PERMISSION_FIELDS=(()=>{const e=User.GRANULAR_PERMISSION_TABS.map(e=>({label:e.label,fields:e.permissions.map(n)}));return User.APP_GRANULAR_PERMISSIONS.length>0&&e.push({label:"App",fields:User.APP_GRANULAR_PERMISSIONS.map(n)}),[{type:"tabset",tabs:e}]})();const o={create:{title:"Create User",fields:[{name:"email",type:"text",label:"Email",required:!0},{name:"phone_number",type:"text",label:"Phone number",columns:12},{name:"display_name",type:"text",label:"Display Name"}]},edit:{title:"Edit User",fields:[{name:"email",type:"email",label:"Email",columns:12},{name:"display_name",type:"text",label:"Display Name",columns:12},{name:"phone_number",type:"text",label:"Phone number",columns:12},{type:"collection",name:"org",label:"Organization",Collection:GroupList,labelField:"name",valueField:"id",columns:12}]},permissions:{title:"Edit Permissions",fields:User.PERMISSION_FIELDS}},r={profile:{title:"User Profile",columns:2,fields:[{name:"id",label:"User ID",type:"number",columns:4},{name:"last_login",label:"Last Login",type:"datetime",format:"relative",columns:4},{name:"last_activity",label:"Last Activity",type:"datetime",format:"relative",columns:4},{name:"username",label:"Username",type:"text",format:"lowercase",columns:4},{name:"display_name",label:"Display Name",type:"text",columns:4},{name:"email",label:"Email",type:"email",columns:12},{name:"org.name",label:"Organization",type:"text",columns:6},{name:"phone_number",label:"Phone Number",type:"text",columns:6}]},activity:{title:"User Activity",columns:2,fields:[{name:"last_login",label:"Last Login",type:"datetime",format:"relative",colSize:6},{name:"last_activity",label:"Last Activity",type:"datetime",format:"relative",colSize:6}]},detailed:{title:"Detailed User Information",columns:2,showEmptyValues:!0,emptyValueText:"Not set",fields:[{name:"id",label:"User ID",type:"number",colSize:3},{name:"display_name",label:"Display Name",type:"text",format:'capitalize|default("Unnamed User")',colSize:9},{name:"username",label:"Username",type:"text",format:"lowercase",colSize:6},{name:"email",label:"Email Address",type:"email",colSize:6},{name:"phone_number",label:"Phone Number",type:"phone",format:'phone|default("Not provided")',colSize:6},{name:"is_active",label:"Account Status",type:"boolean",colSize:6},{name:"last_login",label:"Last Login",type:"datetime",format:"relative",colSize:6},{name:"last_activity",label:"Last Activity",type:"datetime",format:"relative",colSize:6},{name:"avatar.url",label:"Avatar",type:"url",colSize:12},{name:"permissions",label:"User Permissions",type:"dataview",dataViewColumns:2,showEmptyValues:!1},{name:"metadata",label:"User Metadata",type:"dataview",dataViewColumns:1},{name:"avatar",label:"Avatar Details",type:"dataview",dataViewColumns:1}]},permissions:{title:"User Permissions",columns:1,fields:[{name:"display_name",label:"User",type:"text",format:"capitalize",columns:12},{name:"permissions",label:"Assigned Permissions",type:"dataview",dataViewColumns:3,showEmptyValues:!1,colSize:12}]},summary:{title:"User Summary",columns:3,fields:[{name:"display_name",label:"Name",type:"text",format:"capitalize|truncate(30)"},{name:"email",label:"Email",type:"email"},{name:"is_active",label:"Status",type:"boolean"},{name:"last_activity",label:"Last Seen",type:"datetime",format:"relative",colSize:12}]}};User.DATA_VIEW=r.detailed,User.EDIT_FORM=o.edit,User.ADD_FORM=o.create;class UserDevice extends a{constructor(e={}){super(e,{endpoint:"/api/user/device"})}static async getByDuid(e){const a=new UserDevice,t=await a.rest.GET("/api/user/device/lookup",{duid:e});return t.success&&t.data&&t.data.data?new UserDevice(t.data.data):null}}class UserDeviceList extends e{constructor(e={}){super({ModelClass:UserDevice,endpoint:"/api/user/device",...e})}}class UserDeviceLocation extends a{constructor(e={}){super(e,{endpoint:"/api/user/device/location"})}}class UserDeviceLocationList extends e{constructor(e={}){super({ModelClass:UserDeviceLocation,endpoint:"/api/user/device/location",...e})}}const m=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,User:User,UserDataView:r,UserDevice:UserDevice,UserDeviceList:UserDeviceList,UserDeviceLocation:UserDeviceLocation,UserDeviceLocationList:UserDeviceLocationList,UserForms:o,UserList:UserList},Symbol.toStringTag,{value:"Module"}));export{GroupList as G,User as U,UserList as a,UserDeviceLocationList as b,UserDeviceList as c,Group as d,l as e,r as f,UserDevice as g,UserDeviceLocation as h,o as i,i as j,m as k};
|
|
2
|
-
//# sourceMappingURL=User-
|
|
1
|
+
import{C as e,M as a}from"./Collection-CY6BblFn.js";class Group extends a{constructor(e={}){super(e,{endpoint:"/api/group"})}}class GroupList extends e{constructor(e={}){super({ModelClass:Group,endpoint:"/api/group",size:10,...e})}}const t={org:"Organization",division:"Division",department:"Department",team:"Team",merchant:"Merchant",partner:"Partner",client:"Client",iso:"ISO",sales:"Sales",reseller:"Reseller",location:"Location",region:"Region",route:"Route",project:"Project",inventory:"Inventory",test:"Testing",misc:"Miscellaneous",qa:"Quality Assurance"},s=Object.entries(t).map(([e,a])=>({value:e,label:a})),l={create:{title:"Create Group",fields:[{name:"name",type:"text",label:"Group Name",required:!0,placeholder:"Enter group name"},{name:"kind",type:"select",label:"Group Kind",required:!0,options:s},{type:"collection",name:"parent",label:"Parent Group",Collection:GroupList,labelField:"name",valueField:"id",maxItems:10,placeholder:"Search groups...",emptyFetch:!1,debounceMs:300}]},edit:{title:"Edit Group",fields:[{name:"name",type:"text",label:"Group Name",required:!0,placeholder:"Enter group name"},{name:"kind",type:"select",label:"Group Kind",required:!0,options:s},{type:"collection",name:"parent",label:"Parent Group",Collection:GroupList,labelField:"name",valueField:"id",maxItems:10,placeholder:"Search groups...",emptyFetch:!1,debounceMs:300},{name:"metadata.domain",type:"text",label:"Default Domain",placeholder:"Enter Domain"},{name:"metadata.portal",type:"text",label:"Default Portal",placeholder:"Enter Portal URL"},{name:"is_active",type:"switch",label:"Is Active",cols:4}]},detailed:{title:"Group Details",fields:[{type:"header",text:"Profile Information",level:4,class:"text-primary mb-3"},{type:"group",columns:{xs:12,md:4},fields:[{type:"image",name:"avatar",size:"lg",imageSize:{width:200,height:200},placeholder:"Upload your avatar",help:"Square images work best",columns:12},{name:"is_active",type:"switch",label:"Is Active",columns:12}]},{type:"group",columns:{xs:12,md:8},title:"Details",fields:[{name:"name",type:"text",label:"Group Name",required:!0,placeholder:"Enter group name",columns:12},{name:"kind",type:"select",label:"Group Kind",required:!0,columns:12,options:[{value:"org",label:"Organization"},{value:"team",label:"Team"},{value:"department",label:"Department"},{value:"merchant",label:"Merchant"},{value:"iso",label:"ISO"},{value:"group",label:"Group"}]},{type:"collection",name:"parent",label:"Parent Group",Collection:GroupList,labelField:"name",valueField:"id",maxItems:10,placeholder:"Search groups...",emptyFetch:!1,debounceMs:300,columns:12}]},{type:"group",columns:12,title:"Account Settings",class:"pt-3",fields:[{type:"select",name:"metadata.timezone",label:"Timezone",columns:6,value:"America/Los_Angeles",options:[{value:"America/New_York",text:"Eastern Time"},{value:"America/Chicago",text:"Central Time"},{value:"America/Denver",text:"Mountain Time"},{value:"America/Los_Angeles",text:"Pacific Time"},{value:"UTC",text:"UTC"}]},{type:"select",name:"metadata.eod_hour",label:"End of Day Hour",columns:6,options:[{value:0,text:"Midnight"},{value:1,text:"1 AM"},{value:2,text:"2 AM"},{value:3,text:"3 AM"},{value:4,text:"4 AM"},{value:5,text:"5 AM"},{value:6,text:"6 AM"},{value:7,text:"7 AM"},{value:8,text:"8 AM"},{value:9,text:"9 AM"},{value:10,text:"10 AM"},{value:11,text:"11 AM"},{value:12,text:"12 PM"},{value:13,text:"1 PM"},{value:14,text:"2 PM"},{value:15,text:"3 PM"},{value:16,text:"4 PM"},{value:17,text:"5 PM"},{value:18,text:"6 PM"},{value:19,text:"7 PM"},{value:20,text:"8 PM"},{value:21,text:"9 PM"},{value:22,text:"10 PM"},{value:23,text:"11 PM"}]}]},{type:"text",label:"Email Template (Prefix)",name:"metadata.email_template",columns:12}]}};Group.EDIT_FORM=l.edit,Group.ADD_FORM=l.create,Group.CREATE_FORM=l.create,Group.GroupKindOptions=s,Group.GroupKinds=t;const i=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,Group:Group,GroupForms:l,GroupList:GroupList},Symbol.toStringTag,{value:"Module"}));class User extends a{constructor(e={}){super(e,{endpoint:"/api/user"})}hasPermission(e){if(this.get("is_superuser"))return!0;if(Array.isArray(e))return e.some(e=>this.hasPermission(e));const a=e.startsWith("sys."),t=a?e.substring(4):e;return!!this._hasPermission(t)||!(a||!this.member||!this.member.hasPermission(e))}_hasPermission(e){const a=this.get("permissions");if(!a)return!1;if(1==a[e])return!0;const t=User.GRANULAR_TO_CATEGORY[e];return!(!t||1!=a[t])}hasPerm(e){return this.hasPermission(e)}}class UserList extends e{constructor(e={}){super({ModelClass:User,endpoint:"/api/user",...e})}}User.CATEGORY_PERMISSIONS=[{name:"view_admin",label:"Admin Panel",tooltip:"Access the admin panel, assistant, and system tools"},{name:"security",label:"Security",tooltip:"Incidents, events, rules, tickets, firewall, bouncer, GeoIP, system logs"},{name:"users",label:"Users",tooltip:"User records, passkeys, TOTP, API keys, OAuth, devices, locations"},{name:"groups",label:"Groups",tooltip:"Groups, members, group API keys, settings"},{name:"comms",label:"Communications",tooltip:"Email, phone, SMS, push notifications, chat, notifications"},{name:"jobs",label:"Jobs",tooltip:"Jobs, job events, job logs, runners, queue control, system stats"},{name:"metrics",label:"Metrics",tooltip:"Metrics recording, fetching, categories, values, permissions"},{name:"files",label:"Files",tooltip:"File managers, files, renditions, vault files, vault data, S3 buckets"},{name:"assistant",label:"AI Assistant",tooltip:"Access to the AI Assistant"},{name:"comms",label:"Communication",tooltip:"Ability to notify users"}],User.GRANULAR_PERMISSION_TABS=[{label:"Account",permissions:[{name:"view_users",label:"View Users"},{name:"manage_users",label:"Manage Users"},{name:"view_groups",label:"View Groups"},{name:"manage_groups",label:"Manage Groups"},{name:"manage_group",label:"Manage Own Group"},{name:"view_members",label:"View Members"},{name:"manage_settings",label:"Manage Settings"}]},{label:"Communication",permissions:[{name:"manage_chat",label:"Manage Chat"},{name:"manage_aws",label:"Manage Email (AWS)"},{name:"view_notifications",label:"View Notifications"},{name:"manage_notifications",label:"Manage Notifications"},{name:"send_notifications",label:"Send Notifications"},{name:"view_devices",label:"View Push Devices"},{name:"manage_devices",label:"Manage Push Devices"},{name:"manage_push_config",label:"Push Config"},{name:"view_phone_numbers",label:"View Phone Numbers"},{name:"manage_phone_numbers",label:"Manage Phone Numbers"},{name:"manage_phone_config",label:"Phone Config"},{name:"view_sms",label:"View SMS"},{name:"manage_sms",label:"Manage SMS"},{name:"send_sms",label:"Send SMS"}]},{label:"Platform",permissions:[{name:"view_security",label:"View Security"},{name:"manage_security",label:"Manage Security"},{name:"admin",label:"Log Admin"},{name:"view_logs",label:"View Logs"},{name:"manage_logs",label:"Manage Logs"},{name:"view_jobs",label:"View Jobs"},{name:"manage_jobs",label:"Manage Jobs"},{name:"view_metrics",label:"View Metrics"},{name:"manage_metrics",label:"Manage Metrics"},{name:"write_metrics",label:"Write Metrics"},{name:"view_fileman",label:"View File Managers"},{name:"manage_files",label:"Manage Files"},{name:"view_vault",label:"View Vault"},{name:"manage_vault",label:"Manage Vault"},{name:"manage_docit",label:"Manage Docs"},{name:"manage_shortlinks",label:"Manage Shortlinks"}]}],User.CATEGORY_GRANULAR_MAP={security:["view_security","manage_security"],users:["view_users","manage_users","view_members"],groups:["view_groups","manage_groups","manage_group"],comms:["manage_chat","manage_aws","view_notifications","manage_notifications","send_notifications","view_devices","manage_devices","manage_push_config","view_phone_numbers","manage_phone_numbers","manage_phone_config","view_sms","manage_sms","send_sms"],jobs:["view_jobs","manage_jobs"],metrics:["view_metrics","manage_metrics","write_metrics"],files:["view_fileman","manage_files","view_vault","manage_vault"]},User.GRANULAR_TO_CATEGORY={};for(const[c,u]of Object.entries(User.CATEGORY_GRANULAR_MAP))for(const e of u)User.GRANULAR_TO_CATEGORY[e]=c;User.APP_CATEGORY_PERMISSIONS=[],User.APP_GRANULAR_PERMISSIONS=[],User.PERMISSIONS=[...User.CATEGORY_PERMISSIONS,...User.GRANULAR_PERMISSION_TABS.flatMap(e=>e.permissions),...User.APP_CATEGORY_PERMISSIONS,...User.APP_GRANULAR_PERMISSIONS],User.PERMISSION_FIELDS=[...User.PERMISSIONS.map(e=>({name:`permissions.${e.name}`,type:"switch",label:e.label,columns:6}))];const n=e=>({name:`permissions.${e.name}`,type:"switch",label:e.label,columns:6,...e.tooltip?{tooltip:e.tooltip}:{}});User.CATEGORY_PERMISSION_FIELDS=(()=>{const e=[{label:"System",fields:User.CATEGORY_PERMISSIONS.map(n)}];return User.APP_CATEGORY_PERMISSIONS.length>0&&e.push({label:"App",fields:User.APP_CATEGORY_PERMISSIONS.map(n)}),[{type:"tabset",tabs:e}]})(),User.GRANULAR_PERMISSION_FIELDS=(()=>{const e=User.GRANULAR_PERMISSION_TABS.map(e=>({label:e.label,fields:e.permissions.map(n)}));return User.APP_GRANULAR_PERMISSIONS.length>0&&e.push({label:"App",fields:User.APP_GRANULAR_PERMISSIONS.map(n)}),[{type:"tabset",tabs:e}]})();const o={create:{title:"Create User",fields:[{name:"email",type:"text",label:"Email",required:!0},{name:"phone_number",type:"text",label:"Phone number",columns:12},{name:"display_name",type:"text",label:"Display Name"}]},edit:{title:"Edit User",fields:[{name:"email",type:"email",label:"Email",columns:12},{name:"display_name",type:"text",label:"Display Name",columns:12},{name:"phone_number",type:"text",label:"Phone number",columns:12},{type:"collection",name:"org",label:"Organization",Collection:GroupList,labelField:"name",valueField:"id",columns:12}]},permissions:{title:"Edit Permissions",fields:User.PERMISSION_FIELDS}},r={profile:{title:"User Profile",columns:2,fields:[{name:"id",label:"User ID",type:"number",columns:4},{name:"last_login",label:"Last Login",type:"datetime",format:"relative",columns:4},{name:"last_activity",label:"Last Activity",type:"datetime",format:"relative",columns:4},{name:"username",label:"Username",type:"text",format:"lowercase",columns:4},{name:"display_name",label:"Display Name",type:"text",columns:4},{name:"email",label:"Email",type:"email",columns:12},{name:"org.name",label:"Organization",type:"text",columns:6},{name:"phone_number",label:"Phone Number",type:"text",columns:6}]},activity:{title:"User Activity",columns:2,fields:[{name:"last_login",label:"Last Login",type:"datetime",format:"relative",colSize:6},{name:"last_activity",label:"Last Activity",type:"datetime",format:"relative",colSize:6}]},detailed:{title:"Detailed User Information",columns:2,showEmptyValues:!0,emptyValueText:"Not set",fields:[{name:"id",label:"User ID",type:"number",colSize:3},{name:"display_name",label:"Display Name",type:"text",format:'capitalize|default("Unnamed User")',colSize:9},{name:"username",label:"Username",type:"text",format:"lowercase",colSize:6},{name:"email",label:"Email Address",type:"email",colSize:6},{name:"phone_number",label:"Phone Number",type:"phone",format:'phone|default("Not provided")',colSize:6},{name:"is_active",label:"Account Status",type:"boolean",colSize:6},{name:"last_login",label:"Last Login",type:"datetime",format:"relative",colSize:6},{name:"last_activity",label:"Last Activity",type:"datetime",format:"relative",colSize:6},{name:"avatar.url",label:"Avatar",type:"url",colSize:12},{name:"permissions",label:"User Permissions",type:"dataview",dataViewColumns:2,showEmptyValues:!1},{name:"metadata",label:"User Metadata",type:"dataview",dataViewColumns:1},{name:"avatar",label:"Avatar Details",type:"dataview",dataViewColumns:1}]},permissions:{title:"User Permissions",columns:1,fields:[{name:"display_name",label:"User",type:"text",format:"capitalize",columns:12},{name:"permissions",label:"Assigned Permissions",type:"dataview",dataViewColumns:3,showEmptyValues:!1,colSize:12}]},summary:{title:"User Summary",columns:3,fields:[{name:"display_name",label:"Name",type:"text",format:"capitalize|truncate(30)"},{name:"email",label:"Email",type:"email"},{name:"is_active",label:"Status",type:"boolean"},{name:"last_activity",label:"Last Seen",type:"datetime",format:"relative",colSize:12}]}};User.DATA_VIEW=r.detailed,User.EDIT_FORM=o.edit,User.ADD_FORM=o.create;class UserDevice extends a{constructor(e={}){super(e,{endpoint:"/api/user/device"})}static async getByDuid(e){const a=new UserDevice,t=await a.rest.GET("/api/user/device/lookup",{duid:e});return t.success&&t.data&&t.data.data?new UserDevice(t.data.data):null}}class UserDeviceList extends e{constructor(e={}){super({ModelClass:UserDevice,endpoint:"/api/user/device",...e})}}class UserDeviceLocation extends a{constructor(e={}){super(e,{endpoint:"/api/user/device/location"})}}class UserDeviceLocationList extends e{constructor(e={}){super({ModelClass:UserDeviceLocation,endpoint:"/api/user/device/location",...e})}}const m=/* @__PURE__ */Object.freeze(/* @__PURE__ */Object.defineProperty({__proto__:null,User:User,UserDataView:r,UserDevice:UserDevice,UserDeviceList:UserDeviceList,UserDeviceLocation:UserDeviceLocation,UserDeviceLocationList:UserDeviceLocationList,UserForms:o,UserList:UserList},Symbol.toStringTag,{value:"Module"}));export{GroupList as G,User as U,UserList as a,UserDeviceLocationList as b,UserDeviceList as c,Group as d,l as e,r as f,UserDevice as g,UserDeviceLocation as h,o as i,i as j,m as k};
|
|
2
|
+
//# sourceMappingURL=User-KTBU_5cr.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"User-DNQhdBtI.js","sources":["../../src/core/models/Group.js","../../src/core/models/User.js"],"sourcesContent":["\nimport Collection from '@core/Collection.js';\nimport Model from '@core/Model.js';\n\n/**\n * Group Model - Represents an organization, team, or group entity\n *\n * Features:\n * - Hierarchical group support (parent/child relationships)\n * - Member management\n * - Search and filtering capabilities\n * - Role-based permissions within groups\n * - Metadata and settings management\n */\nclass Group extends Model {\n constructor(data = {}) {\n super(data, {\n endpoint: '/api/group'\n });\n }\n}\n\n/**\n * GroupCollection - Enhanced collection for managing groups with advanced search and filtering\n */\nclass GroupList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: Group,\n endpoint: '/api/group',\n size: 10,\n ...options\n });\n }\n}\n\nconst GroupKinds = {\n 'org': 'Organization',\n 'division': 'Division',\n 'department': 'Department',\n 'team': 'Team',\n 'merchant': 'Merchant',\n 'partner': 'Partner',\n 'client': 'Client',\n 'iso': 'ISO',\n 'sales': 'Sales',\n 'reseller': 'Reseller',\n 'location': 'Location',\n 'region': 'Region',\n 'route': 'Route',\n 'project': 'Project',\n \"inventory\": \"Inventory\",\n 'test': 'Testing',\n 'misc': 'Miscellaneous',\n 'qa': 'Quality Assurance'\n};\n\n// Convert GroupKinds to select options\nconst GroupKindOptions = Object.entries(GroupKinds).map(([key, label]) => ({\n value: key,\n label: label\n}));\n\n/**\n * Form configurations for group management\n */\nconst GroupForms = {\n create: {\n title: 'Create Group',\n fields: [\n {\n name: 'name',\n type: 'text',\n label: 'Group Name',\n required: true,\n placeholder: 'Enter group name'\n },\n {\n name: 'kind',\n type: 'select',\n label: 'Group Kind',\n required: true,\n options: GroupKindOptions\n },\n {\n type: 'collection',\n name: 'parent',\n label: 'Parent Group',\n Collection: GroupList, // Collection class\n labelField: 'name', // Field to display in dropdown\n valueField: 'id', // Field to use as value\n maxItems: 10, // Max items to show in dropdown\n placeholder: 'Search groups...',\n emptyFetch: false,\n debounceMs: 300, // Search debounce delay\n }\n ]\n },\n\n edit: {\n title: 'Edit Group',\n fields: [\n {\n name: 'name',\n type: 'text',\n label: 'Group Name',\n required: true,\n placeholder: 'Enter group name',\n },\n {\n name: 'kind',\n type: 'select',\n label: 'Group Kind',\n required: true,\n options: GroupKindOptions\n },\n {\n type: 'collection',\n name: 'parent',\n label: 'Parent Group',\n Collection: GroupList, // Collection class\n labelField: 'name', // Field to display in dropdown\n valueField: 'id', // Field to use as value\n maxItems: 10, // Max items to show in dropdown\n placeholder: 'Search groups...',\n emptyFetch: false,\n debounceMs: 300, // Search debounce delay\n },\n {\n name: 'metadata.domain',\n type: 'text',\n label: 'Default Domain',\n placeholder: 'Enter Domain',\n },\n {\n name: 'metadata.portal',\n type: 'text',\n label: 'Default Portal',\n placeholder: 'Enter Portal URL',\n },\n {\n name: 'is_active',\n type: 'switch',\n label: 'Is Active',\n cols: 4\n },\n ]\n },\n\n detailed: {\n title: 'Group Details',\n fields: [\n // Profile Header\n {\n type: 'header',\n text: 'Profile Information',\n level: 4,\n class: 'text-primary mb-3'\n },\n\n // Avatar and Basic Info\n {\n type: 'group',\n columns: { xs: 12, md: 4 },\n fields: [\n {\n type: 'image',\n name: 'avatar',\n size: 'lg',\n imageSize: { width: 200, height: 200 },\n placeholder: 'Upload your avatar',\n help: 'Square images work best',\n columns: 12\n },\n {\n name: 'is_active',\n type: 'switch',\n label: 'Is Active',\n columns: 12\n },\n ]\n },\n\n // Profile Details\n {\n type: 'group',\n columns: { xs: 12, md: 8 },\n title: 'Details',\n fields: [\n {\n name: 'name',\n type: 'text',\n label: 'Group Name',\n required: true,\n placeholder: 'Enter group name',\n columns: 12\n },\n {\n name: 'kind',\n type: 'select',\n label: 'Group Kind',\n required: true,\n columns: 12,\n options: [\n { value: 'org', label: 'Organization' },\n { value: 'team', label: 'Team' },\n { value: 'department', label: 'Department' },\n { value: 'merchant', label: 'Merchant' },\n { value: 'iso', label: 'ISO' },\n { value: 'group', label: 'Group' }\n ]\n },\n {\n type: 'collection',\n name: 'parent',\n label: 'Parent Group',\n Collection: GroupList, // Collection class\n labelField: 'name', // Field to display in dropdown\n valueField: 'id', // Field to use as value\n maxItems: 10, // Max items to show in dropdown\n placeholder: 'Search groups...',\n emptyFetch: false,\n debounceMs: 300, // Search debounce delay\n columns: 12\n }\n ]\n },\n\n // Account Settings\n {\n type: 'group',\n columns: 12,\n title: 'Account Settings',\n class: \"pt-3\",\n fields: [\n {\n type: 'select',\n name: 'metadata.timezone',\n label: 'Timezone',\n columns: 6,\n value: 'America/Los_Angeles',\n options: [\n { value: 'America/New_York', text: 'Eastern Time' },\n { value: 'America/Chicago', text: 'Central Time' },\n { value: 'America/Denver', text: 'Mountain Time' },\n { value: 'America/Los_Angeles', text: 'Pacific Time' },\n { value: 'UTC', text: 'UTC' }\n ]\n },\n {\n type: 'select',\n name: 'metadata.eod_hour',\n label: 'End of Day Hour',\n columns: 6,\n options: [\n { value: 0, text: 'Midnight' },\n { value: 1, text: '1 AM' },\n { value: 2, text: '2 AM' },\n { value: 3, text: '3 AM' },\n { value: 4, text: '4 AM' },\n { value: 5, text: '5 AM' },\n { value: 6, text: '6 AM' },\n { value: 7, text: '7 AM' },\n { value: 8, text: '8 AM' },\n { value: 9, text: '9 AM' },\n { value: 10, text: '10 AM' },\n { value: 11, text: '11 AM' },\n { value: 12, text: '12 PM' },\n { value: 13, text: '1 PM' },\n { value: 14, text: '2 PM' },\n { value: 15, text: '3 PM' },\n { value: 16, text: '4 PM' },\n { value: 17, text: '5 PM' },\n { value: 18, text: '6 PM' },\n { value: 19, text: '7 PM' },\n { value: 20, text: '8 PM' },\n { value: 21, text: '9 PM' },\n { value: 22, text: '10 PM' },\n { value: 23, text: '11 PM' }\n ]\n }\n ]\n },\n {\n type: \"text\",\n label: \"Email Template (Prefix)\",\n name: \"metadata.email_template\",\n columns: 12\n }\n ]\n },\n};\n\nGroup.EDIT_FORM = GroupForms.edit;\nGroup.ADD_FORM = GroupForms.create;\nGroup.CREATE_FORM = GroupForms.create; // Alias for compatibility\nGroup.GroupKindOptions = GroupKindOptions;\nGroup.GroupKinds = GroupKinds;\nexport { Group, GroupList, GroupForms };\n","import Collection from '@core/Collection.js';\nimport Model from '@core/Model.js';\n\nimport { GroupList } from './Group.js';\n\nclass User extends Model {\n constructor(data = {}) {\n super(data, {\n endpoint: '/api/user'\n });\n }\n\n hasPermission(permission) {\n if (this.get(\"is_superuser\")) return true;\n if (Array.isArray(permission)) {\n return permission.some(p => this.hasPermission(p));\n }\n\n // Check if permission has \"sys.\" prefix\n const isSysPermission = permission.startsWith('sys.');\n const permissionToCheck = isSysPermission ? permission.substring(4) : permission;\n\n if (this._hasPermission(permissionToCheck)) {\n return true;\n }\n\n // Only check member permissions if it's not a system permission\n if (!isSysPermission && this.member && this.member.hasPermission(permission)) {\n return true;\n }\n\n return false;\n }\n\n _hasPermission(permission) {\n const permissions = this.get(\"permissions\");\n if (!permissions) {\n return false;\n }\n if (permissions[permission] == true) {\n return true;\n }\n // Check if user has the category permission that covers this granular perm\n const category = User.GRANULAR_TO_CATEGORY[permission];\n if (category && permissions[category] == true) {\n return true;\n }\n return false;\n }\n\n hasPerm(p) {\n return this.hasPermission(p);\n }\n}\n\nclass UserList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: User,\n endpoint: '/api/user',\n ...options\n });\n }\n}\n\n// ── Category Permissions (broad domain-level access) ──────────────\nUser.CATEGORY_PERMISSIONS = [\n { name: \"view_admin\", label: \"Admin Panel\", tooltip: \"Access the admin panel, assistant, and system tools\" },\n { name: \"security\", label: \"Security\", tooltip: \"Incidents, events, rules, tickets, firewall, bouncer, GeoIP, system logs\" },\n { name: \"users\", label: \"Users\", tooltip: \"User records, passkeys, TOTP, API keys, OAuth, devices, locations\" },\n { name: \"groups\", label: \"Groups\", tooltip: \"Groups, members, group API keys, settings\" },\n { name: \"comms\", label: \"Communications\", tooltip: \"Email, phone, SMS, push notifications, chat, notifications\" },\n { name: \"jobs\", label: \"Jobs\", tooltip: \"Jobs, job events, job logs, runners, queue control, system stats\" },\n { name: \"metrics\", label: \"Metrics\", tooltip: \"Metrics recording, fetching, categories, values, permissions\" },\n { name: \"files\", label: \"Files\", tooltip: \"File managers, files, renditions, vault files, vault data, S3 buckets\" },\n { name: \"assistant\", label: \"AI Assistant\", tooltip: \"Access to the AI Assistant\" },\n { name: \"comms\", label: \"Communication\", tooltip: \"Ability to notify users\" },\n];\n\n// ── Granular Permissions (fine-grained view/manage pairs) ─────────\nUser.GRANULAR_PERMISSION_TABS = [\n {\n label: 'Account',\n permissions: [\n { name: \"view_users\", label: \"View Users\" },\n { name: \"manage_users\", label: \"Manage Users\" },\n { name: \"view_groups\", label: \"View Groups\" },\n { name: \"manage_groups\", label: \"Manage Groups\" },\n { name: \"manage_group\", label: \"Manage Own Group\" },\n { name: \"view_members\", label: \"View Members\" },\n { name: \"manage_settings\", label: \"Manage Settings\" },\n ]\n },\n {\n label: 'Communication',\n permissions: [\n { name: \"manage_chat\", label: \"Manage Chat\" },\n { name: \"manage_aws\", label: \"Manage Email (AWS)\" },\n { name: \"view_notifications\", label: \"View Notifications\" },\n { name: \"manage_notifications\", label: \"Manage Notifications\" },\n { name: \"send_notifications\", label: \"Send Notifications\" },\n { name: \"view_devices\", label: \"View Push Devices\" },\n { name: \"manage_devices\", label: \"Manage Push Devices\" },\n { name: \"manage_push_config\", label: \"Push Config\" },\n { name: \"view_phone_numbers\", label: \"View Phone Numbers\" },\n { name: \"manage_phone_numbers\", label: \"Manage Phone Numbers\" },\n { name: \"manage_phone_config\", label: \"Phone Config\" },\n { name: \"view_sms\", label: \"View SMS\" },\n { name: \"manage_sms\", label: \"Manage SMS\" },\n { name: \"send_sms\", label: \"Send SMS\" },\n ]\n },\n {\n label: 'Platform',\n permissions: [\n { name: \"view_security\", label: \"View Security\" },\n { name: \"manage_security\", label: \"Manage Security\" },\n { name: \"admin\", label: \"Log Admin\" },\n { name: \"view_logs\", label: \"View Logs\" },\n { name: \"manage_logs\", label: \"Manage Logs\" },\n { name: \"view_jobs\", label: \"View Jobs\" },\n { name: \"manage_jobs\", label: \"Manage Jobs\" },\n { name: \"view_metrics\", label: \"View Metrics\" },\n { name: \"manage_metrics\", label: \"Manage Metrics\" },\n { name: \"write_metrics\", label: \"Write Metrics\" },\n { name: \"view_fileman\", label: \"View File Managers\" },\n { name: \"manage_files\", label: \"Manage Files\" },\n { name: \"view_vault\", label: \"View Vault\" },\n { name: \"manage_vault\", label: \"Manage Vault\" },\n { name: \"manage_docit\", label: \"Manage Docs\" },\n { name: \"manage_shortlinks\", label: \"Manage Shortlinks\" },\n ]\n },\n];\n\n// ── Category → Granular mapping ───────────────────────────────────\n// Maps each category permission to the granular permissions it covers.\n// If a user has a category perm, all its granular perms are implicitly granted.\nUser.CATEGORY_GRANULAR_MAP = {\n security: [\"view_security\", \"manage_security\"],\n users: [\"view_users\", \"manage_users\", \"view_members\"],\n groups: [\"view_groups\", \"manage_groups\", \"manage_group\"],\n comms: [\"manage_chat\", \"manage_aws\", \"view_notifications\", \"manage_notifications\", \"send_notifications\",\n \"view_devices\", \"manage_devices\", \"manage_push_config\",\n \"view_phone_numbers\", \"manage_phone_numbers\", \"manage_phone_config\",\n \"view_sms\", \"manage_sms\", \"send_sms\"],\n jobs: [\"view_jobs\", \"manage_jobs\"],\n metrics: [\"view_metrics\", \"manage_metrics\", \"write_metrics\"],\n files: [\"view_fileman\", \"manage_files\", \"view_vault\", \"manage_vault\"]\n};\n\n// Reverse lookup: granular perm name → category name\nUser.GRANULAR_TO_CATEGORY = {};\nfor (const [category, perms] of Object.entries(User.CATEGORY_GRANULAR_MAP)) {\n for (const perm of perms) {\n User.GRANULAR_TO_CATEGORY[perm] = category;\n }\n}\n\n// ── App-level extension points (empty by default) ─────────────────\nUser.APP_CATEGORY_PERMISSIONS = [];\nUser.APP_GRANULAR_PERMISSIONS = [];\n\n// ── Backwards-compatible flat list ────────────────────────────────\nUser.PERMISSIONS = [\n ...User.CATEGORY_PERMISSIONS,\n ...User.GRANULAR_PERMISSION_TABS.flatMap(tab => tab.permissions),\n ...User.APP_CATEGORY_PERMISSIONS,\n ...User.APP_GRANULAR_PERMISSIONS,\n];\n\nUser.PERMISSION_FIELDS = [\n ...User.PERMISSIONS.map(permission => ({\n name: `permissions.${permission.name}`,\n type: 'switch',\n label: permission.label,\n columns: 6\n }))\n];\n\n// ── Field builders for UI ─────────────────────────────────────────\nconst _permSwitch = (p) => ({ name: `permissions.${p.name}`, type: 'switch', label: p.label, columns: 6, ...(p.tooltip ? { tooltip: p.tooltip } : {}) });\n\n// \"Permissions\" sidenav section — tabset with System (+ App when non-empty)\nUser.CATEGORY_PERMISSION_FIELDS = (() => {\n const tabs = [\n { label: 'System', fields: User.CATEGORY_PERMISSIONS.map(_permSwitch) },\n ];\n if (User.APP_CATEGORY_PERMISSIONS.length > 0) {\n tabs.push({ label: 'App', fields: User.APP_CATEGORY_PERMISSIONS.map(_permSwitch) });\n }\n return [{ type: 'tabset', tabs }];\n})();\n\n// \"Adv Permissions\" sidenav section — tabset with Account, Communication, Platform (+ App when non-empty)\nUser.GRANULAR_PERMISSION_FIELDS = (() => {\n const tabs = User.GRANULAR_PERMISSION_TABS.map(tab => ({\n label: tab.label,\n fields: tab.permissions.map(_permSwitch)\n }));\n if (User.APP_GRANULAR_PERMISSIONS.length > 0) {\n tabs.push({ label: 'App', fields: User.APP_GRANULAR_PERMISSIONS.map(_permSwitch) });\n }\n return [{ type: 'tabset', tabs }];\n})();\n\nconst UserForms = {\n create: {\n title: 'Create User',\n fields: [\n { name: 'email', type: 'text', label: 'Email', required: true },\n { name: 'phone_number', type: 'text', label: 'Phone number', columns: 12 },\n { name: 'display_name', type: 'text', label: 'Display Name' }\n ]\n },\n edit: {\n title: 'Edit User',\n fields: [\n { name: 'email', type: 'email', label: 'Email', columns: 12 },\n { name: 'display_name', type: 'text', label: 'Display Name', columns: 12},\n { name: 'phone_number', type: 'text', label: 'Phone number', columns: 12 },\n { type: 'collection', name: 'org', label: 'Organization', Collection: GroupList, labelField: 'name', valueField: 'id', columns: 12 },\n ]\n },\n permissions: {\n title: 'Edit Permissions',\n fields: User.PERMISSION_FIELDS\n }\n};\n\n\n// DataView configuration for User model\nconst UserDataView = {\n // Basic user profile view\n profile: {\n title: 'User Profile',\n columns: 2,\n fields: [\n {\n name: 'id',\n label: 'User ID',\n type: 'number',\n columns: 4\n },\n {\n name: 'last_login',\n label: 'Last Login',\n type: 'datetime',\n format: 'relative',\n columns: 4\n },\n {\n name: 'last_activity',\n label: 'Last Activity',\n type: 'datetime',\n format: 'relative',\n columns: 4\n },\n {\n name: 'username',\n label: 'Username',\n type: 'text',\n format: 'lowercase',\n columns: 4\n },\n {\n name: 'display_name',\n label: 'Display Name',\n type: 'text',\n columns: 4\n },\n\n {\n name: 'email',\n label: 'Email',\n type: 'email',\n columns: 12\n },\n\n {\n name: 'org.name',\n label: 'Organization',\n type: 'text',\n columns: 6\n },\n {\n name: 'phone_number',\n label: 'Phone Number',\n type: 'text',\n columns: 6\n }\n ]\n },\n\n // Activity tracking view\n activity: {\n title: 'User Activity',\n columns: 2,\n fields: [\n {\n name: 'last_login',\n label: 'Last Login',\n type: 'datetime',\n format: 'relative',\n colSize: 6\n },\n {\n name: 'last_activity',\n label: 'Last Activity',\n type: 'datetime',\n format: 'relative',\n colSize: 6\n }\n ]\n },\n\n // Comprehensive view with all data\n detailed: {\n title: 'Detailed User Information',\n columns: 2,\n showEmptyValues: true,\n emptyValueText: 'Not set',\n fields: [\n // Basic Info Section\n {\n name: 'id',\n label: 'User ID',\n type: 'number',\n colSize: 3\n },\n {\n name: 'display_name',\n label: 'Display Name',\n type: 'text',\n format: 'capitalize|default(\"Unnamed User\")',\n colSize: 9\n },\n {\n name: 'username',\n label: 'Username',\n type: 'text',\n format: 'lowercase',\n colSize: 6\n },\n {\n name: 'email',\n label: 'Email Address',\n type: 'email',\n colSize: 6\n },\n {\n name: 'phone_number',\n label: 'Phone Number',\n type: 'phone',\n format: 'phone|default(\"Not provided\")',\n colSize: 6\n },\n {\n name: 'is_active',\n label: 'Account Status',\n type: 'boolean',\n colSize: 6\n },\n\n // Activity Info\n {\n name: 'last_login',\n label: 'Last Login',\n type: 'datetime',\n format: 'relative',\n colSize: 6\n },\n {\n name: 'last_activity',\n label: 'Last Activity',\n type: 'datetime',\n format: 'relative',\n colSize: 6\n },\n\n // Avatar Info\n {\n name: 'avatar.url',\n label: 'Avatar',\n type: 'url',\n colSize: 12\n },\n\n // Complex Data (will use full width automatically)\n {\n name: 'permissions',\n label: 'User Permissions',\n type: 'dataview',\n dataViewColumns: 2,\n showEmptyValues: false\n },\n {\n name: 'metadata',\n label: 'User Metadata',\n type: 'dataview',\n dataViewColumns: 1\n },\n {\n name: 'avatar',\n label: 'Avatar Details',\n type: 'dataview',\n dataViewColumns: 1\n }\n ]\n },\n\n // Permissions-focused view\n permissions: {\n title: 'User Permissions',\n columns: 1,\n fields: [\n {\n name: 'display_name',\n label: 'User',\n type: 'text',\n format: 'capitalize',\n columns: 12\n },\n {\n name: 'permissions',\n label: 'Assigned Permissions',\n type: 'dataview',\n dataViewColumns: 3,\n showEmptyValues: false,\n colSize: 12\n }\n ]\n },\n\n // Compact summary view\n summary: {\n title: 'User Summary',\n columns: 3,\n fields: [\n {\n name: 'display_name',\n label: 'Name',\n type: 'text',\n format: 'capitalize|truncate(30)'\n },\n {\n name: 'email',\n label: 'Email',\n type: 'email'\n },\n {\n name: 'is_active',\n label: 'Status',\n type: 'boolean'\n },\n {\n name: 'last_activity',\n label: 'Last Seen',\n type: 'datetime',\n format: 'relative',\n colSize: 12\n }\n ]\n }\n};\n\nUser.DATA_VIEW = UserDataView.detailed;\nUser.EDIT_FORM = UserForms.edit;\nUser.ADD_FORM = UserForms.create;\n\n/* =========================\n * UserDevice\n * ========================= */\nclass UserDevice extends Model {\n constructor(data = {}) {\n super(data, {\n endpoint: '/api/user/device',\n });\n }\n\n static async getByDuid(duid) {\n const model = new UserDevice();\n const resp = await model.rest.GET('/api/user/device/lookup', { duid: duid });\n if (resp.success && resp.data && resp.data.data) {\n // A direct lookup should return a single object\n return new UserDevice(resp.data.data);\n }\n return null;\n }\n}\n\nclass UserDeviceList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: UserDevice,\n endpoint: '/api/user/device',\n ...options,\n });\n }\n}\n\n/* =========================\n * UserDeviceLocation\n * ========================= */\nclass UserDeviceLocation extends Model {\n constructor(data = {}) {\n super(data, {\n endpoint: '/api/user/device/location',\n });\n }\n}\n\nclass UserDeviceLocationList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: UserDeviceLocation,\n endpoint: '/api/user/device/location',\n ...options,\n });\n }\n}\n\nexport { User, UserList, UserForms, UserDataView, UserDevice, UserDeviceList, UserDeviceLocation, UserDeviceLocationList };\n"],"names":["Group","Model","constructor","data","super","endpoint","GroupList","Collection","options","ModelClass","size","GroupKinds","org","division","department","team","merchant","partner","client","iso","sales","reseller","location","region","route","project","inventory","test","misc","qa","GroupKindOptions","Object","entries","map","key","label","value","GroupForms","create","title","fields","name","type","required","placeholder","labelField","valueField","maxItems","emptyFetch","debounceMs","edit","cols","detailed","text","level","class","columns","xs","md","imageSize","width","height","help","EDIT_FORM","ADD_FORM","CREATE_FORM","User","hasPermission","permission","this","get","Array","isArray","some","p","isSysPermission","startsWith","permissionToCheck","substring","_hasPermission","member","permissions","category","GRANULAR_TO_CATEGORY","hasPerm","UserList","CATEGORY_PERMISSIONS","tooltip","GRANULAR_PERMISSION_TABS","CATEGORY_GRANULAR_MAP","security","users","groups","comms","jobs","metrics","files","perms","perm","APP_CATEGORY_PERMISSIONS","APP_GRANULAR_PERMISSIONS","PERMISSIONS","flatMap","tab","PERMISSION_FIELDS","_permSwitch","CATEGORY_PERMISSION_FIELDS","tabs","length","push","GRANULAR_PERMISSION_FIELDS","UserForms","UserDataView","profile","format","activity","colSize","showEmptyValues","emptyValueText","dataViewColumns","summary","DATA_VIEW","UserDevice","getByDuid","duid","model","resp","rest","GET","success","UserDeviceList","UserDeviceLocation","UserDeviceLocationList"],"mappings":"oDAcA,MAAMA,cAAcC,EAChB,WAAAC,CAAYC,EAAO,IACfC,MAAMD,EAAM,CACRE,SAAU,cAElB,EAMJ,MAAMC,kBAAkBC,EACpB,WAAAL,CAAYM,EAAU,IAClBJ,MAAM,CACFK,WAAYT,MACZK,SAAU,aACVK,KAAM,MACHF,GAEX,EAGJ,MAAMG,EAAa,CACfC,IAAO,eACPC,SAAY,WACZC,WAAc,aACdC,KAAQ,OACRC,SAAY,WACZC,QAAW,UACXC,OAAU,SACVC,IAAO,MACPC,MAAS,QACTC,SAAY,WACZC,SAAY,WACZC,OAAU,SACVC,MAAS,QACTC,QAAW,UACXC,UAAa,YACbC,KAAQ,UACRC,KAAQ,gBACRC,GAAM,qBAIJC,EAAmBC,OAAOC,QAAQrB,GAAYsB,IAAI,EAAEC,EAAKC,MAAK,CAChEC,MAAOF,EACPC,WAMEE,EAAa,CACfC,OAAQ,CACJC,MAAO,eACPC,OAAQ,CACJ,CACIC,KAAM,OACNC,KAAM,OACNP,MAAO,aACPQ,UAAU,EACVC,YAAa,oBAEjB,CACIH,KAAM,OACNC,KAAM,SACNP,MAAO,aACPQ,UAAU,EACVnC,QAASsB,GAEb,CACIY,KAAM,aACND,KAAM,SACNN,MAAO,eACP5B,WAAYD,UACZuC,WAAY,OACZC,WAAY,KACZC,SAAU,GACVH,YAAa,mBACbI,YAAY,EACZC,WAAY,OAKxBC,KAAM,CACFX,MAAO,aACPC,OAAQ,CACJ,CACIC,KAAM,OACNC,KAAM,OACNP,MAAO,aACPQ,UAAU,EACVC,YAAa,oBAEjB,CACIH,KAAM,OACNC,KAAM,SACNP,MAAO,aACPQ,UAAU,EACVnC,QAASsB,GAEb,CACIY,KAAM,aACND,KAAM,SACNN,MAAO,eACP5B,WAAYD,UACZuC,WAAY,OACZC,WAAY,KACZC,SAAU,GACVH,YAAa,mBACbI,YAAY,EACZC,WAAY,KAEhB,CACIR,KAAM,kBACNC,KAAM,OACNP,MAAO,iBACPS,YAAa,gBAEjB,CACIH,KAAM,kBACNC,KAAM,OACNP,MAAO,iBACPS,YAAa,oBAEjB,CACIH,KAAM,YACNC,KAAM,SACNP,MAAO,YACPgB,KAAM,KAKlBC,SAAU,CACNb,MAAO,gBACPC,OAAQ,CAEJ,CACIE,KAAM,SACNW,KAAM,sBACNC,MAAO,EACPC,MAAO,qBAIX,CACIb,KAAM,QACNc,QAAS,CAAEC,GAAI,GAAIC,GAAI,GACvBlB,OAAQ,CACJ,CACIE,KAAM,QACND,KAAM,SACN/B,KAAM,KACNiD,UAAW,CAAEC,MAAO,IAAKC,OAAQ,KACjCjB,YAAa,qBACbkB,KAAM,0BACNN,QAAS,IAEb,CACIf,KAAM,YACNC,KAAM,SACNP,MAAO,YACPqB,QAAS,MAMrB,CACId,KAAM,QACNc,QAAS,CAAEC,GAAI,GAAIC,GAAI,GACvBnB,MAAO,UACPC,OAAQ,CACJ,CACIC,KAAM,OACNC,KAAM,OACNP,MAAO,aACPQ,UAAU,EACVC,YAAa,mBACbY,QAAS,IAEb,CACIf,KAAM,OACNC,KAAM,SACNP,MAAO,aACPQ,UAAU,EACVa,QAAS,GACThD,QAAS,CACL,CAAE4B,MAAO,MAAOD,MAAO,gBACvB,CAAEC,MAAO,OAAQD,MAAO,QACxB,CAAEC,MAAO,aAAcD,MAAO,cAC9B,CAAEC,MAAO,WAAYD,MAAO,YAC5B,CAAEC,MAAO,MAAOD,MAAO,OACvB,CAAEC,MAAO,QAASD,MAAO,WAGjC,CACIO,KAAM,aACND,KAAM,SACNN,MAAO,eACP5B,WAAYD,UACZuC,WAAY,OACZC,WAAY,KACZC,SAAU,GACVH,YAAa,mBACbI,YAAY,EACZC,WAAY,IACZO,QAAS,MAMrB,CACId,KAAM,QACNc,QAAS,GACTjB,MAAO,mBACPgB,MAAO,OACPf,OAAQ,CACJ,CACIE,KAAM,SACND,KAAM,oBACNN,MAAO,WACPqB,QAAS,EACTpB,MAAO,sBACP5B,QAAS,CACL,CAAE4B,MAAO,mBAAoBiB,KAAM,gBACnC,CAAEjB,MAAO,kBAAmBiB,KAAM,gBAClC,CAAEjB,MAAO,iBAAkBiB,KAAM,iBACjC,CAAEjB,MAAO,sBAAuBiB,KAAM,gBACtC,CAAEjB,MAAO,MAAOiB,KAAM,SAG9B,CACIX,KAAM,SACND,KAAM,oBACNN,MAAO,kBACPqB,QAAS,EACThD,QAAS,CACL,CAAE4B,MAAO,EAAGiB,KAAM,YAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,EAAGiB,KAAM,QAClB,CAAEjB,MAAO,GAAIiB,KAAM,SACnB,CAAEjB,MAAO,GAAIiB,KAAM,SACnB,CAAEjB,MAAO,GAAIiB,KAAM,SACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,QACnB,CAAEjB,MAAO,GAAIiB,KAAM,SACnB,CAAEjB,MAAO,GAAIiB,KAAM,aAKnC,CACIX,KAAM,OACNP,MAAO,0BACPM,KAAM,0BACNe,QAAS,OAMzBxD,MAAM+D,UAAY1B,EAAWa,KAC7BlD,MAAMgE,SAAW3B,EAAWC,OAC5BtC,MAAMiE,YAAc5B,EAAWC,OAC/BtC,MAAM8B,iBAAmBA,EACzB9B,MAAMW,WAAaA,gLCpSnB,MAAMuD,aAAajE,EACf,WAAAC,CAAYC,EAAO,IACfC,MAAMD,EAAM,CACRE,SAAU,aAElB,CAEA,aAAA8D,CAAcC,GACV,GAAIC,KAAKC,IAAI,gBAAiB,OAAO,EACrC,GAAIC,MAAMC,QAAQJ,GACd,OAAOA,EAAWK,KAAKC,GAAKL,KAAKF,cAAcO,IAInD,MAAMC,EAAkBP,EAAWQ,WAAW,QACxCC,EAAoBF,EAAkBP,EAAWU,UAAU,GAAKV,EAEtE,QAAIC,KAAKU,eAAeF,MAKnBF,IAAmBN,KAAKW,SAAUX,KAAKW,OAAOb,cAAcC,GAKrE,CAEA,cAAAW,CAAeX,GACX,MAAMa,EAAcZ,KAAKC,IAAI,eAC7B,IAAKW,EACD,OAAO,EAEX,GAA+B,GAA3BA,EAAYb,GACZ,OAAO,EAGX,MAAMc,EAAWhB,KAAKiB,qBAAqBf,GAC3C,SAAIc,GAAqC,GAAzBD,EAAYC,GAIhC,CAEA,OAAAE,CAAQV,GACJ,OAAOL,KAAKF,cAAcO,EAC9B,EAGJ,MAAMW,iBAAiB9E,EACnB,WAAAL,CAAYM,EAAU,IAClBJ,MAAM,CACFK,WAAYyD,KACZ7D,SAAU,eACPG,GAEX,EAIJ0D,KAAKoB,qBAAuB,CACxB,CAAE7C,KAAM,aAAcN,MAAO,cAAeoD,QAAS,uDACrD,CAAE9C,KAAM,WAAYN,MAAO,WAAYoD,QAAS,4EAChD,CAAE9C,KAAM,QAASN,MAAO,QAASoD,QAAS,qEAC1C,CAAE9C,KAAM,SAAUN,MAAO,SAAUoD,QAAS,6CAC5C,CAAE9C,KAAM,QAASN,MAAO,iBAAkBoD,QAAS,8DACnD,CAAE9C,KAAM,OAAQN,MAAO,OAAQoD,QAAS,oEACxC,CAAE9C,KAAM,UAAWN,MAAO,UAAWoD,QAAS,gEAC9C,CAAE9C,KAAM,QAASN,MAAO,QAASoD,QAAS,yEAC1C,CAAE9C,KAAM,YAAaN,MAAO,eAAgBoD,QAAS,8BACrD,CAAE9C,KAAM,QAASN,MAAO,gBAAiBoD,QAAS,4BAItDrB,KAAKsB,yBAA2B,CAC5B,CACIrD,MAAO,UACP8C,YAAa,CACT,CAAExC,KAAM,aAAcN,MAAO,cAC7B,CAAEM,KAAM,eAAgBN,MAAO,gBAC/B,CAAEM,KAAM,cAAeN,MAAO,eAC9B,CAAEM,KAAM,gBAAiBN,MAAO,iBAChC,CAAEM,KAAM,eAAgBN,MAAO,oBAC/B,CAAEM,KAAM,eAAgBN,MAAO,gBAC/B,CAAEM,KAAM,kBAAmBN,MAAO,qBAG1C,CACIA,MAAO,gBACP8C,YAAa,CACT,CAAExC,KAAM,cAAeN,MAAO,eAC9B,CAAEM,KAAM,aAAcN,MAAO,sBAC7B,CAAEM,KAAM,qBAAsBN,MAAO,sBACrC,CAAEM,KAAM,uBAAwBN,MAAO,wBACvC,CAAEM,KAAM,qBAAsBN,MAAO,sBACrC,CAAEM,KAAM,eAAgBN,MAAO,qBAC/B,CAAEM,KAAM,iBAAkBN,MAAO,uBACjC,CAAEM,KAAM,qBAAsBN,MAAO,eACrC,CAAEM,KAAM,qBAAsBN,MAAO,sBACrC,CAAEM,KAAM,uBAAwBN,MAAO,wBACvC,CAAEM,KAAM,sBAAuBN,MAAO,gBACtC,CAAEM,KAAM,WAAYN,MAAO,YAC3B,CAAEM,KAAM,aAAcN,MAAO,cAC7B,CAAEM,KAAM,WAAYN,MAAO,cAGnC,CACIA,MAAO,WACP8C,YAAa,CACT,CAAExC,KAAM,gBAAiBN,MAAO,iBAChC,CAAEM,KAAM,kBAAmBN,MAAO,mBAClC,CAAEM,KAAM,QAASN,MAAO,aACxB,CAAEM,KAAM,YAAaN,MAAO,aAC5B,CAAEM,KAAM,cAAeN,MAAO,eAC9B,CAAEM,KAAM,YAAaN,MAAO,aAC5B,CAAEM,KAAM,cAAeN,MAAO,eAC9B,CAAEM,KAAM,eAAgBN,MAAO,gBAC/B,CAAEM,KAAM,iBAAkBN,MAAO,kBACjC,CAAEM,KAAM,gBAAiBN,MAAO,iBAChC,CAAEM,KAAM,eAAgBN,MAAO,sBAC/B,CAAEM,KAAM,eAAgBN,MAAO,gBAC/B,CAAEM,KAAM,aAAcN,MAAO,cAC7B,CAAEM,KAAM,eAAgBN,MAAO,gBAC/B,CAAEM,KAAM,eAAgBN,MAAO,eAC/B,CAAEM,KAAM,oBAAqBN,MAAO,wBAQhD+B,KAAKuB,sBAAwB,CACzBC,SAAU,CAAC,gBAAiB,mBAC5BC,MAAO,CAAC,aAAc,eAAgB,gBACtCC,OAAQ,CAAC,cAAe,gBAAiB,gBACzCC,MAAO,CAAC,cAAe,aAAc,qBAAsB,uBAAwB,qBAC3E,eAAgB,iBAAkB,qBAClC,qBAAsB,uBAAwB,sBAC9C,WAAY,aAAc,YAClCC,KAAM,CAAC,YAAa,eACpBC,QAAS,CAAC,eAAgB,iBAAkB,iBAC5CC,MAAO,CAAC,eAAgB,eAAgB,aAAc,iBAI1D9B,KAAKiB,qBAAuB,CAAA,EAC5B,IAAA,MAAYD,EAAUe,KAAUlE,OAAOC,QAAQkC,KAAKuB,uBAChD,IAAA,MAAWS,KAAQD,EACf/B,KAAKiB,qBAAqBe,GAAQhB,EAK1ChB,KAAKiC,yBAA2B,GAChCjC,KAAKkC,yBAA2B,GAGhClC,KAAKmC,YAAc,IACZnC,KAAKoB,wBACLpB,KAAKsB,yBAAyBc,QAAQC,GAAOA,EAAItB,gBACjDf,KAAKiC,4BACLjC,KAAKkC,0BAGZlC,KAAKsC,kBAAoB,IAClBtC,KAAKmC,YAAYpE,IAAImC,IAAA,CACpB3B,KAAM,eAAe2B,EAAW3B,OAChCC,KAAM,SACNP,MAAOiC,EAAWjC,MAClBqB,QAAS,MAKjB,MAAMiD,EAAe/B,IAAA,CAASjC,KAAM,eAAeiC,EAAEjC,OAAQC,KAAM,SAAUP,MAAOuC,EAAEvC,MAAOqB,QAAS,KAAOkB,EAAEa,QAAU,CAAEA,QAASb,EAAEa,SAAY,CAAA,IAGlJrB,KAAKwC,iCACD,MAAMC,EAAO,CACT,CAAExE,MAAO,SAAUK,OAAQ0B,KAAKoB,qBAAqBrD,IAAIwE,KAK7D,OAHIvC,KAAKiC,yBAAyBS,OAAS,GACvCD,EAAKE,KAAK,CAAE1E,MAAO,MAAOK,OAAQ0B,KAAKiC,yBAAyBlE,IAAIwE,KAEjE,CAAC,CAAE/D,KAAM,SAAUiE,QAC9B,KAGAzC,KAAK4C,iCACD,MAAMH,EAAOzC,KAAKsB,yBAAyBvD,IAAIsE,IAAA,CAC3CpE,MAAOoE,EAAIpE,MACXK,OAAQ+D,EAAItB,YAAYhD,IAAIwE,MAKhC,OAHIvC,KAAKkC,yBAAyBQ,OAAS,GACvCD,EAAKE,KAAK,CAAE1E,MAAO,MAAOK,OAAQ0B,KAAKkC,yBAAyBnE,IAAIwE,KAEjE,CAAC,CAAE/D,KAAM,SAAUiE,QAC9B,KAEK,MAACI,EAAY,CACdzE,OAAQ,CACJC,MAAO,cACPC,OAAQ,CACJ,CAAEC,KAAM,QAASC,KAAM,OAAQP,MAAO,QAASQ,UAAU,GACzD,CAAEF,KAAM,eAAgBC,KAAM,OAAQP,MAAO,eAAgBqB,QAAS,IACtE,CAAEf,KAAM,eAAgBC,KAAM,OAAQP,MAAO,kBAGrDe,KAAM,CACFX,MAAO,YACPC,OAAQ,CACJ,CAAEC,KAAM,QAASC,KAAM,QAASP,MAAO,QAASqB,QAAS,IACzD,CAAEf,KAAM,eAAgBC,KAAM,OAAQP,MAAO,eAAgBqB,QAAS,IACtE,CAAEf,KAAM,eAAgBC,KAAM,OAAQP,MAAO,eAAgBqB,QAAS,IACtE,CAAEd,KAAM,aAAcD,KAAM,MAAON,MAAO,eAAgB5B,WAAYD,UAAWuC,WAAY,OAAQC,WAAY,KAAMU,QAAS,MAGxIyB,YAAa,CACT1C,MAAO,mBACPC,OAAQ0B,KAAKsC,oBAMfQ,EAAe,CAEjBC,QAAS,CACL1E,MAAO,eACPiB,QAAS,EACThB,OAAQ,CACJ,CACIC,KAAM,KACNN,MAAO,UACPO,KAAM,SACNc,QAAS,GAEb,CACIf,KAAM,aACNN,MAAO,aACPO,KAAM,WACNwE,OAAQ,WACR1D,QAAS,GAEb,CACIf,KAAM,gBACNN,MAAO,gBACPO,KAAM,WACNwE,OAAQ,WACR1D,QAAS,GAEb,CACIf,KAAM,WACNN,MAAO,WACPO,KAAM,OACNwE,OAAQ,YACR1D,QAAS,GAEb,CACIf,KAAM,eACNN,MAAO,eACPO,KAAM,OACNc,QAAS,GAGb,CACIf,KAAM,QACNN,MAAO,QACPO,KAAM,QACNc,QAAS,IAGb,CACIf,KAAM,WACNN,MAAO,eACPO,KAAM,OACNc,QAAS,GAEb,CACIf,KAAM,eACNN,MAAO,eACPO,KAAM,OACNc,QAAS,KAMrB2D,SAAU,CACN5E,MAAO,gBACPiB,QAAS,EACThB,OAAQ,CACJ,CACIC,KAAM,aACNN,MAAO,aACPO,KAAM,WACNwE,OAAQ,WACRE,QAAS,GAEb,CACI3E,KAAM,gBACNN,MAAO,gBACPO,KAAM,WACNwE,OAAQ,WACRE,QAAS,KAMrBhE,SAAU,CACNb,MAAO,4BACPiB,QAAS,EACT6D,iBAAiB,EACjBC,eAAgB,UAChB9E,OAAQ,CAEJ,CACIC,KAAM,KACNN,MAAO,UACPO,KAAM,SACN0E,QAAS,GAEb,CACI3E,KAAM,eACNN,MAAO,eACPO,KAAM,OACNwE,OAAQ,qCACRE,QAAS,GAEb,CACI3E,KAAM,WACNN,MAAO,WACPO,KAAM,OACNwE,OAAQ,YACRE,QAAS,GAEb,CACI3E,KAAM,QACNN,MAAO,gBACPO,KAAM,QACN0E,QAAS,GAEb,CACI3E,KAAM,eACNN,MAAO,eACPO,KAAM,QACNwE,OAAQ,gCACRE,QAAS,GAEb,CACI3E,KAAM,YACNN,MAAO,iBACPO,KAAM,UACN0E,QAAS,GAIb,CACI3E,KAAM,aACNN,MAAO,aACPO,KAAM,WACNwE,OAAQ,WACRE,QAAS,GAEb,CACI3E,KAAM,gBACNN,MAAO,gBACPO,KAAM,WACNwE,OAAQ,WACRE,QAAS,GAIb,CACI3E,KAAM,aACNN,MAAO,SACPO,KAAM,MACN0E,QAAS,IAIb,CACI3E,KAAM,cACNN,MAAO,mBACPO,KAAM,WACN6E,gBAAiB,EACjBF,iBAAiB,GAErB,CACI5E,KAAM,WACNN,MAAO,gBACPO,KAAM,WACN6E,gBAAiB,GAErB,CACI9E,KAAM,SACNN,MAAO,iBACPO,KAAM,WACN6E,gBAAiB,KAM7BtC,YAAa,CACT1C,MAAO,mBACPiB,QAAS,EACThB,OAAQ,CACJ,CACIC,KAAM,eACNN,MAAO,OACPO,KAAM,OACNwE,OAAQ,aACR1D,QAAS,IAEb,CACIf,KAAM,cACNN,MAAO,uBACPO,KAAM,WACN6E,gBAAiB,EACjBF,iBAAiB,EACjBD,QAAS,MAMrBI,QAAS,CACLjF,MAAO,eACPiB,QAAS,EACThB,OAAQ,CACJ,CACIC,KAAM,eACNN,MAAO,OACPO,KAAM,OACNwE,OAAQ,2BAEZ,CACIzE,KAAM,QACNN,MAAO,QACPO,KAAM,SAEV,CACID,KAAM,YACNN,MAAO,SACPO,KAAM,WAEV,CACID,KAAM,gBACNN,MAAO,YACPO,KAAM,WACNwE,OAAQ,WACRE,QAAS,OAMzBlD,KAAKuD,UAAYT,EAAa5D,SAC9Bc,KAAKH,UAAYgD,EAAU7D,KAC3BgB,KAAKF,SAAW+C,EAAUzE,OAK1B,MAAMoF,mBAAmBzH,EACrB,WAAAC,CAAYC,EAAO,IACfC,MAAMD,EAAM,CACRE,SAAU,oBAElB,CAEA,sBAAasH,CAAUC,GACnB,MAAMC,EAAQ,IAAIH,WACZI,QAAaD,EAAME,KAAKC,IAAI,0BAA2B,CAAEJ,SAC/D,OAAIE,EAAKG,SAAWH,EAAK3H,MAAQ2H,EAAK3H,KAAKA,KAEhC,IAAIuH,WAAWI,EAAK3H,KAAKA,MAE7B,IACX,EAGJ,MAAM+H,uBAAuB3H,EACzB,WAAAL,CAAYM,EAAU,IAClBJ,MAAM,CACFK,WAAYiH,WACZrH,SAAU,sBACPG,GAEX,EAMJ,MAAM2H,2BAA2BlI,EAC7B,WAAAC,CAAYC,EAAO,IACfC,MAAMD,EAAM,CACRE,SAAU,6BAElB,EAGJ,MAAM+H,+BAA+B7H,EACjC,WAAAL,CAAYM,EAAU,IAClBJ,MAAM,CACFK,WAAY0H,mBACZ9H,SAAU,+BACPG,GAEX"}
|
|
1
|
+
{"version":3,"file":"User-KTBU_5cr.js","sources":["../../src/core/models/Group.js","../../src/core/models/User.js"],"sourcesContent":["\nimport Collection from '@core/Collection.js';\nimport Model from '@core/Model.js';\n\n/**\n * Group Model - Represents an organization, team, or group entity\n *\n * Features:\n * - Hierarchical group support (parent/child relationships)\n * - Member management\n * - Search and filtering capabilities\n * - Role-based permissions within groups\n * - Metadata and settings management\n */\nclass Group extends Model {\n constructor(data = {}) {\n super(data, {\n endpoint: '/api/group'\n });\n }\n}\n\n/**\n * GroupCollection - Enhanced collection for managing groups with advanced search and filtering\n */\nclass GroupList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: Group,\n endpoint: '/api/group',\n size: 10,\n ...options\n });\n }\n}\n\nconst GroupKinds = {\n 'org': 'Organization',\n 'division': 'Division',\n 'department': 'Department',\n 'team': 'Team',\n 'merchant': 'Merchant',\n 'partner': 'Partner',\n 'client': 'Client',\n 'iso': 'ISO',\n 'sales': 'Sales',\n 'reseller': 'Reseller',\n 'location': 'Location',\n 'region': 'Region',\n 'route': 'Route',\n 'project': 'Project',\n \"inventory\": \"Inventory\",\n 'test': 'Testing',\n 'misc': 'Miscellaneous',\n 'qa': 'Quality Assurance'\n};\n\n// Convert GroupKinds to select options\nconst GroupKindOptions = Object.entries(GroupKinds).map(([key, label]) => ({\n value: key,\n label: label\n}));\n\n/**\n * Form configurations for group management\n */\nconst GroupForms = {\n create: {\n title: 'Create Group',\n fields: [\n {\n name: 'name',\n type: 'text',\n label: 'Group Name',\n required: true,\n placeholder: 'Enter group name'\n },\n {\n name: 'kind',\n type: 'select',\n label: 'Group Kind',\n required: true,\n options: GroupKindOptions\n },\n {\n type: 'collection',\n name: 'parent',\n label: 'Parent Group',\n Collection: GroupList, // Collection class\n labelField: 'name', // Field to display in dropdown\n valueField: 'id', // Field to use as value\n maxItems: 10, // Max items to show in dropdown\n placeholder: 'Search groups...',\n emptyFetch: false,\n debounceMs: 300, // Search debounce delay\n }\n ]\n },\n\n edit: {\n title: 'Edit Group',\n fields: [\n {\n name: 'name',\n type: 'text',\n label: 'Group Name',\n required: true,\n placeholder: 'Enter group name',\n },\n {\n name: 'kind',\n type: 'select',\n label: 'Group Kind',\n required: true,\n options: GroupKindOptions\n },\n {\n type: 'collection',\n name: 'parent',\n label: 'Parent Group',\n Collection: GroupList, // Collection class\n labelField: 'name', // Field to display in dropdown\n valueField: 'id', // Field to use as value\n maxItems: 10, // Max items to show in dropdown\n placeholder: 'Search groups...',\n emptyFetch: false,\n debounceMs: 300, // Search debounce delay\n },\n {\n name: 'metadata.domain',\n type: 'text',\n label: 'Default Domain',\n placeholder: 'Enter Domain',\n },\n {\n name: 'metadata.portal',\n type: 'text',\n label: 'Default Portal',\n placeholder: 'Enter Portal URL',\n },\n {\n name: 'is_active',\n type: 'switch',\n label: 'Is Active',\n cols: 4\n },\n ]\n },\n\n detailed: {\n title: 'Group Details',\n fields: [\n // Profile Header\n {\n type: 'header',\n text: 'Profile Information',\n level: 4,\n class: 'text-primary mb-3'\n },\n\n // Avatar and Basic Info\n {\n type: 'group',\n columns: { xs: 12, md: 4 },\n fields: [\n {\n type: 'image',\n name: 'avatar',\n size: 'lg',\n imageSize: { width: 200, height: 200 },\n placeholder: 'Upload your avatar',\n help: 'Square images work best',\n columns: 12\n },\n {\n name: 'is_active',\n type: 'switch',\n label: 'Is Active',\n columns: 12\n },\n ]\n },\n\n // Profile Details\n {\n type: 'group',\n columns: { xs: 12, md: 8 },\n title: 'Details',\n fields: [\n {\n name: 'name',\n type: 'text',\n label: 'Group Name',\n required: true,\n placeholder: 'Enter group name',\n columns: 12\n },\n {\n name: 'kind',\n type: 'select',\n label: 'Group Kind',\n required: true,\n columns: 12,\n options: [\n { value: 'org', label: 'Organization' },\n { value: 'team', label: 'Team' },\n { value: 'department', label: 'Department' },\n { value: 'merchant', label: 'Merchant' },\n { value: 'iso', label: 'ISO' },\n { value: 'group', label: 'Group' }\n ]\n },\n {\n type: 'collection',\n name: 'parent',\n label: 'Parent Group',\n Collection: GroupList, // Collection class\n labelField: 'name', // Field to display in dropdown\n valueField: 'id', // Field to use as value\n maxItems: 10, // Max items to show in dropdown\n placeholder: 'Search groups...',\n emptyFetch: false,\n debounceMs: 300, // Search debounce delay\n columns: 12\n }\n ]\n },\n\n // Account Settings\n {\n type: 'group',\n columns: 12,\n title: 'Account Settings',\n class: \"pt-3\",\n fields: [\n {\n type: 'select',\n name: 'metadata.timezone',\n label: 'Timezone',\n columns: 6,\n value: 'America/Los_Angeles',\n options: [\n { value: 'America/New_York', text: 'Eastern Time' },\n { value: 'America/Chicago', text: 'Central Time' },\n { value: 'America/Denver', text: 'Mountain Time' },\n { value: 'America/Los_Angeles', text: 'Pacific Time' },\n { value: 'UTC', text: 'UTC' }\n ]\n },\n {\n type: 'select',\n name: 'metadata.eod_hour',\n label: 'End of Day Hour',\n columns: 6,\n options: [\n { value: 0, text: 'Midnight' },\n { value: 1, text: '1 AM' },\n { value: 2, text: '2 AM' },\n { value: 3, text: '3 AM' },\n { value: 4, text: '4 AM' },\n { value: 5, text: '5 AM' },\n { value: 6, text: '6 AM' },\n { value: 7, text: '7 AM' },\n { value: 8, text: '8 AM' },\n { value: 9, text: '9 AM' },\n { value: 10, text: '10 AM' },\n { value: 11, text: '11 AM' },\n { value: 12, text: '12 PM' },\n { value: 13, text: '1 PM' },\n { value: 14, text: '2 PM' },\n { value: 15, text: '3 PM' },\n { value: 16, text: '4 PM' },\n { value: 17, text: '5 PM' },\n { value: 18, text: '6 PM' },\n { value: 19, text: '7 PM' },\n { value: 20, text: '8 PM' },\n { value: 21, text: '9 PM' },\n { value: 22, text: '10 PM' },\n { value: 23, text: '11 PM' }\n ]\n }\n ]\n },\n {\n type: \"text\",\n label: \"Email Template (Prefix)\",\n name: \"metadata.email_template\",\n columns: 12\n }\n ]\n },\n};\n\nGroup.EDIT_FORM = GroupForms.edit;\nGroup.ADD_FORM = GroupForms.create;\nGroup.CREATE_FORM = GroupForms.create; // Alias for compatibility\nGroup.GroupKindOptions = GroupKindOptions;\nGroup.GroupKinds = GroupKinds;\nexport { Group, GroupList, GroupForms };\n","import Collection from '@core/Collection.js';\nimport Model from '@core/Model.js';\n\nimport { GroupList } from './Group.js';\n\nclass User extends Model {\n constructor(data = {}) {\n super(data, {\n endpoint: '/api/user'\n });\n }\n\n hasPermission(permission) {\n if (this.get(\"is_superuser\")) return true;\n if (Array.isArray(permission)) {\n return permission.some(p => this.hasPermission(p));\n }\n\n // Check if permission has \"sys.\" prefix\n const isSysPermission = permission.startsWith('sys.');\n const permissionToCheck = isSysPermission ? permission.substring(4) : permission;\n\n if (this._hasPermission(permissionToCheck)) {\n return true;\n }\n\n // Only check member permissions if it's not a system permission\n if (!isSysPermission && this.member && this.member.hasPermission(permission)) {\n return true;\n }\n\n return false;\n }\n\n _hasPermission(permission) {\n const permissions = this.get(\"permissions\");\n if (!permissions) {\n return false;\n }\n if (permissions[permission] == true) {\n return true;\n }\n // Check if user has the category permission that covers this granular perm\n const category = User.GRANULAR_TO_CATEGORY[permission];\n if (category && permissions[category] == true) {\n return true;\n }\n return false;\n }\n\n hasPerm(p) {\n return this.hasPermission(p);\n }\n}\n\nclass UserList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: User,\n endpoint: '/api/user',\n ...options\n });\n }\n}\n\n// ── Category Permissions (broad domain-level access) ──────────────\nUser.CATEGORY_PERMISSIONS = [\n { name: \"view_admin\", label: \"Admin Panel\", tooltip: \"Access the admin panel, assistant, and system tools\" },\n { name: \"security\", label: \"Security\", tooltip: \"Incidents, events, rules, tickets, firewall, bouncer, GeoIP, system logs\" },\n { name: \"users\", label: \"Users\", tooltip: \"User records, passkeys, TOTP, API keys, OAuth, devices, locations\" },\n { name: \"groups\", label: \"Groups\", tooltip: \"Groups, members, group API keys, settings\" },\n { name: \"comms\", label: \"Communications\", tooltip: \"Email, phone, SMS, push notifications, chat, notifications\" },\n { name: \"jobs\", label: \"Jobs\", tooltip: \"Jobs, job events, job logs, runners, queue control, system stats\" },\n { name: \"metrics\", label: \"Metrics\", tooltip: \"Metrics recording, fetching, categories, values, permissions\" },\n { name: \"files\", label: \"Files\", tooltip: \"File managers, files, renditions, vault files, vault data, S3 buckets\" },\n { name: \"assistant\", label: \"AI Assistant\", tooltip: \"Access to the AI Assistant\" },\n { name: \"comms\", label: \"Communication\", tooltip: \"Ability to notify users\" },\n];\n\n// ── Granular Permissions (fine-grained view/manage pairs) ─────────\nUser.GRANULAR_PERMISSION_TABS = [\n {\n label: 'Account',\n permissions: [\n { name: \"view_users\", label: \"View Users\" },\n { name: \"manage_users\", label: \"Manage Users\" },\n { name: \"view_groups\", label: \"View Groups\" },\n { name: \"manage_groups\", label: \"Manage Groups\" },\n { name: \"manage_group\", label: \"Manage Own Group\" },\n { name: \"view_members\", label: \"View Members\" },\n { name: \"manage_settings\", label: \"Manage Settings\" },\n ]\n },\n {\n label: 'Communication',\n permissions: [\n { name: \"manage_chat\", label: \"Manage Chat\" },\n { name: \"manage_aws\", label: \"Manage Email (AWS)\" },\n { name: \"view_notifications\", label: \"View Notifications\" },\n { name: \"manage_notifications\", label: \"Manage Notifications\" },\n { name: \"send_notifications\", label: \"Send Notifications\" },\n { name: \"view_devices\", label: \"View Push Devices\" },\n { name: \"manage_devices\", label: \"Manage Push Devices\" },\n { name: \"manage_push_config\", label: \"Push Config\" },\n { name: \"view_phone_numbers\", label: \"View Phone Numbers\" },\n { name: \"manage_phone_numbers\", label: \"Manage Phone Numbers\" },\n { name: \"manage_phone_config\", label: \"Phone Config\" },\n { name: \"view_sms\", label: \"View SMS\" },\n { name: \"manage_sms\", label: \"Manage SMS\" },\n { name: \"send_sms\", label: \"Send SMS\" },\n ]\n },\n {\n label: 'Platform',\n permissions: [\n { name: \"view_security\", label: \"View Security\" },\n { name: \"manage_security\", label: \"Manage Security\" },\n { name: \"admin\", label: \"Log Admin\" },\n { name: \"view_logs\", label: \"View Logs\" },\n { name: \"manage_logs\", label: \"Manage Logs\" },\n { name: \"view_jobs\", label: \"View Jobs\" },\n { name: \"manage_jobs\", label: \"Manage Jobs\" },\n { name: \"view_metrics\", label: \"View Metrics\" },\n { name: \"manage_metrics\", label: \"Manage Metrics\" },\n { name: \"write_metrics\", label: \"Write Metrics\" },\n { name: \"view_fileman\", label: \"View File Managers\" },\n { name: \"manage_files\", label: \"Manage Files\" },\n { name: \"view_vault\", label: \"View Vault\" },\n { name: \"manage_vault\", label: \"Manage Vault\" },\n { name: \"manage_docit\", label: \"Manage Docs\" },\n { name: \"manage_shortlinks\", label: \"Manage Shortlinks\" },\n ]\n },\n];\n\n// ── Category → Granular mapping ───────────────────────────────────\n// Maps each category permission to the granular permissions it covers.\n// If a user has a category perm, all its granular perms are implicitly granted.\nUser.CATEGORY_GRANULAR_MAP = {\n security: [\"view_security\", \"manage_security\"],\n users: [\"view_users\", \"manage_users\", \"view_members\"],\n groups: [\"view_groups\", \"manage_groups\", \"manage_group\"],\n comms: [\"manage_chat\", \"manage_aws\", \"view_notifications\", \"manage_notifications\", \"send_notifications\",\n \"view_devices\", \"manage_devices\", \"manage_push_config\",\n \"view_phone_numbers\", \"manage_phone_numbers\", \"manage_phone_config\",\n \"view_sms\", \"manage_sms\", \"send_sms\"],\n jobs: [\"view_jobs\", \"manage_jobs\"],\n metrics: [\"view_metrics\", \"manage_metrics\", \"write_metrics\"],\n files: [\"view_fileman\", \"manage_files\", \"view_vault\", \"manage_vault\"]\n};\n\n// Reverse lookup: granular perm name → category name\nUser.GRANULAR_TO_CATEGORY = {};\nfor (const [category, perms] of Object.entries(User.CATEGORY_GRANULAR_MAP)) {\n for (const perm of perms) {\n User.GRANULAR_TO_CATEGORY[perm] = category;\n }\n}\n\n// ── App-level extension points (empty by default) ─────────────────\nUser.APP_CATEGORY_PERMISSIONS = [];\nUser.APP_GRANULAR_PERMISSIONS = [];\n\n// ── Backwards-compatible flat list ────────────────────────────────\nUser.PERMISSIONS = [\n ...User.CATEGORY_PERMISSIONS,\n ...User.GRANULAR_PERMISSION_TABS.flatMap(tab => tab.permissions),\n ...User.APP_CATEGORY_PERMISSIONS,\n ...User.APP_GRANULAR_PERMISSIONS,\n];\n\nUser.PERMISSION_FIELDS = [\n ...User.PERMISSIONS.map(permission => ({\n name: `permissions.${permission.name}`,\n type: 'switch',\n label: permission.label,\n columns: 6\n }))\n];\n\n// ── Field builders for UI ─────────────────────────────────────────\nconst _permSwitch = (p) => ({ name: `permissions.${p.name}`, type: 'switch', label: p.label, columns: 6, ...(p.tooltip ? { tooltip: p.tooltip } : {}) });\n\n// \"Permissions\" sidenav section — tabset with System (+ App when non-empty)\nUser.CATEGORY_PERMISSION_FIELDS = (() => {\n const tabs = [\n { label: 'System', fields: User.CATEGORY_PERMISSIONS.map(_permSwitch) },\n ];\n if (User.APP_CATEGORY_PERMISSIONS.length > 0) {\n tabs.push({ label: 'App', fields: User.APP_CATEGORY_PERMISSIONS.map(_permSwitch) });\n }\n return [{ type: 'tabset', tabs }];\n})();\n\n// \"Adv Permissions\" sidenav section — tabset with Account, Communication, Platform (+ App when non-empty)\nUser.GRANULAR_PERMISSION_FIELDS = (() => {\n const tabs = User.GRANULAR_PERMISSION_TABS.map(tab => ({\n label: tab.label,\n fields: tab.permissions.map(_permSwitch)\n }));\n if (User.APP_GRANULAR_PERMISSIONS.length > 0) {\n tabs.push({ label: 'App', fields: User.APP_GRANULAR_PERMISSIONS.map(_permSwitch) });\n }\n return [{ type: 'tabset', tabs }];\n})();\n\nconst UserForms = {\n create: {\n title: 'Create User',\n fields: [\n { name: 'email', type: 'text', label: 'Email', required: true },\n { name: 'phone_number', type: 'text', label: 'Phone number', columns: 12 },\n { name: 'display_name', type: 'text', label: 'Display Name' }\n ]\n },\n edit: {\n title: 'Edit User',\n fields: [\n { name: 'email', type: 'email', label: 'Email', columns: 12 },\n { name: 'display_name', type: 'text', label: 'Display Name', columns: 12},\n { name: 'phone_number', type: 'text', label: 'Phone number', columns: 12 },\n { type: 'collection', name: 'org', label: 'Organization', Collection: GroupList, labelField: 'name', valueField: 'id', columns: 12 },\n ]\n },\n permissions: {\n title: 'Edit Permissions',\n fields: User.PERMISSION_FIELDS\n }\n};\n\n\n// DataView configuration for User model\nconst UserDataView = {\n // Basic user profile view\n profile: {\n title: 'User Profile',\n columns: 2,\n fields: [\n {\n name: 'id',\n label: 'User ID',\n type: 'number',\n columns: 4\n },\n {\n name: 'last_login',\n label: 'Last Login',\n type: 'datetime',\n format: 'relative',\n columns: 4\n },\n {\n name: 'last_activity',\n label: 'Last Activity',\n type: 'datetime',\n format: 'relative',\n columns: 4\n },\n {\n name: 'username',\n label: 'Username',\n type: 'text',\n format: 'lowercase',\n columns: 4\n },\n {\n name: 'display_name',\n label: 'Display Name',\n type: 'text',\n columns: 4\n },\n\n {\n name: 'email',\n label: 'Email',\n type: 'email',\n columns: 12\n },\n\n {\n name: 'org.name',\n label: 'Organization',\n type: 'text',\n columns: 6\n },\n {\n name: 'phone_number',\n label: 'Phone Number',\n type: 'text',\n columns: 6\n }\n ]\n },\n\n // Activity tracking view\n activity: {\n title: 'User Activity',\n columns: 2,\n fields: [\n {\n name: 'last_login',\n label: 'Last Login',\n type: 'datetime',\n format: 'relative',\n colSize: 6\n },\n {\n name: 'last_activity',\n label: 'Last Activity',\n type: 'datetime',\n format: 'relative',\n colSize: 6\n }\n ]\n },\n\n // Comprehensive view with all data\n detailed: {\n title: 'Detailed User Information',\n columns: 2,\n showEmptyValues: true,\n emptyValueText: 'Not set',\n fields: [\n // Basic Info Section\n {\n name: 'id',\n label: 'User ID',\n type: 'number',\n colSize: 3\n },\n {\n name: 'display_name',\n label: 'Display Name',\n type: 'text',\n format: 'capitalize|default(\"Unnamed User\")',\n colSize: 9\n },\n {\n name: 'username',\n label: 'Username',\n type: 'text',\n format: 'lowercase',\n colSize: 6\n },\n {\n name: 'email',\n label: 'Email Address',\n type: 'email',\n colSize: 6\n },\n {\n name: 'phone_number',\n label: 'Phone Number',\n type: 'phone',\n format: 'phone|default(\"Not provided\")',\n colSize: 6\n },\n {\n name: 'is_active',\n label: 'Account Status',\n type: 'boolean',\n colSize: 6\n },\n\n // Activity Info\n {\n name: 'last_login',\n label: 'Last Login',\n type: 'datetime',\n format: 'relative',\n colSize: 6\n },\n {\n name: 'last_activity',\n label: 'Last Activity',\n type: 'datetime',\n format: 'relative',\n colSize: 6\n },\n\n // Avatar Info\n {\n name: 'avatar.url',\n label: 'Avatar',\n type: 'url',\n colSize: 12\n },\n\n // Complex Data (will use full width automatically)\n {\n name: 'permissions',\n label: 'User Permissions',\n type: 'dataview',\n dataViewColumns: 2,\n showEmptyValues: false\n },\n {\n name: 'metadata',\n label: 'User Metadata',\n type: 'dataview',\n dataViewColumns: 1\n },\n {\n name: 'avatar',\n label: 'Avatar Details',\n type: 'dataview',\n dataViewColumns: 1\n }\n ]\n },\n\n // Permissions-focused view\n permissions: {\n title: 'User Permissions',\n columns: 1,\n fields: [\n {\n name: 'display_name',\n label: 'User',\n type: 'text',\n format: 'capitalize',\n columns: 12\n },\n {\n name: 'permissions',\n label: 'Assigned Permissions',\n type: 'dataview',\n dataViewColumns: 3,\n showEmptyValues: false,\n colSize: 12\n }\n ]\n },\n\n // Compact summary view\n summary: {\n title: 'User Summary',\n columns: 3,\n fields: [\n {\n name: 'display_name',\n label: 'Name',\n type: 'text',\n format: 'capitalize|truncate(30)'\n },\n {\n name: 'email',\n label: 'Email',\n type: 'email'\n },\n {\n name: 'is_active',\n label: 'Status',\n type: 'boolean'\n },\n {\n name: 'last_activity',\n label: 'Last Seen',\n type: 'datetime',\n format: 'relative',\n colSize: 12\n }\n ]\n }\n};\n\nUser.DATA_VIEW = UserDataView.detailed;\nUser.EDIT_FORM = UserForms.edit;\nUser.ADD_FORM = UserForms.create;\n\n/* =========================\n * UserDevice\n * ========================= */\nclass UserDevice extends Model {\n constructor(data = {}) {\n super(data, {\n endpoint: '/api/user/device',\n });\n }\n\n static async getByDuid(duid) {\n const model = new UserDevice();\n const resp = await model.rest.GET('/api/user/device/lookup', { duid: duid });\n if (resp.success && resp.data && resp.data.data) {\n // A direct lookup should return a single object\n return new UserDevice(resp.data.data);\n }\n return null;\n }\n}\n\nclass UserDeviceList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: UserDevice,\n endpoint: '/api/user/device',\n ...options,\n });\n }\n}\n\n/* =========================\n * UserDeviceLocation\n * ========================= */\nclass UserDeviceLocation extends Model {\n constructor(data = {}) {\n super(data, {\n endpoint: '/api/user/device/location',\n });\n }\n}\n\nclass UserDeviceLocationList extends Collection {\n constructor(options = {}) {\n super({\n ModelClass: UserDeviceLocation,\n endpoint: '/api/user/device/location',\n ...options,\n });\n }\n}\n\nexport { User, UserList, UserForms, UserDataView, UserDevice, UserDeviceList, UserDeviceLocation, UserDeviceLocationList };\n"],"names":["Group","Model","constructor","data","super","endpoint","GroupList","Collection","options","ModelClass","size","GroupKinds","org","division","department","team","merchant","partner","client","iso","sales","reseller","location","region","route","project","inventory","test","misc","qa","GroupKindOptions","Object","entries","map","key","label","value","GroupForms","create","title","fields","name","type","required","placeholder","labelField","valueField","maxItems","emptyFetch","debounceMs","edit","cols","detailed","text","level","class","columns","xs","md","imageSize","width","height","help","EDIT_FORM","ADD_FORM","CREATE_FORM","User","hasPermission","permission","this","get","Array","isArray","some","p","isSysPermission","startsWith","permissionToCheck","substring","_hasPermission","member","permissions","category","GRANULAR_TO_CATEGORY","hasPerm","UserList","CATEGORY_PERMISSIONS","tooltip","GRANULAR_PERMISSION_TABS","CATEGORY_GRANULAR_MAP","security","users","groups","comms","jobs","metrics","files","perms","perm","APP_CATEGORY_PERMISSIONS","APP_GRANULAR_PERMISSIONS","PERMISSIONS","flatMap","tab","PERMISSION_FIELDS","_permSwitch","CATEGORY_PERMISSION_FIELDS","tabs","length","push","GRANULAR_PERMISSION_FIELDS","UserForms","UserDataView","profile","format","activity","colSize","showEmptyValues","emptyValueText","dataViewColumns","summary","DATA_VIEW","UserDevice","getByDuid","duid","model","resp","rest","GET","success","UserDeviceList","UserDeviceLocation","UserDeviceLocationList"],"mappings":"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"}
|