es-grid-template 1.4.9 → 1.5.1
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/es/grid-component/GridStyle.js +1 -1
- package/es/grid-component/InternalTable.d.ts +2 -0
- package/es/grid-component/InternalTable.js +8 -3
- package/es/grid-component/TableGrid.js +1 -1
- package/es/grid-component/hooks/columns/index.d.ts +1 -1
- package/es/grid-component/hooks/columns/index.js +19 -31
- package/es/grid-component/hooks/utils.d.ts +2 -0
- package/es/grid-component/hooks/utils.js +45 -1
- package/es/grid-component/styles.scss +4 -0
- package/es/grid-component/table/GridEdit.js +84 -74
- package/es/grid-component/table/Group.js +1 -0
- package/lib/grid-component/GridStyle.js +1 -1
- package/lib/grid-component/InternalTable.d.ts +2 -0
- package/lib/grid-component/InternalTable.js +8 -3
- package/lib/grid-component/TableGrid.js +1 -1
- package/lib/grid-component/hooks/columns/index.d.ts +1 -1
- package/lib/grid-component/hooks/columns/index.js +17 -29
- package/lib/grid-component/hooks/utils.d.ts +2 -0
- package/lib/grid-component/hooks/utils.js +53 -5
- package/lib/grid-component/styles.scss +4 -0
- package/lib/grid-component/table/GridEdit.js +84 -74
- package/lib/grid-component/table/Group.js +1 -0
- package/package.json +110 -110
|
@@ -2,4 +2,4 @@ import styled from "styled-components";
|
|
|
2
2
|
export const GridStyle = styled.div.withConfig({
|
|
3
3
|
displayName: "GridStyle",
|
|
4
4
|
componentId: "es-grid-template__sc-sueu2e-0"
|
|
5
|
-
})(["height:", ";.ui-rc-table.ui-rc-table-virtual.ui-rc-table-scroll-horizontal{.ui-rc-table-container{&:has(.ui-rc-table-tbody-virtual-scrollbar-horizontal){padding-bottom:8px;border-bottom:1px solid #e0e0e0;}}}.ui-rc-table-container{.ui-rc-table-tbody-virtual.ui-rc-table-tbody{min-height:", ";}}.ui-rc-toolbar-bottom{position:relative;padding:.25rem 1rem;background-color:#ffffff;&::before{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:100%;bottom:0;left:0;}&::after{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:100%;bottom:0;visibility:visible;right:0;}.toolbar-button{border-radius:0;.ant-btn{border-radius:0;}}}.ui-rc-pagination{border-bottom:1px solid #e0e0e0;border-top:1px solid #e0e0e0;margin:0;padding:.75rem 1rem;background-color:#ffffff;.ui-rc-pagination-total-text{order:2;margin-left:auto;}&::before{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:50px;bottom:0;left:0;}&::after{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:50px;bottom:0;visibility:visible;right:0;}&.pagination-template{position:relative;&::before{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:100%;bottom:0;left:0;}&::after{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:100%;bottom:0;visibility:visible;right:0;}}}.react-resizable{position:relative;background-clip:padding-box;}.rc-resizable-handle{position:absolute;right:0px;bottom:0;z-index:1;width:5px;height:100%;cursor:col-resize;&.none{cursor:auto;display:none;}}"], props => props.$heightTable ? `${props.$heightTable}px` : undefined, props => props.$heightScroll ? `${props.$heightScroll}px` : undefined);
|
|
5
|
+
})(["height:", ";.ui-rc-table.ui-rc-table-virtual.ui-rc-table-scroll-horizontal{.ui-rc-table-container{&:has(.ui-rc-table-tbody-virtual-scrollbar-horizontal){padding-bottom:8px;border-bottom:1px solid #e0e0e0;}}}.ui-rc-table-container{.ui-rc-table-tbody-virtual.ui-rc-table-tbody{min-height:", ";}.ui-rc-table-body{&:has(.ui-rc-table-placeholder){height:", ";}table{height:100%;.ui-rc-table-placeholder{vertical-align:top;}}}.ui-rc-table-placeholder{}}.ui-rc-toolbar-bottom{position:relative;padding:.25rem 1rem;background-color:#ffffff;&::before{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:100%;bottom:0;left:0;}&::after{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:100%;bottom:0;visibility:visible;right:0;}.toolbar-button{border-radius:0;.ant-btn{border-radius:0;}}}.ui-rc-pagination{border-bottom:1px solid #e0e0e0;border-top:1px solid #e0e0e0;margin:0;padding:.75rem 1rem;background-color:#ffffff;.ui-rc-pagination-total-text{order:2;margin-left:auto;}&::before{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:50px;bottom:0;left:0;}&::after{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:50px;bottom:0;visibility:visible;right:0;}&.pagination-template{position:relative;&::before{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:100%;bottom:0;left:0;}&::after{content:\"\";position:absolute;border-left:1px solid #e0e0e0;height:100%;bottom:0;visibility:visible;right:0;}}}.react-resizable{position:relative;background-clip:padding-box;}.rc-resizable-handle{position:absolute;right:0px;bottom:0;z-index:1;width:5px;height:100%;cursor:col-resize;&.none{cursor:auto;display:none;}}"], props => props.$heightTable ? `${props.$heightTable}px` : undefined, props => props.$heightScroll ? `${props.$heightScroll}px` : undefined, props => props.$heightScroll ? `${props.$heightScroll - 1}px` : undefined);
|
|
@@ -4,6 +4,8 @@ import type { GridTableProps } from "./type";
|
|
|
4
4
|
import 'dayjs/locale/es';
|
|
5
5
|
import 'dayjs/locale/vi';
|
|
6
6
|
import './styles.scss';
|
|
7
|
+
import 'rc-master-ui/es/date-range-picker/styles/index.less';
|
|
8
|
+
import 'rc-master-ui/assets/index.css';
|
|
7
9
|
export declare const SELECTION_COLUMN: {};
|
|
8
10
|
declare const InternalTable: <RecordType extends object>(props: GridTableProps<RecordType>) => React.JSX.Element;
|
|
9
11
|
export default InternalTable;
|
|
@@ -11,9 +11,13 @@ import GridEdit from "./table/GridEdit";
|
|
|
11
11
|
import Grid from "./table/Grid";
|
|
12
12
|
import en from "rc-master-ui/es/date-picker/locale/en_US";
|
|
13
13
|
import vi from "rc-master-ui/es/date-picker/locale/vi_VN";
|
|
14
|
+
import enDr from "rc-master-ui/es/locales/en_US";
|
|
15
|
+
import viDr from "rc-master-ui/es/locales/vi_VN";
|
|
14
16
|
// import useColumns from "./hooks/useColumns";
|
|
15
17
|
|
|
16
18
|
import "./styles.scss";
|
|
19
|
+
import 'rc-master-ui/es/date-range-picker/styles/index.less';
|
|
20
|
+
import 'rc-master-ui/assets/index.css';
|
|
17
21
|
import { flatColumns2, renderContent, renderFilter } from "./hooks/columns";
|
|
18
22
|
import Group from "./table/Group";
|
|
19
23
|
import Swal from "sweetalert2";
|
|
@@ -202,6 +206,7 @@ const InternalTable = props => {
|
|
|
202
206
|
// }, [height, id])
|
|
203
207
|
|
|
204
208
|
const local = lang && lang === 'en' ? en : vi;
|
|
209
|
+
const dateRangeLocale = lang && lang === 'en' ? enDr : viDr;
|
|
205
210
|
const buddhistLocale = {
|
|
206
211
|
...local,
|
|
207
212
|
lang: {
|
|
@@ -319,7 +324,7 @@ const InternalTable = props => {
|
|
|
319
324
|
style: {
|
|
320
325
|
marginBottom: 8
|
|
321
326
|
}
|
|
322
|
-
}, renderFilter(column, selectedKeys, setSelectedKeys, confirm, visible, searchValue, setSearchValue, propDataSourceFilter ?? [], buddhistLocale, locale, t)), /*#__PURE__*/React.createElement(Space, {
|
|
327
|
+
}, renderFilter(column, selectedKeys, setSelectedKeys, confirm, visible, searchValue, setSearchValue, propDataSourceFilter ?? [], buddhistLocale, locale, t, format, dateRangeLocale)), /*#__PURE__*/React.createElement(Space, {
|
|
323
328
|
style: {
|
|
324
329
|
justifyContent: 'end',
|
|
325
330
|
width: '100%'
|
|
@@ -705,7 +710,7 @@ const InternalTable = props => {
|
|
|
705
710
|
}
|
|
706
711
|
if (commandClick) {
|
|
707
712
|
commandClick({
|
|
708
|
-
id,
|
|
713
|
+
id: idCommand,
|
|
709
714
|
rowId: rowData.rowId,
|
|
710
715
|
rowData,
|
|
711
716
|
index,
|
|
@@ -717,7 +722,7 @@ const InternalTable = props => {
|
|
|
717
722
|
// server ~~ không làm gì
|
|
718
723
|
if (commandClick) {
|
|
719
724
|
commandClick({
|
|
720
|
-
id,
|
|
725
|
+
id: idCommand,
|
|
721
726
|
rowId: rowData.rowId,
|
|
722
727
|
rowData,
|
|
723
728
|
index,
|
|
@@ -485,7 +485,7 @@ const TableGrid = props => {
|
|
|
485
485
|
|
|
486
486
|
// const dec = (col.format?.decimalScale || col.format?.decimalScale === 0) ? col.format?.decimalScale : format?.decimalScale
|
|
487
487
|
const dec = cellFormat?.decimalScale;
|
|
488
|
-
const sumValue = col.type === 'number' ? sumDataByField(dataSource, col?.key) : 0;
|
|
488
|
+
const sumValue = col.type === 'number' ? sumDataByField(filterDataByColumns4(dataSource, filterStates), col?.key) : 0;
|
|
489
489
|
const value = !isEmpty(sumValue) ? dec || dec === 0 ? parseFloat(Number(sumValue).toFixed(dec)).toString() : sumValue.toString() : '0';
|
|
490
490
|
const cellValue = col.type === 'number' && col.isSummary !== false ? value : '';
|
|
491
491
|
const numericFormatProps = {
|
|
@@ -6,4 +6,4 @@ export declare function flatColumns<RecordType>(columns: ColumnsTable<RecordType
|
|
|
6
6
|
export declare const flatColumns2: <RecordType>(columns: ColumnsTable<RecordType>) => ColumnsTable<RecordType>;
|
|
7
7
|
export declare const getValueCell: <T>(column: ColumnTable<T>, value: any, format?: IFormat) => any;
|
|
8
8
|
export declare const renderContent: <T>(column: ColumnTable<T>, value: any, record: any, index: number, format?: IFormat) => React.JSX.Element;
|
|
9
|
-
export declare const renderFilter: <RecordType>(column: ColumnTable<RecordType>, selectedKeys: string[], setSelectedKeys: any, confirm: any, visible: boolean, searchValue: string, setSearchValue: any, dataSourceFilter: any[], buddhistLocale: any, locale?: TableLocale, t?: any, format?: IFormat) => React.JSX.Element;
|
|
9
|
+
export declare const renderFilter: <RecordType>(column: ColumnTable<RecordType>, selectedKeys: string[], setSelectedKeys: any, confirm: any, visible: boolean, searchValue: string, setSearchValue: any, dataSourceFilter: any[], buddhistLocale: any, locale?: TableLocale, t?: any, format?: IFormat, dateRangeLocale?: any) => React.JSX.Element;
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import { checkDecimalSeparator, checkThousandSeparator, convertDateToDayjs, convertDayjsToDate, getDatepickerFormat, getDateString, getTypeFilter, isColor, isEmpty } from "../utils";
|
|
1
|
+
import { checkDecimalSeparator, checkThousandSeparator, convertDateToDayjs, convertDayjsToDate, convertFormat, getDatepickerFormat, getDateString, getTypeFilter, isColor, isEmpty } from "../utils";
|
|
2
2
|
import { numericFormatter } from "react-numeric-component";
|
|
3
3
|
import dayjs from "dayjs";
|
|
4
4
|
import moment from "moment/moment";
|
|
5
5
|
import React, { Fragment } from "react";
|
|
6
|
-
import { DatePicker, Empty, Input, Select } from "rc-master-ui";
|
|
6
|
+
import { CustomProvider, DatePicker, DateRangePicker, Empty, Input, Select } from "rc-master-ui";
|
|
7
7
|
import CheckboxFilter from "../../CheckboxFilter";
|
|
8
8
|
import { SELECTION_COLUMN } from "rc-master-ui/es/table/hooks/useSelection";
|
|
9
9
|
import NumberRange from "../../number-range";
|
|
10
10
|
import NumberInput from "../../number";
|
|
11
11
|
// import {Typography} from "antd";
|
|
12
|
-
const {
|
|
13
|
-
RangePicker
|
|
14
|
-
} = DatePicker;
|
|
12
|
+
// const {RangePicker} = DatePicker
|
|
15
13
|
|
|
16
14
|
// const { Text } = Typography;
|
|
17
15
|
|
|
@@ -125,11 +123,11 @@ export const renderContent = (column, value, record, index, format) => {
|
|
|
125
123
|
field: column.field
|
|
126
124
|
}) : column.template : content);
|
|
127
125
|
};
|
|
128
|
-
export const renderFilter = (column, selectedKeys, setSelectedKeys, confirm, visible, searchValue, setSearchValue, dataSourceFilter, buddhistLocale, locale, t, format) => {
|
|
126
|
+
export const renderFilter = (column, selectedKeys, setSelectedKeys, confirm, visible, searchValue, setSearchValue, dataSourceFilter, buddhistLocale, locale, t, format, dateRangeLocale) => {
|
|
129
127
|
const cellFormat = column.format ? typeof column.format === 'function' ? column.format({}) : column.format : format;
|
|
130
128
|
const type = getTypeFilter(column);
|
|
131
129
|
const dateFormat = getDatepickerFormat(column?.typeFilter ?? column?.type, cellFormat) ?? 'DD/MM/YYYY';
|
|
132
|
-
const dateRangeFormat = getDatepickerFormat(column?.type, cellFormat) ?? 'DD/MM/YYYY';
|
|
130
|
+
const dateRangeFormat = convertFormat(getDatepickerFormat(column?.type, cellFormat) ?? 'DD/MM/YYYY');
|
|
133
131
|
const find = dataSourceFilter?.find(it => it.key === column?.field);
|
|
134
132
|
const options = find ? find.data : [];
|
|
135
133
|
switch (type) {
|
|
@@ -176,35 +174,25 @@ export const renderFilter = (column, selectedKeys, setSelectedKeys, confirm, vis
|
|
|
176
174
|
}
|
|
177
175
|
}))));
|
|
178
176
|
case 'DateRange':
|
|
179
|
-
const dateRangeValue = [selectedKeys[0] ? convertDateToDayjs(new Date(selectedKeys[0]), dateRangeFormat) : '', selectedKeys[1] ? convertDateToDayjs(new Date(selectedKeys[1]), dateRangeFormat) : '']
|
|
177
|
+
// const dateRangeValue: any = [selectedKeys[0] ? convertDateToDayjs(new Date(selectedKeys[0]), dateRangeFormat) : '', selectedKeys[1] ? convertDateToDayjs(new Date(selectedKeys[1]), dateRangeFormat) : '']
|
|
178
|
+
const dateRangeValue = selectedKeys && selectedKeys.length > 0 ? [selectedKeys[0] ? new Date(selectedKeys[0]) : '', selectedKeys[1] ? new Date(selectedKeys[1]) : ''] : null;
|
|
180
179
|
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
181
180
|
className: 'mb-1'
|
|
182
|
-
}, /*#__PURE__*/React.createElement(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
value: dateRangeValue,
|
|
190
|
-
locale: buddhistLocale
|
|
191
|
-
// placeholder={['Ngày bắt đầu', 'Ngày kết thúc']}
|
|
192
|
-
,
|
|
193
|
-
popupStyle: {
|
|
194
|
-
zIndex: 9999
|
|
181
|
+
}, /*#__PURE__*/React.createElement(CustomProvider, {
|
|
182
|
+
locale: dateRangeLocale
|
|
183
|
+
}, /*#__PURE__*/React.createElement(DateRangePicker
|
|
184
|
+
// placeholder={['Ngày bắt đầu', 'Ngày bắt đầu']}
|
|
185
|
+
, {
|
|
186
|
+
style: {
|
|
187
|
+
width: 300
|
|
195
188
|
},
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
189
|
+
format: dateRangeFormat,
|
|
190
|
+
value: dateRangeValue,
|
|
191
|
+
onChange: value => {
|
|
192
|
+
const newDateRangeValue = value ? [value[0] ? moment(value[0]).format() : '', value[1] ? moment(value[0]).format() : ''] : [];
|
|
200
193
|
setSelectedKeys(newDateRangeValue);
|
|
201
|
-
},
|
|
202
|
-
style: {
|
|
203
|
-
width: '100%'
|
|
204
194
|
}
|
|
205
|
-
|
|
206
|
-
// getPopupContainer={() => menuRef.current}
|
|
207
|
-
}))));
|
|
195
|
+
})))));
|
|
208
196
|
case 'Week':
|
|
209
197
|
const weekValue = !isEmpty(selectedKeys[0]) ? dayjs(selectedKeys[0], dateFormat) : null;
|
|
210
198
|
return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
@@ -36,7 +36,9 @@ export declare const getFormat: (colFormat?: IFormat, format?: IFormat) => {
|
|
|
36
36
|
monthFormat: string;
|
|
37
37
|
yearFormat: string;
|
|
38
38
|
};
|
|
39
|
+
export declare function convertFormat(formatStr: string): string;
|
|
39
40
|
export declare const getDatepickerFormat: (type: EditType | TypeFilter | IColumnType, format?: IFormat) => string;
|
|
41
|
+
export declare const getDateRangeFormat: (type: EditType | TypeFilter | IColumnType, format?: IFormat) => string;
|
|
40
42
|
export declare const customWeekStartEndFormat: (value: any, weekFormat: string) => string;
|
|
41
43
|
export declare const getTypeFilter: (col: ColumnTable<any>) => TypeFilter;
|
|
42
44
|
export declare const updateArrayByKey: (arr: any[], element: any, key: string) => any[];
|
|
@@ -190,12 +190,56 @@ export const getFormat = (colFormat, format) => {
|
|
|
190
190
|
yearFormat: colFormat?.yearFormat ?? format?.yearFormat
|
|
191
191
|
};
|
|
192
192
|
};
|
|
193
|
+
export function convertFormat(formatStr) {
|
|
194
|
+
// return formatStr.split('').map((char, i) => {
|
|
195
|
+
// if (char === 'D' || char === 'd') {
|
|
196
|
+
// return 'd'; // ngày: lowercase
|
|
197
|
+
// }
|
|
198
|
+
// if (char === 'Y' || char === 'y') {
|
|
199
|
+
// return 'y'; // năm: lowercase
|
|
200
|
+
// }
|
|
201
|
+
// if (char === 'M' || char === 'm') {
|
|
202
|
+
// return char; // tháng: giữ nguyên
|
|
203
|
+
// }
|
|
204
|
+
// return char; // separator
|
|
205
|
+
// }).join('');
|
|
206
|
+
|
|
207
|
+
return formatStr.split('').map(char => {
|
|
208
|
+
if (char === 'D' || char === 'd') return 'd';
|
|
209
|
+
if (char === 'Y' || char === 'y') return 'y';
|
|
210
|
+
if ('Hhmsa'.includes(char)) return char; // giờ, phút, giây, am/pm
|
|
211
|
+
if (char === 'M' || char === 'm') return char; // tháng: giữ nguyên
|
|
212
|
+
return char; // dấu phân cách
|
|
213
|
+
}).join('');
|
|
214
|
+
}
|
|
193
215
|
export const getDatepickerFormat = (type, format) => {
|
|
194
216
|
const typeFormat = type ? type.toLowerCase() : '';
|
|
195
217
|
switch (typeFormat) {
|
|
196
218
|
case "date":
|
|
197
219
|
case "daterange":
|
|
198
|
-
return format?.dateFormat ?? '
|
|
220
|
+
return format?.dateFormat ?? 'dd/MM/YYYY';
|
|
221
|
+
case "datetime":
|
|
222
|
+
return format?.datetimeFormat ?? 'dd/MM/YYYY HH:mm';
|
|
223
|
+
case "week":
|
|
224
|
+
return format?.weekFormat ?? 'dd/MM';
|
|
225
|
+
case "month":
|
|
226
|
+
return format?.monthFormat ?? 'MM/YYYY';
|
|
227
|
+
case "quarter":
|
|
228
|
+
return format?.dateFormat ?? 'dd/MM/YYYY';
|
|
229
|
+
case "year":
|
|
230
|
+
return format?.yearFormat ?? 'YYYY';
|
|
231
|
+
case "time":
|
|
232
|
+
return format?.timeFormat ?? 'HH:mm';
|
|
233
|
+
default:
|
|
234
|
+
return 'dd/MM/YYYY';
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
export const getDateRangeFormat = (type, format) => {
|
|
238
|
+
const typeFormat = type ? type.toLowerCase() : '';
|
|
239
|
+
switch (typeFormat) {
|
|
240
|
+
case "date":
|
|
241
|
+
case "daterange":
|
|
242
|
+
return convertFormat(format?.dateFormat ?? 'DD/MM/YYYY');
|
|
199
243
|
case "datetime":
|
|
200
244
|
return format?.datetimeFormat ?? 'DD/MM/YYYY HH:mm';
|
|
201
245
|
case "week":
|