namirasoft-site-react 1.3.317 → 1.3.322
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/dist/App.js +11 -2
- package/dist/App.js.map +1 -1
- package/dist/components/NSBoxEntity.js +1 -4
- package/dist/components/NSBoxEntity.js.map +1 -1
- package/dist/components/NSPageSelectionModal.d.ts +24 -0
- package/dist/components/NSPageSelectionModal.js +93 -0
- package/dist/components/NSPageSelectionModal.js.map +1 -0
- package/{src/components/NSPrintModal.module.css → dist/components/NSPageSelectionModal.module.css} +24 -4
- package/dist/components/NSTabPage.d.ts +1 -0
- package/dist/components/NSTabPage.js +1 -1
- package/dist/components/NSTabPage.js.map +1 -1
- package/dist/components/NSTabPage.module.css +10 -1
- package/dist/components/NSTable.d.ts +10 -3
- package/dist/components/NSTable.js +53 -11
- package/dist/components/NSTable.js.map +1 -1
- package/dist/main.d.ts +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/logo.png +0 -0
- package/package.json +2 -2
- package/src/App.tsx +2 -3
- package/src/components/NSBoxEntity.tsx +1 -5
- package/{dist/components/NSPrintModal.module.css → src/components/NSPageSelectionModal.module.css} +24 -4
- package/src/components/NSPageSelectionModal.tsx +164 -0
- package/src/components/NSTabPage.module.css +10 -1
- package/src/components/NSTabPage.tsx +2 -1
- package/src/components/NSTable.tsx +64 -12
- package/src/main.ts +1 -1
- package/tsconfig.json +1 -2
- package/dist/components/NSPrintModal.d.ts +0 -15
- package/dist/components/NSPrintModal.js +0 -35
- package/dist/components/NSPrintModal.js.map +0 -1
- package/src/components/NSPrintModal.tsx +0 -99
package/src/App.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './App.css';
|
|
2
2
|
import 'bootstrap/dist/css/bootstrap.min.css';
|
|
3
|
-
import { NSBarAction, NSBoxBoolean, NSBoxEmail, NSBoxEnum, NSBoxSearch, NSBoxString, NSEntityBar, NSLayout, NSNoData, NSPagination,
|
|
3
|
+
import { NSBarAction, NSBoxBoolean, NSBoxEmail, NSBoxEnum, NSBoxSearch, NSBoxString, NSEntityBar, NSLayout, NSNoData, NSPagination, NSSpace, NSSpaceSizeType, NSTabPage, NSTable } from './main';
|
|
4
4
|
import { NSBoxLabel } from './components/NSBoxLabel';
|
|
5
5
|
import NSRadioButton from './components/NSRadioButton';
|
|
6
6
|
import NSTag from './components/NSTag';
|
|
@@ -140,7 +140,7 @@ export function App()
|
|
|
140
140
|
getRowKey={row => row.id.toString()}
|
|
141
141
|
getColumnAttributes={() => { return {} }}
|
|
142
142
|
totalItems={0}
|
|
143
|
-
|
|
143
|
+
getRows={async () => { return rows; }}
|
|
144
144
|
checkbox={true}
|
|
145
145
|
/>
|
|
146
146
|
<NSBarAction title='' menus={group} />
|
|
@@ -160,7 +160,6 @@ export function App()
|
|
|
160
160
|
</div>
|
|
161
161
|
<NSSpace size={NSSpaceSizeType.MEDUIM} />
|
|
162
162
|
<NSBoxBoolean title='CheckBox' required />
|
|
163
|
-
<NSPrintModal onClose={() => { }} />
|
|
164
163
|
<NSEntityBar title='' description='' image={{ src: "" }} />
|
|
165
164
|
</NSLayout>
|
|
166
165
|
</>
|
|
@@ -106,10 +106,6 @@ export class NSBoxEntity<Data> extends React.Component<INSBoxEntityProps<Data>,
|
|
|
106
106
|
}).catch(() => { });
|
|
107
107
|
}
|
|
108
108
|
override render() {
|
|
109
|
-
if (this.state.items == null) {
|
|
110
|
-
// todo
|
|
111
|
-
return <NSLoading></NSLoading>
|
|
112
|
-
}
|
|
113
109
|
return (
|
|
114
110
|
<>
|
|
115
111
|
<div id={this.props.id} className={`${Styles.ns_input_parent}`}>
|
|
@@ -122,13 +118,13 @@ export class NSBoxEntity<Data> extends React.Component<INSBoxEntityProps<Data>,
|
|
|
122
118
|
onClick={() => this.props.onClicked}
|
|
123
119
|
optionLabelProp="label"
|
|
124
120
|
options={this.state.items_string ?? []}
|
|
121
|
+
notFoundContent={this.state.items === null ? <NSLoading /> : null}
|
|
125
122
|
optionRender={(option) => (
|
|
126
123
|
<Space className={Styles.ns_input_select_option}>
|
|
127
124
|
{option.data.desc}
|
|
128
125
|
</Space>
|
|
129
126
|
)}
|
|
130
127
|
suffixIcon={<img src={IconSelectBox} alt="SelectBox Icon" />}
|
|
131
|
-
|
|
132
128
|
/>
|
|
133
129
|
<NSBoxErrorNotifier error={this.state.error} clearError={() => this.setState({ error: "" })} />
|
|
134
130
|
</div>
|
package/{dist/components/NSPrintModal.module.css → src/components/NSPageSelectionModal.module.css}
RENAMED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
.ns_print_container {
|
|
2
|
-
/* position: absolute; */
|
|
3
2
|
z-index: 1;
|
|
4
|
-
top:
|
|
5
|
-
transform: translate(
|
|
6
|
-
right: 0;
|
|
3
|
+
top: 0%;
|
|
4
|
+
transform: translate(50%, 50%);
|
|
7
5
|
background-color: rgba(255, 255, 255, 1);
|
|
8
6
|
border-radius: 16px;
|
|
9
7
|
border: 0.2px solid rgb(210, 210, 210);
|
|
10
8
|
padding: 16px;
|
|
11
9
|
max-width: 380px;
|
|
10
|
+
position: absolute;
|
|
11
|
+
top: 50%;
|
|
12
|
+
left: 50%;
|
|
13
|
+
transform: translate(-50%, -50%);
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
.ns_header_print {
|
|
@@ -19,6 +21,7 @@
|
|
|
19
21
|
position: absolute;
|
|
20
22
|
right: 0px;
|
|
21
23
|
top: 0px;
|
|
24
|
+
cursor: pointer;
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
.ns_print_title {
|
|
@@ -79,4 +82,21 @@
|
|
|
79
82
|
.ns_w_box_string input {
|
|
80
83
|
width: 272px !important;
|
|
81
84
|
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.ns_toast_background {
|
|
88
|
+
width: 100vw;
|
|
89
|
+
height: 100vh;
|
|
90
|
+
background-color: #00000059;
|
|
91
|
+
position: fixed;
|
|
92
|
+
top: 0;
|
|
93
|
+
left: 0;
|
|
94
|
+
display: flex;
|
|
95
|
+
justify-content: center;
|
|
96
|
+
align-items: center;
|
|
97
|
+
cursor: default;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.ns_parent_modal {
|
|
101
|
+
/* position: relative; */
|
|
82
102
|
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import React, { Component, createRef } from 'react';
|
|
2
|
+
import Styles from './NSPageSelectionModal.module.css';
|
|
3
|
+
import { NSButtonBlue } from './NSButtonBlue';
|
|
4
|
+
import { NSBoxString } from './NSBoxString';
|
|
5
|
+
import { NSBoxBoolean } from './NSBoxBoolean';
|
|
6
|
+
import { NSSpace } from './NSSpace';
|
|
7
|
+
import { NSSpaceSizeType } from '../main';
|
|
8
|
+
|
|
9
|
+
export interface NSPageSelectionModalProps<RowType>
|
|
10
|
+
{
|
|
11
|
+
current_page: number;
|
|
12
|
+
max_page: number;
|
|
13
|
+
onClose: () => void;
|
|
14
|
+
getItems: (page: number, selected: boolean) => Promise<RowType[]>;
|
|
15
|
+
onFinish: (items: RowType[]) => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface NSPageSelectionModalState
|
|
19
|
+
{
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class NSPageSelectionModal<RowType> extends Component<NSPageSelectionModalProps<RowType>, NSPageSelectionModalState>
|
|
23
|
+
{
|
|
24
|
+
private toastRef: React.RefObject<HTMLDivElement> = createRef();
|
|
25
|
+
private NSBoxBoolean_CurrentPage: React.RefObject<NSBoxBoolean> = createRef();
|
|
26
|
+
private NSBoxBoolean_SelectedItems: React.RefObject<NSBoxBoolean> = createRef();
|
|
27
|
+
private NSBoxBoolean_CustomPage: React.RefObject<NSBoxBoolean> = createRef();
|
|
28
|
+
private NSBoxBoolean_AllPage: React.RefObject<NSBoxBoolean> = createRef();
|
|
29
|
+
private NSBoxString_Pages: React.RefObject<NSBoxString> = createRef();
|
|
30
|
+
|
|
31
|
+
constructor(props: NSPageSelectionModalProps<RowType>)
|
|
32
|
+
{
|
|
33
|
+
super(props);
|
|
34
|
+
this.state = {};
|
|
35
|
+
this.onClickOutside = this.onClickOutside.bind(this);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
override componentDidMount(): void
|
|
39
|
+
{
|
|
40
|
+
document.addEventListener('mousedown', this.onClickOutside);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
override componentWillUnmount(): void
|
|
44
|
+
{
|
|
45
|
+
document.removeEventListener('mousedown', this.onClickOutside);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
private onClickOutside(event: MouseEvent)
|
|
49
|
+
{
|
|
50
|
+
if (this.toastRef.current && !this.toastRef.current.contains(event.target as Node))
|
|
51
|
+
{
|
|
52
|
+
this.props.onClose();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
override render()
|
|
56
|
+
{
|
|
57
|
+
return (
|
|
58
|
+
<>
|
|
59
|
+
{
|
|
60
|
+
<>
|
|
61
|
+
<div className={Styles.ns_print_container} ref={this.toastRef}>
|
|
62
|
+
<div className={Styles.ns_header_print}>
|
|
63
|
+
<img
|
|
64
|
+
src="https://static.namirasoft.com/image/concept/close/blue.svg"
|
|
65
|
+
alt="Close"
|
|
66
|
+
width={24}
|
|
67
|
+
height={24}
|
|
68
|
+
onClick={(e) =>
|
|
69
|
+
{
|
|
70
|
+
e.stopPropagation();
|
|
71
|
+
this.props.onClose();
|
|
72
|
+
}}
|
|
73
|
+
className={Styles.ns_close_icon}
|
|
74
|
+
/>
|
|
75
|
+
<div className={Styles.ns_print_title}>
|
|
76
|
+
<img
|
|
77
|
+
src="https://static.namirasoft.com/image/concept/print/blue.svg"
|
|
78
|
+
alt="Print"
|
|
79
|
+
width={24}
|
|
80
|
+
height={24}
|
|
81
|
+
/>
|
|
82
|
+
<h2 className='m-0'>Page Selection</h2>
|
|
83
|
+
</div>
|
|
84
|
+
<NSSpace size={NSSpaceSizeType.SMALL} />
|
|
85
|
+
<p className={Styles.ns_print_description}>Please select which pages you want to continue with</p>
|
|
86
|
+
<NSSpace size={NSSpaceSizeType.SMALL} />
|
|
87
|
+
<div className={Styles.ns_parent_checkboxs}>
|
|
88
|
+
<NSBoxBoolean ref={this.NSBoxBoolean_CurrentPage} classList={[Styles.ns_w_box_boolean]} title="Current page" required={false} />
|
|
89
|
+
<NSBoxBoolean ref={this.NSBoxBoolean_SelectedItems} classList={[Styles.ns_w_box_boolean]} title="Only Selected Items" required={false} />
|
|
90
|
+
<NSBoxBoolean ref={this.NSBoxBoolean_CustomPage} classList={[Styles.ns_w_box_boolean]} title="Custom Pages" required={false} />
|
|
91
|
+
<NSBoxBoolean ref={this.NSBoxBoolean_AllPage} classList={[Styles.ns_w_box_boolean]} title="All Pages" required={false} />
|
|
92
|
+
</div>
|
|
93
|
+
<NSSpace size={NSSpaceSizeType.MICRO} />
|
|
94
|
+
<NSBoxString ref={this.NSBoxString_Pages} classList={[Styles.ns_w_box_string]} required={false} title="Custom Pages" />
|
|
95
|
+
<NSSpace size={NSSpaceSizeType.SMALL} />
|
|
96
|
+
<NSButtonBlue style={{ width: "100%" }} title='Apply' onClick={async () =>
|
|
97
|
+
{
|
|
98
|
+
let items: RowType[] = [];
|
|
99
|
+
if (this.NSBoxBoolean_CurrentPage.current?.getValue())
|
|
100
|
+
{
|
|
101
|
+
let is = await this.props.getItems(this.props.current_page, false);
|
|
102
|
+
items.push(...is);
|
|
103
|
+
}
|
|
104
|
+
else if (this.NSBoxBoolean_SelectedItems.current?.getValue())
|
|
105
|
+
{
|
|
106
|
+
let is = await this.props.getItems(this.props.current_page, true);
|
|
107
|
+
items.push(...is);
|
|
108
|
+
}
|
|
109
|
+
else if (this.NSBoxBoolean_CustomPage.current?.getValue())
|
|
110
|
+
{
|
|
111
|
+
let pages_value = this.NSBoxString_Pages.current?.getValue() ?? "";
|
|
112
|
+
let pages = pages_value.split(',').map(p => p.trim()).filter(p => p);
|
|
113
|
+
for (let i = 0; i < pages.length; i++)
|
|
114
|
+
{
|
|
115
|
+
const element = pages[i];
|
|
116
|
+
if (element.includes("-"))
|
|
117
|
+
{
|
|
118
|
+
let ps = element.split('-').map(p => p.trim());
|
|
119
|
+
if (ps.length == 2)
|
|
120
|
+
{
|
|
121
|
+
let from = parseInt(ps[0]);
|
|
122
|
+
let to = parseInt(ps[1]);
|
|
123
|
+
for (let p = from; p <= to; p++)
|
|
124
|
+
{
|
|
125
|
+
let is = await this.props.getItems(p, false);
|
|
126
|
+
items.push(...is);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else
|
|
130
|
+
{
|
|
131
|
+
// error
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else
|
|
135
|
+
{
|
|
136
|
+
let p = parseInt(element);
|
|
137
|
+
let is = await this.props.getItems(p, false);
|
|
138
|
+
items.push(...is);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (this.NSBoxBoolean_AllPage.current?.getValue())
|
|
143
|
+
{
|
|
144
|
+
for (let p = 1; p <= this.props.max_page; p++)
|
|
145
|
+
{
|
|
146
|
+
let is = await this.props.getItems(p, false);
|
|
147
|
+
items.push(...is);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else
|
|
151
|
+
{ }
|
|
152
|
+
this.props.onFinish(items);
|
|
153
|
+
}} />
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
<div className={Styles.ns_toast_background}></div>
|
|
157
|
+
</>
|
|
158
|
+
}
|
|
159
|
+
</>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export default NSPageSelectionModal;
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
box-shadow: 0px 2px 2px 2px #141B5C;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
.
|
|
41
|
+
.ns_tab_content_column {
|
|
42
42
|
padding: 16px;
|
|
43
43
|
border-radius: 0 8px 8px 8px;
|
|
44
44
|
background-color: #fff;
|
|
@@ -46,4 +46,13 @@
|
|
|
46
46
|
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
|
47
47
|
gap: 0;
|
|
48
48
|
border-right: 1px solid #ccc;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.ns_tab_content_grid {
|
|
52
|
+
padding: 16px;
|
|
53
|
+
border-radius: 0 8px 8px 8px;
|
|
54
|
+
background-color: #fff;
|
|
55
|
+
display: grid;
|
|
56
|
+
gap: 0;
|
|
57
|
+
border-right: 1px solid #ccc;
|
|
49
58
|
}
|
|
@@ -12,6 +12,7 @@ export interface NSTabPageTab
|
|
|
12
12
|
export interface NSTabPageProps extends IBaseComponentProps
|
|
13
13
|
{
|
|
14
14
|
tabs: NSTabPageTab[]
|
|
15
|
+
grid?: boolean;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export interface NSTabPageState
|
|
@@ -38,7 +39,7 @@ export function NSTabPage(props: NSTabPageProps)
|
|
|
38
39
|
))
|
|
39
40
|
}
|
|
40
41
|
</ul>
|
|
41
|
-
<div className={Styles.
|
|
42
|
+
<div className={props.grid ? Styles.ns_tab_content_grid : Styles.ns_tab_content_column}>
|
|
42
43
|
{props.tabs[state.activeTabIndex].getContent()}
|
|
43
44
|
</div>
|
|
44
45
|
</div>
|
|
@@ -8,6 +8,7 @@ import { Component } from 'react';
|
|
|
8
8
|
import { IBaseComponentProps } from "../props/IBaseComponentProps";
|
|
9
9
|
import React from "react";
|
|
10
10
|
import { NSModal } from './NSModal';
|
|
11
|
+
import { NSPageSelectionModal } from './NSPageSelectionModal';
|
|
11
12
|
import { NSLoading } from './NSLoading';
|
|
12
13
|
import { NSNoData } from './NSNoData';
|
|
13
14
|
import { writeFile, utils } from 'xlsx';
|
|
@@ -17,7 +18,7 @@ export interface INSTableProps<RowType> extends IBaseComponentProps
|
|
|
17
18
|
columns: { [key: string]: string };
|
|
18
19
|
totalItems: number;
|
|
19
20
|
checkbox: boolean;
|
|
20
|
-
|
|
21
|
+
getRows: (page: number, size: number) => Promise<RowType[]>;
|
|
21
22
|
getRowKey: (row: RowType, rowIndex: number) => string;
|
|
22
23
|
getColumnAttributes?: (column: string, columnIndex: number) => { [key: string]: string };
|
|
23
24
|
getCell?: (row: RowType, column: string, rowIndex: number, columnIndex: number) => any;
|
|
@@ -37,6 +38,14 @@ interface NSTableState<RowType>
|
|
|
37
38
|
};
|
|
38
39
|
selectedIDs: string[];
|
|
39
40
|
indeterminate: boolean;
|
|
41
|
+
pageSelectionMode: PageSelectionMode;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
enum PageSelectionMode
|
|
45
|
+
{
|
|
46
|
+
Hidden = "Hidden",
|
|
47
|
+
Print = "Print",
|
|
48
|
+
CSV = "CSV"
|
|
40
49
|
}
|
|
41
50
|
|
|
42
51
|
export class NSTable<RowType> extends Component<INSTableProps<RowType>, NSTableState<RowType>>
|
|
@@ -50,7 +59,8 @@ export class NSTable<RowType> extends Component<INSTableProps<RowType>, NSTableS
|
|
|
50
59
|
rows: null,
|
|
51
60
|
model: { show: false },
|
|
52
61
|
selectedIDs: [],
|
|
53
|
-
indeterminate: false
|
|
62
|
+
indeterminate: false,
|
|
63
|
+
pageSelectionMode: PageSelectionMode.Hidden
|
|
54
64
|
};
|
|
55
65
|
this.setColumns = this.setColumns.bind(this);
|
|
56
66
|
this.setRows = this.setRows.bind(this);
|
|
@@ -60,8 +70,9 @@ export class NSTable<RowType> extends Component<INSTableProps<RowType>, NSTableS
|
|
|
60
70
|
this.isSomeChecked = this.isSomeChecked.bind(this);
|
|
61
71
|
this.toggleAllCheckboxes = this.toggleAllCheckboxes.bind(this);
|
|
62
72
|
this.print = this.print.bind(this);
|
|
63
|
-
this.
|
|
73
|
+
this.exportCSV = this.exportCSV.bind(this);
|
|
64
74
|
this.isAllChecked = this.isAllChecked.bind(this);
|
|
75
|
+
this.reload = this.reload.bind(this);
|
|
65
76
|
}
|
|
66
77
|
|
|
67
78
|
setColumns(columns: { [key: string]: string })
|
|
@@ -86,7 +97,14 @@ export class NSTable<RowType> extends Component<INSTableProps<RowType>, NSTableS
|
|
|
86
97
|
|
|
87
98
|
private onPageChange(page: number, size: number)
|
|
88
99
|
{
|
|
89
|
-
this.
|
|
100
|
+
this.reload(page, size);
|
|
101
|
+
}
|
|
102
|
+
private reload(page: number, size: number)
|
|
103
|
+
{
|
|
104
|
+
this.props.getRows(page, size).then(rows =>
|
|
105
|
+
{
|
|
106
|
+
this.setRows(rows);
|
|
107
|
+
});
|
|
90
108
|
}
|
|
91
109
|
|
|
92
110
|
private toggleAllCheckboxes()
|
|
@@ -99,10 +117,10 @@ export class NSTable<RowType> extends Component<INSTableProps<RowType>, NSTableS
|
|
|
99
117
|
selectedIDs.push(id);
|
|
100
118
|
})
|
|
101
119
|
this.setSelectedIDs(selectedIDs);
|
|
102
|
-
this.setState({ indeterminate:
|
|
120
|
+
this.setState({ indeterminate: false });
|
|
103
121
|
}
|
|
104
122
|
|
|
105
|
-
print()
|
|
123
|
+
print(rows: RowType[])
|
|
106
124
|
{
|
|
107
125
|
const printWindow = window.open('', '', 'height=500,width=800');
|
|
108
126
|
printWindow!.document.write('<html><head><title>Print Table</title>');
|
|
@@ -119,7 +137,7 @@ export class NSTable<RowType> extends Component<INSTableProps<RowType>, NSTableS
|
|
|
119
137
|
printWindow!.document.write('</tr></thead><tbody>');
|
|
120
138
|
|
|
121
139
|
// Add table rows
|
|
122
|
-
|
|
140
|
+
rows.forEach(row =>
|
|
123
141
|
{
|
|
124
142
|
printWindow!.document.write('<tr>');
|
|
125
143
|
Object.keys(this.state.columns).forEach(column =>
|
|
@@ -134,12 +152,12 @@ export class NSTable<RowType> extends Component<INSTableProps<RowType>, NSTableS
|
|
|
134
152
|
printWindow!.document.close();
|
|
135
153
|
printWindow!.print();
|
|
136
154
|
}
|
|
137
|
-
|
|
155
|
+
exportCSV(rows: RowType[])
|
|
138
156
|
{
|
|
139
|
-
debugger
|
|
140
157
|
const worksheet = utils.json_to_sheet(this.state.rows || []);
|
|
141
158
|
const workbook = utils.book_new();
|
|
142
159
|
utils.book_append_sheet(workbook, worksheet, "Table Data");
|
|
160
|
+
console.log(rows.length); // todo
|
|
143
161
|
writeFile(workbook, "TableData.xlsx");
|
|
144
162
|
}
|
|
145
163
|
getSelectedIDs(): string[]
|
|
@@ -274,14 +292,48 @@ export class NSTable<RowType> extends Component<INSTableProps<RowType>, NSTableS
|
|
|
274
292
|
<NSPagination ref={this.NSPagination} totalItems={this.props.totalItems} onPageChange={this.onPageChange} />
|
|
275
293
|
<NSSpace size={NSSpaceSizeType.SMALL} />
|
|
276
294
|
<div className={Styles.ns_button}>
|
|
295
|
+
{
|
|
296
|
+
this.state.pageSelectionMode != PageSelectionMode.Hidden &&
|
|
297
|
+
<NSPageSelectionModal<RowType>
|
|
298
|
+
current_page={1}
|
|
299
|
+
max_page={1}
|
|
300
|
+
getItems={async (page, selected) =>
|
|
301
|
+
{
|
|
302
|
+
if (selected)
|
|
303
|
+
{
|
|
304
|
+
let rows: RowType[] = [];
|
|
305
|
+
if (this.state.rows)
|
|
306
|
+
for (let i = 0; i < this.state.rows.length; i++)
|
|
307
|
+
{
|
|
308
|
+
const row = this.state.rows[i];
|
|
309
|
+
let id = this.props.getRowKey(row, i);
|
|
310
|
+
if (this.state.selectedIDs.includes(id))
|
|
311
|
+
rows.push(row);
|
|
312
|
+
}
|
|
313
|
+
return rows;
|
|
314
|
+
}
|
|
315
|
+
return this.props.getRows(page, this.NSPagination.current?.getCurrentPage() ?? 0);
|
|
316
|
+
}}
|
|
317
|
+
onFinish={(items: RowType[]) =>
|
|
318
|
+
{
|
|
319
|
+
if (this.state.pageSelectionMode == PageSelectionMode.Print)
|
|
320
|
+
this.print(items);
|
|
321
|
+
else if (this.state.pageSelectionMode == PageSelectionMode.CSV)
|
|
322
|
+
this.exportCSV(items);
|
|
323
|
+
}}
|
|
324
|
+
onClose={() => { this.setState({ pageSelectionMode: PageSelectionMode.Hidden }); }
|
|
325
|
+
}
|
|
326
|
+
/>
|
|
327
|
+
}
|
|
277
328
|
<NSButton title='Chart' icon={{ src: "https://static.namirasoft.com/image/concept/chart/blue.svg" }} onClick={() => { }} style={{ border: '1px solid rgba(255, 148, 50, 1)', width: "128px" }} />
|
|
278
|
-
<NSButton title='Print' icon={{ src: "https://static.namirasoft.com/image/concept/print/blue.svg" }} onClick={this.
|
|
279
|
-
<NSButton title='Export' icon={{ src: "https://static.namirasoft.com/image/concept/export/blue.svg" }} onClick={this.
|
|
329
|
+
<NSButton title='Print' icon={{ src: "https://static.namirasoft.com/image/concept/print/blue.svg" }} onClick={() => { this.setState({ pageSelectionMode: PageSelectionMode.Print }); }} style={{ border: '1px solid rgba(255, 148, 50, 1)', width: "128px" }} />
|
|
330
|
+
<NSButton title='Export' icon={{ src: "https://static.namirasoft.com/image/concept/export/blue.svg" }} onClick={() => { this.setState({ pageSelectionMode: PageSelectionMode.CSV }); }} style={{ border: '1px solid rgba(255, 148, 50, 1)', width: "128px" }} />
|
|
280
331
|
<NSButton title='Refresh' icon={{ src: "https://static.namirasoft.com/image/concept/refresh/blue.svg" }} onClick={() =>
|
|
281
332
|
{
|
|
282
333
|
if (this.NSPagination.current)
|
|
283
|
-
this.
|
|
334
|
+
this.reload(this.NSPagination.current.getCurrentPage(), this.NSPagination.current.getPageSize());
|
|
284
335
|
}} style={{ border: '1px solid rgba(3, 119, 255, 1)', width: "128px" }} />
|
|
336
|
+
|
|
285
337
|
</div>
|
|
286
338
|
</section>
|
|
287
339
|
<NSSpace size={NSSpaceSizeType.SMALL} />
|
package/src/main.ts
CHANGED
|
@@ -51,7 +51,7 @@ export * from "./components/NSNoData";
|
|
|
51
51
|
export * from "./components/NSModal";
|
|
52
52
|
export * from "./components/NSPagination";
|
|
53
53
|
export * from "./components/NSPanel";
|
|
54
|
-
export * from "./components/
|
|
54
|
+
export * from "./components/NSPageSelectionModal";
|
|
55
55
|
export * from "./components/NSRadioButton";
|
|
56
56
|
export * from "./components/NSSection";
|
|
57
57
|
export * from "./components/NSSectionBars";
|
package/tsconfig.json
CHANGED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Component } from 'react';
|
|
2
|
-
export interface NSPrintModalProps {
|
|
3
|
-
onClose: () => void;
|
|
4
|
-
}
|
|
5
|
-
interface NSPrintModalState {
|
|
6
|
-
}
|
|
7
|
-
export declare class NSPrintModal extends Component<NSPrintModalProps, NSPrintModalState> {
|
|
8
|
-
private toastRef;
|
|
9
|
-
constructor(props: NSPrintModalProps);
|
|
10
|
-
componentDidMount(): void;
|
|
11
|
-
componentWillUnmount(): void;
|
|
12
|
-
private onClickOutside;
|
|
13
|
-
render(): import("react/jsx-runtime").JSX.Element;
|
|
14
|
-
}
|
|
15
|
-
export default NSPrintModal;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { Component, createRef } from 'react';
|
|
3
|
-
import Styles from './NSPrintModal.module.css';
|
|
4
|
-
import { NSButtonBlue } from './NSButtonBlue';
|
|
5
|
-
import { NSBoxString } from './NSBoxString';
|
|
6
|
-
import { NSBoxBoolean } from './NSBoxBoolean';
|
|
7
|
-
import { NSSpace } from './NSSpace';
|
|
8
|
-
import { NSSpaceSizeType } from '../main';
|
|
9
|
-
export class NSPrintModal extends Component {
|
|
10
|
-
constructor(props) {
|
|
11
|
-
super(props);
|
|
12
|
-
this.toastRef = createRef();
|
|
13
|
-
this.state = { products: null, search: "" };
|
|
14
|
-
this.onClickOutside = this.onClickOutside.bind(this);
|
|
15
|
-
}
|
|
16
|
-
componentDidMount() {
|
|
17
|
-
document.addEventListener('mousedown', this.onClickOutside);
|
|
18
|
-
}
|
|
19
|
-
componentWillUnmount() {
|
|
20
|
-
document.removeEventListener('mousedown', this.onClickOutside);
|
|
21
|
-
}
|
|
22
|
-
onClickOutside(event) {
|
|
23
|
-
if (this.toastRef.current && !this.toastRef.current.contains(event.target)) {
|
|
24
|
-
this.props.onClose();
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
render() {
|
|
28
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { className: Styles.ns_print_container, ref: this.toastRef, children: _jsxs("div", { className: Styles.ns_header_print, children: [_jsx("img", { src: "https://static.namirasoft.com/image/concept/close/blue.svg", alt: "Close", width: 24, height: 24, onClick: (e) => {
|
|
29
|
-
e.stopPropagation();
|
|
30
|
-
this.props.onClose();
|
|
31
|
-
}, className: Styles.ns_close_icon }), _jsxs("div", { className: Styles.ns_print_title, children: [_jsx("img", { src: "https://static.namirasoft.com/image/concept/print/blue.svg", alt: "Print", width: 24, height: 24 }), _jsx("h2", { className: 'm-0', children: "Page Selection" })] }), _jsx(NSSpace, { size: NSSpaceSizeType.SMALL }), _jsx("p", { className: Styles.ns_print_description, children: "Please select which pages you want to continue with" }), _jsx(NSSpace, { size: NSSpaceSizeType.SMALL }), _jsxs("div", { className: Styles.ns_parent_checkboxs, children: [_jsx(NSBoxBoolean, { classList: [Styles.ns_w_box_boolean], title: "Current page", required: false }), _jsx(NSBoxBoolean, { classList: [Styles.ns_w_box_boolean], title: "Only Selected Items", required: false }), _jsx(NSBoxBoolean, { classList: [Styles.ns_w_box_boolean], title: "Custom Pages", required: false }), _jsx(NSBoxBoolean, { classList: [Styles.ns_w_box_boolean], title: "All Pages", required: false })] }), _jsx(NSSpace, { size: NSSpaceSizeType.MICRO }), _jsx(NSBoxString, { classList: [Styles.ns_w_box_string], required: false, title: "Page1" }), _jsx(NSSpace, { size: NSSpaceSizeType.SMALL }), _jsx(NSButtonBlue, { style: { width: "100%" }, title: 'Apply', onClick: () => { } })] }) }), _jsx("div", { className: Styles.ns_toast_background })] }));
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
export default NSPrintModal;
|
|
35
|
-
//# sourceMappingURL=NSPrintModal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"NSPrintModal.js","sourceRoot":"","sources":["../../src/components/NSPrintModal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import React, { Component, createRef } from 'react';
|
|
2
|
-
import Styles from './NSPrintModal.module.css';
|
|
3
|
-
import { NSButtonBlue } from './NSButtonBlue';
|
|
4
|
-
import { NSBoxString } from './NSBoxString';
|
|
5
|
-
import { NSBoxBoolean } from './NSBoxBoolean';
|
|
6
|
-
import { NSSpace } from './NSSpace';
|
|
7
|
-
import { NSSpaceSizeType } from '../main';
|
|
8
|
-
// import { NamirasoftAPIProductServer, ProductFullRow } from 'namirasoft-api-product';
|
|
9
|
-
// import CloseToast from '../assets/images/icon-close.png';
|
|
10
|
-
// import { NSBoxSearch, NSLoading } from 'namirasoft-site-react';
|
|
11
|
-
|
|
12
|
-
export interface NSPrintModalProps
|
|
13
|
-
{
|
|
14
|
-
onClose: () => void;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
interface NSPrintModalState
|
|
18
|
-
{
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export class NSPrintModal extends Component<NSPrintModalProps, NSPrintModalState>
|
|
22
|
-
{
|
|
23
|
-
private toastRef: React.RefObject<HTMLDivElement>;
|
|
24
|
-
|
|
25
|
-
constructor(props: NSPrintModalProps)
|
|
26
|
-
{
|
|
27
|
-
super(props);
|
|
28
|
-
this.toastRef = createRef();
|
|
29
|
-
this.state = { products: null, search: "" };
|
|
30
|
-
this.onClickOutside = this.onClickOutside.bind(this);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
override componentDidMount(): void
|
|
34
|
-
{
|
|
35
|
-
document.addEventListener('mousedown', this.onClickOutside);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
override componentWillUnmount(): void
|
|
39
|
-
{
|
|
40
|
-
document.removeEventListener('mousedown', this.onClickOutside);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
private onClickOutside(event: MouseEvent)
|
|
44
|
-
{
|
|
45
|
-
if (this.toastRef.current && !this.toastRef.current.contains(event.target as Node))
|
|
46
|
-
{
|
|
47
|
-
this.props.onClose();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
override render()
|
|
52
|
-
{
|
|
53
|
-
return (
|
|
54
|
-
<>
|
|
55
|
-
<div className={Styles.ns_print_container} ref={this.toastRef}>
|
|
56
|
-
<div className={Styles.ns_header_print}>
|
|
57
|
-
<img
|
|
58
|
-
src="https://static.namirasoft.com/image/concept/close/blue.svg"
|
|
59
|
-
alt="Close"
|
|
60
|
-
width={24}
|
|
61
|
-
height={24}
|
|
62
|
-
onClick={(e) =>
|
|
63
|
-
{
|
|
64
|
-
e.stopPropagation();
|
|
65
|
-
this.props.onClose();
|
|
66
|
-
}}
|
|
67
|
-
className={Styles.ns_close_icon}
|
|
68
|
-
/>
|
|
69
|
-
<div className={Styles.ns_print_title}>
|
|
70
|
-
<img
|
|
71
|
-
src="https://static.namirasoft.com/image/concept/print/blue.svg"
|
|
72
|
-
alt="Print"
|
|
73
|
-
width={24}
|
|
74
|
-
height={24}
|
|
75
|
-
/>
|
|
76
|
-
<h2 className='m-0'>Page Selection</h2>
|
|
77
|
-
</div>
|
|
78
|
-
<NSSpace size={NSSpaceSizeType.SMALL}/>
|
|
79
|
-
<p className={Styles.ns_print_description}>Please select which pages you want to continue with</p>
|
|
80
|
-
<NSSpace size={NSSpaceSizeType.SMALL} />
|
|
81
|
-
<div className={Styles.ns_parent_checkboxs}>
|
|
82
|
-
<NSBoxBoolean classList={[Styles.ns_w_box_boolean]} title="Current page" required={false}/>
|
|
83
|
-
<NSBoxBoolean classList={[Styles.ns_w_box_boolean]} title="Only Selected Items" required={false}/>
|
|
84
|
-
<NSBoxBoolean classList={[Styles.ns_w_box_boolean]} title="Custom Pages" required={false}/>
|
|
85
|
-
<NSBoxBoolean classList={[Styles.ns_w_box_boolean]} title="All Pages" required={false}/>
|
|
86
|
-
</div>
|
|
87
|
-
<NSSpace size={NSSpaceSizeType.MICRO} />
|
|
88
|
-
<NSBoxString classList={[Styles.ns_w_box_string]} required={false} title="Page1"/>
|
|
89
|
-
<NSSpace size={NSSpaceSizeType.SMALL} />
|
|
90
|
-
<NSButtonBlue style={{width:"100%"}} title='Apply' onClick={()=>{}}/>
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
<div className={Styles.ns_toast_background}></div>
|
|
94
|
-
</>
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export default NSPrintModal;
|