11import { create } from '@bufbuild/protobuf' ;
2- import { createClient } from '@connectrpc/connect' ;
32import { createConnectQueryKey , createProtobufSafeUpdater , createQueryOptions } from '@connectrpc/connect-query' ;
43import { useQueryClient , useSuspenseQueries } from '@tanstack/react-query' ;
54import { useRouteContext } from '@tanstack/react-router' ;
65import { getCoreRowModel , useReactTable } from '@tanstack/react-table' ;
76import CodeMirror from '@uiw/react-codemirror' ;
8- import { Match , pipe , Struct } from 'effect' ;
9- import { useMemo , useState } from 'react' ;
7+ import { Match , pipe } from 'effect' ;
8+ import { useState } from 'react' ;
109
1110import {
1211 BodyFormItemListItem ,
1312 BodyKind ,
14- BodyService ,
1513 BodyUrlEncodedItemListItem ,
1614} from '@the-dev-tools/spec/collection/item/body/v1/body_pb' ;
1715import {
@@ -42,12 +40,14 @@ import { CodeMirrorMarkupLanguage, CodeMirrorMarkupLanguages, useCodeMirrorExten
4240import {
4341 ColumnActionDelete ,
4442 columnActions ,
43+ ColumnActionUndoDelta ,
4544 columnCheckboxField ,
4645 columnTextField ,
4746 columnTextFieldWithReference ,
48- makeGenericDeltaFormTableColumns ,
4947 makeGenericDisplayTableColumns ,
48+ ReactTableNoMemo ,
5049 useDeltaFormTable ,
50+ useDeltaItems ,
5151 useFormTable ,
5252} from './form-table' ;
5353
@@ -136,6 +136,13 @@ const FormDisplayTable = ({ exampleId }: FormDisplayTableProps) => {
136136 return < DataTable table = { table } wrapperClassName = { tw `col-span-full` } /> ;
137137} ;
138138
139+ const formDataColumns = [
140+ columnCheckboxField < BodyFormItemListItem > ( 'enabled' , { meta : { divider : false } } ) ,
141+ columnTextFieldWithReference < BodyFormItemListItem > ( 'key' ) ,
142+ columnTextFieldWithReference < BodyFormItemListItem > ( 'value' ) ,
143+ columnTextField < BodyFormItemListItem > ( 'description' , { meta : { divider : false } } ) ,
144+ ] ;
145+
139146interface FormDataTableProps {
140147 exampleId : Uint8Array ;
141148}
@@ -150,10 +157,7 @@ const FormDataTable = ({ exampleId }: FormDataTableProps) => {
150157
151158 const table = useReactTable ( {
152159 columns : [
153- columnCheckboxField < BodyFormItemListItem > ( 'enabled' , { meta : { divider : false } } ) ,
154- columnTextFieldWithReference < BodyFormItemListItem > ( 'key' ) ,
155- columnTextFieldWithReference < BodyFormItemListItem > ( 'value' ) ,
156- columnTextField < BodyFormItemListItem > ( 'description' , { meta : { divider : false } } ) ,
160+ ...formDataColumns ,
157161 columnActions < BodyFormItemListItem > ( {
158162 cell : ( { row } ) => < ColumnActionDelete input = { { bodyId : row . original . bodyId } } schema = { bodyFormItemDelete } /> ,
159163 } ) ,
@@ -180,14 +184,16 @@ interface FormDeltaDataTableProps {
180184
181185const FormDeltaDataTable = ( { deltaExampleId, exampleId } : FormDeltaDataTableProps ) => {
182186 const { transport } = useRouteContext ( { from : '__root__' } ) ;
183- const requestService = useMemo ( ( ) => createClient ( BodyService , transport ) , [ transport ] ) ;
187+
188+ const { mutateAsync : create } = useConnectMutation ( bodyFormItemCreate ) ;
189+ const { mutateAsync : update } = useConnectMutation ( bodyFormItemUpdate ) ;
184190
185191 const [
186192 {
187- data : { items } ,
193+ data : { items : itemsBase } ,
188194 } ,
189195 {
190- data : { items : deltaItems } ,
196+ data : { items : itemsDelta } ,
191197 } ,
192198 ] = useSuspenseQueries ( {
193199 queries : [
@@ -196,24 +202,41 @@ const FormDeltaDataTable = ({ deltaExampleId, exampleId }: FormDeltaDataTablePro
196202 ] ,
197203 } ) ;
198204
199- const table = useDeltaFormTable ( {
200- columns : makeGenericDeltaFormTableColumns < BodyFormItemListItem > ( ) ,
201- deltaItems,
202- getParentId : ( _ ) => _ . parentBodyId ! ,
203- items,
204- onCreate : ( _ ) =>
205- requestService
206- . bodyFormItemCreate ( {
207- ...Struct . omit ( _ , '$typeName' ) ,
208- exampleId : deltaExampleId ,
209- parentBodyId : _ . bodyId ,
210- } )
211- . then ( ( _ ) => _ . bodyId ) ,
212- onDelete : ( _ ) => requestService . bodyFormItemDelete ( Struct . omit ( _ , '$typeName' ) ) ,
213- onUpdate : ( _ ) => requestService . bodyFormItemUpdate ( Struct . omit ( _ , '$typeName' ) ) ,
205+ const items = useDeltaItems ( {
206+ getId : ( _ ) => _ . bodyId . toString ( ) ,
207+ getParentId : ( _ ) => _ . parentBodyId ?. toString ( ) ,
208+ itemsBase,
209+ itemsDelta,
214210 } ) ;
215211
216- return < DataTable table = { table } wrapperClassName = { tw `col-span-full` } /> ;
212+ const formTable = useDeltaFormTable < BodyFormItemListItem > ( {
213+ getParentId : ( _ ) => _ . parentBodyId ?. toString ( ) ,
214+ onCreate : ( { $typeName : _ , bodyId, ...item } ) =>
215+ create ( { ...item , exampleId : deltaExampleId , parentBodyId : bodyId } ) ,
216+ onUpdate : ( { $typeName : _ , ...item } ) => update ( item ) ,
217+ } ) ;
218+
219+ return (
220+ < ReactTableNoMemo
221+ columns = { [
222+ ...formDataColumns ,
223+ columnActions < BodyFormItemListItem > ( {
224+ cell : ( { row } ) => (
225+ < ColumnActionUndoDelta
226+ hasDelta = { row . original . parentBodyId !== undefined }
227+ input = { { bodyId : row . original . bodyId } }
228+ schema = { bodyFormItemDelete }
229+ />
230+ ) ,
231+ } ) ,
232+ ] }
233+ data = { items }
234+ getCoreRowModel = { getCoreRowModel ( ) }
235+ getRowId = { ( _ ) => ( _ . parentBodyId ?? _ . bodyId ) . toString ( ) }
236+ >
237+ { ( table ) => < DataTable { ...formTable } table = { table } wrapperClassName = { tw `col-span-full` } /> }
238+ </ ReactTableNoMemo >
239+ ) ;
217240} ;
218241
219242interface UrlEncodedDisplayTableProps {
@@ -234,6 +257,13 @@ const UrlEncodedDisplayTable = ({ exampleId }: UrlEncodedDisplayTableProps) => {
234257 return < DataTable table = { table } wrapperClassName = { tw `col-span-full` } /> ;
235258} ;
236259
260+ const urlEncodedDataColumns = [
261+ columnCheckboxField < BodyUrlEncodedItemListItem > ( 'enabled' , { meta : { divider : false } } ) ,
262+ columnTextFieldWithReference < BodyUrlEncodedItemListItem > ( 'key' ) ,
263+ columnTextFieldWithReference < BodyUrlEncodedItemListItem > ( 'value' ) ,
264+ columnTextField < BodyUrlEncodedItemListItem > ( 'description' , { meta : { divider : false } } ) ,
265+ ] ;
266+
237267interface UrlEncodedFormTableProps {
238268 exampleId : Uint8Array ;
239269}
@@ -248,10 +278,7 @@ const UrlEncodedFormTable = ({ exampleId }: UrlEncodedFormTableProps) => {
248278
249279 const table = useReactTable ( {
250280 columns : [
251- columnCheckboxField < BodyUrlEncodedItemListItem > ( 'enabled' , { meta : { divider : false } } ) ,
252- columnTextFieldWithReference < BodyUrlEncodedItemListItem > ( 'key' ) ,
253- columnTextFieldWithReference < BodyUrlEncodedItemListItem > ( 'value' ) ,
254- columnTextField < BodyUrlEncodedItemListItem > ( 'description' , { meta : { divider : false } } ) ,
281+ ...urlEncodedDataColumns ,
255282 columnActions < BodyUrlEncodedItemListItem > ( {
256283 cell : ( { row } ) => (
257284 < ColumnActionDelete input = { { bodyId : row . original . bodyId } } schema = { bodyUrlEncodedItemDelete } />
@@ -280,14 +307,16 @@ interface UrlEncodedDeltaFormTableProps {
280307
281308const UrlEncodedDeltaFormTable = ( { deltaExampleId, exampleId } : UrlEncodedDeltaFormTableProps ) => {
282309 const { transport } = useRouteContext ( { from : '__root__' } ) ;
283- const requestService = useMemo ( ( ) => createClient ( BodyService , transport ) , [ transport ] ) ;
310+
311+ const { mutateAsync : create } = useConnectMutation ( bodyUrlEncodedItemCreate ) ;
312+ const { mutateAsync : update } = useConnectMutation ( bodyUrlEncodedItemUpdate ) ;
284313
285314 const [
286315 {
287- data : { items } ,
316+ data : { items : itemsBase } ,
288317 } ,
289318 {
290- data : { items : deltaItems } ,
319+ data : { items : itemsDelta } ,
291320 } ,
292321 ] = useSuspenseQueries ( {
293322 queries : [
@@ -296,24 +325,41 @@ const UrlEncodedDeltaFormTable = ({ deltaExampleId, exampleId }: UrlEncodedDelta
296325 ] ,
297326 } ) ;
298327
299- const table = useDeltaFormTable ( {
300- columns : makeGenericDeltaFormTableColumns < BodyUrlEncodedItemListItem > ( ) ,
301- deltaItems,
302- getParentId : ( _ ) => _ . parentBodyId ! ,
303- items,
304- onCreate : ( _ ) =>
305- requestService
306- . bodyUrlEncodedItemCreate ( {
307- ...Struct . omit ( _ , '$typeName' ) ,
308- exampleId : deltaExampleId ,
309- parentBodyId : _ . bodyId ,
310- } )
311- . then ( ( _ ) => _ . bodyId ) ,
312- onDelete : ( _ ) => requestService . bodyUrlEncodedItemDelete ( Struct . omit ( _ , '$typeName' ) ) ,
313- onUpdate : ( _ ) => requestService . bodyUrlEncodedItemUpdate ( Struct . omit ( _ , '$typeName' ) ) ,
328+ const items = useDeltaItems ( {
329+ getId : ( _ ) => _ . bodyId . toString ( ) ,
330+ getParentId : ( _ ) => _ . parentBodyId ?. toString ( ) ,
331+ itemsBase,
332+ itemsDelta,
314333 } ) ;
315334
316- return < DataTable table = { table } wrapperClassName = { tw `col-span-full` } /> ;
335+ const formTable = useDeltaFormTable < BodyUrlEncodedItemListItem > ( {
336+ getParentId : ( _ ) => _ . parentBodyId ?. toString ( ) ,
337+ onCreate : ( { $typeName : _ , bodyId, ...item } ) =>
338+ create ( { ...item , exampleId : deltaExampleId , parentBodyId : bodyId } ) ,
339+ onUpdate : ( { $typeName : _ , ...item } ) => update ( item ) ,
340+ } ) ;
341+
342+ return (
343+ < ReactTableNoMemo
344+ columns = { [
345+ ...urlEncodedDataColumns ,
346+ columnActions < BodyUrlEncodedItemListItem > ( {
347+ cell : ( { row } ) => (
348+ < ColumnActionUndoDelta
349+ hasDelta = { row . original . parentBodyId !== undefined }
350+ input = { { bodyId : row . original . bodyId } }
351+ schema = { bodyFormItemDelete }
352+ />
353+ ) ,
354+ } ) ,
355+ ] }
356+ data = { items }
357+ getCoreRowModel = { getCoreRowModel ( ) }
358+ getRowId = { ( _ ) => ( _ . parentBodyId ?? _ . bodyId ) . toString ( ) }
359+ >
360+ { ( table ) => < DataTable { ...formTable } table = { table } wrapperClassName = { tw `col-span-full` } /> }
361+ </ ReactTableNoMemo >
362+ ) ;
317363} ;
318364
319365interface RawFormProps {
0 commit comments