@beinformed/ui 1.13.3 → 1.14.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 (166) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/esm/models/attributes/AttributeContent.js +3 -3
  3. package/esm/models/attributes/AttributeContent.js.map +1 -1
  4. package/esm/models/attributes/AttributeModel.js.map +1 -1
  5. package/esm/models/attributes/BooleanAttributeModel.js +1 -0
  6. package/esm/models/attributes/BooleanAttributeModel.js.map +1 -1
  7. package/esm/models/attributes/ChoiceAttributeModel.js +1 -0
  8. package/esm/models/attributes/ChoiceAttributeModel.js.map +1 -1
  9. package/esm/models/attributes/ChoiceAttributeOptionCollection.js.map +1 -1
  10. package/esm/models/attributes/ChoiceAttributeOptionModel.js.map +1 -1
  11. package/esm/models/attributes/CompositeAttributeChildCollection.js +1 -1
  12. package/esm/models/attributes/CompositeAttributeChildCollection.js.map +1 -1
  13. package/esm/models/attributes/CompositeAttributeModel.js +2 -1
  14. package/esm/models/attributes/CompositeAttributeModel.js.map +1 -1
  15. package/esm/models/attributes/DatetimeAttributeModel.js +3 -2
  16. package/esm/models/attributes/DatetimeAttributeModel.js.map +1 -1
  17. package/esm/models/base/BaseCollection.js.map +1 -1
  18. package/esm/models/base/ResourceCollection.js +4 -2
  19. package/esm/models/base/ResourceCollection.js.map +1 -1
  20. package/esm/models/base/ResourceModel.js +1 -0
  21. package/esm/models/base/ResourceModel.js.map +1 -1
  22. package/esm/models/concepts/BusinessScenarioModel.js +2 -1
  23. package/esm/models/concepts/BusinessScenarioModel.js.map +1 -1
  24. package/esm/models/concepts/ConceptDetailModel.js +2 -1
  25. package/esm/models/concepts/ConceptDetailModel.js.map +1 -1
  26. package/esm/models/concepts/ConceptLinkModel.js.map +1 -1
  27. package/esm/models/concepts/ConceptRelationModel.js.map +1 -1
  28. package/esm/models/content/ContentLinkModel.js +2 -0
  29. package/esm/models/content/ContentLinkModel.js.map +1 -1
  30. package/esm/models/href/Href.js +1 -1
  31. package/esm/models/href/Href.js.map +1 -1
  32. package/esm/react-server/renderSSRComplete.js +2 -1
  33. package/esm/react-server/renderSSRComplete.js.map +1 -1
  34. package/esm/react-server/serverNoSSR.js +1 -1
  35. package/esm/react-server/serverNoSSR.js.map +1 -1
  36. package/esm/redux/_modularui/actions.js +16 -17
  37. package/esm/redux/_modularui/actions.js.map +1 -1
  38. package/esm/redux/_modularui/reducer.js +1 -2
  39. package/esm/redux/_modularui/reducer.js.map +1 -1
  40. package/esm/redux/actions/Authorization.js +2 -1
  41. package/esm/redux/actions/Authorization.js.map +1 -1
  42. package/esm/redux/actions/SignIn.js +5 -9
  43. package/esm/redux/actions/SignIn.js.map +1 -1
  44. package/esm/utils/helpers/checkResourceExists.js +23 -0
  45. package/esm/utils/helpers/checkResourceExists.js.map +1 -0
  46. package/esm/utils/helpers/objects.js +2 -1
  47. package/esm/utils/helpers/objects.js.map +1 -1
  48. package/esm/utils/index.js +2 -1
  49. package/esm/utils/index.js.map +1 -1
  50. package/lib/hooks/__tests__/useAuthentication.spec.js.flow +1 -0
  51. package/lib/models/attributes/AttributeContent.js +3 -3
  52. package/lib/models/attributes/AttributeContent.js.flow +3 -3
  53. package/lib/models/attributes/AttributeContent.js.map +1 -1
  54. package/lib/models/attributes/AttributeModel.js.flow +10 -2
  55. package/lib/models/attributes/AttributeModel.js.map +1 -1
  56. package/lib/models/attributes/BooleanAttributeModel.js +1 -0
  57. package/lib/models/attributes/BooleanAttributeModel.js.flow +4 -1
  58. package/lib/models/attributes/BooleanAttributeModel.js.map +1 -1
  59. package/lib/models/attributes/ChoiceAttributeModel.js +1 -0
  60. package/lib/models/attributes/ChoiceAttributeModel.js.flow +4 -1
  61. package/lib/models/attributes/ChoiceAttributeModel.js.map +1 -1
  62. package/lib/models/attributes/ChoiceAttributeOptionCollection.js.flow +1 -1
  63. package/lib/models/attributes/ChoiceAttributeOptionCollection.js.map +1 -1
  64. package/lib/models/attributes/ChoiceAttributeOptionModel.js.flow +5 -2
  65. package/lib/models/attributes/ChoiceAttributeOptionModel.js.map +1 -1
  66. package/lib/models/attributes/CompositeAttributeChildCollection.js +1 -1
  67. package/lib/models/attributes/CompositeAttributeChildCollection.js.flow +1 -1
  68. package/lib/models/attributes/CompositeAttributeChildCollection.js.map +1 -1
  69. package/lib/models/attributes/CompositeAttributeModel.js +2 -1
  70. package/lib/models/attributes/CompositeAttributeModel.js.flow +1 -0
  71. package/lib/models/attributes/CompositeAttributeModel.js.map +1 -1
  72. package/lib/models/attributes/DatetimeAttributeModel.js +4 -2
  73. package/lib/models/attributes/DatetimeAttributeModel.js.flow +3 -5
  74. package/lib/models/attributes/DatetimeAttributeModel.js.map +1 -1
  75. package/lib/models/base/BaseCollection.js.flow +2 -2
  76. package/lib/models/base/BaseCollection.js.map +1 -1
  77. package/lib/models/base/ResourceCollection.js +4 -2
  78. package/lib/models/base/ResourceCollection.js.flow +4 -6
  79. package/lib/models/base/ResourceCollection.js.map +1 -1
  80. package/lib/models/base/ResourceModel.js +1 -0
  81. package/lib/models/base/ResourceModel.js.flow +3 -2
  82. package/lib/models/base/ResourceModel.js.map +1 -1
  83. package/lib/models/concepts/BusinessScenarioModel.js +3 -1
  84. package/lib/models/concepts/BusinessScenarioModel.js.flow +2 -1
  85. package/lib/models/concepts/BusinessScenarioModel.js.map +1 -1
  86. package/lib/models/concepts/ConceptDetailModel.js +3 -1
  87. package/lib/models/concepts/ConceptDetailModel.js.flow +2 -2
  88. package/lib/models/concepts/ConceptDetailModel.js.map +1 -1
  89. package/lib/models/concepts/ConceptLinkModel.js.flow +5 -2
  90. package/lib/models/concepts/ConceptLinkModel.js.map +1 -1
  91. package/lib/models/concepts/ConceptRelationModel.js.flow +6 -2
  92. package/lib/models/concepts/ConceptRelationModel.js.map +1 -1
  93. package/lib/models/content/ContentLinkModel.js +2 -0
  94. package/lib/models/content/ContentLinkModel.js.flow +2 -0
  95. package/lib/models/content/ContentLinkModel.js.map +1 -1
  96. package/lib/models/href/Href.js +1 -1
  97. package/lib/models/href/Href.js.flow +2 -1
  98. package/lib/models/href/Href.js.map +1 -1
  99. package/lib/models/types.js.flow +2 -2
  100. package/lib/react-server/__tests__/serverUtil.spec.js.flow +15 -14
  101. package/lib/react-server/renderSSRComplete.js +2 -1
  102. package/lib/react-server/renderSSRComplete.js.flow +4 -1
  103. package/lib/react-server/renderSSRComplete.js.map +1 -1
  104. package/lib/react-server/serverNoSSR.js +1 -1
  105. package/lib/react-server/serverNoSSR.js.flow +1 -1
  106. package/lib/react-server/serverNoSSR.js.map +1 -1
  107. package/lib/redux/_modularui/__tests__/actions.spec.js.flow +1 -0
  108. package/lib/redux/_modularui/actions.js +12 -12
  109. package/lib/redux/_modularui/actions.js.flow +12 -12
  110. package/lib/redux/_modularui/actions.js.map +1 -1
  111. package/lib/redux/_modularui/reducer.js +1 -2
  112. package/lib/redux/_modularui/reducer.js.flow +0 -1
  113. package/lib/redux/_modularui/reducer.js.map +1 -1
  114. package/lib/redux/actions/Authorization.js +2 -1
  115. package/lib/redux/actions/Authorization.js.flow +1 -0
  116. package/lib/redux/actions/Authorization.js.map +1 -1
  117. package/lib/redux/actions/SignIn.js +6 -9
  118. package/lib/redux/actions/SignIn.js.flow +5 -11
  119. package/lib/redux/actions/SignIn.js.map +1 -1
  120. package/lib/redux/actions/__tests__/Application.spec.js.flow +1 -0
  121. package/lib/redux/actions/__tests__/CustomErrorResponseHandler.spec.js.flow +2 -0
  122. package/lib/utils/fetch/__tests__/xhr.spec.js.flow +1 -0
  123. package/lib/utils/helpers/checkResourceExists.js +34 -0
  124. package/lib/utils/helpers/checkResourceExists.js.flow +21 -0
  125. package/lib/utils/helpers/checkResourceExists.js.map +1 -0
  126. package/lib/utils/helpers/objects.js +3 -1
  127. package/lib/utils/helpers/objects.js.flow +2 -2
  128. package/lib/utils/helpers/objects.js.map +1 -1
  129. package/lib/utils/index.js +14 -0
  130. package/lib/utils/index.js.flow +1 -0
  131. package/lib/utils/index.js.map +1 -1
  132. package/package.json +17 -17
  133. package/src/hooks/__tests__/useAuthentication.spec.js +1 -0
  134. package/src/models/attributes/AttributeContent.js +3 -3
  135. package/src/models/attributes/AttributeModel.js +10 -2
  136. package/src/models/attributes/BooleanAttributeModel.js +4 -1
  137. package/src/models/attributes/ChoiceAttributeModel.js +4 -1
  138. package/src/models/attributes/ChoiceAttributeOptionCollection.js +1 -1
  139. package/src/models/attributes/ChoiceAttributeOptionModel.js +5 -2
  140. package/src/models/attributes/CompositeAttributeChildCollection.js +1 -1
  141. package/src/models/attributes/CompositeAttributeModel.js +1 -0
  142. package/src/models/attributes/DatetimeAttributeModel.js +3 -5
  143. package/src/models/base/BaseCollection.js +2 -2
  144. package/src/models/base/ResourceCollection.js +4 -6
  145. package/src/models/base/ResourceModel.js +3 -2
  146. package/src/models/concepts/BusinessScenarioModel.js +2 -1
  147. package/src/models/concepts/ConceptDetailModel.js +2 -2
  148. package/src/models/concepts/ConceptLinkModel.js +5 -2
  149. package/src/models/concepts/ConceptRelationModel.js +6 -2
  150. package/src/models/content/ContentLinkModel.js +2 -0
  151. package/src/models/href/Href.js +2 -1
  152. package/src/models/types.js +2 -2
  153. package/src/react-server/__tests__/serverUtil.spec.js +15 -14
  154. package/src/react-server/renderSSRComplete.js +4 -1
  155. package/src/react-server/serverNoSSR.js +1 -1
  156. package/src/redux/_modularui/__tests__/actions.spec.js +1 -0
  157. package/src/redux/_modularui/actions.js +12 -12
  158. package/src/redux/_modularui/reducer.js +0 -1
  159. package/src/redux/actions/Authorization.js +1 -0
  160. package/src/redux/actions/SignIn.js +5 -11
  161. package/src/redux/actions/__tests__/Application.spec.js +1 -0
  162. package/src/redux/actions/__tests__/CustomErrorResponseHandler.spec.js +2 -0
  163. package/src/utils/fetch/__tests__/xhr.spec.js +1 -0
  164. package/src/utils/helpers/checkResourceExists.js +21 -0
  165. package/src/utils/helpers/objects.js +2 -2
  166. package/src/utils/index.js +1 -0
@@ -2,12 +2,16 @@
2
2
  import ConceptLinkModel from "./ConceptLinkModel";
3
3
  import LinkModel from "../links/LinkModel";
4
4
 
5
- import type { ModularUIModel, textfragmentJSON } from "../types";
5
+ import type {
6
+ IModelWithChildModels,
7
+ ModularUIModel,
8
+ textfragmentJSON,
9
+ } from "../types";
6
10
 
7
11
  /**
8
12
  * Concept relation model
9
13
  */
10
- export default class ConceptRelationModel {
14
+ export default class ConceptRelationModel implements IModelWithChildModels {
11
15
  _relation: Object;
12
16
  _concept: ConceptLinkModel;
13
17
 
@@ -33,6 +33,7 @@ export default class ContentLinkModel
33
33
 
34
34
  /**
35
35
  */
36
+ // $FlowFixMe[method-unbinding]
36
37
  getInitialChildModelLinks(): Array<LinkModel> {
37
38
  if (this.contentTypeLink) {
38
39
  this.contentTypeLink.isCacheable = true;
@@ -44,6 +45,7 @@ export default class ContentLinkModel
44
45
 
45
46
  /**
46
47
  */
48
+ // $FlowFixMe[method-unbinding]
47
49
  setChildModels(models: Array<ModularUIModel>) {
48
50
  if (this.contentTypeLink) {
49
51
  const href = this.contentTypeLink.href;
@@ -13,6 +13,7 @@ type HrefObject = {
13
13
  _resourcetype: string,
14
14
  _method: $Keys<typeof HTTP_METHODS>,
15
15
  _state: ?{ [key: string]: any },
16
+ pathname: ?string,
16
17
  };
17
18
 
18
19
  export type HrefInput = Href | HrefObject | LocationShape | string;
@@ -61,7 +62,7 @@ class Href {
61
62
  /**
62
63
  */
63
64
  setFromLocationOrObject(href: LocationShape | HrefObject) {
64
- if (href.pathname) {
65
+ if (typeof href["pathname"] === "string") {
65
66
  this.path = href.pathname;
66
67
  } else if (typeof href._path === "string") {
67
68
  this.path = href._path;
@@ -149,8 +149,8 @@ export interface ILayoutHintRule {
149
149
  }
150
150
 
151
151
  export interface IModelWithChildModels {
152
- +getInitialChildModelLinks: () => Array<LinkModel>;
153
- +setChildModels: (models: Array<ModularUIModel>) => void;
152
+ getInitialChildModelLinks(): Array<LinkModel>;
153
+ setChildModels(models: Array<ModularUIModel>): void;
154
154
  }
155
155
 
156
156
  export type FileEntryType = {
@@ -16,6 +16,20 @@ global.preferencesProvider = {
16
16
 
17
17
  const mockStore = configureMockStore();
18
18
 
19
+ const getExpectedLocales = () =>
20
+ new Locales([
21
+ ...availableLocales.map((locale) =>
22
+ locale.code === "nl"
23
+ ? {
24
+ ...locale,
25
+ messages: {
26
+ message_nl: "Dutch message",
27
+ },
28
+ }
29
+ : locale
30
+ ),
31
+ ]);
32
+
19
33
  describe("serverUtil", () => {
20
34
  it("handles setI18n", () => {
21
35
  const store = mockStore({ i18n: {} });
@@ -39,25 +53,12 @@ describe("serverUtil", () => {
39
53
  }
40
54
  );
41
55
 
42
- const expectedLocales = new Locales([
43
- ...availableLocales.map((locale) =>
44
- locale.code === "nl"
45
- ? {
46
- ...locale,
47
- messages: {
48
- message_nl: "Dutch message",
49
- },
50
- }
51
- : locale
52
- ),
53
- ]);
54
-
55
56
  expect(store.getActions()).toStrictEqual([
56
57
  {
57
58
  type: "SET_LOCALES",
58
59
  payload: {
59
60
  locale: "en",
60
- locales: expectedLocales,
61
+ locales: getExpectedLocales(),
61
62
  },
62
63
  },
63
64
  ]);
@@ -21,6 +21,8 @@ import type { Theme } from "../react-theme/types";
21
21
  import type { ReduxStore } from "../redux/types";
22
22
  import type Href from "../models/href/Href";
23
23
  import type { TemplateProps } from "./htmlpage";
24
+ import type { Location } from "react-router";
25
+
24
26
  type Props = {
25
27
  store: ReduxStore,
26
28
  theme: Theme,
@@ -46,7 +48,8 @@ const renderSSRComplete = ({
46
48
 
47
49
  const sheet = new ServerStyleSheet();
48
50
 
49
- // $FlowExpectedError[incompatible-type]
51
+ // $FlowFixMe[incompatible-type]
52
+ // $FlowFixMe[prop-missing]
50
53
  const location: Location = requestHref.toLocation();
51
54
 
52
55
  return createSSRComplete(store, () =>
@@ -56,7 +56,7 @@ const serverNoSSR = ({
56
56
 
57
57
  if (theme) {
58
58
  const storedTheme = store.getState()?.preferences?.theme;
59
- // $FlowFixMe
59
+ // $FlowFixMe[incompatible-call]
60
60
  createTheme(storedTheme, theme);
61
61
  }
62
62
 
@@ -152,6 +152,7 @@ describe("modularui actions", () => {
152
152
  targetModel: undefined,
153
153
  }),
154
154
  },
155
+ { type: "FINISH_PROGRESS" },
155
156
  ]);
156
157
  });
157
158
  });
@@ -73,7 +73,8 @@ const loadModelSuccessAction = (
73
73
  modelToUpdate
74
74
  ): UpdateModelAction | SetModelAction => {
75
75
  if (modelToUpdate) {
76
- if (typeof modelToUpdate.update === "function") {
76
+ // $FlowFixMe[prop-missing]
77
+ if (typeof modelToUpdate["update"] === "function") {
77
78
  const clonedModel = modelToUpdate.clone();
78
79
  clonedModel.update(model);
79
80
 
@@ -140,17 +141,16 @@ export const loadModularUI =
140
141
  dispatch(startProgress());
141
142
 
142
143
  const loadModelPromise = dispatch(loadModel(key, href, options));
143
- if (typeof loadModelPromise !== "function" && loadModelPromise.then) {
144
- return loadModelPromise
145
- .then((response) => {
146
- if (response?.type === "FINISH_PROGRESS") {
147
- dispatch(updateStatus(key, MODULARUI_STATUS.FINISHED));
148
- }
149
-
150
- return dispatch(finishProgress());
151
- })
152
- .catch((error) => dispatch(handleError(error)));
153
- }
144
+
145
+ return Promise.resolve(loadModelPromise)
146
+ .then((response) => {
147
+ if (response?.type === "FINISH_PROGRESS") {
148
+ dispatch(updateStatus(key, MODULARUI_STATUS.FINISHED));
149
+ }
150
+
151
+ return dispatch(finishProgress());
152
+ })
153
+ .catch((error) => dispatch(handleError(error)));
154
154
  };
155
155
 
156
156
  /**
@@ -74,7 +74,6 @@ const removeKey = (modelKey: string, state: ModularUIState): ModularUIState => {
74
74
  // eslint-disable-next-line no-unused-vars
75
75
  const { [modelKey]: _, ...newState } = state;
76
76
 
77
- // $FlowExpectedError[incompatible-return]
78
77
  return newState;
79
78
  };
80
79
 
@@ -58,6 +58,7 @@ export const handleUnauthorized =
58
58
  );
59
59
  }
60
60
 
61
+ // add current location as from location before redirect
61
62
  const location = getState().router.location;
62
63
  if (location?.pathname !== LOGIN_PATH) {
63
64
  const locationFrom = location?.state?.from;
@@ -66,17 +66,11 @@ export const login =
66
66
  .catch((error) => {
67
67
  if (error.id === "Error.ChangePasswordRequired") {
68
68
  const dispatchedReloadApplication = dispatch(reloadApplication());
69
- if (
70
- typeof dispatchedReloadApplication !== "function" &&
71
- dispatchedReloadApplication.then
72
- ) {
73
- dispatchedReloadApplication
74
- .then(() => {
75
- Cache.addItem("auth", true);
76
- return dispatch(changePassword());
77
- })
78
- .then(() => dispatch(finishProgress()));
79
- }
69
+
70
+ return Promise.resolve(dispatchedReloadApplication).then(() => {
71
+ Cache.addItem("auth", true);
72
+ return dispatch(changePassword());
73
+ });
80
74
  }
81
75
 
82
76
  dispatch(loginFailed(error.id));
@@ -27,6 +27,7 @@ describe("application actions", () => {
27
27
  href: new Href("/", "Application"),
28
28
  }),
29
29
  }),
30
+ { type: "FINISH_PROGRESS" },
30
31
  ]);
31
32
  });
32
33
 
@@ -27,6 +27,7 @@ describe("custom error response handling", () => {
27
27
  const store = mockStore({});
28
28
 
29
29
  setCustomErrorResponseHandler((error) => {
30
+ // eslint-disable-next-line jest/no-conditional-in-test
30
31
  if (error.isRemoteServiceException) {
31
32
  return {
32
33
  type: "REMOTE_SERVICE_EXCEPTION",
@@ -50,6 +51,7 @@ describe("custom error response handling", () => {
50
51
  const store = mockStore({});
51
52
 
52
53
  setCustomErrorResponseHandler((error, defaultHandler) => (dispatch) => {
54
+ // eslint-disable-next-line jest/no-conditional-in-test
53
55
  if (error.isRemoteServiceException) {
54
56
  dispatch({
55
57
  type: "REMOTE_SERVICE_EXCEPTION",
@@ -156,6 +156,7 @@ describe("xhr", () => {
156
156
  onProgress: ({ type, loaded, total, lengthComputable }) => {
157
157
  events.push({ type, loaded, total, lengthComputable });
158
158
 
159
+ // eslint-disable-next-line jest/no-conditional-in-test
159
160
  if (type === "loadend") {
160
161
  resolve(events);
161
162
  }
@@ -0,0 +1,21 @@
1
+ // @flow
2
+ import { BASE } from "../../constants/Constants";
3
+
4
+ /**
5
+ * Checks if a given url to a modular ui resource exists using a HEAD request to the resource (synchronous)
6
+ * When the resource returns a 404, the resource does not exists and the method returns false
7
+ *
8
+ * @param url
9
+ * @returns {boolean}
10
+ */
11
+ export const resourceExists = (url: string): boolean => {
12
+ const fullUrl = `${BASE}/${url}`.replace(/\/\//g, "/");
13
+
14
+ const xhr = new XMLHttpRequest();
15
+ xhr.open("HEAD", fullUrl, false);
16
+ xhr.setRequestHeader("Accept", "application/json");
17
+ xhr.setRequestHeader("Content-Type", "application/json");
18
+ xhr.send();
19
+
20
+ return xhr.status !== 404;
21
+ };
@@ -1,10 +1,10 @@
1
1
  // @flow
2
2
  import _has from "lodash/has";
3
+ import _isPlainObject from "lodash/isPlainObject";
3
4
 
4
5
  /**
5
6
  */
6
- export const isPlainObject = (value: any): boolean =>
7
- Object.prototype.toString.call(value) === "[object Object]";
7
+ export const isPlainObject = (value: any): boolean => _isPlainObject(value);
8
8
 
9
9
  /**
10
10
  */
@@ -19,6 +19,7 @@ export { default as createUUID } from "./helpers/createUUID";
19
19
  export * from "./helpers/sanitizeHtml";
20
20
  export * from "./helpers/objects";
21
21
  export * from "./helpers/text";
22
+ export * from "./helpers/checkResourceExists";
22
23
 
23
24
  // number
24
25
  export { default as DecimalFormat } from "./number/DecimalFormat";