@gpa-gemstone/common-pages 0.0.121 → 0.0.123

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+ // ******************************************************************************************************
3
+ // CSVPipeline.tsx - Gbtc
4
+ //
5
+ // Copyright © 2024, Grid Protection Alliance. All Rights Reserved.
6
+ //
7
+ // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
8
+ // the NOTICE file distributed with this work for additional information regarding copyright ownership.
9
+ // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
10
+ // file except in compliance with the License. You may obtain a copy of the License at:
11
+ //
12
+ // http://opensource.org/licenses/MIT
13
+ //
14
+ // Unless agreed to in writing, the subject software distributed under the License is distributed on an
15
+ // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
16
+ // License for the specific language governing permissions and limitations.
17
+ //
18
+ // Code Modification History:
19
+ // ----------------------------------------------------------------------------------------------------
20
+ // 07/24/2024 - Preston Crawford
21
+ // Generated original version of source code.
22
+ //
23
+ // ******************************************************************************************************
24
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ var desc = Object.getOwnPropertyDescriptor(m, k);
27
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
28
+ desc = { enumerable: true, get: function() { return m[k]; } };
29
+ }
30
+ Object.defineProperty(o, k2, desc);
31
+ }) : (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ o[k2] = m[k];
34
+ }));
35
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37
+ }) : function(o, v) {
38
+ o["default"] = v;
39
+ });
40
+ var __importStar = (this && this.__importStar) || function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
48
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
49
+ if (ar || !(i in from)) {
50
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
51
+ ar[i] = from[i];
52
+ }
53
+ }
54
+ return to.concat(ar || Array.prototype.slice.call(from));
55
+ };
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.useCSVPipeline = useCSVPipeline;
58
+ var React = __importStar(require("react"));
59
+ var helper_functions_1 = require("@gpa-gemstone/helper-functions");
60
+ var react_interactive_1 = require("@gpa-gemstone/react-interactive");
61
+ var react_forms_1 = require("@gpa-gemstone/react-forms");
62
+ var react_table_1 = require("@gpa-gemstone/react-table");
63
+ var gpa_symbols_1 = require("@gpa-gemstone/gpa-symbols");
64
+ var react_table_2 = require("@gpa-gemstone/react-table");
65
+ var AdditionalUploadUI = function (props) {
66
+ return (React.createElement("div", { className: 'row justify-content-center m-0' },
67
+ React.createElement("div", { className: 'col-6 p-0' },
68
+ React.createElement(react_forms_1.CheckBox, { Record: { HasHeaders: props.HasHeaders }, Field: "HasHeaders", Setter: function (record) { return props.SetHasHeaders(record.HasHeaders); }, Label: 'My Data Has Headers' }))));
69
+ };
70
+ function useCSVPipeline(csvFields) {
71
+ var _a = React.useState(false), hasHeaders = _a[0], setHasHeaders = _a[1];
72
+ return {
73
+ Select: function (mimeType, fileExt) { return mimeType.toLowerCase() === 'text/csv' || fileExt === 'csv'; },
74
+ Steps: [{ Label: 'Edit CSV', UI: CsvPipelineEditStep, AdditionalProps: { Fields: csvFields, DataHasHeaders: hasHeaders } }],
75
+ AdditionalUploadUI: React.createElement(AdditionalUploadUI, { HasHeaders: hasHeaders, SetHasHeaders: setHasHeaders })
76
+ };
77
+ }
78
+ function CsvPipelineEditStep(props) {
79
+ var _a, _b;
80
+ var rawDataRef = React.useRef();
81
+ var _c = React.useState([]), headers = _c[0], setHeaders = _c[1];
82
+ var _d = React.useState(new Map()), headerMap = _d[0], setHeaderMap = _d[1];
83
+ var _e = React.useState([]), data = _e[0], setData = _e[1];
84
+ var _f = React.useState([]), pagedData = _f[0], setPagedData = _f[1];
85
+ var _g = React.useState(true), isFileParseable = _g[0], setIsFileParseable = _g[1];
86
+ var _h = React.useState(false), isCSVMissingHeaders = _h[0], setIsCSVMissingHeaders = _h[1];
87
+ var _j = React.useState(false), isCSVMissingDataCells = _j[0], setIsCSVMissingDataCells = _j[1];
88
+ var _k = React.useState(0), page = _k[0], setPage = _k[1];
89
+ var _l = React.useState(1), totalPages = _l[0], setTotalPages = _l[1];
90
+ var _m = React.useState(true), showDataHeaderAlert = _m[0], setShowDataHeaderAlert = _m[1];
91
+ var _o = React.useState(true), showDataOrHeaderAlert = _o[0], setShowDataOrHeaderAlert = _o[1];
92
+ React.useEffect(function () {
93
+ if (data.length === 0)
94
+ return;
95
+ var pages = Math.ceil(data.length / 10);
96
+ setTotalPages(pages);
97
+ var Data = __spreadArray([], data, true);
98
+ setPagedData(Data.slice(page * 10, (page + 1) * 10));
99
+ }, [data, page]);
100
+ React.useEffect(function () {
101
+ var errors = [];
102
+ if (props.AdditionalProps == null)
103
+ return;
104
+ props.AdditionalProps.Fields.forEach(function (field) {
105
+ var _a;
106
+ var matchedHeader = (_a = Array.from(headerMap.entries()).find(function (_a) {
107
+ var value = _a[1];
108
+ return value === field.Field;
109
+ })) === null || _a === void 0 ? void 0 : _a[0];
110
+ if (matchedHeader == null) {
111
+ if (field.Required)
112
+ errors.push("".concat(field.Label, " is required and must be mapped to a header."));
113
+ return; // return early if the field was never mapped to a header
114
+ }
115
+ var fieldIndex = headers.indexOf(matchedHeader);
116
+ var uniqueValues = new Set();
117
+ //Need to also make sure that all the fields that have the Required flag got mapped to a header...
118
+ data.forEach(function (row) {
119
+ var value = row[fieldIndex + 1]; //+1 for row index value
120
+ // Check uniqueness
121
+ if (field.Unique) {
122
+ if (uniqueValues.has(value))
123
+ errors.push("All ".concat(field.Label, " values must be unique."));
124
+ else
125
+ uniqueValues.add(value);
126
+ }
127
+ // Check allowed emptiness
128
+ if (!field.AllowEmpty && (value == null || (value !== null && value !== void 0 ? value : '').trim() === ""))
129
+ errors.push("All ".concat(field.Label, " cannot be empty."));
130
+ //Check validity
131
+ if (!field.Validate(value))
132
+ errors.push("All ".concat(field.Label, " must contain valid values."));
133
+ });
134
+ });
135
+ props.SetErrors(errors);
136
+ }, [data, headers, headerMap, isFileParseable]);
137
+ React.useEffect(function () {
138
+ if (props.RawFileData == null || props.AdditionalProps == null || rawDataRef.current === props.RawFileData)
139
+ return;
140
+ var parsedData;
141
+ try {
142
+ parsedData = parseCSV(props.RawFileData, props.AdditionalProps.DataHasHeaders, props.AdditionalProps.Fields.filter(function (field) { return field.Required; }).length);
143
+ }
144
+ catch (_a) {
145
+ setIsFileParseable(false);
146
+ return;
147
+ }
148
+ setIsFileParseable(true);
149
+ setIsCSVMissingDataCells(parsedData.AddedMissingDataValues);
150
+ setIsCSVMissingHeaders(parsedData.AddedMissingHeaders);
151
+ setData(parsedData.Data);
152
+ setHeaders(parsedData.Headers);
153
+ setHeaderMap(autoMapHeaders(parsedData.Headers, props.AdditionalProps.Fields.map(function (field) { return field.Field; })));
154
+ rawDataRef.current = props.RawFileData;
155
+ }, [props.RawFileData, props.AdditionalProps]);
156
+ React.useEffect(function () {
157
+ if (props.AdditionalProps == null || props.Errors.length !== 0)
158
+ return;
159
+ var mappedData = [];
160
+ data.forEach(function (row) {
161
+ var record = {};
162
+ headers.forEach(function (header, index) {
163
+ var _a;
164
+ var mappedField = headerMap.get(header);
165
+ if (mappedField == null)
166
+ return;
167
+ var field = (_a = props.AdditionalProps) === null || _a === void 0 ? void 0 : _a.Fields.find(function (f) { return f.Field === mappedField; });
168
+ if (field == null)
169
+ return;
170
+ var value = row[index + 1];
171
+ record = field.Process(value, record);
172
+ });
173
+ mappedData.push(record);
174
+ });
175
+ props.SetData(mappedData);
176
+ }, [data, headers, headerMap, (_a = props.AdditionalProps) === null || _a === void 0 ? void 0 : _a.Fields, props.Errors]);
177
+ var getFieldSelect = React.useCallback(function (header) {
178
+ var _a;
179
+ if (props.AdditionalProps == null || ((_a = props.AdditionalProps) === null || _a === void 0 ? void 0 : _a.Fields.length) === 0)
180
+ return;
181
+ var field = headerMap.get(header);
182
+ var updateMap = function (head, val) { return setHeaderMap(new Map(headerMap).set(head, val)); };
183
+ var matchedField = props.AdditionalProps.Fields.find(function (f) { return f.Field === field; });
184
+ var help = (matchedField === null || matchedField === void 0 ? void 0 : matchedField.Help) != null ? React.createElement("p", { style: { whiteSpace: 'nowrap' } },
185
+ "=", matchedField === null || matchedField === void 0 ? void 0 :
186
+ matchedField.Help) : undefined;
187
+ return React.createElement(react_forms_1.Select, { Record: { Header: header, Value: field }, EmptyOption: true, Options: props.AdditionalProps.Fields.map(function (field) { return ({ Value: field.Field, Label: field.Label }); }), Field: "Value", Setter: function (record) { return updateMap(record.Header, record.Value); }, Label: ' ', Help: help });
188
+ }, [(_b = props.AdditionalProps) === null || _b === void 0 ? void 0 : _b.Fields, headerMap]);
189
+ var handleValueChange = function (rowIndex, colIndex, value) {
190
+ setData(function (prevData) {
191
+ var newData = __spreadArray([], prevData, true);
192
+ newData[rowIndex][colIndex] = value;
193
+ return newData;
194
+ });
195
+ };
196
+ var handleRowDelete = function (rowIndex) {
197
+ var newData = __spreadArray([], data, true);
198
+ newData.splice(rowIndex, 1);
199
+ setData(newData);
200
+ };
201
+ var getHeader = function (header) {
202
+ if (props.AdditionalProps == null)
203
+ return;
204
+ var mappedField = headerMap.get(header);
205
+ if (mappedField == null)
206
+ return header;
207
+ var matchedField = props.AdditionalProps.Fields.find(function (field) { return field.Field === mappedField; });
208
+ if (matchedField == null)
209
+ return header;
210
+ return null; //return null since the select element will have a label attached to it
211
+ };
212
+ return (React.createElement(React.Fragment, null,
213
+ React.createElement("div", { className: "container-fluid d-flex flex-column p-0 h-100" },
214
+ React.createElement("div", { className: 'row h-100' },
215
+ React.createElement("div", { className: 'col-12 d-flex flex-column h-100' }, pagedData.length !== 0 ?
216
+ React.createElement(React.Fragment, null,
217
+ isCSVMissingDataCells && isCSVMissingHeaders ? (React.createElement("div", { className: 'row' },
218
+ React.createElement("div", { className: 'col-12' },
219
+ React.createElement(react_interactive_1.Alert, { AlertColor: 'alert-info', Show: showDataHeaderAlert, SetShow: setShowDataHeaderAlert },
220
+ React.createElement("p", { style: { whiteSpace: 'nowrap' } }, "Missing data cells were added to meet the number of required fields."),
221
+ React.createElement("hr", null),
222
+ React.createElement("p", { style: { whiteSpace: 'nowrap' } }, "Missing headers were added to meet the number of required fields."))))) : isCSVMissingDataCells || isCSVMissingHeaders ? (React.createElement("div", { className: 'row' },
223
+ React.createElement("div", { className: 'col-12' },
224
+ React.createElement(react_interactive_1.Alert, { AlertColor: 'alert-info', Show: showDataOrHeaderAlert, SetShow: setShowDataOrHeaderAlert },
225
+ React.createElement("p", { style: { whiteSpace: 'nowrap' } }, isCSVMissingDataCells ? 'Missing data cells were added to meet the number of required fields.' : 'Missing headers were added to meet the number of required fields.'))))) : null,
226
+ React.createElement("div", { className: 'row flex-grow-1', style: { overflowY: 'hidden' } },
227
+ React.createElement("div", { className: 'col-12 h-100' },
228
+ React.createElement(react_table_1.ConfigurableTable, { Data: pagedData, SortKey: '', Ascending: false, OnSort: function () { }, KeySelector: function (data) { return data[0]; }, TheadStyle: { width: '100%', display: 'table-header-group', }, TbodyStyle: { width: '100%', display: 'block', height: '100%' }, RowStyle: { display: 'table-row', width: '100%', height: 'auto' }, TableStyle: { width: '100%', height: '100%', tableLayout: 'fixed', marginBottom: 0, display: 'block' }, TableClass: 'table', ModalZIndex: 9995 },
229
+ headers.map(function (header, i) {
230
+ return React.createElement(react_table_1.ConfigurableColumn, { Key: header, Label: header, Default: true },
231
+ React.createElement(react_table_1.Column, { Key: header, Field: i + 1, AllowSort: false, Content: function (_a) {
232
+ var item = _a.item, field = _a.field;
233
+ if (props.AdditionalProps == null)
234
+ return;
235
+ var mappedField = headerMap.get(header);
236
+ var matchedField = props.AdditionalProps.Fields.find(function (f) { return f.Field === mappedField; });
237
+ if (matchedField == null)
238
+ return item[field];
239
+ var value = item[field];
240
+ var isValid = matchedField.Validate(value);
241
+ var feedback = matchedField.Feedback;
242
+ var allValues = {};
243
+ headers.forEach(function (header, index) {
244
+ var mappedField = headerMap.get(header);
245
+ if (mappedField != null) {
246
+ allValues[mappedField] = item[index + 1];
247
+ }
248
+ });
249
+ return (React.createElement(matchedField.EditComponent, { Value: value, SetValue: function (val) { return handleValueChange(parseInt(item[0]), field, val); }, Valid: isValid, Feedback: feedback, AllRecordValues: allValues }));
250
+ } },
251
+ getHeader(header),
252
+ getFieldSelect(header)));
253
+ }),
254
+ React.createElement(react_table_1.Column, { Key: 'delete', Field: 0, AllowSort: false, RowStyle: { textAlign: 'right' }, Content: function (_a) {
255
+ var item = _a.item;
256
+ return (React.createElement("button", { className: 'btn', onClick: function () { return handleRowDelete(parseInt(item[0])); } },
257
+ React.createElement(gpa_symbols_1.ReactIcons.TrashCan, { Color: "red" })));
258
+ } }, '')))),
259
+ React.createElement("div", { className: 'row' },
260
+ React.createElement("div", { className: 'col-12' },
261
+ React.createElement(react_table_2.Paging, { Current: page + 1, Total: totalPages, SetPage: function (p) { return setPage(p - 1); } }))))
262
+ : null)))));
263
+ }
264
+ //Helper functions
265
+ function autoMapHeaders(headers, fields) {
266
+ if (headers.length === 0 || fields.length === 0)
267
+ return new Map();
268
+ var map = new Map();
269
+ headers.forEach(function (header) {
270
+ var match = fields.find(function (field) { return field === header; });
271
+ if (match != null)
272
+ map.set(match.toString(), match);
273
+ });
274
+ return map;
275
+ }
276
+ var parseCSV = function (csvContent, hasHeaders, numOfRequiredFields) {
277
+ var rows = (0, helper_functions_1.CsvStringToArray)(csvContent);
278
+ var headers = hasHeaders ? rows[0] : [];
279
+ var data = hasHeaders ? rows.slice(1) : rows;
280
+ data = data.map(function (row, index) { return __spreadArray([(index).toString()], row, true); }); // Add index at the beginning of row
281
+ var missingHeaders = false;
282
+ var missingData = false;
283
+ if (hasHeaders) {
284
+ // Adjust headers to match numOfRequiredFields
285
+ if (headers.length < numOfRequiredFields) {
286
+ missingHeaders = true;
287
+ while (headers.length < numOfRequiredFields) {
288
+ headers.push(String.fromCharCode(65 + headers.length)); // A, B, C, etc.
289
+ }
290
+ }
291
+ // Fix headers so no duplicates
292
+ for (var headerIndex = 0; headerIndex < headers.length; headerIndex++) {
293
+ var count = 1;
294
+ for (var index = 0; index < headerIndex; index++) {
295
+ if (headers[headerIndex] === headers[index]) {
296
+ // Change header and restart loop to look for another duplicate
297
+ headers[headerIndex] += "_".concat(count);
298
+ count++;
299
+ index = -1;
300
+ continue;
301
+ }
302
+ }
303
+ }
304
+ }
305
+ else {
306
+ var colCount = rows[0].length - 1 < numOfRequiredFields ? numOfRequiredFields : rows[0].length - 1;
307
+ missingData = rows[0].length - 1 < numOfRequiredFields;
308
+ for (var i = 0; i < colCount; i++) {
309
+ headers.push(String.fromCharCode(65 + i)); // A, B, C, etc.
310
+ }
311
+ }
312
+ if (data.some(function (d) { return d.length - 1 < numOfRequiredFields; })) {
313
+ data = data.map(function (row) {
314
+ if (row.length - 1 < numOfRequiredFields) {
315
+ missingData = true;
316
+ var missingDataVals = Array(numOfRequiredFields - (row.length - 1)).fill('');
317
+ return __spreadArray(__spreadArray([], row, true), missingDataVals, true);
318
+ }
319
+ return row;
320
+ });
321
+ }
322
+ return { Headers: headers, Data: data, AddedMissingHeaders: missingHeaders, AddedMissingDataValues: missingData };
323
+ };
package/lib/SearchBar.js CHANGED
@@ -67,7 +67,7 @@ var DefaultSearch;
67
67
  var defaultSearchcols = [
68
68
  { label: 'Key', key: 'AssetKey', type: 'string', isPivotField: false },
69
69
  { label: 'Name', key: 'Name', type: 'string', isPivotField: false },
70
- { label: 'Substation', key: 'Location', type: 'string', isPivotField: false },
70
+ { label: 'Substation Name', key: 'Location', type: 'string', isPivotField: false },
71
71
  { label: 'Make', key: 'Make', type: 'string', isPivotField: false },
72
72
  { label: 'Model', key: 'Model', type: 'string', isPivotField: false },
73
73
  { label: 'Number of Assets', key: 'MappedAssets', type: 'number', isPivotField: false },
@@ -97,9 +97,9 @@ var DefaultSearch;
97
97
  var defaultSearchcols = [
98
98
  { label: 'Name', key: 'Name', type: 'string', isPivotField: false },
99
99
  { label: 'Key', key: 'LocationKey', type: 'string', isPivotField: false },
100
- { label: 'Transmission Asset', key: 'Asset', type: 'string', isPivotField: false },
101
- { label: 'Meter', key: 'Meter', type: 'string', isPivotField: false },
102
- { label: 'Number of Transmission Assets', key: 'Assets', type: 'integer', isPivotField: false },
100
+ { label: 'Asset Key', key: 'Asset', type: 'string', isPivotField: false },
101
+ { label: 'Meter Key', key: 'Meter', type: 'string', isPivotField: false },
102
+ { label: 'Number of Assets', key: 'Assets', type: 'integer', isPivotField: false },
103
103
  { label: 'Number of Meters', key: 'Meters', type: 'integer', isPivotField: false },
104
104
  { label: 'Description', key: 'Description', type: 'string', isPivotField: false },
105
105
  ];
@@ -1,7 +1,6 @@
1
1
  import React = require("react");
2
2
  import { GenericSlice, Search } from "@gpa-gemstone/react-interactive";
3
3
  import { Application, OpenXDA, SystemCenter } from "@gpa-gemstone/application-typings";
4
- import { Column } from "@gpa-gemstone/react-table";
5
4
  interface U {
6
5
  ID: number | string;
7
6
  }
@@ -11,7 +10,6 @@ interface IProps<T extends U> {
11
10
  OnClose: (selected: T[], conf: boolean) => void;
12
11
  Show: boolean;
13
12
  Type?: 'single' | 'multiple';
14
- Columns: Column<T>[];
15
13
  Title: string;
16
14
  GetEnum: (setOptions: (options: IOptions[]) => void, field: Search.IField<T>) => () => void;
17
15
  GetAddlFields: (setAddlFields: (cols: Search.IField<T>[]) => void) => () => void;
@@ -1,4 +1,3 @@
1
- import { Column } from "@gpa-gemstone/react-table";
2
1
  import * as React from 'react';
3
2
  import { GenericSlice } from "@gpa-gemstone/react-interactive";
4
3
  interface U {
@@ -11,7 +10,6 @@ interface IProps<T extends U> {
11
10
  Show: boolean;
12
11
  Searchbar: (children: React.ReactNode) => React.ReactNode;
13
12
  Type?: 'single' | 'multiple';
14
- Columns: Column<T>[];
15
13
  Title: string;
16
14
  MinSelection?: number;
17
15
  children?: React.ReactNode;
@@ -52,12 +52,9 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
52
52
  }
53
53
  return to.concat(ar || Array.prototype.slice.call(from));
54
54
  };
55
- var __importDefault = (this && this.__importDefault) || function (mod) {
56
- return (mod && mod.__esModule) ? mod : { "default": mod };
57
- };
58
55
  Object.defineProperty(exports, "__esModule", { value: true });
59
56
  exports.default = SelectPopup;
60
- var react_table_1 = __importDefault(require("@gpa-gemstone/react-table"));
57
+ var react_table_1 = require("@gpa-gemstone/react-table");
61
58
  var React = __importStar(require("react"));
62
59
  var react_redux_1 = require("react-redux");
63
60
  var react_interactive_1 = require("@gpa-gemstone/react-interactive");
@@ -75,13 +72,12 @@ function SelectPopup(props) {
75
72
  setSelectedData(props.Selection);
76
73
  }, [props.Selection]);
77
74
  function AddCurrentList() {
78
- var updatedData;
79
- updatedData = selectedData.concat(data);
75
+ var updatedData = selectedData.concat(data);
80
76
  setSelectedData(_.uniqBy(updatedData, function (d) { return d.ID; }));
81
77
  }
82
78
  return (React.createElement(React.Fragment, null,
83
79
  React.createElement(react_interactive_1.Modal, { Show: props.Show, Title: props.Title, ShowX: true, Size: 'xlg', CallBack: function (conf) { return props.OnClose(selectedData, conf); }, DisableConfirm: props.MinSelection !== undefined && selectedData.length < props.MinSelection, ConfirmShowToolTip: props.MinSelection !== undefined && selectedData.length < props.MinSelection, ConfirmToolTipContent: React.createElement("p", null,
84
- gpa_symbols_1.CrossMark,
80
+ React.createElement(gpa_symbols_1.ReactIcons.CrossMark, null),
85
81
  " At least ",
86
82
  props.MinSelection,
87
83
  " items must be selected. ") },
@@ -96,13 +92,18 @@ function SelectPopup(props) {
96
92
  React.createElement("div", { className: "form-group" },
97
93
  React.createElement("div", { className: "btn btn-danger", onClick: function (event) { event.preventDefault(); setSelectedData([]); } }, "Remove All"))))) : null,
98
94
  React.Children.map(props.children, function (e) {
99
- if (React.isValidElement(e))
95
+ if (React.isValidElement(e)) {
96
+ if ((e.type === react_table_1.FilterableColumn) ||
97
+ (e.type === react_table_1.Column) ||
98
+ (e.type === react_table_1.ConfigurableColumn))
99
+ return null;
100
100
  return e;
101
+ }
101
102
  return null;
102
103
  }))))),
103
104
  React.createElement("div", { className: "row" },
104
105
  React.createElement("div", { className: "col", style: { width: (props.Type === undefined || props.Type === 'single' ? '100%' : '60%') } },
105
- React.createElement(react_table_1.default, { cols: props.Columns, tableClass: "table table-hover", data: data, sortKey: sortField, ascending: ascending, onSort: function (d) {
106
+ React.createElement(react_table_1.Table, { TableClass: "table table-hover", Data: data, SortKey: sortField, Ascending: ascending, OnSort: function (d) {
106
107
  if (d.colKey === "Scroll")
107
108
  return;
108
109
  if (d.colKey === sortField)
@@ -110,16 +111,16 @@ function SelectPopup(props) {
110
111
  else {
111
112
  dispatch(props.Slice.Sort({ SortField: d.colField, Ascending: true }));
112
113
  }
113
- }, onClick: function (d) {
114
+ }, OnClick: function (d) {
114
115
  if (props.Type === undefined || props.Type === 'single')
115
116
  setSelectedData([d.row]);
116
117
  else
117
118
  setSelectedData(function (s) { return __spreadArray(__spreadArray([], s.filter(function (item) { return item.ID !== d.row.ID; }), true), [d.row], false); });
118
- }, theadStyle: { fontSize: 'smaller', display: 'table', tableLayout: 'fixed', width: '100%' }, tbodyStyle: { display: 'block', overflowY: 'scroll', maxHeight: '400px', width: '100%' }, rowStyle: { fontSize: 'smaller', display: 'table', tableLayout: 'fixed', width: '100%' }, selected: function (item) { return selectedData.findIndex(function (d) { return d.ID === item.ID; }) > -1; } })),
119
+ }, Selected: function (item) { return selectedData.findIndex(function (d) { return d.ID === item.ID; }) > -1; }, KeySelector: function (item) { return item.ID; } }, props.children)),
119
120
  props.Type === 'multiple' ? React.createElement("div", { className: "col", style: { width: '40%' } },
120
121
  React.createElement("div", { style: { width: '100%' } },
121
122
  React.createElement("h3", null, " Current Selection ")),
122
- React.createElement(react_table_1.default, { cols: props.Columns, tableClass: "table table-hover", data: selectedData, sortKey: sortKeySelected, ascending: ascendingSelected, onSort: function (d) {
123
+ React.createElement(react_table_1.Table, { TableClass: "table table-hover", Data: selectedData, SortKey: sortKeySelected, Ascending: ascendingSelected, OnSort: function (d) {
123
124
  if (d.colKey === sortKeySelected) {
124
125
  var ordered = _.orderBy(selectedData, [d.colKey], [(!ascendingSelected ? "asc" : "desc")]);
125
126
  setAscendingSelected(!ascendingSelected);
@@ -131,5 +132,5 @@ function SelectPopup(props) {
131
132
  setSelectedData(ordered);
132
133
  setSortKeySelected(d.colKey);
133
134
  }
134
- }, onClick: function (d) { return setSelectedData(__spreadArray([], selectedData.filter(function (item) { return item.ID !== d.row.ID; }), true)); }, theadStyle: { fontSize: 'smaller', display: 'table', tableLayout: 'fixed', width: '100%' }, tbodyStyle: { display: 'block', overflowY: 'scroll', maxHeight: '400px', width: '100%' }, rowStyle: { fontSize: 'smaller', display: 'table', tableLayout: 'fixed', width: '100%' }, selected: function (item) { return false; } })) : null))));
135
+ }, OnClick: function (d) { return setSelectedData(__spreadArray([], selectedData.filter(function (item) { return item.ID !== d.row.ID; }), true)); }, Selected: function () { return false; }, KeySelector: function (item) { return item.ID; } }, props.children)) : null))));
135
136
  }
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ import { IStartEnd, IStartDuration, IEndDuration, ICenterDuration, TimeUnit } from './TimeWindowUtils';
3
+ import { DateUnit } from './TimeFilter/QuickSelects';
4
+ export type ITimeFilter = IStartEnd | IStartDuration | IEndDuration | ICenterDuration;
5
+ export declare function getTimeWindow(flt: ITimeFilter, format?: string): {
6
+ center: string;
7
+ start: string;
8
+ end: string;
9
+ unit: TimeUnit;
10
+ duration: number;
11
+ halfDuration: number;
12
+ };
13
+ /**
14
+ * filter: an interface of IStartEnd | IStartDuration | IEndDuration | ICenterDuration
15
+ * showQuickSelect: displays Quick Select component
16
+ * isHorizontal: displays Quick Selects in horizontal view
17
+ */
18
+ interface IProps {
19
+ filter: ITimeFilter;
20
+ setFilter: (center: string, start: string, end: string, unit: TimeUnit, duration: number) => void;
21
+ showQuickSelect: boolean;
22
+ dateTimeSetting: 'center' | 'startWindow' | 'endWindow' | 'startEnd';
23
+ timeZone: string;
24
+ isHorizontal: boolean;
25
+ format?: DateUnit;
26
+ }
27
+ declare const TimeFilter: (props: IProps) => React.JSX.Element;
28
+ export default TimeFilter;