@nocobase/plugin-users 0.19.0-alpha.9 → 0.20.0-alpha.2

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.
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const PasswordField: React.FC;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const RoleUsersManager: React.FC;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const UserRolesField: React.FC;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const UsersManagement: React.FC;
@@ -0,0 +1,5 @@
1
+ export declare const useFilterActionProps: () => {
2
+ options: any;
3
+ onSubmit(values: any): void;
4
+ onReset(): void;
5
+ };
@@ -1,5 +1,5 @@
1
1
  import { Plugin } from '@nocobase/client';
2
- export declare class PluginUsersClient extends Plugin {
2
+ declare class PluginUsersClient extends Plugin {
3
3
  load(): Promise<void>;
4
4
  }
5
5
  export default PluginUsersClient;
@@ -1 +1 @@
1
- (function(e,n){typeof exports=="object"&&typeof module!="undefined"?n(exports,require("@nocobase/client")):typeof define=="function"&&define.amd?define(["exports","@nocobase/client"],n):(e=typeof globalThis!="undefined"?globalThis:e||self,n(e["@nocobase/plugin-users"]={},e["@nocobase/client"]))})(this,function(e,n){"use strict";var d=(e,n,i)=>new Promise((u,l)=>{var c=s=>{try{t(i.next(s))}catch(o){l(o)}},f=s=>{try{t(i.throw(s))}catch(o){l(o)}},t=s=>s.done?u(s.value):Promise.resolve(s.value).then(c,f);t((i=i.apply(e,n)).next())});class i extends n.Plugin{load(){return d(this,null,function*(){})}}e.PluginUsersClient=i,e.default=i,Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(r,e){typeof exports=="object"&&typeof module!="undefined"?e(exports,require("@nocobase/client"),require("react/jsx-runtime"),require("react"),require("antd"),require("@formily/react"),require("react-i18next"),require("@nocobase/plugin-acl/client")):typeof define=="function"&&define.amd?define(["exports","@nocobase/client","react/jsx-runtime","react","antd","@formily/react","react-i18next","@nocobase/plugin-acl/client"],e):(r=typeof globalThis!="undefined"?globalThis:r||self,e(r["@nocobase/plugin-users"]={},r["@nocobase/client"],r.jsxRuntime,r.react,r.antd,r["@formily/react"],r["react-i18next"],r["@nocobase/plugin-acl"]))})(this,function(r,e,t,l,m,v,g,x){"use strict";var K=Object.defineProperty,E=Object.defineProperties;var j=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var N=Object.prototype.hasOwnProperty,L=Object.prototype.propertyIsEnumerable;var S=(r,e,t)=>e in r?K(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,f=(r,e)=>{for(var t in e||(e={}))N.call(e,t)&&S(r,t,e[t]);if(w)for(var t of w(e))L.call(e,t)&&S(r,t,e[t]);return r},F=(r,e)=>E(r,j(e));var h=(r,e,t)=>new Promise((l,m)=>{var v=u=>{try{x(t.next(u))}catch(A){m(A)}},g=u=>{try{x(t.throw(u))}catch(A){m(A)}},x=u=>u.done?l(u.value):Promise.resolve(u.value).then(v,g);x((t=t.apply(r,e)).next())});const u={name:"users",fields:[{name:"id",type:"bigInt",autoIncrement:!0,primaryKey:!0,allowNull:!1,uiSchema:{type:"number",title:'{{t("ID")}}',"x-component":"InputNumber","x-read-pretty":!0},interface:"id"},{interface:"input",type:"string",name:"nickname",uiSchema:{type:"string",title:'{{t("Nickname")}}',"x-component":"Input"}},{interface:"input",type:"string",name:"username",unique:!0,uiSchema:{type:"string",title:'{{t("Username")}}',"x-component":"Input","x-validator":{username:!0},required:!0}},{interface:"email",type:"string",name:"email",unique:!0,uiSchema:{type:"string",title:'{{t("Email")}}',"x-component":"Input","x-validator":"email",required:!0}},{interface:"phone",type:"string",name:"phone",unique:!0,uiSchema:{type:"string",title:'{{t("Phone")}}',"x-component":"Input","x-validator":"phone",required:!0}},{interface:"password",type:"password",name:"password",hidden:!0,uiSchema:{type:"string",title:'{{t("Password")}}',"x-component":"Password"}},{interface:"m2m",type:"belongsToMany",name:"roles",target:"roles",foreignKey:"userId",otherKey:"roleName",onDelete:"CASCADE",sourceKey:"id",targetKey:"name",through:"rolesUsers",uiSchema:{type:"array",title:'{{t("Roles")}}',"x-component":"AssociationField","x-component-props":{multiple:!0,fieldNames:{label:"title",value:"name"}}}}]},A={type:"object",properties:{block1:{type:"void","x-decorator":"ResourceActionProvider","x-decorator-props":{collection:u,resourceName:"users",request:{resource:"users",action:"list",params:{pageSize:50,appends:[]}}},properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:16}},properties:{filter:{type:"void",title:'{{ t("Filter") }}',"x-action":"filter","x-component":"Filter.Action","x-component-props":{icon:"FilterOutlined",useProps:"{{ useFilterActionProps }}"},"x-align":"left"},delete:{type:"void",title:'{{ t("Delete") }}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useBulkDestroyAction }}",confirm:{title:"{{t('Delete users')}}",content:"{{t('Are you sure you want to delete it?')}}"},icon:"DeleteOutlined"}},create:{type:"void",title:'{{t("Add new")}}',"x-component":"Action","x-component-props":{type:"primary",icon:"PlusOutlined"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-decorator":"Form",title:'{{t("Add user")}}',properties:{nickname:{"x-component":"CollectionField","x-decorator":"FormItem"},username:{"x-component":"CollectionField","x-decorator":"FormItem"},email:{title:'{{t("Email")}}',"x-component":"Input","x-validator":"email","x-decorator":"FormItem",required:!1},phone:{title:'{{t("Phone")}}',"x-component":"Input","x-validator":"phone","x-decorator":"FormItem",required:!1},password:{"x-component":"CollectionField","x-decorator":"FormItem",required:!0},roles:{"x-component":"CollectionField","x-collection-field":"users.roles","x-decorator":"FormItem"},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}},submit:{title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ cm.useCreateAction }}"}}}}}}}}}},table:{type:"void","x-uid":"input","x-component":"Table.Void","x-component-props":{rowKey:"id",rowSelection:{type:"checkbox"},useDataSource:"{{ cm.useDataSourceFromRAC }}"},properties:{column1:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{nickname:{type:"number","x-component":"CollectionField","x-read-pretty":!0}}},column2:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{username:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},column3:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{email:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},column4:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",title:'{{t("Roles")}}',properties:{roles:{type:"array","x-component":"UserRolesField"}}},column5:{type:"void",title:'{{t("Actions")}}',"x-component":"Table.Column",properties:{actions:{type:"void","x-component":"Space","x-component-props":{split:"|"},properties:{update:{type:"void",title:'{{t("Edit profile")}}',"x-decorator":"ACLActionProvider","x-acl-action":"users:update","x-component":"Action.Link","x-component-props":{type:"primary"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-decorator":"Form","x-decorator-props":{useValues:s=>{const o=e.useRecord(),i=e.useRequest(()=>Promise.resolve({data:o}),F(f({},s),{manual:!0})),n=e.useActionContext();return l.useEffect(()=>{n.visible&&i.run()},[n.visible]),i}},title:'{{t("Edit profile")}}',properties:{nickname:{"x-component":"CollectionField","x-decorator":"FormItem"},username:{"x-component":"CollectionField","x-decorator":"FormItem"},email:{title:'{{t("Email")}}',"x-component":"Input","x-validator":"email","x-decorator":"FormItem",required:!1},phone:{title:'{{t("Phone")}}',"x-component":"Input","x-validator":"phone","x-decorator":"FormItem",required:!1},roles:{"x-component":"CollectionField","x-decorator":"FormItem","x-collection-field":"users.roles"},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}},submit:{title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ cm.useUpdateAction }}"}}}}}}}},changePassword:{type:"void",title:'{{t("Change password")}}',"x-decorator":"ACLActionProvider","x-acl-action":"users:update","x-component":"Action.Link","x-component-props":{type:"primary"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-decorator":"Form",title:'{{t("Change password")}}',properties:{password:{"x-component":"CollectionField","x-component-props":{component:"PasswordField"},"x-decorator":"FormItem",required:!0},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}},submit:{title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ cm.useUpdateAction }}"}}}}}}}},delete:{type:"void",title:'{{ t("Delete") }}',"x-acl-action":"users:destroy","x-action":"destroy","x-decorator":"ACLActionProvider","x-component":"Action.Link","x-component-props":{confirm:{title:"{{t('Delete')}}",content:"{{t('Are you sure you want to delete it?')}}"},useAction:"{{cm.useDestroyAction}}"}}}}}}}}}}}},D={type:"void",properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:16}},properties:{filter:{type:"void",title:'{{ t("Filter") }}',"x-action":"filter","x-component":"Filter.Action","x-component-props":{icon:"FilterOutlined",useProps:"{{ useFilterActionProps }}"},"x-align":"left"},actions:{type:"void","x-component":"Space",properties:{remove:{type:"void",title:'{{t("Remove")}}',"x-component":"Action","x-component-props":{icon:"MinusOutlined",confirm:{title:"{{t('Remove')}}",content:"{{t('Are you sure you want to remove these users?')}}"},style:{marginRight:8},useAction:"{{ useBulkRemoveUsers }}"}},create:{type:"void",title:'{{t("Add users")}}',"x-component":"Action","x-component-props":{type:"primary",icon:"PlusOutlined"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-decorator":"FormV2",title:'{{t("Add users")}}',properties:{resource:{type:"void","x-decorator":"FormItem","x-component":"RoleUsersProvider",properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:16}},properties:{filter:{type:"void",title:'{{ t("Filter") }}',default:{$and:[{username:{$includes:""}},{nickname:{$includes:""}}]},"x-action":"filter","x-component":"Filter.Action","x-component-props":{icon:"FilterOutlined",useProps:"{{ useFilterActionProps }}"},"x-align":"left"}}},table:{type:"void","x-component":"Table.Void","x-component-props":{rowKey:"id",rowSelection:{type:"checkbox",onChange:"{{ handleSelectRoleUsers }}"},useDataSource:"{{ cm.useDataSourceFromRAC }}"},properties:{username:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{username:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},nickname:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{nickname:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},phone:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{phone:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},email:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{email:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}}}}}},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}},submit:{title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ useAddRoleUsers }}"}}}}}}}}}}}},table:{type:"void","x-component":"Table.Void","x-component-props":{rowKey:"id",rowSelection:{type:"checkbox"},useDataSource:"{{ cm.useDataSourceFromRAC }}"},properties:{username:{type:"void",title:'{{t("Username")}}',"x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{username:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},nickname:{type:"void",title:'{{t("Nickname")}}',"x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{nickname:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},actions:{type:"void",title:'{{t("Actions")}}',"x-component":"Table.Column",properties:{actions:{type:"void","x-component":"Space","x-component-props":{split:"|"},properties:{remove:{type:"void",title:'{{ t("Remove") }}',"x-component":"Action.Link","x-component-props":{confirm:{title:"{{t('Remove user')}}",content:"{{t('Are you sure you want to remove it?')}}"},useAction:"{{ useRemoveUser }}"}}}}}}}}}};function C(){return g.useTranslation(["users","client"],{nsMode:"fallback"})}const P=()=>{const{t:s}=C();return(v.useField().value||[]).map(i=>t.jsx(m.Tag,{children:v.Schema.compile(i.title,{t:s})},i.name))},b=()=>{var n,c;const s=l.useContext(e.CollectionContext),o=e.useFilterFieldOptions(s.fields),i=e.useResourceActionContext();return e.useFilterFieldProps({options:o,params:((c=(n=i.state)==null?void 0:n.params)==null?void 0:c[0])||i.params,service:i})},T=(s=10)=>{const o="ABCDEFGHIJKLMNOPQRSTUVWXYZ",i="abcdefghijklmnopqrstuvwxyz",n="0123456789",c="!#$%^&*-_+=",y=o+i+n+c,p=new Uint32Array(s);crypto.getRandomValues(p);let a="";a+=o.charAt(p[0]%o.length),a+=i.charAt(p[1]%i.length),a+=n.charAt(p[2]%n.length),a+=c.charAt(p[3]%c.length);for(let d=4;d<s;d++){const V=p[d]%y.length;a+=y.charAt(V)}return a=a[0]+a.slice(1).split("").sort(()=>Math.random()-.5).join(""),a},I=()=>{const{t:s}=C(),o=v.useField(),[i,n]=l.useState(!1),c=e.useActionContext();return l.useEffect(()=>{c.visible||o.reset()},[o,c.visible]),t.jsxs(m.Row,{gutter:10,children:[t.jsx(m.Col,{span:18,children:t.jsx(e.Password,{checkStrength:!0,visibilityToggle:{visible:i,onVisibleChange:n},value:o.value,onChange:y=>o.setValue(y.target.value)})}),t.jsx(m.Col,{span:4,children:t.jsx(m.Button,{onClick:()=>{o.setValue(T()),n(!0)},children:s("Random password")})})]})},U=()=>{const{t:s}=C(),o=e.useSchemaComponentContext();return t.jsx(e.SchemaComponentContext.Provider,{value:F(f({},o),{designable:!1}),children:t.jsx(m.Card,{children:t.jsx(e.SchemaComponent,{schema:A,scope:{t:s,useFilterActionProps:b},components:{UserRolesField:P,PasswordField:I}})})})},R=()=>{const s=e.useAPIClient(),{role:o}=l.useContext(x.RolesManagerContext),i=e.useRecord(),{refresh:n}=e.useResourceActionContext();return{run(){return h(this,null,function*(){yield s.resource("roles.users",o==null?void 0:o.name).remove({values:[i.id]}),n()})}}},k=()=>{const{t:s}=C(),{message:o}=m.App.useApp(),i=e.useAPIClient(),{state:n,setState:c,refresh:y}=e.useResourceActionContext(),{role:p}=l.useContext(x.RolesManagerContext);return{run(){return h(this,null,function*(){const d=n==null?void 0:n.selectedRowKeys;if(!(d!=null&&d.length)){o.warning(s("Please select users"));return}yield i.resource("roles.users",p==null?void 0:p.name).remove({values:d}),c==null||c({selectedRowKeys:[]}),y()})}}},q=s=>{const{role:o}=l.useContext(x.RolesManagerContext);return t.jsx(e.ResourceActionProvider,{collection:u,request:{resource:"users",action:"listExcludeRole",params:{roleName:o==null?void 0:o.name}},children:s.children})},M=()=>{const{t:s}=C(),{role:o}=l.useContext(x.RolesManagerContext),i=e.useRequest({resource:"roles.users",resourceOf:o==null?void 0:o.name,action:"list"},{ready:!!o,refreshDeps:[o]}),n=l.useRef([]),c=(p,a)=>{n.current=a},y=()=>{const p=e.useAPIClient(),{setVisible:a}=e.useActionContext(),{refresh:d}=e.useResourceActionContext();return{run(){return h(this,null,function*(){yield p.resource("roles.users",o==null?void 0:o.name).add({values:n.current.map(B=>B.id)}),n.current=[],a(!1),d()})}}};return t.jsx(e.ResourceActionContext.Provider,{value:f({},i),children:t.jsx(e.CollectionProvider_deprecated,{collection:u,children:t.jsx(e.SchemaComponent,{schema:D,components:{RoleUsersProvider:q},scope:{useBulkRemoveUsers:k,useRemoveUser:R,handleSelectRoleUsers:c,useAddRoleUsers:y,useFilterActionProps:b,t:s}})})})};class O extends e.Plugin{load(){return h(this,null,function*(){this.app.pluginSettingsManager.add("users-permissions",{title:e.tval("Users & Permissions",{ns:"users"}),icon:"TeamOutlined"}),this.app.pluginSettingsManager.add("users-permissions.users",{title:e.tval("Users"),icon:"UserOutlined",Component:U,aclSnippet:"pm.users"}),this.app.pm.get(x).rolesManager.add("users",{title:e.tval("Users"),Component:M})})}}r.default=O,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
@@ -0,0 +1 @@
1
+ export declare function useUsersTranslation(): import("react-i18next").UseTranslationResponse<("users" | "client")[], undefined>;
@@ -0,0 +1,165 @@
1
+ import { ISchema } from '@formily/react';
2
+ export declare const userCollection: {
3
+ name: string;
4
+ fields: ({
5
+ name: string;
6
+ type: string;
7
+ autoIncrement: boolean;
8
+ primaryKey: boolean;
9
+ allowNull: boolean;
10
+ uiSchema: {
11
+ type: string;
12
+ title: string;
13
+ 'x-component': string;
14
+ 'x-read-pretty': boolean;
15
+ 'x-validator'?: undefined;
16
+ required?: undefined;
17
+ 'x-component-props'?: undefined;
18
+ };
19
+ interface: string;
20
+ unique?: undefined;
21
+ hidden?: undefined;
22
+ target?: undefined;
23
+ foreignKey?: undefined;
24
+ otherKey?: undefined;
25
+ onDelete?: undefined;
26
+ sourceKey?: undefined;
27
+ targetKey?: undefined;
28
+ through?: undefined;
29
+ } | {
30
+ interface: string;
31
+ type: string;
32
+ name: string;
33
+ uiSchema: {
34
+ type: string;
35
+ title: string;
36
+ 'x-component': string;
37
+ 'x-read-pretty'?: undefined;
38
+ 'x-validator'?: undefined;
39
+ required?: undefined;
40
+ 'x-component-props'?: undefined;
41
+ };
42
+ autoIncrement?: undefined;
43
+ primaryKey?: undefined;
44
+ allowNull?: undefined;
45
+ unique?: undefined;
46
+ hidden?: undefined;
47
+ target?: undefined;
48
+ foreignKey?: undefined;
49
+ otherKey?: undefined;
50
+ onDelete?: undefined;
51
+ sourceKey?: undefined;
52
+ targetKey?: undefined;
53
+ through?: undefined;
54
+ } | {
55
+ interface: string;
56
+ type: string;
57
+ name: string;
58
+ unique: boolean;
59
+ uiSchema: {
60
+ type: string;
61
+ title: string;
62
+ 'x-component': string;
63
+ 'x-validator': {
64
+ username: boolean;
65
+ };
66
+ required: boolean;
67
+ 'x-read-pretty'?: undefined;
68
+ 'x-component-props'?: undefined;
69
+ };
70
+ autoIncrement?: undefined;
71
+ primaryKey?: undefined;
72
+ allowNull?: undefined;
73
+ hidden?: undefined;
74
+ target?: undefined;
75
+ foreignKey?: undefined;
76
+ otherKey?: undefined;
77
+ onDelete?: undefined;
78
+ sourceKey?: undefined;
79
+ targetKey?: undefined;
80
+ through?: undefined;
81
+ } | {
82
+ interface: string;
83
+ type: string;
84
+ name: string;
85
+ unique: boolean;
86
+ uiSchema: {
87
+ type: string;
88
+ title: string;
89
+ 'x-component': string;
90
+ 'x-validator': string;
91
+ required: boolean;
92
+ 'x-read-pretty'?: undefined;
93
+ 'x-component-props'?: undefined;
94
+ };
95
+ autoIncrement?: undefined;
96
+ primaryKey?: undefined;
97
+ allowNull?: undefined;
98
+ hidden?: undefined;
99
+ target?: undefined;
100
+ foreignKey?: undefined;
101
+ otherKey?: undefined;
102
+ onDelete?: undefined;
103
+ sourceKey?: undefined;
104
+ targetKey?: undefined;
105
+ through?: undefined;
106
+ } | {
107
+ interface: string;
108
+ type: string;
109
+ name: string;
110
+ hidden: boolean;
111
+ uiSchema: {
112
+ type: string;
113
+ title: string;
114
+ 'x-component': string;
115
+ 'x-read-pretty'?: undefined;
116
+ 'x-validator'?: undefined;
117
+ required?: undefined;
118
+ 'x-component-props'?: undefined;
119
+ };
120
+ autoIncrement?: undefined;
121
+ primaryKey?: undefined;
122
+ allowNull?: undefined;
123
+ unique?: undefined;
124
+ target?: undefined;
125
+ foreignKey?: undefined;
126
+ otherKey?: undefined;
127
+ onDelete?: undefined;
128
+ sourceKey?: undefined;
129
+ targetKey?: undefined;
130
+ through?: undefined;
131
+ } | {
132
+ interface: string;
133
+ type: string;
134
+ name: string;
135
+ target: string;
136
+ foreignKey: string;
137
+ otherKey: string;
138
+ onDelete: string;
139
+ sourceKey: string;
140
+ targetKey: string;
141
+ through: string;
142
+ uiSchema: {
143
+ type: string;
144
+ title: string;
145
+ 'x-component': string;
146
+ 'x-component-props': {
147
+ multiple: boolean;
148
+ fieldNames: {
149
+ label: string;
150
+ value: string;
151
+ };
152
+ };
153
+ 'x-read-pretty'?: undefined;
154
+ 'x-validator'?: undefined;
155
+ required?: undefined;
156
+ };
157
+ autoIncrement?: undefined;
158
+ primaryKey?: undefined;
159
+ allowNull?: undefined;
160
+ unique?: undefined;
161
+ hidden?: undefined;
162
+ })[];
163
+ };
164
+ export declare const usersSchema: ISchema;
165
+ export declare const roleUsersSchema: ISchema;
@@ -0,0 +1 @@
1
+ export declare const generatePassword: (length?: number) => string;
@@ -1,7 +1,14 @@
1
1
  module.exports = {
2
- "@nocobase/client": "0.19.0-alpha.9",
3
- "@nocobase/database": "0.19.0-alpha.9",
4
- "@nocobase/server": "0.19.0-alpha.9",
5
- "@nocobase/utils": "0.19.0-alpha.9",
6
- "@nocobase/actions": "0.19.0-alpha.9"
2
+ "react": "18.2.0",
3
+ "antd": "5.12.8",
4
+ "@nocobase/client": "0.20.0-alpha.2",
5
+ "@formily/react": "2.3.0",
6
+ "@formily/core": "2.3.0",
7
+ "@nocobase/plugin-acl": "0.20.0-alpha.2",
8
+ "react-i18next": "11.18.6",
9
+ "@nocobase/database": "0.20.0-alpha.2",
10
+ "@nocobase/server": "0.20.0-alpha.2",
11
+ "@nocobase/utils": "0.20.0-alpha.2",
12
+ "@nocobase/cache": "0.20.0-alpha.2",
13
+ "@nocobase/actions": "0.20.0-alpha.2"
7
14
  };
@@ -0,0 +1,7 @@
1
+ {
2
+ "Users & Permissions": "Users & Permissions",
3
+ "Add users": "Add users",
4
+ "Remove user": "Remove user",
5
+ "Are you sure you want to remove it?": "Are you sure you want to remove it?",
6
+ "Random password": "Random password"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "Users & Permissions": "用户和权限",
3
+ "Add users": "添加用户",
4
+ "Remove user": "移除用户",
5
+ "Are you sure you want to remove it?": "你确定要移除吗?",
6
+ "Random password": "随机密码"
7
+ }
@@ -1,2 +1,3 @@
1
1
  import { Context, Next } from '@nocobase/actions';
2
2
  export declare function updateProfile(ctx: Context, next: Next): Promise<void>;
3
+ export declare const listExcludeRole: (ctx: Context, next: Next) => Promise<void>;
@@ -17,9 +17,11 @@ var __copyProps = (to, from, except, desc) => {
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
18
  var users_exports = {};
19
19
  __export(users_exports, {
20
+ listExcludeRole: () => listExcludeRole,
20
21
  updateProfile: () => updateProfile
21
22
  });
22
23
  module.exports = __toCommonJS(users_exports);
24
+ var import_actions = require("@nocobase/actions");
23
25
  async function updateProfile(ctx, next) {
24
26
  const { values } = ctx.action.params;
25
27
  const { currentUser } = ctx.state;
@@ -34,7 +36,39 @@ async function updateProfile(ctx, next) {
34
36
  ctx.body = result;
35
37
  await next();
36
38
  }
39
+ const listExcludeRole = async (ctx, next) => {
40
+ const { roleName, page = import_actions.DEFAULT_PAGE, pageSize = import_actions.DEFAULT_PER_PAGE } = ctx.action.params;
41
+ const repo = ctx.db.getRepository("users");
42
+ const users = await repo.find({
43
+ fields: ["id"],
44
+ filter: {
45
+ "roles.name": roleName
46
+ }
47
+ });
48
+ const userIds = users.map((user) => user.id);
49
+ const [rows, count] = await repo.findAndCount({
50
+ context: ctx,
51
+ offset: (page - 1) * pageSize,
52
+ limit: pageSize,
53
+ // Ensure memberIds is not empty to resolve strange issue:
54
+ // notIn: [] will be translated to "WHERE id IS NULL"
55
+ filter: userIds.length ? {
56
+ id: {
57
+ $notIn: userIds
58
+ }
59
+ } : {}
60
+ });
61
+ ctx.body = {
62
+ count,
63
+ rows,
64
+ page: Number(page),
65
+ pageSize: Number(pageSize),
66
+ totalPage: Math.ceil(count / pageSize)
67
+ };
68
+ await next();
69
+ };
37
70
  // Annotate the CommonJS export names for ESM import in node:
38
71
  0 && (module.exports = {
72
+ listExcludeRole,
39
73
  updateProfile
40
74
  });
@@ -58,6 +58,27 @@ class PluginUsersServer extends import_server.Plugin {
58
58
  };
59
59
  }
60
60
  });
61
+ this.db.on("field.afterAdd", ({ collection, field }) => {
62
+ if (field.options.interface === "createdBy") {
63
+ collection.setField("createdById", {
64
+ type: "context",
65
+ dataType: "bigInt",
66
+ dataIndex: "state.currentUser.id",
67
+ createOnly: true,
68
+ visible: true,
69
+ index: true
70
+ });
71
+ }
72
+ if (field.options.interface === "updatedBy") {
73
+ collection.setField("updatedById", {
74
+ type: "context",
75
+ dataType: "bigInt",
76
+ dataIndex: "state.currentUser.id",
77
+ visible: true,
78
+ index: true
79
+ });
80
+ }
81
+ });
61
82
  this.db.on("afterDefineCollection", (collection) => {
62
83
  const { createdBy, updatedBy } = collection.options;
63
84
  if (createdBy === true) {
@@ -111,6 +132,10 @@ class PluginUsersServer extends import_server.Plugin {
111
132
  });
112
133
  const loggedInActions = ["updateProfile"];
113
134
  loggedInActions.forEach((action) => this.app.acl.allow("users", action, "loggedIn"));
135
+ this.app.acl.registerSnippet({
136
+ name: `pm.${this.name}.*`,
137
+ actions: ["users:listExcludeRole", "users:list"]
138
+ });
114
139
  }
115
140
  async load() {
116
141
  await this.importCollections((0, import_path.resolve)(__dirname, "collections"));
@@ -121,6 +146,16 @@ class PluginUsersServer extends import_server.Plugin {
121
146
  plugin: this
122
147
  }
123
148
  });
149
+ this.app.resourcer.use(async (ctx, next) => {
150
+ await next();
151
+ const { associatedName, resourceName, actionName, values } = ctx.action.params;
152
+ const cache = ctx.app.cache;
153
+ if (associatedName === "roles" && resourceName === "users" && ["add", "remove", "set"].includes(actionName) && (values == null ? void 0 : values.length)) {
154
+ for (const userId of values) {
155
+ await cache.del(`roles:${userId}`);
156
+ }
157
+ }
158
+ });
124
159
  }
125
160
  getInstallingData(options = {}) {
126
161
  var _a;
package/package.json CHANGED
@@ -2,9 +2,9 @@
2
2
  "name": "@nocobase/plugin-users",
3
3
  "displayName": "Users",
4
4
  "displayName.zh-CN": "用户",
5
- "description": "Provides a basic user model, as well as createdBy and updatedBy fields..",
5
+ "description": "Provides basic user model, as well as created by and updated by fields.",
6
6
  "description.zh-CN": "提供了基础的用户模型,以及创建人和最后更新人字段。",
7
- "version": "0.19.0-alpha.9",
7
+ "version": "0.20.0-alpha.2",
8
8
  "license": "AGPL-3.0",
9
9
  "main": "./dist/server/index.js",
10
10
  "homepage": "https://docs.nocobase.com/plugins/users",
@@ -24,7 +24,7 @@
24
24
  "@nocobase/test": "0.x",
25
25
  "@nocobase/utils": "0.x"
26
26
  },
27
- "gitHead": "975f9c58a1995df6a8d7a4d191a0dc4a9769ebc5",
27
+ "gitHead": "6fb885dfc3554e4b0f29e9a7a1eecbbe85d0eebb",
28
28
  "keywords": [
29
29
  "Users & permissions"
30
30
  ]