import { useState } from 'react' import { updateAssignments, updateStage, type Contact, type ContactCategory, type Org, } from '../api/client' import { STAGE_LABELS, stageLabel } from '../stages' import ChannelFiles from './ChannelFiles' import ChannelPosts from './ChannelPosts' import ContactPickerModal from './ContactPickerModal' import StatusBadge from './StatusBadge' import Timeline from './Timeline' import WorkMemos from './WorkMemos' // 기관관리 상세 화면. 3단계 대시보드 시안의 "기관관리" 레이아웃을 따른다. // 웹 DB에 있는 것(연번·기관명·담당자 3종·채널·진행단계)만 실데이터고, // 통계/일부 탭 내용은 아직 백엔드가 없어 시안과 같은 골격에 "추후 연동" 자리만 잡아 둔다. const TABS = ['채팅', '자료', '권리확인', '권리처리', 'RE', '타임라인', '업무메모'] // 담당 변호사 변경은 카드의 [생성/변경] 버튼으로 대체되어 목록에서 뺐다. // 진행단계 변경은 업무단계 현황 스트립 + 이 버튼의 모달로 실제 동작한다. const DISABLED_ACTIONS = ['자료 업로드', '최초 게시글 보기', '보고서 관리'] // 카드에서 담당자를 지정/변경할 때 쓰는 역할 정의 (채널관리의 배정과 같은 API를 쓴다) const CARD_ROLES: Record< 'applicant' | 'mj' | 'itn' | 'lawyer', { category: ContactCategory; pickerTitle: string } > = { applicant: { category: 'APPLICANT', pickerTitle: '신청기관 담당자 선택' }, mj: { category: 'MJ', pickerTitle: '문정원 담당자 선택' }, itn: { category: 'ITN', pickerTitle: '아이티앤 담당자 선택' }, lawyer: { category: 'LAWYER', pickerTitle: '담당 변호사 선택' }, } // Mattermost 웹 주소. 채널 화면은 팀명 + 채널 내부명으로 열린다. // 내부명 규칙은 백엔드 ChannelNaming.java가 정본이며 여기서는 열람 링크용으로만 복제한다. // 기관 코드({연번1}_{연번2})가 하위기관까지 구분하므로 기관명에 따른 별도 특례는 없다. const MATTERMOST_BASE = 'https://hub.iten.co.kr/itn-hub/channels/' function mattermostChannelUrl(org: Org): string { const slug = org.orgNo.trim().toLowerCase().replace(/_/g, '-').replace(/ /g, '-') return MATTERMOST_BASE + `org-${slug}-mj` } function Field({ label, value }: { label: string; value: string | null }) { return (
{assignError}
} {pickerRole && (채널 생성 시 신청 단계가 시작됩니다
)} {stageError &&{stageError}
}{title}
{caption} -