Commit Graph

125 Commits

Author SHA1 Message Date
kjh2064 c634ebe501 fix(fe): useFormFieldNavigation - remove debug console.log, production-ready
Cleaned up development debugging output for production deployment.
Core form field navigation behavior (Enter key → next field, Ctrl+Enter in textarea → newline) verified and stable.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-17 12:42:27 +09:00
kjh2064 3f2a254c3d fix(fe): KsTextField - add buttons to focusable selector for Enter navigation 2026-08-16 22:26:16 +09:00
kjh2064 aa7a92a66b fix(fe): KsTextField - simplify Enter navigation, remove composable dependency
deploy / deploy (push) Failing after 46s
deploy / notify (push) Successful in 0s
2026-08-16 22:17:26 +09:00
kjh2064 9e2d2010ba feat(fe): Apply form field navigation to all input components
deploy / deploy (push) Failing after 48s
deploy / notify (push) Successful in 1s
- KsNumberField: Enter -> next field
- KsMoneyField: Enter -> next field
- KsMultiSelect: Enter (when closed) -> next field
- Complete Tab-like Enter key behavior across all form inputs
- Enables seamless form navigation with Enter key (matching grid behavior)
2026-08-16 21:58:04 +09:00
kjh2064 b12fc7411d feat(fe): Add form field navigation - Enter key moves to next field
- Create useFormFieldNavigation composable for Tab-like Enter behavior
- KsTextField: Enter -> next field
- KsTextArea: Ctrl+Enter for newline, Enter -> next field
- KsSelect: Enter -> next field after selection
- Implements standard form navigation pattern across input components
2026-08-16 21:50:50 +09:00
kjh2064 5213ea142b fix: KsDataGrid - replicate focusRow complete logic in Enter key handler
deploy / deploy (push) Failing after 48s
deploy / notify (push) Successful in 1s
- Use exact focusRow pattern: ensureIndexVisible + setFocusedCell + startEditingCell
- Apply retry logic to all three operations
- Ensures next cell gets full focus + edit mode like focusRow
2026-08-16 21:44:45 +09:00
kjh2064 eb410c8076 fix: KsDataGrid - add retry logic to Enter key edit mode like focusRow
- Apply same ensureEditMode retry pattern to onCellKeyDown
- Retry startEditingCell at 0ms, 10ms, 50ms after tabToNextCell
- Ensures next cell enters edit mode reliably after Enter key
2026-08-16 21:36:16 +09:00
kjh2064 6dacf069c7 fix: KsDataGrid - simplify Enter key handler, rely on AG Grid tabToNextCell
- Remove redundant startEditingCell calls that override AG Grid native behavior
- Use only stopEditing + tabToNextCell with setTimeout
- Let AG Grid handle edit mode auto-start for next cell
2026-08-16 21:31:24 +09:00
kjh2064 16522855a6 fix: KsDataGrid - add retry logic for Enter key edit mode
- Use multiple setTimeout attempts after tabToNextCell
- Ensures next cell enters edit mode reliably
- Matches focusRow() reliability pattern
2026-08-16 21:26:14 +09:00
kjh2064 43e239d5e4 fix: KsDataGrid - improve focusRow edit mode reliability with retry logic
- Use multiple setTimeout attempts to ensure startEditingCell succeeds
- Retry at 10ms and 50ms intervals for DOM/Grid stability
- Addresses issue where keyboard input not available after focusRow
2026-08-16 21:24:29 +09:00
kjh2064 55341661fc fix: KsDataGrid - ensure edit mode starts after focusing and Enter key navigation
- Add setTimeout in focusRow to ensure DOM updates before startEditingCell
- Add startEditingCell after tabToNextCell in Enter key handler
- Ensures smooth edit mode transition: focus → edit mode immediately
2026-08-16 21:22:40 +09:00
kjh2064 4f20ca24d2 fix: KsDataGrid - use correct cellKeyDown event handler from AgGridVue
- Remove invalid onCellKeyDown from colDef
- Add onCellKeyDown handler to AgGridVue component
- Enter key now properly triggers tabToNextCell for editable columns
2026-08-16 21:12:45 +09:00
kjh2064 28a22b1a96 feat: KsDataGrid - add explicit Enter key handling to all editable columns
- Implement onCellKeyDown callback for editable columns
- Enter key now calls tabToNextCell() like Tab key
- Addresses user request: 넥스트 셀을 네가 찾지말고 tab key와 같은 기능이 동작하면 됀다
2026-08-16 21:09:03 +09:00
kjh2064 8aad550c77 refactor: KsDataGrid - simplify focusRow and rely on AG Grid native Enter navigation 2026-08-16 21:04:41 +09:00
kjh2064 823312fd26 fix(fe): KsDataGrid - remove onCellFocused to allow Enter key navigation
deploy / deploy (push) Failing after 48s
deploy / notify (push) Successful in 0s
Problem: onCellFocused was auto-starting edit mode on every focus,
preventing AG Grid's native Enter-key navigation from working.

Solution: Remove onCellFocused function and @cell-focused event handler.

Now Enter key can properly navigate to next cell (Tab behavior).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:56:09 +09:00
kjh2064 8d52001d35 fix(fe): KsDataGrid - use AG Grid native Enter-to-Tab behavior
deploy / deploy (push) Failing after 51s
deploy / notify (push) Successful in 0s
Removed custom navigateToNextCell function and binding.
Now relies on AG Grid's native :enter-navigates-to-next-cell setting.

This allows Enter key to properly use Tab navigation as intended.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:52:23 +09:00
kjh2064 56a5eb9391 fix(fe): KsDataGrid - Enter key uses Tab navigation (suggestedNextCell)
deploy / deploy (push) Failing after 49s
deploy / notify (push) Successful in 0s
Simplified navigateToNextCell to let Enter key use default AG Grid Tab behavior.

Previous: Custom Enter navigation (next editable column only)
New: Return suggestedNextCell for Enter, which is Tab's default behavior

This makes Enter and Tab fully equivalent, consistent with user expectation.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:50:59 +09:00
kjh2064 69cee5a159 feat(fe): KsDataGrid - Enter key acts like Tab (column-only navigation)
deploy / deploy (push) Failing after 50s
deploy / notify (push) Successful in 1s
Changed Enter key behavior to move only to next editable column within same row
(no row change, just like Tab key).

Previous: Enter → next column OR next row (if last column)
New: Enter → next column only (last column does nothing)

This makes data entry more predictable and consistent with Tab behavior.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:49:57 +09:00
kjh2064 d7551dd2a4 fix(fe): KsDataGrid - add missing redrawRows method
deploy / deploy (push) Failing after 47s
deploy / notify (push) Successful in 1s
Problem: DataGridShell expects gridRef to have redrawRows() method
but KsDataGrid.vue only exposed focusRow and gridApi

Fixed:
1. Added redrawRows() function that calls gridApi.redrawRows()
2. Updated defineExpose to include redrawRows
3. Removed unused CellEditingStoppedEvent import

Result: CommonCodeManagementPage.redrawRows() calls now work

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:48:53 +09:00
kjh2064 844f1eae4a fix(fe): KsDataGrid - prevent duplicate edit mode on cell focus
deploy / deploy (push) Failing after 46s
deploy / notify (push) Successful in 0s
Improved onCellFocused to check if already editing same cell before starting edit mode.

Problem: Enter key moves to next cell + startEditingCell(), then onCellFocused fires
and tries to startEditingCell() again on same cell, causing timing issues.

Solution: Check getEditingCell() to see if we're already editing the focused cell
- If same cell: skip (already editing)
- If different cell: enter edit mode

Result: Enter key → next cell → auto edit mode (no duplication)
Tab/Click/Arrow → auto edit mode (only once)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:47:07 +09:00
kjh2064 3a1340eabd feat(fe): KsDataGrid - auto-enter edit mode on cell focus
deploy / deploy (push) Failing after 47s
deploy / notify (push) Successful in 1s
Added onCellFocused handler to automatically enter edit mode when a cell receives focus.

- Listen to @cell-focused event
- Check if column is editable
- Call startEditingCell() on focus
- Result: Tab key, arrow keys, or any navigation auto-enters edit mode

Affects: All pages using KsDataGrid with editable cells

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:43:54 +09:00
kjh2064 f3ddd4d84b fix(fe): KsDataGrid + CommonCodeManagementPage - grid edit issues
deploy / deploy (push) Failing after 48s
deploy / notify (push) Successful in 1s
Fixed 3 critical bugs in grid editing:

1. onCellValueChanged redrawRows() removal
   - Removed event.api.redrawRows() that was resetting cell input
   - Issue: redrawRows() triggered computed property re-evaluation
   - Result: Array reference changed, grid lost input value

2. ScrollApiModule registration
   - Added ScrollApiModule to ModuleRegistry
   - Issue: focusRow() called ensureIndexVisible without module
   - Result: AG Grid #200 error, page hung

3. onCellEditingStopped removal
   - Removed auto-restart of edit mode on cell exit
   - Issue: Prevented navigateToNextCell from working on Enter key
   - Result: Enter key now properly moves focus to next cell

4. CommonCodeManagementPage focusRow safety
   - Wrapped focusRow() in try-catch
   - Issue: focusRow may not be available, causing errors
   - Result: Grid continues even if focusRow unavailable

Affects: /system/common-codes grid editing and all pages using KsDataGrid

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 20:42:18 +09:00
kjh2064 1be7029f8f refactor(fe): viewport-fit zero-scroll layout for 11 pages (Part 2)
deploy / deploy (push) Failing after 51s
deploy / notify (push) Successful in 1s
## Summary
- BatchOperationsPageV2: add overflow-y: auto (ShadowRunQueue, DataQualityPage)
- ModelsList: add flex:1 + min-height:0 + overflow-y:auto
- ShadowRunList: change height to 100% (from calc(100vh - 210px))
- ModelOperationsPage: add overflow-y: auto
- WbsWorkspacePage: add flex:1 + min-height:0 + overflow-y:auto
- IngestionStatus, CommonCodeManagementPage: already fitted (via component inheritance)
- MarketDataIngestion: already fitted (EditFormPage)
- HomePage, RebalanceForm, UiStandardPage: already fitted (earlier session)

Total: 11 pages viewport-fit, 7 pages already compliant

Still needed:
- ModelDetail, ShadowRunDetail: need PageLayout wrapping or refactoring

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 15:00:03 +09:00
kjh2064 c1951dfa0e fix(fe): PageLayout - change workspace to flexbox (grid gap issue)
- Change .ks-page__workspace from grid to flex
- Reason: Grid gap calculation breaks flex: 1 height propagation
- Add flex-direction: column for proper child alignment
- Update .has-aside to use flex-direction: row

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 01:11:53 +09:00
kjh2064 bacde3f529 fix(fe): revert PageLayout to flexbox - fix grid gap calculation issue
Root cause: CSS Grid with optional (v-if) children caused inconsistent row counts.
Grid-template-rows: auto auto auto auto 1fr auto auto (7 rows) didn't match
actual child count (5-6 rows), causing 1fr collapse to 3px.

Solution: Revert to flexbox (proven stable).
- .ks-page: display: grid → display: flex; flex-direction: column
- .ks-page__workspace: add flex: 1 (replaces 1fr grid expansion)
- All flex children have min-height: 0 (height propagation chain)

Result: ShadowRunQueue grid now expands to full viewport height.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:54:19 +09:00
kjh2064 cd313ded65 fix(fe): eliminate page-level scroll via viewport-fit shell layout
Root cause (Part 2): Both KsAppShell and AppShellLayout used min-height: 100vh,
allowing flex containers to grow beyond viewport when content exceeded height.

Solution: Convert shell layouts from min-height: 100vh → height: 100vh (fixed).
Add min-height: 0 to intermediate flex containers (.ks-app-shell__container,
.ks-app-shell__main) for proper height propagation.

Changes:
- KsAppShell.vue: min-height: 100vh → height: 100vh
- KsAppShell.vue: add min-height: 0 to __container and __main
- AppShellLayout.vue: min-height: 100vh → height: 100vh (backup fix)

Tested: models-master now fits viewport perfectly, no page-level scroll.

Combined with previous PageLayout grid fix, all layout components now
follow single-screen principle: viewport-fit without overflow.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:46:17 +09:00
kjh2064 1d0fdcc013 fix(fe): PageLayout grid-based layout - eliminate flex gap height calculation error
Root cause: PageLayout's flex-direction: column + gap was not counted in flex: 1 height calculations, causing children to overflow and trigger scroll.

Solution: Convert PageLayout from flexbox to CSS Grid with explicit grid-template-rows. Grid automatically accounts for gaps in row sizing.

Changes:
- PageLayout.vue: display: flex → display: grid
- grid-template-rows: auto auto auto auto 1fr auto auto
- .ks-page__content/.ks-page__aside: height: 100% → flex: 1
- .ks-page__workspace: removed flex: 1 (grid cell, not flex)

Impact:
- models-master fits viewport without page-level scroll ✓
- All screen-types layouts auto-fit with correct height propagation
- Fix applies to all pages using PageLayout

AGENTS.md v16.0: Added Layout Rule #7 (PageLayout grid requirement)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:41:30 +09:00
kjh2064 b2aaf3ed75 fix(fe): sidebar footer alignment and scroll structure
Changes:
  • Reorganize footer: buttons first, version text below
  • Add .ks-sidebar__footer-buttons wrapper for proper layout
  • Style .ks-sidebar__version as small caption text (10px)
  • Fix sidebar scroll: sidebar overflow: hidden, nav: overflow-y: auto only
  • Add flex-shrink: 0 to footer (prevent size collapse)

This prevents:
  ✓ Nested scroll (sidebar + nav both scrolling)
  ✓ Awkward footer alignment
  ✓ Footer contributing to layout scroll

Single-scroll principle: only .nav scrolls, header/footer fixed

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:32:04 +09:00
kjh2064 d897515614 feat(fe): add app version display in sidebar footer
- Display app version (v0.1.0 or VITE_APP_VERSION) in sidebar footer
- Hidden when sidebar is collapsed
- Positioned above Help/Settings buttons

This provides system version visibility without requiring footer.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:30:54 +09:00
kjh2064 17bb6ed72d refactor(fe): centralize footer exclusion to base.css - single source of truth
Changes:
  • base.css: Add global footer hiding rule (applies to all .ks-page__footer, .ks-shell__footer, footer[class*=ks-])
  • PageLayout: Remove individual footer CSS (use global rule)
  • AppShellLayout: Remove individual footer CSS (use global rule)

Benefits:
  ✓ Single source of truth (base.css)
  ✓ Easier to maintain and update globally
  ✓ Consistent behavior across all layouts
  ✓ Can enable/disable with one change if needed
  ✓ Structure preserved (v-if, grid-areas intact)

Design principle: Single-screen + content-first
  • All controls in header/command-bar/summary
  • Recover ~48-64px per page for content
  • Mobile-friendly (no hard-to-reach footer)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:25:25 +09:00
kjh2064 2b4f043989 fix(fe): exclude all footers - maximize screen real estate
Changes:
  • PageLayout: .ks-page__footer { display: none; }
  • AppShellLayout: .ks-shell__footer { display: none; }
  • AGENTS.md: Enhanced footer policy (all levels excluded)

Policy: Single-screen principle
  ✓ NO page-level footers (PageLayout #footer)
  ✓ NO global footers (AppShellLayout footer)
  ✓ All controls → header/command-bar/summary
  ✓ Maximize content area (recover ~48-64px per page)
  ✓ Mobile-friendly (bottom footer = hard to reach)

Structure preserved (v-if, grid-areas) for backward compatibility.
CSS hiding allows future restoration if needed.

Reference: Session 2026-08-16, responsive design + content-first UX

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:24:59 +09:00
kjh2064 5e686a0613 fix(fe): complete responsive design standardization for all layouts
- DashboardLayout: breakpoint 900px → 1100px
- AppShellLayout: hardcoded 16rem → var(--ks-sidebar-width), breakpoint 900px → 1100px
- CrudWorkspaceLayout: already compliant (CSS variables + 1100px)

All 7 layouts now use:
   CSS variables (no hardcoded widths)
   Unified breakpoints (1100px tablet, 768px mobile)
   Flex: 1 / min-height: 0 height propagation

Reference: docs/FRONTEND-RESPONSIVE-DESIGN-STANDARD.md

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:16:47 +09:00
kjh2064 ffc1f5b1b5 fix(fe): responsive design standardization - CSS variables and unified breakpoints
- FormPageLayout: hardcoded minmax(18rem, 26rem) → var(--ks-preview-width)
- ReviewWorkbenchLayout: hardcoded minmax values → var(--ks-detail-width) + var(--ks-aside-width)
- OperationsConsoleLayout: hardcoded minmax(18rem, 28rem) → var(--ks-detail-width)
- Unified all breakpoints: 950px/1000px/1200px → 1100px (tablet), 768px (mobile)
- PageLayout: footer sticky overflow issue fixed (flex: 0 0 auto)

Fixes responsive design for all screen sizes (768px mobile → 1920px fullHD → 2560px 4K).
Reference: docs/FRONTEND-RESPONSIVE-DESIGN-STANDARD.md

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-16 00:12:21 +09:00
kjh2064 4d45d8c7f0 fix(fe): add height propagation to FormPageLayout - standardize form pages
- Add flex: 1; min-height: 0; height: 100% to .ks-form-layout
- Add overflow-y: auto; min-height: 0 to form/preview panes
- Ensures single-screen principle for form-based pages
- Affects: MarketDataIngestion, EditFormPage, and similar layouts
2026-08-16 00:04:56 +09:00
kjh2064 8ea0bf4d99 fix(fe): enforce single-screen viewport principle for ApprovalQueue
PRINCIPLE: First load must fit within single viewport (no scroll required,
excluding dashboard summary section).

CHANGES:
1. ReviewWorkbenchLayout.vue
   - Changed: height: calc(100vh - 220px) → height: 100%
   - Reason: calc() was hardcoded to fixed pixels, not respecting parent flex layout
   - Added: min-height: 0 (critical for flex overflow behavior)

2. ApprovalQueue.vue (.content)
   - Added: height: 100% + min-height: 0

3. ApprovalQueue.vue (.detail-panel)
   - Removed: max-height: 700px (was hard limit, causing overflow)
   - Added: height: 100% + min-height: 0

RESULT: Page now fits single viewport without scroll.
Individual panels (list, detail) maintain internal scroll as needed.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:32:03 +09:00
kjh2064 1e48b4987d style(fe): centralize filter input standardization in PageLayout
PageLayout now provides default styles for all filter inputs:
- Height: 34px
- Padding: 0 0.75rem
- Line-height: 34px
- Border-radius: 4px
- Box-sizing: border-box

This eliminates the need for each page to redefine input styles.
Individual pages now only override width constraints (search-input max-width).

Aligns with DRY principle - single source of truth for input styling.

DataQualityPage:
- Added scoped styles for search-input max-width (350px)

Future: Consider extracting filter inputs into dedicated components
(<KsFilterInput>, <KsFilterSelect>) for even better reusability.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:15:51 +09:00
kjh2064 60722576a6 style(fe): standardize filter section height across all pages
PageLayout:
- Filter section: min-height 52px (standard height)
- Display: flex with center alignment
- Consistent gap between elements

ModelsList:
- Filter container: align-items center
- Remove bottom margin (handled by PageLayout)

Ensures all pages have consistent filter bar heights
and alignment without per-page CSS adjustments.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:04:59 +09:00
kjh2064 83b8f2e72f style(fe): apply theme-aware colors to SkeletonLoader
- Light theme: neutral-100/200 with white background
- Dark theme: dark grays (2d3748/4a5568) with dark background
- Uses CSS variables for dark mode support
- Shimmer animation adapts to theme
- Automatic light/dark switching via prefers-color-scheme

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-15 23:01:43 +09:00
kjh2064 319ee354d3 style(fe): fix contrast and theme token bindings for Page Title and Command Bar in PageLayout 2026-08-15 22:34:10 +09:00
kjh2064 7ad5b96bf8 style(fe): align Page Header strictly with KBX UX Standard (Breadcrumb/Title on left, Help/AI on right) 2026-08-15 22:32:58 +09:00
kjh2064 ea2f251fb8 feat(fe): implement dedicated KBX Command Bar row in PageLayout for 100% UX Standard §3/§5 alignment 2026-08-15 22:30:58 +09:00
kjh2064 2b1dc13852 style(fe): standardize Model Operations & Versioning page UI components and layout 2026-08-15 22:28:51 +09:00
kjh2064 fe96bae516 feat(fe): implement KsSplitter with resizer handle and localStorage ratio persistence for master-detail pages 2026-08-15 22:24:23 +09:00
kjh2064 7893b2020e fix(fe): conditionally render filters slot container in MasterDetailCrudPage and BatchOperationsPageV2 2026-08-15 22:22:01 +09:00
kjh2064 292572e845 revert(fe): restore original search input bar in header 2026-08-15 22:20:36 +09:00
kjh2064 3e6f333ff8 style(fe): apply KBX Design System Side Navigation standards (Expanded 220px, Collapsed 56px, max 2-depth) 2026-08-15 22:19:49 +09:00
kjh2064 8d8355b323 style(fe): refine PageLayout filters container to inline toolbar without heavy card borders 2026-08-15 22:18:34 +09:00
kjh2064 5aeadb79c1 style(fe): restore Quick Links Toolbar in header according to user specifications 2026-08-15 22:17:52 +09:00
kjh2064 cc5b4757c4 style(fe): align tabs bar background with central canvas token var(--ks-color-canvas) 2026-08-15 22:14:36 +09:00
kjh2064 1476225c21 style(fe): standardize Tabs bar, Help button badge, and Header Quick Menu dropdown 2026-08-15 22:13:50 +09:00