feat: 메일 관리 UI 개편 및 시스템 구조 최적화

- UI/UX: 메일 관리 레이아웃 고도화 및 미리보기 토글 핸들 도입
- 기능: 주소록 CRUD 기능 추가 및 모달 인터페이스 개선
- 구조: CSS 파일 기능별 분리 및 Jinja2 템플릿 엔진 도입
- 백엔드: OCR 비동기 처리 및 CSV 파싱(BOM) 안정화
- 데이터: 2026.03.04 기준 최신 프로젝트 현황 업데이트
This commit is contained in:
2026-03-04 17:58:54 +09:00
parent ff9146cfee
commit d246b08799
20 changed files with 2074 additions and 1138 deletions

View File

@@ -1,6 +1,6 @@
<div class="wrap">
<article class="log-filter" style="display: flex;">
<article class="log-filter">
<div class="head">
<span class="title _h3">로그필터</span>
<button class="_button-xsmall reset">초기화</button>
@@ -10,11 +10,11 @@
<span class="subtitle">활동시간</span>
<div class="log-date-wrap">
<span class="category">시작</span>
<input type="date" value="" style="">
<input type="date" value="">
</div>
<div class="log-date-wrap">
<span class="category">종료</span>
<input type="date" value="" style="">
<input type="date" value="">
</div>
</div>
<div class="log-user">
@@ -35,64 +35,64 @@
</div>
<span class="category">파일 / 폴더관련</span>
<label>
<input type="checkbox" value="uploadData_file" checked="" style="">
<input type="checkbox" value="uploadData_file" checked="">
<span class="--checkbox"></span>
<span>파일 업로드</span>
</label>
<label>
<input type="checkbox" value="renameTarget" checked="" style="">
<input type="checkbox" value="renameTarget" checked="">
<span class="--checkbox"></span>
<span>이름 변경</span>
</label>
<label>
<input type="checkbox" value="removeTarget" checked="" style="">
<input type="checkbox" value="removeTarget" checked="">
<span class="--checkbox"></span>
<span>삭제</span>
</label>
<label>
<input type="checkbox" value="downloadTarget" checked="" style="">
<input type="checkbox" value="downloadTarget" checked="">
<span class="--checkbox"></span>
<span>다운로드</span>
</label>
<label>
<input type="checkbox" value="relocateTarget" checked="" style="">
<input type="checkbox" value="relocateTarget" checked="">
<span class="--checkbox"></span>
<span>파일 이동</span>
</label>
<label>
<input type="checkbox" value="createFolder" checked="" style="">
<input type="checkbox" value="createFolder" checked="">
<span class="--checkbox"></span>
<span>새 폴더 생성</span>
</label>
<label>
<input type="checkbox" value="setDataPermission_folder" checked="" style="">
<input type="checkbox" value="setDataPermission_folder" checked="">
<span class="--checkbox"></span>
<span>폴더 권한 설정</span>
</label>
<label>
<input type="checkbox" value="convertPdf" checked="" style="">
<input type="checkbox" value="convertPdf" checked="">
<span class="--checkbox"></span>
<span>PDF 변환</span>
</label>
<span class="category">유저관련</span>
<label>
<input type="checkbox" value="editAuthor" checked="" style="">
<input type="checkbox" value="editAuthor" checked="">
<span class="--checkbox"></span>
<span>작성자 변경</span>
</label>
<label>
<input type="checkbox" value="deletePermission" checked="" style="">
<input type="checkbox" value="deletePermission" checked="">
<span class="--checkbox"></span>
<span>권한 삭제</span>
</label>
<label>
<input type="checkbox" value="addPermission" checked="" style="">
<input type="checkbox" value="addPermission" checked="">
<span class="--checkbox"></span>
<span>권한 추가</span>
</label>
<span class="category">기타</span>
<label>
<input type="checkbox" value="summarizeAI" checked="" style="">
<input type="checkbox" value="summarizeAI" checked="">
<span class="--checkbox"></span>
<span>AI 요약</span>
</label>
@@ -114,46 +114,15 @@
<div class="btn set-user-permission-btn permission-min-sub-master" style="display: none;">
<div class="text">유저 권한 설정</div>
</div>
<!-- <div class="btn dev-menu-btn permission-min-dev">
<div class="text">개발자 메뉴</div>
</div> -->
</div>
<!-- <div class="right-wrap">
<button class="project-type" id="project-type-btn">
<h5 class="project-type__label --type__support">지원</h5>
<i class="project-type__icon"></i>
</button>
<h5 class="--type-capsule" id="project-type-capsule">시공</h5>
<ul class="project-type__list">
<li class="project-type__list_item --type__construction">시공</li>
<li class="project-type__list_item --type__design">설계</li>
<li class="project-type__list_item --type__surgest">제안</li>
<li class="project-type__list_item --type__research">연구</li>
<li class="project-type__list_item --type__support">지원</li>
<li class="project-type__list_item --type__center">센터</li>
</ul>
<button class="project-step" id="project-step-btn">
<h5 class="project-step__label --step__active">진행</h5>
<i class="project-step__icon"></i>
</button>
<h5 class="" id="project-step-capsule">진행</h5>
<ul class="project-step__list">
<li class="project-step__list_item --step__active">진행</li>
<li class="project-step__list_item --step__stop">중지</li>
<li class="project-step__list_item --step__done">완료</li>
<li class="project-step__list_item --step__wait">대기</li>
</ul>
<div class="project-manager-title">프로젝트 관리자</div>
<div class="project-manager-name"></div>
</div> -->
</div>
<div class="close"></div>
</div>
<div class="modal-body" style="">
<div class="modal-body">
<div class="connected-users-wrap" style="display: none;">
<div class="user-item-wrap scrollbar"><div class="user-item me" data-user-id="B21364"><img class="profile-image" src="/main/img/archive/empty-profile.svg" style="outline: rgb(24, 114, 89) solid 2px;"><div class="wrap"><div class="top-wrap"><div class="name">이태훈 선임연구원</div><div class="user-permission-sub-master"><h6>부관리자</h6></div><div class="me-badge"><h6></h6></div></div><div class="bottom-wrap"><div class="cur-path">현재 위치: /과업개요</div></div></div></div></div>
<div class="project-setting-wrap" style="display: flex; flex-direction: column;">
<div class="project-name-wrap" style="display: flex; gap:1rem;">
<div class="project-setting-wrap">
<div class="project-name-wrap">
<div>프로젝트명</div>
<div class="project-type-wrap" id="project-type-wrap" style="display: none;">
<button class="project-type" id="project-type-btn">
@@ -192,7 +161,7 @@
</ul>
</div>
<div class="project-input-wrap" style="display: flex; gap:1rem;">
<div class="project-setting-name" id="project-name-view" style="display: flex;"> ITTC 관개 교육센터</div>
<div class="project-setting-name" id="project-name-view"> ITTC 관개 교육센터</div>
<input type="text" class="project-setting-name" id="project-name-input" style="display: none; border: 1px solid black;">
</div>
<div class="project-step-wrap">
@@ -209,19 +178,16 @@
</ul>
</div>
<div class="peoject-save-wrap">
</div>
</div>
<div class="project-manager-wrap" style="display: flex; gap:1rem;">
<div class="project-manager-wrap">
<div class="project-manager-title">프로젝트 관리자</div>
<div class="project-manager-name">방노성 전무이사</div>
</div>
<div class="project-location-wrap" style="display: flex; gap:1rem;">
<div class="project-location-wrap">
<div class="project-location-title">프로젝트 위치</div>
<div class="project-location-lat"><div class="project-location-lat">위도 18.068579</div></div>
<div class="project-location-lon"><div class="project-location-lon">경도 102.65966</div></div>
<div class="project-location-lat">위도 18.068579</div>
<div class="project-location-lon">경도 102.65966</div>
</div>
</div>
<div class="btn-wrap">
@@ -233,7 +199,7 @@
</div>
<div class="manual-wrap" style="display: none;"></div>
<div class="size-wrap" style="display: none;">
<div class="chart" _echarts_instance_="ec_1772068581031" style="user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: relative;"><div style="position: relative; width: 1152px; height: 720px; padding: 0px; margin: 0px; border-width: 0px;"><canvas data-zr-dom-id="zr_0" width="1152" height="720" style="position: absolute; left: 0px; top: 0px; width: 1152px; height: 720px; user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px; margin: 0px; border-width: 0px;"></canvas></div><div class=""></div></div>
<div class="chart" style="user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); position: relative;"><div style="position: relative; width: 1152px; height: 720px; padding: 0px; margin: 0px; border-width: 0px;"><canvas data-zr-dom-id="zr_0" width="1152" height="720" style="position: absolute; left: 0px; top: 0px; width: 1152px; height: 720px; user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); padding: 0px; margin: 0px; border-width: 0px;"></canvas></div><div class=""></div></div>
<div class="text">저장공간 관련 문의: GSIM 개발팀 이호성 수석연구원</div>
</div>
<div class="log-wrap" style="opacity: 1; display: flex;">
@@ -248,16 +214,10 @@
<div class="log-item-wrap log-body scrollbar scroll-container"></div>
</div>
<div class="text-wrap" style="display: none;">undefined</div>
<!-- <div class="input-wrap"></div> -->
<div class="project-list-wrap" style="display: none;"></div>
<div class="input-wrap" style="display: none;"></div>
<div class="user-list-wrap" style="display: none;">
<div class="user-item-wrap scrollbar"></div>
<!-- 작성자 변경 선택 결과 숨김 -->
<!-- <div class="selected-user-item-wrap">
<div class="text">선택 결과</div>
<div class="selected-user-item"></div>
</div> -->
</div>
<div class="btn-wrap" style="display: none;"></div>
</div>