fix(frontend): 검색 결과 멤버 표시 오류 수정
- getMemberList 헬퍼 함수 추가 (검색 결과/일반 데이터 모두 처리) - 검색 결과의 members가 문자열 배열인 경우 처리 - AdminSchedule.jsx trim() 오류 수정 수정 파일: - pc/public/Schedule.jsx - pc/admin/AdminSchedule.jsx - mobile/public/Schedule.jsx Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
3ee41beb46
commit
b4c393c20a
3 changed files with 58 additions and 8 deletions
|
|
@ -10,6 +10,24 @@ import { getTodayKST } from '../../../utils/date';
|
|||
import { getSchedules, searchSchedules } from '../../../api/public/schedules';
|
||||
import useScheduleStore from '../../../stores/useScheduleStore';
|
||||
|
||||
// 멤버 리스트 추출 (검색 결과와 일반 데이터 모두 처리)
|
||||
const getMemberList = (schedule) => {
|
||||
// member_names 문자열이 있으면 사용
|
||||
if (schedule.member_names) {
|
||||
return schedule.member_names.split(',').map(n => n.trim()).filter(Boolean);
|
||||
}
|
||||
// members 배열이 있으면
|
||||
if (Array.isArray(schedule.members) && schedule.members.length > 0) {
|
||||
// 문자열 배열인 경우 (검색 결과)
|
||||
if (typeof schedule.members[0] === 'string') {
|
||||
return schedule.members.filter(Boolean);
|
||||
}
|
||||
// 객체 배열인 경우 (일반 데이터)
|
||||
return schedule.members.map(m => m.name).filter(Boolean);
|
||||
}
|
||||
return [];
|
||||
};
|
||||
|
||||
// 폭죽 애니메이션 함수
|
||||
const fireBirthdayConfetti = () => {
|
||||
const duration = 3000;
|
||||
|
|
@ -937,8 +955,7 @@ function MobileSchedule() {
|
|||
// 일정 카드 컴포넌트 (검색용) - 날짜 포함 모던 디자인
|
||||
function ScheduleCard({ schedule, categoryColor, categories, delay = 0, onClick }) {
|
||||
const categoryName = categories.find(c => c.id === (schedule.category?.id || schedule.category_id))?.name || '미분류';
|
||||
const memberNames = schedule.member_names || schedule.members?.map(m => m.name).join(',') || '';
|
||||
const memberList = memberNames.split(',').filter(name => name.trim());
|
||||
const memberList = getMemberList(schedule);
|
||||
|
||||
// 날짜 파싱
|
||||
const parseDate = (dateStr) => {
|
||||
|
|
@ -1041,8 +1058,7 @@ function ScheduleCard({ schedule, categoryColor, categories, delay = 0, onClick
|
|||
// 타임라인용 일정 카드 컴포넌트 - 모던 디자인
|
||||
function TimelineScheduleCard({ schedule, categoryColor, categories, delay = 0, onClick }) {
|
||||
const categoryName = categories.find(c => c.id === (schedule.category?.id || schedule.category_id))?.name || '미분류';
|
||||
const memberNames = schedule.member_names || schedule.members?.map(m => m.name).join(',') || '';
|
||||
const memberList = memberNames.split(',').filter(name => name.trim());
|
||||
const memberList = getMemberList(schedule);
|
||||
|
||||
return (
|
||||
<motion.div
|
||||
|
|
|
|||
|
|
@ -27,6 +27,24 @@ const decodeHtmlEntities = (text) => {
|
|||
return textarea.value;
|
||||
};
|
||||
|
||||
// 멤버 리스트 추출 (검색 결과와 일반 데이터 모두 처리)
|
||||
const getMemberList = (schedule) => {
|
||||
// member_names 문자열이 있으면 사용
|
||||
if (schedule.member_names) {
|
||||
return schedule.member_names.split(',').map(n => n.trim()).filter(Boolean);
|
||||
}
|
||||
// members 배열이 있으면
|
||||
if (Array.isArray(schedule.members) && schedule.members.length > 0) {
|
||||
// 문자열 배열인 경우 (검색 결과)
|
||||
if (typeof schedule.members[0] === 'string') {
|
||||
return schedule.members.filter(Boolean);
|
||||
}
|
||||
// 객체 배열인 경우 (일반 데이터)
|
||||
return schedule.members.map(m => m.name).filter(Boolean);
|
||||
}
|
||||
return [];
|
||||
};
|
||||
|
||||
// 카테고리 ID 상수
|
||||
const CATEGORY_IDS = {
|
||||
YOUTUBE: 2,
|
||||
|
|
@ -59,8 +77,7 @@ const ScheduleItem = memo(function ScheduleItem({
|
|||
const isBirthday = schedule.is_birthday || String(schedule.id).startsWith('birthday-');
|
||||
const categoryColor = getColorStyle(categories.find(c => c.id === schedule.category_id)?.color)?.style?.backgroundColor || '#6b7280';
|
||||
const categoryName = categories.find(c => c.id === schedule.category_id)?.name || '미분류';
|
||||
const memberNames = schedule.member_names || schedule.members?.map(m => m.name).join(',') || '';
|
||||
const memberList = memberNames.split(',').filter(name => name.trim());
|
||||
const memberList = getMemberList(schedule);
|
||||
|
||||
return (
|
||||
<motion.div
|
||||
|
|
|
|||
|
|
@ -18,6 +18,24 @@ const decodeHtmlEntities = (text) => {
|
|||
return textarea.value;
|
||||
};
|
||||
|
||||
// 멤버 리스트 추출 (검색 결과와 일반 데이터 모두 처리)
|
||||
const getMemberList = (schedule) => {
|
||||
// member_names 문자열이 있으면 사용
|
||||
if (schedule.member_names) {
|
||||
return schedule.member_names.split(',').map(n => n.trim()).filter(Boolean);
|
||||
}
|
||||
// members 배열이 있으면
|
||||
if (Array.isArray(schedule.members) && schedule.members.length > 0) {
|
||||
// 문자열 배열인 경우 (검색 결과)
|
||||
if (typeof schedule.members[0] === 'string') {
|
||||
return schedule.members.filter(Boolean);
|
||||
}
|
||||
// 객체 배열인 경우 (일반 데이터)
|
||||
return schedule.members.map(m => m.name).filter(Boolean);
|
||||
}
|
||||
return [];
|
||||
};
|
||||
|
||||
// 폭죽 애니메이션 함수
|
||||
const fireBirthdayConfetti = () => {
|
||||
const duration = 3000;
|
||||
|
|
@ -1227,8 +1245,7 @@ function Schedule() {
|
|||
</div>
|
||||
|
||||
{(() => {
|
||||
const memberNames = schedule.member_names || schedule.members?.map(m => m.name).join(',') || '';
|
||||
const memberList = memberNames.split(',').filter(name => name.trim());
|
||||
const memberList = getMemberList(schedule);
|
||||
if (memberList.length === 0) return null;
|
||||
if (memberList.length === 5) {
|
||||
return (
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue