diff --git a/src/atoms/tableScope/rowActions.ts b/src/atoms/tableScope/rowActions.ts index 4185fa248..af5caddf8 100644 --- a/src/atoms/tableScope/rowActions.ts +++ b/src/atoms/tableScope/rowActions.ts @@ -486,7 +486,11 @@ export const updateFieldAtom = atom( row._rowy_ref.path, omitRowyFields(newRowValues), deleteField ? [fieldName] : [], - arrayTableData + { + ...arrayTableData, + // using set if we are updating a nested field + useSet: fieldName.split(".").length > 1, + } ); } } @@ -496,7 +500,11 @@ export const updateFieldAtom = atom( row._rowy_ref.path, omitRowyFields(dbUpdate), deleteField ? [fieldName] : [], - arrayTableData + { + ...arrayTableData, + // using set if we are updating a nested field + useSet: fieldName.split(".").length > 1, + } ); } diff --git a/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx b/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx index f7989d264..098c2927f 100644 --- a/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx +++ b/src/components/TableModals/ImportCsvWizard/ImportCsvWizard.tsx @@ -142,7 +142,7 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { let requiredUploads: any = {}; columns.forEach((column, index) => { if (needsConverter(column.type)) { - requiredConverts[index] = getConverter(column.type); + requiredConverts[column.columnKey] = getConverter(column.type); // console.log({ needsUploadTypes }, column.type); if (needsUploadTypes(column.type)) { requiredUploads[column.fieldName + ""] = true; @@ -215,8 +215,8 @@ export default function ImportCsvWizard({ onClose }: ITableModalProps) { const newValidRows = validRows.map((row) => { // Convert required values Object.keys(row).forEach((key, i) => { - if (requiredConverts[i]) { - row[key] = requiredConverts[i](row[key]); + if (requiredConverts[key]) { + row[key] = requiredConverts[key](row[key]); } }); diff --git a/src/components/TableSettingsDialog/TableName.tsx b/src/components/TableSettingsDialog/TableName.tsx index 36875c11e..1b6204a62 100644 --- a/src/components/TableSettingsDialog/TableName.tsx +++ b/src/components/TableSettingsDialog/TableName.tsx @@ -12,7 +12,7 @@ export interface ITableNameProps extends IShortTextComponentProps { export default function TableName({ watchedField, ...props }: ITableNameProps) { const { - field: { onChange, value }, + field: { onChange }, useFormMethods: { control }, disabled, } = props; @@ -25,12 +25,9 @@ export default function TableName({ watchedField, ...props }: ITableNameProps) { if (!touched && typeof watchedValue === "string" && !!watchedValue) { // if table name field is not touched, and watched value is valid, set table name to watched value onChange(startCase(watchedValue)); - } else if (typeof value === "string") { - // otherwise if table name is valid, set watched value to table name - onChange(startCase(value.trim())); } } - }, [watchedValue, disabled, onChange, value]); + }, [watchedValue, disabled]); return ; } diff --git a/src/components/TableSettingsDialog/form.tsx b/src/components/TableSettingsDialog/form.tsx index 31802e14b..9d611e068 100644 --- a/src/components/TableSettingsDialog/form.tsx +++ b/src/components/TableSettingsDialog/form.tsx @@ -213,7 +213,7 @@ export const tableSettings = ( name: "name", label: "Table name", required: true, - watchedField: "name", + watchedField: "collection", assistiveText: "User-facing name for this table", autoFocus: true, gridCols: { xs: 12, sm: 6 }, diff --git a/src/components/TableToolbar/Filters/FilterInputs.tsx b/src/components/TableToolbar/Filters/FilterInputs.tsx index d236bf1c9..be023e9e6 100644 --- a/src/components/TableToolbar/Filters/FilterInputs.tsx +++ b/src/components/TableToolbar/Filters/FilterInputs.tsx @@ -165,6 +165,7 @@ export default function FilterInputs({ column: selectedColumn, _rowy_ref: {}, value: query.value, + onSubmit: () => {}, onChange: (value: any) => { const newQuery = { ...query, diff --git a/src/components/fields/Number/SideDrawerField.tsx b/src/components/fields/Number/SideDrawerField.tsx index 76212c8cf..95b51d6ac 100644 --- a/src/components/fields/Number/SideDrawerField.tsx +++ b/src/components/fields/Number/SideDrawerField.tsx @@ -6,8 +6,8 @@ import { getFieldId } from "@src/components/SideDrawer/utils"; export default function Number_({ column, value, - onChange, - onSubmit, + onChange = () => {}, + onSubmit = () => {}, disabled, }: ISideDrawerFieldProps) { return ( diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index 8e870dd99..901d2970a 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -264,22 +264,37 @@ export function useFirestoreCollectionWithAtom< // set the atom’s value to a function that updates a doc in the collection if (updateDocAtom) { setUpdateDocAtom( - () => async (path: string, update: T, deleteFields?: string[]) => { - const updateToDb = { ...update }; + () => + async ( + path: string, + update: T, + deleteFields?: string[], + options?: { + useSet?: boolean; + } + ) => { + const updateToDb = { ...update }; - if (Array.isArray(deleteFields)) { - for (const field of deleteFields) { - set(updateToDb as any, field, deleteField()); + if (Array.isArray(deleteFields)) { + for (const field of deleteFields) { + set(updateToDb as any, field, deleteField()); + } + } + + if (options?.useSet) { + return await setDoc(doc(firebaseDb, path), updateToDb, { + merge: true, + }); + } + + try { + return await updateDoc(doc(firebaseDb, path), updateToDb); + } catch (e) { + return await setDoc(doc(firebaseDb, path), updateToDb, { + merge: true, + }); } } - try { - return await updateDoc(doc(firebaseDb, path), updateToDb); - } catch (e) { - return await setDoc(doc(firebaseDb, path), updateToDb, { - merge: true, - }); - } - } ); } @@ -443,6 +458,7 @@ export const tableFiltersToFirestoreFilters = (filters: TableFilter[]) => { continue; } else if (filter.operator === "is-not-empty") { firestoreFilters.push(where(filter.key, "!=", "")); + continue; } else if (filter.operator === "array-contains") { if (!filter.value || !filter.value.length) continue; // make the value as a singular string diff --git a/src/types/table.d.ts b/src/types/table.d.ts index db6754e6e..2fd8b5324 100644 --- a/src/types/table.d.ts +++ b/src/types/table.d.ts @@ -26,13 +26,14 @@ export type UpdateDocFunction = ( * @param path - The full path to the doc * @param update - The updates to be deeply merged with the existing doc. Note arrays should be ovewritten to match Firestore set with merge behavior * @param deleteFields - Optionally, fields to be deleted from the doc. Access nested fields with dot notation + * @param options - Optionally, filed to pass extra data to the function * @returns Promise */ export type UpdateCollectionDocFunction = ( path: string, update: Partial, deleteFields?: string[], - options?: ArrayTableRowData + options?: ArrayTableRowData & { useSet?: boolean } ) => Promise; /**