11import styles from './table.module.scss'
2- import React , { useState , useRef , useContext } from 'react'
2+ import React , { useState , useContext } from 'react'
33import { Cell , useRowSelect , useTable } from 'react-table'
44import toast from 'react-hot-toast'
55import { DBConnection , DBQueryData , Tab } from '../../../data/models'
66import EditableCell from './editablecell'
77import AddModal from './addmodal'
88import ConfirmModal from '../../widgets/confirmModal'
9- import { useAppDispatch , useAppSelector } from '../../../redux/hooks'
9+ import { useAppDispatch } from '../../../redux/hooks'
1010import { deleteDBData , setQueryData , updateDBSingleData } from '../../../redux/dataModelSlice'
1111import { DBConnType } from '../../../data/defaults'
1212import TabContext from '../../layouts/tabcontext'
@@ -41,7 +41,7 @@ const Table = ({ queryData, dbConnection, mSchema, mName, isEditable, showHeader
4141 [ queryData ]
4242 )
4343
44- const displayColumns = queryData . columns . filter ( col => col !== 'ctid' )
44+ const displayColumns = dbConnection . type === DBConnType . POSTGRES ? queryData . columns . filter ( col => col !== 'ctid' ) : queryData . columns
4545 const ctidExists = queryData . columns . length !== displayColumns . length
4646
4747 const columns = React . useMemo (
@@ -65,14 +65,21 @@ const Table = ({ queryData, dbConnection, mSchema, mName, isEditable, showHeader
6565 setEditCell ( [ ] )
6666 }
6767
68- const onSaveCell = async ( ctid : string , columnIdx : string , newValue : string ) => {
68+ const onSaveCell = async ( rowIdx : number , originalValue : any , columnIdx : string , newValue : string ) => {
69+ if ( dbConnection . type === DBConnType . MYSQL && queryData . pkeys ?. length === 0 ) {
70+ return toast . error ( "to perform edit operation primary keys are required on the table!" )
71+ }
6972 const columnName = queryData . columns [ parseInt ( columnIdx ) ]
70- const result = await dispatch ( updateDBSingleData ( { dbConnectionId : dbConnection . id , schemaName : mSchema , name : mName , id : ctid , columnName, newValue, columnIdx } ) ) . unwrap ( )
73+ const uniqueId = dbConnection . type === DBConnType . POSTGRES ? originalValue [ "0" ] : JSON . stringify ( queryData . pkeys ! . map ( ( pkey ) => ( { [ pkey ] : originalValue [ queryData . columns . findIndex ( x => x === pkey ) ] } ) ) . reduce ( ( ( r , c ) => Object . assign ( r , c ) ) , { } ) )
74+ const result = await dispatch ( updateDBSingleData ( { dbConnectionId : dbConnection . id , schemaName : mSchema , name : mName , id : uniqueId , columnName, newValue, columnIdx } ) ) . unwrap ( )
7175 if ( result . success ) {
72- const rowIdx = queryData ! . rows . findIndex ( x => x [ "0" ] === ctid )
7376 if ( rowIdx !== - 1 ) {
7477 const newQueryData : DBQueryData = { ...queryData ! , rows : [ ...queryData ! . rows ] }
75- newQueryData ! . rows [ rowIdx ] = { ...newQueryData ! . rows [ rowIdx ] , 0 : result . data . ctid }
78+ if ( dbConnection . type === DBConnType . POSTGRES ) {
79+ newQueryData ! . rows [ rowIdx ] = { ...newQueryData ! . rows [ rowIdx ] , 0 : result . data . ctid }
80+ } else {
81+ newQueryData ! . rows [ rowIdx ] = { ...newQueryData ! . rows [ rowIdx ] }
82+ }
7683 newQueryData ! . rows [ rowIdx ] [ columnIdx ] = newValue
7784 dispatch ( setQueryData ( { data : newQueryData , tabId : activeTab . id } ) )
7885 } else {
@@ -116,11 +123,16 @@ const Table = ({ queryData, dbConnection, mSchema, mName, isEditable, showHeader
116123 const newState : any = state // temporary typescript hack
117124 const selectedRowIds : any = newState . selectedRowIds
118125 const selectedRows : number [ ] = Object . keys ( selectedRowIds ) . map ( x => parseInt ( x ) )
119- const selectedCTIDs = rows . filter ( ( _ , i ) => selectedRows . includes ( i ) ) . map ( x => x . original [ '0' ] ) . filter ( x => x )
126+ const selectedIDs = dbConnection . type === DBConnType . POSTGRES ?
127+ rows . filter ( ( _ , i ) => selectedRows . includes ( i ) ) . map ( x => x . original [ '0' ] ) . filter ( x => x )
128+ : rows . filter ( ( _ , i ) => selectedRows . includes ( i ) ) . map ( x => queryData . pkeys ! . map ( ( pkey ) => ( { [ pkey ] : x . original [ queryData . columns . findIndex ( x => x === pkey ) ] } ) ) ) . map ( x => x . reduce ( ( ( r , c ) => Object . assign ( r , c ) ) , { } ) ) . map ( x => JSON . stringify ( x ) )
120129
121130 const deleteRows = async ( ) => {
122- if ( selectedCTIDs . length > 0 ) {
123- const result = await dispatch ( deleteDBData ( { dbConnectionId : dbConnection . id , schemaName : mSchema , name : mName , selectedIDs : selectedCTIDs } ) ) . unwrap ( )
131+ if ( dbConnection . type === DBConnType . MYSQL && queryData . pkeys ?. length === 0 ) {
132+ return toast . error ( "to perform delete operation primary keys are required on the table!" )
133+ }
134+ if ( selectedIDs . length > 0 ) {
135+ const result = await dispatch ( deleteDBData ( { dbConnectionId : dbConnection . id , schemaName : mSchema , name : mName , selectedIDs : selectedIDs } ) ) . unwrap ( )
124136 if ( result . success ) {
125137 toast . success ( 'rows deleted' )
126138 const filteredRows = queryData ! . rows . filter ( ( _ , i ) => ! selectedRows . includes ( i ) )
@@ -150,6 +162,11 @@ const Table = ({ queryData, dbConnection, mSchema, mName, isEditable, showHeader
150162 }
151163 onFilterChanged ( filter )
152164 }
165+ const onFilterClear = ( ) => {
166+ let filter : string [ ] | undefined = undefined
167+ setFilterValue ( [ 'default' , 'default' , '' ] )
168+ onFilterChanged ( filter )
169+ }
153170
154171 const changeSort = ( newSortIdx : string ) => {
155172 if ( ! isEditable ) {
@@ -216,11 +233,18 @@ const Table = ({ queryData, dbConnection, mSchema, mName, isEditable, showHeader
216233 < p className = "control" >
217234 < button className = "button" onClick = { onFilter } > Filter</ button >
218235 </ p >
236+ { ( filterValue [ 0 ] !== 'default' || filterValue [ 1 ] !== 'default' ) && < p className = "control" >
237+ < button className = "button" onClick = { onFilterClear } >
238+ < span className = "icon is-small" >
239+ < i className = "fas fa-circle-xmark" />
240+ </ span >
241+ </ button >
242+ </ p > }
219243 </ div >
220244 </ div >
221245 { isEditable && < React . Fragment >
222246 < div className = "column is-3 is-flex is-justify-content-flex-end" >
223- < button className = "button" disabled = { dbConnection . type === DBConnType . MYSQL || selectedCTIDs . length === 0 } onClick = { ( ) => { setIsDeleting ( true ) } } >
247+ < button className = "button" disabled = { selectedIDs . length === 0 } onClick = { ( ) => { setIsDeleting ( true ) } } >
224248 < span className = "icon is-small" >
225249 < i className = "fas fa-trash" />
226250 </ span >
0 commit comments