mig-schema-table 3.0.35 → 3.0.37
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/SchemaTable/Td/index.js +18 -2
- package/dist/SchemaTable/Th/index.js +14 -6
- package/dist/SchemaTable/index.js +15 -6
- package/dist/inc/date.d.ts +2 -0
- package/dist/inc/date.js +4 -0
- package/dist/inc/string.d.ts +2 -2
- package/dist/inc/string.js +4 -1
- package/dist/types.d.ts +5 -4
- package/package.json +2 -1
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { SELECT_ALL_COLUMN_NAME } from "../constants";
|
|
4
|
+
import { localeFormatInTimeZone, timeZone } from "../../inc/date";
|
|
5
|
+
import { DEFAULT_DATE_TIME_FORMAT } from "../../inc/constant";
|
|
6
|
+
import { t } from "../../inc/string";
|
|
4
7
|
function Td({ checkedIndexes, disabledCheckedIndexes, columnIndex, data, getRowClassName, getRowSelected, onCheckedIndexesChange, onRowClick, propConfig, propName, propSchema, rowHeight, rowIndex, sortedRenderData, style, }) {
|
|
5
8
|
const onTdClick = React.useCallback((e) => {
|
|
6
9
|
if (!sortedRenderData || !onRowClick) {
|
|
@@ -18,6 +21,18 @@ function Td({ checkedIndexes, disabledCheckedIndexes, columnIndex, data, getRowC
|
|
|
18
21
|
if (!row) {
|
|
19
22
|
return undefined;
|
|
20
23
|
}
|
|
24
|
+
let title = propName === SELECT_ALL_COLUMN_NAME ? null : row[propName];
|
|
25
|
+
if (propSchema.format &&
|
|
26
|
+
propSchema.format.startsWith("date") &&
|
|
27
|
+
(propConfig === null || propConfig === void 0 ? void 0 : propConfig.showTimezones) !== false) {
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
const dateString = data[row._index][propName];
|
|
30
|
+
const date = dateString ? new Date(dateString) : undefined;
|
|
31
|
+
const alternativeTimeZone = timeZone === "Europe/Amsterdam" ? "Asia/Jakarta" : "Europe/Amsterdam";
|
|
32
|
+
if (date) {
|
|
33
|
+
title = `${localeFormatInTimeZone(date, alternativeTimeZone, DEFAULT_DATE_TIME_FORMAT)} (${t(alternativeTimeZone)})`;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
21
36
|
return {
|
|
22
37
|
"data-row-index": rowIndex,
|
|
23
38
|
"data-column-index": columnIndex,
|
|
@@ -27,7 +42,7 @@ function Td({ checkedIndexes, disabledCheckedIndexes, columnIndex, data, getRowC
|
|
|
27
42
|
className: `schema-table__td schema-table__td--${rowIndex % 2 ? "odd" : "even"}${getRowSelected && getRowSelected(data[row._index])
|
|
28
43
|
? " schema-table__td--selected"
|
|
29
44
|
: ""} ${getRowClassName ? getRowClassName(data[row._index], row._index) : ""}`,
|
|
30
|
-
title
|
|
45
|
+
title,
|
|
31
46
|
};
|
|
32
47
|
}, [
|
|
33
48
|
columnIndex,
|
|
@@ -35,8 +50,9 @@ function Td({ checkedIndexes, disabledCheckedIndexes, columnIndex, data, getRowC
|
|
|
35
50
|
getRowClassName,
|
|
36
51
|
getRowSelected,
|
|
37
52
|
onTdClick,
|
|
38
|
-
propConfig
|
|
53
|
+
propConfig,
|
|
39
54
|
propName,
|
|
55
|
+
propSchema,
|
|
40
56
|
row,
|
|
41
57
|
rowHeight,
|
|
42
58
|
rowIndex,
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import React from "react";
|
|
3
|
-
import { uncamel } from "../../inc/string";
|
|
3
|
+
import { t, uncamel } from "../../inc/string";
|
|
4
4
|
import { SELECT_ALL_COLUMN_NAME } from "../constants";
|
|
5
|
+
import { timeZone } from "../../inc/date";
|
|
5
6
|
export var EColumnFilterStatus;
|
|
6
7
|
(function (EColumnFilterStatus) {
|
|
7
8
|
EColumnFilterStatus["UNAVAILABLE"] = "UNAVAILABLE";
|
|
@@ -54,6 +55,17 @@ const Th = ({ isAllChecked, columnFilterStatus, disableColumnFilter, isSortable,
|
|
|
54
55
|
propName,
|
|
55
56
|
setPopoverConfig,
|
|
56
57
|
]);
|
|
58
|
+
const labelBody = React.useMemo(() => {
|
|
59
|
+
if ((propConfig === null || propConfig === void 0 ? void 0 : propConfig.title) !== undefined) {
|
|
60
|
+
return propConfig.title;
|
|
61
|
+
}
|
|
62
|
+
if (schema.format &&
|
|
63
|
+
schema.format.startsWith("date") &&
|
|
64
|
+
(propConfig === null || propConfig === void 0 ? void 0 : propConfig.showTimezones) !== false) {
|
|
65
|
+
return `${uncamel(propName)} (${t(timeZone)})`;
|
|
66
|
+
}
|
|
67
|
+
return uncamel(propName);
|
|
68
|
+
}, [propConfig, propName, schema.format]);
|
|
57
69
|
if (propName === SELECT_ALL_COLUMN_NAME) {
|
|
58
70
|
return (_jsx("div", Object.assign({}, thDivProps, { children: _jsx("div", Object.assign({ style: {
|
|
59
71
|
width: "100%",
|
|
@@ -76,10 +88,6 @@ const Th = ({ isAllChecked, columnFilterStatus, disableColumnFilter, isSortable,
|
|
|
76
88
|
thDivProps.className += ` text-${propConfig.align}`;
|
|
77
89
|
}
|
|
78
90
|
}
|
|
79
|
-
return (_jsxs("div", Object.assign({}, thDivProps, { children: [isSortable ? (_jsxs("button", Object.assign({ className: "px-0", disabled: (propConfig === null || propConfig === void 0 ? void 0 : propConfig.sortable) === false, onClick: onSortButtonClick }, { children: [
|
|
80
|
-
? uncamel(propName)
|
|
81
|
-
: propConfig === null || propConfig === void 0 ? void 0 : propConfig.title, sortAsc === undefined ? null : sortAsc ? "▲" : "▼"] }))) : (_jsx("div", Object.assign({ style: { lineHeight: "44px" } }, { children: (propConfig === null || propConfig === void 0 ? void 0 : propConfig.title) === undefined
|
|
82
|
-
? uncamel(propName)
|
|
83
|
-
: propConfig === null || propConfig === void 0 ? void 0 : propConfig.title }))), columnFilterStatus !== EColumnFilterStatus.UNAVAILABLE ? (_jsx("button", Object.assign({ onClick: onFilterButtonClick, "data-bs-toggle": "dropdown" }, { children: _jsx("svg", Object.assign({ viewBox: "0 0 36 36", xmlns: "http://www.w3.org/2000/svg", height: 16, width: 16, style: { display: "block" }, fill: "currentColor" }, { children: _jsx("polygon", { points: "14,30 22,25 22,17 35.999,0 17.988,0 0,0 14,17 " }) })) }))) : null] })));
|
|
91
|
+
return (_jsxs("div", Object.assign({}, thDivProps, { children: [isSortable ? (_jsxs("button", Object.assign({ className: "px-0", disabled: (propConfig === null || propConfig === void 0 ? void 0 : propConfig.sortable) === false, onClick: onSortButtonClick }, { children: [labelBody, sortAsc === undefined ? null : sortAsc ? "▲" : "▼"] }))) : (_jsx("div", Object.assign({ style: { lineHeight: "44px" } }, { children: labelBody }))), columnFilterStatus !== EColumnFilterStatus.UNAVAILABLE ? (_jsx("button", Object.assign({ onClick: onFilterButtonClick, "data-bs-toggle": "dropdown" }, { children: _jsx("svg", Object.assign({ viewBox: "0 0 36 36", xmlns: "http://www.w3.org/2000/svg", height: 16, width: 16, style: { display: "block" }, fill: "currentColor" }, { children: _jsx("polygon", { points: "14,30 22,25 22,17 35.999,0 17.988,0 0,0 14,17 " }) })) }))) : null] })));
|
|
84
92
|
};
|
|
85
93
|
export default React.memo(Th);
|
|
@@ -8,6 +8,7 @@ import { SELECT_ALL_COLUMN_NAME, SELECT_ALL_COLUMN_WIDTH } from "./constants";
|
|
|
8
8
|
import Td from "./Td";
|
|
9
9
|
import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_TIME_FORMAT } from "../inc/constant";
|
|
10
10
|
import SchemaColumnFilterPopover from "./SchemaColumnFilterPopover";
|
|
11
|
+
const startOfTheWorldDate = new Date("1000-01-01 00:00:00Z");
|
|
11
12
|
function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheckedIndexes, config, customElement, data, defaultSortAsc = false, defaultSortColumn, getRowClassName, getRowSelected, maxHeight, isSearchable, isColumnFilterable, isSortable, onCheckedIndexesChange, onRowClick, rowHeight = 36, schema, searchPlaceholder, style, width, }) {
|
|
12
13
|
const [sortColumn, setSortColumn] = React.useState(defaultSortColumn);
|
|
13
14
|
const [sortAsc, setSortAsc] = React.useState(defaultSortAsc);
|
|
@@ -250,11 +251,13 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
|
|
|
250
251
|
data[b._index][sortColumn]
|
|
251
252
|
: b[sortColumn].toLowerCase();
|
|
252
253
|
if (sortByValue && isDate) {
|
|
253
|
-
|
|
254
|
-
|
|
254
|
+
x = new Date(x);
|
|
255
|
+
if (isNaN(x)) {
|
|
256
|
+
x = startOfTheWorldDate;
|
|
255
257
|
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
+
y = new Date(y);
|
|
259
|
+
if (isNaN(y)) {
|
|
260
|
+
y = startOfTheWorldDate;
|
|
258
261
|
}
|
|
259
262
|
}
|
|
260
263
|
if (x === y) {
|
|
@@ -293,7 +296,10 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
|
|
|
293
296
|
if (columnFilterMap[propName] !== undefined) {
|
|
294
297
|
columnFilterStatus = EColumnFilterStatus.ACTIVE;
|
|
295
298
|
}
|
|
296
|
-
|
|
299
|
+
const schema = (propName === SELECT_ALL_COLUMN_NAME
|
|
300
|
+
? { type: "boolean" }
|
|
301
|
+
: properties[propName]);
|
|
302
|
+
return (_jsx(Th, { isAllChecked: isAllRowsChecked, columnFilterStatus: columnFilterStatus, disableColumnFilter: disableColumnFilter, isSortable: !!isSortable, numberOfSelectedRows: checkedIndexes === null || checkedIndexes === void 0 ? void 0 : checkedIndexes.length, onSelectAllIndexesHandler: onSelectAllIndexesHandler, propConfig: propConfig, propName: propName, schema: schema, setPopoverConfig: setPopoverConfig, setSortAsc: setSortAsc, setSortColumn: setSortColumn, sortAsc: sortColumn === propName ? sortAsc : undefined, style: style }));
|
|
297
303
|
}, [
|
|
298
304
|
checkedIndexes === null || checkedIndexes === void 0 ? void 0 : checkedIndexes.length,
|
|
299
305
|
columnFilterMap,
|
|
@@ -310,7 +316,10 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
|
|
|
310
316
|
]);
|
|
311
317
|
const SchemaTableTd = React.useCallback(({ columnIndex, rowIndex, style }) => {
|
|
312
318
|
const propName = columnNames[columnIndex];
|
|
313
|
-
|
|
319
|
+
const propSchema = (propName === SELECT_ALL_COLUMN_NAME
|
|
320
|
+
? { type: "boolean" }
|
|
321
|
+
: properties[propName]);
|
|
322
|
+
return (_jsx(Td, { checkedIndexes: checkedIndexes, disabledCheckedIndexes: disabledCheckedIndexes, columnIndex: columnIndex, data: data, getRowClassName: getRowClassName, getRowSelected: getRowSelected, onCheckedIndexesChange: onCheckedIndexesChange, onRowClick: onRowClick, propConfig: config ? config[propName] : undefined, propName: propName, propSchema: propSchema, rowHeight: rowHeight, rowIndex: rowIndex, sortedRenderData: sortedRenderData, style: style }));
|
|
314
323
|
}, [
|
|
315
324
|
checkedIndexes,
|
|
316
325
|
columnNames,
|
package/dist/inc/date.d.ts
CHANGED
package/dist/inc/date.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { format } from "date-fns";
|
|
2
|
+
import { formatInTimeZone } from "date-fns-tz";
|
|
2
3
|
import nl from "date-fns/locale/nl";
|
|
3
4
|
export const localeFormat = (date, dateFormat) => format(date, dateFormat, { locale: nl });
|
|
5
|
+
export const localeFormatInTimeZone = (date, timezone, dateFormat) => formatInTimeZone(date, timezone, dateFormat, { locale: nl });
|
|
6
|
+
// E.g. Europe/Amsterdam or Asia/Jakarta
|
|
7
|
+
export const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
package/dist/inc/string.d.ts
CHANGED
package/dist/inc/string.js
CHANGED
|
@@ -15,6 +15,9 @@ export function uncamel(camel) {
|
|
|
15
15
|
return ` ${nextIsUppercase ? letter : letter.toLowerCase()}`;
|
|
16
16
|
}));
|
|
17
17
|
}
|
|
18
|
-
export function t(key, db
|
|
18
|
+
export function t(key, db = {
|
|
19
|
+
"Europe/Amsterdam": "AMS",
|
|
20
|
+
"Asia/Jakarta": "JKT",
|
|
21
|
+
}) {
|
|
19
22
|
return db[key] || uncamel(key);
|
|
20
23
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
export interface IColumnConfig<T> {
|
|
3
3
|
align?: "start" | "center" | "end";
|
|
4
|
+
dateFormat?: string;
|
|
4
5
|
defaultSortDesc?: boolean;
|
|
5
6
|
hidden?: boolean;
|
|
6
7
|
hoverTitle?: string;
|
|
8
|
+
isFilterable?: boolean;
|
|
9
|
+
order?: number;
|
|
7
10
|
renderCell?: (rowData: T, dataIndex: number, rowIndex: number) => React.ReactElement | null;
|
|
8
11
|
renderData?: (rowData: T, dataIndex: number) => string;
|
|
12
|
+
showTimezones?: false;
|
|
9
13
|
sort?: (a: T, b: T, sortAsc: boolean) => number;
|
|
10
14
|
sortByValue?: boolean;
|
|
11
15
|
sortable?: boolean;
|
|
12
16
|
title?: string | React.ReactElement;
|
|
13
|
-
width?: number;
|
|
14
|
-
order?: number;
|
|
15
|
-
isFilterable?: boolean;
|
|
16
|
-
dateFormat?: string;
|
|
17
17
|
translation?: {
|
|
18
18
|
[keyName: string]: string;
|
|
19
19
|
};
|
|
20
|
+
width?: number;
|
|
20
21
|
}
|
|
21
22
|
export interface IRenderData {
|
|
22
23
|
_index: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mig-schema-table",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.37",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/"
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"@types/react-datepicker": "^4.11.2",
|
|
15
15
|
"@types/react-dom": "^18.2.4",
|
|
16
16
|
"date-fns": "^2.30.0",
|
|
17
|
+
"date-fns-tz": "^2.0.0",
|
|
17
18
|
"lodash": "^4.17.21",
|
|
18
19
|
"openapi3-ts": "^4.1.2",
|
|
19
20
|
"react": "^18.2.0",
|