@webiny/app-security-access-management 5.23.1 → 5.25.0-beta.0

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.
Files changed (59) hide show
  1. package/components/GroupAutocomplete/graphql.d.ts +1 -1
  2. package/components/GroupAutocomplete/graphql.js.map +1 -0
  3. package/components/GroupAutocomplete/index.d.ts +5 -2
  4. package/components/GroupAutocomplete/index.js +2 -2
  5. package/components/GroupAutocomplete/index.js.map +1 -0
  6. package/components/NotAuthorizedError/NotAuthorizedError.d.ts +2 -2
  7. package/components/NotAuthorizedError/NotAuthorizedError.js.map +1 -0
  8. package/components/NotAuthorizedError/index.js.map +1 -0
  9. package/index.d.ts +5 -1
  10. package/index.js +6 -0
  11. package/index.js.map +1 -0
  12. package/package.json +14 -13
  13. package/plugins/constants.js.map +1 -0
  14. package/plugins/index.js.map +1 -0
  15. package/plugins/installation.js.map +1 -0
  16. package/plugins/permissionRenderer/SecurityPermissions.d.ts +8 -5
  17. package/plugins/permissionRenderer/SecurityPermissions.js.map +1 -0
  18. package/plugins/permissionRenderer/index.js.map +1 -0
  19. package/plugins/routes.js.map +1 -0
  20. package/plugins/secureRouteError.js.map +1 -0
  21. package/types.d.ts +15 -0
  22. package/types.js +1 -0
  23. package/types.js.map +1 -0
  24. package/ui/elements/GroupAutocompleteElement.d.ts +2 -1
  25. package/ui/elements/GroupAutocompleteElement.js +18 -5
  26. package/ui/elements/GroupAutocompleteElement.js.map +1 -0
  27. package/ui/views/ApiKeys/ApiKeyForm.d.ts +5 -3
  28. package/ui/views/ApiKeys/ApiKeyForm.js +5 -6
  29. package/ui/views/ApiKeys/ApiKeyForm.js.map +1 -0
  30. package/ui/views/ApiKeys/ApiKeys.d.ts +8 -3
  31. package/ui/views/ApiKeys/ApiKeys.js +8 -9
  32. package/ui/views/ApiKeys/ApiKeys.js.map +1 -0
  33. package/ui/views/ApiKeys/ApiKeysDataList.d.ts +5 -3
  34. package/ui/views/ApiKeys/ApiKeysDataList.js +14 -26
  35. package/ui/views/ApiKeys/ApiKeysDataList.js.map +1 -0
  36. package/ui/views/ApiKeys/graphql.d.ts +5 -5
  37. package/ui/views/ApiKeys/graphql.js.map +1 -0
  38. package/ui/views/ApiKeys/index.d.ts +1 -1
  39. package/ui/views/ApiKeys/index.js +1 -1
  40. package/ui/views/ApiKeys/index.js.map +1 -0
  41. package/ui/views/ApiKeys/utils.d.ts +2 -1
  42. package/ui/views/ApiKeys/utils.js.map +1 -0
  43. package/ui/views/Groups/Groups.d.ts +8 -3
  44. package/ui/views/Groups/Groups.js +9 -10
  45. package/ui/views/Groups/Groups.js.map +1 -0
  46. package/ui/views/Groups/GroupsDataList.d.ts +5 -3
  47. package/ui/views/Groups/GroupsDataList.js +15 -27
  48. package/ui/views/Groups/GroupsDataList.js.map +1 -0
  49. package/ui/views/Groups/GroupsForm.d.ts +5 -3
  50. package/ui/views/Groups/GroupsForm.js +5 -6
  51. package/ui/views/Groups/GroupsForm.js.map +1 -0
  52. package/ui/views/Groups/graphql.d.ts +5 -5
  53. package/ui/views/Groups/graphql.js.map +1 -0
  54. package/ui/views/Groups/index.d.ts +1 -1
  55. package/ui/views/Groups/index.js +1 -1
  56. package/ui/views/Groups/index.js.map +1 -0
  57. package/ui/views/utils.d.ts +3 -2
  58. package/ui/views/utils.js +5 -18
  59. package/ui/views/utils.js.map +1 -0
@@ -1 +1 @@
1
- export declare const LIST_GROUPS: any;
1
+ export declare const LIST_GROUPS: import("graphql").DocumentNode;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["graphql.ts"],"names":["gql","LIST_GROUPS"],"mappings":";;;;AAAA,OAAOA,GAAP,MAAgB,aAAhB;AAEA,OAAO,IAAMC,WAAW,GAAGD,GAAH,6WAAjB","sourcesContent":["import gql from \"graphql-tag\";\n\nexport const LIST_GROUPS = gql`\n query listGroups {\n security {\n groups: listGroups {\n data {\n id\n slug\n name\n description\n createdOn\n }\n }\n }\n }\n`;\n"]}
@@ -1,2 +1,5 @@
1
- /// <reference types="react" />
2
- export declare const GroupAutocomplete: (props: any) => JSX.Element;
1
+ import React from "react";
2
+ import { AutoCompleteProps } from "@webiny/ui/AutoComplete";
3
+ declare type GroupAutocompleteProps = Partial<AutoCompleteProps>;
4
+ export declare const GroupAutocomplete: React.FC<GroupAutocompleteProps>;
5
+ export {};
@@ -7,10 +7,10 @@ export var GroupAutocomplete = function GroupAutocomplete(props) {
7
7
  data = _useQuery.data,
8
8
  loading = _useQuery.loading;
9
9
 
10
- var options = loading && !data ? [] : data.security.groups.data;
10
+ var options = loading || !data ? [] : data.security.groups.data;
11
11
  return /*#__PURE__*/React.createElement(AutoComplete, Object.assign({}, props, {
12
12
  options: options,
13
13
  valueProp: "id",
14
- value: loading ? null : props.value
14
+ value: loading ? undefined : props.value
15
15
  }));
16
16
  };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.tsx"],"names":["React","AutoComplete","LIST_GROUPS","useQuery","GroupAutocomplete","props","data","loading","options","security","groups","undefined","value"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,YAAT,QAAgD,yBAAhD;AACA,SAASC,WAAT;AACA,SAASC,QAAT,QAAyB,qBAAzB;AAGA,OAAO,IAAMC,iBAAmD,GAAG,SAAtDA,iBAAsD,CAAAC,KAAK,EAAI;AACxE,kBAA0BF,QAAQ,CAACD,WAAD,CAAlC;AAAA,MAAQI,IAAR,aAAQA,IAAR;AAAA,MAAcC,OAAd,aAAcA,OAAd;;AAEA,MAAMC,OAAO,GAAGD,OAAO,IAAI,CAACD,IAAZ,GAAmB,EAAnB,GAAwBA,IAAI,CAACG,QAAL,CAAcC,MAAd,CAAqBJ,IAA7D;AAEA,sBACI,oBAAC,YAAD,oBACQD,KADR;AAEI,IAAA,OAAO,EAAEG,OAFb;AAGI,IAAA,SAAS,EAAE,IAHf;AAII,IAAA,KAAK,EAAED,OAAO,GAAGI,SAAH,GAAeN,KAAK,CAACO;AAJvC,KADJ;AAQH,CAbM","sourcesContent":["import React from \"react\";\nimport { AutoComplete, AutoCompleteProps } from \"@webiny/ui/AutoComplete\";\nimport { LIST_GROUPS } from \"./graphql\";\nimport { useQuery } from \"@apollo/react-hooks\";\n\ntype GroupAutocompleteProps = Partial<AutoCompleteProps>;\nexport const GroupAutocomplete: React.FC<GroupAutocompleteProps> = props => {\n const { data, loading } = useQuery(LIST_GROUPS);\n\n const options = loading || !data ? [] : data.security.groups.data;\n\n return (\n <AutoComplete\n {...props}\n options={options}\n valueProp={\"id\"}\n value={loading ? undefined : props.value}\n />\n );\n};\n"]}
@@ -1,2 +1,2 @@
1
- /// <reference types="react" />
2
- export declare const NotAuthorizedError: () => JSX.Element;
1
+ import * as React from "react";
2
+ export declare const NotAuthorizedError: React.FC;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["NotAuthorizedError.tsx"],"names":["React","Link","css","styled","Helmet","authErrorImg","Typography","ContentWrapper","display","paddingTop","textAlign","margin","styles","authErrorImgStyle","width","paddingBottom","bodyStyle","color","linkStyle","textDecoration","NotAuthorizedError"],"mappings":"AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AACA,SAASC,IAAT,QAAqB,sBAArB;AACA,SAASC,GAAT,QAAoB,SAApB;AACA,OAAOC,MAAP,MAAmB,iBAAnB;AACA,OAAOC,MAAP,MAAmB,cAAnB;AACA,OAAOC,YAAP;AACA,SAASC,UAAT,QAA2B,uBAA3B;AAEA,IAAMC,cAAc,gBAAGJ,MAAH,CAAU,KAAV;AAAA;AAAA;AAAA,GAAiB;AACjCK,EAAAA,OAAO,EAAE,OADwB;AAEjCC,EAAAA,UAAU,EAAE,KAFqB;AAGjCC,EAAAA,SAAS,EAAE,QAHsB;AAIjCC,EAAAA,MAAM,EAAE;AAJyB,CAAjB,CAApB;AAOA,IAAMC,MAAM,GAAG;AACXC,EAAAA,iBAAiB,eAAEX,GAAG,CAAC;AACnBY,IAAAA,KAAK,EAAE,OADY;AAEnBC,IAAAA,aAAa,EAAE;AAFI,GAAD,6BADX;AAKXC,EAAAA,SAAS,eAAEd,GAAG,CAAC;AACXe,IAAAA,KAAK,EAAE,6CADI;AAEXT,IAAAA,OAAO,EAAE;AAFE,GAAD,qBALH;AASXU,EAAAA,SAAS,eAAEhB,GAAG,CAAC;AACXiB,IAAAA,cAAc,EAAE,MADL;AAEX,eAAW;AACPA,MAAAA,cAAc,EAAE;AADT;AAFA,GAAD;AATH,CAAf;AAiBA,OAAO,IAAMC,kBAA4B,GAAG,SAA/BA,kBAA+B,GAAM;AAC9C,sBACI,oBAAC,cAAD,qBACI,oBAAC,MAAD;AAAQ,IAAA,KAAK,EAAE;AAAf,IADJ,eAGI;AAAK,IAAA,SAAS,EAAER,MAAM,CAACC,iBAAvB;AAA0C,IAAA,GAAG,EAAER,YAA/C;AAA6D,IAAA,GAAG,EAAC;AAAjE,IAHJ,eAKI,oBAAC,UAAD;AAAY,IAAA,GAAG,EAAE,OAAjB;AAA0B,IAAA,SAAS,EAAEO,MAAM,CAACI;AAA5C,kDALJ,eASI,oBAAC,UAAD;AAAY,IAAA,GAAG,EAAE,OAAjB;AAA0B,IAAA,SAAS,EAAEJ,MAAM,CAACI;AAA5C,4DATJ,eAaI,oBAAC,IAAD;AAAM,IAAA,EAAE,EAAC,GAAT;AAAa,IAAA,SAAS,EAAEJ,MAAM,CAACM;AAA/B,qBAbJ,CADJ;AAmBH,CApBM","sourcesContent":["import * as React from \"react\";\nimport { Link } from \"@webiny/react-router\";\nimport { css } from \"emotion\";\nimport styled from \"@emotion/styled\";\nimport Helmet from \"react-helmet\";\nimport authErrorImg from \"./SecureRouteError.svg\";\nimport { Typography } from \"@webiny/ui/Typography\";\n\nconst ContentWrapper = styled(\"div\")({\n display: \"block\",\n paddingTop: \"15%\",\n textAlign: \"center\",\n margin: \"auto\"\n});\n\nconst styles = {\n authErrorImgStyle: css({\n width: \"192px\",\n paddingBottom: \"24px\"\n }),\n bodyStyle: css({\n color: \"var(--mdc-theme-text-primary-on-background)\",\n display: \"block\"\n }),\n linkStyle: css({\n textDecoration: \"none\",\n \"&:hover\": {\n textDecoration: \"none\"\n }\n })\n};\n\nexport const NotAuthorizedError: React.FC = () => {\n return (\n <ContentWrapper>\n <Helmet title={\"Not authorized\"} />\n\n <img className={styles.authErrorImgStyle} src={authErrorImg} alt=\"Not Authorized\" />\n\n <Typography use={\"body1\"} className={styles.bodyStyle}>\n You are not authorized to view this route.\n </Typography>\n\n <Typography use={\"body1\"} className={styles.bodyStyle}>\n Please contact your administrator to request access.\n </Typography>\n\n <Link to=\"/\" className={styles.linkStyle}>\n Take me back.\n </Link>\n </ContentWrapper>\n );\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["NotAuthorizedError"],"mappings":"AAAA,SAASA,kBAAT","sourcesContent":["export { NotAuthorizedError } from \"./NotAuthorizedError\";\n"]}
package/index.d.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  import React from "react";
2
- declare const _default: () => any[];
2
+ declare const _default: () => never[];
3
+ /**
4
+ * TODO @ts-refactor
5
+ * Find out why is there empty default export
6
+ */
3
7
  export default _default;
4
8
  export declare const AccessManagementExtension: () => JSX.Element;
5
9
  export declare const AccessManagement: React.MemoExoticComponent<() => JSX.Element>;
package/index.js CHANGED
@@ -6,6 +6,12 @@ import { Permission } from "./plugins/constants";
6
6
  import { Groups } from "./ui/views/Groups";
7
7
  import { ApiKeys } from "./ui/views/ApiKeys";
8
8
  import accessManagementPugins from "./plugins";
9
+ /**
10
+ * TODO @ts-refactor
11
+ * Find out why is there empty default export
12
+ */
13
+ // @ts-ignore
14
+
9
15
  export default (function () {
10
16
  return [];
11
17
  });
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.tsx"],"names":["React","memo","plugins","Layout","Plugins","AddMenu","AddRoute","HasPermission","Permission","Groups","ApiKeys","accessManagementPugins","AccessManagementExtension","register","AccessManagement"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,IAAhB,QAA4B,OAA5B;AACA,SAASC,OAAT,QAAwB,iBAAxB;AACA,SAASC,MAAT,EAAiBC,OAAjB,EAA0BC,OAA1B,EAAmCC,QAAnC,QAAmD,mBAAnD;AACA,SAASC,aAAT,QAA8B,sBAA9B;AACA,SAASC,UAAT;AACA,SAASC,MAAT;AACA,SAASC,OAAT;AACA,OAAOC,sBAAP;AAEA;AACA;AACA;AACA;AACA;;AACA,gBAAe;AAAA,SAAM,EAAN;AAAA,CAAf;AAEA,OAAO,IAAMC,yBAAyB,GAAG,SAA5BA,yBAA4B,GAAM;AAC3CV,EAAAA,OAAO,CAACW,QAAR,CAAiBF,sBAAsB,EAAvC;AAEA,sBACI,oBAAC,OAAD,qBACI,oBAAC,aAAD;AAAe,IAAA,IAAI,EAAEH,UAAU,CAACC;AAAhC,kBACI,oBAAC,QAAD;AAAU,IAAA,KAAK,MAAf;AAAgB,IAAA,IAAI,EAAE;AAAtB,kBACI,oBAAC,MAAD;AAAQ,IAAA,KAAK,EAAE;AAAf,kBACI,oBAAC,MAAD,OADJ,CADJ,CADJ,CADJ,eAQI,oBAAC,aAAD;AAAe,IAAA,IAAI,EAAED,UAAU,CAACE;AAAhC,kBACI,oBAAC,QAAD;AAAU,IAAA,KAAK,MAAf;AAAgB,IAAA,IAAI,EAAE;AAAtB,kBACI,oBAAC,MAAD;AAAQ,IAAA,KAAK,EAAE;AAAf,kBACI,oBAAC,OAAD,OADJ,CADJ,CADJ,CARJ,eAeI,oBAAC,aAAD;AAAe,IAAA,GAAG,EAAE,CAACF,UAAU,CAACC,MAAZ,EAAoBD,UAAU,CAACE,OAA/B;AAApB,kBACI,oBAAC,OAAD;AAAS,IAAA,IAAI,EAAE;AAAf,kBACI,oBAAC,OAAD;AAAS,IAAA,IAAI,EAAE,2BAAf;AAA4C,IAAA,KAAK,EAAE;AAAnD,kBACI,oBAAC,aAAD;AAAe,IAAA,IAAI,EAAEF,UAAU,CAACC;AAAhC,kBACI,oBAAC,OAAD;AACI,IAAA,IAAI,EAAE,kCADV;AAEI,IAAA,KAAK,EAAE,QAFX;AAGI,IAAA,IAAI,EAAE;AAHV,IADJ,CADJ,eAQI,oBAAC,aAAD;AAAe,IAAA,IAAI,EAAED,UAAU,CAACE;AAAhC,kBACI,oBAAC,OAAD;AACI,IAAA,IAAI,EAAE,mCADV;AAEI,IAAA,KAAK,EAAE,UAFX;AAGI,IAAA,IAAI,EAAE;AAHV,IADJ,CARJ,CADJ,CADJ,CAfJ,CADJ;AAsCH,CAzCM;AA2CP,OAAO,IAAMI,gBAAgB,gBAAGb,IAAI,CAACW,yBAAD,CAA7B","sourcesContent":["import React, { memo } from \"react\";\nimport { plugins } from \"@webiny/plugins\";\nimport { Layout, Plugins, AddMenu, AddRoute } from \"@webiny/app-admin\";\nimport { HasPermission } from \"@webiny/app-security\";\nimport { Permission } from \"~/plugins/constants\";\nimport { Groups } from \"~/ui/views/Groups\";\nimport { ApiKeys } from \"~/ui/views/ApiKeys\";\nimport accessManagementPugins from \"./plugins\";\n\n/**\n * TODO @ts-refactor\n * Find out why is there empty default export\n */\n// @ts-ignore\nexport default () => [];\n\nexport const AccessManagementExtension = () => {\n plugins.register(accessManagementPugins());\n\n return (\n <Plugins>\n <HasPermission name={Permission.Groups}>\n <AddRoute exact path={\"/access-management/groups\"}>\n <Layout title={\"Access Management - Groups\"}>\n <Groups />\n </Layout>\n </AddRoute>\n </HasPermission>\n <HasPermission name={Permission.ApiKeys}>\n <AddRoute exact path={\"/access-management/api-keys\"}>\n <Layout title={\"Access Management - API Keys\"}>\n <ApiKeys />\n </Layout>\n </AddRoute>\n </HasPermission>\n <HasPermission any={[Permission.Groups, Permission.ApiKeys]}>\n <AddMenu name={\"settings\"}>\n <AddMenu name={\"settings.accessManagement\"} label={\"Access Management\"}>\n <HasPermission name={Permission.Groups}>\n <AddMenu\n name={\"settings.accessManagement.groups\"}\n label={\"Groups\"}\n path={\"/access-management/groups\"}\n />\n </HasPermission>\n <HasPermission name={Permission.ApiKeys}>\n <AddMenu\n name={\"settings.accessManagement.apiKeys\"}\n label={\"API Keys\"}\n path={\"/access-management/api-keys\"}\n />\n </HasPermission>\n </AddMenu>\n </AddMenu>\n </HasPermission>\n </Plugins>\n );\n};\n\nexport const AccessManagement = memo(AccessManagementExtension);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-security-access-management",
3
- "version": "5.23.1",
3
+ "version": "5.25.0-beta.0",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,14 +15,14 @@
15
15
  "dependencies": {
16
16
  "@apollo/react-hooks": "3.1.5",
17
17
  "@emotion/styled": "10.3.0",
18
- "@webiny/app": "5.23.1",
19
- "@webiny/app-admin": "5.23.1",
20
- "@webiny/app-security": "5.23.1",
21
- "@webiny/form": "5.23.1",
22
- "@webiny/plugins": "5.23.1",
23
- "@webiny/react-router": "5.23.1",
24
- "@webiny/ui": "5.23.1",
25
- "@webiny/validation": "5.23.1",
18
+ "@webiny/app": "5.25.0-beta.0",
19
+ "@webiny/app-admin": "5.25.0-beta.0",
20
+ "@webiny/app-security": "5.25.0-beta.0",
21
+ "@webiny/form": "5.25.0-beta.0",
22
+ "@webiny/plugins": "5.25.0-beta.0",
23
+ "@webiny/react-router": "5.25.0-beta.0",
24
+ "@webiny/ui": "5.25.0-beta.0",
25
+ "@webiny/validation": "5.25.0-beta.0",
26
26
  "emotion": "10.0.27",
27
27
  "graphql-tag": "2.12.6",
28
28
  "lodash": "4.17.21",
@@ -37,13 +37,14 @@
37
37
  "@babel/preset-env": "^7.16.4",
38
38
  "@babel/preset-react": "^7.16.0",
39
39
  "@babel/preset-typescript": "^7.16.0",
40
- "@webiny/cli": "^5.23.1",
41
- "@webiny/project-utils": "^5.23.1",
40
+ "@types/react-helmet": "^6.1.5",
41
+ "@webiny/cli": "^5.25.0-beta.0",
42
+ "@webiny/project-utils": "^5.25.0-beta.0",
42
43
  "babel-plugin-emotion": "^9.2.8",
43
44
  "babel-plugin-lodash": "^3.3.4",
44
45
  "rimraf": "^3.0.2",
45
46
  "ttypescript": "^1.5.12",
46
- "typescript": "^4.1.3"
47
+ "typescript": "4.5.5"
47
48
  },
48
49
  "publishConfig": {
49
50
  "access": "public",
@@ -60,5 +61,5 @@
60
61
  ]
61
62
  }
62
63
  },
63
- "gitHead": "a726d09d2647d13e5a4f376cef23463564ef7ca0"
64
+ "gitHead": "2d3e7833575e88fde77d84e5490e746933a5ec28"
64
65
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["constants.ts"],"names":["Permission"],"mappings":"AAAA,WAAYA,UAAZ;;WAAYA,U;AAAAA,EAAAA,U;AAAAA,EAAAA,U;GAAAA,U,KAAAA,U","sourcesContent":["export enum Permission {\n Groups = \"security.group\",\n ApiKeys = \"security.apiKey\"\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":["installation","permissionRenderer","secureRouteError"],"mappings":"AACA,OAAOA,YAAP;AACA,OAAOC,kBAAP;AACA,OAAOC,gBAAP;AAEA,gBAAe;AAAA,SAAwB,CAACF,YAAD,EAAeC,kBAAf,EAAmCC,gBAAnC,CAAxB;AAAA,CAAf","sourcesContent":["import { PluginCollection } from \"@webiny/plugins/types\";\nimport installation from \"./installation\";\nimport permissionRenderer from \"./permissionRenderer\";\nimport secureRouteError from \"~/plugins/secureRouteError\";\n\nexport default (): PluginCollection => [installation, permissionRenderer, secureRouteError];\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["installation.tsx"],"names":["React","useState","useEffect","gql","useApolloClient","Alert","CircularProgress","SimpleForm","SimpleFormContent","styled","SimpleFormPlaceholder","minHeight","minWidth","IS_INSTALLED","INSTALL","SecurityInstaller","onInstalled","client","error","setError","mutate","mutation","then","data","security","install","message","setTimeout","label","plugin","name","type","title","dependencies","secure","getInstalledVersion","query","version","render"],"mappings":";;;;;;;AAAA,OAAOA,KAAP,IAAgBC,QAAhB,EAA0BC,SAA1B,QAA2C,OAA3C;AACA,OAAOC,GAAP,MAAgB,aAAhB;AACA,SAASC,eAAT,QAAgC,qBAAhC;AACA,SAASC,KAAT,QAAsB,kBAAtB;AACA,SAASC,gBAAT,QAAiC,qBAAjC;AACA,SAASC,UAAT,EAAqBC,iBAArB,QAA8C,yCAA9C;AACA,OAAOC,MAAP,MAAmB,iBAAnB;AAGA,IAAMC,qBAAqB,gBAAGD,MAAH;AAAA;AAAA;AAAA,GAAc;AACrCE,EAAAA,SAAS,EAAE,GAD0B;AAErCC,EAAAA,QAAQ,EAAE;AAF2B,CAAd,CAA3B;AAKA,IAAMC,YAAY,GAAGV,GAAH,mKAAlB;AAQA,IAAMW,OAAO,GAAGX,GAAH,8SAAb;;AAiBA,IAAMY,iBAAmD,GAAG,SAAtDA,iBAAsD,OAAqB;AAAA,MAAlBC,WAAkB,QAAlBA,WAAkB;AAC7E,MAAMC,MAAM,GAAGb,eAAe,EAA9B;;AACA,kBAA0BH,QAAQ,CAAC,IAAD,CAAlC;AAAA;AAAA,MAAOiB,KAAP;AAAA,MAAcC,QAAd;;AAEAjB,EAAAA,SAAS,CAAC,YAAM;AACZe,IAAAA,MAAM,CAACG,MAAP,CAAc;AAAEC,MAAAA,QAAQ,EAAEP;AAAZ,KAAd,EAAqCQ,IAArC,CAA0C,iBAAc;AAAA,UAAXC,IAAW,SAAXA,IAAW;AACpD,UAAQL,KAAR,GAAkBK,IAAI,CAACC,QAAL,CAAcC,OAAhC,CAAQP,KAAR;;AACA,UAAIA,KAAJ,EAAW;AACPC,QAAAA,QAAQ,CAACD,KAAK,CAACQ,OAAP,CAAR;AACA;AACH,OALmD,CAOpD;;;AACAC,MAAAA,UAAU,CAACX,WAAD,EAAc,IAAd,CAAV;AACH,KATD;AAUH,GAXQ,EAWN,EAXM,CAAT;AAaA,MAAMY,KAAK,GAAGV,KAAK,gBACf,oBAAC,KAAD;AAAO,IAAA,KAAK,wBAAZ;AAAsC,IAAA,IAAI,EAAE;AAA5C,KACKA,KADL,CADe,2BAAnB;AAQA,sBACI,oBAAC,UAAD,qBACI,oBAAC,gBAAD;AAAkB,IAAA,KAAK,EAAEU;AAAzB,IADJ,eAEI,oBAAC,iBAAD,qBACI,oBAAC,qBAAD,OADJ,CAFJ,CADJ;AAQH,CAjCD;;AAmCA,IAAMC,MAA+B,GAAG;AACpCC,EAAAA,IAAI,EAAE,6BAD8B;AAEpCC,EAAAA,IAAI,EAAE,oBAF8B;AAGpCC,EAAAA,KAAK,YAH+B;AAIpCC,EAAAA,YAAY,EAAE,8BAJsB;AAKpCC,EAAAA,MAAM,EAAE,KAL4B;AAM9BC,EAAAA,mBAN8B,sCAME;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAVlB,cAAAA,MAAU,SAAVA,MAAU;AAAA;AAAA,qBACXA,MAAM,CAACmB,KAAP,CAAa;AAAEA,gBAAAA,KAAK,EAAEvB;AAAT,eAAb,CADW;;AAAA;AAAA;AAC1BU,cAAAA,IAD0B,uBAC1BA,IAD0B;AAAA,+CAE3BA,IAAI,CAACC,QAAL,CAAca,OAFa;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGrC,GATmC;AAUpCC,EAAAA,MAVoC,yBAUZ;AAAA,QAAftB,WAAe,SAAfA,WAAe;AACpB,wBAAO,oBAAC,iBAAD;AAAmB,MAAA,WAAW,EAAEA;AAAhC,MAAP;AACH;AAZmC,CAAxC;AAeA,eAAea,MAAf","sourcesContent":["import React, { useState, useEffect } from \"react\";\nimport gql from \"graphql-tag\";\nimport { useApolloClient } from \"@apollo/react-hooks\";\nimport { Alert } from \"@webiny/ui/Alert\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { SimpleForm, SimpleFormContent } from \"@webiny/app-admin/components/SimpleForm\";\nimport styled from \"@emotion/styled\";\nimport { AdminInstallationPlugin } from \"@webiny/app-admin/types\";\n\nconst SimpleFormPlaceholder = styled.div({\n minHeight: 300,\n minWidth: 400\n});\n\nconst IS_INSTALLED = gql`\n query IsSecurityInstalled {\n security {\n version\n }\n }\n`;\n\nconst INSTALL = gql`\n mutation InstallSecurity {\n security {\n install {\n data\n error {\n code\n message\n }\n }\n }\n }\n`;\n\ninterface SecurityInstallerProps {\n onInstalled: () => void;\n}\nconst SecurityInstaller: React.FC<SecurityInstallerProps> = ({ onInstalled }) => {\n const client = useApolloClient();\n const [error, setError] = useState(null);\n\n useEffect(() => {\n client.mutate({ mutation: INSTALL }).then(({ data }) => {\n const { error } = data.security.install;\n if (error) {\n setError(error.message);\n return;\n }\n\n // Just so the user sees the actual message.\n setTimeout(onInstalled, 3000);\n });\n }, []);\n\n const label = error ? (\n <Alert title={`Something went wrong`} type={\"danger\"}>\n {error}\n </Alert>\n ) : (\n `Installing Security...`\n );\n\n return (\n <SimpleForm>\n <CircularProgress label={label} />\n <SimpleFormContent>\n <SimpleFormPlaceholder />\n </SimpleFormContent>\n </SimpleForm>\n );\n};\n\nconst plugin: AdminInstallationPlugin = {\n name: \"admin-installation-security\",\n type: \"admin-installation\",\n title: `Security`,\n dependencies: [`admin-installation-tenancy`],\n secure: false,\n async getInstalledVersion({ client }) {\n const { data } = await client.query({ query: IS_INSTALLED });\n return data.security.version;\n },\n render({ onInstalled }) {\n return <SecurityInstaller onInstalled={onInstalled} />;\n }\n};\n\nexport default plugin;\n"]}
@@ -1,5 +1,8 @@
1
- /// <reference types="react" />
2
- export declare const SecurityPermissions: ({ value, onChange }: {
3
- value: any;
4
- onChange: any;
5
- }) => JSX.Element;
1
+ import React from "react";
2
+ import { SecurityPermission } from "@webiny/app-security/types";
3
+ interface SecurityPermissionsProps {
4
+ value: SecurityPermission[];
5
+ onChange: (value: SecurityPermission[]) => void;
6
+ }
7
+ export declare const SecurityPermissions: React.FC<SecurityPermissionsProps>;
8
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["SecurityPermissions.tsx"],"names":["React","Fragment","useCallback","useMemo","Grid","Cell","Select","i18n","PermissionInfo","gridNoPaddingClass","Form","Elevation","Typography","t","ns","SECURITY","SECURITY_FULL_ACCESS","SECURITY_GROUP_ACCESS","SECURITY_API_KEY_ACCESS","FULL_ACCESS","NO_ACCESS","CUSTOM_ACCESS","SecurityPermissions","value","onChange","onFormChange","data","newValue","Array","isArray","filter","item","name","startsWith","permissions","accessLevel","push","groupAccessScope","apiKeyAccessScope","length","formData","hasFullAccess","find","hasGroupAccess","hasApiKeyAccess","Bind","marginTop"],"mappings":"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","sourcesContent":["import React, { Fragment, useCallback, useMemo } from \"react\";\nimport { Grid, Cell } from \"@webiny/ui/Grid\";\nimport { Select } from \"@webiny/ui/Select\";\nimport { i18n } from \"@webiny/app/i18n\";\nimport { PermissionInfo, gridNoPaddingClass } from \"@webiny/app-admin/components/Permissions\";\nimport { Form } from \"@webiny/form\";\nimport { Elevation } from \"@webiny/ui/Elevation\";\nimport { Typography } from \"@webiny/ui/Typography\";\nimport { SecurityPermission } from \"@webiny/app-security/types\";\n\nconst t = i18n.ns(\"app-security-admin-users/plugins/permissionRenderer\");\n\nconst SECURITY = \"security\";\nconst SECURITY_FULL_ACCESS = `${SECURITY}.*`;\nconst SECURITY_GROUP_ACCESS = `${SECURITY}.group`;\nconst SECURITY_API_KEY_ACCESS = `${SECURITY}.apiKey`;\nconst FULL_ACCESS = \"full\";\nconst NO_ACCESS = \"no\";\nconst CUSTOM_ACCESS = \"custom\";\n\ninterface SecurityPermissionsProps {\n value: SecurityPermission[];\n onChange: (value: SecurityPermission[]) => void;\n}\nexport const SecurityPermissions: React.FC<SecurityPermissionsProps> = ({ value, onChange }) => {\n const onFormChange = useCallback(\n data => {\n let newValue: SecurityPermission[] = [];\n if (Array.isArray(value)) {\n // Let's just filter out the `security*` permission objects, it's easier to build new ones from scratch.\n newValue = value.filter(item => !item.name.startsWith(SECURITY));\n }\n\n const permissions = [];\n if (data.accessLevel === FULL_ACCESS) {\n permissions.push({ name: SECURITY_FULL_ACCESS });\n } else if (data.accessLevel === CUSTOM_ACCESS) {\n if (data.groupAccessScope === FULL_ACCESS) {\n permissions.push({ name: SECURITY_GROUP_ACCESS });\n }\n\n if (data.apiKeyAccessScope === FULL_ACCESS) {\n permissions.push({ name: SECURITY_API_KEY_ACCESS });\n }\n }\n\n if (permissions && permissions.length) {\n newValue.push(...permissions);\n }\n\n onChange(newValue);\n },\n [value]\n );\n\n const formData = useMemo(() => {\n if (!Array.isArray(value)) {\n return { accessLevel: NO_ACCESS };\n }\n\n const hasFullAccess = value.find(\n item => item.name === SECURITY_FULL_ACCESS || item.name === \"*\"\n );\n\n if (hasFullAccess) {\n return { accessLevel: FULL_ACCESS };\n }\n\n const permissions = value.filter(item => item.name.startsWith(SECURITY));\n if (permissions.length === 0) {\n return { accessLevel: NO_ACCESS };\n }\n\n const data = {\n accessLevel: CUSTOM_ACCESS,\n groupAccessScope: NO_ACCESS,\n apiKeyAccessScope: NO_ACCESS\n };\n\n const hasGroupAccess = permissions.find(item => item.name === SECURITY_GROUP_ACCESS);\n if (hasGroupAccess) {\n data.groupAccessScope = FULL_ACCESS;\n }\n\n const hasApiKeyAccess = permissions.find(item => item.name === SECURITY_API_KEY_ACCESS);\n if (hasApiKeyAccess) {\n data.apiKeyAccessScope = FULL_ACCESS;\n }\n\n return data;\n }, []);\n\n return (\n <Form data={formData} onChange={onFormChange}>\n {({ data, Bind }) => {\n return (\n <Fragment>\n <Grid className={gridNoPaddingClass}>\n <Cell span={6}>\n <PermissionInfo title={t`Access Level`} />\n </Cell>\n <Cell span={6}>\n <Bind name={\"accessLevel\"}>\n <Select label={t`Access Level`}>\n <option value={NO_ACCESS}>{t`No access`}</option>\n <option value={FULL_ACCESS}>{t`Full access`}</option>\n <option value={CUSTOM_ACCESS}>{t`Custom access`}</option>\n </Select>\n </Bind>\n </Cell>\n </Grid>\n {data.accessLevel === CUSTOM_ACCESS && (\n <React.Fragment>\n <Elevation z={1} style={{ marginTop: 10 }}>\n <Grid>\n <Cell span={12}>\n <Typography use={\"overline\"}>{t`API Keys`}</Typography>\n </Cell>\n <Cell span={12}>\n <Bind name={\"apiKeyAccessScope\"}>\n <Select label={t`Access Scope`}>\n <option\n value={NO_ACCESS}\n >{t`No access`}</option>\n <option\n value={FULL_ACCESS}\n >{t`Full access`}</option>\n </Select>\n </Bind>\n </Cell>\n </Grid>\n </Elevation>\n <Elevation z={1} style={{ marginTop: 10 }}>\n <Grid>\n <Cell span={12}>\n <Typography use={\"overline\"}>{t`Groups`}</Typography>\n </Cell>\n <Cell span={12}>\n <Bind name={\"groupAccessScope\"}>\n <Select label={t`Access Scope`}>\n <option\n value={NO_ACCESS}\n >{t`No access`}</option>\n <option\n value={FULL_ACCESS}\n >{t`Full access`}</option>\n </Select>\n </Bind>\n </Cell>\n </Grid>\n </Elevation>\n </React.Fragment>\n )}\n </Fragment>\n );\n }}\n </Form>\n );\n};\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.tsx"],"names":["React","i18n","AccordionItem","ReactComponent","SecurityIcon","SecurityPermissions","PermissionRendererPlugin","t","ns","render","props"],"mappings":";;;;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,IAAT,QAAqB,kBAArB;AACA,SAASC,aAAT,QAA8B,sBAA9B;AACA,SAASC,cAAc,IAAIC,YAA3B,QAA+C,2DAA/C;AACA,SAASC,mBAAT;AACA,SAASC,wBAAT,QAAyC,oDAAzC;AAEA,IAAMC,CAAC,GAAGN,IAAI,CAACO,EAAL,CAAQ,qDAAR,CAAV;AAEA,eAAe,IAAIF,wBAAJ,CAA6B;AACxCG,EAAAA,MADwC,kBACjCC,KADiC,EAC1B;AACV,wBACI,oBAAC,aAAD;AACI,MAAA,IAAI,eAAE,oBAAC,YAAD,OADV;AAEI,MAAA,KAAK,EAAEH,CAAF,6EAFT;AAGI,MAAA,WAAW,EAAEA,CAAF,8GAHf;AAII,qBAAa;AAJjB,oBAMI,oBAAC,mBAAD,EAAyBG,KAAzB,CANJ,CADJ;AAUH;AAZuC,CAA7B,CAAf","sourcesContent":["import React from \"react\";\nimport { i18n } from \"@webiny/app/i18n\";\nimport { AccordionItem } from \"@webiny/ui/Accordion\";\nimport { ReactComponent as SecurityIcon } from \"@webiny/app-admin/assets/icons/baseline-security-24px.svg\";\nimport { SecurityPermissions } from \"./SecurityPermissions\";\nimport { PermissionRendererPlugin } from \"@webiny/app-admin/plugins/PermissionRendererPlugin\";\n\nconst t = i18n.ns(\"app-security-admin-users/plugins/permissionRenderer\");\n\nexport default new PermissionRendererPlugin({\n render(props) {\n return (\n <AccordionItem\n icon={<SecurityIcon />}\n title={t`Security`}\n description={t`Manage Security app access permissions.`}\n data-testid={\"permission.security\"}\n >\n <SecurityPermissions {...props} />\n </AccordionItem>\n );\n }\n});\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["routes.tsx"],"names":["React","Helmet","Route","AdminLayout","SecureRoute","Groups","ApiKeys","Permission","plugins","name","type","route"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,MAAP,MAAmB,cAAnB;AACA,SAASC,KAAT,QAAsB,sBAAtB;AACA,SAASC,WAAT,QAA4B,0CAA5B;AACA,SAASC,WAAT,QAA4B,iCAA5B;AAEA,SAASC,MAAT;AACA,SAASC,OAAT;AACA,SAASC,UAAT;AAEA,IAAMC,OAAsB,GAAG,CAC3B;AACIC,EAAAA,IAAI,EAAE,uBADV;AAEIC,EAAAA,IAAI,EAAE,OAFV;AAGIC,EAAAA,KAAK,eACD,oBAAC,KAAD;AACI,IAAA,KAAK,MADT;AAEI,IAAA,IAAI,EAAE,2BAFV;AAGI,IAAA,MAAM,EAAE;AAAA,0BACJ,oBAAC,WAAD;AAAa,QAAA,UAAU,EAAEJ,UAAU,CAACF;AAApC,sBACI,oBAAC,WAAD,qBACI,oBAAC,MAAD;AAAQ,QAAA,KAAK,EAAE;AAAf,QADJ,eAEI,oBAAC,MAAD,OAFJ,CADJ,CADI;AAAA;AAHZ;AAJR,CAD2B,EAmB3B;AACII,EAAAA,IAAI,EAAE,yBADV;AAEIC,EAAAA,IAAI,EAAE,OAFV;AAGIC,EAAAA,KAAK,eACD,oBAAC,KAAD;AACI,IAAA,KAAK,MADT;AAEI,IAAA,IAAI,EAAE,6BAFV;AAGI,IAAA,MAAM,EAAE;AAAA,0BACJ,oBAAC,WAAD;AAAa,QAAA,UAAU,EAAEJ,UAAU,CAACD;AAApC,sBACI,oBAAC,WAAD;AAAa,QAAA,KAAK,EAAE;AAApB,sBACI,oBAAC,OAAD,OADJ,CADJ,CADI;AAAA;AAHZ;AAJR,CAnB2B,CAA/B;AAsCA,eAAeE,OAAf","sourcesContent":["import React from \"react\";\nimport Helmet from \"react-helmet\";\nimport { Route } from \"@webiny/react-router\";\nimport { AdminLayout } from \"@webiny/app-admin/components/AdminLayout\";\nimport { SecureRoute } from \"@webiny/app-security/components\";\nimport { RoutePlugin } from \"@webiny/app/types\";\nimport { Groups } from \"~/ui/views/Groups\";\nimport { ApiKeys } from \"~/ui/views/ApiKeys\";\nimport { Permission } from \"./constants\";\n\nconst plugins: RoutePlugin[] = [\n {\n name: \"route-security-groups\",\n type: \"route\",\n route: (\n <Route\n exact\n path={\"/access-management/groups\"}\n render={() => (\n <SecureRoute permission={Permission.Groups}>\n <AdminLayout>\n <Helmet title={\"Access Management - Groups\"} />\n <Groups />\n </AdminLayout>\n </SecureRoute>\n )}\n />\n )\n },\n {\n name: \"route-security-api-keys\",\n type: \"route\",\n route: (\n <Route\n exact\n path={\"/access-management/api-keys\"}\n render={() => (\n <SecureRoute permission={Permission.ApiKeys}>\n <AdminLayout title={\"Access Management - API Keys\"}>\n <ApiKeys />\n </AdminLayout>\n </SecureRoute>\n )}\n />\n )\n }\n];\n\nexport default plugins;\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["secureRouteError.tsx"],"names":["React","NotAuthorizedError","plugin","type","name","render"],"mappings":"AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,SAASC,kBAAT;AAIA,IAAMC,MAA8B,GAAG;AACnCC,EAAAA,IAAI,EAAE,oBAD6B;AAEnCC,EAAAA,IAAI,EAAE,oBAF6B;AAGnCC,EAAAA,MAHmC,oBAGN;AACzB,wBAAO,oBAAC,kBAAD,OAAP;AACH;AALkC,CAAvC;AAQA,eAAeH,MAAf","sourcesContent":["import * as React from \"react\";\nimport { Plugin } from \"@webiny/plugins/types\";\nimport { NotAuthorizedError } from \"~/components/NotAuthorizedError\";\n\ntype SecureRouteErrorPlugin = Plugin & { render: () => React.ReactNode };\n\nconst plugin: SecureRouteErrorPlugin = {\n type: \"secure-route-error\",\n name: \"secure-route-error\",\n render(): React.ReactElement {\n return <NotAuthorizedError />;\n }\n};\n\nexport default plugin;\n"]}
package/types.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { SecurityPermission } from "@webiny/app-security/types";
2
+ export interface Group {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ slug: string;
7
+ system?: boolean;
8
+ }
9
+ export interface ApiKey {
10
+ id: string;
11
+ token: string;
12
+ name: string;
13
+ description: string;
14
+ permissions: SecurityPermission[];
15
+ }
package/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/types.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import { InputElement } from "@webiny/app-admin/ui/elements/form/InputElement";
3
+ import { FormFieldElementRenderProps } from "@webiny/app-admin/ui/elements/form/FormFieldElement";
3
4
  export declare class GroupAutocompleteElement extends InputElement {
4
- render({ formProps }: any): React.ReactElement;
5
+ render(props: FormFieldElementRenderProps): React.ReactElement;
5
6
  }
@@ -18,13 +18,26 @@ export var GroupAutocompleteElement = /*#__PURE__*/function (_InputElement) {
18
18
 
19
19
  _createClass(GroupAutocompleteElement, [{
20
20
  key: "render",
21
- value: function render(_ref) {
22
- var formProps = _ref.formProps;
23
- var _ref2 = formProps,
24
- Bind = _ref2.Bind;
21
+ value: function render(props) {
22
+ var formProps = props.formProps;
23
+ var _ref = formProps,
24
+ Bind = _ref.Bind;
25
+ var validators = this.config.validators;
26
+ /**
27
+ * TODO @ts-refactor @bruno
28
+ * Figure out what can validators be.
29
+ */
30
+
31
+ if (validators && typeof validators !== "function") {
32
+ console.log("packages/app-security-access-management/src/ui/elements/GroupAutocompleteElement.tsx validators is set but not a function.");
33
+ console.log(validators);
34
+ }
35
+
25
36
  return /*#__PURE__*/React.createElement(Bind, {
26
37
  name: this.id,
27
- validators: this.config.validators
38
+ validators: typeof validators === "function" ? validators({
39
+ formProps: formProps
40
+ }) : []
28
41
  }, /*#__PURE__*/React.createElement(GroupAutocomplete, {
29
42
  label: "Group"
30
43
  }));
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["GroupAutocompleteElement.tsx"],"names":["React","InputElement","GroupAutocomplete","GroupAutocompleteElement","props","formProps","Bind","validators","config","console","log","id"],"mappings":";;;;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AAEA,SAASC,YAAT,QAA6B,iDAA7B;AACA,SAASC,iBAAT;AAGA,WAAaC,wBAAb;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA,WACI,gBAAuBC,KAAvB,EAA+E;AAC3E,UAAQC,SAAR,GAAsBD,KAAtB,CAAQC,SAAR;AACA,iBAAiBA,SAAjB;AAAA,UAAQC,IAAR,QAAQA,IAAR;AACA,UAAMC,UAAU,GAAG,KAAKC,MAAL,CAAYD,UAA/B;AACA;AACR;AACA;AACA;;AACQ,UAAIA,UAAU,IAAI,OAAOA,UAAP,KAAsB,UAAxC,EAAoD;AAChDE,QAAAA,OAAO,CAACC,GAAR,CACI,4HADJ;AAGAD,QAAAA,OAAO,CAACC,GAAR,CAAYH,UAAZ;AACH;;AACD,0BACI,oBAAC,IAAD;AACI,QAAA,IAAI,EAAE,KAAKI,EADf;AAEI,QAAA,UAAU,EAAE,OAAOJ,UAAP,KAAsB,UAAtB,GAAmCA,UAAU,CAAC;AAAEF,UAAAA,SAAS,EAATA;AAAF,SAAD,CAA7C,GAA+D;AAF/E,sBAII,oBAAC,iBAAD;AAAmB,QAAA,KAAK,EAAE;AAA1B,QAJJ,CADJ;AAQH;AAvBL;;AAAA;AAAA,EAA8CJ,YAA9C","sourcesContent":["import React from \"react\";\nimport { FormRenderPropParams } from \"@webiny/form\";\nimport { InputElement } from \"@webiny/app-admin/ui/elements/form/InputElement\";\nimport { GroupAutocomplete } from \"~/components/GroupAutocomplete\";\nimport { FormFieldElementRenderProps } from \"@webiny/app-admin/ui/elements/form/FormFieldElement\";\n\nexport class GroupAutocompleteElement extends InputElement {\n public override render(props: FormFieldElementRenderProps): React.ReactElement {\n const { formProps } = props;\n const { Bind } = formProps as FormRenderPropParams;\n const validators = this.config.validators;\n /**\n * TODO @ts-refactor @bruno\n * Figure out what can validators be.\n */\n if (validators && typeof validators !== \"function\") {\n console.log(\n \"packages/app-security-access-management/src/ui/elements/GroupAutocompleteElement.tsx validators is set but not a function.\"\n );\n console.log(validators);\n }\n return (\n <Bind\n name={this.id}\n validators={typeof validators === \"function\" ? validators({ formProps }) : []}\n >\n <GroupAutocomplete label={\"Group\"} />\n </Bind>\n );\n }\n}\n"]}
@@ -1,3 +1,5 @@
1
- /// <reference types="react" />
2
- declare const ApiKeyForm: () => JSX.Element;
3
- export default ApiKeyForm;
1
+ import React from "react";
2
+ export interface ApiKeyFormProps {
3
+ [key: string]: any;
4
+ }
5
+ export declare const ApiKeyForm: React.FC<ApiKeyFormProps>;
@@ -36,8 +36,7 @@ var ButtonWrapper = /*#__PURE__*/styled("div", {
36
36
  display: "flex",
37
37
  justifyContent: "space-between"
38
38
  });
39
-
40
- var ApiKeyForm = function ApiKeyForm() {
39
+ export var ApiKeyForm = function ApiKeyForm() {
41
40
  var _useRouter = useRouter(),
42
41
  location = _useRouter.location,
43
42
  history = _useRouter.history;
@@ -236,9 +235,9 @@ var ApiKeyForm = function ApiKeyForm() {
236
235
  return history.push("/access-management/api-keys");
237
236
  }
238
237
  }, t(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["Cancel"])))), /*#__PURE__*/React.createElement(ButtonPrimary, {
239
- onClick: form.submit
238
+ onClick: function onClick(ev) {
239
+ form.submit(ev);
240
+ }
240
241
  }, t(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["Save API key"])))))));
241
242
  });
242
- };
243
-
244
- export default ApiKeyForm;
243
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ApiKeyForm.tsx"],"names":["React","useCallback","useMutation","useQuery","get","useRouter","i18n","Form","Grid","Cell","Input","ButtonDefault","ButtonIcon","ButtonPrimary","CopyButton","CircularProgress","FormElementMessage","Permissions","validation","SimpleForm","SimpleFormFooter","SimpleFormContent","SimpleFormHeader","Typography","useSnackbar","pickDataForAPI","GQL","SnackbarAction","isEmpty","EmptyView","ReactComponent","AddIcon","styled","t","ns","ButtonWrapper","display","justifyContent","ApiKeyForm","location","history","showSnackbar","newEntry","URLSearchParams","search","id","getQuery","READ_API_KEY","variables","skip","onCompleted","data","error","security","apiKey","push","message","CREATE_API_KEY","refetchQueries","query","LIST_API_KEYS","create","createMutation","UPDATE_API_KEY","update","updateMutation","loading","find","item","onSubmit","permissions","length","timeout","dismissesOnAction","action","isUpdate","createdOn","operation","args","response","showEmptyView","form","Bind","name","token","background","padding","paddingLeft","lineHeight","verticalAlign","position","right","bind","ev","submit"],"mappings":"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","sourcesContent":["import React, { useCallback } from \"react\";\nimport { useMutation, useQuery } from \"@apollo/react-hooks\";\nimport get from \"lodash/get\";\nimport { useRouter } from \"@webiny/react-router\";\nimport { i18n } from \"@webiny/app/i18n\";\nimport { Form } from \"@webiny/form\";\nimport { Grid, Cell } from \"@webiny/ui/Grid\";\nimport { Input } from \"@webiny/ui/Input\";\nimport { ButtonDefault, ButtonIcon, ButtonPrimary, CopyButton } from \"@webiny/ui/Button\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { FormElementMessage } from \"@webiny/ui/FormElementMessage\";\nimport { Permissions } from \"@webiny/app-admin/components/Permissions\";\nimport { validation } from \"@webiny/validation\";\nimport {\n SimpleForm,\n SimpleFormFooter,\n SimpleFormContent,\n SimpleFormHeader\n} from \"@webiny/app-admin/components/SimpleForm\";\nimport { Typography } from \"@webiny/ui/Typography\";\nimport { useSnackbar } from \"@webiny/app-admin/hooks/useSnackbar\";\nimport { pickDataForAPI } from \"./utils\";\nimport * as GQL from \"./graphql\";\nimport { SnackbarAction } from \"@webiny/ui/Snackbar\";\nimport isEmpty from \"lodash/isEmpty\";\nimport EmptyView from \"@webiny/app-admin/components/EmptyView\";\nimport { ReactComponent as AddIcon } from \"@webiny/app-admin/assets/icons/add-18px.svg\";\nimport styled from \"@emotion/styled\";\nimport { ApiKey } from \"~/types\";\n\nconst t = i18n.ns(\"app-security-admin-users/admin/api-keys/form\");\n\nconst ButtonWrapper = styled(\"div\")({\n display: \"flex\",\n justifyContent: \"space-between\"\n});\nexport interface ApiKeyFormProps {\n // TODO @ts-refactor delete and go up the tree and sort it out\n [key: string]: any;\n}\nexport const ApiKeyForm: React.FC<ApiKeyFormProps> = () => {\n const { location, history } = useRouter();\n const { showSnackbar } = useSnackbar();\n const newEntry = new URLSearchParams(location.search).get(\"new\") === \"true\";\n const id = new URLSearchParams(location.search).get(\"id\");\n\n const getQuery = useQuery(GQL.READ_API_KEY, {\n variables: { id },\n skip: !id,\n onCompleted: data => {\n if (!data) {\n return;\n }\n\n const { error } = data.security.apiKey;\n if (error) {\n history.push(\"/access-management/api-keys\");\n showSnackbar(error.message);\n }\n }\n });\n\n const [create, createMutation] = useMutation(GQL.CREATE_API_KEY, {\n refetchQueries: [{ query: GQL.LIST_API_KEYS }]\n });\n\n const [update, updateMutation] = useMutation(GQL.UPDATE_API_KEY, {\n refetchQueries: [{ query: GQL.LIST_API_KEYS }]\n });\n\n const loading = [getQuery, createMutation, updateMutation].find(item => item.loading);\n\n const onSubmit = useCallback(\n async data => {\n if (!data.permissions || !data.permissions.length) {\n showSnackbar(t`You must configure permissions before saving!`, {\n timeout: 60000,\n dismissesOnAction: true,\n action: <SnackbarAction label={\"OK\"} />\n });\n return;\n }\n\n const isUpdate = data.createdOn;\n const [operation, args] = isUpdate\n ? [update, { variables: { id: data.id, data: pickDataForAPI(data) } }]\n : [create, { variables: { data: pickDataForAPI(data) } }];\n\n const response = await operation(args);\n\n const { error } = response.data.security.apiKey;\n if (error) {\n return showSnackbar(error.message);\n }\n\n const { id } = response.data.security.apiKey.data;\n\n !isUpdate && history.push(`/access-management/api-keys?id=${id}`);\n showSnackbar(t`API key saved successfully.`);\n },\n [id]\n );\n\n const data: ApiKey[] = get(getQuery, \"data.security.apiKey.data\", {});\n\n const showEmptyView = !newEntry && !loading && isEmpty(data);\n // Render \"No content\" selected view.\n if (showEmptyView) {\n return (\n <EmptyView\n title={t`Click on the left side list to display API key details or create a...`}\n action={\n <ButtonDefault\n data-testid=\"new-record-button\"\n onClick={() => history.push(\"/access-management/api-keys?new=true\")}\n >\n <ButtonIcon icon={<AddIcon />} /> {t`New API Key`}\n </ButtonDefault>\n }\n />\n );\n }\n\n return (\n <Form data={data} onSubmit={onSubmit}>\n {({ data, form, Bind }) => {\n return (\n <SimpleForm>\n {loading && <CircularProgress />}\n <SimpleFormHeader title={data.name ? data.name : \"Untitled\"} />\n <SimpleFormContent>\n <Grid>\n <Cell span={12}>\n <Bind name=\"name\" validators={validation.create(\"required\")}>\n <Input label={t`Name`} />\n </Bind>\n </Cell>\n </Grid>\n <Grid>\n <Cell span={12}>\n <Bind\n name=\"description\"\n validators={validation.create(\"required\")}\n >\n <Input label={t`Description`} rows={4} />\n </Bind>\n </Cell>\n </Grid>\n <Grid>\n <Cell span={12}>\n <div>\n <Typography use={\"subtitle1\"}>{t`Token`}</Typography>\n {data.token ? (\n <div\n style={{\n background: \"var(--mdc-theme-background)\",\n padding: \"8px\",\n paddingLeft: \"16px\"\n }}\n >\n <span\n style={{\n lineHeight: \"48px\",\n verticalAlign: \"middle\"\n }}\n >\n {data.token}\n </span>\n <span\n style={{ position: \"absolute\", right: \"32px\" }}\n >\n <CopyButton\n value={data.token}\n onCopy={() =>\n showSnackbar(\"Successfully copied!\")\n }\n />\n </span>\n </div>\n ) : (\n <FormElementMessage>\n Your token will be shown once you submit the form.\n </FormElementMessage>\n )}\n </div>\n </Cell>\n </Grid>\n <Grid>\n <Cell span={12}>\n <Typography use={\"subtitle1\"}>{t`Permissions`}</Typography>\n </Cell>\n <Cell span={12}>\n <Bind name={\"permissions\"} defaultValue={[]}>\n {bind => <Permissions id={data.id || \"new\"} {...bind} />}\n </Bind>\n </Cell>\n </Grid>\n </SimpleFormContent>\n <SimpleFormFooter>\n <ButtonWrapper>\n <ButtonDefault\n onClick={() => history.push(\"/access-management/api-keys\")}\n >{t`Cancel`}</ButtonDefault>\n <ButtonPrimary\n onClick={ev => {\n form.submit(ev);\n }}\n >{t`Save API key`}</ButtonPrimary>\n </ButtonWrapper>\n </SimpleFormFooter>\n </SimpleForm>\n );\n }}\n </Form>\n );\n};\n"]}
@@ -1,3 +1,8 @@
1
- /// <reference types="react" />
2
- declare const ApiKeys: ({ formProps, listProps }: any) => JSX.Element;
3
- export default ApiKeys;
1
+ import * as React from "react";
2
+ import { ApiKeysDataListProps } from "./ApiKeysDataList";
3
+ import { ApiKeyFormProps } from "./ApiKeyForm";
4
+ export interface ApiKeysProps {
5
+ listProps?: ApiKeysDataListProps;
6
+ formProps?: ApiKeyFormProps;
7
+ }
8
+ export declare const ApiKeys: React.FC<ApiKeysProps>;
@@ -1,12 +1,11 @@
1
1
  import * as React from "react";
2
2
  import { SplitView, LeftPanel, RightPanel } from "@webiny/app-admin/components/SplitView";
3
- import ApiKeysDataList from "./ApiKeysDataList";
4
- import ApiKeyForm from "./ApiKeyForm";
5
-
6
- var ApiKeys = function ApiKeys(_ref) {
7
- var formProps = _ref.formProps,
8
- listProps = _ref.listProps;
3
+ import { ApiKeysDataList } from "./ApiKeysDataList";
4
+ import { ApiKeyForm } from "./ApiKeyForm";
5
+ export var ApiKeys = function ApiKeys(_ref) {
6
+ var _ref$formProps = _ref.formProps,
7
+ formProps = _ref$formProps === void 0 ? {} : _ref$formProps,
8
+ _ref$listProps = _ref.listProps,
9
+ listProps = _ref$listProps === void 0 ? {} : _ref$listProps;
9
10
  return /*#__PURE__*/React.createElement(SplitView, null, /*#__PURE__*/React.createElement(LeftPanel, null, /*#__PURE__*/React.createElement(ApiKeysDataList, listProps)), /*#__PURE__*/React.createElement(RightPanel, null, /*#__PURE__*/React.createElement(ApiKeyForm, formProps)));
10
- };
11
-
12
- export default ApiKeys;
11
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ApiKeys.tsx"],"names":["React","SplitView","LeftPanel","RightPanel","ApiKeysDataList","ApiKeyForm","ApiKeys","formProps","listProps"],"mappings":"AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AACA,SAASC,SAAT,EAAoBC,SAApB,EAA+BC,UAA/B,QAAiD,wCAAjD;AACA,SAASC,eAAT;AACA,SAASC,UAAT;AAMA,OAAO,IAAMC,OAA+B,GAAG,SAAlCA,OAAkC,OAAwC;AAAA,4BAArCC,SAAqC;AAAA,MAArCA,SAAqC,+BAAzB,EAAyB;AAAA,4BAArBC,SAAqB;AAAA,MAArBA,SAAqB,+BAAT,EAAS;AACnF,sBACI,oBAAC,SAAD,qBACI,oBAAC,SAAD,qBACI,oBAAC,eAAD,EAAqBA,SAArB,CADJ,CADJ,eAII,oBAAC,UAAD,qBACI,oBAAC,UAAD,EAAgBD,SAAhB,CADJ,CAJJ,CADJ;AAUH,CAXM","sourcesContent":["import * as React from \"react\";\nimport { SplitView, LeftPanel, RightPanel } from \"@webiny/app-admin/components/SplitView\";\nimport { ApiKeysDataList, ApiKeysDataListProps } from \"./ApiKeysDataList\";\nimport { ApiKeyForm, ApiKeyFormProps } from \"./ApiKeyForm\";\n\nexport interface ApiKeysProps {\n listProps?: ApiKeysDataListProps;\n formProps?: ApiKeyFormProps;\n}\nexport const ApiKeys: React.FC<ApiKeysProps> = ({ formProps = {}, listProps = {} }) => {\n return (\n <SplitView>\n <LeftPanel>\n <ApiKeysDataList {...listProps} />\n </LeftPanel>\n <RightPanel>\n <ApiKeyForm {...formProps} />\n </RightPanel>\n </SplitView>\n );\n};\n"]}
@@ -1,3 +1,5 @@
1
- /// <reference types="react" />
2
- declare const ApiKeysDataList: () => JSX.Element;
3
- export default ApiKeysDataList;
1
+ import React from "react";
2
+ export interface ApiKeysDataListProps {
3
+ [key: string]: any;
4
+ }
5
+ export declare const ApiKeysDataList: React.FC<ApiKeysDataListProps>;
@@ -21,37 +21,28 @@ import { useConfirmationDialog } from "@webiny/app-admin/hooks/useConfirmationDi
21
21
  import * as GQL from "./graphql";
22
22
  import { ReactComponent as AddIcon } from "@webiny/app-admin/assets/icons/add-18px.svg";
23
23
  import { ReactComponent as FilterIcon } from "@webiny/app-admin/assets/icons/filter-24px.svg";
24
- import { serializeSorters, deserializeSorters } from "../utils";
24
+ import { deserializeSorters } from "../utils";
25
25
  var t = i18n.ns("app-security/admin/groups/data-list");
26
26
  var SORTERS = [{
27
27
  label: t(_templateObject || (_templateObject = _taggedTemplateLiteral(["Newest to oldest"]))),
28
- sorters: {
29
- createdOn: "desc"
30
- }
28
+ sorter: "createdOn_DESC"
31
29
  }, {
32
30
  label: t(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["Oldest to newest"]))),
33
- sorters: {
34
- createdOn: "asc"
35
- }
31
+ sorter: "createdOn_ASC"
36
32
  }, {
37
33
  label: t(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["Name A-Z"]))),
38
- sorters: {
39
- name: "asc"
40
- }
34
+ sorter: "name_ASC"
41
35
  }, {
42
36
  label: t(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["Name Z-A"]))),
43
- sorters: {
44
- name: "desc"
45
- }
37
+ sorter: "name_DESC"
46
38
  }];
47
-
48
- var ApiKeysDataList = function ApiKeysDataList() {
39
+ export var ApiKeysDataList = function ApiKeysDataList() {
49
40
  var _useState = useState(""),
50
41
  _useState2 = _slicedToArray(_useState, 2),
51
42
  filter = _useState2[0],
52
43
  setFilter = _useState2[1];
53
44
 
54
- var _useState3 = useState(serializeSorters(SORTERS[0].sorters)),
45
+ var _useState3 = useState(SORTERS[0].sorter),
55
46
  _useState4 = _slicedToArray(_useState3, 2),
56
47
  sort = _useState4[0],
57
48
  setSort = _useState4[1];
@@ -78,11 +69,10 @@ var ApiKeysDataList = function ApiKeysDataList() {
78
69
  return list;
79
70
  }
80
71
 
81
- var _Object$entries = Object.entries(deserializeSorters(sort)),
82
- _Object$entries2 = _slicedToArray(_Object$entries, 1),
83
- _Object$entries2$ = _slicedToArray(_Object$entries2[0], 2),
84
- key = _Object$entries2$[0],
85
- value = _Object$entries2$[1];
72
+ var _deserializeSorters = deserializeSorters(sort),
73
+ _deserializeSorters2 = _slicedToArray(_deserializeSorters, 2),
74
+ key = _deserializeSorters2[0],
75
+ value = _deserializeSorters2[1];
86
76
 
87
77
  return orderBy(list, [key], [value]);
88
78
  }, [sort]);
@@ -153,10 +143,10 @@ var ApiKeysDataList = function ApiKeysDataList() {
153
143
  label: t(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["Sort by"])))
154
144
  }, SORTERS.map(function (_ref3) {
155
145
  var label = _ref3.label,
156
- sorters = _ref3.sorters;
146
+ sorter = _ref3.sorter;
157
147
  return /*#__PURE__*/React.createElement("option", {
158
148
  key: label,
159
- value: serializeSorters(sorters)
149
+ value: sorter
160
150
  }, label);
161
151
  })))));
162
152
  }, [sort]);
@@ -204,6 +194,4 @@ var ApiKeysDataList = function ApiKeysDataList() {
204
194
  }))));
205
195
  }));
206
196
  });
207
- };
208
-
209
- export default ApiKeysDataList;
197
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ApiKeysDataList.tsx"],"names":["React","useCallback","useMemo","useState","orderBy","i18n","DataList","ScrollList","ListItem","ListItemText","ListItemTextSecondary","ListItemMeta","ListActions","DataListModalOverlayAction","DataListModalOverlay","ButtonIcon","ButtonSecondary","DeleteIcon","Cell","Grid","Select","useRouter","SearchUI","useSnackbar","useQuery","useMutation","useConfirmationDialog","GQL","ReactComponent","AddIcon","FilterIcon","deserializeSorters","t","ns","SORTERS","label","sorter","ApiKeysDataList","filter","setFilter","sort","setSort","history","location","showSnackbar","dataTestId","showConfirmation","filterAPIKey","description","name","toLowerCase","includes","sortKeys","list","key","value","LIST_API_KEYS","listResponse","data","listLoading","loading","DELETE_API_KEY","refetchQueries","query","deleteIt","deleteLoading","security","apiKeys","id","URLSearchParams","search","get","deleteItem","item","variables","error","deleteApiKey","message","push","groupsDataListModalOverlay","map","filteredData"],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo, useState } from \"react\";\nimport orderBy from \"lodash/orderBy\";\nimport { i18n } from \"@webiny/app/i18n\";\nimport {\n DataList,\n ScrollList,\n ListItem,\n ListItemText,\n ListItemTextSecondary,\n ListItemMeta,\n ListActions,\n DataListModalOverlayAction,\n DataListModalOverlay\n} from \"@webiny/ui/List\";\nimport { ButtonIcon, ButtonSecondary } from \"@webiny/ui/Button\";\nimport { DeleteIcon } from \"@webiny/ui/List/DataList/icons\";\nimport { Cell, Grid } from \"@webiny/ui/Grid\";\nimport { Select } from \"@webiny/ui/Select\";\nimport { useRouter } from \"@webiny/react-router\";\nimport SearchUI from \"@webiny/app-admin/components/SearchUI\";\nimport { useSnackbar } from \"@webiny/app-admin/hooks/useSnackbar\";\nimport { useQuery, useMutation } from \"@apollo/react-hooks\";\nimport { useConfirmationDialog } from \"@webiny/app-admin/hooks/useConfirmationDialog\";\nimport * as GQL from \"./graphql\";\nimport { ReactComponent as AddIcon } from \"@webiny/app-admin/assets/icons/add-18px.svg\";\nimport { ReactComponent as FilterIcon } from \"@webiny/app-admin/assets/icons/filter-24px.svg\";\nimport { deserializeSorters } from \"../utils\";\nimport { ApiKey } from \"~/types\";\n\nconst t = i18n.ns(\"app-security/admin/groups/data-list\");\n\nconst SORTERS = [\n {\n label: t`Newest to oldest`,\n sorter: \"createdOn_DESC\"\n },\n {\n label: t`Oldest to newest`,\n sorter: \"createdOn_ASC\"\n },\n {\n label: t`Name A-Z`,\n sorter: \"name_ASC\"\n },\n {\n label: t`Name Z-A`,\n sorter: \"name_DESC\"\n }\n];\nexport interface ApiKeysDataListProps {\n // TODO @ts-refactor delete and go up the tree and sort it out\n [key: string]: any;\n}\nexport const ApiKeysDataList: React.FC<ApiKeysDataListProps> = () => {\n const [filter, setFilter] = useState(\"\");\n const [sort, setSort] = useState<string>(SORTERS[0].sorter);\n const { history, location } = useRouter();\n const { showSnackbar } = useSnackbar();\n const { showConfirmation } = useConfirmationDialog({\n dataTestId: \"default-data-list.delete-dialog\"\n });\n\n const filterAPIKey = useCallback(\n ({ description, name }) => {\n return (\n (description && description.toLowerCase().includes(filter)) ||\n name.toLowerCase().includes(filter)\n );\n },\n [filter]\n );\n\n const sortKeys = useCallback(\n list => {\n if (!sort) {\n return list;\n }\n const [key, value] = deserializeSorters(sort);\n return orderBy(list, [key], [value]);\n },\n [sort]\n );\n\n const { data: listResponse, loading: listLoading } = useQuery(GQL.LIST_API_KEYS);\n\n const [deleteIt, { loading: deleteLoading }] = useMutation(GQL.DELETE_API_KEY, {\n refetchQueries: [{ query: GQL.LIST_API_KEYS }]\n });\n\n const data = listLoading && !listResponse ? [] : listResponse.security.apiKeys.data;\n const id = new URLSearchParams(location.search).get(\"id\");\n\n const deleteItem = useCallback(\n item => {\n showConfirmation(async () => {\n const { data } = await deleteIt({\n variables: item\n });\n\n const { error } = data.security.deleteApiKey;\n if (error) {\n return showSnackbar(error.message);\n }\n\n showSnackbar(t`Api key \"{id}\" deleted.`({ id: item.id }));\n\n if (id === item.id) {\n history.push(`/access-management/api-keys`);\n }\n });\n },\n [id]\n );\n\n const groupsDataListModalOverlay = useMemo(\n () => (\n <DataListModalOverlay>\n <Grid>\n <Cell span={12}>\n <Select value={sort} onChange={setSort} label={t`Sort by`}>\n {SORTERS.map(({ label, sorter }) => {\n return (\n <option key={label} value={sorter}>\n {label}\n </option>\n );\n })}\n </Select>\n </Cell>\n </Grid>\n </DataListModalOverlay>\n ),\n [sort]\n );\n\n const filteredData = filter === \"\" ? data : data.filter(filterAPIKey);\n const list = sortKeys(filteredData);\n\n return (\n <DataList\n title={t`API Keys`}\n actions={\n <ButtonSecondary\n data-testid=\"new-record-button\"\n onClick={() => history.push(\"/access-management/api-keys?new=true\")}\n >\n <ButtonIcon icon={<AddIcon />} /> {t`New API Key`}\n </ButtonSecondary>\n }\n data={list}\n loading={listLoading || deleteLoading}\n search={\n <SearchUI\n value={filter}\n onChange={setFilter}\n inputPlaceholder={t`Search API keys`}\n />\n }\n modalOverlay={groupsDataListModalOverlay}\n modalOverlayAction={\n <DataListModalOverlayAction\n icon={<FilterIcon />}\n data-testid={\"default-data-list.filter\"}\n />\n }\n >\n {({ data }: { data: ApiKey[] }) => (\n <ScrollList data-testid=\"default-data-list\">\n {data.map(item => (\n <ListItem key={item.id} selected={item.id === id}>\n <ListItemText\n onClick={() =>\n history.push(`/access-management/api-keys?id=${item.id}`)\n }\n >\n {item.name}\n <ListItemTextSecondary>{item.description}</ListItemTextSecondary>\n </ListItemText>\n\n <ListItemMeta>\n <ListActions>\n <DeleteIcon\n onClick={() => deleteItem(item)}\n data-testid={\"default-data-list.delete\"}\n />\n </ListActions>\n </ListItemMeta>\n </ListItem>\n ))}\n </ScrollList>\n )}\n </DataList>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
- export declare const LIST_API_KEYS: any;
2
- export declare const READ_API_KEY: any;
3
- export declare const CREATE_API_KEY: any;
4
- export declare const UPDATE_API_KEY: any;
5
- export declare const DELETE_API_KEY: any;
1
+ export declare const LIST_API_KEYS: import("graphql").DocumentNode;
2
+ export declare const READ_API_KEY: import("graphql").DocumentNode;
3
+ export declare const CREATE_API_KEY: import("graphql").DocumentNode;
4
+ export declare const UPDATE_API_KEY: import("graphql").DocumentNode;
5
+ export declare const DELETE_API_KEY: import("graphql").DocumentNode;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["graphql.ts"],"names":["gql","fields","LIST_API_KEYS","READ_API_KEY","CREATE_API_KEY","UPDATE_API_KEY","DELETE_API_KEY"],"mappings":";;;;AAAA,OAAOA,GAAP,MAAgB,aAAhB;AAEA,IAAMC,MAAM,qFAAZ;AASA,OAAO,IAAMC,aAAa,GAAGF,GAAH,8PAKLC,MALK,CAAnB;AAYP,OAAO,IAAME,YAAY,GAAGH,GAAH,iXAKHC,MALG,CAAlB;AAgBP,OAAO,IAAMG,cAAc,GAAGJ,GAAH,2aAKLC,MALK,CAApB;AAiBP,OAAO,IAAMI,cAAc,GAAGL,GAAH,8bAKLC,MALK,CAApB;AAiBP,OAAO,IAAMK,cAAc,GAAGN,GAAH,mUAApB","sourcesContent":["import gql from \"graphql-tag\";\n\nconst fields = `\n id\n name\n description\n token\n permissions\n createdOn\n`;\n\nexport const LIST_API_KEYS = gql`\n query ListApiKeys {\n security {\n apiKeys: listApiKeys {\n data {\n ${fields}\n }\n }\n }\n }\n`;\n\nexport const READ_API_KEY = gql`\n query GetApiKey($id: ID!) {\n security {\n apiKey: getApiKey(id: $id){\n data {\n ${fields}\n }\n error {\n code\n message\n }\n }\n }\n }\n`;\n\nexport const CREATE_API_KEY = gql`\n mutation CreateApiKey($data: SecurityApiKeyInput!){\n security {\n apiKey: createApiKey(data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const UPDATE_API_KEY = gql`\n mutation UpdateApiKey($id: ID!, $data: SecurityApiKeyInput!){\n security {\n apiKey: updateApiKey(id: $id, data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const DELETE_API_KEY = gql`\n mutation DeleteApiKey($id: ID!) {\n security {\n deleteApiKey(id: $id) {\n data\n error {\n code\n message\n }\n }\n }\n }\n`;\n"]}
@@ -1 +1 @@
1
- export { default as ApiKeys } from "./ApiKeys";
1
+ export * from "./ApiKeys";
@@ -1 +1 @@
1
- export { default as ApiKeys } from "./ApiKeys";
1
+ export * from "./ApiKeys";
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":[],"mappings":"AAAA","sourcesContent":["export * from \"./ApiKeys\";\n"]}
@@ -1 +1,2 @@
1
- export declare const pickDataForAPI: (data: any) => any;
1
+ import { ApiKey } from "../../../types";
2
+ export declare const pickDataForAPI: (data: ApiKey) => Pick<ApiKey, "name" | "description" | "permissions">;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["utils.ts"],"names":["pickDataForAPI","data"],"mappings":";;AAGA,OAAO,IAAMA,cAAc,GAAG,SAAjBA,cAAiB,CAC1BC,IAD0B;AAAA,2BAGvB,MAAKA,IAAL,EAAW,CAAC,MAAD,EAAS,aAAT,EAAwB,aAAxB,CAAX,CAHuB;AAAA,CAAvB","sourcesContent":["import { pick } from \"lodash\";\nimport { ApiKey } from \"~/types\";\n\nexport const pickDataForAPI = (\n data: ApiKey\n): Pick<ApiKey, \"name\" | \"description\" | \"permissions\"> => ({\n ...pick(data, [\"name\", \"description\", \"permissions\"])\n});\n"]}
@@ -1,3 +1,8 @@
1
- /// <reference types="react" />
2
- declare const Groups: ({ formProps, listProps }: any) => JSX.Element;
3
- export default Groups;
1
+ import React from "react";
2
+ import { GroupsDataListProps } from "./GroupsDataList";
3
+ import { GroupsFormProps } from "./GroupsForm";
4
+ export interface GroupsProps {
5
+ listProps?: GroupsDataListProps;
6
+ formProps?: GroupsFormProps;
7
+ }
8
+ export declare const Groups: React.FC<GroupsProps>;
@@ -1,12 +1,11 @@
1
- import * as React from "react";
1
+ import React from "react";
2
2
  import { SplitView, LeftPanel, RightPanel } from "@webiny/app-admin/components/SplitView";
3
- import GroupsDataList from "./GroupsDataList";
4
- import GroupsForm from "./GroupsForm";
5
-
6
- var Groups = function Groups(_ref) {
7
- var formProps = _ref.formProps,
8
- listProps = _ref.listProps;
3
+ import { GroupsDataList } from "./GroupsDataList";
4
+ import { GroupsForm } from "./GroupsForm";
5
+ export var Groups = function Groups(_ref) {
6
+ var _ref$formProps = _ref.formProps,
7
+ formProps = _ref$formProps === void 0 ? {} : _ref$formProps,
8
+ _ref$listProps = _ref.listProps,
9
+ listProps = _ref$listProps === void 0 ? {} : _ref$listProps;
9
10
  return /*#__PURE__*/React.createElement(SplitView, null, /*#__PURE__*/React.createElement(LeftPanel, null, /*#__PURE__*/React.createElement(GroupsDataList, listProps)), /*#__PURE__*/React.createElement(RightPanel, null, /*#__PURE__*/React.createElement(GroupsForm, formProps)));
10
- };
11
-
12
- export default Groups;
11
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["Groups.tsx"],"names":["React","SplitView","LeftPanel","RightPanel","GroupsDataList","GroupsForm","Groups","formProps","listProps"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,SAAT,EAAoBC,SAApB,EAA+BC,UAA/B,QAAiD,wCAAjD;AACA,SAASC,cAAT;AACA,SAASC,UAAT;AAMA,OAAO,IAAMC,MAA6B,GAAG,SAAhCA,MAAgC,OAAwC;AAAA,4BAArCC,SAAqC;AAAA,MAArCA,SAAqC,+BAAzB,EAAyB;AAAA,4BAArBC,SAAqB;AAAA,MAArBA,SAAqB,+BAAT,EAAS;AACjF,sBACI,oBAAC,SAAD,qBACI,oBAAC,SAAD,qBACI,oBAAC,cAAD,EAAoBA,SAApB,CADJ,CADJ,eAII,oBAAC,UAAD,qBACI,oBAAC,UAAD,EAAgBD,SAAhB,CADJ,CAJJ,CADJ;AAUH,CAXM","sourcesContent":["import React from \"react\";\nimport { SplitView, LeftPanel, RightPanel } from \"@webiny/app-admin/components/SplitView\";\nimport { GroupsDataList, GroupsDataListProps } from \"./GroupsDataList\";\nimport { GroupsForm, GroupsFormProps } from \"./GroupsForm\";\n\nexport interface GroupsProps {\n listProps?: GroupsDataListProps;\n formProps?: GroupsFormProps;\n}\nexport const Groups: React.FC<GroupsProps> = ({ formProps = {}, listProps = {} }) => {\n return (\n <SplitView>\n <LeftPanel>\n <GroupsDataList {...listProps} />\n </LeftPanel>\n <RightPanel>\n <GroupsForm {...formProps} />\n </RightPanel>\n </SplitView>\n );\n};\n"]}
@@ -1,3 +1,5 @@
1
- /// <reference types="react" />
2
- declare const GroupsDataList: () => JSX.Element;
3
- export default GroupsDataList;
1
+ import React from "react";
2
+ export interface GroupsDataListProps {
3
+ [key: string]: any;
4
+ }
5
+ export declare const GroupsDataList: React.FC<GroupsDataListProps>;
@@ -22,37 +22,28 @@ import { Select } from "@webiny/ui/Select";
22
22
  import SearchUI from "@webiny/app-admin/components/SearchUI";
23
23
  import { ReactComponent as AddIcon } from "@webiny/app-admin/assets/icons/add-18px.svg";
24
24
  import { ReactComponent as FilterIcon } from "@webiny/app-admin/assets/icons/filter-24px.svg";
25
- import { deserializeSorters, serializeSorters } from "../utils";
25
+ import { deserializeSorters } from "../utils";
26
26
  var t = i18n.ns("app-security/admin/groups/data-list");
27
27
  var SORTERS = [{
28
28
  label: t(_templateObject || (_templateObject = _taggedTemplateLiteral(["Newest to oldest"]))),
29
- sorters: {
30
- createdOn: "desc"
31
- }
29
+ sorter: "createdOn_DESC"
32
30
  }, {
33
31
  label: t(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["Oldest to newest"]))),
34
- sorters: {
35
- createdOn: "asc"
36
- }
32
+ sorter: "createdOn_ASC"
37
33
  }, {
38
34
  label: t(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["Name A-Z"]))),
39
- sorters: {
40
- name: "asc"
41
- }
35
+ sorter: "name_ASC"
42
36
  }, {
43
37
  label: t(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["Name Z-A"]))),
44
- sorters: {
45
- name: "desc"
46
- }
38
+ sorter: "name_DESC"
47
39
  }];
48
-
49
- var GroupsDataList = function GroupsDataList() {
40
+ export var GroupsDataList = function GroupsDataList() {
50
41
  var _useState = useState(""),
51
42
  _useState2 = _slicedToArray(_useState, 2),
52
43
  filter = _useState2[0],
53
44
  setFilter = _useState2[1];
54
45
 
55
- var _useState3 = useState(serializeSorters(SORTERS[0].sorters)),
46
+ var _useState3 = useState(SORTERS[0].sorter),
56
47
  _useState4 = _slicedToArray(_useState3, 2),
57
48
  sort = _useState4[0],
58
49
  setSort = _useState4[1];
@@ -95,13 +86,12 @@ var GroupsDataList = function GroupsDataList() {
95
86
  return groups;
96
87
  }
97
88
 
98
- var _Object$entries = Object.entries(deserializeSorters(sort)),
99
- _Object$entries2 = _slicedToArray(_Object$entries, 1),
100
- _Object$entries2$ = _slicedToArray(_Object$entries2[0], 2),
101
- key = _Object$entries2$[0],
102
- value = _Object$entries2$[1];
89
+ var _deserializeSorters = deserializeSorters(sort),
90
+ _deserializeSorters2 = _slicedToArray(_deserializeSorters, 2),
91
+ key = _deserializeSorters2[0],
92
+ sortBy = _deserializeSorters2[1];
103
93
 
104
- return orderBy(groups, [key], [value]);
94
+ return orderBy(groups, [key], [sortBy]);
105
95
  }, [sort]);
106
96
  var deleteItem = useCallback(function (item) {
107
97
  showConfirmation( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
@@ -154,10 +144,10 @@ var GroupsDataList = function GroupsDataList() {
154
144
  label: t(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["Sort by"])))
155
145
  }, SORTERS.map(function (_ref3) {
156
146
  var label = _ref3.label,
157
- sorters = _ref3.sorters;
147
+ sorter = _ref3.sorter;
158
148
  return /*#__PURE__*/React.createElement("option", {
159
149
  key: label,
160
- value: serializeSorters(sorters)
150
+ value: sorter
161
151
  }, label);
162
152
  })))));
163
153
  }, [sort]);
@@ -210,6 +200,4 @@ var GroupsDataList = function GroupsDataList() {
210
200
  })))));
211
201
  }));
212
202
  });
213
- };
214
-
215
- export default GroupsDataList;
203
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["GroupsDataList.tsx"],"names":["React","useCallback","useMemo","useState","orderBy","i18n","DataList","ScrollList","ListItem","ListItemText","ListItemTextSecondary","ListItemMeta","ListActions","DataListModalOverlayAction","DataListModalOverlay","DeleteIcon","useRouter","useSnackbar","useQuery","useMutation","useConfirmationDialog","LIST_GROUPS","DELETE_GROUP","Tooltip","ButtonIcon","ButtonSecondary","Cell","Grid","Select","SearchUI","ReactComponent","AddIcon","FilterIcon","deserializeSorters","t","ns","SORTERS","label","sorter","GroupsDataList","filter","setFilter","sort","setSort","history","location","showSnackbar","dataTestId","showConfirmation","listResponse","data","listLoading","loading","refetchQueries","query","deleteIt","deleteLoading","security","groups","id","URLSearchParams","search","get","filterGroup","name","slug","description","toLowerCase","includes","sortGroups","key","sortBy","deleteItem","item","variables","error","deleteGroup","message","push","groupsDataListModalOverlay","map","filteredData","groupList","system"],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo, useState } from \"react\";\nimport orderBy from \"lodash/orderBy\";\nimport { i18n } from \"@webiny/app/i18n\";\nimport {\n DataList,\n ScrollList,\n ListItem,\n ListItemText,\n ListItemTextSecondary,\n ListItemMeta,\n ListActions,\n DataListModalOverlayAction,\n DataListModalOverlay\n} from \"@webiny/ui/List\";\nimport { DeleteIcon } from \"@webiny/ui/List/DataList/icons\";\nimport { useRouter } from \"@webiny/react-router\";\nimport { useSnackbar } from \"@webiny/app-admin/hooks/useSnackbar\";\nimport { useQuery, useMutation } from \"@apollo/react-hooks\";\nimport { useConfirmationDialog } from \"@webiny/app-admin/hooks/useConfirmationDialog\";\nimport { LIST_GROUPS, DELETE_GROUP } from \"./graphql\";\nimport { Tooltip } from \"@webiny/ui/Tooltip\";\nimport { ButtonIcon, ButtonSecondary } from \"@webiny/ui/Button\";\nimport { Cell, Grid } from \"@webiny/ui/Grid\";\nimport { Select } from \"@webiny/ui/Select\";\nimport SearchUI from \"@webiny/app-admin/components/SearchUI\";\nimport { ReactComponent as AddIcon } from \"@webiny/app-admin/assets/icons/add-18px.svg\";\nimport { ReactComponent as FilterIcon } from \"@webiny/app-admin/assets/icons/filter-24px.svg\";\nimport { deserializeSorters } from \"../utils\";\nimport { Group } from \"~/types\";\n\nconst t = i18n.ns(\"app-security/admin/groups/data-list\");\n\nconst SORTERS = [\n {\n label: t`Newest to oldest`,\n sorter: \"createdOn_DESC\"\n },\n {\n label: t`Oldest to newest`,\n sorter: \"createdOn_ASC\"\n },\n {\n label: t`Name A-Z`,\n sorter: \"name_ASC\"\n },\n {\n label: t`Name Z-A`,\n sorter: \"name_DESC\"\n }\n];\n\nexport interface GroupsDataListProps {\n // TODO @ts-refactor delete and go up the tree and sort it out\n [key: string]: any;\n}\nexport const GroupsDataList: React.FC<GroupsDataListProps> = () => {\n const [filter, setFilter] = useState(\"\");\n const [sort, setSort] = useState(SORTERS[0].sorter);\n const { history, location } = useRouter();\n const { showSnackbar } = useSnackbar();\n const { showConfirmation } = useConfirmationDialog({\n dataTestId: \"default-data-list.delete-dialog\"\n });\n\n const { data: listResponse, loading: listLoading } = useQuery(LIST_GROUPS);\n\n const [deleteIt, { loading: deleteLoading }] = useMutation(DELETE_GROUP, {\n refetchQueries: [{ query: LIST_GROUPS }]\n });\n\n const data = listLoading && !listResponse ? [] : listResponse.security.groups.data;\n const id = new URLSearchParams(location.search).get(\"id\");\n\n const filterGroup = useCallback(\n ({ name, slug, description }) => {\n return (\n name.toLowerCase().includes(filter) ||\n slug.toLowerCase().includes(filter) ||\n (description && description.toLowerCase().includes(filter))\n );\n },\n [filter]\n );\n\n const sortGroups = useCallback(\n groups => {\n if (!sort) {\n return groups;\n }\n const [key, sortBy] = deserializeSorters(sort);\n return orderBy(groups, [key], [sortBy]);\n },\n [sort]\n );\n\n const deleteItem = useCallback(\n item => {\n showConfirmation(async () => {\n const { data } = await deleteIt({\n variables: item\n });\n\n const { error } = data.security.deleteGroup;\n if (error) {\n return showSnackbar(error.message);\n }\n\n showSnackbar(t`Group \"{slug}\" deleted.`({ slug: item.slug }));\n\n if (id === item.id) {\n history.push(`/access-management/groups`);\n }\n });\n },\n [id]\n );\n\n const groupsDataListModalOverlay = useMemo(\n () => (\n <DataListModalOverlay>\n <Grid>\n <Cell span={12}>\n <Select value={sort} onChange={setSort} label={t`Sort by`}>\n {SORTERS.map(({ label, sorter }) => {\n return (\n <option key={label} value={sorter}>\n {label}\n </option>\n );\n })}\n </Select>\n </Cell>\n </Grid>\n </DataListModalOverlay>\n ),\n [sort]\n );\n\n const filteredData = filter === \"\" ? data : data.filter(filterGroup);\n const groupList = sortGroups(filteredData);\n\n return (\n <DataList\n title={t`Groups`}\n actions={\n <ButtonSecondary\n data-testid=\"new-record-button\"\n onClick={() => history.push(\"/access-management/groups?new=true\")}\n >\n <ButtonIcon icon={<AddIcon />} /> {t`New Group`}\n </ButtonSecondary>\n }\n data={groupList}\n loading={listLoading || deleteLoading}\n search={\n <SearchUI value={filter} onChange={setFilter} inputPlaceholder={t`Search Groups`} />\n }\n modalOverlay={groupsDataListModalOverlay}\n modalOverlayAction={\n <DataListModalOverlayAction\n icon={<FilterIcon />}\n data-testid={\"default-data-list.filter\"}\n />\n }\n >\n {({ data }: { data: Group[] }) => (\n <ScrollList data-testid=\"default-data-list\">\n {data.map(item => (\n <ListItem key={item.id} selected={item.id === id}>\n <ListItemText\n onClick={() =>\n history.push(`/access-management/groups?id=${item.id}`)\n }\n >\n {item.name}\n <ListItemTextSecondary>{item.description}</ListItemTextSecondary>\n </ListItemText>\n\n <ListItemMeta>\n <ListActions>\n {!item.system ? (\n <DeleteIcon\n onClick={() => deleteItem(item)}\n data-testid={\"default-data-list.delete\"}\n />\n ) : (\n <Tooltip\n placement={\"bottom\"}\n content={<span>{t`You can't delete this group.`}</span>}\n >\n <DeleteIcon disabled />\n </Tooltip>\n )}\n </ListActions>\n </ListItemMeta>\n </ListItem>\n ))}\n </ScrollList>\n )}\n </DataList>\n );\n};\n"]}
@@ -1,3 +1,5 @@
1
- /// <reference types="react" />
2
- declare const GroupForm: () => JSX.Element;
3
- export default GroupForm;
1
+ import React from "react";
2
+ export interface GroupsFormProps {
3
+ [key: string]: any;
4
+ }
5
+ export declare const GroupsForm: React.FC<GroupsFormProps>;
@@ -36,8 +36,7 @@ var ButtonWrapper = /*#__PURE__*/styled("div", {
36
36
  display: "flex",
37
37
  justifyContent: "space-between"
38
38
  });
39
-
40
- var GroupForm = function GroupForm() {
39
+ export var GroupsForm = function GroupsForm() {
41
40
  var _useRouter = useRouter(),
42
41
  location = _useRouter.location,
43
42
  history = _useRouter.history;
@@ -226,9 +225,9 @@ var GroupForm = function GroupForm() {
226
225
  return history.push("/access-management/groups");
227
226
  }
228
227
  }, t(_templateObject9 || (_templateObject9 = _taggedTemplateLiteral(["Cancel"])))), /*#__PURE__*/React.createElement(ButtonPrimary, {
229
- onClick: form.submit
228
+ onClick: function onClick(ev) {
229
+ form.submit(ev);
230
+ }
230
231
  }, t(_templateObject10 || (_templateObject10 = _taggedTemplateLiteral(["Save group"])))))));
231
232
  });
232
- };
233
-
234
- export default GroupForm;
233
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["GroupsForm.tsx"],"names":["React","useCallback","useMutation","useQuery","styled","pick","get","useRouter","i18n","Form","Grid","Cell","Input","Alert","ButtonDefault","ButtonIcon","ButtonPrimary","CircularProgress","validation","SimpleForm","SimpleFormFooter","SimpleFormContent","SimpleFormHeader","Typography","Permissions","useSnackbar","CREATE_GROUP","LIST_GROUPS","READ_GROUP","UPDATE_GROUP","SnackbarAction","isEmpty","EmptyView","ReactComponent","AddIcon","t","ns","ButtonWrapper","display","justifyContent","GroupsForm","location","history","showSnackbar","newGroup","URLSearchParams","search","id","getQuery","variables","skip","onCompleted","data","error","security","group","push","message","refetchQueries","query","create","createMutation","update","updateMutation","loading","find","item","onSubmit","permissions","length","timeout","dismissesOnAction","action","isUpdate","createdOn","operation","args","response","systemGroup","slug","showEmptyView","form","Bind","name","Boolean","bind","ev","submit"],"mappings":"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","sourcesContent":["import React, { useCallback } from \"react\";\nimport { useMutation, useQuery } from \"@apollo/react-hooks\";\nimport styled from \"@emotion/styled\";\nimport pick from \"lodash/pick\";\nimport get from \"lodash/get\";\nimport { useRouter } from \"@webiny/react-router\";\nimport { i18n } from \"@webiny/app/i18n\";\nimport { Form } from \"@webiny/form\";\nimport { Grid, Cell } from \"@webiny/ui/Grid\";\nimport { Input } from \"@webiny/ui/Input\";\nimport { Alert } from \"@webiny/ui/Alert\";\nimport { ButtonDefault, ButtonIcon, ButtonPrimary } from \"@webiny/ui/Button\";\nimport { CircularProgress } from \"@webiny/ui/Progress\";\nimport { validation } from \"@webiny/validation\";\nimport {\n SimpleForm,\n SimpleFormFooter,\n SimpleFormContent,\n SimpleFormHeader\n} from \"@webiny/app-admin/components/SimpleForm\";\nimport { Typography } from \"@webiny/ui/Typography\";\nimport { Permissions } from \"@webiny/app-admin/components/Permissions\";\nimport { useSnackbar } from \"@webiny/app-admin/hooks/useSnackbar\";\nimport { CREATE_GROUP, LIST_GROUPS, READ_GROUP, UPDATE_GROUP } from \"./graphql\";\nimport { SnackbarAction } from \"@webiny/ui/Snackbar\";\nimport isEmpty from \"lodash/isEmpty\";\nimport EmptyView from \"@webiny/app-admin/components/EmptyView\";\nimport { ReactComponent as AddIcon } from \"@webiny/app-admin/assets/icons/add-18px.svg\";\n\nconst t = i18n.ns(\"app-security/admin/groups/form\");\n\nconst ButtonWrapper = styled(\"div\")({\n display: \"flex\",\n justifyContent: \"space-between\"\n});\n\nexport interface GroupsFormProps {\n // TODO @ts-refactor delete and go up the tree and sort it out\n [key: string]: any;\n}\nexport const GroupsForm: React.FC<GroupsFormProps> = () => {\n const { location, history } = useRouter();\n const { showSnackbar } = useSnackbar();\n const newGroup = new URLSearchParams(location.search).get(\"new\") === \"true\";\n const id = new URLSearchParams(location.search).get(\"id\");\n\n const getQuery = useQuery(READ_GROUP, {\n variables: { id },\n skip: !id,\n onCompleted: data => {\n if (!data) {\n return;\n }\n\n const { error } = data.security.group;\n if (error) {\n history.push(\"/access-management/groups\");\n showSnackbar(error.message);\n }\n }\n });\n\n const [create, createMutation] = useMutation(CREATE_GROUP, {\n refetchQueries: [{ query: LIST_GROUPS }]\n });\n\n const [update, updateMutation] = useMutation(UPDATE_GROUP, {\n refetchQueries: [{ query: LIST_GROUPS }]\n });\n\n const loading = [getQuery, createMutation, updateMutation].find(item => item.loading);\n\n const onSubmit = useCallback(\n async data => {\n if (!data.permissions || !data.permissions.length) {\n showSnackbar(t`You must configure permissions before saving!`, {\n timeout: 60000,\n dismissesOnAction: true,\n action: <SnackbarAction label={\"OK\"} />\n });\n return;\n }\n\n const isUpdate = data.createdOn;\n const [operation, args] = isUpdate\n ? [\n update,\n {\n variables: {\n id: data.id,\n data: pick(data, [\"name\", \"description\", \"permissions\"])\n }\n }\n ]\n : [\n create,\n {\n variables: {\n data: pick(data, [\"name\", \"slug\", \"description\", \"permissions\"])\n }\n }\n ];\n\n const response = await operation(args);\n\n const { data: group, error } = response.data.security.group;\n if (error) {\n return showSnackbar(error.message);\n }\n\n !isUpdate && history.push(`/access-management/groups?id=${group.id}`);\n showSnackbar(t`Group saved successfully!`);\n },\n [id]\n );\n\n const data = loading ? {} : get(getQuery, \"data.security.group.data\", {});\n\n const systemGroup = data.slug === \"full-access\";\n\n const showEmptyView = !newGroup && !loading && isEmpty(data);\n // Render \"No content\" selected view.\n if (showEmptyView) {\n return (\n <EmptyView\n title={t`Click on the left side list to display group details or create a...`}\n action={\n <ButtonDefault\n data-testid=\"new-record-button\"\n onClick={() => history.push(\"/access-management/groups?new=true\")}\n >\n <ButtonIcon icon={<AddIcon />} />\n {t`New Group`}\n </ButtonDefault>\n }\n />\n );\n }\n\n return (\n <Form data={data} onSubmit={onSubmit}>\n {({ data, form, Bind }) => {\n return (\n <SimpleForm>\n {loading && <CircularProgress />}\n <SimpleFormHeader title={data.name ? data.name : \"Untitled\"} />\n <SimpleFormContent>\n <Grid>\n <Cell span={6}>\n <Bind\n name=\"name\"\n validators={validation.create(\"required,minLength:3\")}\n >\n <Input label={t`Name`} disabled={systemGroup} />\n </Bind>\n </Cell>\n <Cell span={6}>\n <Bind\n name=\"slug\"\n validators={validation.create(\"required,minLength:3\")}\n >\n <Input disabled={Boolean(data.id)} label={t`Slug`} />\n </Bind>\n </Cell>\n </Grid>\n <Grid>\n <Cell span={12}>\n <Bind\n name=\"description\"\n validators={validation.create(\"maxLength:500\")}\n >\n <Input\n label={t`Description`}\n rows={3}\n disabled={systemGroup}\n />\n </Bind>\n </Cell>\n </Grid>\n {systemGroup && (\n <Grid>\n <Cell span={12}>\n <Alert type={\"info\"} title={\"Permissions are locked\"}>\n This is a protected system group and you can&apos;t\n modify its permissions.\n </Alert>\n </Cell>\n </Grid>\n )}\n {!systemGroup && (\n <Grid>\n <Cell span={12}>\n <Typography use={\"subtitle1\"}>{t`Permissions`}</Typography>\n </Cell>\n <Cell span={12}>\n <Bind name={\"permissions\"} defaultValue={[]}>\n {bind => (\n <Permissions id={data.id || \"new\"} {...bind} />\n )}\n </Bind>\n </Cell>\n </Grid>\n )}\n </SimpleFormContent>\n {systemGroup ? null : (\n <SimpleFormFooter>\n <ButtonWrapper>\n <ButtonDefault\n onClick={() => history.push(\"/access-management/groups\")}\n >{t`Cancel`}</ButtonDefault>\n <ButtonPrimary\n onClick={ev => {\n form.submit(ev);\n }}\n >{t`Save group`}</ButtonPrimary>\n </ButtonWrapper>\n </SimpleFormFooter>\n )}\n </SimpleForm>\n );\n }}\n </Form>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
- export declare const LIST_GROUPS: any;
2
- export declare const READ_GROUP: any;
3
- export declare const CREATE_GROUP: any;
4
- export declare const UPDATE_GROUP: any;
5
- export declare const DELETE_GROUP: any;
1
+ export declare const LIST_GROUPS: import("graphql").DocumentNode;
2
+ export declare const READ_GROUP: import("graphql").DocumentNode;
3
+ export declare const CREATE_GROUP: import("graphql").DocumentNode;
4
+ export declare const UPDATE_GROUP: import("graphql").DocumentNode;
5
+ export declare const DELETE_GROUP: import("graphql").DocumentNode;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["graphql.ts"],"names":["gql","fields","LIST_GROUPS","READ_GROUP","CREATE_GROUP","UPDATE_GROUP","DELETE_GROUP"],"mappings":";;;;AAAA,OAAOA,GAAP,MAAgB,aAAhB;AAEA,IAAMC,MAAM,gGAAZ;AAUA,OAAO,IAAMC,WAAW,GAAGF,GAAH,4PAKFC,MALE,CAAjB;AAYP,OAAO,IAAME,UAAU,GAAGH,GAAH,yXAKDC,MALC,CAAhB;AAgBP,OAAO,IAAMG,YAAY,GAAGJ,GAAH,6aAKHC,MALG,CAAlB;AAiBP,OAAO,IAAMI,YAAY,GAAGL,GAAH,gcAKHC,MALG,CAAlB;AAiBP,OAAO,IAAMK,YAAY,GAAGN,GAAH,iUAAlB","sourcesContent":["import gql from \"graphql-tag\";\n\nconst fields = `\n id\n name\n slug\n description\n permissions\n system\n createdOn\n`;\n\nexport const LIST_GROUPS = gql`\n query listGroups {\n security {\n groups: listGroups {\n data {\n ${fields}\n }\n }\n }\n }\n`;\n\nexport const READ_GROUP = gql`\n query getGroup($id: ID!) {\n security {\n group: getGroup(where: { id: $id }){\n data {\n ${fields}\n }\n error {\n code\n message\n }\n }\n }\n }\n`;\n\nexport const CREATE_GROUP = gql`\n mutation createGroup($data: SecurityGroupCreateInput!){\n security {\n group: createGroup(data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const UPDATE_GROUP = gql`\n mutation updateGroup($id: ID!, $data: SecurityGroupUpdateInput!){\n security {\n group: updateGroup(id: $id, data: $data) {\n data {\n ${fields}\n }\n error {\n code\n message\n data\n }\n }\n }\n }\n`;\n\nexport const DELETE_GROUP = gql`\n mutation deleteGroup($id: ID!) {\n security {\n deleteGroup(id: $id) {\n data\n error {\n code\n message\n }\n }\n }\n }\n`;\n"]}
@@ -1 +1 @@
1
- export { default as Groups } from "./Groups";
1
+ export * from "./Groups";
@@ -1 +1 @@
1
- export { default as Groups } from "./Groups";
1
+ export * from "./Groups";
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["index.ts"],"names":[],"mappings":"AAAA","sourcesContent":["export * from \"./Groups\";\n"]}
@@ -1,2 +1,3 @@
1
- export declare const serializeSorters: (data: any) => any;
2
- export declare const deserializeSorters: (data: string) => Record<string, "asc" | "desc" | boolean>;
1
+ declare type SortTypes = "asc" | "desc";
2
+ export declare const deserializeSorters: (data: string) => [string, SortTypes];
3
+ export {};
package/ui/views/utils.js CHANGED
@@ -1,27 +1,14 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
- export var serializeSorters = function serializeSorters(data) {
4
- if (!data) {
5
- return data;
6
- }
7
-
8
- var _Object$entries = Object.entries(data),
9
- _Object$entries2 = _slicedToArray(_Object$entries, 1),
10
- _Object$entries2$ = _slicedToArray(_Object$entries2[0], 2),
11
- key = _Object$entries2$[0],
12
- value = _Object$entries2$[1];
13
-
14
- return "".concat(key, ":").concat(value);
15
- };
16
2
  export var deserializeSorters = function deserializeSorters(data) {
17
3
  if (typeof data !== "string") {
18
4
  return data;
19
5
  }
20
6
 
21
- var _ref = data.split(":"),
7
+ var _ref = data.split("_"),
22
8
  _ref2 = _slicedToArray(_ref, 2),
23
- key = _ref2[0],
24
- value = _ref2[1];
9
+ field = _ref2[0],
10
+ orderBy = _ref2[1];
25
11
 
26
- return _defineProperty({}, key, value);
12
+ var order = String(orderBy).toLowerCase() === "asc" ? "asc" : "desc";
13
+ return [field, order];
27
14
  };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["utils.ts"],"names":["deserializeSorters","data","split","field","orderBy","order","String","toLowerCase"],"mappings":";AACA,OAAO,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,IAAD,EAAuC;AACrE,MAAI,OAAOA,IAAP,KAAgB,QAApB,EAA8B;AAC1B,WAAOA,IAAP;AACH;;AACD,aAAyBA,IAAI,CAACC,KAAL,CAAW,GAAX,CAAzB;AAAA;AAAA,MAAOC,KAAP;AAAA,MAAcC,OAAd;;AACA,MAAMC,KAAK,GAAGC,MAAM,CAACF,OAAD,CAAN,CAAgBG,WAAhB,OAAkC,KAAlC,GAA0C,KAA1C,GAAkD,MAAhE;AACA,SAAO,CAACJ,KAAD,EAAQE,KAAR,CAAP;AACH,CAPM","sourcesContent":["type SortTypes = \"asc\" | \"desc\";\nexport const deserializeSorters = (data: string): [string, SortTypes] => {\n if (typeof data !== \"string\") {\n return data;\n }\n const [field, orderBy] = data.split(\"_\") as [string, SortTypes];\n const order = String(orderBy).toLowerCase() === \"asc\" ? \"asc\" : \"desc\";\n return [field, order];\n};\n"]}