이전 글과 이어집니다...
1. 사용자는 검색 조건에 시간대별, 문의유형, 상담원을 선택할 수 있다.
2. 사용자는 검색 조건은 모두 선택 안 할수도, 모두 선택 할 수도 있다.
3. 같은 날짜의 같은 시간은 행이 병합되어야 한다.
4. 같은 날짜의 같은 시간의 같은 문의 유형은 행이 병합되어야 한다.
{
table_data: [
{
standard_at: '2022-01-01',
standard_time: '9-10', // 시간
inquire_type: '문의유형1', // 문의유형
counselor_nm: '상담원1', // 상담원
...
},
...
]
}
standard_time
, inquire_type
, counselor_nm
프로퍼티를 내려준다.// template 영역
...
<table>
<thead>
<tr>
<th>날짜</th>
<th v-if="tableData[0].standard_time">시간</th>
<th v-if="tableData[0].inquire_type">문의유형</th>
<th v-if="tableData[0].counselor_nm">상담원</th>
<th>데이터1</th>
<th>데이터2</th>
<th>데이터3</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in tableData">
<td
v-if="item.isDateVisible"
:rowSpan="item.dateRowSpan"
>
{{ item.standard_at }}
</td>
<td
v-if="item.standard_time && item.isTimeVisible"
:rowSpan="item.timeRowSpan"
>
{{ item.standard_time }}
</td>
<td
v-if="item.inquire_type && item.isImquireTypeVisible"
:rowSpan="item.inquireTypeRowSpan"
>
{{ item.inquire_type }}
</td>
<td
v-if="item.counselor_nm"
>
{{ item.counselor_nm }}
</td>
<td> {{ item.data1 }} </td>
<td> {{ item.data2 }} </td>
<td> {{ item.data3 }} </td>
</tr>
</tbody>
</table>
...
// script 영역 - methods
...
getData() {
axios.get(requestUrl, {config})
.then(res => {
this.tableData = res.data.table_data.map((item, index, arr) => {
const param = {item, index, arr};
this.setDateProp(param);
if(item.standard_time) this.setTimeProp(param);
if(item.inquire_type) this.setInquireTypeProp(param);
return item;
});
})
},
// 날짜 데이터 프로퍼티 설정 메소드
setDateProp({item, index, arr}) {
item.isDateVisible = false;
item.dateRowSpan = 0
// 0번째 인덱스 요소 처리
if(index == 0) {
item.isDateVisible = true;
item.dateRowSpan = this.getRowSpan(arr, item, 'standard_at');
return;
}
// 이전 인덱스 요소와 시간 비교
if(item.standard_at != arr[index-1].standard_at) {
item.isDateVisible = true;
item.dateRowSpan = this.getRowSpan(arr, item, 'standard_at');
}
},
// 시간 데이터 프로퍼티 설정 메소드
setTimeProp({item, index, arr}) {
// 초깃값 세팅
item.isTimeVisible = false;
item.timeRowSpan = 0;
// 0번째 인덱스 요소 처리
if(index == 0) {
item.isTimeVisible = true;
item.timeRowSpan = this.getRowSpan(arr, item, 'standard_time');
return;
}
// 이전 인덱스와 시간, 날짜 비교
if(item.standard_time != arr[index-1].standard_time) {
item.isTimeVisible = true;
item.timeRowSpan = this.getRowSpan(arr, item, 'standard_time');
} else if(item.standard_at != arr[index-1].standard_at) {
item.isTimeVisible = true;
item.timeRowSpan = this.getRowSpan(arr, item, 'standard_time');
}
},
// 문의유형 데이터 프로퍼티 설정 메소드
setInquireTypeProp({item, index, arr}) {
// 초깃값 세팅
item.isSkillVisible = false;
item.skillRowSpan = 0;
// 0번째 인덱스 요소 처리
if(index == 0) {
item.isSkillVisible = true;
item.skillRowSpan = this.getRowSpan(arr, item, 'skill_nm');
return;
}
// 이전 데이터와 문의 유형이 다른 경우
if (arr[index-1].skill_nm != item.skill_nm) {
item.isSkillVisible = true;
item.skillRowSpan = this.getRowSpan(arr, item, 'skill_nm');
return;
}
// 문의 유형이 같은데 날짜 혹은 시간이 다른 경우
if (item.standard_time
&& item.standard_time != arr[index-1].standard_time
) {
item.isSkillVisible = true;
item.skillRowSpan = this.getRowSpan(arr, item, 'skill_nm');
} else if (item.standard_at != arr[index-1].standard_at) {
item.isSkillVisible = true;
item.skillRowSpan = this.getRowSpan(arr, item, 'skill_nm');
}
},
getRowSpan(arr, data, prop) {
let rowSpan = 0;
if (data.standard_time && prop != 'standard_at') {
arr.forEach(item => {
if(item[prop] == data[prop]
&& item.standard_at == data.standard_at
&& item.standard_time == data.standard_time) rowSpan++;
})
return rowSpan;
}
arr.forEach(item => {
if(item[prop] == data[prop]
&& item.standard_at == data.standard_at) rowSpan++;
})
return rowSpan;
}
...
setDateProp
, setTimeProp
, setInquireTypeProp
메소드 형태가 비슷해서 하나의 메소드로 합칠 수 있었는데, 당시에는 정신 없이 바빠서 그런 고민할 틈이 없었나 보다...