@nocobase/plugin-users 0.19.0-alpha.8 → 0.20.0-alpha.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.
@@ -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.8",
3
- "@nocobase/database": "0.19.0-alpha.8",
4
- "@nocobase/server": "0.19.0-alpha.8",
5
- "@nocobase/utils": "0.19.0-alpha.8",
6
- "@nocobase/actions": "0.19.0-alpha.8"
2
+ "react": "18.2.0",
3
+ "antd": "5.12.8",
4
+ "@nocobase/client": "0.20.0-alpha.1",
5
+ "@formily/react": "2.3.0",
6
+ "@formily/core": "2.3.0",
7
+ "@nocobase/plugin-acl": "0.20.0-alpha.1",
8
+ "react-i18next": "11.18.6",
9
+ "@nocobase/database": "0.20.0-alpha.1",
10
+ "@nocobase/server": "0.20.0-alpha.1",
11
+ "@nocobase/utils": "0.20.0-alpha.1",
12
+ "@nocobase/cache": "0.20.0-alpha.1",
13
+ "@nocobase/actions": "0.20.0-alpha.1"
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 and a password-based user authentication type, and extended the createdBy and updatedBy field types",
6
- "description.zh-CN": "提供了基础的用户模型和基于密码的用户认证方式,并拓展了创建人和最后更新人字段类型",
7
- "version": "0.19.0-alpha.8",
5
+ "description": "Provides basic user model, as well as created by and updated by fields.",
6
+ "description.zh-CN": "提供了基础的用户模型,以及创建人和最后更新人字段。",
7
+ "version": "0.20.0-alpha.1",
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": "b8fbe613e320e40ebf2da1bf64907eab0197b589",
27
+ "gitHead": "516c0b1470d77ff499f533ae6b57e4c084450ff5",
28
28
  "keywords": [
29
29
  "Users & permissions"
30
30
  ]