@webiny/cognito 0.0.0-unstable.3c5210ad37
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/Cognito.d.ts +8 -0
- package/Cognito.js +29 -0
- package/Cognito.js.map +1 -0
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/admin/Cognito.d.ts +6 -0
- package/admin/Cognito.js +51 -0
- package/admin/Cognito.js.map +1 -0
- package/admin/CognitoLogin.d.ts +7 -0
- package/admin/CognitoLogin.js +18 -0
- package/admin/CognitoLogin.js.map +1 -0
- package/admin/Extension.d.ts +2 -0
- package/admin/Extension.js +20 -0
- package/admin/Extension.js.map +1 -0
- package/admin/SecurityPermission.d.ts +2 -0
- package/admin/SecurityPermission.js +26 -0
- package/admin/SecurityPermission.js.map +1 -0
- package/admin/federatedIdentityProviders.d.ts +9 -0
- package/admin/federatedIdentityProviders.js +9 -0
- package/admin/federatedIdentityProviders.js.map +1 -0
- package/admin/plugins/constants.d.ts +3 -0
- package/admin/plugins/constants.js +6 -0
- package/admin/plugins/constants.js.map +1 -0
- package/admin/plugins/userMenu/AccountDetails.d.ts +6 -0
- package/admin/plugins/userMenu/AccountDetails.js +23 -0
- package/admin/plugins/userMenu/AccountDetails.js.map +1 -0
- package/admin/plugins/userMenu/useIsDefaultTenant.d.ts +1 -0
- package/admin/plugins/userMenu/useIsDefaultTenant.js +15 -0
- package/admin/plugins/userMenu/useIsDefaultTenant.js.map +1 -0
- package/admin/presentation/Cognito/CognitoLoginScreen.d.ts +10 -0
- package/admin/presentation/Cognito/CognitoLoginScreen.js +54 -0
- package/admin/presentation/Cognito/CognitoLoginScreen.js.map +1 -0
- package/admin/presentation/Cognito/CognitoPresenter.d.ts +58 -0
- package/admin/presentation/Cognito/CognitoPresenter.js +277 -0
- package/admin/presentation/Cognito/CognitoPresenter.js.map +1 -0
- package/admin/presentation/Cognito/abstractions.d.ts +72 -0
- package/admin/presentation/Cognito/abstractions.js +4 -0
- package/admin/presentation/Cognito/abstractions.js.map +1 -0
- package/admin/presentation/Cognito/components/Divider.d.ts +2 -0
- package/admin/presentation/Cognito/components/Divider.js +16 -0
- package/admin/presentation/Cognito/components/Divider.js.map +1 -0
- package/admin/presentation/Cognito/components/FederatedLogin.d.ts +7 -0
- package/admin/presentation/Cognito/components/FederatedLogin.js +32 -0
- package/admin/presentation/Cognito/components/FederatedLogin.js.map +1 -0
- package/admin/presentation/Cognito/components/FederatedProviders.d.ts +44 -0
- package/admin/presentation/Cognito/components/FederatedProviders.js +14 -0
- package/admin/presentation/Cognito/components/FederatedProviders.js.map +1 -0
- package/admin/presentation/Cognito/components/FooterSignIn.d.ts +6 -0
- package/admin/presentation/Cognito/components/FooterSignIn.js +15 -0
- package/admin/presentation/Cognito/components/FooterSignIn.js.map +1 -0
- package/admin/presentation/Cognito/components/PasswordResetCodeSent.d.ts +9 -0
- package/admin/presentation/Cognito/components/PasswordResetCodeSent.js +43 -0
- package/admin/presentation/Cognito/components/PasswordResetCodeSent.js.map +1 -0
- package/admin/presentation/Cognito/components/RequestPasswordResetCode.d.ts +8 -0
- package/admin/presentation/Cognito/components/RequestPasswordResetCode.js +45 -0
- package/admin/presentation/Cognito/components/RequestPasswordResetCode.js.map +1 -0
- package/admin/presentation/Cognito/components/RequireNewPassword.d.ts +8 -0
- package/admin/presentation/Cognito/components/RequireNewPassword.js +55 -0
- package/admin/presentation/Cognito/components/RequireNewPassword.js.map +1 -0
- package/admin/presentation/Cognito/components/SetNewPassword.d.ts +8 -0
- package/admin/presentation/Cognito/components/SetNewPassword.js +79 -0
- package/admin/presentation/Cognito/components/SetNewPassword.js.map +1 -0
- package/admin/presentation/Cognito/components/SignIn.d.ts +10 -0
- package/admin/presentation/Cognito/components/SignIn.js +64 -0
- package/admin/presentation/Cognito/components/SignIn.js.map +1 -0
- package/admin/presentation/Cognito/components/View.d.ts +98 -0
- package/admin/presentation/Cognito/components/View.js +67 -0
- package/admin/presentation/Cognito/components/View.js.map +1 -0
- package/admin/presentation/Cognito/feature.d.ts +3 -0
- package/admin/presentation/Cognito/feature.js +16 -0
- package/admin/presentation/Cognito/feature.js.map +1 -0
- package/admin/presentation/shared/createPasswordValidator.d.ts +8 -0
- package/admin/presentation/shared/createPasswordValidator.js +27 -0
- package/admin/presentation/shared/createPasswordValidator.js.map +1 -0
- package/admin/presentation/shared/usePasswordValidator.d.ts +1 -0
- package/admin/presentation/shared/usePasswordValidator.js +15 -0
- package/admin/presentation/shared/usePasswordValidator.js.map +1 -0
- package/admin/routes.d.ts +10 -0
- package/admin/routes.js +21 -0
- package/admin/routes.js.map +1 -0
- package/admin/ui/UserItem.d.ts +10 -0
- package/admin/ui/UserItem.js +3 -0
- package/admin/ui/UserItem.js.map +1 -0
- package/admin/ui/components/AvatarImage/AvatarImage.d.ts +3 -0
- package/admin/ui/components/AvatarImage/AvatarImage.js +43 -0
- package/admin/ui/components/AvatarImage/AvatarImage.js.map +1 -0
- package/admin/ui/components/AvatarImage/AvatarImagePreview.d.ts +10 -0
- package/admin/ui/components/AvatarImage/AvatarImagePreview.js +55 -0
- package/admin/ui/components/AvatarImage/AvatarImagePreview.js.map +1 -0
- package/admin/ui/components/AvatarImage/AvatarImageTrigger.d.ts +7 -0
- package/admin/ui/components/AvatarImage/AvatarImageTrigger.js +29 -0
- package/admin/ui/components/AvatarImage/AvatarImageTrigger.js.map +1 -0
- package/admin/ui/components/AvatarImage/index.d.ts +1 -0
- package/admin/ui/components/AvatarImage/index.js +3 -0
- package/admin/ui/components/AvatarImage/index.js.map +1 -0
- package/admin/ui/views/Account/Account.d.ts +2 -0
- package/admin/ui/views/Account/Account.js +142 -0
- package/admin/ui/views/Account/Account.js.map +1 -0
- package/admin/ui/views/Account/graphql.d.ts +2 -0
- package/admin/ui/views/Account/graphql.js +40 -0
- package/admin/ui/views/Account/graphql.js.map +1 -0
- package/admin/ui/views/Account/index.d.ts +1 -0
- package/admin/ui/views/Account/index.js +3 -0
- package/admin/ui/views/Account/index.js.map +1 -0
- package/admin/ui/views/Users/UsersDataList.d.ts +3 -0
- package/admin/ui/views/Users/UsersDataList.js +172 -0
- package/admin/ui/views/Users/UsersDataList.js.map +1 -0
- package/admin/ui/views/Users/UsersForm.d.ts +5 -0
- package/admin/ui/views/Users/UsersForm.js +174 -0
- package/admin/ui/views/Users/UsersForm.js.map +1 -0
- package/admin/ui/views/Users/UsersView.d.ts +2 -0
- package/admin/ui/views/Users/UsersView.js +14 -0
- package/admin/ui/views/Users/UsersView.js.map +1 -0
- package/admin/ui/views/Users/components/DeleteAction.d.ts +7 -0
- package/admin/ui/views/Users/components/DeleteAction.js +36 -0
- package/admin/ui/views/Users/components/DeleteAction.js.map +1 -0
- package/admin/ui/views/Users/graphql.d.ts +5 -0
- package/admin/ui/views/Users/graphql.js +99 -0
- package/admin/ui/views/Users/graphql.js.map +1 -0
- package/admin/ui/views/Users/hooks/useUserForm.d.ts +27 -0
- package/admin/ui/views/Users/hooks/useUserForm.js +127 -0
- package/admin/ui/views/Users/hooks/useUserForm.js.map +1 -0
- package/admin/ui/views/Users/search.svg +20 -0
- package/admin/ui/views/utils.d.ts +3 -0
- package/admin/ui/views/utils.js +10 -0
- package/admin/ui/views/utils.js.map +1 -0
- package/api/CognitoApiFeature.d.ts +1 -0
- package/api/CognitoApiFeature.js +28 -0
- package/api/CognitoApiFeature.js.map +1 -0
- package/api/domain/Username.d.ts +4 -0
- package/api/domain/Username.js +7 -0
- package/api/domain/Username.js.map +1 -0
- package/api/domain/errors.d.ts +37 -0
- package/api/domain/errors.js +63 -0
- package/api/domain/errors.js.map +1 -0
- package/api/features/CognitoIdp/CognitoIdentityProvider.d.ts +15 -0
- package/api/features/CognitoIdp/CognitoIdentityProvider.js +61 -0
- package/api/features/CognitoIdp/CognitoIdentityProvider.js.map +1 -0
- package/api/features/CognitoIdp/abstractions.d.ts +15 -0
- package/api/features/CognitoIdp/abstractions.js +4 -0
- package/api/features/CognitoIdp/abstractions.js.map +1 -0
- package/api/features/CognitoIdp/feature.d.ts +1 -0
- package/api/features/CognitoIdp/feature.js +10 -0
- package/api/features/CognitoIdp/feature.js.map +1 -0
- package/api/features/CognitoIdp/index.d.ts +2 -0
- package/api/features/CognitoIdp/index.js +4 -0
- package/api/features/CognitoIdp/index.js.map +1 -0
- package/api/features/CognitoService/CognitoService.d.ts +20 -0
- package/api/features/CognitoService/CognitoService.js +90 -0
- package/api/features/CognitoService/CognitoService.js.map +1 -0
- package/api/features/CognitoService/abstractions.d.ts +54 -0
- package/api/features/CognitoService/abstractions.js +8 -0
- package/api/features/CognitoService/abstractions.js.map +1 -0
- package/api/features/CognitoService/feature.d.ts +5 -0
- package/api/features/CognitoService/feature.js +12 -0
- package/api/features/CognitoService/feature.js.map +1 -0
- package/api/features/CognitoService/index.d.ts +1 -0
- package/api/features/CognitoService/index.js +3 -0
- package/api/features/CognitoService/index.js.map +1 -0
- package/api/features/CreateUser/CreateUserUseCase.d.ts +22 -0
- package/api/features/CreateUser/CreateUserUseCase.js +106 -0
- package/api/features/CreateUser/CreateUserUseCase.js.map +1 -0
- package/api/features/CreateUser/abstractions.d.ts +35 -0
- package/api/features/CreateUser/abstractions.js +4 -0
- package/api/features/CreateUser/abstractions.js.map +1 -0
- package/api/features/CreateUser/feature.d.ts +1 -0
- package/api/features/CreateUser/feature.js +10 -0
- package/api/features/CreateUser/feature.js.map +1 -0
- package/api/features/CreateUser/index.d.ts +2 -0
- package/api/features/CreateUser/index.js +4 -0
- package/api/features/CreateUser/index.js.map +1 -0
- package/api/features/CreateUser/schema.d.ts +47 -0
- package/api/features/CreateUser/schema.js +17 -0
- package/api/features/CreateUser/schema.js.map +1 -0
- package/api/features/DeleteUser/DeleteUserUseCase.d.ts +16 -0
- package/api/features/DeleteUser/DeleteUserUseCase.js +54 -0
- package/api/features/DeleteUser/DeleteUserUseCase.js.map +1 -0
- package/api/features/DeleteUser/abstractions.d.ts +19 -0
- package/api/features/DeleteUser/abstractions.js +4 -0
- package/api/features/DeleteUser/abstractions.js.map +1 -0
- package/api/features/DeleteUser/feature.d.ts +1 -0
- package/api/features/DeleteUser/feature.js +10 -0
- package/api/features/DeleteUser/feature.js.map +1 -0
- package/api/features/DeleteUser/index.d.ts +2 -0
- package/api/features/DeleteUser/index.js +4 -0
- package/api/features/DeleteUser/index.js.map +1 -0
- package/api/features/UpdateUser/UpdateUserUseCase.d.ts +21 -0
- package/api/features/UpdateUser/UpdateUserUseCase.js +88 -0
- package/api/features/UpdateUser/UpdateUserUseCase.js.map +1 -0
- package/api/features/UpdateUser/abstractions.d.ts +33 -0
- package/api/features/UpdateUser/abstractions.js +4 -0
- package/api/features/UpdateUser/abstractions.js.map +1 -0
- package/api/features/UpdateUser/feature.d.ts +1 -0
- package/api/features/UpdateUser/feature.js +10 -0
- package/api/features/UpdateUser/feature.js.map +1 -0
- package/api/features/UpdateUser/index.d.ts +2 -0
- package/api/features/UpdateUser/index.js +4 -0
- package/api/features/UpdateUser/index.js.map +1 -0
- package/api/features/UpdateUser/schema.d.ts +44 -0
- package/api/features/UpdateUser/schema.js +16 -0
- package/api/features/UpdateUser/schema.js.map +1 -0
- package/api/features/UserInstaller/UserInstaller.d.ts +27 -0
- package/api/features/UserInstaller/UserInstaller.js +48 -0
- package/api/features/UserInstaller/UserInstaller.js.map +1 -0
- package/api/features/UserInstaller/feature.d.ts +1 -0
- package/api/features/UserInstaller/feature.js +10 -0
- package/api/features/UserInstaller/feature.js.map +1 -0
- package/api/graphql/user.gql.d.ts +8 -0
- package/api/graphql/user.gql.js +167 -0
- package/api/graphql/user.gql.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.js +4 -0
- package/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Route } from "@webiny/app-admin";
|
|
2
|
+
export declare const Routes: {
|
|
3
|
+
Users: {
|
|
4
|
+
List: Route<{
|
|
5
|
+
id: import("zod").ZodOptional<import("zod").ZodString>;
|
|
6
|
+
new: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
7
|
+
}>;
|
|
8
|
+
Account: Route<undefined>;
|
|
9
|
+
};
|
|
10
|
+
};
|
package/admin/routes.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Route } from "@webiny/app-admin";
|
|
2
|
+
export const Routes = {
|
|
3
|
+
Users: {
|
|
4
|
+
List: new Route({
|
|
5
|
+
name: "Cognito/Users/List",
|
|
6
|
+
path: "/admin-users",
|
|
7
|
+
params: z => {
|
|
8
|
+
return {
|
|
9
|
+
id: z.string().optional(),
|
|
10
|
+
new: z.boolean().optional()
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
}),
|
|
14
|
+
Account: new Route({
|
|
15
|
+
name: "Cognito/Users/Account",
|
|
16
|
+
path: "/account"
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Route","Routes","Users","List","name","path","params","z","id","string","optional","new","boolean","Account"],"sources":["routes.ts"],"sourcesContent":["import { Route } from \"@webiny/app-admin\";\n\nexport const Routes = {\n Users: {\n List: new Route({\n name: \"Cognito/Users/List\",\n path: \"/admin-users\",\n params: z => {\n return {\n id: z.string().optional(),\n new: z.boolean().optional()\n };\n }\n }),\n Account: new Route({\n name: \"Cognito/Users/Account\",\n path: \"/account\"\n })\n }\n};\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,mBAAmB;AAEzC,OAAO,MAAMC,MAAM,GAAG;EAClBC,KAAK,EAAE;IACHC,IAAI,EAAE,IAAIH,KAAK,CAAC;MACZI,IAAI,EAAE,oBAAoB;MAC1BC,IAAI,EAAE,cAAc;MACpBC,MAAM,EAAEC,CAAC,IAAI;QACT,OAAO;UACHC,EAAE,EAAED,CAAC,CAACE,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;UACzBC,GAAG,EAAEJ,CAAC,CAACK,OAAO,CAAC,CAAC,CAACF,QAAQ,CAAC;QAC9B,CAAC;MACL;IACJ,CAAC,CAAC;IACFG,OAAO,EAAE,IAAIb,KAAK,CAAC;MACfI,IAAI,EAAE,uBAAuB;MAC7BC,IAAI,EAAE;IACV,CAAC;EACL;AACJ,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["UserItem.ts"],"sourcesContent":["export interface UserItem {\n id: string;\n avatar: {\n src: string;\n };\n firstName: string;\n lastName: string;\n email: string;\n external?: boolean;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { SingleImageUpload } from "@webiny/app-admin";
|
|
3
|
+
import { AvatarImagePreview } from "./AvatarImagePreview.js";
|
|
4
|
+
import { AvatarImageTrigger } from "./AvatarImageTrigger.js";
|
|
5
|
+
import { cn } from "@webiny/admin-ui";
|
|
6
|
+
export const AvatarImage = ({
|
|
7
|
+
round,
|
|
8
|
+
...props
|
|
9
|
+
}) => {
|
|
10
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
11
|
+
className: "w-full flex-1"
|
|
12
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
13
|
+
className: cn(["size-[128px] mx-auto relative overflow-hidden", round && "rounded-full"])
|
|
14
|
+
}, /*#__PURE__*/React.createElement(SingleImageUpload, Object.assign({}, props, {
|
|
15
|
+
className: "p-0 border-none!",
|
|
16
|
+
variant: "ghost",
|
|
17
|
+
type: "area",
|
|
18
|
+
renderFilePreview: ({
|
|
19
|
+
onReplaceItem,
|
|
20
|
+
onRemoveItem,
|
|
21
|
+
value,
|
|
22
|
+
disabled
|
|
23
|
+
}) => {
|
|
24
|
+
return /*#__PURE__*/React.createElement(AvatarImagePreview, {
|
|
25
|
+
onReplaceItem: onReplaceItem,
|
|
26
|
+
onRemoveItem: onRemoveItem,
|
|
27
|
+
value: value,
|
|
28
|
+
disabled: disabled
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
renderTrigger: ({
|
|
32
|
+
onSelectItem,
|
|
33
|
+
disabled
|
|
34
|
+
}) => {
|
|
35
|
+
return /*#__PURE__*/React.createElement(AvatarImageTrigger, {
|
|
36
|
+
disabled: disabled,
|
|
37
|
+
onSelectItem: onSelectItem
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}))));
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=AvatarImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","SingleImageUpload","AvatarImagePreview","AvatarImageTrigger","cn","AvatarImage","round","props","createElement","className","Object","assign","variant","type","renderFilePreview","onReplaceItem","onRemoveItem","value","disabled","renderTrigger","onSelectItem"],"sources":["AvatarImage.tsx"],"sourcesContent":["import * as React from \"react\";\nimport type { SingleImageUploadProps } from \"@webiny/app-admin\";\nimport { SingleImageUpload } from \"@webiny/app-admin\";\nimport { AvatarImagePreview } from \"./AvatarImagePreview.js\";\nimport { AvatarImageTrigger } from \"~/admin/ui/components/AvatarImage/AvatarImageTrigger.js\";\nimport { cn } from \"@webiny/admin-ui\";\n\nexport const AvatarImage = ({ round, ...props }: SingleImageUploadProps) => {\n return (\n <div className={\"w-full flex-1\"}>\n <div\n className={cn([\n \"size-[128px] mx-auto relative overflow-hidden\",\n round && \"rounded-full\"\n ])}\n >\n <SingleImageUpload\n {...props}\n className={\"p-0 border-none!\"}\n variant={\"ghost\"}\n type={\"area\"}\n renderFilePreview={({ onReplaceItem, onRemoveItem, value, disabled }) => {\n return (\n <AvatarImagePreview\n onReplaceItem={onReplaceItem}\n onRemoveItem={onRemoveItem}\n value={value}\n disabled={disabled}\n />\n );\n }}\n renderTrigger={({ onSelectItem, disabled }) => {\n return (\n <AvatarImageTrigger disabled={disabled} onSelectItem={onSelectItem} />\n );\n }}\n />\n </div>\n </div>\n );\n};\n"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,iBAAiB,QAAQ,mBAAmB;AACrD,SAASC,kBAAkB;AAC3B,SAASC,kBAAkB;AAC3B,SAASC,EAAE,QAAQ,kBAAkB;AAErC,OAAO,MAAMC,WAAW,GAAGA,CAAC;EAAEC,KAAK;EAAE,GAAGC;AAA8B,CAAC,KAAK;EACxE,oBACIP,KAAA,CAAAQ,aAAA;IAAKC,SAAS,EAAE;EAAgB,gBAC5BT,KAAA,CAAAQ,aAAA;IACIC,SAAS,EAAEL,EAAE,CAAC,CACV,+CAA+C,EAC/CE,KAAK,IAAI,cAAc,CAC1B;EAAE,gBAEHN,KAAA,CAAAQ,aAAA,CAACP,iBAAiB,EAAAS,MAAA,CAAAC,MAAA,KACVJ,KAAK;IACTE,SAAS,EAAE,kBAAmB;IAC9BG,OAAO,EAAE,OAAQ;IACjBC,IAAI,EAAE,MAAO;IACbC,iBAAiB,EAAEA,CAAC;MAAEC,aAAa;MAAEC,YAAY;MAAEC,KAAK;MAAEC;IAAS,CAAC,KAAK;MACrE,oBACIlB,KAAA,CAAAQ,aAAA,CAACN,kBAAkB;QACfa,aAAa,EAAEA,aAAc;QAC7BC,YAAY,EAAEA,YAAa;QAC3BC,KAAK,EAAEA,KAAM;QACbC,QAAQ,EAAEA;MAAS,CACtB,CAAC;IAEV,CAAE;IACFC,aAAa,EAAEA,CAAC;MAAEC,YAAY;MAAEF;IAAS,CAAC,KAAK;MAC3C,oBACIlB,KAAA,CAAAQ,aAAA,CAACL,kBAAkB;QAACe,QAAQ,EAAEA,QAAS;QAACE,YAAY,EAAEA;MAAa,CAAE,CAAC;IAE9E;EAAE,EACL,CACA,CACJ,CAAC;AAEd,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type FileItemFormatted } from "@webiny/admin-ui";
|
|
3
|
+
interface AvatarImagePreviewProps {
|
|
4
|
+
value: FileItemFormatted;
|
|
5
|
+
onReplaceItem: any;
|
|
6
|
+
onRemoveItem: any;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare const AvatarImagePreview: ({ value, onReplaceItem, onRemoveItem, disabled }: AvatarImagePreviewProps) => React.JSX.Element;
|
|
10
|
+
export { AvatarImagePreview, type AvatarImagePreviewProps };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ReactComponent as TrashIcon } from "@webiny/icons/delete.svg";
|
|
3
|
+
import { ReactComponent as EditIcon } from "@webiny/icons/edit.svg";
|
|
4
|
+
import { Icon, IconButton, Tooltip, cn } from "@webiny/admin-ui";
|
|
5
|
+
const AvatarImagePreview = ({
|
|
6
|
+
value,
|
|
7
|
+
onReplaceItem,
|
|
8
|
+
onRemoveItem,
|
|
9
|
+
disabled
|
|
10
|
+
}) => {
|
|
11
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
12
|
+
className: "w-full flex-1"
|
|
13
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
14
|
+
className: cn("size-[128px] mx-auto relative overflow-hidden")
|
|
15
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
16
|
+
className: "size-full"
|
|
17
|
+
}, /*#__PURE__*/React.createElement("img", {
|
|
18
|
+
src: value.url,
|
|
19
|
+
alt: value.name,
|
|
20
|
+
className: "object-cover size-full"
|
|
21
|
+
})), /*#__PURE__*/React.createElement("div", {
|
|
22
|
+
className: cn(["flex justify-center items-center gap-xs size-full", "absolute top-0 left-0", "bg-neutral-xstrong/90", "opacity-0 hover:opacity-100 transition-opacity"])
|
|
23
|
+
}, onReplaceItem && /*#__PURE__*/React.createElement(Tooltip, {
|
|
24
|
+
content: "Select another image",
|
|
25
|
+
trigger: /*#__PURE__*/React.createElement(IconButton, {
|
|
26
|
+
icon: /*#__PURE__*/React.createElement(Icon, {
|
|
27
|
+
icon: /*#__PURE__*/React.createElement(EditIcon, null),
|
|
28
|
+
label: "Select another image",
|
|
29
|
+
size: "md",
|
|
30
|
+
color: "neutral-light"
|
|
31
|
+
}),
|
|
32
|
+
variant: "ghost-negative",
|
|
33
|
+
size: "sm",
|
|
34
|
+
onClick: onReplaceItem,
|
|
35
|
+
disabled: disabled
|
|
36
|
+
})
|
|
37
|
+
}), onRemoveItem && /*#__PURE__*/React.createElement(Tooltip, {
|
|
38
|
+
content: "Remove image",
|
|
39
|
+
trigger: /*#__PURE__*/React.createElement(IconButton, {
|
|
40
|
+
icon: /*#__PURE__*/React.createElement(Icon, {
|
|
41
|
+
icon: /*#__PURE__*/React.createElement(TrashIcon, null),
|
|
42
|
+
label: "Remove",
|
|
43
|
+
size: "md",
|
|
44
|
+
color: "neutral-light"
|
|
45
|
+
}),
|
|
46
|
+
variant: "ghost-negative",
|
|
47
|
+
size: "sm",
|
|
48
|
+
onClick: onRemoveItem,
|
|
49
|
+
disabled: disabled
|
|
50
|
+
})
|
|
51
|
+
}))));
|
|
52
|
+
};
|
|
53
|
+
export { AvatarImagePreview };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=AvatarImagePreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","ReactComponent","TrashIcon","EditIcon","Icon","IconButton","Tooltip","cn","AvatarImagePreview","value","onReplaceItem","onRemoveItem","disabled","createElement","className","src","url","alt","name","content","trigger","icon","label","size","color","variant","onClick"],"sources":["AvatarImagePreview.tsx"],"sourcesContent":["import React from \"react\";\nimport { ReactComponent as TrashIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\n\nimport { Icon, IconButton, Tooltip, cn, type FileItemFormatted } from \"@webiny/admin-ui\";\n\ninterface AvatarImagePreviewProps {\n value: FileItemFormatted;\n onReplaceItem: any;\n onRemoveItem: any;\n disabled?: boolean;\n}\n\nconst AvatarImagePreview = ({\n value,\n onReplaceItem,\n onRemoveItem,\n disabled\n}: AvatarImagePreviewProps) => {\n return (\n <div className={\"w-full flex-1\"}>\n <div className={cn(\"size-[128px] mx-auto relative overflow-hidden\")}>\n <div className={\"size-full\"}>\n <img src={value.url} alt={value.name} className={\"object-cover size-full\"} />\n </div>\n <div\n className={cn([\n \"flex justify-center items-center gap-xs size-full\",\n \"absolute top-0 left-0\",\n \"bg-neutral-xstrong/90\",\n \"opacity-0 hover:opacity-100 transition-opacity\"\n ])}\n >\n {onReplaceItem && (\n <Tooltip\n content={\"Select another image\"}\n trigger={\n <IconButton\n icon={\n <Icon\n icon={<EditIcon />}\n label={\"Select another image\"}\n size={\"md\"}\n color={\"neutral-light\"}\n />\n }\n variant={\"ghost-negative\"}\n size={\"sm\"}\n onClick={onReplaceItem}\n disabled={disabled}\n />\n }\n ></Tooltip>\n )}\n {onRemoveItem && (\n <Tooltip\n content={\"Remove image\"}\n trigger={\n <IconButton\n icon={\n <Icon\n icon={<TrashIcon />}\n label={\"Remove\"}\n size={\"md\"}\n color={\"neutral-light\"}\n />\n }\n variant={\"ghost-negative\"}\n size={\"sm\"}\n onClick={onRemoveItem}\n disabled={disabled}\n />\n }\n />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport { AvatarImagePreview, type AvatarImagePreviewProps };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,cAAc,IAAIC,SAAS,QAAQ,0BAA0B;AACtE,SAASD,cAAc,IAAIE,QAAQ,QAAQ,wBAAwB;AAEnE,SAASC,IAAI,EAAEC,UAAU,EAAEC,OAAO,EAAEC,EAAE,QAAgC,kBAAkB;AASxF,MAAMC,kBAAkB,GAAGA,CAAC;EACxBC,KAAK;EACLC,aAAa;EACbC,YAAY;EACZC;AACqB,CAAC,KAAK;EAC3B,oBACIZ,KAAA,CAAAa,aAAA;IAAKC,SAAS,EAAE;EAAgB,gBAC5Bd,KAAA,CAAAa,aAAA;IAAKC,SAAS,EAAEP,EAAE,CAAC,+CAA+C;EAAE,gBAChEP,KAAA,CAAAa,aAAA;IAAKC,SAAS,EAAE;EAAY,gBACxBd,KAAA,CAAAa,aAAA;IAAKE,GAAG,EAAEN,KAAK,CAACO,GAAI;IAACC,GAAG,EAAER,KAAK,CAACS,IAAK;IAACJ,SAAS,EAAE;EAAyB,CAAE,CAC3E,CAAC,eACNd,KAAA,CAAAa,aAAA;IACIC,SAAS,EAAEP,EAAE,CAAC,CACV,mDAAmD,EACnD,uBAAuB,EACvB,uBAAuB,EACvB,gDAAgD,CACnD;EAAE,GAEFG,aAAa,iBACVV,KAAA,CAAAa,aAAA,CAACP,OAAO;IACJa,OAAO,EAAE,sBAAuB;IAChCC,OAAO,eACHpB,KAAA,CAAAa,aAAA,CAACR,UAAU;MACPgB,IAAI,eACArB,KAAA,CAAAa,aAAA,CAACT,IAAI;QACDiB,IAAI,eAAErB,KAAA,CAAAa,aAAA,CAACV,QAAQ,MAAE,CAAE;QACnBmB,KAAK,EAAE,sBAAuB;QAC9BC,IAAI,EAAE,IAAK;QACXC,KAAK,EAAE;MAAgB,CAC1B,CACJ;MACDC,OAAO,EAAE,gBAAiB;MAC1BF,IAAI,EAAE,IAAK;MACXG,OAAO,EAAEhB,aAAc;MACvBE,QAAQ,EAAEA;IAAS,CACtB;EACJ,CACK,CACb,EACAD,YAAY,iBACTX,KAAA,CAAAa,aAAA,CAACP,OAAO;IACJa,OAAO,EAAE,cAAe;IACxBC,OAAO,eACHpB,KAAA,CAAAa,aAAA,CAACR,UAAU;MACPgB,IAAI,eACArB,KAAA,CAAAa,aAAA,CAACT,IAAI;QACDiB,IAAI,eAAErB,KAAA,CAAAa,aAAA,CAACX,SAAS,MAAE,CAAE;QACpBoB,KAAK,EAAE,QAAS;QAChBC,IAAI,EAAE,IAAK;QACXC,KAAK,EAAE;MAAgB,CAC1B,CACJ;MACDC,OAAO,EAAE,gBAAiB;MAC1BF,IAAI,EAAE,IAAK;MACXG,OAAO,EAAEf,YAAa;MACtBC,QAAQ,EAAEA;IAAS,CACtB;EACJ,CACJ,CAEJ,CACJ,CACJ,CAAC;AAEd,CAAC;AAED,SAASJ,kBAAkB","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ReactComponent as ImageIcon } from "@webiny/icons/image.svg";
|
|
3
|
+
import { cn, Icon, IconButton, Tooltip } from "@webiny/admin-ui";
|
|
4
|
+
const AvatarImageTrigger = ({
|
|
5
|
+
onSelectItem,
|
|
6
|
+
disabled
|
|
7
|
+
}) => {
|
|
8
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
9
|
+
"data-role": "select-image",
|
|
10
|
+
className: cn(["size-[128px]", "flex justify-center items-center gap-xs", "bg-neutral-strong"])
|
|
11
|
+
}, /*#__PURE__*/React.createElement(Tooltip, {
|
|
12
|
+
content: "Select from library",
|
|
13
|
+
trigger: /*#__PURE__*/React.createElement(IconButton, {
|
|
14
|
+
icon: /*#__PURE__*/React.createElement(Icon, {
|
|
15
|
+
icon: /*#__PURE__*/React.createElement(ImageIcon, null),
|
|
16
|
+
label: "Select from library",
|
|
17
|
+
size: "lg",
|
|
18
|
+
color: "neutral-light"
|
|
19
|
+
}),
|
|
20
|
+
variant: "ghost-negative",
|
|
21
|
+
size: "lg",
|
|
22
|
+
onClick: onSelectItem,
|
|
23
|
+
disabled: disabled
|
|
24
|
+
})
|
|
25
|
+
}));
|
|
26
|
+
};
|
|
27
|
+
export { AvatarImageTrigger };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=AvatarImageTrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","ReactComponent","ImageIcon","cn","Icon","IconButton","Tooltip","AvatarImageTrigger","onSelectItem","disabled","createElement","className","content","trigger","icon","label","size","color","variant","onClick"],"sources":["AvatarImageTrigger.tsx"],"sourcesContent":["import React from \"react\";\nimport { ReactComponent as ImageIcon } from \"@webiny/icons/image.svg\";\nimport { cn, Icon, IconButton, Tooltip } from \"@webiny/admin-ui\";\n\ninterface AvatarImageTriggerProps {\n onSelectItem: () => void;\n disabled?: boolean;\n}\n\nconst AvatarImageTrigger = ({ onSelectItem, disabled }: AvatarImageTriggerProps) => {\n return (\n <div\n data-role={\"select-image\"}\n className={cn([\n \"size-[128px]\",\n \"flex justify-center items-center gap-xs\",\n \"bg-neutral-strong\"\n ])}\n >\n <Tooltip\n content={\"Select from library\"}\n trigger={\n <IconButton\n icon={\n <Icon\n icon={<ImageIcon />}\n label={\"Select from library\"}\n size={\"lg\"}\n color={\"neutral-light\"}\n />\n }\n variant={\"ghost-negative\"}\n size={\"lg\"}\n onClick={onSelectItem}\n disabled={disabled}\n />\n }\n />\n </div>\n );\n};\n\nexport { AvatarImageTrigger };\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,cAAc,IAAIC,SAAS,QAAQ,yBAAyB;AACrE,SAASC,EAAE,EAAEC,IAAI,EAAEC,UAAU,EAAEC,OAAO,QAAQ,kBAAkB;AAOhE,MAAMC,kBAAkB,GAAGA,CAAC;EAAEC,YAAY;EAAEC;AAAkC,CAAC,KAAK;EAChF,oBACIT,KAAA,CAAAU,aAAA;IACI,aAAW,cAAe;IAC1BC,SAAS,EAAER,EAAE,CAAC,CACV,cAAc,EACd,yCAAyC,EACzC,mBAAmB,CACtB;EAAE,gBAEHH,KAAA,CAAAU,aAAA,CAACJ,OAAO;IACJM,OAAO,EAAE,qBAAsB;IAC/BC,OAAO,eACHb,KAAA,CAAAU,aAAA,CAACL,UAAU;MACPS,IAAI,eACAd,KAAA,CAAAU,aAAA,CAACN,IAAI;QACDU,IAAI,eAAEd,KAAA,CAAAU,aAAA,CAACR,SAAS,MAAE,CAAE;QACpBa,KAAK,EAAE,qBAAsB;QAC7BC,IAAI,EAAE,IAAK;QACXC,KAAK,EAAE;MAAgB,CAC1B,CACJ;MACDC,OAAO,EAAE,gBAAiB;MAC1BF,IAAI,EAAE,IAAK;MACXG,OAAO,EAAEX,YAAa;MACtBC,QAAQ,EAAEA;IAAS,CACtB;EACJ,CACJ,CACA,CAAC;AAEd,CAAC;AAED,SAASF,kBAAkB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./AvatarImage.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./AvatarImage.js\";\n"],"mappings":"AAAA","ignoreList":[]}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import omit from "lodash/omit.js";
|
|
3
|
+
import { useQuery, useMutation } from "@apollo/react-hooks";
|
|
4
|
+
import { i18n } from "@webiny/app/i18n/index.js";
|
|
5
|
+
import { Form } from "@webiny/form";
|
|
6
|
+
import { validation } from "@webiny/validation";
|
|
7
|
+
import { AvatarImage } from "../../components/AvatarImage/index.js";
|
|
8
|
+
import { GET_CURRENT_USER, UPDATE_CURRENT_USER } from "./graphql.js";
|
|
9
|
+
import { config as appConfig } from "@webiny/app/config.js";
|
|
10
|
+
import { SimpleForm, SimpleFormHeader, SimpleFormFooter, SimpleFormContent, useIdentity } from "@webiny/app-admin";
|
|
11
|
+
import { CenteredView } from "@webiny/app-admin";
|
|
12
|
+
import { usePasswordValidator } from "../../../presentation/shared/usePasswordValidator.js";
|
|
13
|
+
import { Alert, Button, Grid, Input, OverlayLoader, useToast } from "@webiny/admin-ui";
|
|
14
|
+
const t = i18n.ns("app-security-admin-users/account-form");
|
|
15
|
+
export const UserAccountForm = () => {
|
|
16
|
+
const [isSaving, setSaving] = useState(false);
|
|
17
|
+
const toast = useToast();
|
|
18
|
+
const {
|
|
19
|
+
identity
|
|
20
|
+
} = useIdentity();
|
|
21
|
+
const passwordValidator = usePasswordValidator();
|
|
22
|
+
const currentUser = useQuery(GET_CURRENT_USER);
|
|
23
|
+
const [updateUser] = useMutation(UPDATE_CURRENT_USER);
|
|
24
|
+
const user = currentUser.loading ? {} : currentUser.data.adminUsers.user.data;
|
|
25
|
+
const isFormLoading = isSaving || currentUser.loading;
|
|
26
|
+
const loaderMessage = isSaving ? "Saving account..." : "Loading account...";
|
|
27
|
+
const emailIsDisabled = appConfig.getKey("ADMIN_USER_CAN_CHANGE_EMAIL", process.env.REACT_APP_ADMIN_USER_CAN_CHANGE_EMAIL === "false");
|
|
28
|
+
const isExternal = user?.external === true;
|
|
29
|
+
const onSubmit = async formData => {
|
|
30
|
+
setSaving(true);
|
|
31
|
+
const {
|
|
32
|
+
data: response
|
|
33
|
+
} = await updateUser({
|
|
34
|
+
variables: {
|
|
35
|
+
data: omit(formData, ["id", "external"])
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const {
|
|
39
|
+
error
|
|
40
|
+
} = response.adminUsers.updateCurrentUser;
|
|
41
|
+
setSaving(false);
|
|
42
|
+
if (error) {
|
|
43
|
+
toast.showWarningToast({
|
|
44
|
+
title: "Error updating user account",
|
|
45
|
+
description: error.message,
|
|
46
|
+
duration: Infinity
|
|
47
|
+
});
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// TODO: set new roles/teams into the identity context
|
|
52
|
+
|
|
53
|
+
identity.update({
|
|
54
|
+
displayName: `${formData.firstName} ${formData.lastName}`,
|
|
55
|
+
profile: {
|
|
56
|
+
...(identity.profile || {}),
|
|
57
|
+
firstName: formData.firstName,
|
|
58
|
+
lastName: formData.lastName,
|
|
59
|
+
avatar: formData.avatar
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
toast.showSuccessToast({
|
|
63
|
+
title: "Account updated successfully!"
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
return /*#__PURE__*/React.createElement(CenteredView, {
|
|
67
|
+
maxWidth: 600
|
|
68
|
+
}, /*#__PURE__*/React.createElement(Form, {
|
|
69
|
+
data: user,
|
|
70
|
+
onSubmit: onSubmit
|
|
71
|
+
}, ({
|
|
72
|
+
data,
|
|
73
|
+
form,
|
|
74
|
+
Bind
|
|
75
|
+
}) => /*#__PURE__*/React.createElement(SimpleForm, null, isFormLoading && /*#__PURE__*/React.createElement(OverlayLoader, {
|
|
76
|
+
text: loaderMessage
|
|
77
|
+
}), /*#__PURE__*/React.createElement(SimpleFormHeader, {
|
|
78
|
+
title: "Account"
|
|
79
|
+
}), /*#__PURE__*/React.createElement(SimpleFormContent, null, isExternal && /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(Grid.Column, {
|
|
80
|
+
span: 12
|
|
81
|
+
}, /*#__PURE__*/React.createElement(Alert, {
|
|
82
|
+
type: "info",
|
|
83
|
+
title: "External User"
|
|
84
|
+
}, "This user is an external user and cannot be edited."))), /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(Grid.Column, {
|
|
85
|
+
span: 12,
|
|
86
|
+
"data-testid": "avatar"
|
|
87
|
+
}, /*#__PURE__*/React.createElement(Bind, {
|
|
88
|
+
name: "avatar"
|
|
89
|
+
}, /*#__PURE__*/React.createElement(AvatarImage, {
|
|
90
|
+
round: true,
|
|
91
|
+
disabled: isExternal
|
|
92
|
+
}))), /*#__PURE__*/React.createElement(Grid.Column, {
|
|
93
|
+
span: 12
|
|
94
|
+
}, /*#__PURE__*/React.createElement(Bind, {
|
|
95
|
+
name: "firstName",
|
|
96
|
+
validators: validation.create("required")
|
|
97
|
+
}, /*#__PURE__*/React.createElement(Input, {
|
|
98
|
+
label: t`First Name`,
|
|
99
|
+
disabled: isExternal,
|
|
100
|
+
"data-testid": "account.firstname"
|
|
101
|
+
}))), /*#__PURE__*/React.createElement(Grid.Column, {
|
|
102
|
+
span: 12
|
|
103
|
+
}, " ", /*#__PURE__*/React.createElement(Bind, {
|
|
104
|
+
name: "lastName",
|
|
105
|
+
validators: validation.create("required")
|
|
106
|
+
}, /*#__PURE__*/React.createElement(Input, {
|
|
107
|
+
label: t`Last Name`,
|
|
108
|
+
disabled: isExternal,
|
|
109
|
+
"data-testid": "account.lastname"
|
|
110
|
+
}))), /*#__PURE__*/React.createElement(Grid.Column, {
|
|
111
|
+
span: 12
|
|
112
|
+
}, /*#__PURE__*/React.createElement(Bind, {
|
|
113
|
+
name: "email",
|
|
114
|
+
validators: validation.create("required,email")
|
|
115
|
+
}, /*#__PURE__*/React.createElement(Input, {
|
|
116
|
+
value: data.email,
|
|
117
|
+
label: t`Email`,
|
|
118
|
+
disabled: emailIsDisabled || isExternal,
|
|
119
|
+
"data-testid": "account.email",
|
|
120
|
+
description: "Email is your unique identifier used to login!"
|
|
121
|
+
}))), /*#__PURE__*/React.createElement(Grid.Column, {
|
|
122
|
+
span: 12
|
|
123
|
+
}, /*#__PURE__*/React.createElement(Bind, {
|
|
124
|
+
name: "password",
|
|
125
|
+
validators: passwordValidator
|
|
126
|
+
}, /*#__PURE__*/React.createElement(Input, {
|
|
127
|
+
autoComplete: "off",
|
|
128
|
+
disabled: data.external,
|
|
129
|
+
description: data.id && "Type a new password to reset it.",
|
|
130
|
+
type: "password",
|
|
131
|
+
label: "Password",
|
|
132
|
+
"data-testid": "account.password"
|
|
133
|
+
}))))), /*#__PURE__*/React.createElement(SimpleFormFooter, {
|
|
134
|
+
"data-testid": "form-footer"
|
|
135
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
136
|
+
disabled: isExternal,
|
|
137
|
+
"data-testid": "account.updatebutton",
|
|
138
|
+
onClick: form.submit
|
|
139
|
+
}, t`Update account`)))));
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
//# sourceMappingURL=Account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useState","omit","useQuery","useMutation","i18n","Form","validation","AvatarImage","GET_CURRENT_USER","UPDATE_CURRENT_USER","config","appConfig","SimpleForm","SimpleFormHeader","SimpleFormFooter","SimpleFormContent","useIdentity","CenteredView","usePasswordValidator","Alert","Button","Grid","Input","OverlayLoader","useToast","t","ns","UserAccountForm","isSaving","setSaving","toast","identity","passwordValidator","currentUser","updateUser","user","loading","data","adminUsers","isFormLoading","loaderMessage","emailIsDisabled","getKey","process","env","REACT_APP_ADMIN_USER_CAN_CHANGE_EMAIL","isExternal","external","onSubmit","formData","response","variables","error","updateCurrentUser","showWarningToast","title","description","message","duration","Infinity","update","displayName","firstName","lastName","profile","avatar","showSuccessToast","createElement","maxWidth","form","Bind","text","Column","span","type","name","round","disabled","validators","create","label","value","email","autoComplete","id","onClick","submit"],"sources":["Account.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport omit from \"lodash/omit.js\";\nimport { useQuery, useMutation } from \"@apollo/react-hooks\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Form } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport { AvatarImage } from \"../../components/AvatarImage/index.js\";\nimport { GET_CURRENT_USER, UPDATE_CURRENT_USER } from \"./graphql.js\";\nimport { config as appConfig } from \"@webiny/app/config.js\";\n\nimport {\n SimpleForm,\n SimpleFormHeader,\n SimpleFormFooter,\n SimpleFormContent,\n useIdentity\n} from \"@webiny/app-admin\";\nimport { CenteredView } from \"@webiny/app-admin\";\nimport { usePasswordValidator } from \"~/admin/presentation/shared/usePasswordValidator.js\";\nimport { Alert, Button, Grid, Input, OverlayLoader, useToast } from \"@webiny/admin-ui\";\n\nconst t = i18n.ns(\"app-security-admin-users/account-form\");\n\ninterface UserAccountFormData {\n id?: boolean;\n firstName: string;\n lastName: string;\n email: string;\n password?: string;\n external?: boolean;\n avatar: {\n src?: string;\n };\n}\n\nexport const UserAccountForm = () => {\n const [isSaving, setSaving] = useState(false);\n const toast = useToast();\n const { identity } = useIdentity();\n const passwordValidator = usePasswordValidator();\n const currentUser = useQuery(GET_CURRENT_USER);\n const [updateUser] = useMutation(UPDATE_CURRENT_USER);\n\n const user = currentUser.loading ? {} : currentUser.data.adminUsers.user.data;\n\n const isFormLoading = isSaving || currentUser.loading;\n const loaderMessage = isSaving ? \"Saving account...\" : \"Loading account...\";\n\n const emailIsDisabled = appConfig.getKey(\n \"ADMIN_USER_CAN_CHANGE_EMAIL\",\n process.env.REACT_APP_ADMIN_USER_CAN_CHANGE_EMAIL === \"false\"\n );\n\n const isExternal = user?.external === true;\n\n const onSubmit = async (formData: UserAccountFormData) => {\n setSaving(true);\n const { data: response } = await updateUser({\n variables: { data: omit(formData, [\"id\", \"external\"]) }\n });\n\n const { error } = response.adminUsers.updateCurrentUser;\n setSaving(false);\n\n if (error) {\n toast.showWarningToast({\n title: \"Error updating user account\",\n description: error.message,\n duration: Infinity\n });\n return;\n }\n\n // TODO: set new roles/teams into the identity context\n\n identity.update({\n displayName: `${formData.firstName} ${formData.lastName}`,\n profile: {\n ...(identity.profile || {}),\n firstName: formData.firstName,\n lastName: formData.lastName,\n avatar: formData.avatar\n }\n });\n\n toast.showSuccessToast({ title: \"Account updated successfully!\" });\n };\n\n return (\n <CenteredView maxWidth={600}>\n <Form<UserAccountFormData> data={user} onSubmit={onSubmit}>\n {({ data, form, Bind }) => (\n <SimpleForm>\n {isFormLoading && <OverlayLoader text={loaderMessage} />}\n <SimpleFormHeader title={\"Account\"} />\n <SimpleFormContent>\n {isExternal && (\n <Grid>\n <Grid.Column span={12}>\n <Alert type={\"info\"} title={\"External User\"}>\n This user is an external user and cannot be edited.\n </Alert>\n </Grid.Column>\n </Grid>\n )}\n <Grid>\n <Grid.Column span={12} data-testid={\"avatar\"}>\n <Bind name=\"avatar\">\n <AvatarImage round disabled={isExternal} />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name=\"firstName\"\n validators={validation.create(\"required\")}\n >\n <Input\n label={t`First Name`}\n disabled={isExternal}\n data-testid=\"account.firstname\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n {\" \"}\n <Bind\n name=\"lastName\"\n validators={validation.create(\"required\")}\n >\n <Input\n label={t`Last Name`}\n disabled={isExternal}\n data-testid=\"account.lastname\"\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind\n name=\"email\"\n validators={validation.create(\"required,email\")}\n >\n <Input\n value={data.email}\n label={t`Email`}\n disabled={emailIsDisabled || isExternal}\n data-testid=\"account.email\"\n description={\n \"Email is your unique identifier used to login!\"\n }\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name=\"password\" validators={passwordValidator}>\n <Input\n autoComplete=\"off\"\n disabled={data.external}\n description={\n data.id && \"Type a new password to reset it.\"\n }\n type=\"password\"\n label={\"Password\"}\n data-testid=\"account.password\"\n />\n </Bind>\n </Grid.Column>\n </Grid>\n </SimpleFormContent>\n <SimpleFormFooter data-testid={\"form-footer\"}>\n <Button\n disabled={isExternal}\n data-testid=\"account.updatebutton\"\n onClick={form.submit}\n >{t`Update account`}</Button>\n </SimpleFormFooter>\n </SimpleForm>\n )}\n </Form>\n </CenteredView>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import gql from "graphql-tag";
|
|
2
|
+
const currentUserFields = /* GraphQL */`
|
|
3
|
+
{
|
|
4
|
+
id
|
|
5
|
+
email
|
|
6
|
+
firstName
|
|
7
|
+
lastName
|
|
8
|
+
avatar
|
|
9
|
+
external
|
|
10
|
+
}
|
|
11
|
+
`;
|
|
12
|
+
export const GET_CURRENT_USER = gql`
|
|
13
|
+
query GetCurrentUser {
|
|
14
|
+
adminUsers {
|
|
15
|
+
user: getCurrentUser {
|
|
16
|
+
data ${currentUserFields}
|
|
17
|
+
error {
|
|
18
|
+
code
|
|
19
|
+
message
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
export const UPDATE_CURRENT_USER = gql`
|
|
26
|
+
mutation UpdateCurrentUser($data: AdminUsersCurrentUserInput!) {
|
|
27
|
+
adminUsers {
|
|
28
|
+
updateCurrentUser(data: $data) {
|
|
29
|
+
data ${currentUserFields}
|
|
30
|
+
error {
|
|
31
|
+
code
|
|
32
|
+
message
|
|
33
|
+
data
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
`;
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=graphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["gql","currentUserFields","GET_CURRENT_USER","UPDATE_CURRENT_USER"],"sources":["graphql.ts"],"sourcesContent":["import gql from \"graphql-tag\";\n\nconst currentUserFields = /* GraphQL */ `\n {\n id\n email\n firstName\n lastName\n avatar\n external\n }\n`;\n\nexport const GET_CURRENT_USER = gql`\n query GetCurrentUser {\n adminUsers {\n user: getCurrentUser {\n data ${currentUserFields}\n error {\n code\n message\n }\n }\n }\n }\n`;\n\nexport const UPDATE_CURRENT_USER = gql`\n mutation UpdateCurrentUser($data: AdminUsersCurrentUserInput!) {\n adminUsers {\n updateCurrentUser(data: $data) {\n data ${currentUserFields}\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n"],"mappings":"AAAA,OAAOA,GAAG,MAAM,aAAa;AAE7B,MAAMC,iBAAiB,GAAG,aAAc;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAED,OAAO,MAAMC,gBAAgB,GAAGF,GAAG;AACnC;AACA;AACA;AACA,uBAAuBC,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAED,OAAO,MAAME,mBAAmB,GAAGH,GAAG;AACtC;AACA;AACA;AACA,uBAAuBC,iBAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { UserAccountForm } from "./Account.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["UserAccountForm"],"sources":["index.ts"],"sourcesContent":["export { UserAccountForm } from \"./Account.js\";\n"],"mappings":"AAAA,SAASA,eAAe","ignoreList":[]}
|