namirasoft-account-react 1.5.37 → 1.5.39
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/.env.template +15 -15
- package/SKILL.md +514 -514
- package/config-overrides.js +72 -72
- package/dist/App.d.ts +1 -1
- package/dist/FieldCacheService.js +4 -0
- package/dist/FieldCacheService.js.map +1 -1
- package/dist/NSARouterMaker.js +1 -1
- package/dist/NSARouterMaker.js.map +1 -1
- package/dist/Router.d.ts +1 -1
- package/dist/UseParams.d.ts +1 -1
- package/dist/components/NSAAccessListDialog.d.ts +2 -2
- package/dist/components/NSAAccessListDialog.module.css +71 -71
- package/dist/components/NSABoxSecret.d.ts +1 -1
- package/dist/components/NSABoxSecret.module.css +23 -23
- package/dist/components/NSAMasterMenu.d.ts +1 -1
- package/dist/components/NSAMasterMenu.js +4 -0
- package/dist/components/NSAMasterMenu.js.map +1 -1
- package/dist/components/NSAMasterMenu.module.css +250 -250
- package/dist/components/NSAMasterMenuItem.d.ts +1 -1
- package/dist/components/NSAMessageListDialog.d.ts +1 -1
- package/dist/components/NSAMessageListDialog.module.css +99 -99
- package/dist/components/NSANavigationGuard.d.ts +1 -1
- package/dist/components/NSAProductListDialog.d.ts +1 -1
- package/dist/components/NSAProductListDialog.module.css +44 -44
- package/dist/components/NSATaskBar.d.ts +1 -1
- package/dist/components/NSATaskBar.module.css +57 -57
- package/dist/components/NSAUserDialog.d.ts +1 -1
- package/dist/components/NSAUserDialog.module.css +67 -67
- package/dist/components/NSAWorkspaceListDialog.d.ts +1 -1
- package/dist/components/NSAWorkspaceListDialog.module.css +41 -41
- package/dist/components/NSFBoxCategoryScope.d.ts +1 -1
- package/dist/components/NSFBoxField.d.ts +1 -1
- package/dist/components/NSFBoxSlot.d.ts +1 -1
- package/dist/components/NSFBoxWrapper.d.ts +1 -1
- package/dist/components/NSLabelSecret.d.ts +1 -1
- package/dist/components/quickfilter/NSAFilterBoxEnum.module.css +51 -51
- package/dist/components/quickfilter/NSAQuickFilterBar.d.ts +1 -1
- package/dist/components/quickfilter/NSAQuickFilterBar.module.css +20 -20
- package/dist/components/quickfilter/NSAQuickFilterDialog.d.ts +1 -1
- package/dist/components/quickfilter/NSAQuickFilterDialog.module.css +74 -74
- package/dist/layouts/NSALayout.d.ts +1 -1
- package/dist/layouts/NSASectionEdit.d.ts +1 -1
- package/dist/layouts/NSASectionEditTabPage.d.ts +1 -1
- package/dist/layouts/NSASectionEditTabPage.module.css +4 -4
- package/dist/layouts/NSASectionList.d.ts +1 -1
- package/dist/layouts/NSASectionList.module.css +24 -24
- package/dist/layouts/NSASectionView.d.ts +1 -1
- package/dist/layouts/NSASectionViewTabMore.d.ts +1 -1
- package/dist/layouts/NSASectionViewTabPage.d.ts +1 -1
- package/dist/layouts/NSASectionViewTabPage.module.css +47 -47
- package/dist/pages/NSAConsentPage.module.css +26 -26
- package/dist/pages/NSAEmailVerificationPage.d.ts +1 -1
- package/dist/pages/NSAHomePage.d.ts +1 -1
- package/dist/pages/NSAHomePage.module.css +41 -41
- package/dist/pages/NSALoginPage.d.ts +1 -1
- package/dist/pages/NSALoginPage.module.css +26 -26
- package/dist/pages/NSAPhoneVerificationPage.d.ts +1 -1
- package/dist/pages/NSAPhoneVerificationPage.js +11 -3
- package/dist/pages/NSAPhoneVerificationPage.js.map +1 -1
- package/dist/pages/NSAVerificationPage.d.ts +1 -1
- package/dist/pages/NSAVerificationPage.module.css +31 -31
- package/package.json +94 -94
- package/public/index.html +21 -21
- package/src/App.tsx +72 -72
- package/src/CTFRow.ts +7 -7
- package/src/FieldCacheService.tsx +113 -108
- package/src/IEntityInfo.ts +33 -33
- package/src/NSACacheService.ts +126 -126
- package/src/NSAFilterOperators.ts +94 -94
- package/src/NSARouterMaker.tsx +141 -141
- package/src/NSARouterMakerProps.ts +23 -23
- package/src/NSARouterMakerResult.ts +24 -24
- package/src/NSFRouterMaker.tsx +35 -35
- package/src/NSFRouterProps.ts +7 -7
- package/src/NSFRoutes.ts +30 -30
- package/src/Router.tsx +48 -48
- package/src/UseParams.tsx +17 -17
- package/src/components/NSAAccessListDialog.module.css +71 -71
- package/src/components/NSAAccessListDialog.tsx +178 -178
- package/src/components/NSABoxSecret.module.css +23 -23
- package/src/components/NSABoxSecret.tsx +264 -264
- package/src/components/NSAMasterMenu.module.css +250 -250
- package/src/components/NSAMasterMenu.tsx +174 -169
- package/src/components/NSAMasterMenuItem.tsx +250 -250
- package/src/components/NSAMessageListDialog.module.css +99 -99
- package/src/components/NSAMessageListDialog.tsx +144 -144
- package/src/components/NSANavigationGuard.tsx +79 -79
- package/src/components/NSAProductListDialog.module.css +44 -44
- package/src/components/NSAProductListDialog.tsx +88 -88
- package/src/components/NSATable.tsx +494 -494
- package/src/components/NSATaskBar.module.css +57 -57
- package/src/components/NSATaskBar.tsx +193 -193
- package/src/components/NSAUserDialog.module.css +67 -67
- package/src/components/NSAUserDialog.tsx +122 -122
- package/src/components/NSAWorkspaceListDialog.module.css +41 -41
- package/src/components/NSAWorkspaceListDialog.tsx +147 -147
- package/src/components/NSFBoxCategoryScope.tsx +52 -52
- package/src/components/NSFBoxField.tsx +37 -37
- package/src/components/NSFBoxSlot.tsx +73 -73
- package/src/components/NSFBoxWrapper.tsx +69 -69
- package/src/components/NSLabelSecret.tsx +37 -37
- package/src/components/quickfilter/NSAFilterBoxBase.tsx +110 -110
- package/src/components/quickfilter/NSAFilterBoxBoolean.tsx +72 -72
- package/src/components/quickfilter/NSAFilterBoxDate.tsx +110 -110
- package/src/components/quickfilter/NSAFilterBoxDateTime.tsx +110 -110
- package/src/components/quickfilter/NSAFilterBoxEnum.module.css +51 -51
- package/src/components/quickfilter/NSAFilterBoxEnum.tsx +103 -103
- package/src/components/quickfilter/NSAFilterBoxNumber.tsx +145 -145
- package/src/components/quickfilter/NSAFilterBoxString.tsx +83 -83
- package/src/components/quickfilter/NSAFilterBoxTime.tsx +106 -106
- package/src/components/quickfilter/NSAQuickFilterBar.module.css +20 -20
- package/src/components/quickfilter/NSAQuickFilterBar.tsx +142 -142
- package/src/components/quickfilter/NSAQuickFilterDialog.module.css +74 -74
- package/src/components/quickfilter/NSAQuickFilterDialog.tsx +297 -297
- package/src/css.d.ts +13 -13
- package/src/formatters/SecretFormatter.tsx +24 -24
- package/src/index.tsx +27 -27
- package/src/layouts/Actions.ts +146 -146
- package/src/layouts/CFTUtil.ts +18 -18
- package/src/layouts/NSALayout.tsx +750 -750
- package/src/layouts/NSALayout_Field.ts +125 -125
- package/src/layouts/NSASectionEdit.tsx +279 -279
- package/src/layouts/NSASectionEditTabPage.module.css +4 -4
- package/src/layouts/NSASectionEditTabPage.tsx +256 -256
- package/src/layouts/NSASectionList.module.css +24 -24
- package/src/layouts/NSASectionList.tsx +165 -165
- package/src/layouts/NSASectionView.tsx +98 -98
- package/src/layouts/NSASectionViewTabMore.tsx +78 -78
- package/src/layouts/NSASectionViewTabPage.module.css +47 -47
- package/src/layouts/NSASectionViewTabPage.tsx +400 -400
- package/src/main.ts +52 -52
- package/src/pages/NSAConsentPage.module.css +26 -26
- package/src/pages/NSAConsentPage.tsx +120 -120
- package/src/pages/NSAEmailVerificationPage.tsx +30 -30
- package/src/pages/NSAHomePage.module.css +41 -41
- package/src/pages/NSAHomePage.tsx +113 -113
- package/src/pages/NSALoginPage.module.css +26 -26
- package/src/pages/NSALoginPage.tsx +87 -87
- package/src/pages/NSAPhoneVerificationPage.tsx +106 -94
- package/src/pages/NSAVerificationPage.module.css +31 -31
- package/src/pages/NSAVerificationPage.tsx +185 -185
- package/src/pages/NSFCategoryEditPage.tsx +87 -87
- package/src/pages/NSFCategoryListPage.tsx +23 -23
- package/src/pages/NSFCategoryViewPage.tsx +23 -23
- package/src/pages/NSFEntities.ts +58 -58
- package/src/pages/PaymentRequired.tsx +80 -80
- package/tsconfig.json +43 -43
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
import { Component } from "react";
|
|
2
|
-
import { BaseMetaColumn, BaseMetaTable, FilterItem, FilterItemOperator } from "namirasoft-core";
|
|
3
|
-
import { QuickFilterConfig } from "./NSAQuickFilterDialog";
|
|
4
|
-
|
|
5
|
-
export interface NSAFilterBoxBaseProps
|
|
6
|
-
{
|
|
7
|
-
config: QuickFilterConfig;
|
|
8
|
-
initial?: FilterItem | FilterItem[] | null;
|
|
9
|
-
onChanged: (items: FilterItem | FilterItem[] | null) => void;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export abstract class NSAFilterBoxBase<P extends NSAFilterBoxBaseProps = NSAFilterBoxBaseProps, S = {}>
|
|
13
|
-
extends Component<P, S>
|
|
14
|
-
{
|
|
15
|
-
private static readonly NOT_OPERATOR_MAP: Record<string, string> = {
|
|
16
|
-
notequals: "equals",
|
|
17
|
-
notcontains: "contains",
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
// valueless operators negate by swapping, value operators by the not flag
|
|
21
|
-
private static readonly VALUELESS_INVERSE_MAP: Record<string, string> = {
|
|
22
|
-
exists: "empty",
|
|
23
|
-
empty: "exists",
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
private buildMeta()
|
|
27
|
-
{
|
|
28
|
-
const { config } = this.props;
|
|
29
|
-
const table = new BaseMetaTable(null, config.column.table.name, config.column.table.text);
|
|
30
|
-
const column = new BaseMetaColumn(table, config.column.name, config.column.text, config.column.type, false);
|
|
31
|
-
return { table, column };
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
protected buildFilterItem(...values: string[]): FilterItem
|
|
35
|
-
{
|
|
36
|
-
const { table, column } = this.buildMeta();
|
|
37
|
-
const key = this.props.config.operatorName ?? "";
|
|
38
|
-
const isNot = key in NSAFilterBoxBase.NOT_OPERATOR_MAP;
|
|
39
|
-
const resolvedKey = isNot ? NSAFilterBoxBase.NOT_OPERATOR_MAP[key] : key;
|
|
40
|
-
const operator = resolvedKey
|
|
41
|
-
? FilterItemOperator.getByName(resolvedKey)
|
|
42
|
-
: FilterItemOperator.all.equals;
|
|
43
|
-
return new FilterItem(table, column, isNot, operator, ...values);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
protected buildInverseFilterItem(...values: string[]): FilterItem
|
|
47
|
-
{
|
|
48
|
-
const { table, column } = this.buildMeta();
|
|
49
|
-
const key = this.props.config.operatorName ?? "";
|
|
50
|
-
const valuelessInverse = NSAFilterBoxBase.VALUELESS_INVERSE_MAP[key];
|
|
51
|
-
if (valuelessInverse)
|
|
52
|
-
return new FilterItem(table, column, false, FilterItemOperator.getByName(valuelessInverse));
|
|
53
|
-
const resolvedKey = key in NSAFilterBoxBase.NOT_OPERATOR_MAP ? NSAFilterBoxBase.NOT_OPERATOR_MAP[key] : key;
|
|
54
|
-
const operator = resolvedKey
|
|
55
|
-
? FilterItemOperator.getByName(resolvedKey)
|
|
56
|
-
: FilterItemOperator.all.equals;
|
|
57
|
-
return new FilterItem(table, column, true, operator, ...values);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
protected buildBetweenFilterItems(from: string, to: string): FilterItem[]
|
|
61
|
-
{
|
|
62
|
-
const { table, column } = this.buildMeta();
|
|
63
|
-
return [
|
|
64
|
-
new FilterItem(table, column, false, FilterItemOperator.all.morethanequal, from),
|
|
65
|
-
new FilterItem(table, column, false, FilterItemOperator.all.lessthanequal, to),
|
|
66
|
-
];
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
protected getLabel(): string
|
|
70
|
-
{
|
|
71
|
-
const { config } = this.props;
|
|
72
|
-
const base = config.title || config.column.text;
|
|
73
|
-
if (!config.operatorName)
|
|
74
|
-
return base;
|
|
75
|
-
const sign = FilterItemOperator.getByName(config.operatorName).sign;
|
|
76
|
-
return `${base} ${sign}`;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
protected getInitialItems(): FilterItem[]
|
|
80
|
-
{
|
|
81
|
-
const initial = this.props.initial;
|
|
82
|
-
if (!initial)
|
|
83
|
-
return [];
|
|
84
|
-
return Array.isArray(initial) ? initial : [initial];
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
protected getInitialValue(): string | undefined
|
|
88
|
-
{
|
|
89
|
-
return this.getInitialItems()[0]?.values[0];
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
protected getInitialValues(): string[]
|
|
93
|
-
{
|
|
94
|
-
return this.getInitialItems().flatMap(i => i.values);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
protected getInitialBetween(): { from: string; to: string } | undefined
|
|
98
|
-
{
|
|
99
|
-
const items = this.getInitialItems();
|
|
100
|
-
if (items.length < 2)
|
|
101
|
-
return undefined;
|
|
102
|
-
const from = items.find(i => i.operator?.name === "morethanequal")?.values[0] ?? items[0].values[0];
|
|
103
|
-
const to = items.find(i => i.operator?.name === "lessthanequal")?.values[0] ?? items[1].values[0];
|
|
104
|
-
return { from, to };
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
protected parseDBDate(value: string): Date
|
|
108
|
-
{
|
|
109
|
-
return new Date(value.replace(" ", "T") + "Z");
|
|
110
|
-
}
|
|
1
|
+
import { Component } from "react";
|
|
2
|
+
import { BaseMetaColumn, BaseMetaTable, FilterItem, FilterItemOperator } from "namirasoft-core";
|
|
3
|
+
import { QuickFilterConfig } from "./NSAQuickFilterDialog";
|
|
4
|
+
|
|
5
|
+
export interface NSAFilterBoxBaseProps
|
|
6
|
+
{
|
|
7
|
+
config: QuickFilterConfig;
|
|
8
|
+
initial?: FilterItem | FilterItem[] | null;
|
|
9
|
+
onChanged: (items: FilterItem | FilterItem[] | null) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export abstract class NSAFilterBoxBase<P extends NSAFilterBoxBaseProps = NSAFilterBoxBaseProps, S = {}>
|
|
13
|
+
extends Component<P, S>
|
|
14
|
+
{
|
|
15
|
+
private static readonly NOT_OPERATOR_MAP: Record<string, string> = {
|
|
16
|
+
notequals: "equals",
|
|
17
|
+
notcontains: "contains",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// valueless operators negate by swapping, value operators by the not flag
|
|
21
|
+
private static readonly VALUELESS_INVERSE_MAP: Record<string, string> = {
|
|
22
|
+
exists: "empty",
|
|
23
|
+
empty: "exists",
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
private buildMeta()
|
|
27
|
+
{
|
|
28
|
+
const { config } = this.props;
|
|
29
|
+
const table = new BaseMetaTable(null, config.column.table.name, config.column.table.text);
|
|
30
|
+
const column = new BaseMetaColumn(table, config.column.name, config.column.text, config.column.type, false);
|
|
31
|
+
return { table, column };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
protected buildFilterItem(...values: string[]): FilterItem
|
|
35
|
+
{
|
|
36
|
+
const { table, column } = this.buildMeta();
|
|
37
|
+
const key = this.props.config.operatorName ?? "";
|
|
38
|
+
const isNot = key in NSAFilterBoxBase.NOT_OPERATOR_MAP;
|
|
39
|
+
const resolvedKey = isNot ? NSAFilterBoxBase.NOT_OPERATOR_MAP[key] : key;
|
|
40
|
+
const operator = resolvedKey
|
|
41
|
+
? FilterItemOperator.getByName(resolvedKey)
|
|
42
|
+
: FilterItemOperator.all.equals;
|
|
43
|
+
return new FilterItem(table, column, isNot, operator, ...values);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
protected buildInverseFilterItem(...values: string[]): FilterItem
|
|
47
|
+
{
|
|
48
|
+
const { table, column } = this.buildMeta();
|
|
49
|
+
const key = this.props.config.operatorName ?? "";
|
|
50
|
+
const valuelessInverse = NSAFilterBoxBase.VALUELESS_INVERSE_MAP[key];
|
|
51
|
+
if (valuelessInverse)
|
|
52
|
+
return new FilterItem(table, column, false, FilterItemOperator.getByName(valuelessInverse));
|
|
53
|
+
const resolvedKey = key in NSAFilterBoxBase.NOT_OPERATOR_MAP ? NSAFilterBoxBase.NOT_OPERATOR_MAP[key] : key;
|
|
54
|
+
const operator = resolvedKey
|
|
55
|
+
? FilterItemOperator.getByName(resolvedKey)
|
|
56
|
+
: FilterItemOperator.all.equals;
|
|
57
|
+
return new FilterItem(table, column, true, operator, ...values);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected buildBetweenFilterItems(from: string, to: string): FilterItem[]
|
|
61
|
+
{
|
|
62
|
+
const { table, column } = this.buildMeta();
|
|
63
|
+
return [
|
|
64
|
+
new FilterItem(table, column, false, FilterItemOperator.all.morethanequal, from),
|
|
65
|
+
new FilterItem(table, column, false, FilterItemOperator.all.lessthanequal, to),
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
protected getLabel(): string
|
|
70
|
+
{
|
|
71
|
+
const { config } = this.props;
|
|
72
|
+
const base = config.title || config.column.text;
|
|
73
|
+
if (!config.operatorName)
|
|
74
|
+
return base;
|
|
75
|
+
const sign = FilterItemOperator.getByName(config.operatorName).sign;
|
|
76
|
+
return `${base} ${sign}`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
protected getInitialItems(): FilterItem[]
|
|
80
|
+
{
|
|
81
|
+
const initial = this.props.initial;
|
|
82
|
+
if (!initial)
|
|
83
|
+
return [];
|
|
84
|
+
return Array.isArray(initial) ? initial : [initial];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
protected getInitialValue(): string | undefined
|
|
88
|
+
{
|
|
89
|
+
return this.getInitialItems()[0]?.values[0];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
protected getInitialValues(): string[]
|
|
93
|
+
{
|
|
94
|
+
return this.getInitialItems().flatMap(i => i.values);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
protected getInitialBetween(): { from: string; to: string } | undefined
|
|
98
|
+
{
|
|
99
|
+
const items = this.getInitialItems();
|
|
100
|
+
if (items.length < 2)
|
|
101
|
+
return undefined;
|
|
102
|
+
const from = items.find(i => i.operator?.name === "morethanequal")?.values[0] ?? items[0].values[0];
|
|
103
|
+
const to = items.find(i => i.operator?.name === "lessthanequal")?.values[0] ?? items[1].values[0];
|
|
104
|
+
return { from, to };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
protected parseDBDate(value: string): Date
|
|
108
|
+
{
|
|
109
|
+
return new Date(value.replace(" ", "T") + "Z");
|
|
110
|
+
}
|
|
111
111
|
}
|
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
import { FilterItemOperator } from "namirasoft-core";
|
|
2
|
-
import { NSBoxBoolean } from "namirasoft-site-react";
|
|
3
|
-
import { createRef } from "react";
|
|
4
|
-
import { NSAFilterBoxBase, NSAFilterBoxBaseProps } from "./NSAFilterBoxBase";
|
|
5
|
-
|
|
6
|
-
interface NSAFilterBoxBooleanState
|
|
7
|
-
{
|
|
8
|
-
value: boolean | null;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export class NSAFilterBoxBoolean extends NSAFilterBoxBase<NSAFilterBoxBaseProps, NSAFilterBoxBooleanState>
|
|
12
|
-
{
|
|
13
|
-
private containerRef = createRef<HTMLDivElement>();
|
|
14
|
-
|
|
15
|
-
constructor(props: NSAFilterBoxBaseProps)
|
|
16
|
-
{
|
|
17
|
-
super(props);
|
|
18
|
-
this.state = { value: this.resolveInitialValue() };
|
|
19
|
-
this.handleChange = this.handleChange.bind(this);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
private resolveInitialValue(): boolean | null
|
|
23
|
-
{
|
|
24
|
-
const items = this.getInitialItems();
|
|
25
|
-
if (this.isValueless())
|
|
26
|
-
{
|
|
27
|
-
if (items.length === 0)
|
|
28
|
-
return null;
|
|
29
|
-
const configKey = (this.props.config.operatorName ?? "").toLowerCase();
|
|
30
|
-
const itemKey = items[0].operator.name.replace(/\s+/g, "").toLowerCase();
|
|
31
|
-
return itemKey === configKey;
|
|
32
|
-
}
|
|
33
|
-
const value = this.getInitialValue();
|
|
34
|
-
if (value !== undefined)
|
|
35
|
-
return value === "1";
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
private isValueless(): boolean
|
|
40
|
-
{
|
|
41
|
-
const name = this.props.config.operatorName;
|
|
42
|
-
return !!name && FilterItemOperator.getByName(name).count === 0;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
private handleChange(value: boolean | null)
|
|
47
|
-
{
|
|
48
|
-
this.setState({ value });
|
|
49
|
-
if (value === null)
|
|
50
|
-
this.props.onChanged(null);
|
|
51
|
-
else if (this.isValueless())
|
|
52
|
-
this.props.onChanged(value ? this.buildFilterItem() : this.buildInverseFilterItem());
|
|
53
|
-
else
|
|
54
|
-
this.props.onChanged(this.buildFilterItem(String(Number(value))));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
override render(): JSX.Element
|
|
58
|
-
{
|
|
59
|
-
return (
|
|
60
|
-
<div ref={this.containerRef} style={{ width: "100%" }}>
|
|
61
|
-
<NSBoxBoolean
|
|
62
|
-
title={this.getLabel()}
|
|
63
|
-
placeholder={this.getLabel()}
|
|
64
|
-
required={false}
|
|
65
|
-
hideHeader={true}
|
|
66
|
-
triState={true}
|
|
67
|
-
defaultValue={this.state.value ?? undefined}
|
|
68
|
-
onChanged={e => this.handleChange(e.getValue())}
|
|
69
|
-
/>
|
|
70
|
-
</div>
|
|
71
|
-
);
|
|
72
|
-
}
|
|
1
|
+
import { FilterItemOperator } from "namirasoft-core";
|
|
2
|
+
import { NSBoxBoolean } from "namirasoft-site-react";
|
|
3
|
+
import { createRef } from "react";
|
|
4
|
+
import { NSAFilterBoxBase, NSAFilterBoxBaseProps } from "./NSAFilterBoxBase";
|
|
5
|
+
|
|
6
|
+
interface NSAFilterBoxBooleanState
|
|
7
|
+
{
|
|
8
|
+
value: boolean | null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class NSAFilterBoxBoolean extends NSAFilterBoxBase<NSAFilterBoxBaseProps, NSAFilterBoxBooleanState>
|
|
12
|
+
{
|
|
13
|
+
private containerRef = createRef<HTMLDivElement>();
|
|
14
|
+
|
|
15
|
+
constructor(props: NSAFilterBoxBaseProps)
|
|
16
|
+
{
|
|
17
|
+
super(props);
|
|
18
|
+
this.state = { value: this.resolveInitialValue() };
|
|
19
|
+
this.handleChange = this.handleChange.bind(this);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private resolveInitialValue(): boolean | null
|
|
23
|
+
{
|
|
24
|
+
const items = this.getInitialItems();
|
|
25
|
+
if (this.isValueless())
|
|
26
|
+
{
|
|
27
|
+
if (items.length === 0)
|
|
28
|
+
return null;
|
|
29
|
+
const configKey = (this.props.config.operatorName ?? "").toLowerCase();
|
|
30
|
+
const itemKey = items[0].operator.name.replace(/\s+/g, "").toLowerCase();
|
|
31
|
+
return itemKey === configKey;
|
|
32
|
+
}
|
|
33
|
+
const value = this.getInitialValue();
|
|
34
|
+
if (value !== undefined)
|
|
35
|
+
return value === "1";
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private isValueless(): boolean
|
|
40
|
+
{
|
|
41
|
+
const name = this.props.config.operatorName;
|
|
42
|
+
return !!name && FilterItemOperator.getByName(name).count === 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
private handleChange(value: boolean | null)
|
|
47
|
+
{
|
|
48
|
+
this.setState({ value });
|
|
49
|
+
if (value === null)
|
|
50
|
+
this.props.onChanged(null);
|
|
51
|
+
else if (this.isValueless())
|
|
52
|
+
this.props.onChanged(value ? this.buildFilterItem() : this.buildInverseFilterItem());
|
|
53
|
+
else
|
|
54
|
+
this.props.onChanged(this.buildFilterItem(String(Number(value))));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
override render(): JSX.Element
|
|
58
|
+
{
|
|
59
|
+
return (
|
|
60
|
+
<div ref={this.containerRef} style={{ width: "100%" }}>
|
|
61
|
+
<NSBoxBoolean
|
|
62
|
+
title={this.getLabel()}
|
|
63
|
+
placeholder={this.getLabel()}
|
|
64
|
+
required={false}
|
|
65
|
+
hideHeader={true}
|
|
66
|
+
triState={true}
|
|
67
|
+
defaultValue={this.state.value ?? undefined}
|
|
68
|
+
onChanged={e => this.handleChange(e.getValue())}
|
|
69
|
+
/>
|
|
70
|
+
</div>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
73
|
}
|
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
import { FilterItem, FilterItemOperator, SortItem, TimeOperation } from "namirasoft-core";
|
|
2
|
-
import { NSBoxDate, NSBoxDateRange, NSBoxEntity } from "namirasoft-site-react";
|
|
3
|
-
import { NSAFilterBoxBase, NSAFilterBoxBaseProps } from "./NSAFilterBoxBase";
|
|
4
|
-
import { NSAFilterBoxBoolean } from "./NSAFilterBoxBoolean";
|
|
5
|
-
|
|
6
|
-
export interface NSAFilterBoxDateProps extends NSAFilterBoxBaseProps
|
|
7
|
-
{
|
|
8
|
-
getValues: (search: string) => Promise<{ value: string; title: string }[]>;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
type ValueItem = { value: string; title: string };
|
|
12
|
-
|
|
13
|
-
const ENTITY_OPERATORS = ["equals"];
|
|
14
|
-
|
|
15
|
-
export class NSAFilterBoxDate extends NSAFilterBoxBase<NSAFilterBoxDateProps>
|
|
16
|
-
{
|
|
17
|
-
private betweenActive = this.getInitialBetween() !== undefined;
|
|
18
|
-
|
|
19
|
-
private list = async (
|
|
20
|
-
filters: FilterItem[] | null,
|
|
21
|
-
_page: number | null,
|
|
22
|
-
_size: number | null,
|
|
23
|
-
_sorts: SortItem[]
|
|
24
|
-
): Promise<{ count: number; rows: ValueItem[] }> =>
|
|
25
|
-
{
|
|
26
|
-
const searchFilter = filters?.find(f => f.values.length > 0);
|
|
27
|
-
const search = searchFilter?.values[0] ?? "";
|
|
28
|
-
const rows = await this.props.getValues(search);
|
|
29
|
-
return { count: rows.length, rows };
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
override render(): JSX.Element | null
|
|
33
|
-
{
|
|
34
|
-
const { config, onChanged } = this.props;
|
|
35
|
-
const op = config.operatorName
|
|
36
|
-
? FilterItemOperator.getByName(config.operatorName)
|
|
37
|
-
: null;
|
|
38
|
-
|
|
39
|
-
if (op && op.count === 0)
|
|
40
|
-
return <NSAFilterBoxBoolean config={config} initial={this.props.initial} onChanged={onChanged} />;
|
|
41
|
-
|
|
42
|
-
const between = this.getInitialBetween();
|
|
43
|
-
|
|
44
|
-
if (config.operatorName === "between")
|
|
45
|
-
return (
|
|
46
|
-
<NSBoxDateRange
|
|
47
|
-
title={this.getLabel()}
|
|
48
|
-
placeholder={this.getLabel()}
|
|
49
|
-
required={false}
|
|
50
|
-
hideHeader={true}
|
|
51
|
-
preset={true}
|
|
52
|
-
defaultValue={between ? { from: this.parseDBDate(between.from), to: this.parseDBDate(between.to) } : undefined}
|
|
53
|
-
onChanged={e =>
|
|
54
|
-
{
|
|
55
|
-
const val = e.getValue();
|
|
56
|
-
if (val)
|
|
57
|
-
{
|
|
58
|
-
this.betweenActive = true;
|
|
59
|
-
onChanged(this.buildBetweenFilterItems(
|
|
60
|
-
TimeOperation.toDBFormat(val.from),
|
|
61
|
-
TimeOperation.toDBFormat(val.to)
|
|
62
|
-
));
|
|
63
|
-
}
|
|
64
|
-
else if (this.betweenActive)
|
|
65
|
-
{
|
|
66
|
-
this.betweenActive = false;
|
|
67
|
-
onChanged(null);
|
|
68
|
-
}
|
|
69
|
-
}}
|
|
70
|
-
/>
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
if (config.operatorName && ENTITY_OPERATORS.includes(config.operatorName))
|
|
74
|
-
return (
|
|
75
|
-
<NSBoxEntity<ValueItem>
|
|
76
|
-
title={this.getLabel()}
|
|
77
|
-
placeholder={this.getLabel()}
|
|
78
|
-
required={false}
|
|
79
|
-
hideHeader={true}
|
|
80
|
-
multiple={false}
|
|
81
|
-
defaultValue={this.getInitialValue()}
|
|
82
|
-
list={this.list}
|
|
83
|
-
table_name={config.column.table.name}
|
|
84
|
-
getValue={item => item.value}
|
|
85
|
-
getTitle={item => item.title}
|
|
86
|
-
getSort={() => null}
|
|
87
|
-
onChanged={e =>
|
|
88
|
-
{
|
|
89
|
-
const val = e.getValueOne();
|
|
90
|
-
onChanged(val ? this.buildFilterItem(val) : null);
|
|
91
|
-
}}
|
|
92
|
-
/>
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
const single = this.getInitialValue();
|
|
96
|
-
return (
|
|
97
|
-
<NSBoxDate
|
|
98
|
-
title={this.getLabel()}
|
|
99
|
-
placeholder={this.getLabel()}
|
|
100
|
-
required={false}
|
|
101
|
-
hideHeader={true}
|
|
102
|
-
defaultValue={single !== undefined ? this.parseDBDate(single) : undefined}
|
|
103
|
-
onChanged={e =>
|
|
104
|
-
{
|
|
105
|
-
const val = e.getValue();
|
|
106
|
-
onChanged(val ? this.buildFilterItem(TimeOperation.toDBFormat(val)) : null);
|
|
107
|
-
}}
|
|
108
|
-
/>
|
|
109
|
-
);
|
|
110
|
-
}
|
|
1
|
+
import { FilterItem, FilterItemOperator, SortItem, TimeOperation } from "namirasoft-core";
|
|
2
|
+
import { NSBoxDate, NSBoxDateRange, NSBoxEntity } from "namirasoft-site-react";
|
|
3
|
+
import { NSAFilterBoxBase, NSAFilterBoxBaseProps } from "./NSAFilterBoxBase";
|
|
4
|
+
import { NSAFilterBoxBoolean } from "./NSAFilterBoxBoolean";
|
|
5
|
+
|
|
6
|
+
export interface NSAFilterBoxDateProps extends NSAFilterBoxBaseProps
|
|
7
|
+
{
|
|
8
|
+
getValues: (search: string) => Promise<{ value: string; title: string }[]>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
type ValueItem = { value: string; title: string };
|
|
12
|
+
|
|
13
|
+
const ENTITY_OPERATORS = ["equals"];
|
|
14
|
+
|
|
15
|
+
export class NSAFilterBoxDate extends NSAFilterBoxBase<NSAFilterBoxDateProps>
|
|
16
|
+
{
|
|
17
|
+
private betweenActive = this.getInitialBetween() !== undefined;
|
|
18
|
+
|
|
19
|
+
private list = async (
|
|
20
|
+
filters: FilterItem[] | null,
|
|
21
|
+
_page: number | null,
|
|
22
|
+
_size: number | null,
|
|
23
|
+
_sorts: SortItem[]
|
|
24
|
+
): Promise<{ count: number; rows: ValueItem[] }> =>
|
|
25
|
+
{
|
|
26
|
+
const searchFilter = filters?.find(f => f.values.length > 0);
|
|
27
|
+
const search = searchFilter?.values[0] ?? "";
|
|
28
|
+
const rows = await this.props.getValues(search);
|
|
29
|
+
return { count: rows.length, rows };
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
override render(): JSX.Element | null
|
|
33
|
+
{
|
|
34
|
+
const { config, onChanged } = this.props;
|
|
35
|
+
const op = config.operatorName
|
|
36
|
+
? FilterItemOperator.getByName(config.operatorName)
|
|
37
|
+
: null;
|
|
38
|
+
|
|
39
|
+
if (op && op.count === 0)
|
|
40
|
+
return <NSAFilterBoxBoolean config={config} initial={this.props.initial} onChanged={onChanged} />;
|
|
41
|
+
|
|
42
|
+
const between = this.getInitialBetween();
|
|
43
|
+
|
|
44
|
+
if (config.operatorName === "between")
|
|
45
|
+
return (
|
|
46
|
+
<NSBoxDateRange
|
|
47
|
+
title={this.getLabel()}
|
|
48
|
+
placeholder={this.getLabel()}
|
|
49
|
+
required={false}
|
|
50
|
+
hideHeader={true}
|
|
51
|
+
preset={true}
|
|
52
|
+
defaultValue={between ? { from: this.parseDBDate(between.from), to: this.parseDBDate(between.to) } : undefined}
|
|
53
|
+
onChanged={e =>
|
|
54
|
+
{
|
|
55
|
+
const val = e.getValue();
|
|
56
|
+
if (val)
|
|
57
|
+
{
|
|
58
|
+
this.betweenActive = true;
|
|
59
|
+
onChanged(this.buildBetweenFilterItems(
|
|
60
|
+
TimeOperation.toDBFormat(val.from),
|
|
61
|
+
TimeOperation.toDBFormat(val.to)
|
|
62
|
+
));
|
|
63
|
+
}
|
|
64
|
+
else if (this.betweenActive)
|
|
65
|
+
{
|
|
66
|
+
this.betweenActive = false;
|
|
67
|
+
onChanged(null);
|
|
68
|
+
}
|
|
69
|
+
}}
|
|
70
|
+
/>
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
if (config.operatorName && ENTITY_OPERATORS.includes(config.operatorName))
|
|
74
|
+
return (
|
|
75
|
+
<NSBoxEntity<ValueItem>
|
|
76
|
+
title={this.getLabel()}
|
|
77
|
+
placeholder={this.getLabel()}
|
|
78
|
+
required={false}
|
|
79
|
+
hideHeader={true}
|
|
80
|
+
multiple={false}
|
|
81
|
+
defaultValue={this.getInitialValue()}
|
|
82
|
+
list={this.list}
|
|
83
|
+
table_name={config.column.table.name}
|
|
84
|
+
getValue={item => item.value}
|
|
85
|
+
getTitle={item => item.title}
|
|
86
|
+
getSort={() => null}
|
|
87
|
+
onChanged={e =>
|
|
88
|
+
{
|
|
89
|
+
const val = e.getValueOne();
|
|
90
|
+
onChanged(val ? this.buildFilterItem(val) : null);
|
|
91
|
+
}}
|
|
92
|
+
/>
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const single = this.getInitialValue();
|
|
96
|
+
return (
|
|
97
|
+
<NSBoxDate
|
|
98
|
+
title={this.getLabel()}
|
|
99
|
+
placeholder={this.getLabel()}
|
|
100
|
+
required={false}
|
|
101
|
+
hideHeader={true}
|
|
102
|
+
defaultValue={single !== undefined ? this.parseDBDate(single) : undefined}
|
|
103
|
+
onChanged={e =>
|
|
104
|
+
{
|
|
105
|
+
const val = e.getValue();
|
|
106
|
+
onChanged(val ? this.buildFilterItem(TimeOperation.toDBFormat(val)) : null);
|
|
107
|
+
}}
|
|
108
|
+
/>
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
111
|
}
|