generated from ttipo/project-base
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8abcaed98e | |||
| bdd42a3cb2 |
@@ -81,7 +81,7 @@ description: Vue 3 프론트엔드(frontend/) 개발 규칙 — Composition API
|
||||
> 두 포트 모두 `vite.config.ts` 가 **루트 `.env.{mode}` 에서 직접 읽는다** — 프론트 쪽에 포트를 중복 작성하지 않는다.
|
||||
|
||||
> **확장 시 따르는 규칙:**
|
||||
> - **새 사내 모듈**(캘린더·파일·ERP 등): `app-modules.ts` 에 항목을 활성화하고, 라우트 + `AppShell` 안의 모듈 패널을 메일 모듈처럼 만든다. 셸을 새로 만들지 않는다.
|
||||
> - **새 사내 모듈**(캘린더·파일 등): `app-modules.ts` 에 항목을 활성화하고, 라우트 + `AppShell` 안의 모듈 패널을 메일 모듈처럼 만든다. 셸을 새로 만들지 않는다.
|
||||
> - **새 화면**: 구현 전에 디자인 캔버스로 먼저 확인받고, 확정본을 `docs/design/` 에 둔 뒤 그 기준으로 만든다. 뱃지(안 읽음 점·개수 알약·태그)는 쓰지 않는다.
|
||||
> - **공통 컴포넌트**: `BaseButton` 패턴을 따라 `src/components/` 에 추가
|
||||
|
||||
|
||||
@@ -29,7 +29,8 @@
|
||||
## 디자인 원칙 (사용자 확정)
|
||||
|
||||
- 안 읽음 점·개수 알약·코드 태그 같은 **뱃지를 쓰지 않는다** — 굵은 글자와 평범한 숫자로 구분한다.
|
||||
- 왼쪽 **전역 앱 레일**(메일·캘린더·파일·ERP·주소록·설정)에 모듈을 계속 붙인다. 지금은 메일만 동작한다.
|
||||
- 왼쪽 **전역 앱 레일**(메일·캘린더·파일·주소록·설정)에 모듈을 계속 붙인다. 지금은 메일 · 주소록 · 설정이 동작하고 캘린더 · 파일은 "준비 중"이다.
|
||||
ERP 는 2026-11-04 사용자 요청으로 레일과 로그인 소개 글에서 뺐다 — 그 전에 그린 캔버스(`*.dc.html`)에는 남아 있다.
|
||||
- 정보 밀도가 높은 데스크톱 화면 — 기본 13px. 목록에 본문 미리보기를 넣지 않는다.
|
||||
- 분할 보기 행: 2줄(보낸 사람·시간 / 제목+첨부 클립), 약 50px
|
||||
- 목록 보기 행: 1줄 표, 38px. 칸 = 별 32 · 보낸 사람 168 · 제목(나머지) · 날짜 84 · 크기 64 (px, 칸 사이 12).
|
||||
|
||||
@@ -13,11 +13,13 @@ describe('AppRail', () => {
|
||||
return mount(AppRail, { props: { activeModule: 'mail' }, global: { plugins: [router] } })
|
||||
}
|
||||
|
||||
it('모듈 목록 하나로 그린다 — 메일 · 캘린더 · 파일 · ERP · 주소록 · 설정', async () => {
|
||||
it('모듈 목록 하나로 그린다 — 메일 · 캘린더 · 파일 · 주소록 · 설정', async () => {
|
||||
const wrapper = await mountRail()
|
||||
const labels = wrapper.findAll('.rail-item').map((item) => item.text().replace('(준비 중)', '').trim())
|
||||
|
||||
expect(labels).toEqual(APP_MODULES.map((module) => module.label))
|
||||
// 실제 목록도 그대로 본다 — ERP 칸은 2026-11-04 사용자 요청으로 뺐다(다시 넣으면 이 목록도 함께 고친다)
|
||||
expect(labels).toEqual(['메일', '캘린더', '파일', '주소록', '설정'])
|
||||
})
|
||||
|
||||
it('메일 · 주소록(8단계) · 설정이 링크이고, 지금 모듈이 현재로 표시된다', async () => {
|
||||
|
||||
@@ -376,7 +376,7 @@ void supportContactStore.ensureLoaded()
|
||||
사내 업무를<br>한 계정으로
|
||||
</p>
|
||||
<p class="login__lead">
|
||||
메일부터 시작해 캘린더, 파일 저장소, ERP까지 같은 계정으로 이어집니다.
|
||||
메일부터 시작해 캘린더와 파일 저장소까지 같은 계정으로 이어집니다.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
import type { IconName } from '@/shared/constants/icons'
|
||||
|
||||
export type AppModuleId = 'mail' | 'calendar' | 'files' | 'erp' | 'contacts' | 'settings'
|
||||
export type AppModuleId = 'mail' | 'calendar' | 'files' | 'contacts' | 'settings'
|
||||
|
||||
export interface AppModule {
|
||||
id: AppModuleId
|
||||
@@ -24,7 +24,6 @@ export const APP_MODULES: readonly AppModule[] = [
|
||||
{ id: 'mail', label: '메일', icon: 'mail', routeName: 'mail', placement: 'main' },
|
||||
{ id: 'calendar', label: '캘린더', icon: 'calendar', routeName: null, placement: 'main' },
|
||||
{ id: 'files', label: '파일', icon: 'folder', routeName: null, placement: 'main' },
|
||||
{ id: 'erp', label: 'ERP', icon: 'briefcase', routeName: null, placement: 'main' },
|
||||
// 8단계 — 주소록 (첫 화면은 전체 연락처, constants/contacts.ts 의 CONTACTS_ROUTES.all)
|
||||
{ id: 'contacts', label: '주소록', icon: 'users', routeName: 'contacts', placement: 'main' },
|
||||
{ id: 'settings', label: '설정', icon: 'settings', routeName: 'settings', placement: 'end' },
|
||||
|
||||
Reference in New Issue
Block a user