@etsoo/materialui 1.0.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 (250) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.json +38 -0
  3. package/.gitattributes +2 -0
  4. package/.github/workflows/main.yml +48 -0
  5. package/.prettierignore +5 -0
  6. package/.prettierrc +6 -0
  7. package/LICENSE +21 -0
  8. package/README.md +16 -0
  9. package/__tests__/ComboBox.tsx +30 -0
  10. package/__tests__/MUGlobalTests.tsx +58 -0
  11. package/__tests__/NotifierMUTests.tsx +217 -0
  12. package/__tests__/SelectEx.tsx +26 -0
  13. package/__tests__/tsconfig.json +19 -0
  14. package/babel.config.json +11 -0
  15. package/lib/AuditDisplay.d.ts +33 -0
  16. package/lib/AuditDisplay.js +52 -0
  17. package/lib/AutocompleteExtendedProps.d.ts +64 -0
  18. package/lib/AutocompleteExtendedProps.js +1 -0
  19. package/lib/BackButton.d.ts +13 -0
  20. package/lib/BackButton.js +33 -0
  21. package/lib/BridgeCloseButton.d.ts +23 -0
  22. package/lib/BridgeCloseButton.js +32 -0
  23. package/lib/ButtonLink.d.ts +17 -0
  24. package/lib/ButtonLink.js +19 -0
  25. package/lib/ComboBox.d.ts +38 -0
  26. package/lib/ComboBox.js +108 -0
  27. package/lib/CountdownButton.d.ts +23 -0
  28. package/lib/CountdownButton.js +81 -0
  29. package/lib/CustomFabProps.d.ts +27 -0
  30. package/lib/CustomFabProps.js +1 -0
  31. package/lib/DataGridEx.d.ts +94 -0
  32. package/lib/DataGridEx.js +329 -0
  33. package/lib/DataGridRenderers.d.ts +22 -0
  34. package/lib/DataGridRenderers.js +99 -0
  35. package/lib/DialogButton.d.ts +54 -0
  36. package/lib/DialogButton.js +45 -0
  37. package/lib/DnDList.d.ts +87 -0
  38. package/lib/DnDList.js +153 -0
  39. package/lib/DraggablePaperComponent.d.ts +8 -0
  40. package/lib/DraggablePaperComponent.js +12 -0
  41. package/lib/EmailInput.d.ts +11 -0
  42. package/lib/EmailInput.js +15 -0
  43. package/lib/FabBox.d.ts +21 -0
  44. package/lib/FabBox.js +31 -0
  45. package/lib/FlexBox.d.ts +14 -0
  46. package/lib/FlexBox.js +18 -0
  47. package/lib/GridDataFormat.d.ts +10 -0
  48. package/lib/GridDataFormat.js +43 -0
  49. package/lib/IconButtonLink.d.ts +17 -0
  50. package/lib/IconButtonLink.js +16 -0
  51. package/lib/InputField.d.ts +21 -0
  52. package/lib/InputField.js +39 -0
  53. package/lib/ItemList.d.ts +56 -0
  54. package/lib/ItemList.js +69 -0
  55. package/lib/ListItemRightIcon.d.ts +4 -0
  56. package/lib/ListItemRightIcon.js +8 -0
  57. package/lib/ListMoreDisplay.d.ts +35 -0
  58. package/lib/ListMoreDisplay.js +99 -0
  59. package/lib/LoadingButton.d.ts +16 -0
  60. package/lib/LoadingButton.js +41 -0
  61. package/lib/MUGlobal.d.ts +102 -0
  62. package/lib/MUGlobal.js +184 -0
  63. package/lib/MaskInput.d.ts +34 -0
  64. package/lib/MaskInput.js +43 -0
  65. package/lib/MobileListItemRenderer.d.ts +17 -0
  66. package/lib/MobileListItemRenderer.js +35 -0
  67. package/lib/MoreFab.d.ts +45 -0
  68. package/lib/MoreFab.js +95 -0
  69. package/lib/NotifierMU.d.ts +47 -0
  70. package/lib/NotifierMU.js +387 -0
  71. package/lib/NotifierPromptProps.d.ts +22 -0
  72. package/lib/NotifierPromptProps.js +1 -0
  73. package/lib/OptionGroup.d.ts +58 -0
  74. package/lib/OptionGroup.js +81 -0
  75. package/lib/PList.d.ts +15 -0
  76. package/lib/PList.js +12 -0
  77. package/lib/ProgressCount.d.ts +44 -0
  78. package/lib/ProgressCount.js +79 -0
  79. package/lib/PullToRefreshUI.d.ts +9 -0
  80. package/lib/PullToRefreshUI.js +18 -0
  81. package/lib/RLink.d.ts +14 -0
  82. package/lib/RLink.js +37 -0
  83. package/lib/ResponsibleContainer.d.ts +87 -0
  84. package/lib/ResponsibleContainer.js +156 -0
  85. package/lib/ScrollTopFab.d.ts +7 -0
  86. package/lib/ScrollTopFab.js +25 -0
  87. package/lib/ScrollerListEx.d.ts +81 -0
  88. package/lib/ScrollerListEx.js +167 -0
  89. package/lib/SearchBar.d.ts +29 -0
  90. package/lib/SearchBar.js +260 -0
  91. package/lib/SearchField.d.ts +21 -0
  92. package/lib/SearchField.js +39 -0
  93. package/lib/SearchOptionGroup.d.ts +9 -0
  94. package/lib/SearchOptionGroup.js +14 -0
  95. package/lib/SelectBool.d.ts +13 -0
  96. package/lib/SelectBool.js +22 -0
  97. package/lib/SelectEx.d.ts +50 -0
  98. package/lib/SelectEx.js +156 -0
  99. package/lib/ShowDataComparison.d.ts +20 -0
  100. package/lib/ShowDataComparison.js +58 -0
  101. package/lib/Switch.d.ts +29 -0
  102. package/lib/Switch.js +34 -0
  103. package/lib/SwitchAnt.d.ts +25 -0
  104. package/lib/SwitchAnt.js +40 -0
  105. package/lib/TabBox.d.ts +54 -0
  106. package/lib/TabBox.js +31 -0
  107. package/lib/TableEx.d.ts +65 -0
  108. package/lib/TableEx.js +270 -0
  109. package/lib/TextFieldEx.d.ts +101 -0
  110. package/lib/TextFieldEx.js +126 -0
  111. package/lib/Tiplist.d.ts +18 -0
  112. package/lib/Tiplist.js +157 -0
  113. package/lib/TooltipClick.d.ts +15 -0
  114. package/lib/TooltipClick.js +40 -0
  115. package/lib/UserAvatar.d.ts +24 -0
  116. package/lib/UserAvatar.js +25 -0
  117. package/lib/UserAvatarEditor.d.ts +53 -0
  118. package/lib/UserAvatarEditor.js +129 -0
  119. package/lib/app/CommonApp.d.ts +38 -0
  120. package/lib/app/CommonApp.js +149 -0
  121. package/lib/app/IServiceAppSettings.d.ts +11 -0
  122. package/lib/app/IServiceAppSettings.js +1 -0
  123. package/lib/app/IServicePage.d.ts +6 -0
  124. package/lib/app/IServicePage.js +1 -0
  125. package/lib/app/IServiceUser.d.ts +14 -0
  126. package/lib/app/IServiceUser.js +1 -0
  127. package/lib/app/ISmartERPUser.d.ts +14 -0
  128. package/lib/app/ISmartERPUser.js +1 -0
  129. package/lib/app/Labels.d.ts +65 -0
  130. package/lib/app/Labels.js +62 -0
  131. package/lib/app/ReactApp.d.ts +195 -0
  132. package/lib/app/ReactApp.js +296 -0
  133. package/lib/app/ServiceApp.d.ts +78 -0
  134. package/lib/app/ServiceApp.js +244 -0
  135. package/lib/index.d.ts +74 -0
  136. package/lib/index.js +74 -0
  137. package/lib/pages/CommonPage.d.ts +11 -0
  138. package/lib/pages/CommonPage.js +60 -0
  139. package/lib/pages/CommonPageProps.d.ts +59 -0
  140. package/lib/pages/CommonPageProps.js +1 -0
  141. package/lib/pages/DataGridPage.d.ts +9 -0
  142. package/lib/pages/DataGridPage.js +79 -0
  143. package/lib/pages/DataGridPageProps.d.ts +17 -0
  144. package/lib/pages/DataGridPageProps.js +1 -0
  145. package/lib/pages/EditPage.d.ts +33 -0
  146. package/lib/pages/EditPage.js +29 -0
  147. package/lib/pages/FixedListPage.d.ts +15 -0
  148. package/lib/pages/FixedListPage.js +70 -0
  149. package/lib/pages/ListPage.d.ts +9 -0
  150. package/lib/pages/ListPage.js +50 -0
  151. package/lib/pages/ListPageProps.d.ts +7 -0
  152. package/lib/pages/ListPageProps.js +1 -0
  153. package/lib/pages/ResponsivePage.d.ts +9 -0
  154. package/lib/pages/ResponsivePage.js +45 -0
  155. package/lib/pages/ResponsivePageProps.d.ts +39 -0
  156. package/lib/pages/ResponsivePageProps.js +1 -0
  157. package/lib/pages/SearchPageProps.d.ts +30 -0
  158. package/lib/pages/SearchPageProps.js +1 -0
  159. package/lib/pages/TablePage.d.ts +9 -0
  160. package/lib/pages/TablePage.js +69 -0
  161. package/lib/pages/TablePageProps.d.ts +7 -0
  162. package/lib/pages/TablePageProps.js +1 -0
  163. package/lib/pages/ViewPage.d.ts +66 -0
  164. package/lib/pages/ViewPage.js +105 -0
  165. package/lib/texts/DateText.d.ts +34 -0
  166. package/lib/texts/DateText.js +25 -0
  167. package/lib/texts/MoneyText.d.ts +21 -0
  168. package/lib/texts/MoneyText.js +14 -0
  169. package/lib/texts/NumberText.d.ts +25 -0
  170. package/lib/texts/NumberText.js +14 -0
  171. package/package.json +97 -0
  172. package/src/AuditDisplay.tsx +114 -0
  173. package/src/AutocompleteExtendedProps.ts +83 -0
  174. package/src/BackButton.tsx +55 -0
  175. package/src/BridgeCloseButton.tsx +69 -0
  176. package/src/ButtonLink.tsx +32 -0
  177. package/src/ComboBox.tsx +251 -0
  178. package/src/CountdownButton.tsx +119 -0
  179. package/src/CustomFabProps.ts +32 -0
  180. package/src/DataGridEx.tsx +713 -0
  181. package/src/DataGridRenderers.tsx +140 -0
  182. package/src/DialogButton.tsx +163 -0
  183. package/src/DnDList.tsx +344 -0
  184. package/src/DraggablePaperComponent.tsx +19 -0
  185. package/src/EmailInput.tsx +24 -0
  186. package/src/FabBox.tsx +51 -0
  187. package/src/FlexBox.tsx +20 -0
  188. package/src/GridDataFormat.tsx +77 -0
  189. package/src/IconButtonLink.tsx +29 -0
  190. package/src/InputField.tsx +82 -0
  191. package/src/ItemList.tsx +204 -0
  192. package/src/ListItemRightIcon.tsx +9 -0
  193. package/src/ListMoreDisplay.tsx +205 -0
  194. package/src/LoadingButton.tsx +75 -0
  195. package/src/MUGlobal.ts +220 -0
  196. package/src/MaskInput.tsx +107 -0
  197. package/src/MobileListItemRenderer.tsx +79 -0
  198. package/src/MoreFab.tsx +211 -0
  199. package/src/NotifierMU.tsx +654 -0
  200. package/src/NotifierPromptProps.ts +24 -0
  201. package/src/OptionGroup.tsx +223 -0
  202. package/src/PList.tsx +27 -0
  203. package/src/ProgressCount.tsx +166 -0
  204. package/src/PullToRefreshUI.tsx +21 -0
  205. package/src/RLink.tsx +64 -0
  206. package/src/ResponsibleContainer.tsx +394 -0
  207. package/src/ScrollTopFab.tsx +34 -0
  208. package/src/ScrollerListEx.tsx +387 -0
  209. package/src/SearchBar.tsx +396 -0
  210. package/src/SearchField.tsx +82 -0
  211. package/src/SearchOptionGroup.tsx +31 -0
  212. package/src/SelectBool.tsx +33 -0
  213. package/src/SelectEx.tsx +290 -0
  214. package/src/ShowDataComparison.tsx +106 -0
  215. package/src/Switch.tsx +94 -0
  216. package/src/SwitchAnt.tsx +95 -0
  217. package/src/TabBox.tsx +118 -0
  218. package/src/TableEx.tsx +558 -0
  219. package/src/TextFieldEx.tsx +249 -0
  220. package/src/Tiplist.tsx +303 -0
  221. package/src/TooltipClick.tsx +84 -0
  222. package/src/UserAvatar.tsx +64 -0
  223. package/src/UserAvatarEditor.tsx +287 -0
  224. package/src/app/CommonApp.ts +223 -0
  225. package/src/app/IServiceAppSettings.ts +13 -0
  226. package/src/app/IServicePage.ts +6 -0
  227. package/src/app/IServiceUser.ts +17 -0
  228. package/src/app/ISmartERPUser.ts +16 -0
  229. package/src/app/Labels.ts +77 -0
  230. package/src/app/ReactApp.ts +504 -0
  231. package/src/app/ServiceApp.ts +352 -0
  232. package/src/index.ts +77 -0
  233. package/src/pages/CommonPage.tsx +128 -0
  234. package/src/pages/CommonPageProps.ts +70 -0
  235. package/src/pages/DataGridPage.tsx +140 -0
  236. package/src/pages/DataGridPageProps.ts +24 -0
  237. package/src/pages/EditPage.tsx +114 -0
  238. package/src/pages/FixedListPage.tsx +141 -0
  239. package/src/pages/ListPage.tsx +90 -0
  240. package/src/pages/ListPageProps.ts +12 -0
  241. package/src/pages/ResponsivePage.tsx +68 -0
  242. package/src/pages/ResponsivePageProps.ts +57 -0
  243. package/src/pages/SearchPageProps.ts +39 -0
  244. package/src/pages/TablePage.tsx +126 -0
  245. package/src/pages/TablePageProps.ts +12 -0
  246. package/src/pages/ViewPage.tsx +282 -0
  247. package/src/texts/DateText.tsx +74 -0
  248. package/src/texts/MoneyText.tsx +49 -0
  249. package/src/texts/NumberText.tsx +40 -0
  250. package/tsconfig.json +19 -0
@@ -0,0 +1,654 @@
1
+ import {
2
+ NotificationAlign,
3
+ NotificationMessageType,
4
+ NotificationRenderProps,
5
+ NotificationType
6
+ } from '@etsoo/notificationbase';
7
+ import { DataTypes } from '@etsoo/shared';
8
+ import {
9
+ Alert,
10
+ AlertColor,
11
+ AlertProps,
12
+ AlertTitle,
13
+ Backdrop,
14
+ Box,
15
+ Button,
16
+ CircularProgress,
17
+ CircularProgressProps,
18
+ Dialog,
19
+ DialogActions,
20
+ DialogContent,
21
+ DialogContentText,
22
+ DialogTitle,
23
+ Fade,
24
+ Slider,
25
+ Snackbar,
26
+ styled,
27
+ Switch,
28
+ TextField,
29
+ Typography
30
+ } from '@mui/material';
31
+ import { Error, Info, Help, Warning, Done } from '@mui/icons-material';
32
+ import React from 'react';
33
+ import {
34
+ INotificationBaseReact,
35
+ INotificationReact,
36
+ NotificationReact,
37
+ NotifierReact
38
+ } from '@etsoo/react';
39
+ import { DraggablePaperComponent } from './DraggablePaperComponent';
40
+ import { LoadingButton, LoadingButtonProps } from './LoadingButton';
41
+ import { Labels } from './app/Labels';
42
+
43
+ // Custom icon dialog title bar
44
+ const IconDialogTitle = styled(DialogTitle)`
45
+ ${({ theme }) => `
46
+ cursor: move;
47
+ display: flex;
48
+ align-items: center;
49
+ & .dialogTitle {
50
+ font-weight: bold;
51
+ font-size: 1.17em;
52
+ padding-left: ${theme.spacing(1)};
53
+ }
54
+ `}
55
+ `;
56
+
57
+ /**
58
+ * MU notification
59
+ */
60
+ export class NotificationMU extends NotificationReact {
61
+ // On return
62
+ // Dismiss first, then run callback
63
+ private async returnValue(value: any) {
64
+ if (this.onReturn) {
65
+ const result = await this.onReturn(value);
66
+ if (result === false) return;
67
+ }
68
+ this.dismiss();
69
+ }
70
+
71
+ // Create alert
72
+ private createAlert(_props: NotificationRenderProps, className: string) {
73
+ const labels = Labels.NotificationMU;
74
+
75
+ const {
76
+ inputs,
77
+ fullScreen,
78
+ fullWidth = true,
79
+ maxWidth,
80
+ okLabel = labels.alertOK,
81
+ primaryButton
82
+ } = this.inputProps ?? {};
83
+
84
+ let title = this.title;
85
+ let icon: React.ReactNode;
86
+ if (this.type === NotificationMessageType.Success) {
87
+ icon = <Done color="primary" />;
88
+ title ??= labels.success;
89
+ } else if (this.type === NotificationMessageType.Info) {
90
+ icon = <Info />;
91
+ title ??= labels.info;
92
+ } else if (this.type === NotificationMessageType.Warning) {
93
+ icon = <Warning color="secondary" />;
94
+ title ??= labels.warning;
95
+ } else {
96
+ icon = <Error color="error" />;
97
+ title ??= labels.alertTitle;
98
+ }
99
+
100
+ const setupProps: LoadingButtonProps = {
101
+ color: 'primary'
102
+ };
103
+
104
+ // Setup callback
105
+ if (this.renderSetup) this.renderSetup(setupProps);
106
+
107
+ return (
108
+ <Dialog
109
+ key={this.id}
110
+ open={this.open}
111
+ PaperComponent={DraggablePaperComponent}
112
+ className={className}
113
+ fullWidth={fullWidth}
114
+ maxWidth={maxWidth}
115
+ fullScreen={fullScreen}
116
+ >
117
+ <IconDialogTitle className="draggable-dialog-title">
118
+ {icon}
119
+ <span className="dialogTitle">{title}</span>
120
+ </IconDialogTitle>
121
+ <DialogContent>
122
+ <DialogContentText>{this.content}</DialogContentText>
123
+ {inputs}
124
+ </DialogContent>
125
+ <DialogActions>
126
+ <LoadingButton
127
+ {...setupProps}
128
+ onClick={async () => await this.returnValue(undefined)}
129
+ autoFocus
130
+ {...primaryButton}
131
+ >
132
+ {okLabel}
133
+ </LoadingButton>
134
+ </DialogActions>
135
+ </Dialog>
136
+ );
137
+ }
138
+
139
+ // Create confirm
140
+ private createConfirm(_props: NotificationRenderProps, className: string) {
141
+ const labels = Labels.NotificationMU;
142
+ const title = this.title ?? labels.confirmTitle;
143
+
144
+ const {
145
+ okLabel = labels.confirmYes,
146
+ cancelLabel = labels.confirmNo,
147
+ cancelButton = true,
148
+ inputs,
149
+ fullScreen,
150
+ fullWidth = true,
151
+ maxWidth,
152
+ primaryButton
153
+ } = this.inputProps ?? {};
154
+
155
+ return (
156
+ <Dialog
157
+ key={this.id}
158
+ open={this.open}
159
+ PaperComponent={DraggablePaperComponent}
160
+ className={className}
161
+ fullWidth={fullWidth}
162
+ maxWidth={maxWidth}
163
+ fullScreen={fullScreen}
164
+ >
165
+ <IconDialogTitle className="draggable-dialog-title">
166
+ <Help color="action" />
167
+ <span className="dialogTitle">{title}</span>
168
+ </IconDialogTitle>
169
+ <DialogContent>
170
+ <DialogContentText>{this.content}</DialogContentText>
171
+ {inputs}
172
+ </DialogContent>
173
+ <DialogActions>
174
+ {cancelButton && (
175
+ <LoadingButton
176
+ color="secondary"
177
+ onClick={async () => await this.returnValue(false)}
178
+ >
179
+ {cancelLabel}
180
+ </LoadingButton>
181
+ )}
182
+ <LoadingButton
183
+ color="primary"
184
+ onClick={async () => await this.returnValue(true)}
185
+ autoFocus
186
+ {...primaryButton}
187
+ >
188
+ {okLabel}
189
+ </LoadingButton>
190
+ </DialogActions>
191
+ </Dialog>
192
+ );
193
+ }
194
+
195
+ private createMessageColor(): AlertColor {
196
+ if (this.type === NotificationMessageType.Danger) return 'error';
197
+ if (this.type === NotificationMessageType.Success) return 'success';
198
+ if (this.type === NotificationMessageType.Warning) return 'warning';
199
+ return 'info';
200
+ }
201
+
202
+ // Create message
203
+ private createMessage(_props: NotificationRenderProps, className: string) {
204
+ if (!this.open) return <React.Fragment key={this.id}></React.Fragment>;
205
+
206
+ const setupProps: AlertProps = {
207
+ severity: this.createMessageColor(),
208
+ variant: 'filled'
209
+ };
210
+
211
+ // Setup callback
212
+ if (this.renderSetup) this.renderSetup(setupProps);
213
+
214
+ return (
215
+ <Fade in={true} key={this.id}>
216
+ <Alert
217
+ {...setupProps}
218
+ onClose={() => this.dismiss()} // dismiss will trigger the onReturn callback
219
+ className={className}
220
+ >
221
+ {this.title && <AlertTitle>{this.title}</AlertTitle>}
222
+ {this.content}
223
+ </Alert>
224
+ </Fade>
225
+ );
226
+ }
227
+
228
+ // Create prompt
229
+ private createPrompt(_props: NotificationRenderProps, className: string) {
230
+ const labels = Labels.NotificationMU;
231
+ const title = this.title ?? labels.promptTitle;
232
+
233
+ const {
234
+ cancelLabel = labels.promptCancel,
235
+ okLabel = labels.promptOK,
236
+ cancelButton = true,
237
+ inputs,
238
+ type,
239
+ fullScreen,
240
+ fullWidth = true,
241
+ maxWidth,
242
+ primaryButton,
243
+ ...rest
244
+ } = this.inputProps ?? {};
245
+
246
+ const inputRef = React.createRef<HTMLInputElement>();
247
+ const errorRef = React.createRef<HTMLSpanElement>();
248
+
249
+ const setError = (error?: string) => {
250
+ if (errorRef.current == null) return;
251
+ errorRef.current.innerText = error ?? '';
252
+ };
253
+
254
+ const handleSubmit = async (
255
+ event: React.MouseEvent<HTMLButtonElement>
256
+ ) => {
257
+ // Result
258
+ let result:
259
+ | boolean
260
+ | string
261
+ | void
262
+ | PromiseLike<boolean | string | void> = undefined;
263
+
264
+ const input = inputRef.current;
265
+
266
+ if (this.onReturn) {
267
+ // Inputs case, no HTMLForm set to value, set the current form
268
+ if (inputs && value == null) value = event.currentTarget.form;
269
+
270
+ if (input) {
271
+ if (type === 'date') {
272
+ const dateValue = input.valueAsDate;
273
+ if (dateValue == null && input.required) {
274
+ input.focus();
275
+ return;
276
+ }
277
+ result = this.onReturn(dateValue);
278
+ } else if (type === 'number') {
279
+ const numberValue = input.valueAsNumber;
280
+ if (isNaN(numberValue) && input.required) {
281
+ input.focus();
282
+ return;
283
+ }
284
+ result = this.onReturn(numberValue);
285
+ } else if (type === 'switch') {
286
+ const boolValue = input.value === 'true';
287
+ result = this.onReturn(boolValue);
288
+ } else {
289
+ const textValue = input.value.trim();
290
+ if (textValue === '' && input.required) {
291
+ input.focus();
292
+ return;
293
+ }
294
+ result = this.onReturn(textValue);
295
+ }
296
+ } else if (value != null) {
297
+ result = this.onReturn(value);
298
+ }
299
+ }
300
+
301
+ // Get the value
302
+ // returns false to prevent default dismiss
303
+ const v = await result;
304
+ if (v === false) {
305
+ input?.focus();
306
+ return;
307
+ }
308
+ if (typeof v === 'string') {
309
+ setError(v);
310
+ input?.focus();
311
+ return;
312
+ }
313
+
314
+ this.dismiss();
315
+ };
316
+
317
+ let localInputs: React.ReactNode;
318
+ let value: any = undefined;
319
+
320
+ if (inputs == null) {
321
+ if (type === 'switch') {
322
+ localInputs = (
323
+ <Switch
324
+ inputRef={inputRef}
325
+ {...rest}
326
+ value="true"
327
+ autoFocus
328
+ required
329
+ />
330
+ );
331
+ } else if (type === 'slider') {
332
+ localInputs = <Slider onChange={(_e, v) => (value = v)} />;
333
+ } else {
334
+ localInputs = (
335
+ <TextField
336
+ inputRef={inputRef}
337
+ onChange={() => setError(undefined)}
338
+ autoFocus
339
+ margin="dense"
340
+ fullWidth
341
+ type={type}
342
+ required
343
+ {...rest}
344
+ />
345
+ );
346
+ }
347
+ } else {
348
+ localInputs = inputs;
349
+ }
350
+
351
+ return (
352
+ <Dialog
353
+ key={this.id}
354
+ open={this.open}
355
+ PaperComponent={DraggablePaperComponent}
356
+ className={className}
357
+ fullWidth={fullWidth}
358
+ maxWidth={maxWidth}
359
+ fullScreen={fullScreen}
360
+ >
361
+ <form
362
+ onSubmit={(event) => {
363
+ event.preventDefault();
364
+ (
365
+ event.currentTarget.elements.namedItem(
366
+ 'okButton'
367
+ ) as HTMLButtonElement
368
+ )?.click();
369
+ return false;
370
+ }}
371
+ >
372
+ <IconDialogTitle className="draggable-dialog-title">
373
+ <Info color="primary" />
374
+ <span className="dialogTitle">{title}</span>
375
+ </IconDialogTitle>
376
+ <DialogContent>
377
+ <DialogContentText>{this.content}</DialogContentText>
378
+ {localInputs}
379
+ <Typography
380
+ variant="caption"
381
+ display="block"
382
+ ref={errorRef}
383
+ color={(theme) => theme.palette.error.main}
384
+ />
385
+ </DialogContent>
386
+ <DialogActions>
387
+ {cancelButton && (
388
+ <Button
389
+ color="secondary"
390
+ onClick={() => {
391
+ if (this.onReturn) this.onReturn(undefined);
392
+ this.dismiss();
393
+ }}
394
+ >
395
+ {cancelLabel}
396
+ </Button>
397
+ )}
398
+ <LoadingButton
399
+ color="primary"
400
+ autoFocus
401
+ onClick={handleSubmit}
402
+ name="okButton"
403
+ {...primaryButton}
404
+ >
405
+ {okLabel}
406
+ </LoadingButton>
407
+ </DialogActions>
408
+ </form>
409
+ </Dialog>
410
+ );
411
+ }
412
+
413
+ // Create loading
414
+ private createLoading(_props: NotificationRenderProps, className: string) {
415
+ // Properties
416
+ const setupProps: CircularProgressProps = { color: 'primary' };
417
+
418
+ const labels = Labels.NotificationMU;
419
+
420
+ // Input props
421
+ const { maxWidth = 'xs' } = this.inputProps ?? {};
422
+
423
+ // Content
424
+ let content = this.content;
425
+ if (content === '@') content = labels.loading.toString();
426
+
427
+ // Setup callback
428
+ if (this.renderSetup) this.renderSetup(setupProps);
429
+
430
+ return (
431
+ <Backdrop
432
+ key={this.id}
433
+ className={className}
434
+ sx={{
435
+ color: '#fff',
436
+ zIndex: (theme) => theme.zIndex.modal + 1
437
+ }}
438
+ open={this.open}
439
+ >
440
+ <Box
441
+ display="flex"
442
+ flexDirection="column"
443
+ flexWrap="nowrap"
444
+ alignItems="center"
445
+ sx={{
446
+ '& > :not(style) + :not(style)': {
447
+ marginTop: (theme) => theme.spacing(1)
448
+ }
449
+ }}
450
+ >
451
+ <CircularProgress {...setupProps} />
452
+ {content && (
453
+ <Box
454
+ maxWidth={maxWidth === false ? undefined : maxWidth}
455
+ >
456
+ {content}
457
+ </Box>
458
+ )}
459
+ </Box>
460
+ </Backdrop>
461
+ );
462
+ }
463
+
464
+ /**
465
+ * Render method
466
+ * @param props Props
467
+ * @param className Style class name
468
+ * @param classes Style classes
469
+ */
470
+ render(props: NotificationRenderProps, className: string) {
471
+ // Loading bar
472
+ if (this.type === NotificationType.Loading) {
473
+ return this.createLoading(props, className);
474
+ } else if (this.type === NotificationType.Confirm) {
475
+ return this.createConfirm(props, className);
476
+ } else if (this.type === NotificationType.Prompt) {
477
+ return this.createPrompt(props, className);
478
+ } else if (
479
+ this.type === NotificationType.Error ||
480
+ (this.modal && this.type in NotificationMessageType)
481
+ ) {
482
+ // Alert or modal message
483
+ return this.createAlert(props, className);
484
+ } else {
485
+ return this.createMessage(props, className);
486
+ }
487
+ }
488
+ }
489
+
490
+ // Origin constructor generics
491
+ interface origin {
492
+ vertical: 'top' | 'bottom';
493
+ horizontal: DataTypes.HAlign;
494
+ }
495
+
496
+ /**
497
+ * Antd notifier
498
+ */
499
+ export class NotifierMU extends NotifierReact {
500
+ /**
501
+ * Create state and return provider
502
+ * @param className Style class name
503
+ * @returns Provider
504
+ */
505
+ static setup(className = 'notifier-mu') {
506
+ // Create an instance
507
+ const instance = new NotifierMU();
508
+ const provider = instance.createProvider(className);
509
+ NotifierReact.updateInstance(instance);
510
+ return provider;
511
+ }
512
+
513
+ // Calculate origin from align property
514
+ private static getOrigin(align: NotificationAlign): origin | undefined {
515
+ if (align === NotificationAlign.TopLeft) {
516
+ return {
517
+ horizontal: 'left',
518
+ vertical: 'top'
519
+ };
520
+ }
521
+
522
+ if (align === NotificationAlign.TopCenter) {
523
+ return {
524
+ horizontal: 'center',
525
+ vertical: 'top'
526
+ };
527
+ }
528
+
529
+ if (align === NotificationAlign.TopRight) {
530
+ return {
531
+ horizontal: 'right',
532
+ vertical: 'top'
533
+ };
534
+ }
535
+
536
+ if (align === NotificationAlign.BottomLeft) {
537
+ return {
538
+ horizontal: 'left',
539
+ vertical: 'bottom'
540
+ };
541
+ }
542
+
543
+ if (align === NotificationAlign.BottomCenter) {
544
+ return {
545
+ horizontal: 'center',
546
+ vertical: 'bottom'
547
+ };
548
+ }
549
+
550
+ if (align === NotificationAlign.BottomRight) {
551
+ return {
552
+ horizontal: 'right',
553
+ vertical: 'bottom'
554
+ };
555
+ }
556
+
557
+ return {
558
+ horizontal: 'center',
559
+ vertical: 'top'
560
+ };
561
+ }
562
+
563
+ /**
564
+ * Create align container
565
+ * @param align Align
566
+ * @param children Children
567
+ * @param options Other options
568
+ */
569
+ protected createContainer = (
570
+ align: NotificationAlign,
571
+ children: React.ReactNode[]
572
+ ) => {
573
+ // Each align group, class equal to something similar to 'align-topleft'
574
+ const alignText = NotificationAlign[align].toLowerCase();
575
+ let className = `align-${alignText}`;
576
+
577
+ if (children.length === 0) {
578
+ return <div key={`empty-${alignText}`} className={className} />;
579
+ }
580
+
581
+ if (align === NotificationAlign.Unknown) {
582
+ // div container for style control
583
+ return (
584
+ <div key={`div-${alignText}`} className={className}>
585
+ {children}
586
+ </div>
587
+ );
588
+ }
589
+
590
+ // Use SnackBar for layout
591
+ return (
592
+ <Snackbar
593
+ anchorOrigin={NotifierMU.getOrigin(align)}
594
+ className={className}
595
+ key={`layout-${alignText}`}
596
+ sx={
597
+ align === NotificationAlign.Center
598
+ ? { position: 'fixed', top: '50%!important' }
599
+ : undefined
600
+ }
601
+ open
602
+ >
603
+ <Box
604
+ display="flex"
605
+ flexDirection="column"
606
+ flexWrap="nowrap"
607
+ key={`box-${alignText}`}
608
+ sx={{
609
+ '& > :not(style) + :not(style)': {
610
+ marginTop: (theme) => theme.spacing(1)
611
+ }
612
+ }}
613
+ >
614
+ {children}
615
+ </Box>
616
+ </Snackbar>
617
+ );
618
+ };
619
+
620
+ /**
621
+ * Add raw definition
622
+ * @param data Notification data definition
623
+ * @param modal Show as modal
624
+ */
625
+ protected addRaw(
626
+ data: INotificationBaseReact,
627
+ modal?: boolean
628
+ ): INotificationReact {
629
+ // Destruct
630
+ const {
631
+ type,
632
+ content,
633
+ title,
634
+ align,
635
+ timespan = modal ? 0 : undefined,
636
+ ...rest
637
+ } = data;
638
+
639
+ // Setup
640
+ const n = new NotificationMU(type, content, title, align, timespan);
641
+
642
+ // Assign other properties
643
+ Object.assign(n, rest);
644
+
645
+ // Is modal
646
+ if (modal != null) n.modal = modal;
647
+
648
+ // Add to the collection
649
+ this.add(n);
650
+
651
+ // Return
652
+ return n;
653
+ }
654
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Notifier prompt props
3
+ */
4
+ export type NotifierPromptProps = Record<string, any> & {
5
+ /**
6
+ * Cancel label
7
+ */
8
+ cancelLabel?: string;
9
+
10
+ /**
11
+ * OK label
12
+ */
13
+ okLabel?: string;
14
+
15
+ /**
16
+ * Multiple inputs
17
+ */
18
+ inputs: React.ReactNode;
19
+
20
+ /**
21
+ * Single type
22
+ */
23
+ type?: string;
24
+ };