@beinformed/ui 1.65.0 → 1.65.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/esm/hooks/useModularUI.js +3 -10
  3. package/esm/hooks/useModularUI.js.flow +3 -14
  4. package/esm/hooks/useModularUI.js.map +1 -1
  5. package/esm/hooks/useModularUIBasic.js +37 -12
  6. package/esm/hooks/useModularUIBasic.js.flow +47 -10
  7. package/esm/hooks/useModularUIBasic.js.map +1 -1
  8. package/esm/hooks/useModularUIKey.js +11 -0
  9. package/esm/hooks/useModularUIKey.js.flow +14 -0
  10. package/esm/hooks/useModularUIKey.js.map +1 -0
  11. package/esm/hooks/usePanel.js +8 -3
  12. package/esm/hooks/usePanel.js.flow +4 -3
  13. package/esm/hooks/usePanel.js.map +1 -1
  14. package/esm/models/filters/FilterCollection.js +8 -10
  15. package/esm/models/filters/FilterCollection.js.flow +12 -12
  16. package/esm/models/filters/FilterCollection.js.map +1 -1
  17. package/esm/redux/actions/SignIn.js +15 -15
  18. package/esm/redux/actions/SignIn.js.flow +25 -26
  19. package/esm/redux/actions/SignIn.js.map +1 -1
  20. package/lib/hooks/useModularUI.js +3 -10
  21. package/lib/hooks/useModularUI.js.map +1 -1
  22. package/lib/hooks/useModularUIBasic.js +39 -14
  23. package/lib/hooks/useModularUIBasic.js.map +1 -1
  24. package/lib/hooks/useModularUIKey.js +17 -0
  25. package/lib/hooks/useModularUIKey.js.map +1 -0
  26. package/lib/hooks/usePanel.js +8 -3
  27. package/lib/hooks/usePanel.js.map +1 -1
  28. package/lib/models/filters/FilterCollection.js +8 -10
  29. package/lib/models/filters/FilterCollection.js.map +1 -1
  30. package/lib/redux/actions/SignIn.js +15 -15
  31. package/lib/redux/actions/SignIn.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/hooks/useModularUI.js +3 -14
  34. package/src/hooks/useModularUIBasic.js +47 -10
  35. package/src/hooks/useModularUIKey.js +14 -0
  36. package/src/hooks/usePanel.js +4 -3
  37. package/src/models/filters/FilterCollection.js +12 -12
  38. package/src/redux/actions/SignIn.js +25 -26
@@ -1 +1 @@
1
- {"version":3,"file":"SignIn.js","names":["_Cache","_interopRequireDefault","require","_Authenticate","_ModularUISelectors","_Error","_Application","_ProgressIndicator","_RouterActions","_Constants","loginFailed","errorMessage","sendAuthenticationError","exports","type","payload","resetAuthErrors","loginSuccess","changePassword","dispatch","getState","isModal","router","location","state","modal","locationFrom","from","push","CHANGEPASSWORD_PATH","login","username","password","startProgress","Authenticate","then","reloadApplication","Cache","addItem","application","getApplication","userMustChangePassword","finishProgress","catch","error","id","dispatchedReloadApplication","_promise","default","resolve","handleError"],"sources":["../../../src/redux/actions/SignIn.js"],"sourcesContent":["// @flow\nimport Cache from \"../../utils/browser/Cache\";\nimport Authenticate from \"../../modularui/Authenticate\";\nimport { getApplication } from \"../_modularui/ModularUISelectors\";\n\nimport { handleError } from \"./Error\";\nimport { reloadApplication } from \"./Application\";\nimport { startProgress, finishProgress } from \"./ProgressIndicator\";\n\nimport { push } from \"../_router/RouterActions\";\nimport { CHANGEPASSWORD_PATH } from \"../../constants/Constants\";\n\nimport type {\n SendAuthenticationErrorAction,\n ResetAuthErrorsAction,\n LoginSuccessAction,\n ThunkAction,\n} from \"../types\";\n\n/**\n * Send login failed action\n */\nexport const loginFailed = (\n errorMessage: string,\n): SendAuthenticationErrorAction => sendAuthenticationError(errorMessage);\n\n/**\n * Send authentication error action\n */\nexport const sendAuthenticationError = (\n errorMessage: string,\n): SendAuthenticationErrorAction => ({\n type: \"AUTHENTICATION_ERROR\",\n payload: errorMessage,\n});\n\n/**\n * Resets any authentication errors\n */\nexport const resetAuthErrors = (): ResetAuthErrorsAction => ({\n type: \"AUTHENTICATION_RESET_ERRORS\",\n});\n\n/**\n * Send login success action\n */\nexport const loginSuccess = (): LoginSuccessAction => ({\n type: \"AUTHENTICATION_SUCCESS\",\n});\n\n/**\n * Send change password action\n */\nexport const changePassword = (): ThunkAction => (dispatch, getState) => {\n dispatch({\n type: \"CHANGE_PASSWORD\",\n });\n\n const isModal = getState().router.location?.state?.modal;\n const locationFrom = getState().router.location?.state?.from;\n return dispatch(\n push(CHANGEPASSWORD_PATH, {\n from: locationFrom ? locationFrom : getState().router.location,\n modal: isModal,\n }),\n );\n};\n\n/**\n */\nexport const login =\n (username: string, password: string): ThunkAction =>\n (dispatch, getState) => {\n dispatch(startProgress());\n\n return new Authenticate()\n .login(username, password)\n .then(() => dispatch(reloadApplication()))\n .then(() => {\n Cache.addItem(\"auth\", true);\n const application = getApplication(getState());\n if (application?.userMustChangePassword) {\n dispatch(changePassword());\n } else {\n dispatch(loginSuccess());\n }\n return dispatch(finishProgress());\n })\n .catch((error) => {\n if (error.id === \"Error.ChangePasswordRequired\") {\n const dispatchedReloadApplication = dispatch(reloadApplication());\n\n return Promise.resolve(dispatchedReloadApplication).then(() => {\n Cache.addItem(\"auth\", true);\n dispatch(changePassword());\n return dispatch(finishProgress());\n });\n }\n\n dispatch(loginFailed(error.id));\n return dispatch(handleError(error));\n });\n };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SignIn.js","names":["_Cache","_interopRequireDefault","require","_Authenticate","_ModularUISelectors","_Application","_ProgressIndicator","_RouterActions","_Constants","loginFailed","errorMessage","sendAuthenticationError","exports","type","payload","resetAuthErrors","loginSuccess","changePassword","dispatch","getState","isModal","router","location","state","modal","locationFrom","from","push","CHANGEPASSWORD_PATH","login","username","password","startProgress","response","Authenticate","reloadApplication","Cache","addItem","application","getApplication","userMustChangePassword","finishProgress","error","id"],"sources":["../../../src/redux/actions/SignIn.js"],"sourcesContent":["// @flow\nimport Cache from \"../../utils/browser/Cache\";\nimport Authenticate from \"../../modularui/Authenticate\";\nimport { getApplication } from \"../_modularui/ModularUISelectors\";\n\nimport { reloadApplication } from \"./Application\";\nimport { startProgress, finishProgress } from \"./ProgressIndicator\";\n\nimport { push } from \"../_router/RouterActions\";\nimport { CHANGEPASSWORD_PATH } from \"../../constants/Constants\";\n\nimport type {\n SendAuthenticationErrorAction,\n ResetAuthErrorsAction,\n LoginSuccessAction,\n ThunkAction,\n} from \"../types\";\n\n/**\n * Send login failed action\n */\nexport const loginFailed = (\n errorMessage: string,\n): SendAuthenticationErrorAction => sendAuthenticationError(errorMessage);\n\n/**\n * Send authentication error action\n */\nexport const sendAuthenticationError = (\n errorMessage: string,\n): SendAuthenticationErrorAction => ({\n type: \"AUTHENTICATION_ERROR\",\n payload: errorMessage,\n});\n\n/**\n * Resets any authentication errors\n */\nexport const resetAuthErrors = (): ResetAuthErrorsAction => ({\n type: \"AUTHENTICATION_RESET_ERRORS\",\n});\n\n/**\n * Send login success action\n */\nexport const loginSuccess = (): LoginSuccessAction => ({\n type: \"AUTHENTICATION_SUCCESS\",\n});\n\n/**\n * Send change password action\n */\nexport const changePassword = (): ThunkAction => (dispatch, getState) => {\n dispatch({\n type: \"CHANGE_PASSWORD\",\n });\n\n const isModal = getState().router.location?.state?.modal;\n const locationFrom = getState().router.location?.state?.from;\n return dispatch(\n push(CHANGEPASSWORD_PATH, {\n from: locationFrom ? locationFrom : getState().router.location,\n modal: isModal,\n }),\n );\n};\n\n/**\n */\nexport const login =\n (username: string, password: string): ThunkAction =>\n async (dispatch, getState) => {\n dispatch(startProgress());\n\n try {\n const response = await new Authenticate().login(username, password);\n\n await dispatch(reloadApplication());\n\n Cache.addItem(\"auth\", true);\n const application = getApplication(getState());\n\n if (application?.userMustChangePassword) {\n dispatch(changePassword());\n } else {\n dispatch(loginSuccess());\n }\n\n dispatch(finishProgress());\n return response;\n } catch (error) {\n if (error.id === \"Error.ChangePasswordRequired\") {\n await dispatch(reloadApplication());\n Cache.addItem(\"auth\", true);\n dispatch(changePassword());\n } else {\n dispatch(loginFailed(error.id));\n }\n dispatch(finishProgress());\n return error;\n }\n };\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beinformed/ui",
3
- "version": "1.65.0",
3
+ "version": "1.65.2",
4
4
  "description": "Toolbox for be informed javascript layouts",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "bugs": "https://support.beinformed.com",
@@ -10,24 +10,13 @@ import {
10
10
  } from "../redux/_modularui/ModularUIActions";
11
11
 
12
12
  import useDeepCompareEffect from "./useDeepCompareEffect";
13
+ import { useModularUIKey } from "./useModularUIKey";
13
14
 
14
- import { useLocale } from "./useI18n";
15
15
  import Href from "../models/href/Href";
16
-
17
16
  import type { RequestModularUIOptions } from "../utils";
18
17
 
19
18
  /**
20
- */
21
- const useKeyForHook = (modelKey: string, url: string) => {
22
- const locale = useLocale();
23
- return useMemo(
24
- () => `${modelKey}(${url.split("?")[0]})(${locale})`,
25
- [modelKey, url, locale],
26
- );
27
- };
28
-
29
- /**
30
- * Use redux action and selector to retrieve the correct modular ui service model
19
+ * Core hook to retrieve information for a Be Informed modular ui resource
31
20
  */
32
21
  export const useModularUI = (
33
22
  modelKey: string,
@@ -39,7 +28,7 @@ export const useModularUI = (
39
28
  ): any => {
40
29
  const dispatch = useDispatch();
41
30
  const href = useMemo(() => url?.toString() || "", [url]);
42
- const key = useKeyForHook(modelKey, href);
31
+ const key = useModularUIKey(modelKey, href);
43
32
 
44
33
  const modelSelector = useMemo(() => (state) => state.modularui[key], [key]);
45
34
  const model = useSelector(modelSelector);
@@ -1,12 +1,18 @@
1
1
  // @flow
2
- import type { ModularUIModel, Href } from "../models";
3
2
  import { useLocation } from "react-router";
3
+ import { useSelector } from "react-redux";
4
4
  import { useMemo } from "react";
5
5
  import { useModularUI } from "./useModularUI";
6
6
 
7
+ import { MODULARUI_STATUS } from "../constants";
8
+ import { useModularUIKey } from "./useModularUIKey";
9
+
10
+ import type { ModularUIModel, Href } from "../models";
7
11
  export type HookOptions = {
12
+ key?: string,
8
13
  origin?: string,
9
14
  contextPath?: string,
15
+ removeOnUnmount?: boolean,
10
16
  };
11
17
 
12
18
  export type UseModularUIBasicOptions<T: ModularUIModel> = {
@@ -16,13 +22,16 @@ export type UseModularUIBasicOptions<T: ModularUIModel> = {
16
22
  origin?: string,
17
23
  contextPath?: string,
18
24
  cache?: boolean,
25
+ key?: string,
26
+ isReload?: boolean,
27
+ removeOnUnmount?: boolean,
19
28
  };
20
29
 
21
30
  // Helper to create useModularUI options
22
31
  const createUseModularUIOptions = <T: ModularUIModel>(
23
32
  options: UseModularUIBasicOptions<T>,
24
33
  href: string,
25
- location: any,
34
+ mustReload: boolean,
26
35
  ): Object => {
27
36
  const baseOptions = {
28
37
  targetModel: undefined,
@@ -31,6 +40,7 @@ const createUseModularUIOptions = <T: ModularUIModel>(
31
40
  origin: undefined,
32
41
  contextPath: undefined,
33
42
  cache: false,
43
+ removeOnUnmount: false,
34
44
  };
35
45
 
36
46
  // Handle targetModel and forceTargetModel
@@ -44,11 +54,14 @@ const createUseModularUIOptions = <T: ModularUIModel>(
44
54
  baseOptions.cache = options.cache;
45
55
  }
46
56
 
47
- // Check for reload if location matches href
48
- if (location.state?.reload && location.pathname.startsWith(href)) {
57
+ if (mustReload) {
49
58
  baseOptions.isReload = true;
50
59
  }
51
60
 
61
+ if (options.removeOnUnmount) {
62
+ baseOptions.removeOnUnmount = true;
63
+ }
64
+
52
65
  // Handle origin and contextPath options
53
66
  baseOptions.origin = options.origin ?? baseOptions.origin;
54
67
  baseOptions.contextPath = options.contextPath ?? baseOptions.contextPath;
@@ -72,7 +85,7 @@ const validateModel = (model: any, expectedModels: Array<string>) => {
72
85
  * useModularUIBasic Hook
73
86
  */
74
87
  export const useModularUIBasic = <T: ModularUIModel>(
75
- key: string,
88
+ defaultKey: string,
76
89
  href: string | Href,
77
90
  options: UseModularUIBasicOptions<T> = {
78
91
  expectedModels: [],
@@ -80,16 +93,19 @@ export const useModularUIBasic = <T: ModularUIModel>(
80
93
  forceTargetModel: false,
81
94
  origin: undefined,
82
95
  contextPath: undefined,
96
+ key: undefined,
83
97
  },
84
98
  ): T | null => {
85
- const location = useLocation();
86
99
  const memoizedHref = useMemo(() => href.toString(), [href]);
87
- const useModularUIOptions = useMemo(
88
- () => createUseModularUIOptions(options, memoizedHref, location),
89
- [options, memoizedHref, location],
100
+ const key = options.key ?? defaultKey;
101
+
102
+ const mustReload = useReload(key, memoizedHref);
103
+ const modularUIOptions = useMemo(
104
+ () => createUseModularUIOptions(options, memoizedHref, mustReload),
105
+ [options, memoizedHref, mustReload],
90
106
  );
91
107
 
92
- const modularUI = useModularUI(key, href, useModularUIOptions);
108
+ const modularUI = useModularUI(key, href, modularUIOptions);
93
109
  const expectedModels = useMemo(
94
110
  () => options.expectedModels ?? [],
95
111
  [options.expectedModels],
@@ -103,3 +119,24 @@ export const useModularUIBasic = <T: ModularUIModel>(
103
119
  return null;
104
120
  }, [expectedModels, modularUI]);
105
121
  };
122
+
123
+ /**
124
+ * Check if the model corresponding to a modular ui service should be reloaded
125
+ */
126
+ export const useReload = (modelKey: string, url: string): boolean => {
127
+ const location = useLocation();
128
+ const key = useModularUIKey(modelKey, url);
129
+ const modelEntry = useSelector((state) => state.modularui[key]);
130
+
131
+ if (modelEntry) {
132
+ const reload = location.state?.reload || 0;
133
+ if (reload > 0) {
134
+ const isFullyLoaded = modelEntry?.status === MODULARUI_STATUS.FINISHED;
135
+ const lastModification = modelEntry?.lastModification ?? 0;
136
+ if (isFullyLoaded && lastModification < reload) {
137
+ return true;
138
+ }
139
+ }
140
+ }
141
+ return false;
142
+ };
@@ -0,0 +1,14 @@
1
+ // @flow
2
+ import { useLocale } from "./useI18n";
3
+ import { useMemo } from "react";
4
+
5
+ /**
6
+ * Generates the key that is used in the modular ui reducer of redux
7
+ */
8
+ export const useModularUIKey = (modelKey: string, url: string): string => {
9
+ const locale = useLocale();
10
+ return useMemo(
11
+ () => `${modelKey}(${url.split("?")[0]})(${locale})`,
12
+ [modelKey, url, locale],
13
+ );
14
+ };
@@ -65,11 +65,12 @@ export const usePanel = (
65
65
  href?: string | Href,
66
66
  options?: HookOptions & { fromRoute?: boolean },
67
67
  ): ListModel | GroupingPanelModel | DetailModel | null => {
68
- const url = useUrl(href, options?.fromRoute || false);
68
+ const { fromRoute, ...hookOptions } = options || { fromRoute: false };
69
+
70
+ const url = useUrl(href, fromRoute || false);
69
71
  const basicOptions = {
70
72
  expectedModels: ["List", "GroupingPanel", "Detail"],
71
- origin: options?.origin,
72
- contextPath: options?.contextPath,
73
+ ...(hookOptions: HookOptions),
73
74
  };
74
75
 
75
76
  return useModularUIBasic("panel", url, basicOptions);
@@ -194,17 +194,17 @@ export default class FilterCollection extends BaseCollection<FilterType> {
194
194
  /**
195
195
  */
196
196
  get formdata(): { [string]: any } | null {
197
- let data = {};
198
- this.filter(
199
- (f) => f.parameterType === PARAMETER_TYPES.BODY && f.hasValue(),
200
- ).forEach((f) => {
201
- // $FlowIgnore[cannot-spread-indexer]
202
- // $FlowIgnore[exponential-spread]
203
- data = {
204
- ...data,
205
- ...f.formdata,
206
- };
207
- });
208
- return data;
197
+ const bodyFields = this.filter(
198
+ (f) =>
199
+ f.parameterType === PARAMETER_TYPES.BODY && f.hasValue() && f.formdata,
200
+ );
201
+
202
+ if (bodyFields.length === 0) {
203
+ return null;
204
+ }
205
+
206
+ return bodyFields.reduce((data, f) => {
207
+ return Object.assign(data, f.formdata);
208
+ }, {});
209
209
  }
210
210
  }
@@ -3,7 +3,6 @@ import Cache from "../../utils/browser/Cache";
3
3
  import Authenticate from "../../modularui/Authenticate";
4
4
  import { getApplication } from "../_modularui/ModularUISelectors";
5
5
 
6
- import { handleError } from "./Error";
7
6
  import { reloadApplication } from "./Application";
8
7
  import { startProgress, finishProgress } from "./ProgressIndicator";
9
8
 
@@ -70,34 +69,34 @@ export const changePassword = (): ThunkAction => (dispatch, getState) => {
70
69
  */
71
70
  export const login =
72
71
  (username: string, password: string): ThunkAction =>
73
- (dispatch, getState) => {
72
+ async (dispatch, getState) => {
74
73
  dispatch(startProgress());
75
74
 
76
- return new Authenticate()
77
- .login(username, password)
78
- .then(() => dispatch(reloadApplication()))
79
- .then(() => {
80
- Cache.addItem("auth", true);
81
- const application = getApplication(getState());
82
- if (application?.userMustChangePassword) {
83
- dispatch(changePassword());
84
- } else {
85
- dispatch(loginSuccess());
86
- }
87
- return dispatch(finishProgress());
88
- })
89
- .catch((error) => {
90
- if (error.id === "Error.ChangePasswordRequired") {
91
- const dispatchedReloadApplication = dispatch(reloadApplication());
75
+ try {
76
+ const response = await new Authenticate().login(username, password);
77
+
78
+ await dispatch(reloadApplication());
92
79
 
93
- return Promise.resolve(dispatchedReloadApplication).then(() => {
94
- Cache.addItem("auth", true);
95
- dispatch(changePassword());
96
- return dispatch(finishProgress());
97
- });
98
- }
80
+ Cache.addItem("auth", true);
81
+ const application = getApplication(getState());
99
82
 
83
+ if (application?.userMustChangePassword) {
84
+ dispatch(changePassword());
85
+ } else {
86
+ dispatch(loginSuccess());
87
+ }
88
+
89
+ dispatch(finishProgress());
90
+ return response;
91
+ } catch (error) {
92
+ if (error.id === "Error.ChangePasswordRequired") {
93
+ await dispatch(reloadApplication());
94
+ Cache.addItem("auth", true);
95
+ dispatch(changePassword());
96
+ } else {
100
97
  dispatch(loginFailed(error.id));
101
- return dispatch(handleError(error));
102
- });
98
+ }
99
+ dispatch(finishProgress());
100
+ return error;
101
+ }
103
102
  };