feat(project): 관리자 페이지 접근 토글 + 멤버 배정 등록사용자 자동목록
- project 를 MODULE_KEYS 에 추가 → 관리자 페이지에 '프로젝트 관리' 토글
자동 생성. 직원별 접근 권한 부여(admin 자동, 일반은 기본 OFF).
- 모듈 진입을 has_module('project') 로 게이트(기존 전원허용 철회).
- 멤버 배정 모달: GET /project/api/assignable-users 로 project 권한 보유
등록 사용자를 드롭다운 자동 목록화(타이핑 제거). 이미 배정된 사람 제외.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+27
-3
@@ -345,13 +345,37 @@
|
||||
});
|
||||
|
||||
// ── 멤버 배정/제외 (관리자) ──
|
||||
const memberModal = el("pj-modal-member");
|
||||
wireModalClose(memberModal);
|
||||
const addMemberBtn = el("pj-add-member");
|
||||
if (addMemberBtn) addMemberBtn.addEventListener("click", async function () {
|
||||
const email = prompt("배정할 직원 이메일 (@dbxcorp.co.kr)");
|
||||
if (!email || !email.trim()) return;
|
||||
const sel = el("pj-m-user");
|
||||
openModal(memberModal);
|
||||
sel.innerHTML = '<option value="">불러오는 중…</option>';
|
||||
try {
|
||||
const res = await api("GET", "/project/api/assignable-users");
|
||||
const existing = new Set(members.map(function (m) { return m.user_email; }));
|
||||
const opts = res.users
|
||||
.filter(function (u) { return !existing.has(u.email); })
|
||||
.map(function (u) {
|
||||
return '<option value="' + u.email + '" data-name="' + escapeHtml(u.name) + '">' +
|
||||
escapeHtml(u.id) + " (" + escapeHtml(u.email) + ")</option>";
|
||||
});
|
||||
sel.innerHTML = opts.length
|
||||
? opts.join("")
|
||||
: '<option value="">배정 가능한 직원이 없습니다(권한 미부여 또는 전원 배정됨)</option>';
|
||||
} catch (e) {
|
||||
sel.innerHTML = '<option value="">불러오기 실패: ' + escapeHtml(e.message) + "</option>";
|
||||
}
|
||||
});
|
||||
const saveMemberBtn = el("pj-save-member");
|
||||
if (saveMemberBtn) saveMemberBtn.addEventListener("click", async function () {
|
||||
const sel = el("pj-m-user");
|
||||
if (!sel.value) { alert("직원을 선택하세요."); return; }
|
||||
const name = sel.selectedOptions[0] ? (sel.selectedOptions[0].dataset.name || "") : "";
|
||||
try {
|
||||
await api("POST", "/project/api/projects/" + projectId + "/members", {
|
||||
user_email: email.trim(), role: "member",
|
||||
user_email: sel.value, user_name: name, role: el("pj-m-role").value,
|
||||
});
|
||||
location.reload();
|
||||
} catch (e) { alert("배정 실패: " + e.message); }
|
||||
|
||||
Reference in New Issue
Block a user