@teselagen/ui 0.7.35 → 0.7.36
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/isBeingCalledExcessively.js +1 -0
- package/package.json +1 -1
- package/DataTable/utils/filterLocalEntitiesToHasura.d.ts +0 -5
- package/DataTable/utils/initializeHasuraWhereAndFilter.d.ts +0 -2
- package/DataTable/utils/tableQueryParamsToHasuraClauses.d.ts +0 -26
- package/src/AdvancedOptions.js +0 -33
- package/src/AdvancedOptions.spec.js +0 -26
- package/src/AssignDefaultsModeContext.js +0 -22
- package/src/AsyncValidateFieldSpinner/index.js +0 -12
- package/src/BlueprintError/index.js +0 -14
- package/src/BounceLoader/index.js +0 -16
- package/src/BounceLoader/style.css +0 -45
- package/src/CollapsibleCard/index.js +0 -68
- package/src/CollapsibleCard/style.css +0 -23
- package/src/DNALoader/index.js +0 -20
- package/src/DNALoader/style.css +0 -251
- package/src/DataTable/CellDragHandle.js +0 -132
- package/src/DataTable/ColumnFilterMenu.js +0 -62
- package/src/DataTable/Columns.js +0 -979
- package/src/DataTable/DisabledLoadingComponent.js +0 -15
- package/src/DataTable/DisplayOptions.js +0 -199
- package/src/DataTable/DropdownCell.js +0 -61
- package/src/DataTable/EditableCell.js +0 -44
- package/src/DataTable/FilterAndSortMenu.js +0 -388
- package/src/DataTable/PagingTool.js +0 -225
- package/src/DataTable/RenderCell.js +0 -191
- package/src/DataTable/SearchBar.js +0 -69
- package/src/DataTable/SortableColumns.js +0 -100
- package/src/DataTable/TableFormTrackerContext.js +0 -10
- package/src/DataTable/ThComponent.js +0 -44
- package/src/DataTable/dataTableEnhancer.js +0 -41
- package/src/DataTable/defaultFormatters.js +0 -32
- package/src/DataTable/defaultValidators.js +0 -40
- package/src/DataTable/editCellHelper.js +0 -44
- package/src/DataTable/getCellVal.js +0 -20
- package/src/DataTable/getVals.js +0 -8
- package/src/DataTable/index.js +0 -3209
- package/src/DataTable/isTruthy.js +0 -12
- package/src/DataTable/isValueEmpty.js +0 -3
- package/src/DataTable/style.css +0 -608
- package/src/DataTable/utils/convertSchema.js +0 -69
- package/src/DataTable/utils/filterLocalEntitiesToHasura.js +0 -236
- package/src/DataTable/utils/filterLocalEntitiesToHasura.test.js +0 -587
- package/src/DataTable/utils/formatPasteData.js +0 -16
- package/src/DataTable/utils/getAllRows.js +0 -11
- package/src/DataTable/utils/getCellCopyText.js +0 -7
- package/src/DataTable/utils/getCellInfo.js +0 -36
- package/src/DataTable/utils/getFieldPathToField.js +0 -7
- package/src/DataTable/utils/getIdOrCodeOrIndex.js +0 -9
- package/src/DataTable/utils/getLastSelectedEntity.js +0 -11
- package/src/DataTable/utils/getNewEntToSelect.js +0 -25
- package/src/DataTable/utils/getRowCopyText.js +0 -28
- package/src/DataTable/utils/getTableConfigFromStorage.js +0 -5
- package/src/DataTable/utils/handleCopyColumn.js +0 -21
- package/src/DataTable/utils/handleCopyHelper.js +0 -15
- package/src/DataTable/utils/handleCopyRows.js +0 -23
- package/src/DataTable/utils/handleCopyTable.js +0 -16
- package/src/DataTable/utils/index.js +0 -55
- package/src/DataTable/utils/initializeHasuraWhereAndFilter.js +0 -26
- package/src/DataTable/utils/isBottomRightCornerOfRectangle.js +0 -20
- package/src/DataTable/utils/isEntityClean.js +0 -15
- package/src/DataTable/utils/primarySelectedValue.js +0 -1
- package/src/DataTable/utils/queryParams.js +0 -350
- package/src/DataTable/utils/removeCleanRows.js +0 -22
- package/src/DataTable/utils/rowClick.js +0 -181
- package/src/DataTable/utils/selection.js +0 -8
- package/src/DataTable/utils/tableQueryParamsToHasuraClauses.js +0 -253
- package/src/DataTable/utils/tableQueryParamsToHasuraClauses.test.js +0 -206
- package/src/DataTable/utils/useTableEntities.js +0 -38
- package/src/DataTable/utils/utils.js +0 -37
- package/src/DataTable/utils/withSelectedEntities.js +0 -65
- package/src/DataTable/utils/withTableParams.js +0 -288
- package/src/DataTable/validateTableWideErrors.js +0 -160
- package/src/DataTable/viewColumn.js +0 -97
- package/src/DialogFooter/index.js +0 -86
- package/src/DialogFooter/style.css +0 -9
- package/src/DropdownButton.js +0 -36
- package/src/FillWindow.css +0 -6
- package/src/FillWindow.js +0 -69
- package/src/FormComponents/FormSeparator.js +0 -9
- package/src/FormComponents/LoadingDots.js +0 -14
- package/src/FormComponents/Uploader.js +0 -1278
- package/src/FormComponents/getNewName.js +0 -31
- package/src/FormComponents/index.js +0 -1266
- package/src/FormComponents/itemUpload.js +0 -84
- package/src/FormComponents/sortify.js +0 -73
- package/src/FormComponents/style.css +0 -275
- package/src/FormComponents/tryToMatchSchemas.js +0 -264
- package/src/FormComponents/utils.js +0 -6
- package/src/HotkeysDialog/index.js +0 -79
- package/src/HotkeysDialog/style.css +0 -54
- package/src/InfoHelper/index.js +0 -78
- package/src/InfoHelper/style.css +0 -7
- package/src/IntentText/index.js +0 -18
- package/src/Loading/index.js +0 -70
- package/src/Loading/style.css +0 -4
- package/src/MatchHeaders.js +0 -234
- package/src/MenuBar/index.js +0 -423
- package/src/MenuBar/style.css +0 -45
- package/src/PromptUnsavedChanges/index.js +0 -38
- package/src/ResizableDraggableDialog/index.js +0 -141
- package/src/ResizableDraggableDialog/style.css +0 -42
- package/src/ScrollToTop/index.js +0 -72
- package/src/SimpleStepViz.js +0 -22
- package/src/Tag.js +0 -112
- package/src/TagSelect/index.js +0 -69
- package/src/TagSelect/style.css +0 -13
- package/src/TgHtmlSelect/index.js +0 -20
- package/src/TgSelect/index.js +0 -537
- package/src/TgSelect/style.css +0 -61
- package/src/TgSuggest/index.js +0 -124
- package/src/Timeline/TimelineEvent.js +0 -31
- package/src/Timeline/index.js +0 -15
- package/src/Timeline/style.css +0 -29
- package/src/UploadCsvWizard.css +0 -4
- package/src/UploadCsvWizard.js +0 -719
- package/src/autoTooltip.js +0 -201
- package/src/constants.js +0 -1
- package/src/customIcons.js +0 -361
- package/src/enhancers/withDialog/index.js +0 -196
- package/src/enhancers/withDialog/tg_modalState.js +0 -47
- package/src/enhancers/withField.js +0 -20
- package/src/enhancers/withFields.js +0 -11
- package/src/enhancers/withLocalStorage.js +0 -11
- package/src/index.js +0 -88
- package/src/rerenderOnWindowResize.js +0 -26
- package/src/showAppSpinner.js +0 -12
- package/src/showConfirmationDialog/index.js +0 -148
- package/src/showDialogOnDocBody.js +0 -33
- package/src/style.css +0 -265
- package/src/throwFormError.js +0 -16
- package/src/toastr.js +0 -148
- package/src/typeToCommonType.js +0 -6
- package/src/useDialog.js +0 -63
- package/src/utils/adHoc.js +0 -10
- package/src/utils/basicHandleActionsWithFullState.js +0 -14
- package/src/utils/browserUtils.js +0 -3
- package/src/utils/combineReducersWithFullState.js +0 -14
- package/src/utils/commandControls.js +0 -82
- package/src/utils/commandUtils.js +0 -112
- package/src/utils/determineBlackOrWhiteTextColor.js +0 -4
- package/src/utils/getDayjsFormatter.js +0 -35
- package/src/utils/getTextFromEl.js +0 -28
- package/src/utils/handlerHelpers.js +0 -24
- package/src/utils/hooks/index.js +0 -1
- package/src/utils/hooks/useDeepEqualMemo.js +0 -15
- package/src/utils/hooks/useStableReference.js +0 -9
- package/src/utils/hotkeyUtils.js +0 -131
- package/src/utils/isBeingCalledExcessively.js +0 -24
- package/src/utils/menuUtils.js +0 -433
- package/src/utils/popoverOverflowModifiers.js +0 -11
- package/src/utils/pureNoFunc.js +0 -31
- package/src/utils/renderOnDoc.js +0 -32
- package/src/utils/showProgressToast.js +0 -22
- package/src/utils/tagUtils.js +0 -45
- package/src/utils/tgFormValues.js +0 -35
- package/src/utils/useTraceUpdate.js +0 -19
- package/src/utils/withSelectTableRecords.js +0 -43
- package/src/utils/withStore.js +0 -10
- package/src/wrapDialog.js +0 -116
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export const getNewEntToSelect = ({
|
|
2
|
-
type,
|
|
3
|
-
lastSelectedIndex,
|
|
4
|
-
entities,
|
|
5
|
-
isEntityDisabled
|
|
6
|
-
}) => {
|
|
7
|
-
let newIndexToSelect;
|
|
8
|
-
if (type === "up") {
|
|
9
|
-
newIndexToSelect = lastSelectedIndex - 1;
|
|
10
|
-
} else {
|
|
11
|
-
newIndexToSelect = lastSelectedIndex + 1;
|
|
12
|
-
}
|
|
13
|
-
const newEntToSelect = entities[newIndexToSelect];
|
|
14
|
-
if (!newEntToSelect) return;
|
|
15
|
-
if (isEntityDisabled && isEntityDisabled(newEntToSelect)) {
|
|
16
|
-
return getNewEntToSelect({
|
|
17
|
-
type,
|
|
18
|
-
lastSelectedIndex: newIndexToSelect,
|
|
19
|
-
entities,
|
|
20
|
-
isEntityDisabled
|
|
21
|
-
});
|
|
22
|
-
} else {
|
|
23
|
-
return newEntToSelect;
|
|
24
|
-
}
|
|
25
|
-
};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { getCellCopyText } from "./getCellCopyText";
|
|
2
|
-
import { flatMap } from "lodash-es";
|
|
3
|
-
|
|
4
|
-
export const getRowCopyText = (rowEl, { specificColumn } = {}) => {
|
|
5
|
-
//takes in a row element
|
|
6
|
-
if (!rowEl) return [];
|
|
7
|
-
const textContent = [];
|
|
8
|
-
const jsonText = [];
|
|
9
|
-
|
|
10
|
-
for (const cellEl of rowEl.children) {
|
|
11
|
-
const cellChild = cellEl.querySelector(`[data-copy-text]`);
|
|
12
|
-
if (!cellChild) {
|
|
13
|
-
if (specificColumn) continue; //strip it
|
|
14
|
-
continue; //just leave it blank
|
|
15
|
-
}
|
|
16
|
-
if (
|
|
17
|
-
specificColumn &&
|
|
18
|
-
cellChild.getAttribute("data-test") !== specificColumn
|
|
19
|
-
) {
|
|
20
|
-
continue;
|
|
21
|
-
}
|
|
22
|
-
const [t, j] = getCellCopyText(cellChild);
|
|
23
|
-
textContent.push(t);
|
|
24
|
-
jsonText.push(j);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return [flatMap(textContent).join("\t"), jsonText];
|
|
28
|
-
};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { getAllRows } from "./getAllRows";
|
|
2
|
-
import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
|
|
3
|
-
import { handleCopyRows } from "./handleCopyRows";
|
|
4
|
-
|
|
5
|
-
export const handleCopyColumn = (e, cellWrapper, selectedRecords) => {
|
|
6
|
-
const specificColumn = cellWrapper.getAttribute("data-test");
|
|
7
|
-
let rowElsToCopy = getAllRows(e);
|
|
8
|
-
if (!rowElsToCopy) return;
|
|
9
|
-
if (selectedRecords) {
|
|
10
|
-
const ids = selectedRecords.map(e => getIdOrCodeOrIndex(e)?.toString());
|
|
11
|
-
rowElsToCopy = Array.from(rowElsToCopy).filter(rowEl => {
|
|
12
|
-
const id = rowEl.closest(".rt-tr-group")?.getAttribute("data-test-id");
|
|
13
|
-
return id !== undefined && ids.includes(id);
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
if (!rowElsToCopy) return;
|
|
17
|
-
handleCopyRows(rowElsToCopy, {
|
|
18
|
-
specificColumn,
|
|
19
|
-
onFinishMsg: "Column Copied"
|
|
20
|
-
});
|
|
21
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import copy from "copy-to-clipboard";
|
|
2
|
-
|
|
3
|
-
export const handleCopyHelper = (stringToCopy, jsonToCopy, message) => {
|
|
4
|
-
!window.Cypress &&
|
|
5
|
-
copy(stringToCopy, {
|
|
6
|
-
onCopy: clipboardData => {
|
|
7
|
-
clipboardData.setData("application/json", JSON.stringify(jsonToCopy));
|
|
8
|
-
},
|
|
9
|
-
// keep this so that pasting into spreadsheets works.
|
|
10
|
-
format: "text/plain"
|
|
11
|
-
});
|
|
12
|
-
if (message) {
|
|
13
|
-
window.toastr.success(message);
|
|
14
|
-
}
|
|
15
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import download from "downloadjs";
|
|
2
|
-
import { getRowCopyText } from "./getRowCopyText";
|
|
3
|
-
import { handleCopyHelper } from "./handleCopyHelper";
|
|
4
|
-
|
|
5
|
-
export const handleCopyRows = (
|
|
6
|
-
rowElsToCopy,
|
|
7
|
-
{ specificColumn, onFinishMsg, isDownload } = {}
|
|
8
|
-
) => {
|
|
9
|
-
let textToCopy = [];
|
|
10
|
-
const jsonToCopy = [];
|
|
11
|
-
rowElsToCopy.forEach(rowEl => {
|
|
12
|
-
const [t, j] = getRowCopyText(rowEl, { specificColumn });
|
|
13
|
-
textToCopy.push(t);
|
|
14
|
-
jsonToCopy.push(j);
|
|
15
|
-
});
|
|
16
|
-
textToCopy = textToCopy.filter(text => text).join("\n");
|
|
17
|
-
if (!textToCopy) return window.toastr.warning("No text to copy");
|
|
18
|
-
if (isDownload) {
|
|
19
|
-
download(textToCopy.replaceAll("\t", ","), "tableData.csv", "text/csv");
|
|
20
|
-
} else {
|
|
21
|
-
handleCopyHelper(textToCopy, jsonToCopy, onFinishMsg || "Row Copied");
|
|
22
|
-
}
|
|
23
|
-
};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { getAllRows } from "./getAllRows";
|
|
2
|
-
import { handleCopyRows } from "./handleCopyRows";
|
|
3
|
-
|
|
4
|
-
export const handleCopyTable = (e, opts) => {
|
|
5
|
-
try {
|
|
6
|
-
const allRowEls = getAllRows(e);
|
|
7
|
-
if (!allRowEls) return;
|
|
8
|
-
handleCopyRows(allRowEls, {
|
|
9
|
-
...opts,
|
|
10
|
-
onFinishMsg: "Table Copied"
|
|
11
|
-
});
|
|
12
|
-
} catch (error) {
|
|
13
|
-
console.error(`error:`, error);
|
|
14
|
-
window.toastr.error("Error copying rows.");
|
|
15
|
-
}
|
|
16
|
-
};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { isEntityClean } from "./isEntityClean";
|
|
2
|
-
import { getSelectedRowsFromEntities } from "./selection";
|
|
3
|
-
import { removeCleanRows } from "./removeCleanRows";
|
|
4
|
-
import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
|
|
5
|
-
import { getRecordsFromIdMap } from "./withSelectedEntities";
|
|
6
|
-
import { formatPasteData } from "./formatPasteData";
|
|
7
|
-
import { getFieldPathToField } from "./getFieldPathToField";
|
|
8
|
-
import {
|
|
9
|
-
defaultParsePaste,
|
|
10
|
-
getEntityIdToEntity,
|
|
11
|
-
getFieldPathToIndex,
|
|
12
|
-
getNumberStrAtEnd,
|
|
13
|
-
stripNumberAtEnd
|
|
14
|
-
} from "./utils";
|
|
15
|
-
import { getAllRows } from "./getAllRows";
|
|
16
|
-
import { getNewEntToSelect } from "./getNewEntToSelect";
|
|
17
|
-
import { getLastSelectedEntity } from "./getLastSelectedEntity";
|
|
18
|
-
import { getCellInfo } from "./getCellInfo";
|
|
19
|
-
import { getCellCopyText } from "./getCellCopyText";
|
|
20
|
-
import { getRowCopyText } from "./getRowCopyText";
|
|
21
|
-
import { handleCopyHelper } from "./handleCopyHelper";
|
|
22
|
-
import { handleCopyRows } from "./handleCopyRows";
|
|
23
|
-
import { handleCopyColumn } from "./handleCopyColumn";
|
|
24
|
-
import { isBottomRightCornerOfRectangle } from "./isBottomRightCornerOfRectangle";
|
|
25
|
-
import { handleCopyTable } from "./handleCopyTable";
|
|
26
|
-
import { PRIMARY_SELECTED_VAL } from "./primarySelectedValue";
|
|
27
|
-
import { useTableEntities } from "./useTableEntities";
|
|
28
|
-
|
|
29
|
-
export {
|
|
30
|
-
defaultParsePaste,
|
|
31
|
-
formatPasteData,
|
|
32
|
-
getAllRows,
|
|
33
|
-
getCellCopyText,
|
|
34
|
-
getCellInfo,
|
|
35
|
-
getEntityIdToEntity,
|
|
36
|
-
getFieldPathToIndex,
|
|
37
|
-
getFieldPathToField,
|
|
38
|
-
getIdOrCodeOrIndex,
|
|
39
|
-
getLastSelectedEntity,
|
|
40
|
-
getNewEntToSelect,
|
|
41
|
-
getNumberStrAtEnd,
|
|
42
|
-
getRecordsFromIdMap,
|
|
43
|
-
getRowCopyText,
|
|
44
|
-
getSelectedRowsFromEntities,
|
|
45
|
-
handleCopyColumn,
|
|
46
|
-
handleCopyHelper,
|
|
47
|
-
handleCopyRows,
|
|
48
|
-
handleCopyTable,
|
|
49
|
-
isBottomRightCornerOfRectangle,
|
|
50
|
-
isEntityClean,
|
|
51
|
-
PRIMARY_SELECTED_VAL,
|
|
52
|
-
removeCleanRows,
|
|
53
|
-
stripNumberAtEnd,
|
|
54
|
-
useTableEntities
|
|
55
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export function initializeHasuraWhereAndFilter(
|
|
2
|
-
additionalFilter,
|
|
3
|
-
where = {},
|
|
4
|
-
currentParams
|
|
5
|
-
) {
|
|
6
|
-
where._and = where._and || [];
|
|
7
|
-
where._or = where._or || [];
|
|
8
|
-
if (typeof additionalFilter === "function") {
|
|
9
|
-
const newWhere = additionalFilter(where, currentParams);
|
|
10
|
-
if (newWhere) {
|
|
11
|
-
where = {
|
|
12
|
-
...where,
|
|
13
|
-
...newWhere
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
} else if (typeof additionalFilter === "object")
|
|
17
|
-
where._and.push(additionalFilter);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export const addCustomColumnFilters = (where, fields, currentParams) => {
|
|
21
|
-
fields.forEach(field => {
|
|
22
|
-
const { customColumnFilter, filterDisabled } = field;
|
|
23
|
-
if (filterDisabled || !customColumnFilter) return;
|
|
24
|
-
customColumnFilter(where, currentParams);
|
|
25
|
-
});
|
|
26
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export const isBottomRightCornerOfRectangle = ({
|
|
2
|
-
cellId,
|
|
3
|
-
selectionGrid,
|
|
4
|
-
lastRowIndex,
|
|
5
|
-
lastCellIndex,
|
|
6
|
-
entityMap,
|
|
7
|
-
pathToIndex
|
|
8
|
-
}) => {
|
|
9
|
-
selectionGrid.forEach(row => {
|
|
10
|
-
// remove undefineds from start of row
|
|
11
|
-
while (row[0] === undefined && row.length) row.shift();
|
|
12
|
-
});
|
|
13
|
-
const [rowId, cellPath] = cellId.split(":");
|
|
14
|
-
const ent = entityMap[rowId];
|
|
15
|
-
if (!ent) return;
|
|
16
|
-
const { i } = ent;
|
|
17
|
-
const cellIndex = pathToIndex[cellPath];
|
|
18
|
-
const isBottomRight = i === lastRowIndex && cellIndex === lastCellIndex;
|
|
19
|
-
return isBottomRight;
|
|
20
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export function isEntityClean(e) {
|
|
2
|
-
if (typeof e !== "object" || e === null) {
|
|
3
|
-
return true; // or return false depending on what you want for non-object inputs
|
|
4
|
-
}
|
|
5
|
-
let isClean = true;
|
|
6
|
-
for (const [key, val] of Object.entries(e)) {
|
|
7
|
-
if (key === "id") continue;
|
|
8
|
-
if (key === "_isClean") continue;
|
|
9
|
-
if (val) {
|
|
10
|
-
isClean = false;
|
|
11
|
-
break;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return isClean;
|
|
15
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const PRIMARY_SELECTED_VAL = "main_cell";
|
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
import queryString from "qs";
|
|
2
|
-
import { uniqBy, clone, camelCase } from "lodash-es";
|
|
3
|
-
import {
|
|
4
|
-
getFieldsMappedByCCDisplayName,
|
|
5
|
-
tableQueryParamsToHasuraClauses
|
|
6
|
-
} from "./tableQueryParamsToHasuraClauses";
|
|
7
|
-
import { filterLocalEntitiesToHasura } from "./filterLocalEntitiesToHasura";
|
|
8
|
-
import {
|
|
9
|
-
addCustomColumnFilters,
|
|
10
|
-
initializeHasuraWhereAndFilter
|
|
11
|
-
} from "./initializeHasuraWhereAndFilter";
|
|
12
|
-
|
|
13
|
-
const defaultPageSizes = [5, 10, 15, 25, 50, 100, 200, 400];
|
|
14
|
-
|
|
15
|
-
export { defaultPageSizes };
|
|
16
|
-
|
|
17
|
-
export function getMergedOpts(topLevel = {}, instanceLevel = {}) {
|
|
18
|
-
const merged = {
|
|
19
|
-
...topLevel,
|
|
20
|
-
...instanceLevel
|
|
21
|
-
};
|
|
22
|
-
return {
|
|
23
|
-
formName: "tgDataTable",
|
|
24
|
-
...merged,
|
|
25
|
-
pageSize: merged.controlled_pageSize || merged.pageSize,
|
|
26
|
-
defaults: {
|
|
27
|
-
pageSize: merged.controlled_pageSize || 25,
|
|
28
|
-
order: [], //[-name, statusCode] //an array of camelCase display names with - sign to denote reverse
|
|
29
|
-
searchTerm: "",
|
|
30
|
-
page: 1,
|
|
31
|
-
filters: [
|
|
32
|
-
//filters look like this:
|
|
33
|
-
// {
|
|
34
|
-
// selectedFilter: 'textContains', //camel case
|
|
35
|
-
// filterOn: ccDisplayName, //camel case display name if available and string, otherwise path
|
|
36
|
-
// filterValue: 'thomas',
|
|
37
|
-
// }
|
|
38
|
-
],
|
|
39
|
-
...(topLevel.defaults || {}),
|
|
40
|
-
...(instanceLevel.defaults || {})
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function safeStringify(val) {
|
|
46
|
-
if (val !== null && typeof val === "object") {
|
|
47
|
-
return JSON.stringify(val);
|
|
48
|
-
}
|
|
49
|
-
return val;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function safeParse(val) {
|
|
53
|
-
try {
|
|
54
|
-
return JSON.parse(val);
|
|
55
|
-
} catch (e) {
|
|
56
|
-
return val;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function getCurrentParamsFromUrl(location, isSimple) {
|
|
61
|
-
let { search } = location;
|
|
62
|
-
if (isSimple) {
|
|
63
|
-
search = window.location.href.split("?")[1] || "";
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return parseFilters(queryString.parse(search, { ignoreQueryPrefix: true }));
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export function setCurrentParamsOnUrl(newParams, replace, isSimple) {
|
|
70
|
-
const stringifiedFilters = stringifyFilters(newParams);
|
|
71
|
-
const search = `?${queryString.stringify(stringifiedFilters)}`;
|
|
72
|
-
if (isSimple) {
|
|
73
|
-
return window.location.replace(
|
|
74
|
-
`${window.location.href.split("?")[0]}${search}`
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
replace({
|
|
78
|
-
search
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function stringifyFilters(newParams) {
|
|
83
|
-
let filters;
|
|
84
|
-
if (newParams.filters && newParams.filters.length) {
|
|
85
|
-
filters = newParams.filters.reduce(
|
|
86
|
-
(acc, { filterOn, selectedFilter, filterValue }, index) => {
|
|
87
|
-
acc +=
|
|
88
|
-
(index > 0 ? "::" : "") +
|
|
89
|
-
`${filterOn}__${camelCase(selectedFilter)}__${safeStringify(
|
|
90
|
-
Array.isArray(filterValue) ? filterValue.join(";") : filterValue
|
|
91
|
-
)}`;
|
|
92
|
-
return acc;
|
|
93
|
-
},
|
|
94
|
-
""
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
let order;
|
|
98
|
-
if (newParams.order && newParams.order.length) {
|
|
99
|
-
order = newParams.order.reduce((acc, order, index) => {
|
|
100
|
-
acc += (index > 0 ? "___" : "") + order;
|
|
101
|
-
return acc;
|
|
102
|
-
}, "");
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
...newParams,
|
|
106
|
-
filters,
|
|
107
|
-
order
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
function parseFilters(newParams) {
|
|
111
|
-
return {
|
|
112
|
-
...newParams,
|
|
113
|
-
order: newParams.order && newParams.order.split("___"),
|
|
114
|
-
filters:
|
|
115
|
-
newParams.filters &&
|
|
116
|
-
newParams.filters.split("::").map(filter => {
|
|
117
|
-
const splitFilter = filter.split("__");
|
|
118
|
-
const [filterOn, selectedFilter, filterValue] = splitFilter;
|
|
119
|
-
const parseFilterValue = filterValue => {
|
|
120
|
-
if (selectedFilter === "inList" || selectedFilter === "notInList") {
|
|
121
|
-
return filterValue.split(";");
|
|
122
|
-
}
|
|
123
|
-
if (
|
|
124
|
-
selectedFilter === "inRange" ||
|
|
125
|
-
selectedFilter === "outsideRange"
|
|
126
|
-
) {
|
|
127
|
-
return filterValue.split(";").map(Number);
|
|
128
|
-
}
|
|
129
|
-
return safeParse(filterValue);
|
|
130
|
-
};
|
|
131
|
-
return {
|
|
132
|
-
filterOn,
|
|
133
|
-
selectedFilter,
|
|
134
|
-
filterValue: parseFilterValue(filterValue)
|
|
135
|
-
};
|
|
136
|
-
})
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export function makeDataTableHandlers({
|
|
141
|
-
setNewParams,
|
|
142
|
-
defaults,
|
|
143
|
-
onlyOneFilter
|
|
144
|
-
}) {
|
|
145
|
-
//all of these actions have currentParams bound to them as their last arg in withTableParams
|
|
146
|
-
const setSearchTerm = searchTerm => {
|
|
147
|
-
setNewParams(prev => ({
|
|
148
|
-
...(prev ?? {}),
|
|
149
|
-
page: undefined, //set page undefined to return the table to page 1
|
|
150
|
-
searchTerm: searchTerm === defaults.searchTerm ? undefined : searchTerm
|
|
151
|
-
}));
|
|
152
|
-
onlyOneFilter && clearFilters();
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
const addFilters = newFilters => {
|
|
156
|
-
if (!newFilters) return;
|
|
157
|
-
setNewParams(prev => {
|
|
158
|
-
const filters = uniqBy(
|
|
159
|
-
[...newFilters, ...(onlyOneFilter ? [] : prev?.filters || [])],
|
|
160
|
-
"filterOn"
|
|
161
|
-
);
|
|
162
|
-
return {
|
|
163
|
-
...(prev ?? {}),
|
|
164
|
-
page: undefined, //set page undefined to return the table to page 1
|
|
165
|
-
filters
|
|
166
|
-
};
|
|
167
|
-
});
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
const removeSingleFilter = filterOn =>
|
|
171
|
-
setNewParams(prev => {
|
|
172
|
-
const filters = prev?.filters
|
|
173
|
-
? prev.filters.filter(filter => {
|
|
174
|
-
return filter.filterOn !== filterOn;
|
|
175
|
-
})
|
|
176
|
-
: undefined;
|
|
177
|
-
return { ...(prev ?? {}), filters };
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
const clearFilters = (additionalFilterKeys = []) => {
|
|
181
|
-
const toClear = {
|
|
182
|
-
filters: undefined,
|
|
183
|
-
searchTerm: undefined,
|
|
184
|
-
tags: undefined
|
|
185
|
-
};
|
|
186
|
-
additionalFilterKeys.forEach(key => {
|
|
187
|
-
toClear[key] = undefined;
|
|
188
|
-
});
|
|
189
|
-
setNewParams(toClear);
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
const setPageSize = pageSize =>
|
|
193
|
-
setNewParams(prev => ({
|
|
194
|
-
...(prev ?? {}),
|
|
195
|
-
pageSize: pageSize === defaults.pageSize ? undefined : pageSize,
|
|
196
|
-
page: undefined //set page undefined to return the table to page 1
|
|
197
|
-
}));
|
|
198
|
-
|
|
199
|
-
const setOrder = (order, isRemove, shiftHeld) =>
|
|
200
|
-
setNewParams(prev => {
|
|
201
|
-
let newOrder = [];
|
|
202
|
-
if (shiftHeld) {
|
|
203
|
-
//first remove the old order
|
|
204
|
-
newOrder = [...(prev?.order || [])].filter(value => {
|
|
205
|
-
const shouldRemove =
|
|
206
|
-
value.replace(/^-/, "") === order.replace(/^-/, "");
|
|
207
|
-
return !shouldRemove;
|
|
208
|
-
});
|
|
209
|
-
//then, if we are adding, pop the order onto the array
|
|
210
|
-
if (!isRemove) {
|
|
211
|
-
newOrder.push(order);
|
|
212
|
-
}
|
|
213
|
-
} else {
|
|
214
|
-
if (isRemove) {
|
|
215
|
-
newOrder = [];
|
|
216
|
-
} else {
|
|
217
|
-
newOrder = [order];
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
return {
|
|
221
|
-
...(prev ?? {}),
|
|
222
|
-
order: newOrder
|
|
223
|
-
};
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
const setPage = page => {
|
|
227
|
-
setNewParams(prev => ({
|
|
228
|
-
...(prev ?? {}),
|
|
229
|
-
page: page === defaults.page ? undefined : page
|
|
230
|
-
}));
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
return {
|
|
234
|
-
setSearchTerm,
|
|
235
|
-
addFilters,
|
|
236
|
-
clearFilters,
|
|
237
|
-
removeSingleFilter,
|
|
238
|
-
setPageSize,
|
|
239
|
-
setPage,
|
|
240
|
-
setOrder,
|
|
241
|
-
setNewParams
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export function getQueryParams({
|
|
246
|
-
currentParams,
|
|
247
|
-
// urlConnected,
|
|
248
|
-
defaults,
|
|
249
|
-
schema,
|
|
250
|
-
isInfinite,
|
|
251
|
-
entities,
|
|
252
|
-
isLocalCall,
|
|
253
|
-
additionalFilter,
|
|
254
|
-
doNotCoercePageSize,
|
|
255
|
-
noOrderError,
|
|
256
|
-
// isCodeModel,
|
|
257
|
-
ownProps
|
|
258
|
-
}) {
|
|
259
|
-
Object.keys(currentParams).forEach(function (key) {
|
|
260
|
-
if (currentParams[key] === undefined) {
|
|
261
|
-
delete currentParams[key]; //we want to use the default value if any of these are undefined
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
const tableQueryParams = {
|
|
265
|
-
...defaults,
|
|
266
|
-
...currentParams
|
|
267
|
-
};
|
|
268
|
-
let { page, pageSize, searchTerm, filters, order } = tableQueryParams;
|
|
269
|
-
if (page <= 0 || isNaN(page)) {
|
|
270
|
-
page = undefined;
|
|
271
|
-
}
|
|
272
|
-
if (isInfinite) {
|
|
273
|
-
page = undefined;
|
|
274
|
-
pageSize = undefined;
|
|
275
|
-
}
|
|
276
|
-
if (pageSize !== undefined && !doNotCoercePageSize) {
|
|
277
|
-
//pageSize might come in as an unexpected number so we coerce it to be one of the nums in our pageSizes array
|
|
278
|
-
const closest = clone(window.tgPageSizes || defaultPageSizes).sort(
|
|
279
|
-
(a, b) => Math.abs(pageSize - a) - Math.abs(pageSize - b)
|
|
280
|
-
)[0];
|
|
281
|
-
pageSize = closest;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
const cleanedOrder = [];
|
|
285
|
-
if (order && order.length) {
|
|
286
|
-
const ccFields = getFieldsMappedByCCDisplayName(schema);
|
|
287
|
-
order.forEach(orderVal => {
|
|
288
|
-
const ccDisplayName = orderVal.replace(/^-/gi, "");
|
|
289
|
-
const schemaForField = ccFields[ccDisplayName];
|
|
290
|
-
if (schemaForField) {
|
|
291
|
-
const { path } = schemaForField;
|
|
292
|
-
const reversed = ccDisplayName !== orderVal;
|
|
293
|
-
const prefix = reversed ? "-" : "";
|
|
294
|
-
cleanedOrder.push(prefix + path);
|
|
295
|
-
} else {
|
|
296
|
-
!noOrderError &&
|
|
297
|
-
console.error(
|
|
298
|
-
"No schema for field found!",
|
|
299
|
-
ccDisplayName,
|
|
300
|
-
JSON.stringify(schema.fields, null, 2)
|
|
301
|
-
);
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
let toRet = {
|
|
307
|
-
//these are values that might be generally useful for the wrapped component
|
|
308
|
-
page,
|
|
309
|
-
pageSize: ownProps.controlled_pageSize || pageSize,
|
|
310
|
-
order: cleanedOrder,
|
|
311
|
-
filters,
|
|
312
|
-
searchTerm
|
|
313
|
-
};
|
|
314
|
-
|
|
315
|
-
const { where, order_by, limit, offset } = tableQueryParamsToHasuraClauses({
|
|
316
|
-
page,
|
|
317
|
-
pageSize,
|
|
318
|
-
searchTerm,
|
|
319
|
-
filters,
|
|
320
|
-
order: cleanedOrder,
|
|
321
|
-
schema
|
|
322
|
-
});
|
|
323
|
-
initializeHasuraWhereAndFilter(additionalFilter, where, currentParams);
|
|
324
|
-
addCustomColumnFilters(where, schema.fields, currentParams);
|
|
325
|
-
if (isLocalCall) {
|
|
326
|
-
//if the table is local (aka not directly connected to a db) then we need to
|
|
327
|
-
//handle filtering/paging/sorting all on the front end
|
|
328
|
-
toRet = {
|
|
329
|
-
...toRet,
|
|
330
|
-
...filterLocalEntitiesToHasura(entities, {
|
|
331
|
-
where,
|
|
332
|
-
order_by,
|
|
333
|
-
limit,
|
|
334
|
-
offset,
|
|
335
|
-
isInfinite
|
|
336
|
-
})
|
|
337
|
-
};
|
|
338
|
-
return toRet;
|
|
339
|
-
} else {
|
|
340
|
-
return {
|
|
341
|
-
...toRet,
|
|
342
|
-
variables: {
|
|
343
|
-
where,
|
|
344
|
-
order_by,
|
|
345
|
-
limit,
|
|
346
|
-
offset
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { isEntityClean } from "./isEntityClean";
|
|
2
|
-
import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
|
|
3
|
-
|
|
4
|
-
export const removeCleanRows = (entities, cellValidation) => {
|
|
5
|
-
const toFilterOut = {};
|
|
6
|
-
const entsToUse = (entities || []).filter(e => {
|
|
7
|
-
if (!(e._isClean || isEntityClean(e))) return true;
|
|
8
|
-
else {
|
|
9
|
-
toFilterOut[getIdOrCodeOrIndex(e)] = true;
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
const validationToUse = {};
|
|
15
|
-
Object.entries(cellValidation || {}).forEach(([k, v]) => {
|
|
16
|
-
const [rowId] = k.split(":");
|
|
17
|
-
if (!toFilterOut[rowId]) {
|
|
18
|
-
validationToUse[k] = v;
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
return { entsToUse, validationToUse };
|
|
22
|
-
};
|