25.34,
+ normal: () => 33.34,
+ comfortable: () => 41.34
+};
+
+function getCellInfo({
+ columnIndex,
+ columnPath,
+ rowId,
+ schema,
+ entities,
+ rowIndex,
+ isEntityDisabled,
+ entity
+}) {
+ const leftpath = schema.fields[columnIndex - 1]?.path;
+ const rightpath = schema.fields[columnIndex + 1]?.path;
+ const cellIdToLeft = leftpath && `${rowId}:${leftpath}`;
+ const cellIdToRight = rightpath && `${rowId}:${rightpath}`;
+ const rowAboveId =
+ entities[rowIndex - 1] &&
+ getIdOrCodeOrIndex(entities[rowIndex - 1], rowIndex - 1);
+ const rowBelowId =
+ entities[rowIndex + 1] &&
+ getIdOrCodeOrIndex(entities[rowIndex + 1], rowIndex + 1);
+ const cellIdAbove = rowAboveId && `${rowAboveId}:${columnPath}`;
+ const cellIdBelow = rowBelowId && `${rowBelowId}:${columnPath}`;
+
+ const cellId = `${rowId}:${columnPath}`;
+ const rowDisabled = isEntityDisabled(entity);
+ return {
+ cellId,
+ cellIdAbove,
+ cellIdToRight,
+ cellIdBelow,
+ cellIdToLeft,
+ rowDisabled
+ };
+}
+
+function ColumnFilterMenu({
+ FilterMenu,
+ filterActiveForColumn,
+ compact,
+ extraCompact,
+ ...rest
+}) {
+ const [columnFilterMenuOpen, setColumnFilterMenuOpen] = useState(false);
+ return (
+
{
+ setColumnFilterMenuOpen(false);
+ }}
+ isOpen={columnFilterMenuOpen}
+ modifiers={{
+ preventOverflow: { enabled: true },
+ hide: { enabled: false },
+ flip: { enabled: false }
+ }}
+ >
+ {
+ setColumnFilterMenuOpen(!columnFilterMenuOpen);
+ }}
+ className={classNames("tg-filter-menu-button", {
+ "tg-active-filter": !!filterActiveForColumn
+ })}
+ />
+ {
+ setColumnFilterMenuOpen(false);
+ }}
+ {...rest}
+ />
+
+ );
+}
+
+function getLastSelectedEntity(idMap) {
+ let lastSelectedEnt;
+ let latestTime;
+ forEach(idMap, ({ time, entity }) => {
+ if (!latestTime || time > latestTime) {
+ lastSelectedEnt = entity;
+ latestTime = time;
+ }
+ });
+ return lastSelectedEnt;
+}
+
+function getNewEntToSelect({
+ type,
+ lastSelectedIndex,
+ entities,
+ isEntityDisabled
+}) {
+ let newIndexToSelect;
+ if (type === "up") {
+ newIndexToSelect = lastSelectedIndex - 1;
+ } else {
+ newIndexToSelect = lastSelectedIndex + 1;
+ }
+ const newEntToSelect = entities[newIndexToSelect];
+ if (!newEntToSelect) return;
+ if (isEntityDisabled && isEntityDisabled(newEntToSelect)) {
+ return getNewEntToSelect({
+ type,
+ lastSelectedIndex: newIndexToSelect,
+ entities,
+ isEntityDisabled
+ });
+ } else {
+ return newEntToSelect;
+ }
+}
+
+function getAllRows(e) {
+ const el = e.target.querySelector(".data-table-container")
+ ? e.target.querySelector(".data-table-container")
+ : e.target.closest(".data-table-container");
+
+ const allRowEls = el.querySelectorAll(".rt-tr");
+ if (!allRowEls || !allRowEls.length) {
+ return;
+ }
+ return allRowEls;
+}
+
+function EditableCell({
+ shouldSelectAll,
+ stopSelectAll,
+ initialValue,
+ finishEdit,
+ cancelEdit,
+ isNumeric,
+ dataTest
+}) {
+ const [v, setV] = useState(initialValue);
+ return (
+
{
+ if (shouldSelectAll && r) {
+ r?.select();
+ stopSelectAll();
+ }
+ }}
+ {...dataTest}
+ type={isNumeric ? "number" : undefined}
+ value={v}
+ autoFocus
+ onKeyDown={e => {
+ if (e.key === "Enter") {
+ finishEdit(v);
+ e.stopPropagation();
+ } else if (e.key === "Escape") {
+ e.stopPropagation();
+ cancelEdit();
+ }
+ }}
+ onBlur={() => {
+ finishEdit(v);
+ }}
+ onChange={e => {
+ setV(e.target.value);
+ }}
+ >
+ );
+}
+
+function DropdownCell({
+ options,
+ isMulti,
+ initialValue,
+ finishEdit,
+ cancelEdit,
+ dataTest
+}) {
+ const [v, setV] = useState(
+ isMulti
+ ? initialValue.split(",").map(v => ({ value: v, label: v }))
+ : initialValue
+ );
+ return (
+
+ {
+ if (isMulti) {
+ setV(val);
+ return;
+ }
+ finishEdit(val ? val.value : null);
+ }}
+ {...dataTest}
+ popoverProps={{
+ onClose: e => {
+ if (isMulti) {
+ if (e && e.key === "Escape") {
+ cancelEdit();
+ } else {
+ finishEdit(
+ v && v.map
+ ? v
+ .map(v => v.value)
+ .filter(v => v)
+ .join(",")
+ : v
+ );
+ }
+ } else {
+ cancelEdit();
+ }
+ }
+ }}
+ options={options.map(value => ({ label: value, value }))}
+ >
+
+ );
+}
+
+function getFieldPathToIndex(schema) {
+ const fieldToIndex = {};
+ schema.fields.forEach((f, i) => {
+ fieldToIndex[f.path] = i;
+ });
+ return fieldToIndex;
+}
+
+function getFieldPathToField(schema) {
+ const fieldPathToField = {};
+ schema.fields.forEach(f => {
+ fieldPathToField[f.path] = f;
+ });
+ return fieldPathToField;
+}
+
+const defaultParsePaste = str => {
+ return str.split(/\r\n|\n|\r/).map(row => row.split("\t"));
+};
+
+function getEntityIdToEntity(entities) {
+ const entityIdToEntity = {};
+ entities.forEach((e, i) => {
+ entityIdToEntity[getIdOrCodeOrIndex(e, i)] = { e, i };
+ });
+ return entityIdToEntity;
+}
+
+function endsWithNumber(str) {
+ return /[0-9]+$/.test(str);
+}
+
+function getNumberStrAtEnd(str) {
+ if (endsWithNumber(str)) {
+ return str.match(/[0-9]+$/)[0];
+ }
+
+ return null;
+}
+
+function stripNumberAtEnd(str) {
+ return str?.replace?.(getNumberStrAtEnd(str), "");
+}
+
+export function isEntityClean(e) {
+ let isClean = true;
+ some(e, (val, key) => {
+ if (key === "id") return;
+ if (key === "_isClean") return;
+ if (val) {
+ isClean = false;
+ return true;
+ }
+ });
+ return isClean;
+}
+
+const formatPasteData = ({ schema, newVal, path }) => {
+ const pathToField = getFieldPathToField(schema);
+ const column = pathToField[path];
+ if (column.type === "genericSelect") {
+ if (newVal?.__genSelCol === path) {
+ newVal = newVal.__strVal;
+ } else {
+ newVal = undefined;
+ }
+ } else {
+ newVal = Object.hasOwn(newVal, "__strVal") ? newVal.__strVal : newVal;
+ }
+ return newVal;
+};
+
+export function removeCleanRows(reduxFormEntities, reduxFormCellValidation) {
+ const toFilterOut = {};
+ const entsToUse = (reduxFormEntities || []).filter(e => {
+ if (!(e._isClean || isEntityClean(e))) return true;
+ else {
+ toFilterOut[getIdOrCodeOrIndex(e)] = true;
+ return false;
+ }
+ });
+
+ const validationToUse = {};
+ forEach(reduxFormCellValidation, (v, k) => {
+ const [rowId] = k.split(":");
+ if (!toFilterOut[rowId]) {
+ validationToUse[k] = v;
+ }
+ });
+ return { entsToUse, validationToUse };
+}
diff --git a/packages/ui/src/DataTable/utils/formatPasteData.js b/packages/ui/src/DataTable/utils/formatPasteData.js
deleted file mode 100644
index cde19517..00000000
--- a/packages/ui/src/DataTable/utils/formatPasteData.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import { getFieldPathToField } from "./getFieldPathToField";
-
-export const formatPasteData = ({ schema, newVal, path }) => {
- const pathToField = getFieldPathToField(schema);
- const column = pathToField[path];
- if (column.type === "genericSelect") {
- if (newVal?.__genSelCol === path) {
- newVal = newVal.__strVal;
- } else {
- newVal = undefined;
- }
- } else {
- newVal = Object.hasOwn(newVal, "__strVal") ? newVal.__strVal : newVal;
- }
- return newVal;
-};
diff --git a/packages/ui/src/DataTable/utils/getAllRows.js b/packages/ui/src/DataTable/utils/getAllRows.js
deleted file mode 100644
index 64c200f1..00000000
--- a/packages/ui/src/DataTable/utils/getAllRows.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export const getAllRows = e => {
- const el = e.target.querySelector(".data-table-container")
- ? e.target.querySelector(".data-table-container")
- : e.target.closest(".data-table-container");
-
- const allRowEls = el.querySelectorAll(".rt-tr");
- if (!allRowEls || !allRowEls.length) {
- return;
- }
- return allRowEls;
-};
diff --git a/packages/ui/src/DataTable/utils/getCellCopyText.js b/packages/ui/src/DataTable/utils/getCellCopyText.js
deleted file mode 100644
index 7fca4538..00000000
--- a/packages/ui/src/DataTable/utils/getCellCopyText.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export const getCellCopyText = cellWrapper => {
- const text = cellWrapper && cellWrapper.getAttribute("data-copy-text");
- const jsonText = cellWrapper && cellWrapper.getAttribute("data-copy-json");
-
- const textContent = text || cellWrapper.textContent || "";
- return [textContent, jsonText];
-};
diff --git a/packages/ui/src/DataTable/utils/getCellInfo.js b/packages/ui/src/DataTable/utils/getCellInfo.js
deleted file mode 100644
index d863c727..00000000
--- a/packages/ui/src/DataTable/utils/getCellInfo.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
-
-export const getCellInfo = ({
- columnIndex,
- columnPath,
- rowId,
- schema,
- entities,
- rowIndex,
- isEntityDisabled,
- entity
-}) => {
- const leftpath = schema.fields[columnIndex - 1]?.path;
- const rightpath = schema.fields[columnIndex + 1]?.path;
- const cellIdToLeft = leftpath && `${rowId}:${leftpath}`;
- const cellIdToRight = rightpath && `${rowId}:${rightpath}`;
- const rowAboveId =
- entities[rowIndex - 1] &&
- getIdOrCodeOrIndex(entities[rowIndex - 1], rowIndex - 1);
- const rowBelowId =
- entities[rowIndex + 1] &&
- getIdOrCodeOrIndex(entities[rowIndex + 1], rowIndex + 1);
- const cellIdAbove = rowAboveId && `${rowAboveId}:${columnPath}`;
- const cellIdBelow = rowBelowId && `${rowBelowId}:${columnPath}`;
-
- const cellId = `${rowId}:${columnPath}`;
- const rowDisabled = isEntityDisabled(entity);
- return {
- cellId,
- cellIdAbove,
- cellIdToRight,
- cellIdBelow,
- cellIdToLeft,
- rowDisabled
- };
-};
diff --git a/packages/ui/src/DataTable/utils/getFieldPathToField.js b/packages/ui/src/DataTable/utils/getFieldPathToField.js
deleted file mode 100644
index 52b4fe33..00000000
--- a/packages/ui/src/DataTable/utils/getFieldPathToField.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export const getFieldPathToField = schema => {
- const fieldPathToField = {};
- schema.fields.forEach(f => {
- fieldPathToField[f.path] = f;
- });
- return fieldPathToField;
-};
diff --git a/packages/ui/src/DataTable/utils/getIdOrCodeOrIndex.js b/packages/ui/src/DataTable/utils/getIdOrCodeOrIndex.js
index 2a210198..bcbf17c1 100644
--- a/packages/ui/src/DataTable/utils/getIdOrCodeOrIndex.js
+++ b/packages/ui/src/DataTable/utils/getIdOrCodeOrIndex.js
@@ -1,4 +1,4 @@
-export const getIdOrCodeOrIndex = (record, rowIndex) => {
+export default (record, rowIndex) => {
if (record.id || record.id === 0) {
return record.id;
} else if (record.code) {
diff --git a/packages/ui/src/DataTable/utils/getLastSelectedEntity.js b/packages/ui/src/DataTable/utils/getLastSelectedEntity.js
deleted file mode 100644
index ecfbae5b..00000000
--- a/packages/ui/src/DataTable/utils/getLastSelectedEntity.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export const getLastSelectedEntity = idMap => {
- let lastSelectedEnt;
- let latestTime;
- Object.values(idMap).forEach(({ time, entity }) => {
- if (!latestTime || time > latestTime) {
- lastSelectedEnt = entity;
- latestTime = time;
- }
- });
- return lastSelectedEnt;
-};
diff --git a/packages/ui/src/DataTable/utils/getNewEntToSelect.js b/packages/ui/src/DataTable/utils/getNewEntToSelect.js
deleted file mode 100644
index a7d47155..00000000
--- a/packages/ui/src/DataTable/utils/getNewEntToSelect.js
+++ /dev/null
@@ -1,25 +0,0 @@
-export const getNewEntToSelect = ({
- type,
- lastSelectedIndex,
- entities,
- isEntityDisabled
-}) => {
- let newIndexToSelect;
- if (type === "up") {
- newIndexToSelect = lastSelectedIndex - 1;
- } else {
- newIndexToSelect = lastSelectedIndex + 1;
- }
- const newEntToSelect = entities[newIndexToSelect];
- if (!newEntToSelect) return;
- if (isEntityDisabled && isEntityDisabled(newEntToSelect)) {
- return getNewEntToSelect({
- type,
- lastSelectedIndex: newIndexToSelect,
- entities,
- isEntityDisabled
- });
- } else {
- return newEntToSelect;
- }
-};
diff --git a/packages/ui/src/DataTable/utils/getRowCopyText.js b/packages/ui/src/DataTable/utils/getRowCopyText.js
deleted file mode 100644
index c706bd63..00000000
--- a/packages/ui/src/DataTable/utils/getRowCopyText.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import { getCellCopyText } from "./getCellCopyText";
-import { flatMap } from "lodash-es";
-
-export const getRowCopyText = (rowEl, { specificColumn } = {}) => {
- //takes in a row element
- if (!rowEl) return [];
- const textContent = [];
- const jsonText = [];
-
- for (const cellEl of rowEl.children) {
- const cellChild = cellEl.querySelector(`[data-copy-text]`);
- if (!cellChild) {
- if (specificColumn) continue; //strip it
- continue; //just leave it blank
- }
- if (
- specificColumn &&
- cellChild.getAttribute("data-test") !== specificColumn
- ) {
- continue;
- }
- const [t, j] = getCellCopyText(cellChild);
- textContent.push(t);
- jsonText.push(j);
- }
-
- return [flatMap(textContent).join("\t"), jsonText];
-};
diff --git a/packages/ui/src/DataTable/utils/handleCopyColumn.js b/packages/ui/src/DataTable/utils/handleCopyColumn.js
deleted file mode 100644
index 4aa04870..00000000
--- a/packages/ui/src/DataTable/utils/handleCopyColumn.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import { getAllRows } from "./getAllRows";
-import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
-import { handleCopyRows } from "./handleCopyRows";
-
-export const handleCopyColumn = (e, cellWrapper, selectedRecords) => {
- const specificColumn = cellWrapper.getAttribute("data-test");
- let rowElsToCopy = getAllRows(e);
- if (!rowElsToCopy) return;
- if (selectedRecords) {
- const ids = selectedRecords.map(e => getIdOrCodeOrIndex(e)?.toString());
- rowElsToCopy = Array.from(rowElsToCopy).filter(rowEl => {
- const id = rowEl.closest(".rt-tr-group")?.getAttribute("data-test-id");
- return id !== undefined && ids.includes(id);
- });
- }
- if (!rowElsToCopy) return;
- handleCopyRows(rowElsToCopy, {
- specificColumn,
- onFinishMsg: "Column Copied"
- });
-};
diff --git a/packages/ui/src/DataTable/utils/handleCopyHelper.js b/packages/ui/src/DataTable/utils/handleCopyHelper.js
deleted file mode 100644
index 9d603e99..00000000
--- a/packages/ui/src/DataTable/utils/handleCopyHelper.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import copy from "copy-to-clipboard";
-
-export const handleCopyHelper = (stringToCopy, jsonToCopy, message) => {
- !window.Cypress &&
- copy(stringToCopy, {
- onCopy: clipboardData => {
- clipboardData.setData("application/json", JSON.stringify(jsonToCopy));
- },
- // keep this so that pasting into spreadsheets works.
- format: "text/plain"
- });
- if (message) {
- window.toastr.success(message);
- }
-};
diff --git a/packages/ui/src/DataTable/utils/handleCopyRows.js b/packages/ui/src/DataTable/utils/handleCopyRows.js
deleted file mode 100644
index 197cbabc..00000000
--- a/packages/ui/src/DataTable/utils/handleCopyRows.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import download from "downloadjs";
-import { getRowCopyText } from "./getRowCopyText";
-import { handleCopyHelper } from "./handleCopyHelper";
-
-export const handleCopyRows = (
- rowElsToCopy,
- { specificColumn, onFinishMsg, isDownload } = {}
-) => {
- let textToCopy = [];
- const jsonToCopy = [];
- rowElsToCopy.forEach(rowEl => {
- const [t, j] = getRowCopyText(rowEl, { specificColumn });
- textToCopy.push(t);
- jsonToCopy.push(j);
- });
- textToCopy = textToCopy.filter(text => text).join("\n");
- if (!textToCopy) return window.toastr.warning("No text to copy");
- if (isDownload) {
- download(textToCopy.replaceAll("\t", ","), "tableData.csv", "text/csv");
- } else {
- handleCopyHelper(textToCopy, jsonToCopy, onFinishMsg || "Row Copied");
- }
-};
diff --git a/packages/ui/src/DataTable/utils/index.js b/packages/ui/src/DataTable/utils/index.js
deleted file mode 100644
index 2d85f6cb..00000000
--- a/packages/ui/src/DataTable/utils/index.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import { isEntityClean } from "./isEntityClean";
-import { getSelectedRowsFromEntities } from "./selection";
-import { removeCleanRows } from "./removeCleanRows";
-import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
-import computePresets from "./computePresets";
-import { getRecordsFromIdMap } from "./withSelectedEntities";
-import { formatPasteData } from "./formatPasteData";
-import { getFieldPathToField } from "./getFieldPathToField";
-import {
- defaultParsePaste,
- getEntityIdToEntity,
- getFieldPathToIndex,
- getNumberStrAtEnd,
- stripNumberAtEnd
-} from "./utils";
-import { getAllRows } from "./getAllRows";
-import { getNewEntToSelect } from "./getNewEntToSelect";
-import { getLastSelectedEntity } from "./getLastSelectedEntity";
-import { getCellInfo } from "./getCellInfo";
-import { getCellCopyText } from "./getCellCopyText";
-import { getRowCopyText } from "./getRowCopyText";
-import { handleCopyHelper } from "./handleCopyHelper";
-import { handleCopyRows } from "./handleCopyRows";
-import { handleCopyColumn } from "./handleCopyColumn";
-import { isBottomRightCornerOfRectangle } from "./isBottomRightCornerOfRectangle";
-
-export {
- computePresets,
- defaultParsePaste,
- formatPasteData,
- getAllRows,
- getCellCopyText,
- getCellInfo,
- getEntityIdToEntity,
- getFieldPathToIndex,
- getFieldPathToField,
- getIdOrCodeOrIndex,
- getLastSelectedEntity,
- getNewEntToSelect,
- getNumberStrAtEnd,
- getRecordsFromIdMap,
- getRowCopyText,
- getSelectedRowsFromEntities,
- handleCopyColumn,
- handleCopyHelper,
- handleCopyRows,
- isBottomRightCornerOfRectangle,
- isEntityClean,
- removeCleanRows,
- stripNumberAtEnd
-};
diff --git a/packages/ui/src/DataTable/utils/isBottomRightCornerOfRectangle.js b/packages/ui/src/DataTable/utils/isBottomRightCornerOfRectangle.js
deleted file mode 100644
index 271e26ed..00000000
--- a/packages/ui/src/DataTable/utils/isBottomRightCornerOfRectangle.js
+++ /dev/null
@@ -1,20 +0,0 @@
-export const isBottomRightCornerOfRectangle = ({
- cellId,
- selectionGrid,
- lastRowIndex,
- lastCellIndex,
- entityMap,
- pathToIndex
-}) => {
- selectionGrid.forEach(row => {
- // remove undefineds from start of row
- while (row[0] === undefined && row.length) row.shift();
- });
- const [rowId, cellPath] = cellId.split(":");
- const ent = entityMap[rowId];
- if (!ent) return;
- const { i } = ent;
- const cellIndex = pathToIndex[cellPath];
- const isBottomRight = i === lastRowIndex && cellIndex === lastCellIndex;
- return isBottomRight;
-};
diff --git a/packages/ui/src/DataTable/utils/isEntityClean.js b/packages/ui/src/DataTable/utils/isEntityClean.js
deleted file mode 100644
index f9d507d4..00000000
--- a/packages/ui/src/DataTable/utils/isEntityClean.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export function isEntityClean(e) {
- if (typeof e !== "object" || e === null) {
- return true; // or return false depending on what you want for non-object inputs
- }
- let isClean = true;
- for (const [key, val] of Object.entries(e)) {
- if (key === "id") continue;
- if (key === "_isClean") continue;
- if (val) {
- isClean = false;
- break;
- }
- }
- return isClean;
-}
diff --git a/packages/ui/src/DataTable/utils/removeCleanRows.js b/packages/ui/src/DataTable/utils/removeCleanRows.js
deleted file mode 100644
index 5958166a..00000000
--- a/packages/ui/src/DataTable/utils/removeCleanRows.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import { isEntityClean } from "./isEntityClean";
-import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
-
-export const removeCleanRows = (reduxFormEntities, reduxFormCellValidation) => {
- const toFilterOut = {};
- const entsToUse = (reduxFormEntities || []).filter(e => {
- if (!(e._isClean || isEntityClean(e))) return true;
- else {
- toFilterOut[getIdOrCodeOrIndex(e)] = true;
- return false;
- }
- });
-
- const validationToUse = {};
- Object.entries(reduxFormCellValidation || {}).forEach(([k, v]) => {
- const [rowId] = k.split(":");
- if (!toFilterOut[rowId]) {
- validationToUse[k] = v;
- }
- });
- return { entsToUse, validationToUse };
-};
diff --git a/packages/ui/src/DataTable/utils/rowClick.js b/packages/ui/src/DataTable/utils/rowClick.js
index e4ee123a..190d3cdb 100644
--- a/packages/ui/src/DataTable/utils/rowClick.js
+++ b/packages/ui/src/DataTable/utils/rowClick.js
@@ -1,6 +1,6 @@
import { isEmpty, forEach, range } from "lodash-es";
import { getSelectedRowsFromEntities } from "./selection";
-import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
+import getIdOrCodeOrIndex from "./getIdOrCodeOrIndex";
import { getRecordsFromIdMap } from "./withSelectedEntities";
export default function rowClick(e, rowInfo, entities, props) {
@@ -124,10 +124,8 @@ export function changeSelectedEntities({ idMap, entities = [], change }) {
change("reduxFormSelectedEntityIdMap", newIdMap);
}
-export function finalizeSelection({
- idMap,
- entities,
- props: {
+export function finalizeSelection({ idMap, entities, props }) {
+ const {
onDeselect,
onSingleRowSelect,
onMultiRowSelect,
@@ -135,8 +133,7 @@ export function finalizeSelection({
onRowSelect,
noSelect,
change
- }
-}) {
+ } = props;
if (noSelect) return;
if (
noDeselectAll &&
diff --git a/packages/ui/src/DataTable/utils/selection.js b/packages/ui/src/DataTable/utils/selection.js
index 39757606..ea4a08d8 100644
--- a/packages/ui/src/DataTable/utils/selection.js
+++ b/packages/ui/src/DataTable/utils/selection.js
@@ -1,4 +1,4 @@
-import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
+import getIdOrCodeOrIndex from "./getIdOrCodeOrIndex";
export const getSelectedRowsFromEntities = (entities, idMap) => {
if (!idMap) return [];
diff --git a/packages/ui/src/DataTable/utils/utils.js b/packages/ui/src/DataTable/utils/utils.js
deleted file mode 100644
index fe7b4d1c..00000000
--- a/packages/ui/src/DataTable/utils/utils.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import { getIdOrCodeOrIndex } from "./getIdOrCodeOrIndex";
-
-export const getFieldPathToIndex = schema => {
- const fieldToIndex = {};
- schema.fields.forEach((f, i) => {
- fieldToIndex[f.path] = i;
- });
- return fieldToIndex;
-};
-
-export const defaultParsePaste = str => {
- return str.split(/\r\n|\n|\r/).map(row => row.split("\t"));
-};
-
-export const getEntityIdToEntity = entities => {
- const entityIdToEntity = {};
- entities.forEach((e, i) => {
- entityIdToEntity[getIdOrCodeOrIndex(e, i)] = { e, i };
- });
- return entityIdToEntity;
-};
-
-const endsWithNumber = str => {
- return /[0-9]+$/.test(str);
-};
-
-export const getNumberStrAtEnd = str => {
- if (endsWithNumber(str)) {
- return str.match(/[0-9]+$/)[0];
- }
-
- return null;
-};
-
-export const stripNumberAtEnd = str => {
- return str?.replace?.(getNumberStrAtEnd(str), "");
-};
diff --git a/packages/ui/src/DataTable/validateTableWideErrors.js b/packages/ui/src/DataTable/validateTableWideErrors.js
index c29a36b2..11c2eb93 100644
--- a/packages/ui/src/DataTable/validateTableWideErrors.js
+++ b/packages/ui/src/DataTable/validateTableWideErrors.js
@@ -1,4 +1,4 @@
-import { getIdOrCodeOrIndex } from "./utils";
+import getIdOrCodeOrIndex from "./utils/getIdOrCodeOrIndex";
import { getCellVal } from "./getCellVal";
import { forEach, isArray } from "lodash-es";
import { startCase } from "lodash-es";
diff --git a/packages/ui/src/FillWindow.js b/packages/ui/src/FillWindow.js
index c333c342..ab25adc5 100644
--- a/packages/ui/src/FillWindow.js
+++ b/packages/ui/src/FillWindow.js
@@ -1,5 +1,6 @@
-import React, { createPortal } from "react";
+import React from "react";
import { isFunction } from "lodash-es";
+import reactDom from "react-dom";
import rerenderOnWindowResize from "./rerenderOnWindowResize";
import "./FillWindow.css";
@@ -62,7 +63,7 @@ export default class FillWindow extends React.Component {
: this.props.children}
);
- if (asPortal) return createPortal(inner, window.document.body);
+ if (asPortal) return reactDom.createPortal(inner, window.document.body);
return inner;
}
}
diff --git a/packages/ui/src/FormComponents/Uploader.js b/packages/ui/src/FormComponents/Uploader.js
index e668b731..f1c0b007 100644
--- a/packages/ui/src/FormComponents/Uploader.js
+++ b/packages/ui/src/FormComponents/Uploader.js
@@ -1,4 +1,4 @@
-import React, { useEffect, useMemo, useRef, useState } from "react";
+import React, { useEffect, useRef, useState } from "react";
import {
Button,
Callout,
@@ -16,6 +16,7 @@ import classnames from "classnames";
import { nanoid } from "nanoid";
import papaparse, { unparse } from "papaparse";
import downloadjs from "downloadjs";
+import { configure, makeObservable, observable } from "mobx";
import { observer } from "mobx-react";
import UploadCsvWizardDialog, {
SimpleInsertDataDialog
@@ -29,7 +30,7 @@ import {
removeExt
} from "@teselagen/file-utils";
import tryToMatchSchemas from "./tryToMatchSchemas";
-import { isArray, isFunction, isPlainObject, noop } from "lodash-es";
+import { forEach, isArray, isFunction, isPlainObject, noop } from "lodash-es";
import { flatMap } from "lodash-es";
import urljoin from "url-join";
import popoverOverflowModifiers from "../utils/popoverOverflowModifiers";
@@ -37,12 +38,14 @@ import writeXlsxFile from "write-excel-file";
import { startCase } from "lodash-es";
import { getNewName } from "./getNewName";
import { isObject } from "lodash-es";
-import { useDispatch } from "react-redux";
+import { connect } from "react-redux";
import { initialize } from "redux-form";
import classNames from "classnames";
+import { compose } from "recompose";
import convertSchema from "../DataTable/utils/convertSchema";
import { LoadingDots } from "./LoadingDots";
+configure({ isolateGlobalState: true });
const helperText = [
`How to Use This Template to Upload New Data`,
`1. Go to the first tab and delete the example data.`,
@@ -61,106 +64,58 @@ const helperSchema = [
}
];
-const setValidateAgainstSchema = newValidateAgainstSchema => {
- if (!newValidateAgainstSchema) return { fields: [] };
- const schema = convertSchema(newValidateAgainstSchema);
- if (
- schema.fields.some(f => {
- if (f.path === "id") {
- return true;
- }
- return false;
- })
- ) {
- throw new Error(
- `Uploader was passed a validateAgainstSchema with a fields array that contains a field with a path of "id". This is not allowed.`
- );
+class ValidateAgainstSchema {
+ fields = [];
+
+ constructor() {
+ makeObservable(this, {
+ fields: observable.shallow
+ });
}
- return schema;
-};
-const InnerDropZone = ({
- getRootProps,
- getInputProps,
- isDragAccept,
- isDragReject,
- isDragActive,
- className,
- minimal,
- dropzoneDisabled,
- contentOverride,
- simpleAccept,
- innerIcon,
- innerText,
- validateAgainstSchema,
- handleManuallyEnterData,
- noBuildCsvOption,
- showFilesCount,
- fileList
- // isDragActive
- // isDragReject
- // isDragAccept
-}) => (
-