- 헤더 우측: 알림 종 → 관리자 뱃지 → 프로필 순으로 변경(관리자 뱃지가 프로필 바로 왼쪽)
- 공지 화면 '관리자 공지 모아보기' 서브 문구 제거
- 공지 수정폼이 hidden 이어도 항상 보여 보기/수정이 2단으로 겹치던 버그 수정
(.ann-form 의 display:flex 가 [hidden] 기본 규칙을 이기던 문제 → .ann-form[hidden]{display:none})
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
76 lines
3.4 KiB
Plaintext
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>
|