Skip to content

Commit 4f79bee

Browse files
committed
chore(folders): drop unused color/isExpanded columns from the generic folder table
- color: set on create/duplicate but never rendered anywhere -- no color picker, no consumer that used it beyond the recently-deleted icon tint, which always fell back to the same default anyway - isExpanded: the real expand/collapse state lives entirely in the folders Zustand store (in-memory, not even persisted across reloads) -- the DB column was written on create/update but never read to drive any UI - locked stays: it's the actual mechanism behind workflow folder lock-cascade Migration hand-edited (not yet shipped anywhere) to drop both columns and their backfill inserts; verified end-to-end against a fresh Postgres container (full 0000-0258 apply + seeded-data backfill/trigger check).
1 parent 9db00ad commit 4f79bee

22 files changed

Lines changed: 23 additions & 143 deletions

File tree

apps/sim/app/api/folders/[id]/duplicate/route.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const POST = withRouteHandler(
4444
try {
4545
const parsed = await parseRequest(duplicateFolderContract, req, context)
4646
if (!parsed.success) return parsed.response
47-
const { name, workspaceId, parentId, color, newId: clientNewId } = parsed.data.body
47+
const { name, workspaceId, parentId, newId: clientNewId } = parsed.data.body
4848

4949
logger.info(`[${requestId}] Duplicating folder ${sourceFolderId} for user ${session.user.id}`)
5050

@@ -130,10 +130,8 @@ export const POST = withRouteHandler(
130130
userId: session.user.id,
131131
workspaceId: targetWorkspaceId,
132132
name: deduplicatedName,
133-
color: color || sourceFolder.color,
134133
parentId: targetParentId,
135134
sortOrder,
136-
isExpanded: false,
137135
locked: false,
138136
createdAt: now,
139137
updatedAt: now,
@@ -366,10 +364,8 @@ async function duplicateFolderStructure(
366364
userId,
367365
workspaceId: targetWorkspaceId,
368366
name: childFolder.name,
369-
color: childFolder.color,
370367
parentId: newParentFolderId,
371368
sortOrder: childFolder.sortOrder,
372-
isExpanded: false,
373369
locked: false,
374370
createdAt: timestamp,
375371
updatedAt: timestamp,

apps/sim/app/api/folders/[id]/route.test.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ const mockFolder = {
7777
userId: TEST_USER.id,
7878
workspaceId: 'workspace-123',
7979
parentId: null,
80-
color: '#6B7280',
8180
sortOrder: 1,
8281
createdAt: new Date('2024-01-01T00:00:00Z'),
8382
updatedAt: new Date('2024-01-01T00:00:00Z'),
@@ -181,9 +180,7 @@ describe('Individual Folder API Route', () => {
181180
...mockFolder,
182181
id: params.folderId,
183182
name: params.name !== undefined ? params.name.trim() : 'Updated Folder',
184-
color: params.color ?? mockFolder.color,
185183
parentId: params.parentId ?? mockFolder.parentId,
186-
isExpanded: params.isExpanded,
187184
sortOrder: params.sortOrder ?? mockFolder.sortOrder,
188185
updatedAt: new Date(),
189186
},
@@ -198,7 +195,6 @@ describe('Individual Folder API Route', () => {
198195

199196
const req = createMockRequest('PUT', {
200197
name: 'Updated Folder Name',
201-
color: '#FF0000',
202198
})
203199
const params = Promise.resolve({ id: 'folder-1' })
204200

apps/sim/app/api/folders/[id]/route.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const PUT = withRouteHandler(
3939
if (!parsed.success) return parsed.response
4040

4141
const { id } = parsed.data.params
42-
const { name, color, isExpanded, locked, parentId, sortOrder } = parsed.data.body
42+
const { name, locked, parentId, sortOrder } = parsed.data.body
4343

4444
// Verify the folder exists
4545
const existingFolder = await db
@@ -95,8 +95,6 @@ export const PUT = withRouteHandler(
9595
workspaceId: existingFolder.workspaceId,
9696
userId: session.user.id,
9797
name,
98-
color,
99-
isExpanded,
10098
locked,
10199
parentId,
102100
sortOrder,

apps/sim/app/api/folders/route.test.ts

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,7 @@ const mockDb = db as any
5050

5151
interface CapturedFolderValues {
5252
name?: string
53-
color?: string
5453
parentId?: string | null
55-
isExpanded?: boolean
5654
sortOrder?: number
5755
updatedAt?: Date
5856
}
@@ -104,8 +102,6 @@ describe('Folders API Route', () => {
104102
userId: 'user-123',
105103
workspaceId: 'workspace-123',
106104
parentId: null,
107-
color: '#6B7280',
108-
isExpanded: true,
109105
sortOrder: 0,
110106
createdAt: new Date('2023-01-01T00:00:00.000Z'),
111107
updatedAt: new Date('2023-01-01T00:00:00.000Z'),
@@ -117,8 +113,6 @@ describe('Folders API Route', () => {
117113
userId: 'user-123',
118114
workspaceId: 'workspace-123',
119115
parentId: 'folder-1',
120-
color: '#EF4444',
121-
isExpanded: false,
122116
sortOrder: 1,
123117
createdAt: new Date('2023-01-02T00:00:00.000Z'),
124118
updatedAt: new Date('2023-01-02T00:00:00.000Z'),
@@ -312,7 +306,6 @@ describe('Folders API Route', () => {
312306
resourceType: 'workflow',
313307
name: 'New Test Folder',
314308
workspaceId: 'workspace-123',
315-
color: '#6B7280',
316309
})
317310

318311
const response = await POST(req)
@@ -597,36 +590,5 @@ describe('Folders API Route', () => {
597590
expect(capturedValues).not.toBeNull()
598591
expect(capturedValues!.name).toBe('Test Folder With Spaces')
599592
})
600-
601-
it('should use default color when not provided', async () => {
602-
mockAuthenticatedUser()
603-
604-
let capturedValues: CapturedFolderValues | null = null
605-
606-
mockTransaction.mockImplementationOnce(
607-
createMockTransaction({
608-
selectResults: [[], []],
609-
insertResult: [mockFolders[0]],
610-
onInsertValues: (values) => {
611-
capturedValues = values
612-
},
613-
})
614-
)
615-
mockValues.mockImplementationOnce((values: CapturedFolderValues) => {
616-
capturedValues = values
617-
return { returning: mockReturning }
618-
})
619-
620-
const req = createMockRequest('POST', {
621-
resourceType: 'workflow',
622-
name: 'Test Folder',
623-
workspaceId: 'workspace-123',
624-
})
625-
626-
await POST(req)
627-
628-
expect(capturedValues).not.toBeNull()
629-
expect(capturedValues!.color).toBe('#6B7280')
630-
})
631593
})
632594
})

apps/sim/app/api/folders/route.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
6868
name,
6969
workspaceId,
7070
parentId,
71-
color,
7271
sortOrder: providedSortOrder,
7372
} = parsed.data.body
7473

@@ -94,7 +93,6 @@ export const POST = withRouteHandler(async (request: NextRequest) => {
9493
workspaceId,
9594
name,
9695
parentId,
97-
color,
9896
sortOrder: providedSortOrder,
9997
})
10098

apps/sim/app/api/v1/admin/types.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ export interface AdminFolder {
156156
id: string
157157
name: string
158158
parentId: string | null
159-
color: string | null
160159
sortOrder: number
161160
createdAt: string
162161
updatedAt: string
@@ -167,7 +166,6 @@ export function toAdminFolder(dbFolder: DbWorkflowFolder): AdminFolder {
167166
id: dbFolder.id,
168167
name: dbFolder.name,
169168
parentId: dbFolder.parentId,
170-
color: dbFolder.color,
171169
sortOrder: dbFolder.sortOrder,
172170
createdAt: dbFolder.createdAt.toISOString(),
173171
updatedAt: dbFolder.updatedAt.toISOString(),

apps/sim/app/workspace/[workspaceId]/lib/prefetch.test.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ describe('workspace list prefetches', () => {
7575
userId: 'u-1',
7676
workspaceId: WORKSPACE_ID,
7777
parentId: null,
78-
color: null,
79-
isExpanded: true,
8078
locked: false,
8179
sortOrder: 0,
8280
createdAt: '2026-01-01T00:00:00.000Z',
@@ -124,8 +122,6 @@ describe('workspace list prefetches', () => {
124122
userId: 'u-1',
125123
workspaceId: WORKSPACE_ID,
126124
parentId: null,
127-
color: null,
128-
isExpanded: true,
129125
locked: false,
130126
sortOrder: 0,
131127
createdAt: '2026-01-01T00:00:00.000Z',
@@ -147,11 +143,9 @@ describe('workspace list prefetches', () => {
147143
folderKeys.list(WORKSPACE_ID, 'workflow', 'active')
148144
) as Array<{
149145
id: string
150-
color: string
151146
createdAt: Date
152147
}>
153148
expect(cachedFolders).toHaveLength(1)
154-
expect(cachedFolders[0].color).toBe('#6B7280')
155149
expect(cachedFolders[0].createdAt).toBeInstanceOf(Date)
156150
expect(client.getQueryData(workspaceFilesKeys.list(WORKSPACE_ID, 'active'))).toEqual(files)
157151
})

apps/sim/app/workspace/[workspaceId]/settings/components/recently-deleted/recently-deleted.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ interface DeletedResource {
102102
type: Exclude<ResourceType, 'all'>
103103
deletedAt: Date
104104
workspaceId: string
105-
color?: string
106105
}
107106

108107
interface RestoredResourceEntry {
@@ -141,8 +140,7 @@ function ResourceIcon({ resource }: { resource: DeletedResource }) {
141140
resource.type === 'table_folder' ||
142141
resource.type === 'knowledge_base_folder'
143142
) {
144-
const color = resource.color ?? '#6B7280'
145-
return <Folder className={ICON_CLASS} style={{ color }} />
143+
return <Folder className={`${ICON_CLASS} text-[var(--text-icon)]`} />
146144
}
147145

148146
const mothershipType = RESOURCE_TYPE_TO_MOTHERSHIP[resource.type]
@@ -266,7 +264,6 @@ export function RecentlyDeleted() {
266264
type: 'folder',
267265
deletedAt: folder.deletedAt ? new Date(folder.deletedAt) : new Date(folder.updatedAt),
268266
workspaceId: folder.workspaceId,
269-
color: folder.color,
270267
})
271268
}
272269

@@ -317,7 +314,6 @@ export function RecentlyDeleted() {
317314
type: 'table_folder',
318315
deletedAt: tf.deletedAt ? new Date(tf.deletedAt) : new Date(tf.updatedAt),
319316
workspaceId: tf.workspaceId,
320-
color: tf.color,
321317
})
322318
}
323319

@@ -328,7 +324,6 @@ export function RecentlyDeleted() {
328324
type: 'knowledge_base_folder',
329325
deletedAt: kf.deletedAt ? new Date(kf.deletedAt) : new Date(kf.updatedAt),
330326
workspaceId: kf.workspaceId,
331-
color: kf.color,
332327
})
333328
}
334329

apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-folder.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ export function useDuplicateFolder({ workspaceId, folderIds, onSuccess }: UseDup
7979
workspaceId,
8080
name: duplicateName,
8181
parentId: folder.parentId,
82-
color: folder.color,
8382
newId: generateId(),
8483
})
8584
const newFolderId = result?.id

apps/sim/app/workspace/[workspaceId]/w/hooks/use-duplicate-selection.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ export function useDuplicateSelection({ workspaceId, onSuccess }: UseDuplicateSe
8989
workspaceId: workspaceIdRef.current,
9090
name: duplicateName,
9191
parentId: folder.parentId,
92-
color: folder.color,
9392
newId: generateId(),
9493
})
9594

0 commit comments

Comments
 (0)