Merge pull request #33 from Kingsrook/feature/fix-urlencoding-primary-keys

Feature/fix urlencoding primary keys (and some filters)
This commit is contained in:
tim-chamberlain
2023-09-26 10:16:44 -05:00
committed by GitHub
5 changed files with 24 additions and 25 deletions

View File

@ -6,7 +6,7 @@
"@auth0/auth0-react": "1.10.2", "@auth0/auth0-react": "1.10.2",
"@emotion/react": "11.7.1", "@emotion/react": "11.7.1",
"@emotion/styled": "11.6.0", "@emotion/styled": "11.6.0",
"@kingsrook/qqq-frontend-core": "1.0.81", "@kingsrook/qqq-frontend-core": "1.0.82",
"@mui/icons-material": "5.4.1", "@mui/icons-material": "5.4.1",
"@mui/material": "5.11.1", "@mui/material": "5.11.1",
"@mui/styles": "5.11.1", "@mui/styles": "5.11.1",
@ -57,9 +57,7 @@
"npm-install": "npm install --legacy-peer-deps", "npm-install": "npm install --legacy-peer-deps",
"prepublishOnly": "tsc -p ./ --outDir lib/", "prepublishOnly": "tsc -p ./ --outDir lib/",
"start": "BROWSER=none react-scripts --max-http-header-size=65535 start", "start": "BROWSER=none react-scripts --max-http-header-size=65535 start",
"test": "react-scripts test", "test": "react-scripts test"
"cypress:open": "cypress open",
"cypress:run": "cypress run"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
@ -87,8 +85,6 @@
"@types/react-table": "7.7.9", "@types/react-table": "7.7.9",
"@typescript-eslint/eslint-plugin": "5.10.2", "@typescript-eslint/eslint-plugin": "5.10.2",
"@typescript-eslint/parser": "5.10.2", "@typescript-eslint/parser": "5.10.2",
"cypress": "11.0.1",
"cypress-wait-for-stable-dom": "0.1.0",
"eslint": "8.8.0", "eslint": "8.8.0",
"eslint-import-resolver-typescript": "2.5.0", "eslint-import-resolver-typescript": "2.5.0",
"eslint-plugin-import": "2.25.4", "eslint-plugin-import": "2.25.4",

View File

@ -76,7 +76,7 @@ interface Props
isModal?: boolean; isModal?: boolean;
isWidget?: boolean; isWidget?: boolean;
isReport?: boolean; isReport?: boolean;
recordIds?: string | QQueryFilter; recordIds?: string[] | QQueryFilter;
closeModalHandler?: (event: object, reason: string) => void; closeModalHandler?: (event: object, reason: string) => void;
forceReInit?: number; forceReInit?: number;
overrideLabel?: string; overrideLabel?: string;
@ -1089,8 +1089,10 @@ function ProcessRun({process, table, defaultProcessValues, isModal, isWidget, is
let queryStringPairsForInit = []; let queryStringPairsForInit = [];
if (urlSearchParams.get("recordIds")) if (urlSearchParams.get("recordIds"))
{ {
const recordIdsFromQueryString = urlSearchParams.get("recordIds").split(",");
const encodedRecordIds = recordIdsFromQueryString.map(r => encodeURIComponent(r)).join(",");
queryStringPairsForInit.push("recordsParam=recordIds"); queryStringPairsForInit.push("recordsParam=recordIds");
queryStringPairsForInit.push(`recordIds=${urlSearchParams.get("recordIds")}`); queryStringPairsForInit.push(`recordIds=${encodedRecordIds}`);
} }
else if (urlSearchParams.get("filterJSON")) else if (urlSearchParams.get("filterJSON"))
{ {
@ -1104,16 +1106,17 @@ function ProcessRun({process, table, defaultProcessValues, isModal, isWidget, is
// } // }
else if (recordIds) else if (recordIds)
{ {
if (typeof recordIds === "string") if (recordIds instanceof QQueryFilter)
{
queryStringPairsForInit.push("recordsParam=recordIds");
queryStringPairsForInit.push(`recordIds=${recordIds}`);
}
else if (recordIds instanceof QQueryFilter)
{ {
queryStringPairsForInit.push("recordsParam=filterJSON"); queryStringPairsForInit.push("recordsParam=filterJSON");
queryStringPairsForInit.push(`filterJSON=${JSON.stringify(recordIds)}`); queryStringPairsForInit.push(`filterJSON=${JSON.stringify(recordIds)}`);
} }
else if (typeof recordIds === "object" && recordIds.length)
{
const encodedRecordIds = recordIds.map(r => encodeURIComponent(r)).join(",");
queryStringPairsForInit.push("recordsParam=recordIds");
queryStringPairsForInit.push(`recordIds=${encodedRecordIds}`);
}
} }
if (tableVariantLocalStorageKey && localStorage.getItem(tableVariantLocalStorageKey)) if (tableVariantLocalStorageKey && localStorage.getItem(tableVariantLocalStorageKey))
@ -1169,7 +1172,7 @@ function ProcessRun({process, table, defaultProcessValues, isModal, isWidget, is
if (tableMetaData) if (tableMetaData)
{ {
queryStringPairsForInit.push(`tableName=${tableMetaData.name}`); queryStringPairsForInit.push(`tableName=${encodeURIComponent(tableMetaData.name)}`);
} }
try try

View File

@ -234,7 +234,7 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
const [activeModalProcess, setActiveModalProcess] = useState(null as QProcessMetaData); const [activeModalProcess, setActiveModalProcess] = useState(null as QProcessMetaData);
const [launchingProcess, setLaunchingProcess] = useState(launchProcess); const [launchingProcess, setLaunchingProcess] = useState(launchProcess);
const [recordIdsForProcess, setRecordIdsForProcess] = useState(null as string | QQueryFilter); const [recordIdsForProcess, setRecordIdsForProcess] = useState([] as string[] | QQueryFilter);
const [columnStatsFieldName, setColumnStatsFieldName] = useState(null as string); const [columnStatsFieldName, setColumnStatsFieldName] = useState(null as string);
const [columnStatsField, setColumnStatsField] = useState(null as QFieldMetaData); const [columnStatsField, setColumnStatsField] = useState(null as QFieldMetaData);
const [columnStatsFieldTableName, setColumnStatsFieldTableName] = useState(null as string) const [columnStatsFieldTableName, setColumnStatsFieldTableName] = useState(null as string)
@ -926,11 +926,11 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
{ {
if (table.primaryKeyField !== "id") if (table.primaryKeyField !== "id")
{ {
navigate(`${metaData.getTablePathByName(tableName)}/${params.row[tableMetaData.primaryKeyField]}`); navigate(`${metaData.getTablePathByName(tableName)}/${encodeURIComponent(params.row[tableMetaData.primaryKeyField])}`);
} }
else else
{ {
navigate(`${metaData.getTablePathByName(tableName)}/${params.id}`); navigate(`${metaData.getTablePathByName(tableName)}/${encodeURIComponent(params.id)}`);
} }
}, 100); }, 100);
} }
@ -1190,17 +1190,17 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
{ {
if (selectFullFilterState === "filter") if (selectFullFilterState === "filter")
{ {
return `?recordsParam=filterJSON&filterJSON=${JSON.stringify(buildQFilter(tableMetaData, filterModel))}`; return `?recordsParam=filterJSON&filterJSON=${encodeURIComponent(JSON.stringify(buildQFilter(tableMetaData, filterModel)))}`;
} }
if (selectFullFilterState === "filterSubset") if (selectFullFilterState === "filterSubset")
{ {
return `?recordsParam=filterJSON&filterJSON=${JSON.stringify(buildQFilter(tableMetaData, filterModel, selectionSubsetSize))}`; return `?recordsParam=filterJSON&filterJSON=${encodeURIComponent(JSON.stringify(buildQFilter(tableMetaData, filterModel, selectionSubsetSize)))}`;
} }
if (selectedIds.length > 0) if (selectedIds.length > 0)
{ {
return `?recordsParam=recordIds&recordIds=${selectedIds.join(",")}`; return `?recordsParam=recordIds&recordIds=${selectedIds.map(r => encodeURIComponent(r)).join(",")}`;
} }
return ""; return "";
@ -1218,11 +1218,11 @@ function RecordQuery({table, launchProcess}: Props): JSX.Element
} }
else if (selectedIds.length > 0) else if (selectedIds.length > 0)
{ {
setRecordIdsForProcess(selectedIds.join(",")); setRecordIdsForProcess(selectedIds);
} }
else else
{ {
setRecordIdsForProcess(""); setRecordIdsForProcess([]);
} }
navigate(`${metaData?.getTablePathByName(tableName)}/${process.name}${getRecordsQueryString()}`); navigate(`${metaData?.getTablePathByName(tableName)}/${process.name}${getRecordsQueryString()}`);

View File

@ -931,7 +931,7 @@ function RecordView({table, launchProcess}: Props): JSX.Element
activeModalProcess && activeModalProcess &&
<Modal open={activeModalProcess !== null} onClose={(event, reason) => closeModalProcess(event, reason)}> <Modal open={activeModalProcess !== null} onClose={(event, reason) => closeModalProcess(event, reason)}>
<div className="modalProcess"> <div className="modalProcess">
<ProcessRun process={activeModalProcess} isModal={true} table={tableMetaData} recordIds={id} closeModalHandler={closeModalProcess} /> <ProcessRun process={activeModalProcess} isModal={true} table={tableMetaData} recordIds={[id]} closeModalHandler={closeModalProcess} />
</div> </div>
</Modal> </Modal>
} }

View File

@ -246,7 +246,7 @@ export default class DataGridUtils
if (key === tableMetaData.primaryKeyField && linkBase) if (key === tableMetaData.primaryKeyField && linkBase)
{ {
column.renderCell = (cellValues: any) => ( column.renderCell = (cellValues: any) => (
<Link to={`${linkBase}${cellValues.value}`} onClick={(e) => e.stopPropagation()}>{cellValues.value}</Link> <Link to={`${linkBase}${encodeURIComponent(cellValues.value)}`} onClick={(e) => e.stopPropagation()}>{cellValues.value}</Link>
); );
} }
}); });