@swovohq/fuel 0.2.2-alpha.92 → 0.2.2-alpha.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +107 -11
- package/dist/bin/fuel.js +61 -0
- package/dist/bin/fuel.js.map +1 -1
- package/dist/commands/generate-module.d.ts +7 -0
- package/dist/commands/generate-module.d.ts.map +1 -0
- package/dist/commands/generate-module.js +180 -0
- package/dist/commands/generate-module.js.map +1 -0
- package/dist/generators/module/index.d.ts +7 -0
- package/dist/generators/module/index.d.ts.map +1 -0
- package/dist/generators/module/index.js +86 -0
- package/dist/generators/module/index.js.map +1 -0
- package/dist/generators/module/register.d.ts +4 -0
- package/dist/generators/module/register.d.ts.map +1 -0
- package/dist/generators/module/register.js +124 -0
- package/dist/generators/module/register.js.map +1 -0
- package/dist/generators/module/render.d.ts +10 -0
- package/dist/generators/module/render.d.ts.map +1 -0
- package/dist/generators/module/render.js +19 -0
- package/dist/generators/module/render.js.map +1 -0
- package/dist/generators/module/skill.d.ts +3 -0
- package/dist/generators/module/skill.d.ts.map +1 -0
- package/dist/generators/module/skill.js +223 -0
- package/dist/generators/module/skill.js.map +1 -0
- package/dist/generators/module/templates/api.d.ts +14 -0
- package/dist/generators/module/templates/api.d.ts.map +1 -0
- package/dist/generators/module/templates/api.js +363 -0
- package/dist/generators/module/templates/api.js.map +1 -0
- package/dist/generators/module/templates/types-pkg.d.ts +7 -0
- package/dist/generators/module/templates/types-pkg.d.ts.map +1 -0
- package/dist/generators/module/templates/types-pkg.js +56 -0
- package/dist/generators/module/templates/types-pkg.js.map +1 -0
- package/dist/generators/module/templates/web.d.ts +16 -0
- package/dist/generators/module/templates/web.d.ts.map +1 -0
- package/dist/generators/module/templates/web.js +573 -0
- package/dist/generators/module/templates/web.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.webTemplates = void 0;
|
|
4
|
+
exports.webTemplates = {
|
|
5
|
+
apiEndpoints: `import { PaginatedResponse, PaginationOptions } from '@fuel/common-types'
|
|
6
|
+
import { BASE_API_URL } from './constants'
|
|
7
|
+
import { handleResponse } from './utils'
|
|
8
|
+
|
|
9
|
+
export type { __MODULE_PASCAL__Item } from '@fuel/__MODULE_KEBAB__-types'
|
|
10
|
+
import type { __MODULE_PASCAL__Item } from '@fuel/__MODULE_KEBAB__-types'
|
|
11
|
+
|
|
12
|
+
export const Get__MODULE_PASCAL__ItemsEndpoint = async (
|
|
13
|
+
payload: {
|
|
14
|
+
client: typeof fetch
|
|
15
|
+
sort?: string
|
|
16
|
+
} & PaginationOptions
|
|
17
|
+
): Promise<PaginatedResponse<__MODULE_PASCAL__Item>> => {
|
|
18
|
+
const { client, current, limit, sort, search } = payload
|
|
19
|
+
|
|
20
|
+
const queryParams = new URLSearchParams({
|
|
21
|
+
current: current.toString(),
|
|
22
|
+
limit: limit.toString(),
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
if (sort) queryParams.append('sort', sort)
|
|
26
|
+
if (search) queryParams.append('search', search)
|
|
27
|
+
|
|
28
|
+
return client(
|
|
29
|
+
\`\${BASE_API_URL}/v1/__MODULE_KEBAB__?\${queryParams.toString()}\`,
|
|
30
|
+
{
|
|
31
|
+
method: 'GET',
|
|
32
|
+
headers: { 'Content-Type': 'application/json' },
|
|
33
|
+
credentials: 'include',
|
|
34
|
+
},
|
|
35
|
+
).then((response) => handleResponse(response))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const Create__MODULE_PASCAL__ItemEndpoint = async (payload: {
|
|
39
|
+
client: typeof fetch
|
|
40
|
+
name: string
|
|
41
|
+
}): Promise<__MODULE_PASCAL__Item> => {
|
|
42
|
+
const { client, ...body } = payload
|
|
43
|
+
return client(\`\${BASE_API_URL}/v1/__MODULE_KEBAB__\`, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: { 'Content-Type': 'application/json' },
|
|
46
|
+
credentials: 'include',
|
|
47
|
+
body: JSON.stringify(body),
|
|
48
|
+
}).then((response) => handleResponse(response))
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const Update__MODULE_PASCAL__ItemEndpoint = async (payload: {
|
|
52
|
+
client: typeof fetch
|
|
53
|
+
id: string
|
|
54
|
+
name?: string
|
|
55
|
+
}): Promise<__MODULE_PASCAL__Item> => {
|
|
56
|
+
const { client, id, ...body } = payload
|
|
57
|
+
return client(\`\${BASE_API_URL}/v1/__MODULE_KEBAB__/\${id}\`, {
|
|
58
|
+
method: 'PUT',
|
|
59
|
+
headers: { 'Content-Type': 'application/json' },
|
|
60
|
+
credentials: 'include',
|
|
61
|
+
body: JSON.stringify(body),
|
|
62
|
+
}).then((response) => handleResponse(response))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const Delete__MODULE_PASCAL__ItemEndpoint = async (payload: {
|
|
66
|
+
client: typeof fetch
|
|
67
|
+
id: string
|
|
68
|
+
}): Promise<void> => {
|
|
69
|
+
const { client, id } = payload
|
|
70
|
+
return client(\`\${BASE_API_URL}/v1/__MODULE_KEBAB__/\${id}\`, {
|
|
71
|
+
method: 'DELETE',
|
|
72
|
+
headers: { 'Content-Type': 'application/json' },
|
|
73
|
+
credentials: 'include',
|
|
74
|
+
}).then((response) => handleResponse(response))
|
|
75
|
+
}
|
|
76
|
+
`,
|
|
77
|
+
useItemsHook: `import { useQuery } from '@tanstack/react-query'
|
|
78
|
+
import {
|
|
79
|
+
Get__MODULE_PASCAL__ItemsEndpoint,
|
|
80
|
+
type __MODULE_PASCAL__Item,
|
|
81
|
+
} from '../../api/__MODULE_KEBAB__'
|
|
82
|
+
import { usePagination } from '../shared/usePagination'
|
|
83
|
+
import type { PaginatedResponse } from '@fuel/common-types'
|
|
84
|
+
|
|
85
|
+
export const use__MODULE_PASCAL__Items = ({
|
|
86
|
+
sort,
|
|
87
|
+
search,
|
|
88
|
+
page = 1,
|
|
89
|
+
limit = 10,
|
|
90
|
+
}: {
|
|
91
|
+
sort?: string
|
|
92
|
+
search?: string
|
|
93
|
+
page?: number
|
|
94
|
+
limit?: number
|
|
95
|
+
}) => {
|
|
96
|
+
const __MODULE_CAMEL__Pagination = usePagination({ current: page, limit })
|
|
97
|
+
const { current, limit: perPage } = __MODULE_CAMEL__Pagination
|
|
98
|
+
|
|
99
|
+
const query = useQuery({
|
|
100
|
+
queryKey: [
|
|
101
|
+
'__MODULE_KEBAB__-items',
|
|
102
|
+
{ sort, search, page: current, limit: perPage },
|
|
103
|
+
],
|
|
104
|
+
queryFn: () =>
|
|
105
|
+
Get__MODULE_PASCAL__ItemsEndpoint({
|
|
106
|
+
client: fetch,
|
|
107
|
+
sort,
|
|
108
|
+
search,
|
|
109
|
+
current,
|
|
110
|
+
limit: perPage,
|
|
111
|
+
}),
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
__MODULE_CAMEL__Pagination,
|
|
116
|
+
refetch__MODULE_PASCAL__Items: query.refetch,
|
|
117
|
+
__MODULE_CAMEL__ItemsState: {
|
|
118
|
+
isLoading: query.isPending,
|
|
119
|
+
isError: query.isError,
|
|
120
|
+
error: query.error as Error,
|
|
121
|
+
data: query.data as PaginatedResponse<__MODULE_PASCAL__Item> | undefined,
|
|
122
|
+
},
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
`,
|
|
126
|
+
useCreateHook: `import { useMutation, useQueryClient } from '@tanstack/react-query'
|
|
127
|
+
import {
|
|
128
|
+
Create__MODULE_PASCAL__ItemEndpoint,
|
|
129
|
+
type __MODULE_PASCAL__Item,
|
|
130
|
+
} from '../../api/__MODULE_KEBAB__'
|
|
131
|
+
|
|
132
|
+
export const useCreate__MODULE_PASCAL__Item = () => {
|
|
133
|
+
const queryClient = useQueryClient()
|
|
134
|
+
|
|
135
|
+
const mutation = useMutation({
|
|
136
|
+
mutationFn: Create__MODULE_PASCAL__ItemEndpoint,
|
|
137
|
+
onSuccess: () => {
|
|
138
|
+
queryClient.invalidateQueries({ queryKey: ['__MODULE_KEBAB__-items'] })
|
|
139
|
+
},
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
create__MODULE_PASCAL__Item: (name: string): Promise<__MODULE_PASCAL__Item> =>
|
|
144
|
+
mutation.mutateAsync({ client: fetch, name }),
|
|
145
|
+
create__MODULE_PASCAL__ItemState: {
|
|
146
|
+
isLoading: mutation.isPending,
|
|
147
|
+
isError: mutation.isError,
|
|
148
|
+
error: mutation.error as Error,
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
`,
|
|
153
|
+
useUpdateHook: `import { useMutation, useQueryClient } from '@tanstack/react-query'
|
|
154
|
+
import {
|
|
155
|
+
Update__MODULE_PASCAL__ItemEndpoint,
|
|
156
|
+
type __MODULE_PASCAL__Item,
|
|
157
|
+
} from '../../api/__MODULE_KEBAB__'
|
|
158
|
+
|
|
159
|
+
export const useUpdate__MODULE_PASCAL__Item = () => {
|
|
160
|
+
const queryClient = useQueryClient()
|
|
161
|
+
|
|
162
|
+
const mutation = useMutation({
|
|
163
|
+
mutationFn: Update__MODULE_PASCAL__ItemEndpoint,
|
|
164
|
+
onSuccess: () => {
|
|
165
|
+
queryClient.invalidateQueries({ queryKey: ['__MODULE_KEBAB__-items'] })
|
|
166
|
+
},
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
update__MODULE_PASCAL__Item: (id: string, name: string): Promise<__MODULE_PASCAL__Item> =>
|
|
171
|
+
mutation.mutateAsync({ client: fetch, id, name }),
|
|
172
|
+
update__MODULE_PASCAL__ItemState: {
|
|
173
|
+
isLoading: mutation.isPending,
|
|
174
|
+
isError: mutation.isError,
|
|
175
|
+
error: mutation.error as Error,
|
|
176
|
+
},
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
`,
|
|
180
|
+
useDeleteHook: `import { useMutation, useQueryClient } from '@tanstack/react-query'
|
|
181
|
+
import { Delete__MODULE_PASCAL__ItemEndpoint } from '../../api/__MODULE_KEBAB__'
|
|
182
|
+
|
|
183
|
+
export const useDelete__MODULE_PASCAL__Item = () => {
|
|
184
|
+
const queryClient = useQueryClient()
|
|
185
|
+
|
|
186
|
+
const mutation = useMutation({
|
|
187
|
+
mutationFn: Delete__MODULE_PASCAL__ItemEndpoint,
|
|
188
|
+
onSuccess: () => {
|
|
189
|
+
queryClient.invalidateQueries({ queryKey: ['__MODULE_KEBAB__-items'] })
|
|
190
|
+
},
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
delete__MODULE_PASCAL__Item: (id: string): Promise<void> =>
|
|
195
|
+
mutation.mutateAsync({ client: fetch, id }),
|
|
196
|
+
delete__MODULE_PASCAL__ItemState: {
|
|
197
|
+
isLoading: mutation.isPending,
|
|
198
|
+
isError: mutation.isError,
|
|
199
|
+
error: mutation.error as Error,
|
|
200
|
+
},
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
`,
|
|
204
|
+
context: `'use client'
|
|
205
|
+
|
|
206
|
+
import {
|
|
207
|
+
type ColumnDef,
|
|
208
|
+
type Table,
|
|
209
|
+
getCoreRowModel,
|
|
210
|
+
useReactTable,
|
|
211
|
+
} from '@tanstack/react-table'
|
|
212
|
+
import { parseAsInteger, parseAsString, useQueryState } from 'nuqs'
|
|
213
|
+
import React, { useContext } from 'react'
|
|
214
|
+
import { use__MODULE_PASCAL__Items } from '@/hooks/__MODULE_KEBAB__/use-__MODULE_KEBAB__-items'
|
|
215
|
+
import { useCreate__MODULE_PASCAL__Item } from '@/hooks/__MODULE_KEBAB__/use-create-__MODULE_KEBAB__-item'
|
|
216
|
+
import { useUpdate__MODULE_PASCAL__Item } from '@/hooks/__MODULE_KEBAB__/use-update-__MODULE_KEBAB__-item'
|
|
217
|
+
import { useDelete__MODULE_PASCAL__Item } from '@/hooks/__MODULE_KEBAB__/use-delete-__MODULE_KEBAB__-item'
|
|
218
|
+
import type { __MODULE_PASCAL__Item } from '@/api/__MODULE_KEBAB__'
|
|
219
|
+
|
|
220
|
+
export type State = {
|
|
221
|
+
table: Table<__MODULE_PASCAL__Item>
|
|
222
|
+
isLoading: boolean
|
|
223
|
+
isError: boolean
|
|
224
|
+
error: Error | null
|
|
225
|
+
totalCount: number | undefined
|
|
226
|
+
refetch: () => void
|
|
227
|
+
create__MODULE_PASCAL__Item: (name: string) => Promise<__MODULE_PASCAL__Item>
|
|
228
|
+
update__MODULE_PASCAL__Item: (id: string, name: string) => Promise<__MODULE_PASCAL__Item>
|
|
229
|
+
delete__MODULE_PASCAL__Item: (id: string) => Promise<void>
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const __MODULE_PASCAL__Context = React.createContext<State | undefined>(undefined)
|
|
233
|
+
|
|
234
|
+
export const __MODULE_PASCAL__ContextProvider = ({
|
|
235
|
+
children,
|
|
236
|
+
}: {
|
|
237
|
+
children: React.ReactNode
|
|
238
|
+
}) => {
|
|
239
|
+
const [page] = useQueryState('__MODULE_CAMEL___page', parseAsInteger.withDefault(1))
|
|
240
|
+
const [limit] = useQueryState('__MODULE_CAMEL___limit', parseAsInteger.withDefault(10))
|
|
241
|
+
const [search] = useQueryState('__MODULE_CAMEL___q', parseAsString.withDefault(''))
|
|
242
|
+
const [sort] = useQueryState('__MODULE_CAMEL___sort', parseAsString.withDefault(''))
|
|
243
|
+
|
|
244
|
+
const { __MODULE_CAMEL__ItemsState, refetch__MODULE_PASCAL__Items } = use__MODULE_PASCAL__Items({
|
|
245
|
+
sort: sort || undefined,
|
|
246
|
+
search: search || undefined,
|
|
247
|
+
page,
|
|
248
|
+
limit,
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
const { create__MODULE_PASCAL__Item } = useCreate__MODULE_PASCAL__Item()
|
|
252
|
+
const { update__MODULE_PASCAL__Item } = useUpdate__MODULE_PASCAL__Item()
|
|
253
|
+
const { delete__MODULE_PASCAL__Item } = useDelete__MODULE_PASCAL__Item()
|
|
254
|
+
|
|
255
|
+
const columns: ColumnDef<__MODULE_PASCAL__Item>[] = [
|
|
256
|
+
{
|
|
257
|
+
accessorKey: 'name',
|
|
258
|
+
header: 'Name',
|
|
259
|
+
cell: ({ row }) => <span>{row.original.name}</span>,
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
accessorKey: 'createdAt',
|
|
263
|
+
header: 'Created',
|
|
264
|
+
cell: ({ row }) => (
|
|
265
|
+
<span>{new Date(row.original.createdAt).toLocaleDateString()}</span>
|
|
266
|
+
),
|
|
267
|
+
},
|
|
268
|
+
]
|
|
269
|
+
|
|
270
|
+
const table = useReactTable({
|
|
271
|
+
data: __MODULE_CAMEL__ItemsState.data?.data ?? [],
|
|
272
|
+
columns,
|
|
273
|
+
pageCount: (__MODULE_CAMEL__ItemsState.data as any)?.totalPages ?? 0,
|
|
274
|
+
state: {},
|
|
275
|
+
getCoreRowModel: getCoreRowModel(),
|
|
276
|
+
manualPagination: true,
|
|
277
|
+
manualSorting: true,
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
return (
|
|
281
|
+
<__MODULE_PASCAL__Context.Provider
|
|
282
|
+
value={{
|
|
283
|
+
table,
|
|
284
|
+
isLoading: __MODULE_CAMEL__ItemsState.isLoading,
|
|
285
|
+
isError: __MODULE_CAMEL__ItemsState.isError,
|
|
286
|
+
error: __MODULE_CAMEL__ItemsState.error ?? null,
|
|
287
|
+
totalCount: (__MODULE_CAMEL__ItemsState.data as any)?.totalCount,
|
|
288
|
+
refetch: refetch__MODULE_PASCAL__Items,
|
|
289
|
+
create__MODULE_PASCAL__Item,
|
|
290
|
+
update__MODULE_PASCAL__Item,
|
|
291
|
+
delete__MODULE_PASCAL__Item,
|
|
292
|
+
}}
|
|
293
|
+
>
|
|
294
|
+
{children}
|
|
295
|
+
</__MODULE_PASCAL__Context.Provider>
|
|
296
|
+
)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
export const use__MODULE_PASCAL__Context = () => {
|
|
300
|
+
const ctx = useContext(__MODULE_PASCAL__Context)
|
|
301
|
+
if (!ctx) {
|
|
302
|
+
throw new Error(
|
|
303
|
+
'use__MODULE_PASCAL__Context must be used within __MODULE_PASCAL__ContextProvider',
|
|
304
|
+
)
|
|
305
|
+
}
|
|
306
|
+
return ctx
|
|
307
|
+
}
|
|
308
|
+
`,
|
|
309
|
+
table: `'use client'
|
|
310
|
+
|
|
311
|
+
import { flexRender } from '@tanstack/react-table'
|
|
312
|
+
import { use__MODULE_PASCAL__Context } from './__MODULE_KEBAB__-context'
|
|
313
|
+
|
|
314
|
+
export const __MODULE_PASCAL__Table = () => {
|
|
315
|
+
const { table, isLoading } = use__MODULE_PASCAL__Context()
|
|
316
|
+
|
|
317
|
+
if (isLoading) {
|
|
318
|
+
return <div className="p-4 text-sm text-muted-foreground">Loading...</div>
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return (
|
|
322
|
+
<div className="w-full overflow-auto">
|
|
323
|
+
<table className="w-full text-sm">
|
|
324
|
+
<thead>
|
|
325
|
+
{table.getHeaderGroups().map((headerGroup) => (
|
|
326
|
+
<tr key={headerGroup.id} className="border-b">
|
|
327
|
+
{headerGroup.headers.map((header) => (
|
|
328
|
+
<th
|
|
329
|
+
key={header.id}
|
|
330
|
+
className="px-4 py-2 text-left font-medium text-muted-foreground"
|
|
331
|
+
>
|
|
332
|
+
{header.isPlaceholder
|
|
333
|
+
? null
|
|
334
|
+
: flexRender(
|
|
335
|
+
header.column.columnDef.header,
|
|
336
|
+
header.getContext(),
|
|
337
|
+
)}
|
|
338
|
+
</th>
|
|
339
|
+
))}
|
|
340
|
+
</tr>
|
|
341
|
+
))}
|
|
342
|
+
</thead>
|
|
343
|
+
<tbody>
|
|
344
|
+
{table.getRowModel().rows.length === 0 ? (
|
|
345
|
+
<tr>
|
|
346
|
+
<td
|
|
347
|
+
colSpan={table.getAllColumns().length}
|
|
348
|
+
className="px-4 py-8 text-center text-muted-foreground"
|
|
349
|
+
>
|
|
350
|
+
No items found.
|
|
351
|
+
</td>
|
|
352
|
+
</tr>
|
|
353
|
+
) : (
|
|
354
|
+
table.getRowModel().rows.map((row) => (
|
|
355
|
+
<tr key={row.id} className="border-b hover:bg-muted/50">
|
|
356
|
+
{row.getVisibleCells().map((cell) => (
|
|
357
|
+
<td key={cell.id} className="px-4 py-2">
|
|
358
|
+
{flexRender(cell.column.columnDef.cell, cell.getContext())}
|
|
359
|
+
</td>
|
|
360
|
+
))}
|
|
361
|
+
</tr>
|
|
362
|
+
))
|
|
363
|
+
)}
|
|
364
|
+
</tbody>
|
|
365
|
+
</table>
|
|
366
|
+
</div>
|
|
367
|
+
)
|
|
368
|
+
}
|
|
369
|
+
`,
|
|
370
|
+
createDrawer: `'use client'
|
|
371
|
+
|
|
372
|
+
import { zodResolver } from '@hookform/resolvers/zod'
|
|
373
|
+
import React from 'react'
|
|
374
|
+
import { useForm } from 'react-hook-form'
|
|
375
|
+
import { z } from 'zod'
|
|
376
|
+
import { use__MODULE_PASCAL__Context } from './__MODULE_KEBAB__-context'
|
|
377
|
+
|
|
378
|
+
const formSchema = z.object({
|
|
379
|
+
name: z.string().min(1, 'Name is required'),
|
|
380
|
+
})
|
|
381
|
+
|
|
382
|
+
type FormValues = z.infer<typeof formSchema>
|
|
383
|
+
|
|
384
|
+
interface Props {
|
|
385
|
+
open: boolean
|
|
386
|
+
onOpenChange: (open: boolean) => void
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
export const Create__MODULE_PASCAL__ItemDrawer = ({ open, onOpenChange }: Props) => {
|
|
390
|
+
const { create__MODULE_PASCAL__Item, refetch } = use__MODULE_PASCAL__Context()
|
|
391
|
+
|
|
392
|
+
const form = useForm<FormValues>({
|
|
393
|
+
resolver: zodResolver(formSchema),
|
|
394
|
+
defaultValues: { name: '' },
|
|
395
|
+
})
|
|
396
|
+
|
|
397
|
+
const onSubmit = async (values: FormValues) => {
|
|
398
|
+
await create__MODULE_PASCAL__Item(values.name)
|
|
399
|
+
form.reset()
|
|
400
|
+
onOpenChange(false)
|
|
401
|
+
refetch()
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
if (!open) return null
|
|
405
|
+
|
|
406
|
+
// TODO: Replace with Drawer/Sheet from @fuel/design-system following the
|
|
407
|
+
// pattern in apps/web/src/components/teams/invitations/invite-member-drawer.tsx
|
|
408
|
+
return (
|
|
409
|
+
<div className="fixed inset-0 z-50 flex items-end justify-center sm:items-center">
|
|
410
|
+
<div className="bg-background rounded-lg border p-6 shadow-lg sm:w-full sm:max-w-md">
|
|
411
|
+
<h2 className="mb-4 text-lg font-semibold">Create __MODULE_PASCAL__ Item</h2>
|
|
412
|
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
|
|
413
|
+
<div>
|
|
414
|
+
<label htmlFor="name" className="block text-sm font-medium">
|
|
415
|
+
Name
|
|
416
|
+
</label>
|
|
417
|
+
<input
|
|
418
|
+
id="name"
|
|
419
|
+
{...form.register('name')}
|
|
420
|
+
className="mt-1 block w-full rounded border px-3 py-2 text-sm"
|
|
421
|
+
placeholder="Enter a name"
|
|
422
|
+
/>
|
|
423
|
+
{form.formState.errors.name && (
|
|
424
|
+
<p className="mt-1 text-sm text-destructive">
|
|
425
|
+
{form.formState.errors.name.message}
|
|
426
|
+
</p>
|
|
427
|
+
)}
|
|
428
|
+
</div>
|
|
429
|
+
<div className="flex justify-end gap-2">
|
|
430
|
+
<button
|
|
431
|
+
type="button"
|
|
432
|
+
onClick={() => onOpenChange(false)}
|
|
433
|
+
className="rounded px-4 py-2 text-sm"
|
|
434
|
+
>
|
|
435
|
+
Cancel
|
|
436
|
+
</button>
|
|
437
|
+
<button
|
|
438
|
+
type="submit"
|
|
439
|
+
disabled={form.formState.isSubmitting}
|
|
440
|
+
className="rounded bg-primary px-4 py-2 text-sm text-primary-foreground"
|
|
441
|
+
>
|
|
442
|
+
{form.formState.isSubmitting ? 'Creating...' : 'Create'}
|
|
443
|
+
</button>
|
|
444
|
+
</div>
|
|
445
|
+
</form>
|
|
446
|
+
</div>
|
|
447
|
+
</div>
|
|
448
|
+
)
|
|
449
|
+
}
|
|
450
|
+
`,
|
|
451
|
+
updateDrawer: `'use client'
|
|
452
|
+
|
|
453
|
+
import { zodResolver } from '@hookform/resolvers/zod'
|
|
454
|
+
import React from 'react'
|
|
455
|
+
import { useForm } from 'react-hook-form'
|
|
456
|
+
import { z } from 'zod'
|
|
457
|
+
import { use__MODULE_PASCAL__Context } from './__MODULE_KEBAB__-context'
|
|
458
|
+
import type { __MODULE_PASCAL__Item } from '@/api/__MODULE_KEBAB__'
|
|
459
|
+
|
|
460
|
+
const formSchema = z.object({
|
|
461
|
+
name: z.string().min(1, 'Name is required'),
|
|
462
|
+
})
|
|
463
|
+
|
|
464
|
+
type FormValues = z.infer<typeof formSchema>
|
|
465
|
+
|
|
466
|
+
interface Props {
|
|
467
|
+
item: __MODULE_PASCAL__Item | null
|
|
468
|
+
open: boolean
|
|
469
|
+
onOpenChange: (open: boolean) => void
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
export const Update__MODULE_PASCAL__ItemDrawer = ({ item, open, onOpenChange }: Props) => {
|
|
473
|
+
const { update__MODULE_PASCAL__Item, refetch } = use__MODULE_PASCAL__Context()
|
|
474
|
+
|
|
475
|
+
const form = useForm<FormValues>({
|
|
476
|
+
resolver: zodResolver(formSchema),
|
|
477
|
+
values: { name: item?.name ?? '' },
|
|
478
|
+
})
|
|
479
|
+
|
|
480
|
+
const onSubmit = async (values: FormValues) => {
|
|
481
|
+
if (!item) return
|
|
482
|
+
await update__MODULE_PASCAL__Item(item.id, values.name)
|
|
483
|
+
onOpenChange(false)
|
|
484
|
+
refetch()
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
if (!open || !item) return null
|
|
488
|
+
|
|
489
|
+
// TODO: Replace with Drawer/Sheet from @fuel/design-system following the
|
|
490
|
+
// pattern in apps/web/src/components/teams/invitations/invite-member-drawer.tsx
|
|
491
|
+
return (
|
|
492
|
+
<div className="fixed inset-0 z-50 flex items-end justify-center sm:items-center">
|
|
493
|
+
<div className="bg-background rounded-lg border p-6 shadow-lg sm:w-full sm:max-w-md">
|
|
494
|
+
<h2 className="mb-4 text-lg font-semibold">Update __MODULE_PASCAL__ Item</h2>
|
|
495
|
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
|
|
496
|
+
<div>
|
|
497
|
+
<label htmlFor="name" className="block text-sm font-medium">
|
|
498
|
+
Name
|
|
499
|
+
</label>
|
|
500
|
+
<input
|
|
501
|
+
id="name"
|
|
502
|
+
{...form.register('name')}
|
|
503
|
+
className="mt-1 block w-full rounded border px-3 py-2 text-sm"
|
|
504
|
+
placeholder="Enter a name"
|
|
505
|
+
/>
|
|
506
|
+
{form.formState.errors.name && (
|
|
507
|
+
<p className="mt-1 text-sm text-destructive">
|
|
508
|
+
{form.formState.errors.name.message}
|
|
509
|
+
</p>
|
|
510
|
+
)}
|
|
511
|
+
</div>
|
|
512
|
+
<div className="flex justify-end gap-2">
|
|
513
|
+
<button
|
|
514
|
+
type="button"
|
|
515
|
+
onClick={() => onOpenChange(false)}
|
|
516
|
+
className="rounded px-4 py-2 text-sm"
|
|
517
|
+
>
|
|
518
|
+
Cancel
|
|
519
|
+
</button>
|
|
520
|
+
<button
|
|
521
|
+
type="submit"
|
|
522
|
+
disabled={form.formState.isSubmitting}
|
|
523
|
+
className="rounded bg-primary px-4 py-2 text-sm text-primary-foreground"
|
|
524
|
+
>
|
|
525
|
+
{form.formState.isSubmitting ? 'Saving...' : 'Save'}
|
|
526
|
+
</button>
|
|
527
|
+
</div>
|
|
528
|
+
</form>
|
|
529
|
+
</div>
|
|
530
|
+
</div>
|
|
531
|
+
)
|
|
532
|
+
}
|
|
533
|
+
`,
|
|
534
|
+
index: `export {
|
|
535
|
+
__MODULE_PASCAL__ContextProvider,
|
|
536
|
+
use__MODULE_PASCAL__Context,
|
|
537
|
+
type State as __MODULE_PASCAL__ContextState,
|
|
538
|
+
} from './__MODULE_KEBAB__-context'
|
|
539
|
+
export { __MODULE_PASCAL__Table } from './__MODULE_KEBAB__-table'
|
|
540
|
+
export { Create__MODULE_PASCAL__ItemDrawer } from './create-__MODULE_KEBAB__-item-drawer'
|
|
541
|
+
export { Update__MODULE_PASCAL__ItemDrawer } from './update-__MODULE_KEBAB__-item-drawer'
|
|
542
|
+
`,
|
|
543
|
+
page: `import { __MODULE_PASCAL__ClientLayout } from './__MODULE_KEBAB__-client-layout'
|
|
544
|
+
|
|
545
|
+
export default function __MODULE_PASCAL__Page() {
|
|
546
|
+
return <__MODULE_PASCAL__ClientLayout />
|
|
547
|
+
}
|
|
548
|
+
`,
|
|
549
|
+
layout: `export default function __MODULE_PASCAL__Layout({
|
|
550
|
+
children,
|
|
551
|
+
}: {
|
|
552
|
+
children: React.ReactNode
|
|
553
|
+
}) {
|
|
554
|
+
return <>{children}</>
|
|
555
|
+
}
|
|
556
|
+
`,
|
|
557
|
+
clientLayout: `'use client'
|
|
558
|
+
|
|
559
|
+
import { __MODULE_PASCAL__ContextProvider } from '@/components/__MODULE_KEBAB__'
|
|
560
|
+
import { __MODULE_PASCAL__Table } from '@/components/__MODULE_KEBAB__/__MODULE_KEBAB__-table'
|
|
561
|
+
|
|
562
|
+
export const __MODULE_PASCAL__ClientLayout = () => {
|
|
563
|
+
return (
|
|
564
|
+
<__MODULE_PASCAL__ContextProvider>
|
|
565
|
+
<div className="bg-background flex h-full w-full flex-col p-6">
|
|
566
|
+
<__MODULE_PASCAL__Table />
|
|
567
|
+
</div>
|
|
568
|
+
</__MODULE_PASCAL__ContextProvider>
|
|
569
|
+
)
|
|
570
|
+
}
|
|
571
|
+
`,
|
|
572
|
+
};
|
|
573
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../../src/generators/module/templates/web.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG;IAC1B,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEf;IAEC,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDf;IAEC,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhB;IAEC,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhB;IAEC,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;CAuBhB;IAEC,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwGV;IAEC,KAAK,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DR;IAEC,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgFf;IAEC,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkFf;IAEC,KAAK,EAAE;;;;;;;;CAQR;IAEC,IAAI,EAAE;;;;;CAKP;IAEC,MAAM,EAAE;;;;;;;CAOT;IAEC,YAAY,EAAE;;;;;;;;;;;;;;CAcf;CACA,CAAA"}
|