@etsoo/materialui 1.2.76 → 1.2.78

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
  /**
@@ -17,3 +17,8 @@ isSelf: boolean,
17
17
  * Message
18
18
  */
19
19
  message: OperationMessageDto) => void | boolean;
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,7 +91,7 @@ export interface ViewPageProps<T extends DataTypes.StringRecord> extends Omit<Co
91
91
  /**
92
92
  * Operation message handler
93
93
  */
94
- operationMessageHandler?: OperationMessageHandler | string[];
94
+ operationMessageHandler?: OperationMessageHandlerAll;
95
95
  }
96
96
  /**
97
97
  * 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
@@ -105,6 +106,10 @@ export function ViewPage(props) {
105
106
  const { actions, children, fields, loadData, paddings = MUGlobal.pagePaddings, spacing = MUGlobal.half(MUGlobal.pagePaddings), supportRefresh = true, fabColumnDirection = true, fabTop = true, supportBack = true, pullToRefresh = true, gridRef, operationMessageHandler, ...rest } = props;
106
107
  // Data
107
108
  const [data, setData] = React.useState();
109
+ const refs = React.useRef({
110
+ seed: 0,
111
+ mounted: false
112
+ });
108
113
  // Labels
109
114
  const labels = Labels.CommonPage;
110
115
  // Container
@@ -117,30 +122,16 @@ export function ViewPage(props) {
117
122
  setData(result);
118
123
  }, [loadData]);
119
124
  React.useEffect(() => {
120
- const handler = (user, isSelf, message) => {
121
- if (operationMessageHandler == null)
122
- return;
123
- if (Array.isArray(operationMessageHandler)) {
124
- if (!operationMessageHandler.includes(message.operationType))
125
- return;
126
- }
127
- else {
128
- if (operationMessageHandler(user, isSelf, message) === false)
129
- return;
130
- }
131
- refresh();
132
- };
133
- MessageUtils.onOperationMessage(handler);
134
125
  const refreshHandler = async () => {
135
126
  await refresh();
136
127
  };
137
128
  MessageUtils.onRefresh(refreshHandler);
138
129
  return () => {
139
- MessageUtils.offOperationMessage(handler);
140
130
  MessageUtils.offRefresh(refreshHandler);
141
131
  };
142
132
  }, []);
143
133
  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,
134
+ operationMessageHandler && (React.createElement(OperationMessageContainer, { handler: operationMessageHandler })),
144
135
  React.createElement(Grid, { container: true, justifyContent: "left", spacing: spacing, className: "ET-ViewPage", ref: gridRef, sx: {
145
136
  ".MuiTypography-subtitle2": {
146
137
  fontWeight: "bold"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etsoo/materialui",
3
- "version": "1.2.76",
3
+ "version": "1.2.78",
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
  /**
@@ -21,3 +21,12 @@ export type OperationMessageHandler = (
21
21
  */
22
22
  message: OperationMessageDto
23
23
  ) => void | boolean;
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,7 +166,7 @@ export interface ViewPageProps<T extends DataTypes.StringRecord>
165
166
  /**
166
167
  * Operation message handler
167
168
  */
168
- operationMessageHandler?: OperationMessageHandler | string[];
169
+ operationMessageHandler?: OperationMessageHandlerAll;
169
170
  }
170
171
 
171
172
  function formatItemData(fieldData: unknown): string | undefined {
@@ -271,6 +272,10 @@ export function ViewPage<T extends DataTypes.StringRecord>(
271
272
 
272
273
  // Data
273
274
  const [data, setData] = React.useState<T>();
275
+ const refs = React.useRef<{ seed: number; mounted: boolean }>({
276
+ seed: 0,
277
+ mounted: false
278
+ });
274
279
 
275
280
  // Labels
276
281
  const labels = Labels.CommonPage;
@@ -286,24 +291,12 @@ export function ViewPage<T extends DataTypes.StringRecord>(
286
291
  }, [loadData]);
287
292
 
288
293
  React.useEffect(() => {
289
- const handler: OperationMessageHandler = (user, isSelf, message) => {
290
- if (operationMessageHandler == null) return;
291
- if (Array.isArray(operationMessageHandler)) {
292
- if (!operationMessageHandler.includes(message.operationType)) return;
293
- } else {
294
- if (operationMessageHandler(user, isSelf, message) === false) return;
295
- }
296
- refresh();
297
- };
298
- MessageUtils.onOperationMessage(handler);
299
-
300
294
  const refreshHandler: RefreshHandler = async () => {
301
295
  await refresh();
302
296
  };
303
297
  MessageUtils.onRefresh(refreshHandler);
304
298
 
305
299
  return () => {
306
- MessageUtils.offOperationMessage(handler);
307
300
  MessageUtils.offRefresh(refreshHandler);
308
301
  };
309
302
  }, []);
@@ -323,6 +316,9 @@ export function ViewPage<T extends DataTypes.StringRecord>(
323
316
  <LinearProgress />
324
317
  ) : (
325
318
  <React.Fragment>
319
+ {operationMessageHandler && (
320
+ <OperationMessageContainer handler={operationMessageHandler} />
321
+ )}
326
322
  <Grid
327
323
  container
328
324
  justifyContent="left"