diff --git a/src/components/CodeEditor/extensions.d.ts b/src/components/CodeEditor/extensions.d.ts index d57c5e216..734adcfe0 100644 --- a/src/components/CodeEditor/extensions.d.ts +++ b/src/components/CodeEditor/extensions.d.ts @@ -131,9 +131,7 @@ type PushNotificationBody = ( type TaskBody = (context: ExtensionContext) => Promise; -type BuildshipAuthenticatedTriggerBody = ( - context: ExtensionContext -) => Promise<{ +type BuildshipTriggerBody = (context: ExtensionContext) => Promise<{ buildshipConfig: { projectId: string; workflowId: string; diff --git a/src/components/Table/TableBody.tsx b/src/components/Table/TableBody.tsx index 04918f186..1a66a4058 100644 --- a/src/components/Table/TableBody.tsx +++ b/src/components/Table/TableBody.tsx @@ -122,7 +122,7 @@ export const TableBody = memo(function TableBody({ if (cell.id.includes("_rowy_select")) { return ( - + {flexRender(cell.column.columnDef.cell, cell.getContext())} ); diff --git a/src/components/Table/TableHeader.tsx b/src/components/Table/TableHeader.tsx index ae763a607..709f8cc01 100644 --- a/src/components/Table/TableHeader.tsx +++ b/src/components/Table/TableHeader.tsx @@ -79,7 +79,8 @@ export const TableHeader = memo(function TableHeader({ {flexRender( header.column.columnDef.header, diff --git a/src/components/Table/useMenuAction.tsx b/src/components/Table/useMenuAction.tsx index 3a1d45992..4cc202779 100644 --- a/src/components/Table/useMenuAction.tsx +++ b/src/components/Table/useMenuAction.tsx @@ -165,6 +165,10 @@ export function useMenuAction( async (e?: ClipboardEvent) => { try { if (!selectedCell || !selectedCol) return; + + // checks which element has focus, if it is not the gridcell it won't paste the copied content inside the gridcell + if (document.activeElement?.role !== "gridcell") return; + let text: string; // Firefox doesn't allow for reading clipboard data, hence the workaround if (navigator.userAgent.includes("Firefox")) { diff --git a/src/components/TableModals/ExtensionsModal/utils.ts b/src/components/TableModals/ExtensionsModal/utils.ts index fbeb71df6..7a8860c22 100644 --- a/src/components/TableModals/ExtensionsModal/utils.ts +++ b/src/components/TableModals/ExtensionsModal/utils.ts @@ -16,7 +16,7 @@ export const extensionTypes = [ export type ExtensionType = typeof extensionTypes[number]; export const extensionNames: Record = { - buildshipAuthenticatedTrigger: "BuildShip Authenticated Trigger", + buildshipAuthenticatedTrigger: "Buildship Trigger", task: "Task", docSync: "Doc Sync", historySnapshot: "History Snapshot", @@ -63,7 +63,7 @@ export interface IRuntimeOptions { export const triggerTypes: ExtensionTrigger[] = ["create", "update", "delete"]; const extensionBodyTemplate = { - buildshipAuthenticatedTrigger: `const extensionBody: BuildshipAuthenticatedTriggerBody = async({row, db, change, ref, logging}) => { + buildshipAuthenticatedTrigger: `const extensionBody: BuildshipTriggerBody = async({row, db, change, ref, logging}) => { logging.log("extensionBody started") // Put your endpoint URL and request body below. @@ -80,8 +80,8 @@ const extensionBodyTemplate = { path: ref.path }, change: { - before: change.before.get(), - after: change.after.get(), + before: change.before.data(), + after: change.after.data(), }, // Add your own payload here }) diff --git a/src/components/TableToolbar/TableToolbar.tsx b/src/components/TableToolbar/TableToolbar.tsx index 77eb8749a..2adb90f1d 100644 --- a/src/components/TableToolbar/TableToolbar.tsx +++ b/src/components/TableToolbar/TableToolbar.tsx @@ -26,6 +26,8 @@ import { userRolesAtom, compatibleRowyRunVersionAtom, rowyRunModalAtom, + altPressAtom, + confirmDialogAtom, } from "@src/atoms/projectScope"; import { tableScope, @@ -91,6 +93,8 @@ function RowSelectedToolBar({ }) { const [serverDocCount] = useAtom(serverDocCountAtom, tableScope); const deleteRow = useSetAtom(deleteRowAtom, tableScope); + const [altPress] = useAtom(altPressAtom, projectScope); + const confirm = useSetAtom(confirmDialogAtom, projectScope); const handleDelete = async () => { await deleteRow({ path: Object.keys(selectedRows) }); @@ -107,7 +111,20 @@ function RowSelectedToolBar({ variant="outlined" startIcon={} color="error" - onClick={handleDelete} + onClick={ + altPress + ? handleDelete + : () => { + confirm({ + title: `Delete ${ + Object.values(selectedRows).length + } of ${serverDocCount} selected rows?`, + confirm: "Delete", + confirmColor: "error", + handleConfirm: handleDelete, + }); + } + } > Delete diff --git a/src/components/fields/types.ts b/src/components/fields/types.ts index 2e35d7126..f8e935722 100644 --- a/src/components/fields/types.ts +++ b/src/components/fields/types.ts @@ -88,8 +88,8 @@ export interface ISideDrawerFieldProps { /** Update the local value. Also calls onDirty */ onChange: (value: T) => void; /** Call when user input is ready to be saved (e.g. onBlur) */ - onSubmit: () => void; + onSubmit: () => void; /** Field locked. Do NOT check `column.locked` */ disabled: boolean; diff --git a/src/hooks/useFirestoreCollectionWithAtom.ts b/src/hooks/useFirestoreCollectionWithAtom.ts index 355ceaa1f..8e870dd99 100644 --- a/src/hooks/useFirestoreCollectionWithAtom.ts +++ b/src/hooks/useFirestoreCollectionWithAtom.ts @@ -16,6 +16,7 @@ import { setDoc, doc, deleteDoc, + updateDoc, deleteField, CollectionReference, Query, @@ -263,7 +264,7 @@ export function useFirestoreCollectionWithAtom< // set the atom’s value to a function that updates a doc in the collection if (updateDocAtom) { setUpdateDocAtom( - () => (path: string, update: T, deleteFields?: string[]) => { + () => async (path: string, update: T, deleteFields?: string[]) => { const updateToDb = { ...update }; if (Array.isArray(deleteFields)) { @@ -271,8 +272,13 @@ export function useFirestoreCollectionWithAtom< set(updateToDb as any, field, deleteField()); } } - - return 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, + }); + } } ); }