@oneblink/apps-react 11.2.0-beta.1 → 11.2.0-beta.3

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.
@@ -30,18 +30,33 @@ function FormElementCalculation({ element, onChange, value }) {
30
30
  ]);
31
31
  const { calculatedValue, hasError } = React.useMemo(() => {
32
32
  try {
33
- if (!element.calculation) {
34
- throw new Error('Element has no calculation.');
33
+ const expressionResult = calculationService.evaluateExpression({
34
+ expression: element.calculation,
35
+ submission: formSubmissionModel,
36
+ formElements: form.elements,
37
+ parseDayOnlyDate: localisationService.parseDayOnlyDate,
38
+ });
39
+ switch (expressionResult.type) {
40
+ case 'RESULT': {
41
+ return {
42
+ calculatedValue: expressionResult.value,
43
+ hasError: false,
44
+ };
45
+ }
46
+ case 'MISSING_VALUES': {
47
+ // Show pre-calculation display and do not surface an error.
48
+ return {
49
+ calculatedValue: undefined,
50
+ hasError: false,
51
+ };
52
+ }
53
+ case 'INVALID_EXPRESSION': {
54
+ return {
55
+ calculatedValue: undefined,
56
+ hasError: true,
57
+ };
58
+ }
35
59
  }
36
- return {
37
- calculatedValue: calculationService.evaluateExpression({
38
- expression: element.calculation,
39
- submission: formSubmissionModel,
40
- formElements: form.elements,
41
- parseDayOnlyDate: localisationService.parseDayOnlyDate,
42
- }),
43
- hasError: false,
44
- };
45
60
  }
46
61
  catch (e) {
47
62
  console.warn('Error while setting up parsing for calculation element', element, e);
@@ -55,7 +70,7 @@ function FormElementCalculation({ element, onChange, value }) {
55
70
  // MODEL LISTENER
56
71
  React.useEffect(() => {
57
72
  onChange(element, {
58
- value: Number.isNaN(calculatedValue) ? undefined : calculatedValue,
73
+ value: calculatedValue,
59
74
  });
60
75
  }, [element, onChange, calculatedValue]);
61
76
  return (_jsx("div", { className: "cypress-calculation-element", children: _jsxs("div", { className: "ob-form__element ob-calculation", children: [_jsx(QuillHTML, { html: htmlValue, className: "cypress-calculation-result ob-calculation__content" }), hasError && (_jsx("div", { className: "notification cypress-calculation-is-invalid", role: "alert", children: _jsxs("div", { className: "columns is-vcentered", children: [_jsx("div", { className: "column is-narrow", children: _jsx(MaterialIcon, { className: "has-text-warning", children: "error" }) }), _jsx("div", { className: "column", children: _jsx("p", { children: "There is an error in the calculation for this element." }) })] }) }))] }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementCalculation.js","sourceRoot":"","sources":["../../src/form-elements/FormElementCalculation.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport useFormSubmissionModel from '../hooks/useFormSubmissionModelContext'\nimport { FormTypes } from '@oneblink/types'\nimport { Sentry } from '../apps'\nimport { localisationService } from '../apps'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport { calculationService } from '@oneblink/sdk-core'\nimport QuillHTML from '../components/QuillHTML'\nimport MaterialIcon from '../components/MaterialIcon'\nimport useFormDefinition from '../hooks/useFormDefinition'\n\ntype Props = {\n element: FormTypes.CalculationElement\n onChange: FormElementValueChangeHandler<number>\n value: unknown | undefined\n}\n\nfunction FormElementCalculation({ element, onChange, value }: Props) {\n const { formSubmissionModel } = useFormSubmissionModel()\n const form = useFormDefinition()\n\n const htmlValue = React.useMemo(() => {\n let htmlTemplate\n\n if (!isNaN(value as number)) {\n htmlTemplate = element.defaultValue\n } else {\n htmlTemplate = element.preCalculationDisplay\n }\n\n const numberValue = typeof value === 'number' ? value : 0\n return (htmlTemplate || '').replace(\n /{result}/gi,\n element.displayAsCurrency\n ? localisationService.formatCurrency(numberValue)\n : localisationService.formatNumber(numberValue),\n )\n }, [\n element.defaultValue,\n element.displayAsCurrency,\n element.preCalculationDisplay,\n value,\n ])\n\n const { calculatedValue, hasError } = React.useMemo(() => {\n try {\n if (!element.calculation) {\n throw new Error('Element has no calculation.')\n }\n\n return {\n calculatedValue: calculationService.evaluateExpression({\n expression: element.calculation,\n submission: formSubmissionModel,\n formElements: form.elements,\n parseDayOnlyDate: localisationService.parseDayOnlyDate,\n }),\n hasError: false,\n }\n } catch (e) {\n console.warn(\n 'Error while setting up parsing for calculation element',\n element,\n e,\n )\n Sentry.captureException(e)\n return {\n calculatedValue: undefined,\n hasError: true,\n }\n }\n }, [element, form.elements, formSubmissionModel])\n\n // MODEL LISTENER\n React.useEffect(() => {\n onChange(element, {\n value: Number.isNaN(calculatedValue) ? undefined : calculatedValue,\n })\n }, [element, onChange, calculatedValue])\n\n return (\n <div className=\"cypress-calculation-element\">\n <div className=\"ob-form__element ob-calculation\">\n <QuillHTML\n html={htmlValue}\n className=\"cypress-calculation-result ob-calculation__content\"\n />\n {hasError && (\n <div\n className=\"notification cypress-calculation-is-invalid\"\n role=\"alert\"\n >\n <div className=\"columns is-vcentered\">\n <div className=\"column is-narrow\">\n <MaterialIcon className=\"has-text-warning\">error</MaterialIcon>\n </div>\n <div className=\"column\">\n <p>There is an error in the calculation for this element.</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default React.memo(FormElementCalculation)\n"]}
1
+ {"version":3,"file":"FormElementCalculation.js","sourceRoot":"","sources":["../../src/form-elements/FormElementCalculation.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport useFormSubmissionModel from '../hooks/useFormSubmissionModelContext'\nimport { FormTypes } from '@oneblink/types'\nimport { Sentry } from '../apps'\nimport { localisationService } from '../apps'\nimport { FormElementValueChangeHandler } from '../types/form'\nimport { calculationService } from '@oneblink/sdk-core'\nimport QuillHTML from '../components/QuillHTML'\nimport MaterialIcon from '../components/MaterialIcon'\nimport useFormDefinition from '../hooks/useFormDefinition'\n\ntype Props = {\n element: FormTypes.CalculationElement\n onChange: FormElementValueChangeHandler<number>\n value: unknown | undefined\n}\n\nfunction FormElementCalculation({ element, onChange, value }: Props) {\n const { formSubmissionModel } = useFormSubmissionModel()\n const form = useFormDefinition()\n\n const htmlValue = React.useMemo(() => {\n let htmlTemplate\n\n if (!isNaN(value as number)) {\n htmlTemplate = element.defaultValue\n } else {\n htmlTemplate = element.preCalculationDisplay\n }\n\n const numberValue = typeof value === 'number' ? value : 0\n return (htmlTemplate || '').replace(\n /{result}/gi,\n element.displayAsCurrency\n ? localisationService.formatCurrency(numberValue)\n : localisationService.formatNumber(numberValue),\n )\n }, [\n element.defaultValue,\n element.displayAsCurrency,\n element.preCalculationDisplay,\n value,\n ])\n\n const { calculatedValue, hasError } = React.useMemo(() => {\n try {\n const expressionResult = calculationService.evaluateExpression({\n expression: element.calculation,\n submission: formSubmissionModel,\n formElements: form.elements,\n parseDayOnlyDate: localisationService.parseDayOnlyDate,\n })\n\n switch (expressionResult.type) {\n case 'RESULT': {\n return {\n calculatedValue: expressionResult.value,\n hasError: false,\n }\n }\n case 'MISSING_VALUES': {\n // Show pre-calculation display and do not surface an error.\n return {\n calculatedValue: undefined,\n hasError: false,\n }\n }\n case 'INVALID_EXPRESSION': {\n return {\n calculatedValue: undefined,\n hasError: true,\n }\n }\n }\n } catch (e) {\n console.warn(\n 'Error while setting up parsing for calculation element',\n element,\n e,\n )\n Sentry.captureException(e)\n return {\n calculatedValue: undefined,\n hasError: true,\n }\n }\n }, [element, form.elements, formSubmissionModel])\n\n // MODEL LISTENER\n React.useEffect(() => {\n onChange(element, {\n value: calculatedValue,\n })\n }, [element, onChange, calculatedValue])\n\n return (\n <div className=\"cypress-calculation-element\">\n <div className=\"ob-form__element ob-calculation\">\n <QuillHTML\n html={htmlValue}\n className=\"cypress-calculation-result ob-calculation__content\"\n />\n {hasError && (\n <div\n className=\"notification cypress-calculation-is-invalid\"\n role=\"alert\"\n >\n <div className=\"columns is-vcentered\">\n <div className=\"column is-narrow\">\n <MaterialIcon className=\"has-text-warning\">error</MaterialIcon>\n </div>\n <div className=\"column\">\n <p>There is an error in the calculation for this element.</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default React.memo(FormElementCalculation)\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "11.2.0-beta.1",
4
+ "version": "11.2.0-beta.3",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"
@@ -12,7 +12,7 @@
12
12
  "@emotion/react": "^11.14.0",
13
13
  "@emotion/styled": "^11.14.1",
14
14
  "@nylas/react": "^3.1.2",
15
- "@oneblink/sdk-core": "^10.1.0-beta.2",
15
+ "@oneblink/sdk-core": "^10.1.0-beta.7",
16
16
  "@oneblink/storage": "^7.1.2-beta.2",
17
17
  "@react-google-maps/api": "^2.20.8",
18
18
  "@react-input/mask": "^2.0.4",