Skip to content

Commit e94e8a2

Browse files
feat(app,api) add new border type glass option (#611)
* feat: add glass border type option * feat: add borderType property * feat: api schema validation borderType * fix types * update types * fix lint and integration test * update styles * Add border type select * update window style form settings icon
1 parent 9e537bc commit e94e8a2

File tree

29 files changed

+165
-13
lines changed

29 files changed

+165
-13
lines changed

.changeset/red-zoos-march.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@codeimage/api": minor
3+
"@codeimage/app": minor
4+
---
5+
6+
feat(app,api) add new border type glass option
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- AlterTable
2+
ALTER TABLE "SnippetTerminal" ADD COLUMN "borderType" TEXT;

apps/api/prisma/schema.prisma

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ model SnippetTerminal {
6262
showGlassReflection Boolean @default(false)
6363
opacity Float @default(100)
6464
alternativeTheme Boolean @default(false)
65+
borderType String?
6566
}
6667

6768
model SnippetEditorOptions {

apps/api/src/common/typebox/enum.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {TString, Type} from '@sinclair/typebox';
2+
3+
export const enumLiteral = <T extends string>(values: T[]): TString => {
4+
const literals = values.map(value => Type.Literal(value));
5+
// TODO: validation should work but type must work as a string...
6+
return Type.Intersect([
7+
Type.Union(literals),
8+
Type.String(),
9+
]) as unknown as TString;
10+
};

apps/api/src/modules/project/infra/prisma/prisma-project.repository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ export function makePrismaProjectRepository(
105105
showWatermark: data.terminal.showWatermark,
106106
textColor: data.terminal.textColor,
107107
type: data.terminal.type,
108+
borderType: data.terminal.borderType,
108109
},
109110
},
110111
},
@@ -188,6 +189,7 @@ export function makePrismaProjectRepository(
188189
showWatermark: data.terminal.showWatermark,
189190
textColor: data.terminal.textColor,
190191
type: data.terminal.type,
192+
borderType: data.terminal.borderType,
191193
},
192194
},
193195
},

apps/api/src/modules/project/mapper/create-project-mapper.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export function createProjectRequestMapper(
4848
data.terminal.alternativeTheme ??
4949
SnippetTerminalCreateRequestSchema.properties.alternativeTheme.default,
5050
shadow: data.terminal.shadow ?? null,
51+
borderType: data.terminal.borderType ?? null,
5152
},
5253
editorOptions: {
5354
fontWeight: data.editorOptions.fontWeight,

apps/api/src/modules/project/mapper/get-project-by-id-mapper.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export function createCompleteProjectGetByIdResponseMapper(
3030
accentVisible: data.terminal.accentVisible,
3131
alternativeTheme: data.terminal.alternativeTheme,
3232
shadow: data.terminal.shadow,
33+
borderType: data.terminal.borderType as 'glass' | null,
3334
},
3435
editorOptions: {
3536
id: data.editorOptions.id,

apps/api/src/modules/project/schema/project-create.schema.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {Static, Type} from '@sinclair/typebox';
22
import {Nullable} from '../../../common/typebox/nullable.js';
3+
import {SnippetTerminalBorderType} from './project.schema.js';
34

45
export const SnippetFrameCreateRequestSchema = Type.Object(
56
{
@@ -45,6 +46,7 @@ export const SnippetTerminalCreateRequestSchema = Type.Object(
4546
opacity: Nullable(Type.Number({minimum: 0, maximum: 100, default: 100})),
4647
showHeader: Type.Boolean(),
4748
showWatermark: Nullable(Type.Boolean({default: true})),
49+
borderType: Nullable(SnippetTerminalBorderType),
4850
},
4951
{title: 'SnippetTerminalCreateRequest'},
5052
);

apps/api/src/modules/project/schema/project-update.schema.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {Static, Type} from '@sinclair/typebox';
22
import {Nullable} from '../../../common/typebox/nullable.js';
3+
import {SnippetTerminalBorderType} from './project.schema.js';
34

45
export const SnippetFrameUpdateRequestSchema = Type.Object(
56
{
@@ -40,6 +41,7 @@ const SnippetTerminalUpdateRequestSchema = Type.Object(
4041
showWatermark: Type.Boolean(),
4142
textColor: Nullable(Type.String()),
4243
type: Type.String(),
44+
borderType: Nullable(SnippetTerminalBorderType),
4345
},
4446
{title: 'SnippetTerminalUpdateRequest'},
4547
);

apps/api/src/modules/project/schema/project.schema.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {Type} from '@sinclair/typebox';
2+
import {enumLiteral} from '../../../common/typebox/enum.js';
23
import {Nullable} from '../../../common/typebox/nullable.js';
34

45
export const BaseProjectResponseSchema = Type.Object(
@@ -34,6 +35,8 @@ export const BaseSnippetFrameSchema = Type.Object({
3435
opacity: Type.Number(),
3536
});
3637

38+
export const SnippetTerminalBorderType = enumLiteral(['glass'] as const);
39+
3740
export const BaseSnippetTerminalSchema = Type.Object({
3841
id: Type.String({format: 'uuid'}),
3942
showHeader: Type.Boolean(),
@@ -46,6 +49,7 @@ export const BaseSnippetTerminalSchema = Type.Object({
4649
showGlassReflection: Type.Boolean(),
4750
opacity: Type.Number(),
4851
alternativeTheme: Type.Boolean(),
52+
borderType: Nullable(SnippetTerminalBorderType),
4953
});
5054

5155
export const BaseSnippetEditorOptionsSchema = Type.Object({

0 commit comments

Comments
 (0)