updating inside text modal but with bugs

This commit is contained in:
anovazzi1 2024-06-21 12:31:53 -03:00 • committed by Gabriel Luiz Freitas Almeida
commit 6f0957aeac
7 changed files with 45 additions and 20 deletions

View file

@ -2,11 +2,13 @@ import TextModal from "../../modals/textModal";
export default function StringReader({ export default function StringReader({
string, string,
setValue,
}: { }: {
string: string; string: string;
setValue: (value: string) => void;
}): JSX.Element { }): JSX.Element {
return ( return (
<TextModal value={string}> <TextModal setValue={setValue} value={string}>
<span className="truncate">{string}</span> <span className="truncate">{string}</span>
</TextModal> </TextModal>
); );

View file

@ -8,7 +8,8 @@ import { Badge } from "../../../ui/badge";
export default function TableAutoCellRender({ export default function TableAutoCellRender({
value, value,
}: CustomCellRendererProps | { value: any }) { setValue,
}: CustomCellRendererProps) {
function getCellType() { function getCellType() {
switch (typeof value) { switch (typeof value) {
case "object": case "object":
@ -49,7 +50,7 @@ export default function TableAutoCellRender({
</Badge> </Badge>
); );
} else { } else {
return <StringReader string={value} />; return <StringReader setValue={setValue!} string={value} />;
} }
case "number": case "number":
return <NumberReader number={value} />; return <NumberReader number={value} />;

View file

@ -14,13 +14,14 @@ import ForwardedIconComponent from "../genericIconComponent";
import { Alert, AlertDescription, AlertTitle } from "../ui/alert"; import { Alert, AlertDescription, AlertTitle } from "../ui/alert";
import TableOptions from "./components/TableOptions"; import TableOptions from "./components/TableOptions";
import resetGrid from "./utils/reset-grid-columns"; import resetGrid from "./utils/reset-grid-columns";
import { boolean } from "zod";
interface TableComponentProps extends AgGridReactProps { interface TableComponentProps extends AgGridReactProps {
columnDefs: NonNullable<AgGridReactProps["columnDefs"]>; columnDefs: NonNullable<AgGridReactProps["columnDefs"]>;
rowData: NonNullable<AgGridReactProps["rowData"]>; rowData: NonNullable<AgGridReactProps["rowData"]>;
alertTitle?: string; alertTitle?: string;
alertDescription?: string; alertDescription?: string;
editable?: boolean | string[]; editable?: boolean | string[] | {field: string, onUpdate: (value:any)=>void,editableCell:boolean}[];
pagination?: boolean; pagination?: boolean;
onDelete?: () => void; onDelete?: () => void;
onDuplicate?: () => void; onDuplicate?: () => void;
@ -52,14 +53,24 @@ const TableComponent = forwardRef<
} }
if ( if (
(typeof props.editable === "boolean" && props.editable) || (typeof props.editable === "boolean" && props.editable) ||
(Array.isArray(props.editable) && (Array.isArray(props.editable) && props.editable.every(field=>typeof field ==="string") &&
props.editable.includes(newCol.headerName ?? "")) (props.editable as Array<string>).includes(newCol.headerName ?? ""))
) { ) {
newCol = { newCol = {
...newCol, ...newCol,
editable: true, editable: true,
}; };
} }
if(Array.isArray(props.editable) && props.editable.every(field=>typeof field ==="object")){
const field = (props.editable as Array<{field:string, onUpdate:(value:any)=>void,editableCell:boolean}>).find(field=>field.field===newCol.headerName);
if(field){
newCol = {
...newCol,
editable: field.editableCell,
onCellValueChanged: (e)=>field.onUpdate(e)
}
}
}
return newCol; return newCol;
}); });
const gridRef = useRef(null); const gridRef = useRef(null);

View file

@ -1,4 +1,4 @@
import { CellEditRequestEvent, SelectionChangedEvent } from "ag-grid-community"; import { CellEditRequestEvent, NewValueParams, SelectionChangedEvent } from "ag-grid-community";
import { useState } from "react"; import { useState } from "react";
import TableComponent from "../../../../components/tableComponent"; import TableComponent from "../../../../components/tableComponent";
import useRemoveMessages from "../../../../pages/SettingsPage/pages/messagesPage/hooks/use-remove-messages"; import useRemoveMessages from "../../../../pages/SettingsPage/pages/messagesPage/hooks/use-remove-messages";
@ -6,6 +6,7 @@ import useUpdateMessage from "../../../../pages/SettingsPage/pages/messagesPage/
import useAlertStore from "../../../../stores/alertStore"; import useAlertStore from "../../../../stores/alertStore";
import { useMessagesStore } from "../../../../stores/messagesStore"; import { useMessagesStore } from "../../../../stores/messagesStore";
import { messagesSorter } from "../../../../utils/utils"; import { messagesSorter } from "../../../../utils/utils";
import cloneDeep from "lodash/cloneDeep";
export default function SessionView({ rows }: { rows: Array<any> }) { export default function SessionView({ rows }: { rows: Array<any> }) {
const columns = useMessagesStore((state) => state.columns); const columns = useMessagesStore((state) => state.columns);
@ -23,15 +24,18 @@ export default function SessionView({ rows }: { rows: Array<any> }) {
const { handleUpdate } = useUpdateMessage(setSuccessData, setErrorData); const { handleUpdate } = useUpdateMessage(setSuccessData, setErrorData);
function handleUpdateMessage(event: CellEditRequestEvent<any, string>) { function handleUpdateMessage(event: NewValueParams<any, string>) {
const newValue = event.newValue; const newValue = event.newValue;
const field = event.column.getColId(); const field = event.column.getColId();
const row = event.data; const row = cloneDeep(event.data);
const data = { const data = {
...row, ...row,
[field]: newValue, [field]: newValue,
}; };
handleUpdate(data); handleUpdate(data).catch((error) => {
event.data[field] = event.oldValue;
event.api.refreshCells();
});
} }
return ( return (
@ -39,10 +43,7 @@ export default function SessionView({ rows }: { rows: Array<any> }) {
key={"sessionView"} key={"sessionView"}
onDelete={handleRemoveMessages} onDelete={handleRemoveMessages}
readOnlyEdit readOnlyEdit
onCellEditRequest={(event) => { editable={[{field:"text",onUpdate:handleUpdateMessage, editableCell:false}]}
handleUpdateMessage(event);
}}
editable={["Sender Name", "Message", "Text"]}
overlayNoRowsTemplate="No data available" overlayNoRowsTemplate="No data available"
onSelectionChanged={(event: SelectionChangedEvent) => { onSelectionChanged={(event: SelectionChangedEvent) => {
setSelectedRows(event.api.getSelectedRows().map((row) => row.index)); setSelectedRows(event.api.getSelectedRows().map((row) => row.index));

View file

@ -4,7 +4,7 @@ import "ace-builds/src-noconflict/mode-python";
import "ace-builds/src-noconflict/theme-github"; import "ace-builds/src-noconflict/theme-github";
import "ace-builds/src-noconflict/theme-twilight"; import "ace-builds/src-noconflict/theme-twilight";
// import "ace-builds/webpack-resolver"; // import "ace-builds/webpack-resolver";
import { cloneDeep } from "lodash"; import { cloneDeep, set } from "lodash";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import JsonView from "react18-json-view"; import JsonView from "react18-json-view";
import "react18-json-view/src/dark.css"; import "react18-json-view/src/dark.css";
@ -22,11 +22,14 @@ import BaseModal from "../baseModal";
export default function TextModal({ export default function TextModal({
children, children,
value, value,
setValue,
}: { }: {
children: JSX.Element; children: JSX.Element;
value: Object; value: string;
setValue: (value: string) => void;
}): JSX.Element { }): JSX.Element {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [internalValue, setInternalValue] = useState(value);
return ( return (
<BaseModal size="medium-h-full" open={open} setOpen={setOpen}> <BaseModal size="medium-h-full" open={open} setOpen={setOpen}>
@ -42,12 +45,18 @@ export default function TextModal({
<BaseModal.Content> <BaseModal.Content>
<div className="flex h-full w-full flex-col transition-all"> <div className="flex h-full w-full flex-col transition-all">
<div className="h-[370px]"> <div className="h-[370px]">
<TextOutputView value={value} left={false} /> <TextOutputView onChange={(text)=>setInternalValue(text)} value={internalValue} left={false} />
</div> </div>
</div> </div>
</BaseModal.Content> </BaseModal.Content>
<BaseModal.Footer> <BaseModal.Footer>
<div className="flex w-full justify-end pt-2"> <div className="flex w-full justify-end gap-2 pt-2">
<Button className="flex gap-2 px-3" onClick={() => {
setValue(internalValue);
setOpen(false);
}}>
Save
</Button>
<Button className="flex gap-2 px-3" onClick={() => setOpen(false)}> <Button className="flex gap-2 px-3" onClick={() => setOpen(false)}>
Close Close
</Button> </Button>

View file

@ -20,6 +20,7 @@ const useUpdateMessage = (setSuccessData, setErrorData) => {
setErrorData({ setErrorData({
title: "Error updating messages.", title: "Error updating messages.",
}); });
return Promise.reject(error);
} }
}; };

View file

@ -1,6 +1,6 @@
import { Textarea } from "../../../components/ui/textarea"; import { Textarea } from "../../../components/ui/textarea";
const TextOutputView = ({ left, value }) => { const TextOutputView = ({ left, value,onChange }) => {
if (typeof value === "object" && Object.keys(value).includes("text")) { if (typeof value === "object" && Object.keys(value).includes("text")) {
value = value.text; value = value.text;
} }
@ -10,7 +10,7 @@ const TextOutputView = ({ left, value }) => {
placeholder={"Empty"} placeholder={"Empty"}
// update to real value on flowPool // update to real value on flowPool
value={value} value={value}
readOnly onChange={(e) => onChange(e.target.value)}
/> />
); );
}; };