Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions .Jules/bolt.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
## 2025-06-27 - [Map Initialization Overhead]
**Learning:** Initializing Maps with `new Map(array.map(...))` creates unnecessary intermediate arrays, consuming memory and triggering garbage collection overhead, especially noticeable when dealing with many nodes.
**Action:** Use a `for...of` loop to directly `map.set()` elements rather than creating an intermediate array of tuples, especially in frequently executed or rendering paths.

## 2024-07-13 - Optimize Data Dictionary Export Algorithm
**Learning:** Found an O(N * C * E) bottleneck in `frontend/src/erd/exportDataDictionary.ts` where `isForeignKeyColumn` did an `edges.some()` search per column inside a loop over nodes and columns.
**Action:** When writing complex export algorithms over a large graph (Nodes + Edges), always pre-compute search spaces using Maps or Sets (e.g. `fkHandles`) upfront (O(E)) to achieve O(1) lookups during deeply nested loops (O(N * C + E)).
6 changes: 3 additions & 3 deletions .Jules/palette.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,6 @@
## 2026-07-10 - Accessibility Anti-pattern: Excessive Tab Stops
**Learning:** Adding `tabIndex={0}` to static, non-interactive text badges (like `abbr` or `span`) just to expose their `title` or `aria-label` attributes to keyboard users is an accessibility anti-pattern. It creates excessive tab stops and severely degrades keyboard navigation for users who rely on tab to move through actionable elements.
**Action:** Never add `tabIndex={0}` to non-interactive elements unless they are specifically designed to be focusable for a functional reason. Use proper semantic HTML or let the screen reader read adjacent elements as part of natural navigation.
## 2024-07-13 - Modal Close Button Unification
**Learning:** Standardizing close buttons ('X') across disparate modal dialogs improves visual consistency and provides clear, predictable click targets, while preserving accessibility through existing `aria-label` attributes.
**Action:** Reused the existing `exportModal__iconButton` CSS class instead of creating a new one to adhere strictly to constraints. Refrained from running global formatters to prevent out-of-scope line modifications.
## 2024-07-12 - [Accessibility] Unique aria-labels in dynamic lists
**Learning:** Screen readers cannot differentiate generic labels (like '컬럼명' or 'PK') when they repeat in dynamic lists or tables. Providing a static aria-label inside a mapped array causes screen readers to announce identical generic labels across different rows.
**Action:** Always prepend or append a uniquely identifiable name (e.g., prepending the row's specific item name) to the 'aria-label' attribute of interactive elements inside dynamic lists so screen readers can correctly distinguish between them.
24 changes: 4 additions & 20 deletions backend/app/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,7 @@ class IndexRedundancyOut(BaseModel):
class DiagramViewCreateIn(BaseModel):
"""Request body for saving an ERD canvas view."""

name: str = Field(
min_length=1,
max_length=200,
pattern=r"^[^\x00-\x1F\x7F]+$",
)
name: str = Field(min_length=1, max_length=200)
# Opaque client layout (node positions, hidden tables, viewport). The API
# bounds the serialized size in the endpoint to prevent abuse.
layout_json: dict
Expand All @@ -218,16 +214,8 @@ class DiagramViewDetailOut(DiagramViewOut):
class TableAnnotationUpsertIn(BaseModel):
"""Request body for creating/updating a table annotation."""

schema_name: str = Field(
min_length=1,
max_length=255,
pattern=r"^[^\x00-\x1F\x7F]+$",
)
relation_name: str = Field(
min_length=1,
max_length=255,
pattern=r"^[^\x00-\x1F\x7F]+$",
)
schema_name: str = Field(min_length=1, max_length=255)
relation_name: str = Field(min_length=1, max_length=255)
body: str = Field(min_length=1, max_length=10_000)


Expand Down Expand Up @@ -314,11 +302,7 @@ class DbmlConvertOut(BaseModel):
class ApiKeyCreateIn(BaseModel):
"""Request body for creating an API key."""

key_name: str = Field(
min_length=1,
max_length=128,
pattern=r"^[^\x00-\x1F\x7F]+$",
)
key_name: str = Field(min_length=1, max_length=128)


class ApiKeyOut(BaseModel):
Expand Down
5 changes: 0 additions & 5 deletions frontend/.dockerignore

This file was deleted.

Loading
Loading