init
This commit is contained in:
@@ -0,0 +1,306 @@
|
||||
<?=$this->extend('templates/front.php');?>
|
||||
|
||||
<!--타이틀-->
|
||||
<?=$this->section('title');?>
|
||||
ZENITH - 통합 DB 관리
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--헤더-->
|
||||
<?=$this->section('header');?>
|
||||
<!-- <style>
|
||||
.search-wrap .search .input {flex:0;}
|
||||
</style> -->
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--바디-->
|
||||
<?=$this->section('body');?>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<?=$this->section('content');?>
|
||||
<div class="sub-contents-wrap db-manage-contaniner">
|
||||
<div class="title-area">
|
||||
<h2 class="page-title">통합 DB 다운로드</h2>
|
||||
</div>
|
||||
|
||||
<div class="search-wrap type-single">
|
||||
<form name="search-form" autocomplete='off' class="search d-flex justify-content-center">
|
||||
<div class="term term-small d-flex align-items-center">
|
||||
<input type="hidden" name="sdate" id="sdate"><input type="hidden" name="edate" id="edate">
|
||||
<label><input type="text" name="dates" id="dates" data="daterangepicker" autocomplete="off" aria-autocomplete="none"><i class="bi bi-calendar2-week"></i></label>
|
||||
</div>
|
||||
<div class="input">
|
||||
<button class="btn-primary" id="search_btn" type="submit">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="section reset-btn-wrap">
|
||||
<div class="reset-btn-box">
|
||||
<button type="button" class="reset-btn">필터 초기화</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(getenv('MY_SERVER_NAME') === 'resta' && auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle"><i class="bi bi-chevron-up"></i> 분류</h3>
|
||||
<div class="row" id="company-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.advertiser') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<div class="section client-list mt20">
|
||||
<h3 class="content-title toggle"><i class="bi bi-chevron-up"></i> 광고주</h3>
|
||||
<div class="row" id="advertiser-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.media') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle"><i class="bi bi-chevron-up"></i> 매체</h3>
|
||||
<div class="row" id="media-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.description') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user', 'agency')){?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle"><i class="bi bi-chevron-up"></i> 이벤트 구분</h3>
|
||||
<div class="row" id="description-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<div>
|
||||
<div class="search-wrap my-5 status_wrap">
|
||||
<div class="statusCount detail d-flex minWd"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 메시지 입력 및 다운로드 버튼 추가 -->
|
||||
<form id="download_form" class="section d-flex justify-content-center align-items-center">
|
||||
<input type="text" id="message" name="message" placeholder="사유를 입력해주세요" class="form-control me-3">
|
||||
<div class="d-flex align-items-center">
|
||||
<select id="file_format" name="file_format" class="form-select me-3">
|
||||
<option value="xlsx">Excel</option>
|
||||
<option value="csv">CSV</option>
|
||||
<option value="pdf">PDF</option>
|
||||
</select>
|
||||
<button type="submit" id="download_btn" class="btn btn-primary btn-lg d-flex align-items-center" style="white-space: nowrap;">
|
||||
<i class="bi bi-file-earmark-spreadsheet me-2"></i> 다운로드
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--스크립트-->
|
||||
<?=$this->section('script');?>
|
||||
<script>
|
||||
$('#sdate, #dates').val(moment().format('YYYY-MM-DD')); // 오늘 날짜를 입력 필드에 설정
|
||||
$('#edate').val(moment().format('YYYY-MM-DD')); // 오늘 날짜를 입력 필드에 설정
|
||||
$('#dates').daterangepicker({
|
||||
locale: {
|
||||
"format": 'YYYY-MM-DD', // 일시 노출 포맷
|
||||
"applyLabel": "확인", // 확인 버튼 텍스트
|
||||
"cancelLabel": "취소", // 취소 버튼 텍스트
|
||||
"daysOfWeek": ["일", "월", "화", "수", "목", "금", "토"],
|
||||
"monthNames": ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"]
|
||||
},
|
||||
alwaysShowCalendars: true, // 시간 노출 여부
|
||||
showDropdowns: true, // 년월 수동 설정 여부
|
||||
autoApply: true, // 확인/취소 버튼 사용여부
|
||||
maxDate: new Date(),
|
||||
autoUpdateInput: false,
|
||||
ranges: {
|
||||
오늘: [moment(), moment()],
|
||||
어제: [moment().subtract(1, "days"), moment().subtract(1, "days")],
|
||||
최근7일: [moment().subtract(7, "days").startOf("day"), moment().subtract(1, "days").endOf("day")],
|
||||
최근14일: [moment().subtract(14, "days").startOf("day"), moment().subtract(1, "days").endOf("day")],
|
||||
이번주: [moment().day(1), moment()],
|
||||
지난주: [moment().add(-1, "week").startOf("week").day(1), moment().add(-1, "week").startOf("week").add(7, "day")],
|
||||
이번달: [moment().startOf("month"), moment().endOf("month")],
|
||||
지난달: [moment().subtract(1, "month").startOf("month"), moment().subtract(1, "month").endOf("month")],
|
||||
한달전: [moment().subtract(1, "month"), moment()],
|
||||
},
|
||||
}, function(start, end, label) {
|
||||
startDate = start.format('YYYY-MM-DD'); // selected start
|
||||
endDate = end.format('YYYY-MM-DD'); // selected end
|
||||
$sdateInput = $('#sdate');
|
||||
$edateInput = $('#edate');
|
||||
$sdateInput.val(startDate);
|
||||
$edateInput.val(endDate);
|
||||
var dates = `${startDate} ~ ${endDate}`;
|
||||
if(startDate == endDate) dates = startDate;
|
||||
$('#dates').val(dates);
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
function getSelectedButtonValues(selector) {
|
||||
return $(selector).map(function() {
|
||||
return $(this).val();
|
||||
}).get().join('|');
|
||||
}
|
||||
|
||||
function renderButtons(filters, validKeys, selectedValues) {
|
||||
const hasActive = Object.values(selectedValues).some(values => values.length > 0);
|
||||
|
||||
validKeys.forEach(type => {
|
||||
if (filters[type]) {
|
||||
let $row = $(`#${type}-list`);
|
||||
let html = filters[type].map(v => {
|
||||
const isActive = selectedValues[type] && selectedValues[type].includes(v.label);
|
||||
const isOn = !isActive && hasActive && v.count;
|
||||
var count = v.count == v.total ? v.count : `${v.count}/${v.total}`;
|
||||
count = count ? count : "";
|
||||
$(`#${type}-list`).find('.zenith-loading').fadeOut(function(){$(this).remove();});
|
||||
return `
|
||||
<div class="col">
|
||||
<div class="inner">
|
||||
<button type="button" value="${v.label}" data-btn="${type}" class="${type}_btn filter_btn ${isActive ? 'active' : ''} ${isOn ? 'on' : ''}">
|
||||
<span class="account_name">${v.label}</span>
|
||||
<div class="progress">
|
||||
<div class="txt">${count}</div>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}).join('');
|
||||
$row.html('').append(html);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function renderStatus(statusCountMap) {
|
||||
let statusHtml = Object.keys(statusCountMap).map(status => `
|
||||
<dl class="col" data-status="${status}">
|
||||
<dt>${status}</dt>
|
||||
<dd>${statusCountMap[status] || 0}</dd>
|
||||
</dl>
|
||||
`).join('');
|
||||
|
||||
$('.statusCount.detail').html(statusHtml);
|
||||
}
|
||||
|
||||
function fetchData() {
|
||||
const selectedValues = {
|
||||
company: getSelectedButtonValues('.company_btn.active').split('|').filter(Boolean),
|
||||
advertiser: getSelectedButtonValues('.advertiser_btn.active').split('|').filter(Boolean),
|
||||
media: getSelectedButtonValues('.media_btn.active').split('|').filter(Boolean),
|
||||
description: getSelectedButtonValues('.description_btn.active').split('|').filter(Boolean)
|
||||
};
|
||||
|
||||
const hasActive = Object.values(selectedValues).some(values => values.length > 0);
|
||||
$('.client-list .row').filter(function(i, el) {
|
||||
if(!$(el).find('.zenith-loading').is(':visible')) $(el).append('<div class="zenith-loading"/>')
|
||||
});
|
||||
$.ajax({
|
||||
url: '<?=base_url()?>/integrate/buttons',
|
||||
type: 'POST',
|
||||
data: {
|
||||
sdate: $('#sdate').val(),
|
||||
edate: $('#edate').val(),
|
||||
stx: $('#stx').val(), // 검색어
|
||||
company: selectedValues.company.join('|'), // 회사
|
||||
advertiser: selectedValues.advertiser.join('|'), // 광고주
|
||||
media: selectedValues.media.join('|'), // 미디어
|
||||
description: selectedValues.description.join('|') // 설명
|
||||
},
|
||||
success: function(response) {
|
||||
if (response) {
|
||||
const filters = response;
|
||||
const validKeys = ['advertiser', 'description', 'media', 'company'];
|
||||
|
||||
renderButtons(filters, validKeys, selectedValues);
|
||||
|
||||
if (filters.status) {
|
||||
renderStatus(filters.status);
|
||||
}
|
||||
} else {
|
||||
console.error('Invalid response data:', response);
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error('Error fetching buttons:', error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// .filter_btn 클릭 시 active 클래스 추가 및 데이터 다시 불러오기
|
||||
$(document).on('click', '.filter_btn', function() {
|
||||
$(this).toggleClass('active');
|
||||
fetchData();
|
||||
});
|
||||
|
||||
// 조회 버튼 클릭 시 데이터 다시 불러오기
|
||||
$('#search_btn').on('click', function(event) {
|
||||
event.preventDefault();
|
||||
fetchData();
|
||||
});
|
||||
|
||||
// 필터 초기화 버튼 클릭 이벤트
|
||||
$('.reset-btn').on('click', function() {
|
||||
window.location.reload(); // 현재 페이지를 다시 로드
|
||||
});
|
||||
|
||||
// 초기 로드 시 선택된 버튼이 없으므로 hasActive를 false로 설정
|
||||
fetchData();
|
||||
|
||||
// 다운로드 버튼 클릭 시 데이터 전송
|
||||
$('#download_form').on('submit', function(event) {
|
||||
event.preventDefault();
|
||||
const message = $.trim($('#message').val());
|
||||
if (message.length < 5) {
|
||||
alert('사유를 5글자 이상 입력해주세요.');
|
||||
return;
|
||||
}
|
||||
const data = {
|
||||
sdate: $('#sdate').val(),
|
||||
edate: $('#edate').val(),
|
||||
advertiser: getSelectedButtonValues('.advertiser_btn.active'),
|
||||
media: getSelectedButtonValues('.media_btn.active'),
|
||||
description: getSelectedButtonValues('.description_btn.active'),
|
||||
message: message,
|
||||
file_format: $('#file_format').val() // 파일 형식 추가
|
||||
};
|
||||
|
||||
// 버튼 비활성화
|
||||
$('#download_btn').prop('disabled', true).text('다운로드 중...');
|
||||
|
||||
$.ajax({
|
||||
url: '<?=base_url()?>/integrate/download-send',
|
||||
type: 'POST',
|
||||
data: data,
|
||||
xhrFields: {
|
||||
responseType: 'blob' // 바이너리 데이터로 응답 받기
|
||||
},
|
||||
success: function(response, status, xhr) {
|
||||
const contentType = xhr.getResponseHeader('Content-Type');
|
||||
if (contentType && contentType.indexOf('application/json') !== -1) {
|
||||
// 응답이 JSON인 경우
|
||||
if(response.status == 'error') {
|
||||
alert(response.message);
|
||||
}
|
||||
} else {
|
||||
// 응답이 Blob인 경우
|
||||
const blob = new Blob([response], { type: contentType });
|
||||
const url = window.URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
const fileFormat = $('#file_format').val();
|
||||
const fileExtension = fileFormat === 'xlsx' ? 'xlsx' : fileFormat === 'csv' ? 'csv' : 'pdf';
|
||||
a.download = `통합DB_다운로드_<?php echo date('Y-m-d_H-i-s'); ?>.${fileExtension}`;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
window.URL.revokeObjectURL(url);
|
||||
|
||||
$('#download_form')[0].reset();
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.log(xhr, status, error);
|
||||
},
|
||||
complete: function() {
|
||||
// 요청 완료 후 버튼을 다시 활성화
|
||||
$('#download_btn').prop('disabled', false).html('<i class="bi bi-file-earmark-spreadsheet me-2"></i> 다운로드');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--푸터-->
|
||||
<?=$this->section('footer');?>
|
||||
<?=$this->endSection();?>
|
||||
@@ -0,0 +1,857 @@
|
||||
<?=$this->extend('templates/front.php');?>
|
||||
|
||||
<!--타이틀-->
|
||||
<?=$this->section('title');?>
|
||||
ZENITH - 통합 DB 관리
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--헤더-->
|
||||
<?=$this->section('header');?>
|
||||
<link href="/static/css/datatables.css" rel="stylesheet">
|
||||
<script src="/static/node_modules/datatables.net/js/dataTables.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-buttons/js/dataTables.buttons.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-buttons/js/buttons.html5.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-buttons/js/buttons.colVis.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-staterestore/js/dataTables.stateRestore.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-fixedheader/js/dataTables.fixedHeader.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-keytable/js/dataTables.keyTable.min.js"></script>
|
||||
<!-- bootstrap5 -->
|
||||
<link href="/static/node_modules/datatables.net-bs5/css/dataTables.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-buttons-bs5/css/buttons.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-staterestore-bs5/css/stateRestore.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-fixedheader-bs5/css/fixedHeader.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-fixedcolumns-bs5/css/fixedColumns.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-keytable-bs5/css/keyTable.bootstrap5.min.css" rel="stylesheet">
|
||||
<script src="/static/node_modules/datatables.net-bs5/js/dataTables.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-buttons-bs5/js/buttons.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-staterestore-bs5/js/stateRestore.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-fixedheader-bs5/js/fixedHeader.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-fixedcolumns-bs5/js/fixedColumns.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-keytable-bs5/js/keyTable.bootstrap5.min.js"></script>
|
||||
<script src="/static/js/jquery.number.min.js"></script>
|
||||
<script src="/static/node_modules/jszip/dist/jszip.min.js"></script>
|
||||
<script src="/static/js/pdfmake/pdfmake.min.js"></script>
|
||||
<script src="/static/js/pdfmake/vfs_fonts.js"></script>
|
||||
<style>
|
||||
.memo-all{text-align:right;}
|
||||
.sub-contents-wrap table.dataTable th.dt-type-center,
|
||||
.sub-contents-wrap table.dataTable td.dt-type-center {text-align:center;}
|
||||
.table-responsive .dt-search {justify-content:flex-start;}
|
||||
.btns-memo-style {top:5px;}
|
||||
</style>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--바디-->
|
||||
<?=$this->section('body');?>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<?=$this->section('content');?>
|
||||
<div class="sub-contents-wrap db-manage-contaniner">
|
||||
<div class="title-area">
|
||||
<h2 class="page-title">통합 DB 관리</h2>
|
||||
<!-- <p class="title-disc">안하는 사람은 끝까지 할 수 없지만, 못하는 사람은 언젠가는 해 낼 수도 있다.</p> -->
|
||||
</div>
|
||||
|
||||
<div class="search-wrap type-single">
|
||||
<form name="search-form" autocomplete='off' class="search d-flex justify-content-center">
|
||||
<div class="term term-small d-flex align-items-center">
|
||||
<input type="hidden" name="sdate" id="sdate"><input type="hidden" name="edate" id="edate">
|
||||
<label><input type="text" name="dates" id="dates" data="daterangepicker" autocomplete="off" aria-autocomplete="none"><i class="bi bi-calendar2-week"></i></label>
|
||||
</div>
|
||||
<div class="input">
|
||||
<button class="btn-primary" id="search_btn" type="submit">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="section reset-btn-wrap">
|
||||
<div class="reset-btn-box">
|
||||
<button type="button" class="reset-btn">필터 초기화</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(getenv('MY_SERVER_NAME') === 'resta' && auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle"><i class="bi bi-chevron-up"></i> 분류</h3>
|
||||
<div class="row" id="company-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.advertiser') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user', 'agency')){?>
|
||||
<div class="section client-list mt20">
|
||||
<h3 class="content-title toggle"><i class="bi bi-chevron-up"></i> 광고주</h3>
|
||||
<div class="row" id="advertiser-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.media') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user', 'agency')){?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle"><i class="bi bi-chevron-up"></i> 매체</h3>
|
||||
<div class="row" id="media-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.description') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user', 'agency')){?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle"><i class="bi bi-chevron-up"></i> 이벤트 구분</h3>
|
||||
<div class="row" id="description-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
|
||||
<div>
|
||||
<div class="search-wrap my-5 status_wrap">
|
||||
<div class="statusCount detail d-flex minWd"></div>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive db-table-responsive">
|
||||
<div class="btns-memo-style">
|
||||
<span class="btns-title">메모 표시:</span>
|
||||
<button type="button" class="btns-memo" value="modal" title="새창으로 표시"><i class="bi bi-window-stack"></i></button>
|
||||
<button type="button" class="btns-memo" value="table" title="테이블에 표시"><i class="bi bi-table"></i></button>
|
||||
<button type="button" class="btns-memo" value="all" title="한번에 표시"><i class="bi bi-eye"></i></button>
|
||||
</div>
|
||||
<table class="dataTable table table-default deviceTable" id="deviceTable">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th class="first">#</th>
|
||||
<?php if(getenv('MY_SERVER_NAME') === 'resta' && auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<th>분류</th>
|
||||
<?php }?></php>
|
||||
<th>이벤트</th>
|
||||
<?php if(auth()->user()->hasPermission('integrate.advertiser') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<th>광고주</th>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.media') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<th>매체</th>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.description') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<th>이벤트 구분</th>
|
||||
<?php }?>
|
||||
<th>이름</th>
|
||||
<th>전화번호</th>
|
||||
<th>나이</th>
|
||||
<th>성별</th>
|
||||
<th>기타</th>
|
||||
<th>사이트</th>
|
||||
<th>등록일</th>
|
||||
<th>메모</th>
|
||||
<th class="last">인정기준</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- 개별 메모 -->
|
||||
<div class="modal fade" id="modal-integrate-memo" tabindex="-1" aria-labelledby="modal-integrate-memo-label" aria-hidden="true">
|
||||
<div class="modal-dialog modal-sm sm-txt">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title" id="modal-integrate-memo-label"><i class="bi bi-file-text"></i> 개별 메모<span class="title"></span></h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form class="regi-form">
|
||||
<fieldset>
|
||||
<legend>메모 작성</legend>
|
||||
<textarea></textarea>
|
||||
<button type="button" class="btn-regi">작성</button>
|
||||
</fieldset>
|
||||
</form>
|
||||
<ul class="memo-list m-2"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- //개별 메모 -->
|
||||
</div>
|
||||
</div>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--스크립트-->
|
||||
<?=$this->section('script');?>
|
||||
<script>
|
||||
let active_status;
|
||||
$('#sdate, #dates').val(moment().format('YYYY-MM-DD')); // 오늘 날짜를 입력 필드에 설정
|
||||
$('#edate').val(moment().format('YYYY-MM-DD')); // 오늘 날짜를 입력 필드에 설정
|
||||
jQuery.fn.dataTable.ext.type.search.select = function(data) {
|
||||
// data가 select 요소인지 확인
|
||||
if (typeof data === 'string' && data.indexOf('<select') !== -1) {
|
||||
// jQuery를 사용하여 select 요소를 파싱하고 선택된 옵션의 텍스트를 가져옴
|
||||
var select = $(data);
|
||||
var selectedText = select.find('option:selected').text();
|
||||
return selectedText ? selectedText : '';
|
||||
}
|
||||
return data;
|
||||
};
|
||||
var lead_status = {"1":"인정", "2":"중복", "3":"성별불량", "4":"나이불량", "5":"콜불량", "6":"번호불량", "7":"테스트", "8":"이름불량", "9":"지역불량", "10":"업체불량", "11":"미성년자", "12":"본인아님", "13":"쿠키중복", "99":"확인"};
|
||||
let dataTable = $('.dataTable').DataTable({
|
||||
"dom": '<fr<t>ip>', // DataTables의 DOM 구조 설정
|
||||
"fixedHeader": {
|
||||
"header" : true, // 헤더 고정
|
||||
"footer" : true, // 푸터 고정
|
||||
},
|
||||
"autoWidth": true, // 자동 너비 조정 활성화
|
||||
"processing" : true, // 처리 중 표시 활성화
|
||||
"serverSide" : false, // 서버 사이드 처리 비활성화
|
||||
"responsive": true, // 반응형 테이블 활성화
|
||||
"searching": true, // 검색 기능 활성화
|
||||
"order": [[0, "desc"]], // seq 항목을 역순 정렬
|
||||
"ordering": true, // 정렬 기능 활성화
|
||||
"orderMulti": false, // 다중 열 정렬 활성화
|
||||
"orderCellsTop": false, // 열 헤더 클릭 시 정렬 활성화
|
||||
"paging": true, // 페이징 비활성화
|
||||
"pageLength": 25, // 페이지당 표시할 행 수
|
||||
"info": false, // 정보 표시 비활성화
|
||||
"scroller": false, // 스크롤러 비활성화
|
||||
"scrollX": true, // 가로 스크롤 활성화
|
||||
"stateSave": true, // 상태 저장 활성화
|
||||
"deferRender": false, // 렌더링 지연 비활성화
|
||||
"rowId": "seq",
|
||||
"language": {"url": '/static/js/dataTables.i18n.json'}, //한글화 파일
|
||||
"ajax": {
|
||||
"url": "<?=base_url()?>/integrate/list", // AJAX URL 설정
|
||||
"type": "POST", // HTTP 요청 방식 설정
|
||||
"data": function(d) {
|
||||
d.date = {
|
||||
sdate: $('#sdate').val(), // 시작 날짜
|
||||
edate: $('#edate').val() // 종료 날짜
|
||||
};
|
||||
},
|
||||
"dataSrc": function(json) {
|
||||
if (json && json.data) {
|
||||
setFilter(json.data);
|
||||
}
|
||||
return json.data;
|
||||
}
|
||||
},
|
||||
"columnDefs": [
|
||||
<?php
|
||||
$target = 10;
|
||||
if(getenv('MY_SERVER_NAME') === 'resta'
|
||||
&& auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')) {
|
||||
++$target;
|
||||
}
|
||||
if(auth()->user()->hasPermission('integrate.advertiser')
|
||||
|| auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){
|
||||
++$target;
|
||||
}
|
||||
if(auth()->user()->hasPermission('integrate.media')
|
||||
|| auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){
|
||||
++$target;
|
||||
}
|
||||
if(auth()->user()->hasPermission('integrate.description')
|
||||
|| auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){
|
||||
++$target;
|
||||
}
|
||||
?>
|
||||
{ type: "select", target: <?php echo $target;?> }, // 13은 status 컬럼의 인덱스입니다. 필요에 따라 조정하세요.
|
||||
],
|
||||
"columns": [
|
||||
{ "data": "seq", "width": "4%", "className": "dt-type-center" },
|
||||
<?php if(getenv('MY_SERVER_NAME') === 'resta' && auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
{ "data": null, "render": function(data, type, row) {
|
||||
return row.company;
|
||||
}
|
||||
},
|
||||
<?php }?>
|
||||
{ "data": "info_seq","width": "4%", "className": "dt-type-center", "render": function(data, type, row) {
|
||||
ico = '';
|
||||
if(row.another_url == 1) ico = `<span class="another_url">🐢</span>`;
|
||||
return data?ico+'<a href="'+row.event_url+'" target="event_pop">'+data+'</a>':'';
|
||||
}
|
||||
},
|
||||
<?php if(auth()->user()->hasPermission('integrate.advertiser') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
{ "data": "advertiser","width": "7%", "className": "dt-type-center"},
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.media') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
{ "data": "media", "className": "dt-type-center" },
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.description') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
{ "data": "description","width":"10%", "className": "dt-type-center","render": function(data) {
|
||||
return `<div class="mw10">${data}</div>`
|
||||
}
|
||||
},
|
||||
<?php }?>
|
||||
{ "data": "name", "width": "5%", "className": "dt-type-center", "render": function(data) {
|
||||
return '<span style="display:inline-block;width:50px;max-height:15px;overflow:hidden" title="'+$(`<span>${data}</span>`).text()+'">'+(data ? data : '')+'</span>';
|
||||
}
|
||||
},
|
||||
{ "data": "dec_phone","width":"8%", "className": "dt-type-center","render": function(data) {
|
||||
return `<div class="mw10">${data}</div>`
|
||||
}
|
||||
},
|
||||
{ "data": "age", "width": "3%", "className": "dt-type-center" },
|
||||
{ "data": "gender", "width": "3%" },
|
||||
{ "data": "add","render": function(data) {
|
||||
return `<div class="mw10">${data}</div>`
|
||||
}
|
||||
},
|
||||
{ "data": "site","width":"6%", "className": "dt-type-center" },
|
||||
{ "data": "reg_date","width":"6%", "className": "dt-type-center","render": function(data) {
|
||||
return `<div class="mw10">${data}</div>`
|
||||
}
|
||||
},
|
||||
{ "data": "memo_cnt", "className": "memo","width":"3%", "className": "dt-type-center", "render" : function(data) { // data-bs-toggle="modal"
|
||||
var html = '<button class="btn_memo text-dark position-relative" data-bs-target="#modal-integrate-memo"><i class="bi bi-chat-square-text h4"></i>';
|
||||
html += '<span class="position-absolute top--10 start-100 translate-middle badge rounded-pill bg-danger badge-'+data+'">'+data+'</span>';
|
||||
html += '</button>';
|
||||
return html;
|
||||
}
|
||||
},
|
||||
{
|
||||
"data": 'status',"width":"6%", "render": function (data, type, row) {
|
||||
<?php if(auth()->user()->hasPermission('integrate.status') || auth()->user()->inGroup('superadmin', 'admin')) { ?>
|
||||
return `
|
||||
<select class="lead-status form-select form-select-sm data-del">
|
||||
${Object.keys(lead_status).map(key => `
|
||||
<option value="${key}" ${data == key ? "selected" : ""}>${lead_status[key]}</option>
|
||||
`).join('')}
|
||||
</select>
|
||||
`;
|
||||
<?php } else { ?>
|
||||
return `${lead_status[data] || ''}`;
|
||||
<?php } ?>
|
||||
}
|
||||
},
|
||||
],
|
||||
"rowCallback": function(row, data) {
|
||||
},
|
||||
"stateSaveParams": function(settings, data) {
|
||||
// memoState를 저장 데이터에 추가
|
||||
data.memoState = settings.oInit.memoState;
|
||||
// folded 상태 저장
|
||||
data.foldedStates = settings.oInit.foldedStates;
|
||||
},
|
||||
"stateLoadParams": function(settings, data) {
|
||||
// 저장된 memoState를 불러와서 settings에 추가
|
||||
if (data.memoState) {
|
||||
settings.oInit.memoState = data.memoState;
|
||||
}
|
||||
if (data.foldedStates) {
|
||||
settings.oInit.foldedStates = data.foldedStates;
|
||||
}
|
||||
},
|
||||
"initComplete": function(settings, json) {
|
||||
// foldedStates 복원
|
||||
if (settings.oInit.foldedStates) {
|
||||
$('.client-list > .content-title').each(function(index) {
|
||||
if (settings.oInit.foldedStates[index]) {
|
||||
$(this).addClass('folded');
|
||||
} else {
|
||||
$(this).removeClass('folded');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// memoState 복원
|
||||
let savedMemoState = settings.oInit && settings.oInit.memoState ? settings.oInit.memoState : 'modal';
|
||||
$(`.btns-memo[value="${savedMemoState}"]`).addClass('active');
|
||||
if (savedMemoState === 'all') displayAllMemos();
|
||||
|
||||
updateFilterButtons.call(this);
|
||||
},
|
||||
"drawCallback": function(settings) {
|
||||
updateFilterButtons.call(this);
|
||||
updateStatusCount.call(this);
|
||||
if ($('.btns-memo.active').val() === 'all') {
|
||||
debouncedDisplayAllMemos();
|
||||
}
|
||||
//통합DB 확인 시 테스트일 경우 표기 추가 240724
|
||||
$('#deviceTable td.dt-type-center span').each(function() {
|
||||
if ($(this).text().includes('테스트') || $(this).text().includes('test')) {
|
||||
$(this).closest('tr').addClass('on');
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
var windowWidth = $(window).width();
|
||||
if (windowWidth >= 1024) { // 태블릿 이상의 너비에서만 fixedColumns 적용
|
||||
new $.fn.dataTable.FixedColumns(dataTable, {
|
||||
leftColumns: 5, // 왼쪽에서 고정할 컬럼 수
|
||||
rightColumns: 0 // 오른쪽에서 고정할 컬럼 수
|
||||
});
|
||||
}
|
||||
// Debounce 함수 정의
|
||||
function debounce(func, wait) {
|
||||
let timeout;
|
||||
return function(...args) {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(() => func.apply(this, args), wait);
|
||||
};
|
||||
}
|
||||
const debouncedDisplayAllMemos = debounce(displayAllMemos, 1000);
|
||||
// 필터 버튼 업데이트 함수
|
||||
function updateFilterButtons() {
|
||||
var api = this.api(); // DataTables API 인스턴스를 가져옵니다.
|
||||
var data = api.rows({ search: 'applied' }).data().toArray(); // 현재 페이지의 데이터를 배열로 변환합니다.
|
||||
let uniqueValues = { advertiser: [], media: [], description: [] }; // 고유 값 저장을 위한 객체 초기화
|
||||
var columnToListMap = {
|
||||
'company': 'company-list',
|
||||
'advertiser': 'advertiser-list',
|
||||
'media': 'media-list',
|
||||
'description': 'description-list'
|
||||
};
|
||||
|
||||
// 필터링 상태에 따라 버튼에 active 클래스 적용
|
||||
dataTable.columns().every(function() {
|
||||
var column = this;
|
||||
var search = column.search();
|
||||
if (search) {
|
||||
if(typeof search == 'function') return true;
|
||||
var searchRegex = new RegExp(search.replace(/\\/g, ''));
|
||||
var expectedListId = columnToListMap[column.dataSrc()];
|
||||
|
||||
if (expectedListId) {
|
||||
$(`#${expectedListId} .filter_btn`).each(function() {
|
||||
var btnValue = $.trim($(this).text());
|
||||
if (searchRegex.test(btnValue)) {
|
||||
$(this).addClass('active');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
// 각 행의 데이터를 순회하면서 고유 값 배열에 추가합니다.
|
||||
data.forEach(row => {
|
||||
['advertiser', 'media', 'description'].forEach(key => {
|
||||
if (!uniqueValues[key].includes(row[key])) { // 배열에 정확히 일치하는 값이 없으면 추가
|
||||
uniqueValues[key].push(row[key]);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 데이터 수량 계산 (status가 '인정'인 것만 카운트)
|
||||
let countMap = { advertiser: {}, media: {}, description: {} };
|
||||
api.rows({ search: 'applied' }).data().each(function(row) {
|
||||
['advertiser', 'media', 'description'].forEach(key => {
|
||||
let value = row[key];
|
||||
if (row['status'] == '1' && typeof value === 'string') {
|
||||
if(value == "") value = 'empty';
|
||||
countMap[key][value] = (countMap[key][value] || 0) + 1;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 수량 업데이트
|
||||
Object.keys(countMap).forEach(key => {
|
||||
let $list = $(`#${key}-list`);
|
||||
if ($list.length) { // 요소가 존재하는지 확인
|
||||
$list.find('.filter_btn').each(function() {
|
||||
var btnValue = $(this).val();
|
||||
if(btnValue == "") btnValue = 'empty';
|
||||
var count = countMap[key][btnValue] || "";
|
||||
$(this).siblings('.progress').find('.txt').text(count);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 활성화된 필터 버튼이 없는 경우, 모든 필터 버튼의 'on' 클래스를 제거하고 함수를 종료합니다.
|
||||
if (!$('.filter_btn.active').length) {
|
||||
$('.filter_btn').removeClass('on');
|
||||
return;
|
||||
}
|
||||
|
||||
// 각 필터 유형에 대해 'on' 클래스를 토글합니다.
|
||||
Object.keys(uniqueValues).forEach(key => {
|
||||
let $list = $(`#${key}-list`);
|
||||
if ($list.length) { // 요소가 존재하는지 확인
|
||||
$list.find('.filter_btn').not('.active').each(function() {
|
||||
var btnText = $(this).text().trim();
|
||||
var isExactMatch = uniqueValues[key].some(function(value) { // 완전 일치 여부를 확인합니다.
|
||||
return value === btnText;
|
||||
});
|
||||
$(this).toggleClass('on', isExactMatch); // 'on' 클래스를 토글합니다.
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 필터 버튼 세팅 함수
|
||||
function setFilter(data) {
|
||||
const unique = (prop) => [...new Set(data.map(item => item[prop]))];
|
||||
const filters = {
|
||||
media: unique('media'),
|
||||
advertiser: unique('advertiser'),
|
||||
description: unique('description'),
|
||||
company: unique('company')
|
||||
};
|
||||
|
||||
Object.keys(filters).forEach(type => {
|
||||
let $row = $(`#${type}-list`);
|
||||
let html = filters[type].map(v => `
|
||||
<div class="col">
|
||||
<div class="inner">
|
||||
<button type="button" value="${v}" data-btn="${type}" class="${type}_btn filter_btn">
|
||||
<span class="account_name">${v}</span>
|
||||
</button>
|
||||
<div class="progress">
|
||||
<div class="txt">0</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
$row.html('').append(html);
|
||||
|
||||
// 정렬
|
||||
let buttons = $row.find('.filter_btn').toArray();
|
||||
buttons.sort((a, b) => $(a).find('.account_name').text().localeCompare($(b).find('.account_name').text(), 'en', { sensitivity: 'base' }));
|
||||
buttons.forEach(button => $row.append(button.parentNode.parentNode));
|
||||
});
|
||||
}
|
||||
// statusCount 업데이트 함수
|
||||
function updateStatusCount() {
|
||||
var api = this.api(); // DataTables API 인스턴스를 가져옵니다.
|
||||
let statusCountMap = {};
|
||||
|
||||
// active_status 값으로 .statusCount dl dt 텍스트 찾아서 클래스 추가
|
||||
if(typeof active_status != 'undefined') {
|
||||
$('.statusCount dl dt').each(function() {
|
||||
if ($(this).text() === lead_status[active_status]) {
|
||||
$(this).closest('dl').addClass('active');
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
api.rows({ search: 'applied' }).data().each(function(row) {
|
||||
let status = row['status'];
|
||||
if (status) {
|
||||
statusCountMap[status] = (statusCountMap[status] || 0) + 1;
|
||||
}
|
||||
});
|
||||
|
||||
let statusHtml = Object.keys(lead_status).map(status => `
|
||||
<dl class="col" data-status="${status}">
|
||||
<dt>${lead_status[status]}</dt>
|
||||
<dd>${statusCountMap[status] || 0}</dd>
|
||||
</dl>
|
||||
`).join('');
|
||||
|
||||
$('.statusCount').html(statusHtml);
|
||||
|
||||
// dl 클릭 이벤트 바인딩
|
||||
$('.statusCount dl').on('click', function() {
|
||||
var statusColumnIndex = getColumnIndexByHeader('status');
|
||||
|
||||
if ($(this).hasClass('active')) {
|
||||
$(this).removeClass('active');
|
||||
active_status = undefined;
|
||||
dataTable.column(statusColumnIndex).search('').draw();
|
||||
} else {
|
||||
$('.statusCount dl').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
let status = $(this).data('status');
|
||||
active_status = status;
|
||||
dataTable.column(statusColumnIndex).search((d) => {return d == lead_status[status]}).draw();
|
||||
}
|
||||
});
|
||||
}
|
||||
// 컬럼 인덱스 가져오기
|
||||
function getColumnIndexByHeader(dataName) {
|
||||
var index = -1;
|
||||
dataTable.settings().init().columns.forEach(function(column, i) {
|
||||
if (column.data === dataName) {
|
||||
index = i;
|
||||
return false; // 반복문 종료
|
||||
}
|
||||
});
|
||||
return index;
|
||||
}
|
||||
|
||||
// 상태 변경 이벤트
|
||||
$(document).on('change', '.lead-status', function() {
|
||||
var $select = $(this);
|
||||
var $row = $select.closest('tr');
|
||||
var seq = $row.attr('id');
|
||||
var oldStatus = dataTable.row($row).data().status;
|
||||
var newStatus = $select.val();
|
||||
|
||||
$.ajax({
|
||||
url: '<?=base_url()?>/integrate/setstatus',
|
||||
type: 'POST',
|
||||
data: {
|
||||
seq: seq,
|
||||
oldstatus: oldStatus,
|
||||
status: newStatus
|
||||
},
|
||||
success: function(response) {
|
||||
// 성공 시 처리할 내용
|
||||
console.log('Status updated successfully');
|
||||
// 메모 저장
|
||||
var memo = `인정기준 변경(${lead_status[oldStatus]} > ${lead_status[newStatus]})`;
|
||||
saveMemo(memo, seq, $row);
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
// 에러 시 처리할 내용
|
||||
console.error('Error updating status:', error);
|
||||
}
|
||||
});
|
||||
});
|
||||
// 메모 가져오기
|
||||
function fetchMemo(seq, callback) {
|
||||
$.ajax({
|
||||
url: '<?=base_url()?>/integrate/getmemo',
|
||||
type: 'GET',
|
||||
data: { seq: seq },
|
||||
success: function(response) {
|
||||
callback(response);
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error('Error fetching memo:', error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 메모 표시
|
||||
function displayMemo(memoList, displayType, $row = null) {
|
||||
var memoContent = '';
|
||||
|
||||
if (Array.isArray(memoList)) {
|
||||
memoContent = memoList.map(function(memo) {
|
||||
return `
|
||||
<div class="memo-item">
|
||||
<div class="memo-body">
|
||||
<p>${memo.memo}</p>
|
||||
</div>
|
||||
<div class="memo-header">
|
||||
<strong>${memo.username}</strong>
|
||||
<span class="memo-date">${memo.reg_date}</span>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
if (displayType === 'modal') {
|
||||
var $memoListContainer = $('#modal-integrate-memo .memo-list');
|
||||
$memoListContainer.empty().append(memoContent);
|
||||
$('#modal-integrate-memo').data('leads-seq', $row.attr('id')); // leads_seq 저장
|
||||
|
||||
// 이름 컬럼의 인덱스를 동적으로 찾기
|
||||
var nameColumnIndex = getColumnIndexByHeader('name');
|
||||
if (nameColumnIndex !== -1) {
|
||||
var name = $row.find('td').eq(nameColumnIndex).text(); // 이름이 있는 열의 인덱스를 사용하여 이름을 가져옴
|
||||
$('#modal-integrate-memo-label').html(`<i class="bi bi-file-text"></i> 개별 메모 - ${name}`);
|
||||
} else {
|
||||
$('#modal-integrate-memo-label').html(`<i class="bi bi-file-text"></i> 개별 메모`);
|
||||
}
|
||||
|
||||
$('#modal-integrate-memo').modal('show');
|
||||
} else if ((displayType === 'table' || displayType === 'all') && $row) {
|
||||
var memoForm = `
|
||||
<form class="regi-form">
|
||||
<fieldset>
|
||||
<legend>메모 작성</legend>
|
||||
<textarea></textarea>
|
||||
<button type="button" class="btn-regi">작성</button>
|
||||
</fieldset>
|
||||
</form>
|
||||
`;
|
||||
|
||||
if ($row.next().hasClass('memo-row')) {
|
||||
$row.next().remove();
|
||||
} else {
|
||||
$row.after(`<tr class="memo-row"><td class="pl10 pr10" colspan="15">${memoForm}${memoContent}</td></tr>`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 모든 메모 표시
|
||||
function displayAllMemos() {
|
||||
$('.btn_memo').each(function() {
|
||||
var $row = $(this).closest('tr');
|
||||
var seq = $row.attr('id');
|
||||
var badgeCount = $(this).find('.badge').text();
|
||||
|
||||
if (badgeCount > 0) {
|
||||
fetchMemo(seq, function(memoList) {
|
||||
displayMemo(memoList, 'table', $row);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
// 메모 저장 함수
|
||||
function saveMemo(memo, leads_seq, $form, $row) {
|
||||
$.ajax({
|
||||
url: '<?=base_url()?>/integrate/addmemo',
|
||||
type: 'POST',
|
||||
data: {
|
||||
memo: memo,
|
||||
leads_seq: leads_seq
|
||||
},
|
||||
success: function(response) {
|
||||
// 메모 추가 후 폼 초기화
|
||||
$form.find('textarea').val('');
|
||||
// 필요 시 메모 목록 갱신
|
||||
fetchMemo(leads_seq, function(memoList) {
|
||||
var memoState = $('.btns-memo.active').val();
|
||||
displayMemo(memoList, memoState, $row);
|
||||
updateMemoBadge($row, memoList.length);
|
||||
});
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
// 에러 시 처리할 내용
|
||||
console.error('Error adding memo:', error);
|
||||
}
|
||||
});
|
||||
}
|
||||
// 메모 배지 업데이트
|
||||
function updateMemoBadge($row, count) {
|
||||
var $btnMemo = $row.find('.btn_memo');
|
||||
$btnMemo.find('.badge').text(count);
|
||||
}
|
||||
|
||||
// 모든 메모 업데이트
|
||||
function updateAllMemos() {
|
||||
$('.btn_memo').each(function() {
|
||||
var $row = $(this).closest('tr');
|
||||
var seq = $row.attr('id');
|
||||
|
||||
fetchMemo(seq, function(memoList) {
|
||||
updateMemoBadge($row, memoList.length);
|
||||
});
|
||||
});
|
||||
}
|
||||
$('#dates').daterangepicker({
|
||||
locale: {
|
||||
"format": 'YYYY-MM-DD', // 일시 노출 포맷
|
||||
"applyLabel": "확인", // 확인 버튼 텍스트
|
||||
"cancelLabel": "취소", // 취소 버튼 텍스트
|
||||
"daysOfWeek": ["일", "월", "화", "수", "목", "금", "토"],
|
||||
"monthNames": ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"]
|
||||
},
|
||||
// singleDatePicker: true, // 단일 날짜 선택 활성화
|
||||
alwaysShowCalendars: true, // 시간 노출 여부
|
||||
showDropdowns: true, // 년월 수동 설정 여부
|
||||
autoApply: true, // 확인/취소 버튼 사용여부
|
||||
maxDate: new Date(),
|
||||
autoUpdateInput: false,
|
||||
maxSpan: {
|
||||
days: 30
|
||||
},
|
||||
ranges: {
|
||||
오늘: [moment(), moment()],
|
||||
어제: [moment().subtract(1, "days"), moment().subtract(1, "days")],
|
||||
최근7일: [moment().subtract(7, "days").startOf("day"), moment().subtract(1, "days").endOf("day")],
|
||||
최근14일: [moment().subtract(14, "days").startOf("day"), moment().subtract(1, "days").endOf("day")],
|
||||
이번주: [moment().day(1), moment()],
|
||||
지난주: [moment().add(-1, "week").startOf("week").day(1), moment().add(-1, "week").startOf("week").add(7, "day")],
|
||||
이번달: [moment().startOf("month"), moment().endOf("month")],
|
||||
지난달: [moment().subtract(1, "month").startOf("month"), moment().subtract(1, "month").endOf("month")],
|
||||
한달전: [moment().subtract(1, "month"), moment()],
|
||||
},
|
||||
}, function(start, end, label) {
|
||||
startDate = start.format('YYYY-MM-DD'); // selected start
|
||||
endDate = end.format('YYYY-MM-DD'); // selected end
|
||||
$sdateInput = $('#sdate');
|
||||
$edateInput = $('#edate');
|
||||
$sdateInput.val(startDate);
|
||||
$edateInput.val(endDate);
|
||||
var dates = `${startDate} ~ ${endDate}`;
|
||||
if(startDate == endDate) dates = startDate;
|
||||
$('#dates').val(dates);
|
||||
});
|
||||
|
||||
/*
|
||||
* click Event List
|
||||
*/
|
||||
// 필터 초기화
|
||||
$(document).on('click', '.reset-btn', function() {
|
||||
$('.filter_btn').removeClass('active on');
|
||||
dataTable.columns().search('').draw();
|
||||
|
||||
// DataTable 상태 초기화
|
||||
dataTable.state.clear();
|
||||
});
|
||||
// content-title 클릭 시 folded 상태 토글 및 저장
|
||||
$(document).on('click', '.client-list > .content-title', function() {
|
||||
// DataTables 상태 저장
|
||||
let settings = dataTable.settings();
|
||||
settings[0].oInit.foldedStates = [];
|
||||
$('.client-list > .content-title').each(function() {
|
||||
settings[0].oInit.foldedStates.push($(this).hasClass('folded'));
|
||||
});
|
||||
// DataTable 상태 저장
|
||||
dataTable.state.save();
|
||||
});
|
||||
// 메모 상태 저장 및 초기화
|
||||
$(document).on('click', '.btns-memo', function() {
|
||||
$('.btns-memo').removeClass('active'); // 모든 버튼에서 active 클래스 제거
|
||||
$(this).addClass('active'); // 클릭된 버튼에 active 클래스 추가
|
||||
|
||||
// DataTables 상태 저장
|
||||
let memoState = $(this).val();
|
||||
let settings = dataTable.settings();
|
||||
settings[0].oInit.memoState = memoState; // DataTables 상태에 memoState 추가
|
||||
dataTable.state.save(); // 상태 저장
|
||||
|
||||
// 모달 및 테이블 초기화
|
||||
$('#modal-integrate-memo .memo-list').empty();
|
||||
$('.memo-row').remove();
|
||||
|
||||
// 메모 목록 갱신
|
||||
if (memoState === 'all') {
|
||||
displayAllMemos();
|
||||
}
|
||||
});
|
||||
// 필터 버튼 클릭 시 해당 컬럼 필터링
|
||||
$(document).on('click', '.filter_btn', function() {
|
||||
$(this).toggleClass('active'); // 버튼 활성화/비활성화 토글
|
||||
|
||||
// 모든 열의 검색을 초기화
|
||||
dataTable.columns().search('');
|
||||
|
||||
// 각 컬럼별로 활성화된 버튼의 텍스트를 배열로 수집하고 정규 표현식으로 조합
|
||||
dataTable.columns().every(function() {
|
||||
var column = this;
|
||||
var filterType = column.dataSrc(); // 컬럼 헤더를 기반으로 필터 타입 결정
|
||||
var activeFilters = $(`.filter_btn.active[data-btn="${filterType}"]`).map(function() {
|
||||
return $.fn.dataTable.util.escapeRegex($(this).val());
|
||||
}).get();
|
||||
if (activeFilters.length) {
|
||||
var regex = `^(${activeFilters.join('|')})$`; // '값1|값2|값3' 형태로 조합
|
||||
column.search(regex, true, false); // 정규 표현식 검색 활성화
|
||||
} else {
|
||||
column.search(''); // 필터가 없는 경우 검색 초기화
|
||||
}
|
||||
});
|
||||
|
||||
dataTable.draw(); // 필터링 후 테이블 업데이트
|
||||
});
|
||||
// 메모 버튼 클릭 이벤트
|
||||
$(document).on('click', '.btn_memo', function() {
|
||||
var $row = $(this).closest('tr');
|
||||
var seq = $row.attr('id');
|
||||
var memoState = $('.btns-memo.active').val();
|
||||
|
||||
fetchMemo(seq, function(memoList) {
|
||||
displayMemo(memoList, memoState, $row);
|
||||
});
|
||||
});
|
||||
// regi-form 및 모달에서 메모 전송 이벤트 처리
|
||||
$(document).on('click', '.btn-regi', function() {
|
||||
var $form = $(this).closest('form');
|
||||
var memo = $form.find('textarea').val();
|
||||
var $row, leads_seq;
|
||||
|
||||
if ($form.closest('#modal-integrate-memo').length) {
|
||||
// 모달에서 전송
|
||||
leads_seq = $('#modal-integrate-memo').data('leads-seq');
|
||||
$row = $(`[id="${leads_seq}"]`);
|
||||
} else {
|
||||
// 테이블에서 전송
|
||||
$row = $form.closest('tr').prev();
|
||||
leads_seq = $row.attr('id');
|
||||
}
|
||||
|
||||
saveMemo(memo, leads_seq, $form, $row);
|
||||
});
|
||||
$('#search_btn').on('click', function(e) {
|
||||
e.preventDefault(); // 폼 제출 방지
|
||||
dataTable.ajax.reload(); // DataTables의 AJAX 요청을 다시 실행
|
||||
});
|
||||
</script>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--푸터-->
|
||||
<?=$this->section('footer');?>
|
||||
<?=$this->endSection();?>
|
||||
@@ -0,0 +1,846 @@
|
||||
<!-- 통합 DB 관리 - 이전버전 사용하지 않음 -->
|
||||
|
||||
<?=$this->extend('templates/front.php');?>
|
||||
|
||||
<!--타이틀-->
|
||||
<?=$this->section('title');?>
|
||||
ZENITH - 통합 DB 관리
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--헤더-->
|
||||
<?=$this->section('header');?>
|
||||
<link href="/static/css/datatables.css" rel="stylesheet">
|
||||
<script src="/static/node_modules/datatables.net/js/dataTables.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-buttons/js/dataTables.buttons.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-buttons/js/buttons.html5.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-buttons/js/buttons.colVis.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-staterestore/js/dataTables.stateRestore.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-fixedheader/js/dataTables.fixedHeader.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-fixedcolumns/js/dataTables.fixedColumns.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-keytable/js/dataTables.keyTable.min.js"></script>
|
||||
<!-- bootstrap5 -->
|
||||
<link href="/static/node_modules/datatables.net-bs5/css/dataTables.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-buttons-bs5/css/buttons.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-staterestore-bs5/css/stateRestore.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-fixedheader-bs5/css/fixedHeader.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-fixedcolumns-bs5/css/fixedColumns.bootstrap5.min.css" rel="stylesheet">
|
||||
<link href="/static/node_modules/datatables.net-keytable-bs5/css/keyTable.bootstrap5.min.css" rel="stylesheet">
|
||||
<script src="/static/node_modules/datatables.net-bs5/js/dataTables.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-buttons-bs5/js/buttons.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-staterestore-bs5/js/stateRestore.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-fixedheader-bs5/js/fixedHeader.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-fixedcolumns-bs5/js/fixedColumns.bootstrap5.min.js"></script>
|
||||
<script src="/static/node_modules/datatables.net-keytable-bs5/js/keyTable.bootstrap5.min.js"></script>
|
||||
<script src="/static/js/jquery.number.min.js"></script>
|
||||
<script src="/static/node_modules/jszip/dist/jszip.min.js"></script>
|
||||
<script src="/static/js/pdfmake/pdfmake.min.js"></script>
|
||||
<script src="/static/js/pdfmake/vfs_fonts.js"></script>
|
||||
<style>
|
||||
#advertiserBtn{display: none;}
|
||||
.memo-all{text-align:right;}
|
||||
</style>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--바디-->
|
||||
<?=$this->section('body');?>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<?=$this->section('content');?>
|
||||
<!-- 현재 사용하지 않는 파일 2024.07.02 -->
|
||||
<!-- DBintegrationDB.php 로 변경 -->
|
||||
<div class="sub-contents-wrap db-manage-contaniner">
|
||||
<div class="title-area">
|
||||
<h2 class="page-title">통합 DB 관리</h2>
|
||||
<!-- <p class="title-disc">안하는 사람은 끝까지 할 수 없지만, 못하는 사람은 언젠가는 해 낼 수도 있다.</p> -->
|
||||
</div>
|
||||
|
||||
<div class="search-wrap">
|
||||
<form name="search-form" class="search d-flex justify-content-center">
|
||||
<div class="term term-small d-flex align-items-center">
|
||||
<input type="hidden" name="sdate" id="sdate"><input type="hidden" name="edate" id="edate">
|
||||
<label><input type="text" name="dates" id="dates" data="daterangepicker" autocomplete="off" aria-autocomplete="none"><i class="bi bi-calendar2-week"></i></label>
|
||||
</div>
|
||||
<div class="input">
|
||||
<input type="text" name="stx" id="stx" placeholder="검색어를 입력하세요">
|
||||
<button class="btn-primary" id="search_btn" type="submit">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="section reset-btn-wrap">
|
||||
<div class="reset-btn-box">
|
||||
<button type="button" class="reset-btn">필터 초기화</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(getenv('MY_SERVER_NAME') === 'resta' && auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle">
|
||||
<i class="bi bi-chevron-up"></i> 분류
|
||||
</h3>
|
||||
<div class="row" id="company-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.advertiser')){?>
|
||||
<div class="section client-list custom-margin-box-1" <?php if(!auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){echo 'id="advertiserBtn"'; }?>>
|
||||
<h3 class="content-title toggle">
|
||||
<i class="bi bi-chevron-up"></i> 광고주
|
||||
</h3>
|
||||
<div class="row" id="advertiser-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.media')){?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle">
|
||||
<i class="bi bi-chevron-up"></i> 매체
|
||||
</h3>
|
||||
<div class="row" id="media-list"></div>
|
||||
</div>
|
||||
<?php }?>
|
||||
<div class="section client-list">
|
||||
<h3 class="content-title toggle">
|
||||
<i class="bi bi-chevron-up"></i> 이벤트 구분
|
||||
</h3>
|
||||
<div class="row" id="event-list"></div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="search-wrap my-5 status_wrap">
|
||||
<div class="statusCount detail d-flex minWd"></div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<div class="btns-memo-style">
|
||||
<span class="btns-title">메모 표시:</span>
|
||||
<button type="button" class="btns-memo" value="modal" title="새창으로 표시"><i class="bi bi-window-stack"></i></button>
|
||||
<button type="button" class="btns-memo" value="table" title="테이블에 표시"><i class="bi bi-table"></i></button>
|
||||
<button type="button" class="btns-memo" value="all" title="한번에 표시"><i class="bi bi-eye"></i></button>
|
||||
</div>
|
||||
<table class="dataTable table table-default" id="deviceTable">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th class="first">#</th>
|
||||
<th>SEQ</th>
|
||||
<?php if(getenv('MY_SERVER_NAME') === 'resta' && auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<th>분류</th>
|
||||
<?php }?></php>
|
||||
<th>이벤트</th>
|
||||
<?php if(auth()->user()->hasPermission('integrate.advertiser') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<th>광고주</th>
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.media') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
<th>매체</th>
|
||||
<?php }?>
|
||||
<th>이벤트 구분</th>
|
||||
<th>이름</th>
|
||||
<th>전화번호</th>
|
||||
<th>나이</th>
|
||||
<th>성별</th>
|
||||
<th>기타</th>
|
||||
<th>사이트</th>
|
||||
<th>등록일</th>
|
||||
<th>메모</th>
|
||||
<th class="last">인정기준</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- 개별 메모 -->
|
||||
<div class="modal fade" id="modal-integrate-memo" tabindex="-1" aria-labelledby="modal-integrate-memo-label" aria-hidden="true">
|
||||
<div class="modal-dialog modal-sm sm-txt">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title" id="modal-integrate-memo-label"><i class="bi bi-file-text"></i> 개별 메모<span class="title"></span></h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form class="regi-form">
|
||||
<fieldset>
|
||||
<legend>메모 작성</legend>
|
||||
<textarea></textarea>
|
||||
<button type="button" class="btn-regi">작성</button>
|
||||
</fieldset>
|
||||
</form>
|
||||
<ul class="memo-list m-2"></ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- //개별 메모 -->
|
||||
</div>
|
||||
</div>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--스크립트-->
|
||||
<?=$this->section('script');?>
|
||||
<script>
|
||||
var lead_status = {"1":"인정", "2":"중복", "3":"성별불량", "4":"나이불량", "5":"콜불량", "6":"번호불량", "7":"테스트", "8":"이름불량", "9":"지역불량", "10":"업체불량", "11":"미성년자", "12":"본인아님", "13":"쿠키중복", "99":"확인"};
|
||||
var exportCommon = {
|
||||
'header': true,
|
||||
'footer': false,
|
||||
'exportOptions': { //{'columns': 'th:not(:last-child)'},
|
||||
'modifier': {'page':'all'},
|
||||
}
|
||||
};
|
||||
var today = moment().format('YYYY-MM-DD');
|
||||
$('#sdate, #edate').val(today);
|
||||
setDate();
|
||||
|
||||
let dataTable, tableParam = {};
|
||||
let isPaginationClicked = false;
|
||||
getList();
|
||||
function setTableParam() {
|
||||
tableParam.searchData = {
|
||||
'sdate': $('#sdate').val(),
|
||||
'edate': $('#edate').val(),
|
||||
'stx': $('#stx').val(),
|
||||
'company' : $('#company-list button.active').map(function(){return $(this).val();}).get().join('|'),
|
||||
'advertiser' : $('#advertiser-list button.active').map(function(){return $(this).val();}).get().join('|'),
|
||||
'media' : $('#media-list button.active').map(function(){return $(this).val();}).get().join('|'),
|
||||
'event' : $('#event-list button.active').map(function(){return $(this).val();}).get().join('|'),
|
||||
'status' : $('.statusCount dl.active').map(function(){return $('dt',this).text();}).get().join('|')
|
||||
};
|
||||
}
|
||||
function setSearchData() { //state 에 저장된 내역으로 필터 active 세팅
|
||||
var data = tableParam;
|
||||
if(typeof data.searchData == 'undefined') return;
|
||||
$('#company-list button, #advertiser-list button, #media-list button, #event-list button, .statusCount dl').removeClass('active');
|
||||
if(typeof data.searchData.company != 'undefined') {
|
||||
data.searchData.company.split('|').map(function(txt){ $(`#company-list button[value="${txt}"]`).addClass('active'); });
|
||||
}
|
||||
if(typeof data.searchData.advertiser != 'undefined') {
|
||||
data.searchData.advertiser.split('|').map(function(txt){ $(`#advertiser-list button[value="${txt}"]`).addClass('active'); });
|
||||
}
|
||||
if(typeof data.searchData.media != 'undefined') {
|
||||
data.searchData.media.split('|').map(function(txt){ $(`#media-list button[value="${txt}"]`).addClass('active'); });
|
||||
}
|
||||
if(typeof data.searchData.event != 'undefined') {
|
||||
data.searchData.event.split('|').map(function(txt){ $(`#event-list button[value="${txt}"]`).addClass('active'); });
|
||||
}
|
||||
if(typeof data.searchData.status != 'undefined') {
|
||||
data.searchData.status.split('|').map(function(txt){
|
||||
$('.statusCount dt:contains("'+txt+'")').filter(function() { return $(this).text() === txt;}).parent().addClass('active');
|
||||
});
|
||||
}
|
||||
|
||||
$('#sdate').val(data.searchData.sdate);
|
||||
$('#edate').val(data.searchData.edate);
|
||||
$('#dates').data('daterangepicker').setStartDate(data.searchData.sdate);
|
||||
$('#dates').data('daterangepicker').setEndDate(data.searchData.edate);
|
||||
var dates = `${data.searchData.sdate} ~ ${data.searchData.edate}`;
|
||||
if(data.searchData.sdate == data.searchData.edate) dates = data.searchData.sdate;
|
||||
$('#dates').val(dates);
|
||||
$('#stx').val(data.searchData.stx);
|
||||
debug('searchData 세팅')
|
||||
if(typeof dataTable != 'undefined') dataTable.state.save();
|
||||
}
|
||||
function getList(data = []) { //리스트 세팅
|
||||
$.fn.DataTable.ext.pager.numbers_length = 10;
|
||||
dataTable = $('#deviceTable').DataTable({
|
||||
"dom": '<Bfri<t>p>',
|
||||
"fixedHeader": true,
|
||||
"autoWidth": true,
|
||||
"order": [[12,'desc']],
|
||||
"processing" : true,
|
||||
"serverSide" : true,
|
||||
"responsive": true,
|
||||
"searching": false,
|
||||
"ordering": true,
|
||||
"scrollX": true,
|
||||
"scrollCollapse": true,
|
||||
"stateSave": true,
|
||||
"deferRender": true,
|
||||
"rowId": "seq",
|
||||
"lengthMenu": [[ 25, 10, 50, -1 ],[ '25개', '10개', '50개', '전체' ]],
|
||||
"language": {"url": '/static/js/dataTables.i18n.json'}, //한글화 파일
|
||||
initComplete : function(settings ,json) {
|
||||
let advTable = document.getElementById('deviceTable');
|
||||
fadeIn(advTable, 1000); // 1초 동안 페이드 인
|
||||
},
|
||||
"stateSaveParams": function (settings, data) { //LocalStorage 저장 시
|
||||
debug('state 저장')
|
||||
data.memoView = $('.btns-memo.active').val();
|
||||
data.searchData = tableParam.searchData;
|
||||
},
|
||||
"stateLoadParams": function (settings, data) { //LocalStorage 호출 시
|
||||
debug('state 로드')
|
||||
$(`.btns-memo[value="${data.memoView}"]`).addClass('active');
|
||||
if(data.memoView == 'table' || data.memoView == 'all') {
|
||||
$('.memo-all').show();
|
||||
} else {
|
||||
$('.memo-all').hide();
|
||||
}
|
||||
tableParam = data;
|
||||
},
|
||||
"buttons": [ //Set Button
|
||||
{
|
||||
'extend': 'collection',
|
||||
'text': "Menu",
|
||||
'className': 'custom-btn-collection',
|
||||
'fade': true,
|
||||
'buttons': [
|
||||
'pageLength',
|
||||
'colvis',
|
||||
{
|
||||
'extend':'savedStates',
|
||||
'buttons': [
|
||||
'createState',
|
||||
'removeAllStates'
|
||||
]
|
||||
},
|
||||
'<div class="export">내보내기</div>',
|
||||
$.extend( true, {}, exportCommon, {
|
||||
extend: 'copyHtml5'
|
||||
} ),
|
||||
$.extend( true, {}, exportCommon, {
|
||||
extend: 'excelHtml5'
|
||||
} ),
|
||||
$.extend( true, {}, exportCommon, {
|
||||
extend: 'pdfHtml5',
|
||||
orientation: 'landscape',
|
||||
pageSize: 'LEGAL'
|
||||
} ),
|
||||
]
|
||||
},
|
||||
],
|
||||
"columnDefs": [
|
||||
{ targets: [0], orderable: false},
|
||||
{ targets: [1], visible: false},
|
||||
{ targets: '_all', visible: true },
|
||||
{ targets: [6], className: ''}
|
||||
],
|
||||
"columns": [
|
||||
{ "data": null , "width": "3%"},
|
||||
{ "data": "seq" , "width": "5%"},
|
||||
<?php if(getenv('MY_SERVER_NAME') === 'resta' && auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
{
|
||||
"data": null ,
|
||||
"width": "35px",
|
||||
"render": function(data, type, row) {
|
||||
let company = '';
|
||||
if(row.company == '케어랩스'){
|
||||
company = '케어랩스';
|
||||
}
|
||||
|
||||
if(row.company == '테크랩스'){
|
||||
company = '테크랩스';
|
||||
}
|
||||
return company;
|
||||
}
|
||||
},
|
||||
<?php }?>
|
||||
{ "data": "info_seq", "width": "45px",
|
||||
"render": function(data) {
|
||||
return data?'<a href="<?php echo env('app.eventURL')?>'+data+'" target="event_pop">'+data+'</a>':'';
|
||||
}
|
||||
},
|
||||
<?php if(auth()->user()->hasPermission('integrate.advertiser') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
{ "data": "advertiser","width": "100px",
|
||||
"render": function(data) {
|
||||
return '<span title="'+$(`<span>${data}</span>`).text()+'">'+(data ? data : '')+'</span>';
|
||||
}
|
||||
},
|
||||
<?php }?>
|
||||
<?php if(auth()->user()->hasPermission('integrate.media') || auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
{ "data": "media" , "width" : "5%",
|
||||
"render": function(data) {
|
||||
return '<span title="'+$(`<span>${data}</span>`).text()+'">'+(data ? data : '')+'</span>';
|
||||
}
|
||||
},
|
||||
<?php }?>
|
||||
{ "data": "tab_name" },
|
||||
{ "data": "name", "width": "50px",
|
||||
"render": function(data) {
|
||||
return '<span style="display:inline-block;width:50px;max-height:15px;overflow:hidden" title="'+$(`<span>${data}</span>`).text()+'">'+(data ? data : '')+'</span>';
|
||||
}
|
||||
},
|
||||
{ "data": "dec_phone", "width": "90px" },
|
||||
{ "data": "age", "width": "2%" },
|
||||
{ "data": "gender", "width": "2%" },
|
||||
{ "data": "add" },
|
||||
{ "data": "site", "width": "5%" },
|
||||
{ "data": "reg_date", "width": "70px" },
|
||||
{ "data": "memo_cnt", "width": "2%", "className": "memo",
|
||||
"render" : function(data) { // data-bs-toggle="modal"
|
||||
var html = '<button class="btn_memo text-dark position-relative" data-bs-target="#modal-integrate-memo"><i class="bi bi-chat-square-text h4"></i>';
|
||||
html += '<span class="position-absolute top--10 start-100 translate-middle badge rounded-pill bg-danger badge-'+data+'">'+data+'</span>';
|
||||
html += '</button>';
|
||||
return html;
|
||||
}
|
||||
},
|
||||
{
|
||||
"data": 'status', "width": "60px",
|
||||
"render": function (data, type, row) {
|
||||
<?php if(auth()->user()->hasPermission('integrate.status')){?>
|
||||
return '<select class="lead-status form-select form-select-sm data-del"><option value="1" '+(data=="1"?" selected":"")+'>인정</option><option value="2" '+(data=="2"?" selected":"")+'>중복</option><option value="3" '+(data=="3"?" selected":"")+'>성별불량</option><option value="4" '+(data=="4"?" selected":"")+'>나이불량</option><option value="6" '+(data=="6"?" selected":"")+'>번호불량</option><option value="7" '+(data=="7"?" selected":"")+'>테스트</option><option value="5" '+(data=="5"?" selected":"")+'>콜불량</option><option value="8" '+(data=="8"?" selected":"")+'>이름불량</option><option value="9" '+(data=="9"?" selected":"")+'>지역불량</option><option value="10" '+(data=="10"?" selected":"")+'>업체불량</option><option value="11" '+(data=="11"?" selected":"")+'>미성년자</option><option value="12" '+(data=="12"?" selected":"")+'>본인아님</option><option value="13" '+(data=="13"?" selected":"")+'>쿠키중복</option><option value="99" '+(data=="99"?" selected":"")+'>확인</option></select>';
|
||||
<?php }else{?>
|
||||
return '<span>' + (data == "1" ? '인정' : (data == "2" ? '중복' : (data == "3" ? '성별불량' : (data == "4" ? '나이불량' : (data == "5" ? '콜불량' : (data == "6" ? '번호불량' : (data == "7" ? '테스트' : (data == "8" ? '이름불량' : (data == "9" ? '지역불량' : (data == "10" ? '업체불량' : (data == "11" ? '미성년자' : (data == "12" ? '본인아님' : (data == "13" ? '쿠키중복' : (data == "99" ? '확인' : '')))))))))))))) + '</span>';
|
||||
<?php }?>
|
||||
}
|
||||
},
|
||||
],
|
||||
"rowCallback": function(row, data, index) {
|
||||
var api = this.api();
|
||||
var totalRecords = api.page.info().recordsTotal;
|
||||
var pageSize = api.page.len();
|
||||
var currentPage = api.page();
|
||||
var totalPages = Math.ceil(totalRecords / pageSize);
|
||||
|
||||
var seqNumber = totalRecords - (currentPage * pageSize) - index; // 계산된 순번 (내림차순)
|
||||
|
||||
$('td:eq(0)', row).html(seqNumber);
|
||||
$(`td.memo .btn_memo .badge`, row).html(data.memo_cnt);
|
||||
if($(`.btns-memo[value="all"]`).hasClass('active')) {
|
||||
setMemo($('td.memo', row)[0]);
|
||||
}
|
||||
if(data.status != "1"){
|
||||
$(row).addClass('abnormal');
|
||||
}
|
||||
},
|
||||
"infoCallback": function(settings, start, end, max, total, pre){ //페이지현황 세팅
|
||||
return "<i class='bi bi-check-square'></i>현재" + "<span class='now'>" +start +" - " + end + "</span>" + " / " + "<span class='total'>" + total + "</span>" + "건";
|
||||
},
|
||||
"ajax": { //ServerSide Load
|
||||
"url": "<?=base_url()?>/integrate/list",
|
||||
"data": function(d) {
|
||||
if(typeof tableParam != 'undefined')
|
||||
d.searchData = tableParam.searchData;
|
||||
},
|
||||
"type": "GET",
|
||||
"contentType": "application/json",
|
||||
"dataType": "json",
|
||||
}
|
||||
}).on('preXhr.dt', function (e, settings, data) {
|
||||
if (!isPaginationClicked) {
|
||||
$('.client-list .row').filter(function(i, el) {
|
||||
if(!$(el).find('.zenith-loading').is(':visible')) $(el).prepend('<div class="zenith-loading"/>')
|
||||
});
|
||||
}
|
||||
}).on('xhr.dt', function( e, settings, data, xhr ) { //ServerSide On Load Event
|
||||
/* setButtons(data.buttons);
|
||||
setLeadCount(data.buttons)
|
||||
setStatusCount(data.buttons.status); */
|
||||
//setSearchData();
|
||||
}).on('draw', function() {
|
||||
debug('draw');
|
||||
if (!isPaginationClicked) {
|
||||
getData('buttons');
|
||||
}
|
||||
let advTable = document.getElementById('deviceTable');
|
||||
fadeIn(advTable, 1000); // 1초 동안 페이드 인
|
||||
isPaginationClicked = false;
|
||||
}).on('page', function() {
|
||||
isPaginationClicked = true;
|
||||
});
|
||||
}
|
||||
|
||||
//테이블 페이드인 효과
|
||||
function fadeIn(tableName, duration) {
|
||||
let opacity = 0;
|
||||
tableName.style.opacity = 0;
|
||||
tableName.style.display = "table";
|
||||
|
||||
const jsInterval = 50;
|
||||
const increment = jsInterval / duration;
|
||||
const jsFade = setInterval(() => {
|
||||
opacity += increment;
|
||||
tableName.style.opacity = opacity;
|
||||
|
||||
if(opacity >= 1) {
|
||||
clearInterval(jsFade)
|
||||
}
|
||||
}, jsInterval);
|
||||
}
|
||||
|
||||
|
||||
function getData(type) {
|
||||
$.ajax({
|
||||
type: "GET",
|
||||
url: `<?=base_url()?>integrate/${type}`,
|
||||
data: {
|
||||
"searchData":tableParam.searchData,
|
||||
},
|
||||
dataType: "json",
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
success: function(data){
|
||||
setButtons(data);
|
||||
setLeadCount(data)
|
||||
setStatusCount(data.status);
|
||||
},
|
||||
error: function(error, status, msg){
|
||||
alert("상태코드 " + status + "에러메시지" + msg );
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$('.btns-memo-style>button').bind('click', function() { //메모 표시타입
|
||||
$('.btns-memo-style button').removeClass('active');
|
||||
$(this).addClass('active');
|
||||
if(this.value == 'table' || this.value == 'all') {
|
||||
$('.memo-all').show();
|
||||
} else {
|
||||
$('.memo-all').hide();
|
||||
}
|
||||
debug('메모표시방식 설정');
|
||||
dataTable.state.save();
|
||||
});
|
||||
$('#deviceTable').on('click', 'td.memo', function(e) { //메모셀 클릭 시
|
||||
setMemo(this);
|
||||
});
|
||||
$(document).on('click', '.regi-form button', function(e) { //메모 작성
|
||||
var type = $('.btns-memo.active').val();
|
||||
if(!$.trim($('textarea', $(this).parents('.regi-form')).val())) {
|
||||
alert('메모 내용을 입력해주세요.');
|
||||
return false;
|
||||
}
|
||||
var data = {
|
||||
'memo': $('textarea', $(this).parents('.regi-form')).val()
|
||||
};
|
||||
if(type == 'table') {
|
||||
data['leads_seq'] = $(this).parents('tr').prev('tr').attr('id');
|
||||
} else {
|
||||
data['leads_seq'] = $('#modal-integrate-memo').attr('data-seq');
|
||||
}
|
||||
registerMemo(data);
|
||||
});
|
||||
$('#modal-integrate-memo')
|
||||
.on('show.bs.modal', function(e) { //create memo data
|
||||
var seq = $(this).attr('data-seq');
|
||||
var $row = dataTable.row($(`#${seq}`));
|
||||
var name = $row.data().name;
|
||||
$('h1 .title', this).html(name);
|
||||
$('.memo-list', this).html('');
|
||||
getMemoList(seq);
|
||||
})
|
||||
.on('hidden.bs.modal', function(e) { //modal Reset
|
||||
$(this).removeAttr('data-seq');
|
||||
$('.memo-list, h1 .title', '#modal-integrate-memo').html('');
|
||||
$('#modal-integrate-memo form')[0].reset();
|
||||
});
|
||||
function setMemo(t) {
|
||||
var type = $('.btns-memo.active').val();
|
||||
var tr = $(t).closest('tr');
|
||||
var row = dataTable.row(tr);
|
||||
var seq = row.data().seq;
|
||||
if(type == 'table' || type == 'all') {
|
||||
if (row.child.isShown()) { // 메모가 열려있을 때
|
||||
row.child.hide();
|
||||
} else { // 메모가 닫혀있을 때
|
||||
var html = '<form class="regi-form"><fieldset><legend>메모 작성</legend><textarea></textarea><button type="button" class="btn-regi">작성</button></fieldset></form>';
|
||||
html += '<ul class="memo-list">';
|
||||
row.child(html).show();
|
||||
getMemoList(seq, t);
|
||||
}
|
||||
} else {
|
||||
dataTable.rows().every(function(){ //모든 메모 닫음
|
||||
if(this.child.isShown()) this.child.hide();
|
||||
});
|
||||
$('#modal-integrate-memo').attr('data-seq', seq).modal('show'); //modal 호출
|
||||
}
|
||||
}
|
||||
function getMemoList(seq, obj) { //메모 수신
|
||||
if($(`.badge`, obj).text() < 1) return;
|
||||
$.ajax({
|
||||
type: "get",
|
||||
url: "<?=base_url()?>integrate/getmemo",
|
||||
data: {'seq': seq},
|
||||
dataType: "json",
|
||||
contentType: 'application/json; charset=utf-8',
|
||||
success: function(data){
|
||||
setMemoList(data);
|
||||
},
|
||||
error: function(error, status, msg){
|
||||
alert("상태코드 " + status + "에러메시지" + msg );
|
||||
}
|
||||
});
|
||||
}
|
||||
function registerMemo(data) { //메모 등록
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<?=base_url()?>integrate/addmemo",
|
||||
data: data,
|
||||
dataType: "json",
|
||||
success: function(response){
|
||||
if(response.result == true) {
|
||||
setMemoList(response.data);
|
||||
var cnt = parseInt($(`tr[id="${response.data[0].leads_seq}"] td .btn_memo .badge`).text()) || 0;
|
||||
$(`tr[id="${response.data[0].leads_seq}"] td .btn_memo .badge`).removeClass('badge-0').text(++cnt); //뱃지 변경
|
||||
}
|
||||
$('.regi-form textarea').val('');
|
||||
},
|
||||
error: function(error, status, msg){
|
||||
alert("상태코드 " + status + "에러메시지" + msg );
|
||||
}
|
||||
});
|
||||
}
|
||||
function setMemoList(data) { //메모 리스트 생성
|
||||
if(typeof data[0] == "undefined") return;
|
||||
var seq = data[0].leads_seq;
|
||||
var html = '';
|
||||
$.each(data, function(i,row) {
|
||||
html += ' <li class="d-flex justify-content-between align-items-start">';
|
||||
html += ' <div class="detail d-flex align-items-start">';
|
||||
html += ' <p class="ms-1">'+ row.memo +'</p>';
|
||||
html += ' </div>';
|
||||
html += ' <div class="info">';
|
||||
html += ' <i>'+ row.username +'</i>';
|
||||
html += ' <span>'+ row.reg_date +'</span>';
|
||||
html += ' </div>';
|
||||
html += ' </li>';
|
||||
});
|
||||
var wrap;
|
||||
var type = $('.btns-memo.active').val();
|
||||
if(type == 'table' || type == 'all') {
|
||||
wrap = $(`#${seq}`).next('tr').find('.memo-list');
|
||||
} else {
|
||||
wrap = $(`[data-seq="${seq}"] .memo-list`);
|
||||
}
|
||||
wrap.prepend(html);
|
||||
}
|
||||
function setLeadCount(data) { //Filter Count 표시
|
||||
$('.client-list').find('.zenith-loading').fadeOut(function(){$(this).remove();});
|
||||
$('.client-list button').removeClass('on');
|
||||
$('.client-list .col .txt').empty();
|
||||
$.each(data, function(type, row) {
|
||||
if(type == 'status') return true;
|
||||
var $container = $('#'+type+'-list');
|
||||
$.each(row, function(idx, v) {
|
||||
var cnt_txt = v.total;
|
||||
if(v.count != v.total) cnt_txt = v.count + "/" + v.total;
|
||||
button = $(`#${type}-list .col[data-name="${v.label}"] button`);
|
||||
button.siblings('.progress').children('.txt').text(`${cnt_txt}`);
|
||||
|
||||
<?php if(getenv('MY_SERVER_NAME') === 'resta' && auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
if(typeof tableParam.searchData == 'undefined' || (tableParam.searchData.company == "" && tableParam.searchData.advertiser == "" && tableParam.searchData.media == "" && tableParam.searchData.event == "")) return true;
|
||||
<?php }else{?>
|
||||
if(typeof tableParam.searchData == 'undefined' || (tableParam.searchData.advertiser == "" && tableParam.searchData.media == "" && tableParam.searchData.event == "")) return true;
|
||||
<?php }?>
|
||||
if(v.count) button.addClass('on');
|
||||
});
|
||||
});
|
||||
setSearchData();
|
||||
}
|
||||
|
||||
function setStatusCount(data){ //상태 Count 표시
|
||||
$('.client-list').find('.zenith-loading').fadeOut(function(){$(this).remove();});
|
||||
$('.statusCount').empty();
|
||||
$.each(data, function(key, value) {
|
||||
// $('.statusCount').append('<dl class="col"><dt>' + key + '</dt><dd>' + value + '</dd></dl>');
|
||||
const setDataBtn = $('<dl class="col"><dt>' + key + '</dt><dd>' + value + '</dd></dl>'); // 숨긴 상태로 생성
|
||||
$('.statusCount').append(setDataBtn); // DOM에 추가
|
||||
setDataBtn.hide().fadeIn(1000); // 페이드 인 효과
|
||||
|
||||
});
|
||||
setSearchData();
|
||||
}
|
||||
function fontAutoResize() { //.client-list button 항목 가변폰트 적용
|
||||
$('.client-list .col').each(function(i, el) {
|
||||
var $el = $(el);
|
||||
var button = $('button', el);
|
||||
button.css({
|
||||
'white-space': 'nowrap',
|
||||
'overflow-x': 'auto',
|
||||
'font-size': '85%'
|
||||
});
|
||||
var i = 0;
|
||||
var btn_width = Math.round(button.width());
|
||||
// debug(button.val(), btn_scr_w, btn_width);
|
||||
while((button[0].scrollWidth+10) / 2 >= btn_width) {
|
||||
var size = parseFloat(button.css('font-size')) / 16 * 100;
|
||||
button.css({'font-size': --size+'%'});
|
||||
// debug(button.css('font-size'), size)
|
||||
if(button.css('font-size') < 8 || i > 60 || size < 70) break;
|
||||
i++;
|
||||
}
|
||||
button.css({
|
||||
'white-space': 'normal',
|
||||
'overflow-x': 'auto'
|
||||
});
|
||||
});
|
||||
}
|
||||
$(window).resize(function() {
|
||||
fontAutoResize();
|
||||
});
|
||||
|
||||
function setButtons(data) { //광고주,매체,이벤트명 버튼 세팅
|
||||
$('.client-list').find('.zenith-loading').fadeOut(function(){
|
||||
$(this).remove();
|
||||
});
|
||||
$.each(data, function(type, row) {
|
||||
if(type == 'status') return true;
|
||||
<?php if(!auth()->user()->inGroup('superadmin', 'admin', 'developer', 'user')){?>
|
||||
if(type == 'advertiser'){
|
||||
if(data.advertiser.length > 1){
|
||||
$('#advertiserBtn').show();
|
||||
}else{
|
||||
$('#advertiserBtn').hide();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
<?php }?>
|
||||
|
||||
var html = "";
|
||||
$.each(row, function(idx, v) {
|
||||
html += '<div class="col" data-name="'+v.label+'"><div class="inner">';
|
||||
html += '<button type="button" value="'+v.label+'">' + v.label + '</button>';
|
||||
html += '<div class="progress">';
|
||||
html += '<div class="txt">'+v.count+'/'+v.total+'</div>';
|
||||
html += '</div>';
|
||||
html += '</div></div>';
|
||||
});
|
||||
const setButtonsList = $('#'+type+'-list').html(html);
|
||||
setButtonsList.hide().fadeIn(1000);
|
||||
});
|
||||
fontAutoResize();
|
||||
setSearchData();
|
||||
}
|
||||
//날짜
|
||||
function setDate(){
|
||||
//$('#sdate, #edate').val(today);
|
||||
$('#dates').daterangepicker({
|
||||
locale: {
|
||||
"format": 'YYYY-MM-DD', // 일시 노출 포맷
|
||||
"applyLabel": "확인", // 확인 버튼 텍스트
|
||||
"cancelLabel": "취소", // 취소 버튼 텍스트
|
||||
"daysOfWeek": ["일", "월", "화", "수", "목", "금", "토"],
|
||||
"monthNames": ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"]
|
||||
},
|
||||
alwaysShowCalendars: true, // 시간 노출 여부
|
||||
showDropdowns: true, // 년월 수동 설정 여부
|
||||
autoApply: true, // 확인/취소 버튼 사용여부
|
||||
maxDate: new Date(),
|
||||
autoUpdateInput: false,
|
||||
ranges: {
|
||||
오늘: [moment(), moment()],
|
||||
어제: [
|
||||
moment().subtract(1, "days"),
|
||||
moment().subtract(1, "days"),
|
||||
],
|
||||
최근7일: [
|
||||
moment().subtract(7, "days").startOf("day"),
|
||||
moment().subtract(1, "days").endOf("day")
|
||||
],
|
||||
최근14일: [
|
||||
moment().subtract(14, "days").startOf("day"),
|
||||
moment().subtract(1, "days").endOf("day")
|
||||
],
|
||||
이번주: [moment().day(1), moment()],
|
||||
지난주: [
|
||||
moment().add(-1, "week").startOf("week").day(1),
|
||||
moment().add(-1, "week").startOf("week").add(7, "day"),
|
||||
],
|
||||
이번달: [moment().startOf("month"), moment().endOf("month")],
|
||||
지난달: [
|
||||
moment().subtract(1, "month").startOf("month"),
|
||||
moment().subtract(1, "month").endOf("month"),
|
||||
],
|
||||
한달전: [moment().subtract(1, "month"), moment()],
|
||||
},
|
||||
}, function(start, end, label) {
|
||||
startDate = start.format('YYYY-MM-DD'); // selected start
|
||||
endDate = end.format('YYYY-MM-DD'); // selected end
|
||||
$sdateInput = $('#sdate');
|
||||
$edateInput = $('#edate');
|
||||
$sdateInput.val(startDate);
|
||||
$edateInput.val(endDate);
|
||||
var dates = `${startDate} ~ ${endDate}`;
|
||||
if(startDate == endDate) dates = startDate;
|
||||
$('#dates').val(dates);
|
||||
});
|
||||
}
|
||||
|
||||
$('body').on('click', '#company-list button, #advertiser-list button, #media-list button, #event-list button', function() {
|
||||
$(this).toggleClass('active');
|
||||
debug('필터링 탭 클릭');
|
||||
setTableParam();
|
||||
dataTable.draw();
|
||||
});
|
||||
|
||||
$('form[name="search-form"]').bind('submit', function() {
|
||||
debug('검색 전송');
|
||||
setTableParam();
|
||||
dataTable.draw();
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.statusCount').on('click', 'dl', function(e) {
|
||||
debug('인정기준 필터')
|
||||
$(this).toggleClass('active');
|
||||
setTableParam();
|
||||
dataTable.draw();
|
||||
});
|
||||
|
||||
$('body').on('click', '.reset-btn', function() {
|
||||
var today = moment().format('YYYY-MM-DD');
|
||||
$('#sdate, #edate').val(today);
|
||||
$('#company-list button, #advertiser-list button, #media-list button, #event-list button, .statusCount dl').removeClass('active');
|
||||
$('#stx').val('');
|
||||
tableParam.searchData = {
|
||||
'sdate': $('#sdate').val(),
|
||||
'edate': $('#edate').val(),
|
||||
'stx': $('#stx').val(),
|
||||
'company' : '',
|
||||
'advertiser' : '',
|
||||
'media' : '',
|
||||
'event' : '',
|
||||
'status' : ''
|
||||
};
|
||||
dataTable.state.clear();
|
||||
dataTable.state.save();
|
||||
dataTable.order([12, 'desc']).draw();
|
||||
});
|
||||
// 인정기준 변경처리
|
||||
function setStatus(t) {
|
||||
var oldvalue = $(t).attr('data-oldvalue');
|
||||
var data = {
|
||||
'seq': $(t).closest('tr').attr('id'),
|
||||
'oldstatus' : oldvalue,
|
||||
'status' : t.value
|
||||
};
|
||||
$.ajax({
|
||||
type: "post",
|
||||
url: "<?=base_url()?>/integrate/setstatus",
|
||||
data: data,
|
||||
dataType: "json",
|
||||
success: function(response){
|
||||
if(response.result == true) {
|
||||
var r = response.data;
|
||||
var data = {
|
||||
'seq' : r.seq,
|
||||
'memo' : `"${lead_status[r.oldstatus]}"에서 "${lead_status[r.status]}"(으)로 상태변경`
|
||||
};
|
||||
var $o_obj = $('.statusCount dt:contains("'+lead_status[r.oldstatus]+'")').filter(function() { return $(this).text() === lead_status[r.oldstatus];}).next('dd');
|
||||
var o_cnt = parseInt($o_obj.text());
|
||||
$o_obj.text(--o_cnt);
|
||||
var $n_obj = $('.statusCount dt:contains("'+lead_status[r.status]+'")').filter(function() { return $(this).text() === lead_status[r.status];}).next('dd');
|
||||
var n_cnt = parseInt($n_obj.text());
|
||||
$n_obj.text(++n_cnt);
|
||||
data.leads_seq = data.seq;
|
||||
registerMemo(data);
|
||||
}
|
||||
},
|
||||
error: function(error, status, msg){
|
||||
alert("상태코드 " + status + "에러메시지" + msg );
|
||||
}
|
||||
});
|
||||
}
|
||||
$('#deviceTable')
|
||||
.on('focus click', '.lead-status', function(e) {
|
||||
$(this).attr('data-oldvalue', this.value);
|
||||
})
|
||||
.on('change', '.lead-status', function(e) {
|
||||
setStatus(this);
|
||||
});
|
||||
function debug(msg) {
|
||||
//console.log(msg);
|
||||
}
|
||||
|
||||
</script>
|
||||
<?=$this->endSection();?>
|
||||
|
||||
<!--푸터-->
|
||||
<?=$this->section('footer');?>
|
||||
<?=$this->endSection();?>
|
||||
Reference in New Issue
Block a user