2
0

(sheets) Add option to select single row when matching multiple

Closes #501
This commit is contained in:
Baptiste Arnaud
2023-05-12 11:21:24 -04:00
parent 45224f9fb3
commit 55dbb1abc7
3 changed files with 90 additions and 46 deletions

View File

@ -21,6 +21,7 @@ import {
GoogleSheetsInsertRowOptions,
GoogleSheetsOptions,
GoogleSheetsUpdateRowOptions,
totalRowsToExtractOptions,
} from '@typebot.io/schemas'
import React, { useMemo } from 'react'
import { isDefined } from '@typebot.io/lib'
@ -184,6 +185,11 @@ const ActionOptions = ({
const handleFilterChange = (filter: GoogleSheetsGetOptions['filter']) =>
onOptionsChange({ ...options, filter } as GoogleSheetsOptions)
const updateTotalRowsToExtract = (
totalRowsToExtract: GoogleSheetsGetOptions['totalRowsToExtract']
) =>
onOptionsChange({ ...options, totalRowsToExtract } as GoogleSheetsOptions)
const UpdatingCellItem = useMemo(
() =>
function Component(props: TableListItemProps<Cell>) {
@ -273,6 +279,7 @@ const ActionOptions = ({
case GoogleSheetsAction.GET:
return (
<Accordion allowMultiple>
<Stack>
{options.referenceCell && (
<AccordionItem>
<AccordionButton>
@ -292,6 +299,7 @@ const ActionOptions = ({
</AccordionItem>
)}
{!options.referenceCell && (
<>
<AccordionItem>
<AccordionButton>
<Text w="full" textAlign="left">
@ -308,7 +316,14 @@ const ActionOptions = ({
/>
</AccordionPanel>
</AccordionItem>
<DropdownList
items={totalRowsToExtractOptions}
currentItem={options.totalRowsToExtract ?? 'All'}
onItemSelect={updateTotalRowsToExtract}
/>
</>
)}
<AccordionItem>
<AccordionButton>
<Text w="full" textAlign="left">
@ -326,6 +341,7 @@ const ActionOptions = ({
/>
</AccordionPanel>
</AccordionItem>
</Stack>
</Accordion>
)
default:

View File

@ -38,11 +38,14 @@ export const getRow = async (
await doc.loadInfo()
const sheet = doc.sheetsById[sheetId]
const rows = await sheet.getRows()
const filteredRows = rows.filter((row) =>
const filteredRows = getTotalRows(
options.totalRowsToExtract,
rows.filter((row) =>
referenceCell
? row[referenceCell.column as string] === referenceCell.value
: matchFilter(row, filter as NonNullable<typeof filter>)
)
)
if (filteredRows.length === 0) {
log = {
status: 'error',
@ -99,3 +102,20 @@ export const getRow = async (
}
return { outgoingEdgeId, logs: log ? [log] : undefined }
}
const getTotalRows = <T>(
totalRowsToExtract: GoogleSheetsGetOptions['totalRowsToExtract'],
rows: T[]
): T[] => {
switch (totalRowsToExtract) {
case 'All':
case undefined:
return rows
case 'First':
return rows.slice(0, 1)
case 'Last':
return rows.slice(-1)
case 'Random':
return [rows[Math.floor(Math.random() * rows.length)]]
}
}

View File

@ -35,6 +35,13 @@ const initialGoogleSheetsOptionsSchema = googleSheetsOptionsBaseSchema.merge(
})
)
export const totalRowsToExtractOptions = [
'All',
'First',
'Last',
'Random',
] as const
const googleSheetsGetOptionsSchema = googleSheetsOptionsBaseSchema.merge(
z.object({
action: z.enum([GoogleSheetsAction.GET]),
@ -48,6 +55,7 @@ const googleSheetsGetOptionsSchema = googleSheetsOptionsBaseSchema.merge(
})
.optional(),
cellsToExtract: z.array(extractingCellSchema),
totalRowsToExtract: z.enum(totalRowsToExtractOptions).optional(),
})
)