You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
6.9 KiB
JavaScript

/* 아리 — 작업(Tasks) 데이터 · RON 디자인 언어
핵심: 작업 노드는 무한 중첩(children). 칸반/리스트는 최상위만 보여주고,
상세 드로어에서 자식 노드를 계속 만들어 내려갈 수 있다. */
(function () {
/* ---------- 사람 ---------- */
const people = {
jiwoo: { name: "지우", initial: "지", c: "#6286c9", me: true },
hyunwoo: { name: "현우", initial: "현", c: "#9c8bcb" },
minseo: { name: "민서", initial: "민", c: "#5fa6a0" },
jaeho: { name: "재호", initial: "재", c: "#ce6969" },
sua: { name: "수아", initial: "수", c: "#10141a" },
};
/* ---------- 상태 컬럼 ---------- */
const columns = [
{ id: "todo", label: "할 일", accent: "var(--faint)" },
{ id: "doing", label: "진행 중", accent: "var(--blue-d)" },
{ id: "review", label: "검토", accent: "var(--red)" },
{ id: "done", label: "완료", accent: "var(--teal, #5fa6a0)" },
];
/* ---------- 프로젝트(태그) ---------- */
const PRJ = {
biz: { name: "경영 전략", color: "#ce6969" },
onb: { name: "온보딩", color: "#9c8bcb" },
team: { name: "팀 운영", color: "#5fa6a0" },
me: { name: "개인", color: "#6286c9" },
};
/* 노드 헬퍼 */
let _n = 0;
const uid = () => "n" + (++_n);
function T(o) {
return {
id: o.id || uid(),
title: o.title,
status: o.status || "todo",
assignee: o.assignee || "jiwoo",
due: o.due || "",
prio: o.prio || "보통",
project: o.project || "me",
desc: o.desc || "",
star: !!o.star,
children: (o.children || []).map(T),
};
}
/* ---------- 중첩 작업 트리 (최상위 = 칸반/리스트 카드) ---------- */
const tree = [
T({
id: "t-report", title: "분기 리포트 초안 마무리", status: "doing", assignee: "jiwoo",
due: "06-10", prio: "높음", project: "biz", star: true,
desc: "경영진 미팅용 Q2 성과 리포트. 리텐션·매출·예산 세 섹션으로 구성하고 핵심 지표는 시각화한다.",
children: [
T({ title: "리텐션 데이터 취합", status: "done", assignee: "sua", due: "06-08", project: "biz",
children: [
T({ title: "코호트 정의 확정", status: "done", assignee: "sua", due: "06-07" }),
T({ title: "주차별 잔존율 추출", status: "done", assignee: "sua", due: "06-08" }),
T({ title: "이탈 사유 태깅", status: "done", assignee: "jaeho", due: "06-08",
children: [
T({ title: "인터뷰 발췌 5건", status: "done", assignee: "jaeho" }),
T({ title: "사유 카테고리 분류", status: "done", assignee: "jaeho" }),
] }),
] }),
T({ title: "매출 섹션 작성", status: "doing", assignee: "jiwoo", due: "06-09", project: "biz", prio: "높음",
children: [
T({ title: "MRR / ARR 표 정리", status: "done", assignee: "jiwoo" }),
T({ title: "전분기 대비 증감 코멘트", status: "doing", assignee: "jiwoo" }),
T({ title: "예측 시나리오 3종", status: "todo", assignee: "jiwoo" }),
] }),
T({ title: "예산 섹션 작성", status: "todo", assignee: "jiwoo", due: "06-10", project: "biz" }),
T({ title: "경영진 검토 요청 메일", status: "todo", assignee: "jiwoo", due: "06-10", project: "biz" }),
],
}),
T({
id: "t-wire", title: "온보딩 와이어프레임 피드백 정리", status: "review", assignee: "hyunwoo",
due: "06-09", prio: "높음", project: "onb", star: true,
desc: "디자인 리뷰에서 나온 3개 화면 수정사항을 취합하고 우선순위를 매긴다.",
children: [
T({ title: "환영 화면 수정안", status: "done", assignee: "hyunwoo",
children: [
T({ title: "카피 톤 조정", status: "done", assignee: "hyunwoo" }),
T({ title: "일러스트 교체 요청", status: "doing", assignee: "minseo" }),
] }),
T({ title: "권한 요청 화면 재배치", status: "doing", assignee: "hyunwoo" }),
T({ title: "음성 안내 추가 검토", status: "todo", assignee: "sua" }),
],
}),
T({
id: "t-interview", title: "사용자 인터뷰 5건 정리", status: "doing", assignee: "sua",
due: "06-11", prio: "보통", project: "onb",
desc: "인터뷰 녹취를 요약하고 인사이트를 태깅해 리서치 보드에 정리한다.",
children: [
T({ title: "녹취 요약 (5건)", status: "doing", assignee: "sua" }),
T({ title: "인사이트 태깅", status: "todo", assignee: "sua" }),
T({ title: "리서치 보드 업데이트", status: "todo", assignee: "minseo" }),
],
}),
T({
id: "t-okr", title: "Q2 OKR 중간 점검 자료", status: "todo", assignee: "jiwoo",
due: "06-12", prio: "높음", project: "biz",
desc: "분기 절반 시점 OKR 달성도를 점검하고 남은 기간 액션을 정리한다.",
children: [
T({ title: "Objective별 진척도 집계", status: "todo", assignee: "jiwoo" }),
T({ title: "리스크 항목 표시", status: "todo", assignee: "jiwoo" }),
],
}),
T({
id: "t-card", title: "구독 결제 카드 갱신", status: "todo", assignee: "jiwoo",
due: "06-12", prio: "보통", project: "me",
desc: "만료 임박 카드 정보를 업데이트한다.", children: [],
}),
T({
id: "t-welcome", title: "신규 입사자 환영 메일 발송", status: "done", assignee: "minseo",
due: "06-07", prio: "보통", project: "team",
desc: "", children: [
T({ title: "메일 템플릿 작성", status: "done", assignee: "minseo" }),
T({ title: "수신자 명단 확인", status: "done", assignee: "minseo" }),
],
}),
T({
id: "t-retro", title: "스프린트 회고 문서 배포", status: "review", assignee: "minseo",
due: "06-08", prio: "낮음", project: "team",
desc: "회고에서 도출된 액션 아이템을 정리해 팀 채널에 공유한다.",
children: [
T({ title: "액션 아이템 담당자 지정", status: "done", assignee: "minseo" }),
T({ title: "다음 스프린트 반영 확인", status: "doing", assignee: "jaeho" }),
],
}),
T({
id: "t-push", title: "모바일 푸시 알림 QA", status: "doing", assignee: "sua",
due: "06-09", prio: "높음", project: "onb",
desc: "iOS/Android 푸시 시나리오 6종을 점검한다.",
children: [
T({ title: "iOS 시나리오 3종", status: "done", assignee: "sua" }),
T({ title: "Android 시나리오 3종", status: "doing", assignee: "sua" }),
T({ title: "딥링크 라우팅 확인", status: "todo", assignee: "jaeho" }),
],
}),
];
window.AriTasks = { people, columns, projects: PRJ, tree };
})();