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

View File

@ -38,11 +38,14 @@ export const getRow = async (
await doc.loadInfo() await doc.loadInfo()
const sheet = doc.sheetsById[sheetId] const sheet = doc.sheetsById[sheetId]
const rows = await sheet.getRows() const rows = await sheet.getRows()
const filteredRows = rows.filter((row) => const filteredRows = getTotalRows(
options.totalRowsToExtract,
rows.filter((row) =>
referenceCell referenceCell
? row[referenceCell.column as string] === referenceCell.value ? row[referenceCell.column as string] === referenceCell.value
: matchFilter(row, filter as NonNullable<typeof filter>) : matchFilter(row, filter as NonNullable<typeof filter>)
) )
)
if (filteredRows.length === 0) { if (filteredRows.length === 0) {
log = { log = {
status: 'error', status: 'error',
@ -99,3 +102,20 @@ export const getRow = async (
} }
return { outgoingEdgeId, logs: log ? [log] : undefined } 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( const googleSheetsGetOptionsSchema = googleSheetsOptionsBaseSchema.merge(
z.object({ z.object({
action: z.enum([GoogleSheetsAction.GET]), action: z.enum([GoogleSheetsAction.GET]),
@ -48,6 +55,7 @@ const googleSheetsGetOptionsSchema = googleSheetsOptionsBaseSchema.merge(
}) })
.optional(), .optional(),
cellsToExtract: z.array(extractingCellSchema), cellsToExtract: z.array(extractingCellSchema),
totalRowsToExtract: z.enum(totalRowsToExtractOptions).optional(),
}) })
) )