Files
ai-dev-portal/views/announcements.ejs
2620227 355798a506 fix(header,announcements): 헤더 종·관리자 뱃지 순서 교체 + 공지 수정폼 겹침 수정
- 헤더 우측: 알림 종 → 관리자 뱃지 → 프로필 순으로 변경(관리자 뱃지가 프로필 바로 왼쪽)
- 공지 화면 '관리자 공지 모아보기' 서브 문구 제거
- 공지 수정폼이 hidden 이어도 항상 보여 보기/수정이 2단으로 겹치던 버그 수정
  (.ann-form 의 display:flex 가 [hidden] 기본 규칙을 이기던 문제 → .ann-form[hidden]{display:none})

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 20:08:47 +09:00

76 lines
3.4 KiB
Plaintext

<%- include("_header") %>
<%
// 뷰 로컬 헬퍼 (빌드 없이 EJS 스크립틀릿으로)
function fdate(d) { var x = new Date(d); return x.getFullYear() + "." + String(x.getMonth() + 1).padStart(2, "0") + "." + String(x.getDate()).padStart(2, "0"); }
function edited(a) { try { return (+new Date(a.updated_at) - +new Date(a.created_at)) > 1000; } catch (e) { return false; } }
%>
<main class="main">
<section class="section">
<div class="section-head">
<div class="section-titlewrap">
<h2 class="section-title">공지사항</h2>
</div>
</div>
<% if (user.isAdmin) { %>
<!-- 관리자 전용 새 공지 작성 폼 -->
<form class="ann-form ann-form-new" method="post" action="/announcements">
<input class="ann-input-title" type="text" name="title" maxlength="120" placeholder="공지 제목" required />
<textarea class="ann-input-body" name="body" rows="4" placeholder="공지 내용 (마크다운 지원)"></textarea>
<div class="ann-form-actions">
<button class="btn btn-primary" type="submit"><%- icon("megaphone", { size: 15 }) %>공지 등록</button>
</div>
</form>
<% } %>
<% if (!announcements.length) { %>
<div class="ann-empty">아직 등록된 공지가 없습니다.</div>
<% } %>
<div class="ann-list">
<% announcements.forEach(function (a) { %>
<article class="ann-item" id="ann-<%= a.id %>">
<div class="ann-view" data-ann-view="<%= a.id %>">
<div class="ann-item-head">
<h3 class="ann-item-title"><%= a.title %></h3>
<% if (user.isAdmin) { %>
<div class="ann-item-actions">
<button type="button" class="btn btn-sm" data-ann-edit="<%= a.id %>"><%- icon("pencil", { size: 13 }) %>수정</button>
<form method="post" action="/announcements/<%= a.id %>/delete" style="display:inline">
<button type="submit" class="btn btn-sm ann-del" data-confirm="이 공지를 삭제할까요?"><%- icon("trash", { size: 13 }) %>삭제</button>
</form>
</div>
<% } %>
</div>
<div class="ann-meta">
<%= a.author_name %> · <%= fdate(a.created_at) %><% if (edited(a)) { %> · 수정됨<% } %>
</div>
<% if (a.body && a.body.trim()) { %>
<div class="ann-body md-body"><%- renderMarkdown(a.body) %></div>
<% } %>
</div>
<% if (user.isAdmin) { %>
<!-- 인라인 수정 폼 (수정 버튼으로 토글) -->
<form class="ann-form ann-edit" method="post" action="/announcements/<%= a.id %>/update" data-ann-editform="<%= a.id %>" hidden>
<input class="ann-input-title" type="text" name="title" maxlength="120" value="<%= a.title %>" required />
<textarea class="ann-input-body" name="body" rows="4"><%= a.body %></textarea>
<div class="ann-form-actions">
<button class="btn btn-primary btn-sm" type="submit"><%- icon("check", { size: 14 }) %>저장</button>
<button class="btn btn-sm" type="button" data-ann-cancel="<%= a.id %>">취소</button>
</div>
</form>
<% } %>
</article>
<% }); %>
</div>
</section>
</main>
<%- include("_footer") %>
<script type="module" src="/public/js/main.js"></script>
</body>
</html>