namirasoft-account-react 1.5.4 → 1.5.6

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 (143) hide show
  1. package/.env.template +15 -15
  2. package/SKILLS.md +514 -514
  3. package/config-overrides.js +72 -72
  4. package/dist/App.css +31 -31
  5. package/dist/App.d.ts +1 -1
  6. package/dist/UseParams.d.ts +1 -1
  7. package/dist/UseParams.js +4 -1
  8. package/dist/UseParams.js.map +1 -1
  9. package/dist/components/NSAAccessListDialog.d.ts +2 -2
  10. package/dist/components/NSAAccessListDialog.module.css +71 -71
  11. package/dist/components/NSABoxSecret.d.ts +1 -1
  12. package/dist/components/NSABoxSecret.module.css +23 -23
  13. package/dist/components/NSAMasterMenu.d.ts +1 -1
  14. package/dist/components/NSAMasterMenu.module.css +248 -248
  15. package/dist/components/NSAMasterMenuItem.d.ts +1 -1
  16. package/dist/components/NSAMessageListDialog.d.ts +1 -1
  17. package/dist/components/NSAMessageListDialog.module.css +99 -99
  18. package/dist/components/NSANavigationGuard.d.ts +1 -1
  19. package/dist/components/NSAProductListDialog.d.ts +1 -1
  20. package/dist/components/NSAProductListDialog.module.css +44 -44
  21. package/dist/components/NSAReorderDialog.d.ts +1 -1
  22. package/dist/components/NSAReorderDialog.module.css +49 -49
  23. package/dist/components/NSASortDialog.d.ts +1 -1
  24. package/dist/components/NSATaskBar.d.ts +1 -1
  25. package/dist/components/NSATaskBar.module.css +57 -57
  26. package/dist/components/NSAUserDialog.d.ts +1 -1
  27. package/dist/components/NSAUserDialog.module.css +67 -67
  28. package/dist/components/NSAWorkspaceListDialog.d.ts +1 -1
  29. package/dist/components/NSAWorkspaceListDialog.module.css +41 -41
  30. package/dist/components/NSFBoxCategoryScope.d.ts +1 -1
  31. package/dist/components/NSFBoxField.d.ts +1 -1
  32. package/dist/components/NSFBoxSlot.d.ts +1 -1
  33. package/dist/components/NSFBoxWrapper.d.ts +1 -1
  34. package/dist/components/NSLabelSecret.d.ts +1 -1
  35. package/dist/components/quickfilter/NSAFilterBoxEnum.module.css +44 -44
  36. package/dist/components/quickfilter/NSAQuickFilterBar.d.ts +1 -1
  37. package/dist/components/quickfilter/NSAQuickFilterBar.module.css +19 -19
  38. package/dist/components/quickfilter/NSAQuickFilterDialog.d.ts +1 -1
  39. package/dist/components/quickfilter/NSAQuickFilterDialog.module.css +74 -74
  40. package/dist/layouts/NSALayout.d.ts +1 -1
  41. package/dist/layouts/NSASectionEdit.d.ts +1 -1
  42. package/dist/layouts/NSASectionEditTabPage.d.ts +1 -1
  43. package/dist/layouts/NSASectionEditTabPage.module.css +4 -4
  44. package/dist/layouts/NSASectionList.d.ts +1 -1
  45. package/dist/layouts/NSASectionList.module.css +31 -31
  46. package/dist/layouts/NSASectionView.d.ts +1 -1
  47. package/dist/layouts/NSASectionViewTabMore.d.ts +1 -1
  48. package/dist/layouts/NSASectionViewTabPage.d.ts +1 -1
  49. package/dist/layouts/NSASectionViewTabPage.module.css +47 -47
  50. package/dist/pages/NSAConsentPage.d.ts +3 -3
  51. package/dist/pages/NSAConsentPage.js +3 -3
  52. package/dist/pages/NSAConsentPage.js.map +1 -1
  53. package/dist/pages/NSAConsentPage.module.css +26 -26
  54. package/dist/pages/NSAEmailVerificationPage.d.ts +1 -1
  55. package/dist/pages/NSAHomePage.d.ts +1 -1
  56. package/dist/pages/NSAHomePage.module.css +41 -41
  57. package/dist/pages/NSALoginPage.d.ts +1 -1
  58. package/dist/pages/NSALoginPage.module.css +26 -26
  59. package/dist/pages/NSAPhoneVerificationPage.d.ts +1 -1
  60. package/dist/pages/NSAVerificationPage.d.ts +1 -1
  61. package/dist/pages/NSAVerificationPage.module.css +31 -31
  62. package/package.json +95 -95
  63. package/public/index.html +21 -21
  64. package/src/App.css +31 -31
  65. package/src/App.tsx +19 -19
  66. package/src/CTFRow.ts +7 -7
  67. package/src/FieldCacheService.ts +38 -38
  68. package/src/IEntityInfo.ts +33 -33
  69. package/src/NSACacheService.ts +120 -120
  70. package/src/NSAFilterOperators.ts +92 -92
  71. package/src/NSARouterMaker.tsx +142 -142
  72. package/src/NSARouterMakerConfig.ts +15 -15
  73. package/src/NSARouterMakerProps.ts +24 -24
  74. package/src/Router.tsx +45 -45
  75. package/src/UseParams.tsx +20 -18
  76. package/src/components/NSAAccessListDialog.module.css +71 -71
  77. package/src/components/NSAAccessListDialog.tsx +178 -178
  78. package/src/components/NSABoxSecret.module.css +23 -23
  79. package/src/components/NSABoxSecret.tsx +264 -264
  80. package/src/components/NSAMasterMenu.module.css +248 -248
  81. package/src/components/NSAMasterMenu.tsx +169 -169
  82. package/src/components/NSAMasterMenuItem.tsx +250 -250
  83. package/src/components/NSAMessageListDialog.module.css +99 -99
  84. package/src/components/NSAMessageListDialog.tsx +142 -142
  85. package/src/components/NSANavigationGuard.tsx +79 -79
  86. package/src/components/NSAProductListDialog.module.css +44 -44
  87. package/src/components/NSAProductListDialog.tsx +88 -88
  88. package/src/components/NSAReorderDialog.module.css +49 -49
  89. package/src/components/NSAReorderDialog.tsx +149 -149
  90. package/src/components/NSASortDialog.tsx +117 -117
  91. package/src/components/NSATable.tsx +545 -545
  92. package/src/components/NSATaskBar.module.css +57 -57
  93. package/src/components/NSATaskBar.tsx +193 -193
  94. package/src/components/NSAUserDialog.module.css +67 -67
  95. package/src/components/NSAUserDialog.tsx +122 -122
  96. package/src/components/NSAWorkspaceListDialog.module.css +41 -41
  97. package/src/components/NSAWorkspaceListDialog.tsx +147 -147
  98. package/src/components/NSFBoxCategoryScope.tsx +52 -52
  99. package/src/components/NSFBoxField.tsx +37 -37
  100. package/src/components/NSFBoxSlot.tsx +71 -71
  101. package/src/components/NSFBoxWrapper.tsx +69 -69
  102. package/src/components/NSLabelSecret.tsx +37 -37
  103. package/src/components/quickfilter/NSAFilterBoxBase.tsx +89 -89
  104. package/src/components/quickfilter/NSAFilterBoxBoolean.tsx +66 -66
  105. package/src/components/quickfilter/NSAFilterBoxDate.tsx +110 -110
  106. package/src/components/quickfilter/NSAFilterBoxDateTime.tsx +110 -110
  107. package/src/components/quickfilter/NSAFilterBoxEnum.module.css +44 -44
  108. package/src/components/quickfilter/NSAFilterBoxEnum.tsx +79 -79
  109. package/src/components/quickfilter/NSAFilterBoxNumber.tsx +145 -145
  110. package/src/components/quickfilter/NSAFilterBoxString.tsx +83 -83
  111. package/src/components/quickfilter/NSAFilterBoxTime.tsx +106 -106
  112. package/src/components/quickfilter/NSAQuickFilterBar.module.css +19 -19
  113. package/src/components/quickfilter/NSAQuickFilterBar.tsx +142 -142
  114. package/src/components/quickfilter/NSAQuickFilterDialog.module.css +74 -74
  115. package/src/components/quickfilter/NSAQuickFilterDialog.tsx +260 -260
  116. package/src/css.d.ts +13 -13
  117. package/src/formatters/SecretFormatter.tsx +24 -24
  118. package/src/index.tsx +26 -26
  119. package/src/layouts/Actions.ts +146 -146
  120. package/src/layouts/CFTUtil.ts +18 -18
  121. package/src/layouts/NSALayout.tsx +739 -739
  122. package/src/layouts/NSASectionEdit.tsx +282 -282
  123. package/src/layouts/NSASectionEditTabPage.module.css +4 -4
  124. package/src/layouts/NSASectionEditTabPage.tsx +257 -257
  125. package/src/layouts/NSASectionList.module.css +31 -31
  126. package/src/layouts/NSASectionList.tsx +148 -148
  127. package/src/layouts/NSASectionView.tsx +99 -99
  128. package/src/layouts/NSASectionViewTabMore.tsx +77 -77
  129. package/src/layouts/NSASectionViewTabPage.module.css +47 -47
  130. package/src/layouts/NSASectionViewTabPage.tsx +400 -400
  131. package/src/main.ts +46 -46
  132. package/src/pages/NSAConsentPage.module.css +26 -26
  133. package/src/pages/NSAConsentPage.tsx +120 -120
  134. package/src/pages/NSAEmailVerificationPage.tsx +30 -30
  135. package/src/pages/NSAHomePage.module.css +41 -41
  136. package/src/pages/NSAHomePage.tsx +123 -123
  137. package/src/pages/NSALoginPage.module.css +26 -26
  138. package/src/pages/NSALoginPage.tsx +87 -87
  139. package/src/pages/NSAPhoneVerificationPage.tsx +94 -94
  140. package/src/pages/NSAVerificationPage.module.css +31 -31
  141. package/src/pages/NSAVerificationPage.tsx +186 -186
  142. package/src/pages/PaymentRequired.tsx +76 -76
  143. package/tsconfig.json +43 -43
@@ -1,283 +1,283 @@
1
- import { IStorageLocal, NamingConvention } from "namirasoft-core";
2
- import { EntityResolveResponseRow } from "namirasoft-field";
3
- import { IBaseComponentProps, NSButtonBlue, NSID, NSLine, NSLoading, NSPanel, NSSection, NSSpace, NSSpaceSizeType } from "namirasoft-site-react";
4
- import { Component, createRef, FormHTMLAttributes, ReactNode } from "react";
5
- import { NSANavigationGuard } from "../components/NSANavigationGuard";
6
- import { IEntityInfo } from "../IEntityInfo";
7
- import { NSARouterMakerProps } from "../NSARouterMakerProps";
8
- import { NSASectionEditTabPage, NSASectionEditTabPageEditorProps, NSASectionEditTabPageUIProps } from "./NSASectionEditTabPage";
9
- import { NSASectionViewTabPage, NSASectionViewTabPageUIProps } from "./NSASectionViewTabPage";
10
-
11
- export interface NSASectionEditCustomProps<RowType extends { id: string }, RowTypeInput = RowType> extends NSARouterMakerProps, IBaseComponentProps
12
- {
13
- isEdit: boolean;
14
- ui: {
15
- panel?: IBaseComponentProps;
16
- form?: FormHTMLAttributes<HTMLFormElement>;
17
- tab_page_edit: {
18
- ui?: NSASectionEditTabPageUIProps;
19
- editor: NSASectionEditTabPageEditorProps<RowType, RowTypeInput>;
20
- };
21
- tab_page_view?: NSASectionViewTabPageUIProps<RowType>;
22
- getChildrenBefore?: (id: string, row: RowType | null) => ReactNode;
23
- getChildrenAfter?: (id: string, row: RowType | null) => ReactNode;
24
- }
25
- onLoaded?: () => void;
26
- onRowLoaded?: (item: RowType) => void;
27
- children?: React.ReactNode;
28
- }
29
-
30
- export interface NSASectionEditProps<RowType extends { id: string }, RowTypeInput = RowType> extends NSASectionEditCustomProps<RowType, RowTypeInput>, NSARouterMakerProps
31
- {
32
- model: {
33
- id: string | null;
34
- row: RowType | null;
35
- };
36
- entity: IEntityInfo<RowType, RowTypeInput>,
37
- ctf: {
38
- enabled: boolean;
39
- rows: EntityResolveResponseRow | null;
40
- };
41
- deleteFieldCache: () => void;
42
- children: ReactNode;
43
- }
44
-
45
- interface NSASectionEditState<RowType>
46
- {
47
- row: RowType | null;
48
- loading: boolean;
49
- isDirty: boolean;
50
- }
51
-
52
- export class NSASectionEdit<RowType extends { id: string }, RowTypeInput = RowType> extends Component<NSASectionEditProps<RowType, RowTypeInput>, NSASectionEditState<RowType>>
53
- {
54
- NSASectionViewTabPage_Ref = createRef<NSASectionViewTabPage<RowType, RowTypeInput>>();
55
- NSASectionEditTabPage_Ref = createRef<NSASectionEditTabPage<RowType, RowTypeInput>>();
56
-
57
- constructor(props: NSASectionEditProps<RowType, RowTypeInput>)
58
- {
59
- super(props);
60
-
61
- this.state = {
62
- row: this.props.model.row,
63
- loading: !this.props.model.row,
64
- isDirty: false,
65
- };
66
-
67
- this.reload = this.reload.bind(this);
68
- this.getRow = this.getRow.bind(this);
69
- this.onApply = this.onApply.bind(this);
70
- this.markDirty = this.markDirty.bind(this);
71
- }
72
- private markDirty()
73
- {
74
- if (!this.state.isDirty)
75
- this.setState(prev => ({ ...prev, isDirty: true }));
76
- }
77
- reload()
78
- {
79
- this.setState(() => ({ row: null, loading: true }));
80
- if (this.props.model.id)
81
- this.props.entity.server.get?.(this.props.model.id).then(row =>
82
- {
83
- this.setState(
84
- () => ({ row, loading: false, isDirty: false }),
85
- () =>
86
- {
87
- this.props.onLoaded?.();
88
- this.props.onRowLoaded?.(row);
89
- }
90
- );
91
- }).catch(() => { });
92
- }
93
- getRow()
94
- {
95
- return this.state.row;
96
- }
97
- async onApply(onFinshied: () => void): Promise<void>
98
- {
99
- try
100
- {
101
- let Name_Pascal_Space = NamingConvention.lower_case_underscore.convert(this.props.entity.name, NamingConvention.Pascal_Case_Space);
102
-
103
- let onSuccess = (new_row: RowType, message: string) =>
104
- {
105
- this.props.notifier.onSuccess(message);
106
- this.setState(prev => ({ ...prev, isDirty: false }), () =>
107
- {
108
- let handled = false;
109
- if (this.props.entity.client.onSuccess)
110
- handled = this.props.entity.client.onSuccess(new_row);
111
- if (!handled)
112
- {
113
- let url = null;
114
- if (this.props.entity.client.getViewURL)
115
- url = this.props.entity.client.getViewURL(new_row.id);
116
- else if (this.props.entity.client.getListURL)
117
- url = this.props.entity.client.getListURL();
118
- if (url)
119
- this.props.url.redirect(url, {});
120
- }
121
- });
122
- };
123
- let cur_row: RowTypeInput | null = null;
124
- if (this.NSASectionEditTabPage_Ref.current)
125
- cur_row = await this.NSASectionEditTabPage_Ref.current.getInputRow();
126
- if (cur_row)
127
- if (this.props.isEdit)
128
- {
129
- if (this.props.model.id)
130
- {
131
- if (this.props.entity.client.onUpdate)
132
- {
133
- this.props.entity.client.onUpdate(this.props.model.id, cur_row).then(new_entity =>
134
- {
135
- if (new_entity)
136
- onSuccess(new_entity, Name_Pascal_Space + " has been updated successfully");
137
- if (this.props.model.id)
138
- NSID.clearID(new IStorageLocal(), this.props.model.id);
139
- onFinshied();
140
- }).catch(onFinshied);
141
- }
142
- else if (this.props.entity.server.update)
143
- {
144
- this.props.entity.server.update(this.props.model.id, cur_row).then(new_entity =>
145
- {
146
- onSuccess(new_entity, Name_Pascal_Space + " has been updated successfully");
147
- if (this.props.model.id)
148
- NSID.clearID(new IStorageLocal(), this.props.model.id);
149
- onFinshied();
150
- }).catch(onFinshied);
151
- }
152
- else
153
- onFinshied();
154
- }
155
- else
156
- throw new Error("ID was not provided.");
157
- }
158
- else
159
- {
160
- if (this.props.entity.client.onCreate)
161
- {
162
- this.props.entity.client.onCreate(cur_row).then(new_entity =>
163
- {
164
- if (new_entity)
165
- onSuccess(new_entity, Name_Pascal_Space + " has been created successfully");
166
- onFinshied();
167
- }).catch(onFinshied);
168
- }
169
- else if (this.props.entity.server.create)
170
- {
171
- this.props.entity.server.create(cur_row).then(new_entity =>
172
- {
173
- onSuccess(new_entity, Name_Pascal_Space + " has been created successfully");;
174
- onFinshied();
175
- }).catch(onFinshied);
176
- }
177
- else
178
- onFinshied();
179
- }
180
- else
181
- onFinshied();
182
- } catch (error: any)
183
- {
184
- this.props.notifier.onError(error);
185
- onFinshied();
186
- }
187
- }
188
- override componentDidMount()
189
- {
190
- let { id, row } = this.props.model;
191
-
192
- if ((id && !row) || (id && id !== row?.id))
193
- this.reload();
194
- else
195
- this.setState(
196
- () => ({ loading: false, isDirty: false }),
197
- () => this.props.onLoaded?.()
198
- );
199
- }
200
- override render()
201
- {
202
- return (
203
- <>
204
- <NSANavigationGuard when={this.state.isDirty} />
205
- <NSSection
206
- id={this.props.id}
207
- classList={[`${this.props.classList?.join(" ") ?? ""}`]}
208
- style={{ ...this.props.style }}
209
- >
210
- {
211
- !this.state.loading
212
- ?
213
- <NSPanel
214
- id={this.props.ui.panel?.id}
215
- classList={[`${this.props.ui.panel?.classList?.join(" ") ?? ""}`]}
216
- style={{ ...this.props.ui.panel?.style }}
217
- >
218
- <form
219
- {...this.props.ui.form}
220
- onInput={this.markDirty}
221
- onChange={this.markDirty}
222
- onSubmit={(e) =>
223
- {
224
- e.preventDefault()
225
- }}
226
- >
227
- <NSASectionEditTabPage<RowType, RowTypeInput>
228
- ref={this.NSASectionEditTabPage_Ref}
229
- {...this.props}
230
- model={{
231
- id: this.props.model.id,
232
- row: this.state.row
233
- }}
234
- editor={this.props.ui.tab_page_edit.editor}
235
- ui={this.props.ui.tab_page_edit.ui}
236
- >
237
- {this.props.children}
238
- </NSASectionEditTabPage>
239
- </form>
240
- </NSPanel>
241
- :
242
- <NSLoading />
243
- }
244
- <NSSpace size={NSSpaceSizeType.SMALL}></NSSpace>
245
- <NSButtonBlue
246
- title="Apply"
247
- onClick={{
248
- action: (onFinished) =>
249
- {
250
- this.onApply(onFinished);
251
- }
252
- }}
253
- />
254
- </NSSection>
255
- {
256
- this.props.isEdit && (this.props.ui.tab_page_view?.enabled ?? true) && !this.state.loading &&
257
- <>
258
- <NSSpace size={NSSpaceSizeType.SMALL} />
259
- <NSLine />
260
- <NSSpace size={NSSpaceSizeType.SMALL} />
261
- {
262
- this.props.ui.getChildrenBefore &&
263
- this.props.ui.getChildrenBefore(this.props.model.id ?? "", this.state.row)
264
- }
265
- <NSASectionViewTabPage<RowType, RowTypeInput>
266
- ref={this.NSASectionViewTabPage_Ref}
267
- {...this.props}
268
- model={{
269
- id: this.props.model.id,
270
- row: this.state.row
271
- }}
272
- ui={this.props.ui.tab_page_view}
273
- />
274
- {
275
- this.props.ui.getChildrenAfter &&
276
- this.props.ui.getChildrenAfter(this.props.model.id ?? "", this.state.row)
277
- }
278
- </>
279
- }
280
- </>
281
- );
282
- }
1
+ import { IStorageLocal, NamingConvention } from "namirasoft-core";
2
+ import { EntityResolveResponseRow } from "namirasoft-field";
3
+ import { IBaseComponentProps, NSButtonBlue, NSID, NSLine, NSLoading, NSPanel, NSSection, NSSpace, NSSpaceSizeType } from "namirasoft-site-react";
4
+ import { Component, createRef, FormHTMLAttributes, ReactNode } from "react";
5
+ import { NSANavigationGuard } from "../components/NSANavigationGuard";
6
+ import { IEntityInfo } from "../IEntityInfo";
7
+ import { NSARouterMakerProps } from "../NSARouterMakerProps";
8
+ import { NSASectionEditTabPage, NSASectionEditTabPageEditorProps, NSASectionEditTabPageUIProps } from "./NSASectionEditTabPage";
9
+ import { NSASectionViewTabPage, NSASectionViewTabPageUIProps } from "./NSASectionViewTabPage";
10
+
11
+ export interface NSASectionEditCustomProps<RowType extends { id: string }, RowTypeInput = RowType> extends NSARouterMakerProps, IBaseComponentProps
12
+ {
13
+ isEdit: boolean;
14
+ ui: {
15
+ panel?: IBaseComponentProps;
16
+ form?: FormHTMLAttributes<HTMLFormElement>;
17
+ tab_page_edit: {
18
+ ui?: NSASectionEditTabPageUIProps;
19
+ editor: NSASectionEditTabPageEditorProps<RowType, RowTypeInput>;
20
+ };
21
+ tab_page_view?: NSASectionViewTabPageUIProps<RowType>;
22
+ getChildrenBefore?: (id: string, row: RowType | null) => ReactNode;
23
+ getChildrenAfter?: (id: string, row: RowType | null) => ReactNode;
24
+ }
25
+ onLoaded?: () => void;
26
+ onRowLoaded?: (item: RowType) => void;
27
+ children?: React.ReactNode;
28
+ }
29
+
30
+ export interface NSASectionEditProps<RowType extends { id: string }, RowTypeInput = RowType> extends NSASectionEditCustomProps<RowType, RowTypeInput>, NSARouterMakerProps
31
+ {
32
+ model: {
33
+ id: string | null;
34
+ row: RowType | null;
35
+ };
36
+ entity: IEntityInfo<RowType, RowTypeInput>,
37
+ ctf: {
38
+ enabled: boolean;
39
+ rows: EntityResolveResponseRow | null;
40
+ };
41
+ deleteFieldCache: () => void;
42
+ children: ReactNode;
43
+ }
44
+
45
+ interface NSASectionEditState<RowType>
46
+ {
47
+ row: RowType | null;
48
+ loading: boolean;
49
+ isDirty: boolean;
50
+ }
51
+
52
+ export class NSASectionEdit<RowType extends { id: string }, RowTypeInput = RowType> extends Component<NSASectionEditProps<RowType, RowTypeInput>, NSASectionEditState<RowType>>
53
+ {
54
+ NSASectionViewTabPage_Ref = createRef<NSASectionViewTabPage<RowType, RowTypeInput>>();
55
+ NSASectionEditTabPage_Ref = createRef<NSASectionEditTabPage<RowType, RowTypeInput>>();
56
+
57
+ constructor(props: NSASectionEditProps<RowType, RowTypeInput>)
58
+ {
59
+ super(props);
60
+
61
+ this.state = {
62
+ row: this.props.model.row,
63
+ loading: !this.props.model.row,
64
+ isDirty: false,
65
+ };
66
+
67
+ this.reload = this.reload.bind(this);
68
+ this.getRow = this.getRow.bind(this);
69
+ this.onApply = this.onApply.bind(this);
70
+ this.markDirty = this.markDirty.bind(this);
71
+ }
72
+ private markDirty()
73
+ {
74
+ if (!this.state.isDirty)
75
+ this.setState(prev => ({ ...prev, isDirty: true }));
76
+ }
77
+ reload()
78
+ {
79
+ this.setState(() => ({ row: null, loading: true }));
80
+ if (this.props.model.id)
81
+ this.props.entity.server.get?.(this.props.model.id).then(row =>
82
+ {
83
+ this.setState(
84
+ () => ({ row, loading: false, isDirty: false }),
85
+ () =>
86
+ {
87
+ this.props.onLoaded?.();
88
+ this.props.onRowLoaded?.(row);
89
+ }
90
+ );
91
+ }).catch(() => { });
92
+ }
93
+ getRow()
94
+ {
95
+ return this.state.row;
96
+ }
97
+ async onApply(onFinshied: () => void): Promise<void>
98
+ {
99
+ try
100
+ {
101
+ let Name_Pascal_Space = NamingConvention.lower_case_underscore.convert(this.props.entity.name, NamingConvention.Pascal_Case_Space);
102
+
103
+ let onSuccess = (new_row: RowType, message: string) =>
104
+ {
105
+ this.props.notifier.onSuccess(message);
106
+ this.setState(prev => ({ ...prev, isDirty: false }), () =>
107
+ {
108
+ let handled = false;
109
+ if (this.props.entity.client.onSuccess)
110
+ handled = this.props.entity.client.onSuccess(new_row);
111
+ if (!handled)
112
+ {
113
+ let url = null;
114
+ if (this.props.entity.client.getViewURL)
115
+ url = this.props.entity.client.getViewURL(new_row.id);
116
+ else if (this.props.entity.client.getListURL)
117
+ url = this.props.entity.client.getListURL();
118
+ if (url)
119
+ this.props.url.redirect(url, {});
120
+ }
121
+ });
122
+ };
123
+ let cur_row: RowTypeInput | null = null;
124
+ if (this.NSASectionEditTabPage_Ref.current)
125
+ cur_row = await this.NSASectionEditTabPage_Ref.current.getInputRow();
126
+ if (cur_row)
127
+ if (this.props.isEdit)
128
+ {
129
+ if (this.props.model.id)
130
+ {
131
+ if (this.props.entity.client.onUpdate)
132
+ {
133
+ this.props.entity.client.onUpdate(this.props.model.id, cur_row).then(new_entity =>
134
+ {
135
+ if (new_entity)
136
+ onSuccess(new_entity, Name_Pascal_Space + " has been updated successfully");
137
+ if (this.props.model.id)
138
+ NSID.clearID(new IStorageLocal(), this.props.model.id);
139
+ onFinshied();
140
+ }).catch(onFinshied);
141
+ }
142
+ else if (this.props.entity.server.update)
143
+ {
144
+ this.props.entity.server.update(this.props.model.id, cur_row).then(new_entity =>
145
+ {
146
+ onSuccess(new_entity, Name_Pascal_Space + " has been updated successfully");
147
+ if (this.props.model.id)
148
+ NSID.clearID(new IStorageLocal(), this.props.model.id);
149
+ onFinshied();
150
+ }).catch(onFinshied);
151
+ }
152
+ else
153
+ onFinshied();
154
+ }
155
+ else
156
+ throw new Error("ID was not provided.");
157
+ }
158
+ else
159
+ {
160
+ if (this.props.entity.client.onCreate)
161
+ {
162
+ this.props.entity.client.onCreate(cur_row).then(new_entity =>
163
+ {
164
+ if (new_entity)
165
+ onSuccess(new_entity, Name_Pascal_Space + " has been created successfully");
166
+ onFinshied();
167
+ }).catch(onFinshied);
168
+ }
169
+ else if (this.props.entity.server.create)
170
+ {
171
+ this.props.entity.server.create(cur_row).then(new_entity =>
172
+ {
173
+ onSuccess(new_entity, Name_Pascal_Space + " has been created successfully");;
174
+ onFinshied();
175
+ }).catch(onFinshied);
176
+ }
177
+ else
178
+ onFinshied();
179
+ }
180
+ else
181
+ onFinshied();
182
+ } catch (error: any)
183
+ {
184
+ this.props.notifier.onError(error);
185
+ onFinshied();
186
+ }
187
+ }
188
+ override componentDidMount()
189
+ {
190
+ let { id, row } = this.props.model;
191
+
192
+ if ((id && !row) || (id && id !== row?.id))
193
+ this.reload();
194
+ else
195
+ this.setState(
196
+ () => ({ loading: false, isDirty: false }),
197
+ () => this.props.onLoaded?.()
198
+ );
199
+ }
200
+ override render()
201
+ {
202
+ return (
203
+ <>
204
+ <NSANavigationGuard when={this.state.isDirty} />
205
+ <NSSection
206
+ id={this.props.id}
207
+ classList={[`${this.props.classList?.join(" ") ?? ""}`]}
208
+ style={{ ...this.props.style }}
209
+ >
210
+ {
211
+ !this.state.loading
212
+ ?
213
+ <NSPanel
214
+ id={this.props.ui.panel?.id}
215
+ classList={[`${this.props.ui.panel?.classList?.join(" ") ?? ""}`]}
216
+ style={{ ...this.props.ui.panel?.style }}
217
+ >
218
+ <form
219
+ {...this.props.ui.form}
220
+ onInput={this.markDirty}
221
+ onChange={this.markDirty}
222
+ onSubmit={(e) =>
223
+ {
224
+ e.preventDefault()
225
+ }}
226
+ >
227
+ <NSASectionEditTabPage<RowType, RowTypeInput>
228
+ ref={this.NSASectionEditTabPage_Ref}
229
+ {...this.props}
230
+ model={{
231
+ id: this.props.model.id,
232
+ row: this.state.row
233
+ }}
234
+ editor={this.props.ui.tab_page_edit.editor}
235
+ ui={this.props.ui.tab_page_edit.ui}
236
+ >
237
+ {this.props.children}
238
+ </NSASectionEditTabPage>
239
+ </form>
240
+ </NSPanel>
241
+ :
242
+ <NSLoading />
243
+ }
244
+ <NSSpace size={NSSpaceSizeType.SMALL}></NSSpace>
245
+ <NSButtonBlue
246
+ title="Apply"
247
+ onClick={{
248
+ action: (onFinished) =>
249
+ {
250
+ this.onApply(onFinished);
251
+ }
252
+ }}
253
+ />
254
+ </NSSection>
255
+ {
256
+ this.props.isEdit && (this.props.ui.tab_page_view?.enabled ?? true) && !this.state.loading &&
257
+ <>
258
+ <NSSpace size={NSSpaceSizeType.SMALL} />
259
+ <NSLine />
260
+ <NSSpace size={NSSpaceSizeType.SMALL} />
261
+ {
262
+ this.props.ui.getChildrenBefore &&
263
+ this.props.ui.getChildrenBefore(this.props.model.id ?? "", this.state.row)
264
+ }
265
+ <NSASectionViewTabPage<RowType, RowTypeInput>
266
+ ref={this.NSASectionViewTabPage_Ref}
267
+ {...this.props}
268
+ model={{
269
+ id: this.props.model.id,
270
+ row: this.state.row
271
+ }}
272
+ ui={this.props.ui.tab_page_view}
273
+ />
274
+ {
275
+ this.props.ui.getChildrenAfter &&
276
+ this.props.ui.getChildrenAfter(this.props.model.id ?? "", this.state.row)
277
+ }
278
+ </>
279
+ }
280
+ </>
281
+ );
282
+ }
283
283
  }
@@ -1,5 +1,5 @@
1
- @media screen and (min-width: 768px) {
2
- .nsa_section_edit_tab_page {
3
- min-width: 560px;
4
- }
1
+ @media screen and (min-width: 768px) {
2
+ .nsa_section_edit_tab_page {
3
+ min-width: 560px;
4
+ }
5
5
  }