namirasoft-account-react 1.5.21 → 1.5.22

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