fix: TBM 관리 탭에서 모든 사용자의 TBM 표시
데스크탑 TBM 관리 탭에서 비관리자 사용자가 본인 TBM만 보이던 클라이언트 필터링 제거. 모바일과 동일하게 모든 TBM이 표시되도록 통일. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -208,19 +208,7 @@ class TbmAPI {
|
||||
results.forEach((response, index) => {
|
||||
const date = dates[index];
|
||||
if (response && response.success && response.data && response.data.length > 0) {
|
||||
let sessions = response.data;
|
||||
|
||||
// admin이 아니면 본인이 작성한 TBM만 필터링
|
||||
if (!this.state.isAdminUser()) {
|
||||
const userId = this.state.currentUser?.user_id;
|
||||
const workerId = this.state.currentUser?.worker_id;
|
||||
const userName = this.state.currentUser?.name;
|
||||
sessions = sessions.filter(s => {
|
||||
return (userId && String(s.created_by) === String(userId)) ||
|
||||
(workerId && String(s.leader_id) === String(workerId)) ||
|
||||
(userName && s.created_by_name === userName);
|
||||
});
|
||||
}
|
||||
const sessions = response.data;
|
||||
|
||||
if (sessions.length > 0) {
|
||||
this.state.dateGroupedSessions[date] = sessions;
|
||||
@@ -462,6 +450,164 @@ class TbmAPI {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TBM 세션 삭제
|
||||
*/
|
||||
async deleteSession(sessionId) {
|
||||
try {
|
||||
const response = await window.apiCall(`/tbm/sessions/${sessionId}`, 'DELETE');
|
||||
if (!response || !response.success) {
|
||||
throw new Error(response?.message || '삭제 실패');
|
||||
}
|
||||
console.log('✅ TBM 세션 삭제:', sessionId);
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ TBM 세션 삭제 오류:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TBM 팀원 분할 배정
|
||||
*/
|
||||
async splitAssignment(sessionId, splitData) {
|
||||
try {
|
||||
const response = await window.apiCall(
|
||||
`/tbm/sessions/${sessionId}/team/split`,
|
||||
'POST',
|
||||
splitData
|
||||
);
|
||||
if (!response || !response.success) {
|
||||
throw new Error(response?.message || '분할 실패');
|
||||
}
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ 분할 배정 오류:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TBM 팀원 단일 추가/수정 (POST /team)
|
||||
*/
|
||||
async updateTeamMember(sessionId, memberData) {
|
||||
try {
|
||||
const response = await window.apiCall(
|
||||
`/tbm/sessions/${sessionId}/team`,
|
||||
'POST',
|
||||
memberData
|
||||
);
|
||||
if (!response || !response.success) {
|
||||
throw new Error(response?.message || '팀원 수정 실패');
|
||||
}
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ 팀원 수정 오류:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TBM 인원 이동 (분할→이동 / 빼오기)
|
||||
*/
|
||||
async transfer(transferData) {
|
||||
try {
|
||||
const response = await window.apiCall('/tbm/transfers', 'POST', transferData);
|
||||
if (!response || !response.success) {
|
||||
throw new Error(response?.message || '이동 실패');
|
||||
}
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ TBM 이동 오류:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 작업 생성
|
||||
*/
|
||||
async createTask(taskData) {
|
||||
try {
|
||||
const response = await window.apiCall('/tasks', 'POST', taskData);
|
||||
if (!response || !response.success) {
|
||||
throw new Error(response?.message || '작업 생성 실패');
|
||||
}
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ 작업 생성 오류:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 활성 작업장 전체 목록 (active/list)
|
||||
*/
|
||||
async loadActiveWorkplacesList() {
|
||||
try {
|
||||
const response = await window.apiCall('/workplaces/active/list');
|
||||
if (response && response.success) {
|
||||
return response.data || [];
|
||||
}
|
||||
return [];
|
||||
} catch (error) {
|
||||
console.error('❌ 활성 작업장 목록 오류:', error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 당일 배정 현황 조회
|
||||
*/
|
||||
async loadTodayAssignments(date) {
|
||||
try {
|
||||
const response = await window.apiCall(`/tbm/sessions/date/${date}/assignments`);
|
||||
if (response && response.success) {
|
||||
return response.data || [];
|
||||
}
|
||||
return [];
|
||||
} catch (error) {
|
||||
console.error('❌ 배정 현황 조회 오류:', error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 특정 날짜의 TBM 세션 조회 (raw - 상태 변경 없음)
|
||||
*/
|
||||
async fetchSessionsByDate(date) {
|
||||
try {
|
||||
const response = await window.apiCall(`/tbm/sessions/date/${date}`);
|
||||
if (response && response.success) {
|
||||
return response.data || [];
|
||||
}
|
||||
return [];
|
||||
} catch (error) {
|
||||
console.error('❌ TBM 세션 조회 오류:', error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* TBM 세션 완료 처리 (근태 정보 포함)
|
||||
*/
|
||||
async completeTbmWithAttendance(sessionId, attendanceData) {
|
||||
try {
|
||||
const response = await window.apiCall(
|
||||
`/tbm/sessions/${sessionId}/complete`,
|
||||
'POST',
|
||||
{ attendance: attendanceData }
|
||||
);
|
||||
if (!response || !response.success) {
|
||||
throw new Error(response?.message || '완료 처리 실패');
|
||||
}
|
||||
console.log('✅ TBM 완료 처리 (근태 포함):', sessionId);
|
||||
return response;
|
||||
} catch (error) {
|
||||
console.error('❌ TBM 완료 처리 오류:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 전역 인스턴스 생성
|
||||
@@ -486,5 +632,7 @@ window.loadMoreTbmDays = async function() {
|
||||
await window.TbmAPI.loadRecentTbmGroupedByDate();
|
||||
window.showToast?.(`최근 ${window.TbmState.loadedDaysCount}일의 TBM을 로드했습니다.`, 'success');
|
||||
};
|
||||
window.deleteTbmSession = (sessionId) => window.TbmAPI.deleteSession(sessionId);
|
||||
window.fetchSessionsByDate = (date) => window.TbmAPI.fetchSessionsByDate(date);
|
||||
|
||||
console.log('[Module] tbm/api.js 로드 완료');
|
||||
|
||||
Reference in New Issue
Block a user