@j2inn/fin5-ui-utils 0.0.2 → 0.0.5-beta.1

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 (113) hide show
  1. package/dist/fantomProps/createFin5Props/index.d.ts +12 -0
  2. package/dist/fantomProps/createFin5Props/index.js +147 -0
  3. package/dist/fantomProps/createFin5Props/index.js.map +1 -0
  4. package/dist/fantomProps/createFin5Props/runCreateFin5Props.d.ts +2 -0
  5. package/dist/fantomProps/createFin5Props/runCreateFin5Props.js +17 -0
  6. package/dist/fantomProps/createFin5Props/runCreateFin5Props.js.map +1 -0
  7. package/dist/fantomProps/fantomPropsToObject.js +3 -0
  8. package/dist/fantomProps/fantomPropsToObject.js.map +1 -1
  9. package/dist/fantomProps/generateJsonFromFantomPropsFile.js +3 -0
  10. package/dist/fantomProps/generateJsonFromFantomPropsFile.js.map +1 -1
  11. package/dist/fantomProps/localePropsToJson.js +3 -0
  12. package/dist/fantomProps/localePropsToJson.js.map +1 -1
  13. package/dist/fantomProps/readFantomPropsFile.js +3 -0
  14. package/dist/fantomProps/readFantomPropsFile.js.map +1 -1
  15. package/dist/fin5Top/fin5Top.js +3 -0
  16. package/dist/fin5Top/fin5Top.js.map +1 -1
  17. package/dist/fin5Top/getFin5BinUrl.js +3 -0
  18. package/dist/fin5Top/getFin5BinUrl.js.map +1 -1
  19. package/dist/fin5Top/openFin5Alarm.js +5 -2
  20. package/dist/fin5Top/openFin5Alarm.js.map +1 -1
  21. package/dist/fin5Top/openFin5Historian.js +5 -2
  22. package/dist/fin5Top/openFin5Historian.js.map +1 -1
  23. package/dist/fin5Top/useFin5AppURLHashParameter.d.ts +7 -0
  24. package/dist/fin5Top/useFin5AppURLHashParameter.js +72 -0
  25. package/dist/fin5Top/useFin5AppURLHashParameter.js.map +1 -0
  26. package/dist/index.d.ts +6 -0
  27. package/dist/index.js +12 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/react/app/Fin5AppContainer.d.ts +36 -0
  30. package/dist/react/app/Fin5AppContainer.jsx +102 -0
  31. package/dist/react/app/Fin5AppContainer.jsx.map +1 -0
  32. package/dist/react/app/Fin5AppRootStore.d.ts +38 -0
  33. package/dist/react/app/Fin5AppRootStore.js +66 -0
  34. package/dist/react/app/Fin5AppRootStore.js.map +1 -0
  35. package/dist/react/components/ErrorBoundary.d.ts +57 -0
  36. package/dist/react/components/ErrorBoundary.jsx +177 -0
  37. package/dist/react/components/ErrorBoundary.jsx.map +1 -0
  38. package/dist/react/components/Loader.d.ts +9 -0
  39. package/dist/react/components/Loader.jsx +18 -0
  40. package/dist/react/components/Loader.jsx.map +1 -0
  41. package/dist/react/components/LoadingSpinner.jsx +19 -3
  42. package/dist/react/components/LoadingSpinner.jsx.map +1 -1
  43. package/dist/react/components/navigation/BasicLayout.d.ts +2 -1
  44. package/dist/react/components/navigation/BasicLayout.jsx +10 -3
  45. package/dist/react/components/navigation/BasicLayout.jsx.map +1 -1
  46. package/dist/react/components/navigation/MenuPage.jsx +3 -0
  47. package/dist/react/components/navigation/MenuPage.jsx.map +1 -1
  48. package/dist/react/components/navigation/Router.jsx +3 -0
  49. package/dist/react/components/navigation/Router.jsx.map +1 -1
  50. package/dist_es/fantomProps/createFin5Props/index.d.ts +12 -0
  51. package/dist_es/fantomProps/createFin5Props/index.js +141 -0
  52. package/dist_es/fantomProps/createFin5Props/index.js.map +1 -0
  53. package/dist_es/fantomProps/createFin5Props/runCreateFin5Props.d.ts +2 -0
  54. package/dist_es/fantomProps/createFin5Props/runCreateFin5Props.js +12 -0
  55. package/dist_es/fantomProps/createFin5Props/runCreateFin5Props.js.map +1 -0
  56. package/dist_es/fantomProps/fantomPropsToObject.d.ts +8 -0
  57. package/dist_es/fantomProps/fantomPropsToObject.js +179 -0
  58. package/dist_es/fantomProps/fantomPropsToObject.js.map +1 -0
  59. package/dist_es/fantomProps/generateJsonFromFantomPropsFile.d.ts +4 -0
  60. package/dist_es/fantomProps/generateJsonFromFantomPropsFile.js +13 -0
  61. package/dist_es/fantomProps/generateJsonFromFantomPropsFile.js.map +1 -0
  62. package/dist_es/fantomProps/localePropsToJson.d.ts +1 -0
  63. package/dist_es/fantomProps/localePropsToJson.js +22 -0
  64. package/dist_es/fantomProps/localePropsToJson.js.map +1 -0
  65. package/dist_es/fantomProps/readFantomPropsFile.d.ts +5 -0
  66. package/dist_es/fantomProps/readFantomPropsFile.js +36 -0
  67. package/dist_es/fantomProps/readFantomPropsFile.js.map +1 -0
  68. package/dist_es/fin5Top/fin5Top.d.ts +111 -0
  69. package/dist_es/fin5Top/fin5Top.js +55 -0
  70. package/dist_es/fin5Top/fin5Top.js.map +1 -0
  71. package/dist_es/fin5Top/getFin5BinUrl.d.ts +2 -0
  72. package/dist_es/fin5Top/getFin5BinUrl.js +6 -0
  73. package/dist_es/fin5Top/getFin5BinUrl.js.map +1 -0
  74. package/dist_es/fin5Top/openFin5Alarm.d.ts +22 -0
  75. package/dist_es/fin5Top/openFin5Alarm.js +20 -0
  76. package/dist_es/fin5Top/openFin5Alarm.js.map +1 -0
  77. package/dist_es/fin5Top/openFin5Historian.d.ts +3 -0
  78. package/dist_es/fin5Top/openFin5Historian.js +16 -0
  79. package/dist_es/fin5Top/openFin5Historian.js.map +1 -0
  80. package/dist_es/fin5Top/useFin5AppURLHashParameter.d.ts +7 -0
  81. package/dist_es/fin5Top/useFin5AppURLHashParameter.js +68 -0
  82. package/dist_es/fin5Top/useFin5AppURLHashParameter.js.map +1 -0
  83. package/dist_es/index.d.ts +18 -0
  84. package/dist_es/index.js +34 -0
  85. package/dist_es/index.js.map +1 -0
  86. package/dist_es/react/app/Fin5AppContainer.d.ts +36 -0
  87. package/dist_es/react/app/Fin5AppContainer.jsx +73 -0
  88. package/dist_es/react/app/Fin5AppContainer.jsx.map +1 -0
  89. package/dist_es/react/app/Fin5AppRootStore.d.ts +38 -0
  90. package/dist_es/react/app/Fin5AppRootStore.js +62 -0
  91. package/dist_es/react/app/Fin5AppRootStore.js.map +1 -0
  92. package/dist_es/react/components/ErrorBoundary.d.ts +57 -0
  93. package/dist_es/react/components/ErrorBoundary.jsx +150 -0
  94. package/dist_es/react/components/ErrorBoundary.jsx.map +1 -0
  95. package/dist_es/react/components/ErrorDisplayer.d.ts +19 -0
  96. package/dist_es/react/components/ErrorDisplayer.jsx +36 -0
  97. package/dist_es/react/components/ErrorDisplayer.jsx.map +1 -0
  98. package/dist_es/react/components/Loader.d.ts +9 -0
  99. package/dist_es/react/components/Loader.jsx +13 -0
  100. package/dist_es/react/components/Loader.jsx.map +1 -0
  101. package/dist_es/react/components/LoadingSpinner.d.ts +3 -0
  102. package/dist_es/react/components/LoadingSpinner.jsx +23 -0
  103. package/dist_es/react/components/LoadingSpinner.jsx.map +1 -0
  104. package/dist_es/react/components/navigation/BasicLayout.d.ts +21 -0
  105. package/dist_es/react/components/navigation/BasicLayout.jsx +104 -0
  106. package/dist_es/react/components/navigation/BasicLayout.jsx.map +1 -0
  107. package/dist_es/react/components/navigation/MenuPage.d.ts +33 -0
  108. package/dist_es/react/components/navigation/MenuPage.jsx +31 -0
  109. package/dist_es/react/components/navigation/MenuPage.jsx.map +1 -0
  110. package/dist_es/react/components/navigation/Router.d.ts +12 -0
  111. package/dist_es/react/components/navigation/Router.jsx +19 -0
  112. package/dist_es/react/components/navigation/Router.jsx.map +1 -0
  113. package/package.json +22 -11
@@ -0,0 +1,150 @@
1
+ /*
2
+ * Copyright (c) 2022, J2 Innovations. All Rights Reserved
3
+ */
4
+ import React, { useState } from 'react';
5
+ import { Button, Checkbox, Divider, Message, Container, ColorVals, } from '@j2inn/ui';
6
+ import { usei18n } from '@j2inn/utils';
7
+ import { createUseStyles, useTheme } from 'react-jss';
8
+ const boundryStyles = createUseStyles((theme) => ({
9
+ errorBoundry: {
10
+ backgroundColor: theme.bodyBg,
11
+ flex: `1 1 auto`,
12
+ },
13
+ boundryContainer: {
14
+ margin: '0 auto',
15
+ flex: `1 1 auto`,
16
+ padding: `2rem`,
17
+ maxWidth: 1024,
18
+ backgroundColor: theme.bgColor,
19
+ [`& h1, & h3`]: {
20
+ paddingBottom: `1rem`,
21
+ },
22
+ },
23
+ errorDetails: {
24
+ [`& pre`]: {
25
+ overflow: 'auto',
26
+ marginTop: '1rem',
27
+ backgroundColor: ColorVals.Black,
28
+ color: ColorVals.White,
29
+ padding: '0.3rem',
30
+ },
31
+ },
32
+ }));
33
+ function get(i18n, key, fallback) {
34
+ return i18n.has(key) ? i18n.get(key) : fallback;
35
+ }
36
+ /**
37
+ * Format an error message into something more useful for the clipboard.
38
+ */
39
+ function formatErrorMessage(error, appId) {
40
+ return JSON.stringify({
41
+ timestamp: new Date().toISOString(),
42
+ appId: appId ?? '',
43
+ location: location.href,
44
+ navigator: {
45
+ cookieEnabled: navigator.cookieEnabled,
46
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
+ deviceMemory: navigator.deviceMemory,
48
+ language: navigator.language,
49
+ languages: navigator.languages,
50
+ onLine: navigator.onLine,
51
+ userAgent: navigator.userAgent,
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
+ userAgentData: navigator.userAgentData,
54
+ vendor: navigator.vendor,
55
+ },
56
+ error: String(error.stack),
57
+ }, null, 2);
58
+ }
59
+ /**
60
+ * Shows the internal error details to a user.
61
+ */
62
+ const ErrorDetails = ({ showDetails, setShowDetails, error, appId, }) => {
63
+ const i18n = usei18n();
64
+ const classes = boundryStyles();
65
+ const theme = useTheme();
66
+ const copyToClipboard = () => {
67
+ navigator.clipboard.writeText(formatErrorMessage(error, appId));
68
+ Message.success(theme, get(i18n, 'finUi.errorBoundary.copiedErrorToClipboard', 'Copied error to clipboard'));
69
+ };
70
+ return (<div className={classes.errorDetails}>
71
+ <Checkbox onChange={(e) => {
72
+ setShowDetails(e.target.checked);
73
+ }} defaultChecked={showDetails} value={showDetails}>
74
+ {get(i18n, 'finUi.errorBoundary.showDetails', 'Show details')}
75
+ </Checkbox>
76
+ {showDetails && (<>
77
+ <pre>{error.stack}</pre>
78
+ <Container horizontal middle right>
79
+ <Button onClick={copyToClipboard}>
80
+ {get(i18n, 'finUi.errorBoundary.copyToClipboard', 'Copy to clipboard')}
81
+ </Button>
82
+ </Container>
83
+ </>)}
84
+ </div>);
85
+ };
86
+ /**
87
+ * The inner error boundary component. This is required so
88
+ * we can use hooks that can't be used in a normal class component.
89
+ */
90
+ const ErrorBoundaryInner = ({ error, mode, appId, showReportDialog, }) => {
91
+ const i18n = usei18n();
92
+ const [showDetails, setShowDetails] = useState(true);
93
+ const classes = boundryStyles();
94
+ const title = `finUi.errorBoundary.${mode}.title`;
95
+ const appName = `${appId}.name`;
96
+ const header = get(i18n, title, mode === 'global' ? 'Error' : 'Application error') +
97
+ (appId ? `: ${get(i18n, appName, appName)}` : '');
98
+ const continueMsg = get(i18n, `finUi.errorBoundary.${mode}.continue`, mode === 'global'
99
+ ? 'To continue, please reload or navigate to the home page.'
100
+ : 'To continue, please reload, navigate to the home page or another application.');
101
+ return (<Container vertical top center className={classes.errorBoundry}>
102
+ <div className={classes.boundryContainer} style={{ gap: `1rem` }}>
103
+ <h1>{header}</h1>
104
+
105
+ <h3>
106
+ {get(i18n, 'finUi.errorBoundary.description', 'The application has encountered an error when trying to display some content.')}
107
+ </h3>
108
+
109
+ <p>{continueMsg}</p>
110
+
111
+ <div>
112
+ <ErrorDetails showDetails={showDetails} setShowDetails={setShowDetails} error={error} appId={appId}/>
113
+ </div>
114
+
115
+ <Divider />
116
+
117
+ <Container horizontal middle left style={{ gap: `1rem` }}>
118
+ <Button onClick={() => window.location.reload()} type='primary'>
119
+ {get(i18n, 'finUi.common.reload', 'Reload')}
120
+ </Button>
121
+ <Button onClick={() => window.location.assign('/')}>
122
+ {get(i18n, 'finUi.common.home', 'Home')}
123
+ </Button>
124
+ </Container>
125
+
126
+ {showReportDialog && (<div style={{ marginTop: `0.5rem` }}>
127
+ <small onClick={showReportDialog}>
128
+ {get(i18n, 'finUi.errorBoundary.additionalDetails', 'If you’d like, click here to include an additional error report to our team. Any details you provide will be helpful.')}
129
+ </small>
130
+ </div>)}
131
+ </div>
132
+ </Container>);
133
+ };
134
+ /**
135
+ * A common error boundary used to capture errors.
136
+ */
137
+ export class ErrorBoundary extends React.Component {
138
+ state = {};
139
+ componentDidCatch(error, info) {
140
+ this.props.onError?.(error);
141
+ console.error(error, info);
142
+ }
143
+ static getDerivedStateFromError(error) {
144
+ return { error };
145
+ }
146
+ render() {
147
+ return this.state.error ? (<ErrorBoundaryInner error={this.state.error} mode={this.props.mode} appId={this.props.appId} showReportDialog={this.props.showReportDialog}/>) : (this.props.children);
148
+ }
149
+ }
150
+ //# sourceMappingURL=ErrorBoundary.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorBoundary.jsx","sourceRoot":"","sources":["../../../src/react/components/ErrorBoundary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import React, { ErrorInfo, ReactNode } from 'react';
2
+ interface ErrorBoundaryState {
3
+ error?: Error;
4
+ }
5
+ interface ErrorBoundaryProps {
6
+ children: ReactNode;
7
+ }
8
+ export declare class DefaultErrorBoundary extends React.Component<ErrorBoundaryProps> {
9
+ state: ErrorBoundaryState;
10
+ static getDerivedStateFromError(error: Error): ErrorBoundaryState;
11
+ componentDidCatch(error: Error, errorInfo: ErrorInfo): void;
12
+ render(): ReactNode;
13
+ }
14
+ export interface ErrorDisplayerProps {
15
+ error: Error;
16
+ extra: React.ReactNode;
17
+ }
18
+ export declare const ErrorDisplayer: React.FC<ErrorDisplayerProps>;
19
+ export {};
@@ -0,0 +1,36 @@
1
+ import { Button, Collapse, Container, Result, Typography } from '@j2inn/ui';
2
+ import React from 'react';
3
+ export class DefaultErrorBoundary extends React.Component {
4
+ state = {};
5
+ static getDerivedStateFromError(error) {
6
+ // Update state so the next render will show the fallback UI.
7
+ return { error: error };
8
+ }
9
+ componentDidCatch(error, errorInfo) {
10
+ // You can also log the error to an error reporting service
11
+ console.error(error, errorInfo);
12
+ }
13
+ render() {
14
+ if (this.state.error) {
15
+ // You can render any custom fallback UI
16
+ return (<ErrorDisplayer error={this.state.error} extra={[
17
+ <Button type='primary' key='refresh' onClick={() => window.location.reload()}>
18
+ Refresh The Page
19
+ </Button>,
20
+ ]}/>);
21
+ }
22
+ return this.props.children;
23
+ }
24
+ }
25
+ export const ErrorDisplayer = ({ error, extra, }) => {
26
+ return (<Result status='error' title='Ouch... Something Went Wrong' subTitle={<Container center>
27
+ <Collapse style={{ width: 600, textAlign: 'left' }}>
28
+ <Collapse.Panel header={`${error.toString()}`} key='1'>
29
+ <Typography.Text style={{ width: 400 }}>
30
+ {error.stack}
31
+ </Typography.Text>
32
+ </Collapse.Panel>
33
+ </Collapse>
34
+ </Container>} extra={extra}/>);
35
+ };
36
+ //# sourceMappingURL=ErrorDisplayer.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorDisplayer.jsx","sourceRoot":"","sources":["../../../src/react/components/ErrorDisplayer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAC3E,OAAO,KAA+B,MAAM,OAAO,CAAA;AAUnD,MAAM,OAAO,oBAAqB,SAAQ,KAAK,CAAC,SAA6B;IACnE,KAAK,GAAuB,EAAE,CAAA;IAEvC,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC3C,6DAA6D;QAC7D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACxB,CAAC;IAEQ,iBAAiB,CAAC,KAAY,EAAE,SAAoB;QAC5D,2DAA2D;QAC3D,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IAChC,CAAC;IAEQ,MAAM;QACd,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YACrB,wCAAwC;YACxC,OAAO,CACN,CAAC,cAAc,CACd,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CACxB,KAAK,CAAC,CAAC;oBACN,CAAC,MAAM,CACN,IAAI,CAAC,SAAS,CACd,GAAG,CAAC,SAAS,CACb,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CACxC;;MACD,EAAE,MAAM,CAAC;iBACT,CAAC,EACD,CACF,CAAA;SACD;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAA;IAC3B,CAAC;CACD;AAOD,MAAM,CAAC,MAAM,cAAc,GAAkC,CAAC,EAC7D,KAAK,EACL,KAAK,GACL,EAAE,EAAE;IACJ,OAAO,CACN,CAAC,MAAM,CACN,MAAM,CAAC,OAAO,CACd,KAAK,CAAC,8BAA8B,CACpC,QAAQ,CAAC,CACR,CAAC,SAAS,CAAC,MAAM,CAChB;KAAA,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAClD;MAAA,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CACrD;OAAA,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CACtC;QAAA,CAAC,KAAK,CAAC,KAAK,CACb;OAAA,EAAE,UAAU,CAAC,IAAI,CAClB;MAAA,EAAE,QAAQ,CAAC,KAAK,CACjB;KAAA,EAAE,QAAQ,CACX;IAAA,EAAE,SAAS,CAAC,CACZ,CACD,KAAK,CAAC,CAAC,KAAK,CAAC,EACZ,CACF,CAAA;AACF,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ /**
3
+ * A simple UI loader.
4
+ */
5
+ declare const Loader: ({ loading, children, }: {
6
+ loading: boolean;
7
+ children?: React.ReactNode;
8
+ }) => JSX.Element;
9
+ export default Loader;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * Copyright (c) 2022, J2 Innovations. All Rights Reserved
3
+ */
4
+ import React from 'react';
5
+ import LoadingSpinner from './LoadingSpinner';
6
+ /**
7
+ * A simple UI loader.
8
+ */
9
+ const Loader = ({ loading, children, }) => {
10
+ return loading ? <LoadingSpinner /> : <>{children}</>;
11
+ };
12
+ export default Loader;
13
+ //# sourceMappingURL=Loader.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Loader.jsx","sourceRoot":"","sources":["../../../src/react/components/Loader.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAE7C;;GAEG;AACH,MAAM,MAAM,GAAG,CAAC,EACf,OAAO,EACP,QAAQ,GAIR,EAAe,EAAE;IACjB,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,AAAD,EAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAA;AACtD,CAAC,CAAA;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const LoadingSpinner: React.FC;
3
+ export default LoadingSpinner;
@@ -0,0 +1,23 @@
1
+ /*
2
+ * Copyright (c) 2022, J2 Innovations. All Rights Reserved
3
+ */
4
+ import { Spin } from '@j2inn/ui';
5
+ import React from 'react';
6
+ import { createUseStyles } from 'react-jss';
7
+ const useStyles = createUseStyles(() => ({
8
+ container: {
9
+ display: 'flex',
10
+ alignItems: 'center',
11
+ justifyContent: 'center',
12
+ height: '100%',
13
+ width: '100%',
14
+ },
15
+ }));
16
+ const LoadingSpinner = () => {
17
+ const classes = useStyles();
18
+ return (<div className={classes.container}>
19
+ <Spin size='large'></Spin>
20
+ </div>);
21
+ };
22
+ export default LoadingSpinner;
23
+ //# sourceMappingURL=LoadingSpinner.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoadingSpinner.jsx","sourceRoot":"","sources":["../../../src/react/components/LoadingSpinner.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC;IACxC,SAAS,EAAE;QACV,OAAO,EAAE,MAAM;QACf,UAAU,EAAE,QAAQ;QACpB,cAAc,EAAE,QAAQ;QACxB,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,MAAM;KACb;CACD,CAAC,CAAC,CAAA;AAEH,MAAM,cAAc,GAAa,GAAG,EAAE;IACrC,MAAM,OAAO,GAAG,SAAS,EAAE,CAAA;IAC3B,OAAO,CACN,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CACjC;GAAA,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAC1B;EAAA,EAAE,GAAG,CAAC,CACN,CAAA;AACF,CAAC,CAAA;AAED,eAAe,cAAc,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { LayoutProps, MenuProps, SiderProps } from 'antd';
2
+ import React from 'react';
3
+ import { MenuPage } from './MenuPage';
4
+ export interface BasicLayoutProps {
5
+ /**
6
+ * List of pages for the menu and the routing
7
+ */
8
+ pages?: MenuPage[];
9
+ defaultPage?: string;
10
+ onPageChange?: (page: string) => void;
11
+ compactSider?: boolean;
12
+ layoutProps?: LayoutProps;
13
+ mobileHeaderProps?: LayoutProps;
14
+ siderProps?: SiderProps;
15
+ contentProps?: LayoutProps;
16
+ menuProps?: Omit<MenuProps, 'items' | 'selectedKeys' | 'onSelect'>;
17
+ }
18
+ /**
19
+ * Basic layout that combines menu and routing into one.
20
+ */
21
+ export declare const BasicLayout: React.FC<BasicLayoutProps>;
@@ -0,0 +1,104 @@
1
+ /*
2
+ * Copyright (c) 2022, J2 Innovations. All Rights Reserved
3
+ */
4
+ import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons';
5
+ import { Button, Layout, Menu } from '@j2inn/ui';
6
+ import classNames from 'classnames';
7
+ import React, { useEffect, useState } from 'react';
8
+ import { createUseStyles } from 'react-jss';
9
+ import { ErrorDisplayer } from '../ErrorDisplayer';
10
+ import { findPageByName } from './MenuPage';
11
+ import { Router } from './Router';
12
+ const HEADER_HEIGHT = 45;
13
+ const useStyles = createUseStyles((theme) => {
14
+ return {
15
+ header: {
16
+ position: 'fixed',
17
+ width: '100%',
18
+ zIndex: 1000,
19
+ padding: 0,
20
+ height: HEADER_HEIGHT,
21
+ lineHeight: '45px',
22
+ },
23
+ sider: {
24
+ overflow: 'auto',
25
+ height: '100vh',
26
+ position: 'fixed',
27
+ left: 0,
28
+ top: 0,
29
+ bottom: 0,
30
+ zIndex: 999,
31
+ paddingTop: ({ isMobile }) => isMobile ? HEADER_HEIGHT : 0,
32
+ },
33
+ menuTrigger: {
34
+ width: 45,
35
+ height: '100%',
36
+ textAlign: 'center',
37
+ fontSize: 18,
38
+ cursor: 'pointer',
39
+ transition: 'color 0.3s ease-in-out',
40
+ backgroundColor: 'transparent',
41
+ color: 'white',
42
+ '&:hover': {
43
+ color: theme.linkActiveColor,
44
+ },
45
+ },
46
+ content: ({ isMobile, compactSider }) => ({
47
+ paddingLeft: isMobile ? 0 : compactSider ? 45 : 200,
48
+ paddingTop: isMobile ? HEADER_HEIGHT : 0,
49
+ }),
50
+ };
51
+ });
52
+ // Workaround j2inn/ui exporting problem
53
+ const Header = Layout.Header;
54
+ const Sider = Layout.Sider;
55
+ const Content = Layout.Content;
56
+ /**
57
+ * Basic layout that combines menu and routing into one.
58
+ */
59
+ export const BasicLayout = ({ pages = [], defaultPage = pages?.[0].key ?? '', onPageChange, compactSider, layoutProps, mobileHeaderProps, siderProps, contentProps, menuProps, }) => {
60
+ const [currentPage, setCurrentPage] = useState(defaultPage);
61
+ // Fire onChange
62
+ useEffect(() => {
63
+ onPageChange?.(currentPage);
64
+ }, [currentPage]);
65
+ // manage mobile navigation
66
+ const [isMobile, setIsMobile] = useState(false);
67
+ const [hiddenSider, setHiddenSider] = useState(false);
68
+ const classes = useStyles({ isMobile, compactSider });
69
+ return (<Layout hasSider {...layoutProps}>
70
+ {isMobile && (<Header className={classes.header} {...mobileHeaderProps}>
71
+ {hiddenSider ? (<MenuUnfoldOutlined className={classes.menuTrigger} onClick={() => {
72
+ setHiddenSider(!hiddenSider);
73
+ }}/>) : (<MenuFoldOutlined className={classes.menuTrigger} onClick={() => {
74
+ setHiddenSider(!hiddenSider);
75
+ }}/>)}
76
+ </Header>)}
77
+ <Sider {...siderProps} className={classNames(classes.sider, siderProps?.className)} breakpoint='md' onBreakpoint={(broken) => {
78
+ setIsMobile(broken);
79
+ setHiddenSider(true);
80
+ }} collapsed={(isMobile && hiddenSider) || compactSider} collapsedWidth={isMobile && hiddenSider
81
+ ? 0
82
+ : compactSider
83
+ ? HEADER_HEIGHT
84
+ : 0} trigger={null}>
85
+ <Menu {...menuProps} items={pages} selectedKeys={[currentPage]} onSelect={({ key }) => {
86
+ if (!hiddenSider) {
87
+ setHiddenSider(true);
88
+ }
89
+ const page = findPageByName(pages, key);
90
+ if (page?.component) {
91
+ setCurrentPage(key);
92
+ }
93
+ }}/>
94
+ </Sider>
95
+ <Content className={classes.content} {...contentProps}>
96
+ <Router pages={pages} currentPage={currentPage ?? defaultPage} fallbackComponent={<ErrorDisplayer error={new Error('Page Not Found')} extra={[
97
+ <Button type='primary' key='refresh' onClick={() => setCurrentPage(defaultPage)}>
98
+ Go Home
99
+ </Button>,
100
+ ]}/>}/>
101
+ </Content>
102
+ </Layout>);
103
+ };
104
+ //# sourceMappingURL=BasicLayout.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasicLayout.jsx","sourceRoot":"","sources":["../../../../src/react/components/navigation/BasicLayout.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { ItemType } from 'antd/lib/menu/hooks/useItems';
2
+ import React, { PropsWithChildren } from 'react';
3
+ /**
4
+ * Menu page has both the data required by the menu and the data required to actually render the page.
5
+ */
6
+ export declare type MenuPage<T = Record<string, unknown>> = ItemType & Page<T>;
7
+ /**
8
+ * Menu Item that represents an application page
9
+ */
10
+ interface Page<T = Record<string, unknown>> {
11
+ key: string;
12
+ component?: React.LazyExoticComponent<React.FC<T>>;
13
+ props?: PropsWithChildren<T>;
14
+ children?: Page<T>[];
15
+ disabled?: boolean;
16
+ }
17
+ /**
18
+ * Retrieve a specific page or subPage from a root page list
19
+ * @param name the name of the searched page
20
+ * @param pages the list of root pages
21
+ */
22
+ export declare function findPageByName<T extends MenuPage>(pages: T[], name?: string): T | undefined;
23
+ /**
24
+ * Expands the list of pages to include all the subpages
25
+ */
26
+ export declare function pageTreeToPageList<T extends MenuPage>(pages: T[]): T[];
27
+ /**
28
+ * Recursively get all the subPages of a root page
29
+ * @param page root page
30
+ * @returns the whole tree of subPages as a list
31
+ */
32
+ export declare function getAllSubPages<T extends MenuPage>(page: T): T[];
33
+ export {};
@@ -0,0 +1,31 @@
1
+ /*
2
+ * Copyright (c) 2022, J2 Innovations. All Rights Reserved
3
+ */
4
+ /**
5
+ * Retrieve a specific page or subPage from a root page list
6
+ * @param name the name of the searched page
7
+ * @param pages the list of root pages
8
+ */
9
+ export function findPageByName(pages, name) {
10
+ return pageTreeToPageList(pages).find((page) => page.key === name && !page.disabled);
11
+ }
12
+ /**
13
+ * Expands the list of pages to include all the subpages
14
+ */
15
+ export function pageTreeToPageList(pages) {
16
+ return pages.flatMap((page) => getAllSubPages(page));
17
+ }
18
+ /**
19
+ * Recursively get all the subPages of a root page
20
+ * @param page root page
21
+ * @returns the whole tree of subPages as a list
22
+ */
23
+ export function getAllSubPages(page) {
24
+ if (page.children) {
25
+ return [page].concat(...page.children.map((subPage) => getAllSubPages(subPage)));
26
+ }
27
+ else {
28
+ return [page];
29
+ }
30
+ }
31
+ //# sourceMappingURL=MenuPage.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuPage.jsx","sourceRoot":"","sources":["../../../../src/react/components/navigation/MenuPage.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAqBH;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC7B,KAAU,EACV,IAAa;IAEb,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CACpC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAC7C,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAqB,KAAU;IAChE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAS,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAqB,IAAO;IACzD,IAAI,IAAI,CAAC,QAAQ,EAAE;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CACnB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAY,CAAC,CAAC,CAC/D,CAAA;KACD;SAAM;QACN,OAAO,CAAC,IAAI,CAAC,CAAA;KACb;AACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { PropsWithChildren, ReactElement } from 'react';
2
+ import { MenuPage } from './MenuPage';
3
+ export interface RouterProps<T extends MenuPage> {
4
+ pages?: T[];
5
+ currentPage: string;
6
+ onPageChange?: (selectedPage?: T) => void;
7
+ fallbackComponent?: ReactElement;
8
+ }
9
+ /**
10
+ * Renders the currently selected page from a tree of pages
11
+ */
12
+ export declare function Router<T extends MenuPage>({ pages, currentPage, onPageChange, fallbackComponent, }: PropsWithChildren<RouterProps<T>>): JSX.Element;
@@ -0,0 +1,19 @@
1
+ /*
2
+ * Copyright (c) 2022, J2 Innovations. All Rights Reserved
3
+ */
4
+ import React, { Suspense, useEffect, useMemo, } from 'react';
5
+ import LoadingSpinner from '../LoadingSpinner';
6
+ import { findPageByName } from './MenuPage';
7
+ /**
8
+ * Renders the currently selected page from a tree of pages
9
+ */
10
+ export function Router({ pages = [], currentPage, onPageChange, fallbackComponent, }) {
11
+ const page = useMemo(() => findPageByName(pages, currentPage), [pages, currentPage]);
12
+ useEffect(() => {
13
+ onPageChange?.(page);
14
+ }, [page]);
15
+ return page?.component ? (<Suspense fallback={<LoadingSpinner />}>
16
+ {React.createElement(page.component, page?.props)}
17
+ </Suspense>) : (fallbackComponent ?? <div>{currentPage} page not found</div>);
18
+ }
19
+ //# sourceMappingURL=Router.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.jsx","sourceRoot":"","sources":["../../../../src/react/components/navigation/Router.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,EAGb,QAAQ,EACR,SAAS,EACT,OAAO,GACP,MAAM,OAAO,CAAA;AACd,OAAO,cAAc,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAY,MAAM,YAAY,CAAA;AASrD;;GAEG;AACH,MAAM,UAAU,MAAM,CAAqB,EAC1C,KAAK,GAAG,EAAE,EACV,WAAW,EACX,YAAY,EACZ,iBAAiB,GACkB;IACnC,MAAM,IAAI,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,WAAW,CAAC,EACxC,CAAC,KAAK,EAAE,WAAW,CAAC,CACpB,CAAA;IAED,SAAS,CAAC,GAAG,EAAE;QACd,YAAY,EAAE,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,OAAO,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CACxB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,AAAD,EAAG,CAAC,CACtC;GAAA,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAClD;EAAA,EAAE,QAAQ,CAAC,CACX,CAAC,CAAC,CAAC,CACH,iBAAiB,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAE,eAAc,EAAE,GAAG,CAAC,CAC5D,CAAA;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@j2inn/fin5-ui-utils",
3
- "version": "0.0.2",
3
+ "version": "0.0.5-beta.1",
4
4
  "description": "A set of useful client-side utilities useful for creating UI applications on top of FIN 5",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -16,26 +16,29 @@
16
16
  "lint": "eslint --fix --ext ts,tsx,js,jsx src/",
17
17
  "lint-staged": "lint-staged",
18
18
  "test": "cross-env NODE_ENV=test && npm run test:jest",
19
- "test:jest": "jest --passWithNoTests",
19
+ "test:jest": "jest",
20
20
  "prepack": "npm run lint && npm run test && npm run build"
21
21
  },
22
22
  "author": "",
23
23
  "license": "ISC",
24
24
  "files": [
25
25
  "dist/**/*",
26
- "scripts/**/*"
26
+ "dist_es/**/*"
27
27
  ],
28
28
  "dependencies": {
29
29
  "@hot-loader/react-dom": "^17.0.2",
30
- "@j2inn/react-config": "^4.0.10",
31
- "@j2inn/ui": "^5.0.0-beta.6",
32
- "@j2inn/utils": "^5.0.6",
33
- "haystack-core": "^2.0.29",
34
- "haystack-nclient": "^3.0.12",
35
- "haystack-react": "^3.0.3",
36
- "haystack-units": "^1.0.12"
30
+ "@j2inn/react-config": "^4.0.16",
31
+ "classnames": "^2.3.1",
32
+ "js-yaml": "^4.1.0"
37
33
  },
38
34
  "peerDependencies": {
35
+ "@j2inn/app": "^1.0.17",
36
+ "@j2inn/ui": "^5.0.0-beta.17",
37
+ "@j2inn/utils": "^5.0.8",
38
+ "haystack-core": "^2.0.35",
39
+ "haystack-nclient": "^3.0.24",
40
+ "haystack-react": "^3.0.8",
41
+ "haystack-units": "^1.0.18",
39
42
  "react": "^17.0.2",
40
43
  "react-dom": "^17.0.2",
41
44
  "react-jss": "^10.9.0"
@@ -57,7 +60,11 @@
57
60
  "@babel/plugin-transform-runtime": "^7.17.0",
58
61
  "@babel/preset-typescript": "^7.16.7",
59
62
  "@babel/runtime": "^7.17.8",
63
+ "@j2inn/app": "^1.0.17",
64
+ "@j2inn/ui": "^5.0.0-beta.17",
65
+ "@j2inn/utils": "^5.0.8",
60
66
  "@types/jest": "^27.4.0",
67
+ "@types/js-yaml": "^4.0.5",
61
68
  "@types/node": "^15.0.2",
62
69
  "@types/react": "^17.0.8",
63
70
  "@typescript-eslint/eslint-plugin": "^5.28.0",
@@ -79,6 +86,10 @@
79
86
  "eslint-plugin-prettier": "^4.0.0",
80
87
  "eslint-plugin-react": "^7.29.4",
81
88
  "extract-css-chunks-webpack-plugin": "^4.9.0",
89
+ "haystack-core": "^2.0.35",
90
+ "haystack-nclient": "^3.0.24",
91
+ "haystack-react": "^3.0.8",
92
+ "haystack-units": "^1.0.18",
82
93
  "husky": "^7.0.4",
83
94
  "jest": "^27.0.3",
84
95
  "jest-chain": "^1.1.5",
@@ -109,4 +120,4 @@
109
120
  "eslint --fix"
110
121
  ]
111
122
  }
112
- }
123
+ }