Files
2023-04-17 11:06:08 +09:00

542 lines
25 KiB
PHP

<?php
$emailque= 'mbruid='.$my['uid'].' and d_verified<>0';
$RCD = getDbArray($table['s_mbremail'],$emailque,'*','uid','asc',0,1);
$NT_DATA = explode('|',$my['noticeconf']);
$nt_web = $NT_DATA[0];
$nt_email = $NT_DATA[1];
$nt_fcm = $NT_DATA[2];
$nt_modules = getArrayString($NT_DATA[3]);
$nt_members = getArrayString($NT_DATA[4]);
$phone_que = 'mbruid='.$my['uid'].' and device="phone"';
$tablet_que = 'mbruid='.$my['uid'].' and device="tablet"';
$desktop_que = 'mbruid='.$my['uid'].' and device="desktop"';
$PTK = getDbData($table['s_iidtoken'],$phone_que,'*');
$TTK = getDbData($table['s_iidtoken'],$tablet_que,'*');
$DTK = getDbData($table['s_iidtoken'],$desktop_que,'*');
?>
<?php getImport('font-kimsq','css/font-kimsq',false,'css')?>
<?php include_once $g['dir_module_skin'].'_header.php'?>
<div class="page-wrapper row">
<nav class="col-3 page-nav">
<?php include_once $g['dir_module_skin'].'_nav.php'?>
</nav>
<div class="col-9 page-main">
<div class="subhead mt-0">
<h2 class="subhead-heading">알림 관리</h2>
</div>
<?php if (!getValid($my['last_log'],$d['member']['settings_expire'])): //로그인 후 경과시간 비교(분 ?>
<?php include_once $g['dir_module_skin'].'_lock.php'?>
<?php else: ?>
<p>알림을 수신하면 웹 사이트내의 정보는 물론 회원님이 언급되거나 관련된 정보들을 실시간으로 받아보실 수 있습니다.</p>
<div id="save-config">
<form name="procForm" action="<?php echo $g['s']?>/" method="post">
<input type="hidden" name="r" value="<?php echo $r?>">
<input type="hidden" name="m" value="notification">
<input type="hidden" name="a" value="notice_config_user">
<div class="card mb-3">
<div class="card-header d-flex justify-content-between align-items-center">
사이트 알림
<div class="btn-group btn-group-sm btn-group-toggle" data-toggle="buttons">
<label class="btn <?php if($nt_web==''):?>btn-primary active<?php else:?>btn-light<?php endif?>" onclick="btnCheck(this);">
<input type="radio" value="" name="nt_web"<?php if($nt_web==''):?> checked<?php endif?> id="nt_web" autocomplete="off"> ON
</label>
<label class="btn <?php if($nt_web=='1'):?>btn-secondary active<?php else:?>btn-light<?php endif?>" onclick="btnCheck(this);">
<input type="radio" value="1" name="nt_web"<?php if($nt_web=='1'):?> checked<?php endif?> id="nt_web_1" autocomplete="off"> OFF
</label>
</div>
</div>
<?php if ($nt_web==''): ?>
<ul class="list-group list-group-flush">
<li class="list-group-item d-flex justify-content-between align-items-center">
<div class="media w-75">
<i class="fa fa-envelope-o fa-fx mr-4 fa-2x text-muted align-self-center" aria-hidden="true"></i>
<div class="media-body">
이메일 알림
<div class="input-group mt-1">
<select class="form-control custom-select" name="email_noti">
<option value="">사용안함</option>
<?php while($R=db_fetch_array($RCD)):?>
<option value="<?php echo $R['email'] ?>"<?php echo ($my['email_noti']==$R['email'])?' selected':'' ?>>
<?php echo $R['email'] ?>
</option>
<?php endwhile?>
</select>
<div class="invalid-tooltip">
이메일을 저장해 주세요.
</div>
<div class="input-group-append">
<button class="btn btn-outline-secondary js-submit" type="button">
<span class="not-loading">저장</span>
<span class="is-loading">저장중..</span>
</button>
</div>
</div>
<small class="form-text text-muted mt-2">
알림발송시 지정된 이메일로도 알림내용이 발송됩니다.<br>
<a href="<?php echo $g['url_reset']?>&amp;page=email">이메일 관리</a>에서 추가 할수있으며, 본인인증된 메일만 추가할 수 있습니다.
</small>
</div>
</div>
<div class="btn-group btn-group-sm btn-group-toggle" data-toggle="buttons" id="nt_email" data-email="<?php echo $my['email_noti']?>">
<label class="btn <?php if($nt_email=='1'):?>btn-primary active<?php else:?>btn-light<?php endif?>">
<input type="radio" value="1" name="nt_email"<?php if($nt_email=='1'):?> checked<?php endif?> autocomplete="off" id="nt_email_1" <?php echo $my['email_noti']?'':'disabled'?>> ON
</label>
<label class="btn <?php if($nt_email==''):?>btn-secondary active<?php else:?>btn-light<?php endif?>">
<input type="radio" value="" name="nt_email"<?php if($nt_email==''):?> checked<?php endif?> autocomplete="off" id="nt_email_0"> OFF
</label>
</div>
</li>
<?php if ($g['push_active']==1): ?>
<li class="list-group-item" id="permission_div" style="display: none">
<div class="w-100">
<div class="media w-100">
<i class="fa fa-bolt mr-3 fa-fw fa-2x text-muted align-self-center" aria-hidden="true"></i>
<div class="media-body">
푸시 알림 <span class="badge badge-pill badge-light"></span>
<small class="d-block note mt-2 pr-3">
데스크탑 푸시알림을 수신하면 공지사항은 물론 회원님이 게시글에 대한 피드백 또는 내가 언급된 글에 대한 정보들을 실시간으로 받아보실 수 있습니다.
</small>
</div>
<button class="btn btn-light" id="RequestPermission">권한요청</button>
</div>
</div>
</li>
<li class="list-group-item" id="push_setting" style="display: none">
<div class="media w-100">
<i class="fa fa-bolt mr-3 fa-fw fa-2x text-muted align-self-center" aria-hidden="true"></i>
<div class="media-body">
푸시 알림 <span class="badge badge-pill badge-light"></span>
<small class="d-block note mt-2 pr-3">
알림발송시 푸시 알림으로 알림내용이 발송됩니다.
</small>
</div>
<div class="btn-group btn-group-sm btn-group-toggle" data-toggle="buttons" id="nt_fcm">
<label class="btn <?php if($nt_fcm=='1'):?>btn-primary active<?php else:?>btn-light<?php endif?>">
<input type="radio" value="1" name="nt_fcm"<?php if($nt_fcm=='1'):?> checked<?php endif?> autocomplete="off" id="nt_fcm_1"> ON
</label>
<label class="btn <?php if($nt_fcm==''):?>btn-secondary active<?php else:?>btn-light<?php endif?>">
<input type="radio" value="" name="nt_fcm"<?php if($nt_fcm==''):?> checked<?php endif?> autocomplete="off" id="nt_fcm_0"> OFF
</label>
</div>
</div>
</li>
<li class="list-group-item" id="push_disabled" style="display: none">
<div class="media w-100">
<span class="fa-stack fa-lg align-self-center text-muted mr-3">
<i class="fa fa-bolt fa-stack-1x"></i>
<i class="fa fa-ban fa-stack-2x"></i>
</span>
<div class="media-body">
푸시 알림 <span class="badge badge-pill badge-light text-danger align-text-top">차단됨</span>
<small class="d-block note mt-2 pr-3">
알림발송이 차단 되었습니다. 상태를 해제하려면 브라우저의 설정변경이 필요합니다.
<a class="ml-1" href="chrome://settings/content/notifications" target="_blank">자세히보기</a>
</small>
</div>
</div>
</li>
<?php elseif ($g['push_active']==2): ?>
<li class="list-group-item">
<div class="media w-100">
<i class="fa fa-bolt mr-3 fa-fw fa-2x text-muted align-self-center" aria-hidden="true"></i>
<div class="media-body">
푸시 알림 <span class="badge badge-pill badge-light text-muted align-text-top">점검중</span>
<small class="d-block note mt-2 pr-3 text-danger">
푸시알림을 위한 연결정보가 없습니다. 관리자에게 문의하세요.
</small>
</div>
</div>
</li>
<?php else: ?>
<li class="list-group-item">
<div class="media w-100">
<i class="fa fa-bolt mr-3 fa-fw fa-2x text-muted align-self-center" aria-hidden="true"></i>
<div class="media-body">
푸시 알림 <span class="badge badge-pill badge-light text-muted align-text-top">미지원</span>
<small class="d-block note mt-2 pr-3">
푸시알림이 지원되지 않는 브라우저 입니다.<br>지원 브라우저 : 크롬(Chrome), 파이어폭스(Firefox)
</small>
</div>
</div>
</li>
<?php endif; ?>
</ul>
<?php else: ?>
<div class="card-block p-5 note text-center">
알림이 꺼져서 소식을 받을 수 없습니다.<br>알림을 켜서 글, 댓글, 나를 언급한 글 등 중요알림을 받아보세요.
</div>
<?php endif; ?>
</div>
<?php if ($nt_web==''): ?>
<?php if ($nt_fcm=='1'): ?>
<div class="card" id="token_div" style="display: none;" class="mt-4">
<div class="card-header d-flex justify-content-between align-items-center">
<span>
인스턴스 토큰
<i class="fa fa-question-circle-o" aria-hidden="true" role="button"
data-toggle="popover" title="인스턴스 ID 토큰"
data-content="<span class='text-muted f12'>처음 시작할 때 클라이언트 앱 인스턴스에 대한 등록 토큰이 생성됩니다.
Instance ID는 앱의 인스턴스마다의 고유한 값입니다.<br><br>[ 다음과 같은 경우에 토큰은 변경됩니다. ]<br>
- 인스턴스 ID를 삭제할 경우<br>- 앱이 새 기기에서 복원된 경우<br>- 사용자가 앱을 제거/재설치한 경우<br>- 사용자가 앱 데이터를 초기화한 경우</span>
">
</i>
</span>
<button class="btn btn-light btn-sm js-sendTest"
data-toggle="popover" title="푸시알림 테스트"
data-content="<span class='text-muted f12'>등록된 토큰을 기반으로 데스크탑과 모바일로<br>푸시알림 메시지가 각각 발송됩니다.<br>알림이 수신된다면 정상적으로 셋팅된 것입니다.<br><br>알림이 수신되지 않는다면 토큰을 <mark>재발급</mark> 해주세요. </span>">
<span class="not-loading">나에게 푸시알림 보내기</span>
<span class="is-loading"><i class="fa fa-spinner fa-lg fa-spin fa-fw"></i> 보내는중 ...</span>
</button>
</div>
<div class="card-body">
<div class="media">
<span class="mr-3 text-center">
<i class="fa fa-desktop fa-3x align-self-center fa-border text-muted" aria-hidden="true"></i><br>
<span class="mt-3 f12 text-muted">데스크탑 전용</span>
</span>
<div class="media-body">
<p class="mb-2" style="word-break: break-all;">
<span class="token note"></span>
</p>
<div class="d-flex justify-content-between">
<div>
<span class="badge badge-pill badge-secondary"><?php echo $DTK['browser'] ?> <?php echo $DTK['version'] ?></span>
<span class="badge badge-pill badge-light">
등록일시 : <?php echo getDateFormat($DTK['d_update']?$DTK['d_update']:$DTK['d_regis'],'Y.m.d H:i')?>
</span>
</div>
<button class="btn btn-light btn-sm js-deleteToken">
<i class="fa fa-refresh fa-fw" aria-hidden="true"></i>
재발급
</button>
</div><!-- /.d-flex -->
</div>
</div>
<hr>
<div class="media">
<span class="mr-3 text-center">
<i class="fa fa-mobile fa-3x fa-border text-muted" aria-hidden="true" style="width: 70px"></i><br>
<span class="mt-3 f12 text-muted">스마트폰 전용</span>
</span>
<div class="media-body align-self-center">
<?php if ($PTK['token']): ?>
<p class="mb-2" style="word-break: break-all;">
<span class="note"><?php echo $PTK['token'] ?></span>
</p>
<div class="d-flex justify-content-between">
<div>
<span class="badge badge-pill badge-secondary"><?php echo $PTK['browser'] ?> <?php echo $PTK['version'] ?></span>
<span class="badge badge-pill badge-light">
등록일시 : <?php echo getDateFormat($PTK['d_update']?$PTK['d_update']:$PTK['d_regis'],'Y.m.d H:i')?>
</span>
</div>
<div>
<span class="badge badge-light">재발급은 스마트폰에서만 지원됩니다.</span>
</div>
</div><!-- /.d-flex -->
<?php else: ?>
<div class="d-flex justify-content-between mb-4">
<span class="note">저장된 토큰이 없습니다.</span>
<div>
<span class="badge badge-light">발급은 스마트폰에서만 가능합니다.</span>
</div>
</div>
<?php endif; ?>
</div>
</div>
<hr>
<div class="media">
<span class="mr-3 text-center">
<i class="fa fa-tablet fa-3x fa-border text-muted" aria-hidden="true" style="width: 70px"></i><br>
<span class="mt-3 f12 text-muted">태블릿 전용</span>
</span>
<div class="media-body align-self-center">
<?php if ($TTK['token']): ?>
<p class="mb-2" style="word-break: break-all;">
<span class="note"><?php echo $TTK['token'] ?></span>
</p>
<div class="d-flex justify-content-between">
<div>
<span class="badge badge-pill badge-secondary"><?php echo $TTK['browser'] ?> <?php echo $TTK['version'] ?></span>
<span class="badge badge-pill badge-light">
등록일시 : <?php echo getDateFormat($TTK['d_update']?$TTK['d_update']:$TTK['d_regis'],'Y.m.d H:i')?>
</span>
</div>
<div>
<span class="badge badge-light">재발급은 스마트폰에서만 지원됩니다.</span>
</div>
</div><!-- /.d-flex -->
<?php else: ?>
<div class="d-flex justify-content-between mb-4">
<span class="note">저장된 토큰이 없습니다.</span>
<div>
<span class="badge badge-light">발급은 태블릿에서만 가능합니다.</span>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
<div class="card-footer">
<span class="note">
인스턴스 토큰은 푸시알림에 활용되며 기기별로 1개만 저장 됩니다.<br>
접속기기가 변경되면 토큰 또한 변경되며, 변경된 토큰정보는 로그인 후 갱신저장 됩니다.<br>
푸시알림이 수신되지 않는다면, 토큰 '재발급'을 시도해 보세요. 알림 메시지를 받았다면 정상 입니다.
</span>
</div>
</div>
<?php endif; ?>
<div class="card my-3">
<div class="card-header">
모듈별 설정
</div>
<ul class="list-group list-group-flush">
<?php $_MODULES=getDbArray($table['s_module'],'','*','gid','asc',0,1)?>
<?php while($_MD=db_fetch_array($_MODULES)):?>
<li class="list-group-item justify-content-between list-group-item-action align-items-center<?php if(strstr($d['ntfc']['cut_modules'],'['.$_MD['id'].']')):?> d-none<?php else: ?> d-flex<?php endif?>">
<div class="media w-75">
<i class="<?php echo $_MD['icon']?> fa-fw fa-2x mr-3 align-self-center text-muted"></i>
<div class="media-body">
<h5 class="mt-0"><?php echo $_MD['name']?> <span class="badge badge-pill badge-light align-text-top"><?php echo ucfirst($_MD['id'])?></span></h5>
<p class="note">내글에 댓글등록시, 좋아요/싫어요시</p>
</div>
</div>
<div class="btn-group btn-group-sm btn-group-toggle module_members" role="group" data-toggle="buttons" data-module="<?php echo $_MD['id']?>">
<button type="button" class="btn btn-<?php if(strstr($NT_DATA[3],'['.$_MD['id'].']') === false):?>primary active<?php else: ?>light<?php endif?>" data-act="on">ON</button>
<button type="button" class="btn btn-<?php if(strstr($NT_DATA[3],'['.$_MD['id'].']')):?>secondary active<?php else: ?>light<?php endif?>" data-act="off">OFF</button>
</div>
</li>
<?php endwhile?>
</ul>
</div><!-- /.card -->
<div class="card mb-3">
<div class="card-header">
<i class="fa fa-ban fa-fw fa-lg" aria-hidden="true"></i>
알림발송이 차단된 회원
</div>
<ul class="list-group list-group-flush">
<?php $_i=0;foreach($nt_members['data'] as $_md):?>
<?php $_R=getDbData($table['s_mbrdata'],'memberuid='.$_md,'*')?>
<li class="list-group-item d-flex justify-content-between list-group-item-action align-items-center">
<div class="media">
<a class="mr-3" href="<?php echo getProfileLink($_R['memberuid']) ?>"
data-toggle="getMemberLayer"
data-mbruid="<?php echo $_R['memberuid'] ?>">
<img class="rounded " src="<?php echo getAvatarSrc($_R['memberuid'],'36') ?>" alt="" width=36>
</a>
<div class="media-body">
<h5 class="f14 mt-0 mb-1">
<?php if($_R['name']):?>
<a class="muted-link" href="<?php echo getProfileLink($_R['memberuid']) ?>"
data-toggle="getMemberLayer"
data-mbruid="<?php echo $_R['memberuid'] ?>">
<?php echo $_R['name']?> <span class="badge badge-pill badge-light align-text-top"><?php echo $_R['nic']?></span>
</a>
<?php else: ?>
<span class="badge badge-pill badge-light">시스템</span>
<?php endif?>
</h5>
<small><?php echo getDateFormat($_R['d_regis'],'Y.m.d')?> 가입</small>
</div>
</div>
<a class="btn btn-light btn-sm" href="<?php echo $g['s']?>/?r=<?php echo $r?>&amp;m=notification&amp;a=notice_config_user&amp;member_uid=<?php echo $_R['memberuid']?>" onclick="return hrefCheck(this,true,'정말로 해제하시겠습니까?');">
해제
</a>
</li>
<?php $_i++;endforeach?>
</ul>
<?php if(!$nt_members['count']):?>
<div class="rb-none text-center p-5 text-muted f12">
차단된 회원이 없습니다.<br>
<a href="<?php echo RW('mod=noti')?>">내 알림함</a> 에서 차단할 회원을 지정할 수 있습니다.
</div>
<?php endif?>
</div><!-- /.card -->
<?php endif; ?>
</form>
</div><!-- /#save-config -->
<?php endif; ?>
</div><!-- /.page-main -->
</div><!-- /.row -->
<?php include_once $g['dir_module_skin'].'_footer.php'?>
<script>
var f = document.procForm;
$(function () {
putCookieAlert('member_settings_result') // 실행결과 알림 메시지 출력
// 지정된 이메일이 없는 경우, 이메일 알림을 설정을 시도할 경우 에러출력
$('#nt_email_1:disabled').parent('.btn').click(function() {
$('[name="email_noti"]').addClass('is-invalid')
});
//알림설정 저장
$('[data-toggle="buttons"]').find('[type="radio"]').change(function(){
var btn_group = $(this).closest('.btn-group')
var btn = $(this).closest('.btn')
btn_group.find('.btn').removeClass('btn-primary').addClass('btn-light')
btn.addClass('btn-primary').removeClass('btn-light')
getIframeForAction(f);
f.submit();
});
// 이메일 저장
$('#save-config').find('.js-submit').click(function() {
var form = $('#save-config')
var email_noti = form.find('[name=email_noti]').val();
var act = 'save_config'
var url = rooturl+'/?r='+raccount+'&m=member&a=settings_noti&act='+act+'&email_noti='+email_noti
$(this).attr('disabled',true)
getIframeForAction();
frames.__iframe_for_action__.location.href = url;
});
//모듈별 차단설정
$('.module_members').find('.btn').click(function() {
var btn = $(this)
var btn_group = btn.closest('.btn-group')
var mid = btn_group.data('module')
var act = btn.data('act')
if (act=='on'){
btn_group.find('.btn').removeClass('btn-secondary btn-primary').addClass('btn-light')
btn.addClass('btn-primary').removeClass('btn-light')
var url = rooturl+'/?r='+raccount+'&m=notification&a=notice_config_user&module_id='+mid
} else {
btn.addClass('btn-secondary').removeClass('btn-light')
var url = rooturl+'/?r='+raccount+'&m=notification&a=multi_delete_user&module_id='+mid+'&deltype=off_module'
}
console.log(url)
getIframeForAction();
frames.__iframe_for_action__.location.href = url;
});
//게시물 목록에서 프로필 풍선(popover) 띄우기
$('[data-toggle="getMemberLayer"]').popover({
container: 'body',
trigger: 'manual',
html: true,
content: function () {
var uid = $(this).attr('data-uid')
var mbruid = $(this).attr('data-mbruid')
var type = 'popover'
$.post(rooturl+'/?r='+raccount+'&m=member&a=get_profileData',{
mbruid : mbruid,
type : type
},function(response){
var result = $.parseJSON(response);
var profile=result.profile;
$('#popover-item-'+uid).html(profile);
});
return '<div id="popover-item-'+uid+'" class="p-1">불러오는 중...</div>';
}
})
.on("mouseenter", function () {
var _this = this;
$(this).popover("show");
$(".popover").on("mouseleave", function () {
$(_this).popover('hide');
});
}).on("mouseleave", function () {
var _this = this;
setTimeout(function () {
if (!$(".popover:hover").length) {
$(_this).popover("hide");
}
}, 30);
});
$('#RequestPermission').click(function(event) {
event.preventDefault();
requestPermission()
});
$('.js-deleteToken').click(function(event) {
event.preventDefault();
deleteToken()
});
$('.js-sendTest').click(function(event) {
event.preventDefault();
var btn = $(this)
var popover = $('[data-toggle="popover"]')
popover.popover('hide')
btn.attr('disabled',true)
var title = '<?php echo $_HS['name'] ?> 데스크탑에서 보낸 푸시알림'
var message = '푸시알림이 정상적으로 수신되었습니다.'
$.post(rooturl+'/?r='+raccount+'&m=notification&a=push_testonly',{
mbruid : '<?php echo $my['uid'] ?>',
title : title,
message : message
},function(response){
var result = $.parseJSON(response);
var error=result.error;
if (!error) {
btn.attr('disabled',false)
console.log('테스트 푸시알림이 수신 되었습니다.')
}
});
});
$('[data-toggle="popover"]').popover({
trigger: 'hover',
html : true
})
})
</script>