From c78142163a14ec10890370d020cae63b4c95e384 Mon Sep 17 00:00:00 2001 From: Nick Z <2420177+nickzelei@users.noreply.github.com> Date: Tue, 19 Nov 2024 13:52:15 -0800 Subject: [PATCH] new job schema page compiling --- .../components/DataSyncConnectionCard.tsx | 5 - .../(mgmt)/[account]/new/job/schema/page.tsx | 135 +++++++++++++++++- 2 files changed, 134 insertions(+), 6 deletions(-) diff --git a/frontend/apps/web/app/(mgmt)/[account]/jobs/[id]/source/components/DataSyncConnectionCard.tsx b/frontend/apps/web/app/(mgmt)/[account]/jobs/[id]/source/components/DataSyncConnectionCard.tsx index 8b6cd95fb8..659a111dba 100644 --- a/frontend/apps/web/app/(mgmt)/[account]/jobs/[id]/source/components/DataSyncConnectionCard.tsx +++ b/frontend/apps/web/app/(mgmt)/[account]/jobs/[id]/source/components/DataSyncConnectionCard.tsx @@ -488,11 +488,6 @@ export default function DataSyncConnectionCard({ jobId }: Props): ReactElement { index: number, transformer: JobMappingTransformerForm ): void { - // form.setValue(`mappings.${index}.transformer`, transformer, { - // shouldDirty: true, - // shouldTouch: true, - // shouldValidate: false, // this is intentional! - // }); const val = form.getValues(`mappings.${index}`); update(index, { schema: val.schema, diff --git a/frontend/apps/web/app/(mgmt)/[account]/new/job/schema/page.tsx b/frontend/apps/web/app/(mgmt)/[account]/new/job/schema/page.tsx index bd0c5a93d1..f06d1f0971 100644 --- a/frontend/apps/web/app/(mgmt)/[account]/new/job/schema/page.tsx +++ b/frontend/apps/web/app/(mgmt)/[account]/new/job/schema/page.tsx @@ -10,14 +10,19 @@ import { SchemaTable, } from '@/components/jobs/SchemaTable/SchemaTable'; import { getSchemaConstraintHandler } from '@/components/jobs/SchemaTable/schema-constraint-handler'; +import { TransformerResult } from '@/components/jobs/SchemaTable/transformer-handler'; +import { getTransformerFilter } from '@/components/jobs/SchemaTable/util'; import { useAccount } from '@/components/providers/account-provider'; import SkeletonForm from '@/components/skeleton/SkeletonForm'; import { PageProps } from '@/components/types'; import { Button } from '@/components/ui/button'; import { Form } from '@/components/ui/form'; +import { useGetTransformersHandler } from '@/libs/hooks/useGetTransformersHandler'; import { getSingleOrUndefined } from '@/libs/utils'; -import { getErrorMessage } from '@/util/util'; +import { getErrorMessage, getTransformerFromField } from '@/util/util'; import { + convertJobMappingTransformerToForm, + JobMappingTransformerForm, SchemaFormValues, SchemaFormValuesDestinationOptions, VirtualForeignConstraintFormValues, @@ -29,9 +34,13 @@ import { Connection, DatabaseColumn, ForeignConstraintTables, + GenerateDefault, GetConnectionSchemaMapRequest, GetConnectionSchemaMapsResponse, + JobMappingTransformer, + Passthrough, PrimaryConstraint, + TransformerConfig, ValidateJobMappingsResponse, VirtualForeignConstraint, VirtualForeignKey, @@ -54,6 +63,7 @@ import { useSessionStorage } from 'usehooks-ts'; import { useOnImportMappings } from '../../../jobs/[id]/source/components/useOnImportMappings'; import { getDestinationDetailsRecord, + getFilteredTransformersForBulkSet, getOnSelectedTableToggle, isConnectionSubsettable, isDynamoDBConnection, @@ -406,6 +416,10 @@ export default function Page({ searchParams }: PageProps): ReactElement { setSelectedTables: setSelectedTables, }); + const { handler, isLoading, isValidating } = useGetTransformersHandler( + account?.id ?? '' + ); + if (isConnectionLoading || isSchemaMapLoading) { return ; } @@ -427,6 +441,86 @@ export default function Page({ searchParams }: PageProps): ReactElement { })) : []; + function getAvailableTransformers(idx: number): TransformerResult { + const row = formMappings[idx]; + return handler.getFilteredTransformers( + getTransformerFilter( + schemaConstraintHandler, + { + schema: row.schema, + table: row.table, + column: row.column, + }, + 'sync' + ) + ); + } + + function onTransformerUpdate( + index: number, + transformer: JobMappingTransformerForm + ): void { + const val = form.getValues(`mappings.${index}`); + update(index, { + schema: val.schema, + table: val.table, + column: val.column, + transformer, + }); + } + + function onApplyDefaultClick(override: boolean): void { + const formMappings = form.getValues('mappings'); + formMappings.forEach((fm, idx) => { + // skips setting the default transformer if the user has already set the transformer + if (fm.transformer.config.case && !override) { + return; + } else { + const colkey = { + schema: fm.schema, + table: fm.table, + column: fm.column, + }; + const isGenerated = schemaConstraintHandler.getIsGenerated(colkey); + const identityType = schemaConstraintHandler.getIdentityType(colkey); + const newJm = + isGenerated && !identityType + ? new JobMappingTransformer({ + config: new TransformerConfig({ + config: { + case: 'generateDefaultConfig', + value: new GenerateDefault(), + }, + }), + }) + : new JobMappingTransformer({ + config: new TransformerConfig({ + config: { + case: 'passthroughConfig', + value: new Passthrough(), + }, + }), + }); + onTransformerUpdate(idx, convertJobMappingTransformerToForm(newJm)); + } + }); + setTimeout(() => { + form.trigger('mappings'); + }, 0); + } + + function onTransformerBulkUpdate( + indices: number[], + config: JobMappingTransformerForm + ): void { + indices.forEach((idx) => { + onTransformerUpdate(idx, config); + }); + setTimeout(() => { + form.trigger('mappings'); + }, 0); + } + return (
@@ -595,6 +689,24 @@ export default function Page({ searchParams }: PageProps): ReactElement { )} destinationOptions={form.watch('destinationOptions')} onImportMappingsClick={onImportMappingsClick} + getAvailableTransformers={getAvailableTransformers} + getTransformerFromField={(idx) => { + const row = formMappings[idx]; + return getTransformerFromField(handler, row.transformer); + }} + getAvailableTransformersForBulk={(rows) => { + return getFilteredTransformersForBulkSet( + rows, + handler, + schemaConstraintHandler, + 'sync' + ); + }} + getTransformerFromFieldValue={(fvalue) => { + return getTransformerFromField(handler, fvalue); + }} + onApplyDefaultClick={onApplyDefaultClick} + onTransformerBulkUpdate={onTransformerBulkUpdate} /> )} @@ -618,6 +730,27 @@ export default function Page({ searchParams }: PageProps): ReactElement { addVirtualForeignKey={addVirtualForeignKey} removeVirtualForeignKey={removeVirtualForeignKey} onImportMappingsClick={onImportMappingsClick} + onTransformerUpdate={(idx, cfg) => { + onTransformerUpdate(idx, cfg); + }} + getAvailableTransformers={getAvailableTransformers} + getTransformerFromField={(idx) => { + const row = formMappings[idx]; + return getTransformerFromField(handler, row.transformer); + }} + getAvailableTransformersForBulk={(rows) => { + return getFilteredTransformersForBulkSet( + rows, + handler, + schemaConstraintHandler, + 'sync' + ); + }} + getTransformerFromFieldValue={(fvalue) => { + return getTransformerFromField(handler, fvalue); + }} + onApplyDefaultClick={onApplyDefaultClick} + onTransformerBulkUpdate={onTransformerBulkUpdate} /> )}