@etsoo/materialui 1.2.77 → 1.2.79

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.
package/lib/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export * from "./app/Labels";
8
8
  export * from "./app/ReactApp";
9
9
  export * from "./app/ServiceApp";
10
10
  export * from "./messages/MessageUtils";
11
+ export * from "./messages/OperationMessageContainer";
11
12
  export * from "./messages/OperationMessageDto";
12
13
  export * from "./messages/OperationMessageHandler";
13
14
  export * from "./messages/RefreshHandler";
package/lib/index.js CHANGED
@@ -8,6 +8,7 @@ export * from "./app/Labels";
8
8
  export * from "./app/ReactApp";
9
9
  export * from "./app/ServiceApp";
10
10
  export * from "./messages/MessageUtils";
11
+ export * from "./messages/OperationMessageContainer";
11
12
  export * from "./messages/OperationMessageDto";
12
13
  export * from "./messages/OperationMessageHandler";
13
14
  export * from "./messages/RefreshHandler";
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import { OperationMessageHandlerAll } from "./OperationMessageHandler";
3
+ /**
4
+ * Operation message container properties
5
+ * 操作消息容器属性
6
+ */
7
+ export type OperationMessageContainerProps = {
8
+ /**
9
+ * Handler
10
+ * 处理器
11
+ */
12
+ handler: OperationMessageHandlerAll;
13
+ /**
14
+ * Timeout miliseconds
15
+ * 超时毫秒
16
+ */
17
+ timeout?: number;
18
+ };
19
+ /**
20
+ * Operation message container
21
+ * 操作消息容器
22
+ * @param props Props
23
+ * @returns Component
24
+ */
25
+ export declare function OperationMessageContainer(props: OperationMessageContainerProps): React.JSX.Element;
@@ -0,0 +1,39 @@
1
+ import React from "react";
2
+ import { MessageUtils } from "./MessageUtils";
3
+ /**
4
+ * Operation message container
5
+ * 操作消息容器
6
+ * @param props Props
7
+ * @returns Component
8
+ */
9
+ export function OperationMessageContainer(props) {
10
+ const { handler, timeout = 200 } = props;
11
+ const refs = React.useRef({ seed: 0, mounted: false });
12
+ const resetSeed = () => {
13
+ if (refs.current.seed > 0) {
14
+ clearTimeout(refs.current.seed);
15
+ refs.current.seed = 0;
16
+ }
17
+ };
18
+ React.useEffect(() => {
19
+ const my = typeof handler === "function"
20
+ ? handler
21
+ : (_user, _isSelf, message) => {
22
+ const [types, callback, id] = handler;
23
+ if (id == null || id === message.id) {
24
+ if (!types.includes(message.operationType))
25
+ return;
26
+ resetSeed();
27
+ refs.current.seed = window.setTimeout(callback, timeout);
28
+ }
29
+ };
30
+ MessageUtils.onOperationMessage(my);
31
+ refs.current.mounted = true;
32
+ return () => {
33
+ resetSeed();
34
+ refs.current.mounted = false;
35
+ MessageUtils.offOperationMessage(my);
36
+ };
37
+ }, []);
38
+ return React.createElement(React.Fragment, null);
39
+ }
@@ -2,7 +2,7 @@ import { OperationMessageDto } from "./OperationMessageDto";
2
2
  import { SignalRUser } from "./SignalRUser";
3
3
  /**
4
4
  * Operation message handler type
5
- * 操作信息处理程序类型
5
+ * 操作消息处理程序类型
6
6
  */
7
7
  export type OperationMessageHandler = (
8
8
  /**
@@ -16,4 +16,9 @@ isSelf: boolean,
16
16
  /**
17
17
  * Message
18
18
  */
19
- message: OperationMessageDto) => void | boolean;
19
+ message: OperationMessageDto) => void;
20
+ /**
21
+ * Operation message handler type for pages
22
+ * 操作消息处理程序类型(页面)
23
+ */
24
+ export type OperationMessageHandlerAll = [types: string[], handler: () => void] | [types: string[], handler: () => void, id: number] | OperationMessageHandler;
@@ -1,6 +1,6 @@
1
1
  import React, { FormEventHandler } from "react";
2
2
  import { CommonPageProps } from "./CommonPageProps";
3
- import { OperationMessageHandler } from "../messages/OperationMessageHandler";
3
+ import { OperationMessageHandlerAll } from "../messages/OperationMessageHandler";
4
4
  /**
5
5
  * Add / Edit page props
6
6
  */
@@ -33,7 +33,7 @@ export interface EditPageProps extends Omit<CommonPageProps, "onSubmit"> {
33
33
  /**
34
34
  * Operation message handler
35
35
  */
36
- operationMessageHandler?: OperationMessageHandler;
36
+ operationMessageHandler?: OperationMessageHandlerAll;
37
37
  }
38
38
  /**
39
39
  * Add / Edit page
@@ -6,7 +6,7 @@ import SaveIcon from "@mui/icons-material/Save";
6
6
  import DeleteIcon from "@mui/icons-material/Delete";
7
7
  import { BackButton } from "../BackButton";
8
8
  import { Labels } from "../app/Labels";
9
- import { MessageUtils } from "../messages/MessageUtils";
9
+ import { OperationMessageContainer } from "../messages/OperationMessageContainer";
10
10
  /**
11
11
  * Add / Edit page
12
12
  * @param props Props
@@ -16,15 +16,8 @@ export function EditPage(props) {
16
16
  const { children, isEditing, onDelete, onSubmit, paddings = MUGlobal.pagePaddings, scrollContainer = CommonPageScrollContainer, supportBack = true, submitDisabled = false, topPart, operationMessageHandler, ...rest } = props;
17
17
  // Labels
18
18
  const labels = Labels.CommonPage;
19
- React.useEffect(() => {
20
- if (operationMessageHandler == null)
21
- return;
22
- MessageUtils.onOperationMessage(operationMessageHandler);
23
- return () => {
24
- MessageUtils.offOperationMessage(operationMessageHandler);
25
- };
26
- }, []);
27
19
  return (React.createElement(CommonPage, { paddings: paddings, scrollContainer: scrollContainer, ...rest },
20
+ operationMessageHandler && (React.createElement(OperationMessageContainer, { handler: operationMessageHandler })),
28
21
  topPart,
29
22
  React.createElement("form", { onSubmit: onSubmit },
30
23
  React.createElement(Grid, { container: true, justifyContent: "left", spacing: paddings, paddingTop: 1 }, children),
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { MUGlobal } from "../MUGlobal";
3
3
  import { ResponsibleContainer } from "../ResponsibleContainer";
4
4
  import { CommonPage } from "./CommonPage";
5
- import { MessageUtils } from "../messages/MessageUtils";
5
+ import { OperationMessageContainer } from "../messages/OperationMessageContainer";
6
6
  /**
7
7
  * Fixed height list page
8
8
  * @param props Props
@@ -17,16 +17,9 @@ export function ResponsivePage(props) {
17
17
  // State
18
18
  const [scrollContainer, setScrollContainer] = React.useState();
19
19
  const [direction, setDirection] = React.useState(fabColumnDirection);
20
- React.useEffect(() => {
21
- if (operationMessageHandler == null)
22
- return;
23
- MessageUtils.onOperationMessage(operationMessageHandler);
24
- return () => {
25
- MessageUtils.offOperationMessage(operationMessageHandler);
26
- };
27
- }, []);
28
20
  // Layout
29
21
  return (React.createElement(CommonPage, { ...pageRest, paddings: {}, scrollContainer: scrollContainer, fabColumnDirection: direction },
22
+ operationMessageHandler && (React.createElement(OperationMessageContainer, { handler: operationMessageHandler })),
30
23
  React.createElement(ResponsibleContainer, { paddings: paddings, containerBoxSx: (paddings, hasField, _dataGrid) => {
31
24
  // Half
32
25
  const half = MUGlobal.half(paddings);
@@ -4,7 +4,7 @@ import { DataTypes, IdDefaultType } from "@etsoo/shared";
4
4
  import { ListChildComponentProps } from "react-window";
5
5
  import { ScrollerListExInnerItemRendererProps, ScrollerListExItemSize } from "../ScrollerListEx";
6
6
  import { DataGridPageProps } from "./DataGridPageProps";
7
- import { OperationMessageHandler } from "../messages/OperationMessageHandler";
7
+ import { OperationMessageHandlerAll } from "../messages/OperationMessageHandler";
8
8
  /**
9
9
  * Response page props
10
10
  */
@@ -47,5 +47,5 @@ export type ResponsePageProps<T extends object, F extends DataTypes.BasicTemplat
47
47
  /**
48
48
  * Operation message handler
49
49
  */
50
- operationMessageHandler?: OperationMessageHandler;
50
+ operationMessageHandler?: OperationMessageHandlerAll;
51
51
  };
@@ -3,7 +3,7 @@ import { DataTypes } from "@etsoo/shared";
3
3
  import { GridProps } from "@mui/material";
4
4
  import React from "react";
5
5
  import { CommonPageProps } from "./CommonPageProps";
6
- import { OperationMessageHandler } from "../messages/OperationMessageHandler";
6
+ import { OperationMessageHandlerAll } from "../messages/OperationMessageHandler";
7
7
  /**
8
8
  * View page grid item properties
9
9
  */
@@ -91,10 +91,10 @@ export interface ViewPageProps<T extends DataTypes.StringRecord> extends Omit<Co
91
91
  /**
92
92
  * Operation message handler
93
93
  */
94
- operationMessageHandler?: [
95
- id: number | undefined,
96
- handler: OperationMessageHandler | string[]
97
- ];
94
+ operationMessageHandler?: OperationMessageHandlerAll | {
95
+ id: number;
96
+ types: string[];
97
+ };
98
98
  }
99
99
  /**
100
100
  * View page
@@ -9,6 +9,7 @@ import { MUGlobal } from "../MUGlobal";
9
9
  import { PullToRefreshUI } from "../PullToRefreshUI";
10
10
  import { CommonPage } from "./CommonPage";
11
11
  import { MessageUtils } from "../messages/MessageUtils";
12
+ import { OperationMessageContainer } from "../messages/OperationMessageContainer";
12
13
  /**
13
14
  * View page grid item
14
15
  * @param props Props
@@ -117,33 +118,22 @@ export function ViewPage(props) {
117
118
  setData(result);
118
119
  }, [loadData]);
119
120
  React.useEffect(() => {
120
- const handler = (user, isSelf, message) => {
121
- if (operationMessageHandler == null)
122
- return;
123
- const [id, handler] = operationMessageHandler;
124
- if ((id == null && message.id == null) || id === message.id) {
125
- if (Array.isArray(handler)) {
126
- if (!handler.includes(message.operationType))
127
- return;
128
- }
129
- else {
130
- if (handler(user, isSelf, message) === false)
131
- return;
132
- }
133
- refresh();
134
- }
135
- };
136
- MessageUtils.onOperationMessage(handler);
137
121
  const refreshHandler = async () => {
138
122
  await refresh();
139
123
  };
140
124
  MessageUtils.onRefresh(refreshHandler);
141
125
  return () => {
142
- MessageUtils.offOperationMessage(handler);
143
126
  MessageUtils.offRefresh(refreshHandler);
144
127
  };
145
128
  }, []);
146
129
  return (React.createElement(CommonPage, { paddings: paddings, onRefresh: supportRefresh ? refresh : undefined, onUpdate: supportRefresh ? undefined : refresh, ...rest, scrollContainer: globalThis, fabColumnDirection: fabColumnDirection, fabTop: fabTop, supportBack: supportBack }, data == null ? (React.createElement(LinearProgress, null)) : (React.createElement(React.Fragment, null,
130
+ operationMessageHandler && (React.createElement(OperationMessageContainer, { handler: "id" in operationMessageHandler
131
+ ? [
132
+ operationMessageHandler.types,
133
+ refresh,
134
+ operationMessageHandler.id
135
+ ]
136
+ : operationMessageHandler })),
147
137
  React.createElement(Grid, { container: true, justifyContent: "left", spacing: spacing, className: "ET-ViewPage", ref: gridRef, sx: {
148
138
  ".MuiTypography-subtitle2": {
149
139
  fontWeight: "bold"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etsoo/materialui",
3
- "version": "1.2.77",
3
+ "version": "1.2.79",
4
4
  "description": "TypeScript Material-UI Implementation",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
package/src/index.ts CHANGED
@@ -9,6 +9,7 @@ export * from "./app/ReactApp";
9
9
  export * from "./app/ServiceApp";
10
10
 
11
11
  export * from "./messages/MessageUtils";
12
+ export * from "./messages/OperationMessageContainer";
12
13
  export * from "./messages/OperationMessageDto";
13
14
  export * from "./messages/OperationMessageHandler";
14
15
  export * from "./messages/RefreshHandler";
@@ -0,0 +1,73 @@
1
+ import React from "react";
2
+ import {
3
+ OperationMessageHandler,
4
+ OperationMessageHandlerAll
5
+ } from "./OperationMessageHandler";
6
+ import { MessageUtils } from "./MessageUtils";
7
+
8
+ /**
9
+ * Operation message container properties
10
+ * 操作消息容器属性
11
+ */
12
+ export type OperationMessageContainerProps = {
13
+ /**
14
+ * Handler
15
+ * 处理器
16
+ */
17
+ handler: OperationMessageHandlerAll;
18
+
19
+ /**
20
+ * Timeout miliseconds
21
+ * 超时毫秒
22
+ */
23
+ timeout?: number;
24
+ };
25
+
26
+ /**
27
+ * Operation message container
28
+ * 操作消息容器
29
+ * @param props Props
30
+ * @returns Component
31
+ */
32
+ export function OperationMessageContainer(
33
+ props: OperationMessageContainerProps
34
+ ) {
35
+ const { handler, timeout = 200 } = props;
36
+
37
+ const refs = React.useRef({ seed: 0, mounted: false });
38
+
39
+ const resetSeed = () => {
40
+ if (refs.current.seed > 0) {
41
+ clearTimeout(refs.current.seed);
42
+ refs.current.seed = 0;
43
+ }
44
+ };
45
+
46
+ React.useEffect(() => {
47
+ const my: OperationMessageHandler =
48
+ typeof handler === "function"
49
+ ? handler
50
+ : (_user, _isSelf, message) => {
51
+ const [types, callback, id] = handler;
52
+ if (id == null || id === message.id) {
53
+ if (!types.includes(message.operationType)) return;
54
+
55
+ resetSeed();
56
+
57
+ refs.current.seed = window.setTimeout(callback, timeout);
58
+ }
59
+ };
60
+ MessageUtils.onOperationMessage(my);
61
+
62
+ refs.current.mounted = true;
63
+
64
+ return () => {
65
+ resetSeed();
66
+ refs.current.mounted = false;
67
+
68
+ MessageUtils.offOperationMessage(my);
69
+ };
70
+ }, []);
71
+
72
+ return <React.Fragment></React.Fragment>;
73
+ }
@@ -3,7 +3,7 @@ import { SignalRUser } from "./SignalRUser";
3
3
 
4
4
  /**
5
5
  * Operation message handler type
6
- * 操作信息处理程序类型
6
+ * 操作消息处理程序类型
7
7
  */
8
8
  export type OperationMessageHandler = (
9
9
  /**
@@ -20,4 +20,13 @@ export type OperationMessageHandler = (
20
20
  * Message
21
21
  */
22
22
  message: OperationMessageDto
23
- ) => void | boolean;
23
+ ) => void;
24
+
25
+ /**
26
+ * Operation message handler type for pages
27
+ * 操作消息处理程序类型(页面)
28
+ */
29
+ export type OperationMessageHandlerAll =
30
+ | [types: string[], handler: () => void]
31
+ | [types: string[], handler: () => void, id: number]
32
+ | OperationMessageHandler;
@@ -7,8 +7,8 @@ import SaveIcon from "@mui/icons-material/Save";
7
7
  import DeleteIcon from "@mui/icons-material/Delete";
8
8
  import { BackButton } from "../BackButton";
9
9
  import { Labels } from "../app/Labels";
10
- import { MessageUtils } from "../messages/MessageUtils";
11
- import { OperationMessageHandler } from "../messages/OperationMessageHandler";
10
+ import { OperationMessageHandlerAll } from "../messages/OperationMessageHandler";
11
+ import { OperationMessageContainer } from "../messages/OperationMessageContainer";
12
12
 
13
13
  /**
14
14
  * Add / Edit page props
@@ -48,7 +48,7 @@ export interface EditPageProps extends Omit<CommonPageProps, "onSubmit"> {
48
48
  /**
49
49
  * Operation message handler
50
50
  */
51
- operationMessageHandler?: OperationMessageHandler;
51
+ operationMessageHandler?: OperationMessageHandlerAll;
52
52
  }
53
53
 
54
54
  /**
@@ -74,18 +74,11 @@ export function EditPage(props: EditPageProps) {
74
74
  // Labels
75
75
  const labels = Labels.CommonPage;
76
76
 
77
- React.useEffect(() => {
78
- if (operationMessageHandler == null) return;
79
-
80
- MessageUtils.onOperationMessage(operationMessageHandler);
81
-
82
- return () => {
83
- MessageUtils.offOperationMessage(operationMessageHandler);
84
- };
85
- }, []);
86
-
87
77
  return (
88
78
  <CommonPage paddings={paddings} scrollContainer={scrollContainer} {...rest}>
79
+ {operationMessageHandler && (
80
+ <OperationMessageContainer handler={operationMessageHandler} />
81
+ )}
89
82
  {topPart}
90
83
  <form onSubmit={onSubmit}>
91
84
  <Grid container justifyContent="left" spacing={paddings} paddingTop={1}>
@@ -4,7 +4,7 @@ import { MUGlobal } from "../MUGlobal";
4
4
  import { ResponsibleContainer } from "../ResponsibleContainer";
5
5
  import { CommonPage } from "./CommonPage";
6
6
  import { ResponsePageProps } from "./ResponsivePageProps";
7
- import { MessageUtils } from "../messages/MessageUtils";
7
+ import { OperationMessageContainer } from "../messages/OperationMessageContainer";
8
8
 
9
9
  /**
10
10
  * Fixed height list page
@@ -26,16 +26,6 @@ export function ResponsivePage<
26
26
  const [scrollContainer, setScrollContainer] = React.useState<HTMLElement>();
27
27
  const [direction, setDirection] = React.useState(fabColumnDirection);
28
28
 
29
- React.useEffect(() => {
30
- if (operationMessageHandler == null) return;
31
-
32
- MessageUtils.onOperationMessage(operationMessageHandler);
33
-
34
- return () => {
35
- MessageUtils.offOperationMessage(operationMessageHandler);
36
- };
37
- }, []);
38
-
39
29
  // Layout
40
30
  return (
41
31
  <CommonPage
@@ -44,6 +34,9 @@ export function ResponsivePage<
44
34
  scrollContainer={scrollContainer}
45
35
  fabColumnDirection={direction}
46
36
  >
37
+ {operationMessageHandler && (
38
+ <OperationMessageContainer handler={operationMessageHandler} />
39
+ )}
47
40
  <ResponsibleContainer<T, F, D>
48
41
  paddings={paddings}
49
42
  containerBoxSx={(paddings, hasField, _dataGrid) => {
@@ -6,7 +6,7 @@ import {
6
6
  ScrollerListExItemSize
7
7
  } from "../ScrollerListEx";
8
8
  import { DataGridPageProps } from "./DataGridPageProps";
9
- import { OperationMessageHandler } from "../messages/OperationMessageHandler";
9
+ import { OperationMessageHandlerAll } from "../messages/OperationMessageHandler";
10
10
 
11
11
  /**
12
12
  * Response page props
@@ -67,5 +67,5 @@ export type ResponsePageProps<
67
67
  /**
68
68
  * Operation message handler
69
69
  */
70
- operationMessageHandler?: OperationMessageHandler;
70
+ operationMessageHandler?: OperationMessageHandlerAll;
71
71
  };
@@ -19,9 +19,10 @@ import { MUGlobal } from "../MUGlobal";
19
19
  import { PullToRefreshUI } from "../PullToRefreshUI";
20
20
  import { CommonPage } from "./CommonPage";
21
21
  import { CommonPageProps } from "./CommonPageProps";
22
- import { OperationMessageHandler } from "../messages/OperationMessageHandler";
22
+ import { OperationMessageHandlerAll } from "../messages/OperationMessageHandler";
23
23
  import { MessageUtils } from "../messages/MessageUtils";
24
24
  import { RefreshHandler } from "../messages/RefreshHandler";
25
+ import { OperationMessageContainer } from "../messages/OperationMessageContainer";
25
26
 
26
27
  /**
27
28
  * View page grid item properties
@@ -165,10 +166,9 @@ export interface ViewPageProps<T extends DataTypes.StringRecord>
165
166
  /**
166
167
  * Operation message handler
167
168
  */
168
- operationMessageHandler?: [
169
- id: number | undefined,
170
- handler: OperationMessageHandler | string[]
171
- ];
169
+ operationMessageHandler?:
170
+ | OperationMessageHandlerAll
171
+ | { id: number; types: string[] };
172
172
  }
173
173
 
174
174
  function formatItemData(fieldData: unknown): string | undefined {
@@ -289,28 +289,12 @@ export function ViewPage<T extends DataTypes.StringRecord>(
289
289
  }, [loadData]);
290
290
 
291
291
  React.useEffect(() => {
292
- const handler: OperationMessageHandler = (user, isSelf, message) => {
293
- if (operationMessageHandler == null) return;
294
-
295
- const [id, handler] = operationMessageHandler;
296
- if ((id == null && message.id == null) || id === message.id) {
297
- if (Array.isArray(handler)) {
298
- if (!handler.includes(message.operationType)) return;
299
- } else {
300
- if (handler(user, isSelf, message) === false) return;
301
- }
302
- refresh();
303
- }
304
- };
305
- MessageUtils.onOperationMessage(handler);
306
-
307
292
  const refreshHandler: RefreshHandler = async () => {
308
293
  await refresh();
309
294
  };
310
295
  MessageUtils.onRefresh(refreshHandler);
311
296
 
312
297
  return () => {
313
- MessageUtils.offOperationMessage(handler);
314
298
  MessageUtils.offRefresh(refreshHandler);
315
299
  };
316
300
  }, []);
@@ -330,6 +314,19 @@ export function ViewPage<T extends DataTypes.StringRecord>(
330
314
  <LinearProgress />
331
315
  ) : (
332
316
  <React.Fragment>
317
+ {operationMessageHandler && (
318
+ <OperationMessageContainer
319
+ handler={
320
+ "id" in operationMessageHandler
321
+ ? [
322
+ operationMessageHandler.types,
323
+ refresh,
324
+ operationMessageHandler.id
325
+ ]
326
+ : operationMessageHandler
327
+ }
328
+ />
329
+ )}
333
330
  <Grid
334
331
  container
335
332
  justifyContent="left"