커뮤니케이션 모듈 네모의 꿈 스킨 (#815)

* Communication 모듈 네모의 꿈 스킨 작업을 시작합니다.
* default skin 코드를 기반으로 했습니다.
* 추후 javascript 에 과도하게 의존하는 액션을 수정할 예정입니다.
* 중간 완성본입니다.
This commit is contained in:
Min-Soo Kim 2017-05-23 22:05:47 +09:00 committed by GitHub
parent 35eae12cca
commit b991869463
24 changed files with 885 additions and 7 deletions

View file

@ -91,9 +91,9 @@
<li><a href="{getUrl('act', 'dispMemberLoginForm')}">{lang('member.cmd_login')}...</a></li>
<li><a href="{getUrl('act', 'dispMemberSignUpForm')}" cond="$member_config->enable_join === 'Y'">{lang('member.cmd_signup')}...</a></li>
</ul>
<a href="{getUrl('act', 'dispMemberInfo')}" cond="$is_logged">{sprintf(lang('simple_hello'), $logged_info->nick_name)}</a>
<a href="{getUrl('act', 'dispMemberInfo', 'member_srl', '')}" cond="$is_logged">{sprintf(lang('simple_hello'), $logged_info->nick_name)}</a>
<ul class="layout_dropdown-content" cond="$is_logged">
<li><a href="{getUrl('act', 'dispMemberInfo')}">{lang('member.cmd_view_member_info')}</a></li>
<li><a href="{getUrl('act', 'dispMemberInfo', 'member_srl', '')}">{lang('member.cmd_view_member_info')}</a></li>
<li cond="$logged_info->is_admin == 'Y'">
<a href="{getUrl('', 'module','admin')}">{lang('common.cmd_management')}</a>
</li>

View file

@ -20,6 +20,7 @@ $lang->cmd_add_friend = 'Add Friend';
$lang->cmd_message_box = 'Message Box';
$lang->cmd_view_message_box = 'Message Box';
$lang->cmd_store = 'Save';
$lang->cmd_view_selected_frend_group = 'View only selected group';
$lang->cmd_add_friend_group = 'Add Friend Group';
$lang->cmd_rename_friend_group = 'Rename Friend Group';
$lang->cmd_delete_friend_group = 'Delete Friend Group';

View file

@ -20,7 +20,8 @@ $lang->cmd_add_friend = '친구 등록';
$lang->cmd_message_box = '쪽지함';
$lang->cmd_view_message_box = '쪽지함 보기';
$lang->cmd_store = '보관함 이동';
$lang->cmd_add_friend_group = '친구 그룹 추가';
$lang->cmd_view_selected_frend_group = '선택된 그룹만 보기';
$lang->cmd_add_friend_group = '친구 그룹 생성';
$lang->cmd_rename_friend_group = '친구 그룹 이름 변경';
$lang->cmd_delete_friend_group = '친구 그룹 삭제';
$lang->msg_already_friend = '이미 친구로 등록되어 있습니다.';

View file

@ -0,0 +1,28 @@
{@ $communication_popup = TRUE;}
<load target="filter/add_friend.xml" />
<include target="./common_header.html" />
<section class="sw-body">
<h1>{$lang->cmd_add_friend}</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/communication/skins/simple_world/add_friend/1'" class="rx_member-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="addFriend" action="./" method="post">
<input type="hidden" name="module" value="communication" />
<input type="hidden" name="act" value="procCommunicationAddFriend" />
<input type="hidden" name="target_srl" value="{$target_info->member_srl}" />
<input type="hidden" name="xe_validator_id" value="modules/communication/skins/simple_world/add_friend/1" />
<div class="control-group">
<label for="n_name">{$lang->nick_name}</label>
<input type="text" disabled="disabled" name="nick_name" id="n_name" value="{$target_info->nick_name}" title="{lang('common.user_id')}" />
<label for="friend_group_srl">{$lang->friend_group}<a class="pos-right" href="{getUrl('act','dispCommunicationAddFriendGroup')}" onclick="popopen(this.href);return false;">{$lang->cmd_add_friend_group}</a></label>
<select name="friend_group_srl" id="friend_group_srl">
<option value="">{$lang->default_friend_group}</option>
<option loop="$friend_group_list => $key,$val" value="{$val->friend_group_srl}">{$val->title}</option>
</select>
</div>
<div class="control-group">
<input type="submit" value="{lang('communication.cmd_add_friend')}" />
</div>
</form>
</section>
<include target="./common_footer.html" />

View file

@ -0,0 +1,29 @@
{@ $communication_popup = TRUE;}
<include target="./common_header.html" />
<load target="js/communication.js" />
<section class="sw-body">
<h1>
<!--@if($friend_group->friend_group_srl)-->
{$lang->cmd_rename_friend_group}
<!--@else-->
{$lang->cmd_add_friend_group}
<!--@end-->
</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/communication/skins/simple_world/add_friend_group/1'" class="rx_member-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="addFriendGroup" action="./" method="post" class="form-horizontal">
<input type="hidden" name="module" value="communication" />
<input type="hidden" name="act" value="procCommunicationAddFriendGroup" />
<input type="hidden" name="friend_group_srl" value="{$friend_group->friend_group_srl}" />
<input type="hidden" name="xe_validator_id" value="modules/communication/skins/simple_world/add_friend_group/1" />
<div class="control-group">
<label for="title">{$lang->msg_insert_group_name}</label>
<input name="title" id="title" type="text" value="{htmlspecialchars($friend_group->title, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}"/>
</div>
<div class="control-group">
<input cond="$friend_group->friend_group_srl" type="submit" value="{$lang->cmd_modify}" />
<input cond="!$friend_group->friend_group_srl" type="submit" value="{$lang->cmd_insert}" />
</div>
</form>
</section>

View file

@ -0,0 +1 @@
</section>

View file

@ -0,0 +1,81 @@
<!--// responsible layout -->
<!--@if($communication_popup === TRUE)-->
{@Context::addMetaTag("viewport", "width=device-width, user-scalable=yes")}
<!--@endif-->
<load target="js/communication.js" />
<!--// Check layout. If it is Simple World, select layout primary colors as a primary color of this skin -->
<block cond="$layout_info->extra_var->primary_color->type === 'select' || $layout_info->extra_var->customized_primary_color->type === 'colorpicker'">
{@
if(!$layout_info->primary_color)
$layout_info->primary_color = 'red';
if(!$layout_info->primary_color && $layout_info->customized_primary_color)
$layout_info->primary_color = 'customized';
if(!$layout_info->customized_primary_color)
$layout_info->customized_primary_color = '#f44336';
}
</block>
<block cond="$layout_info->extra_var->primary_color->type !== 'select' && $layout_info->extra_var->customized_primary_color->type !== 'colorpicker'">
{@$layout_info->primary_color = 'red';}
</block>
{@
$material_colors = array(
'red' => '#f44336',
'crimson' => '#aa0000',
'pink' => '#e91e63',
'purple' => '#9c27b0',
'deep-purple' => '#673ab7',
'indigo' => '#3f51b5',
'deep-blue' => '#00397f',
'blue' => '#2196f3',
'light-blue' => '#03a9f4',
'cyan' => '#00bcd4',
'teal' => '#009688',
'green' => '#4caf50',
'light-green' => '#8bc34a',
'lime' => '#cddc39',
'yellow' => '#ffeb3b',
'amber' => '#ffc107',
'orange' => '#ff9800',
'deep-orange' => '#ff5722',
'brown' => '#795548',
'grey' => '#9e9e9e',
'blue-grey' => '#607d8b',
'black' => '#000000',
'white' => '#ffffff',
'customized' => $layout_info->customized_primary_color,
);
}
<!--// Load styles -->
{@$colorset = $material_colors[$member_config->colorset];}
{@$skin_color = $material_colors[$layout_info->primary_color];}
<block cond="$colorset">
<!--@if(preg_match("/#([a-f0-9]{3}){1,2}/i", trim($colorset)) && in_array(strlen(trim($colorset)), array(4, 7)))-->
{@$skin_color = trim($colorset)}
<!--@if(strlen(trim($colorset)) === 4)-->
{@$skin_color = trim($colorset)[1].trim($colorset)[1].trim($colorset)[2].trim($colorset)[2].trim($colorset)[3].trim($colorset)[3]}
<!--@endif-->
<!--@else-->
{@$skin_color = '#f44336'}
<!--@endif-->
</block>
<block cond="!$skin_color">
<!--@if(preg_match("/#([a-f0-9]{3}){1,2}/i", $layout_info->primary_color) && in_array(strlen(trim($colorset)), array(4, 7)))-->
{@$skin_color = $layout_info->primary_color}
<!--@if(strlen($layout_info->primary_color) === 4)-->
{@$skin_color = $layout_info->primary_color[1].$layout_info->primary_color[1].$layout_info->primary_color[2].$layout_info->primary_color[2].$layout_info->primary_color[3].$layout_info->primary_color[3]}
<!--@endif-->
<!--@else-->
{@$skin_color = '#f44336'}
<!--@endif-->
</block>
{@Context::set('simple_less_value', array('red' => hexdec(substr($skin_color, 1, 2)), 'green' => hexdec(substr($skin_color, 3, 2)), 'blue' => hexdec(substr($skin_color, 5, 2)) ))}
<load target="css/css.less" vars="$simple_less_value" />
<section class="rx_simple_communication">
<div class="rx_simple_tab" cond="$communication_popup !== TRUE && $is_logged && $logged_info->menu_list && (!$member_srl || $member_srl == $logged_info->member_srl)">
<ul class="rx_simple_tab">
<li loop="$logged_info->menu_list=>$key,$val" class="active"|cond="$key==$act">
<a href="{getUrl('', 'act',$key, 'mid', $mid, 'vid', $vid)}"><span>{lang($val)}</span></a>
</li>
</ul>
</div>

View file

@ -0,0 +1,381 @@
@charset "UTF-8";
/*
@method .text-contrast()
@author misol <misol.kr@gmail.com>
@brief Select a text color according to WCAG 2.0 contrast guideline. The calcualtion of contrast follows the formula on the guideline.
*/
.text-contrast(@bg_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i >= 100) and ( ( (luma(@bg_color) + 0.05) / (luma(@dark_color) + 0.05) ) =< ( ( luma(@bright_color) + 0.05) / ( luma(@bg_color) + 0.05) )) {
color: @bright_color;
}
.text-contrast(@bg_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i >= 100) and ( ( (luma(@bg_color) + 0.05) / (luma(@dark_color) + 0.05) ) > ( ( luma(@bright_color) + 0.05) / ( luma(@bg_color) + 0.05) )) {
color: @dark_color;
}
.text-contrast(@bg_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i < 100) and ( ( (luma(@bg_color) + 0.05) / (luma(@dark_color) + 0.05) ) =< ( ( luma(@bright_color) + 0.05) / ( luma(@bg_color) + 0.05) )) and ( ( ( luma(@bright_color) + 0.05) / ( luma(@bg_color) + 0.05) ) > 4.5 * @multi ) {
color: @bright_color;
}
.text-contrast(@bg_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i < 100) and ( ( (luma(@bg_color) + 0.05) / (luma(@dark_color) + 0.05) ) =< ( ( luma(@bright_color) + 0.05) / ( luma(@bg_color) + 0.05) ) ) and ( ( ( luma(@bright_color) + 0.05) / ( luma(@bg_color) + 0.05) ) =< 4.5 * @multi ) {
.text-contrast(@bg_color; lighten(@bright_color, 5%); @dark_color; @multi; @i + 1);
}
.text-contrast(@bg_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i < 100) and ( ( (luma(@bg_color) + 0.05) / (luma(@dark_color) + 0.05) ) > ( ( luma(@bright_color) + 0.05) / ( luma(@bg_color) + 0.05) )) and ( ( (luma(@bg_color) + 0.05) / (luma(@dark_color) + 0.05) ) > 4.5 * @multi ) {
color: @dark_color;
}
.text-contrast(@bg_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i < 100) and (( (luma(@bg_color) + 0.05) / (luma(@dark_color) + 0.05) ) > ( ( luma(@bright_color) + 0.05) / ( luma(@bg_color) + 0.05) )) and ( ( (luma(@bg_color) + 0.05) / (luma(@dark_color) + 0.05) ) =< 4.5 * @multi ) {
.text-contrast(@bg_color; @bright_color; darken(@dark_color, 5%); @multi; @i + 1);
}
/*
@method .bg-contrast()
@author misol <misol.kr@gmail.com>
@brief Select a background color, which has less contrast background color than WCAG 2.0 contrast guideline. On the WCAG 2.0 guideline, bigger string can have less contrast as 3.0.
*/
.bg-contrast(@text_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i >= 100) and ( ( (luma(@text_color) + 0.05) / (luma(@dark_color) + 0.05) ) =< ( ( luma(@bright_color) + 0.05) / ( luma(@text_color) + 0.05) )) {
background: @bright_color;
}
.bg-contrast(@text_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i >= 100) and ( ( (luma(@text_color) + 0.05) / (luma(@dark_color) + 0.05) ) > ( ( luma(@bright_color) + 0.05) / ( luma(@text_color) + 0.05) )) {
background: @dark_color;
}
.bg-contrast(@text_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i < 100) and ( ( (luma(@text_color) + 0.05) / (luma(@dark_color) + 0.05) ) =< ( ( luma(@bright_color) + 0.05) / ( luma(@text_color) + 0.05) )) and ( ( ( luma(@bright_color) + 0.05) / ( luma(@text_color) + 0.05) ) > 3 * @multi ) {
background: @bright_color;
}
.bg-contrast(@text_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i < 100) and ( ( (luma(@text_color) + 0.05) / (luma(@dark_color) + 0.05) ) =< ( ( luma(@bright_color) + 0.05) / ( luma(@text_color) + 0.05) ) ) and ( ( ( luma(@bright_color) + 0.05) / ( luma(@text_color) + 0.05) ) =< 3 * @multi ) {
.bg-contrast(@text_color; lighten(@bright_color,3%); @dark_color; @multi; @i + 1);
}
.bg-contrast(@text_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i < 100) and ( ( (luma(@text_color) + 0.05) / (luma(@dark_color) + 0.05) ) > ( ( luma(@bright_color) + 0.05) / ( luma(@text_color) + 0.05) )) and ( ( (luma(@text_color) + 0.05) / (luma(@dark_color) + 0.05) ) > 3 * @multi ) {
background: @dark_color;
}
.bg-contrast(@text_color; @bright_color:#fff; @dark_color:#000; @multi:1; @i:0) when (@i < 100) and (( (luma(@text_color) + 0.05) / (luma(@dark_color) + 0.05) ) > ( ( luma(@bright_color) + 0.05) / ( luma(@text_color) + 0.05) )) and ( ( (luma(@text_color) + 0.05) / (luma(@dark_color) + 0.05) ) =< 3 * @multi ) {
.bg-contrast(@text_color; @bright_color; darken(@dark_color, 3%); @multi; @i + 1);
}
/* As LESS library in Rhymix substitude variables as an strings, convert colors as the color objects of LESS. */
@color: rgb(@red, @green, @blue);
/* Member skin container, default settings */
section.rx_simple_communication {
font-family: "맑은 고딕", "Apple SD Gothic Neo","나눔고딕",NanumGothic,'Nanum Gothic',Arial,Helvetica,sans-serif;
font-size: 14px;
text-align: justify;
margin: 8px 0px;
padding: 0 5px;
color: #000;
/* As this file handle some wild-selectors to control display settings, hide inline script and style codes. */
script, style
{
display:none!important;
}
a, button, input, button, select, textarea, span, div, p {
font-size: 1em;
}
a
{
.text-contrast(#fff; darken(@color,5%); lighten(@color,5%));
text-decoration: none;
}
/* Horizontal align */
.pos-left
{
position:absolute;
left:0;
width: auto;
}
.pos-right
{
position:absolute;
right:0;
width: auto;
}
/* message; error, info, update */
.rx_member-notice, .rx_member-notice.info
{
.bg-contrast(#000; lighten(@color, 5%); darken(@color, 5%); 5.0);
color: #000;
padding: 15px;
margin:0;
margin-top:0;
text-align: justify;
}
.rx_member-notice.error
{
background: #fff3e0;
.text-contrast(#fff3e0);
}
.rx_member-notice.update
{
background: #e8f5e9;
.text-contrast(#e8f5e9);
}
.rx_member-notice>*
{
padding: 0;
margin:0;
}
/* member forms */
.signin
{
max-width:400px;
margin:30px auto;
box-sizing:border-box
}
.sw-body
{
box-sizing:border-box;
background:#ffffff;
margin: 0 0 20px;
box-shadow: 0 1px 2px rgba(0,0,0,0.16), 0 1px 2px rgba(0,0,0,0.23);
&>*
{
padding: 20px;
margin:0;
border: 0;
}
h1
{
margin:0;
border-bottom: 1px solid #e0e0e0;
color: #000;
font-size: 1.5em;
}
}
.pagination {
ul, ul li {
display:inline-block;
list-style: outside none none;
padding: 0;
margin: 0;
border:0;
}
ul
{
display:block;
text-align:center;
}
}
.pagination ul li>a, .sw-footer>a
{
display: inline-block;
background: #fff;
font-size: 1em;
box-shadow: 0 1px 2px rgba(0,0,0,0.16), 0 1px 2px rgba(0,0,0,0.23);
margin-top: 1px;
margin-bottom: 2px;
color: #000;
padding: 8px;
min-width:25px;
text-decoration: none;
text-align: center;
}
.pagination ul li.active>a
{
.bg-contrast(#000; lighten(@color, 5%); darken(@color, 5%), 2.0);
font-weight:bold;
color:#000;
}
form div.control-group>*, .sw-body dl>*
{
display:block;
position:relative;
box-sizing: border-box;
width:100%;
min-height:25px;
margin:0px;
margin-top: 10px;
}
form
{
div.control-group>*:first-child
{
margin-top: 0;
}
div.control-group>input, div.control-group>select, div.control-group>a, div.control-group>button{
border: 1px solid #bdbdbd;
border-radius: 0;
font-size:1em;
line-height: 18px;
margin-top: 0;
padding:8px 8px 6px;
-webkit-appearance: none;
min-height: 32px;
}
}
.sw-body
{
dl>* {
list-style:none;
border-bottom: 1px solid #e0e0e0;
}
dl dt, form>div.control-group>label, form>div.control-group>div.control-label
{
font-weight: bold;
border:0;
}
}
form
{
overflow: hidden;
width:100%;
white-space: normal;
box-sizing: border-box;
div.control-group, .sw-footer, .sw-anchor-buttons {
&>input[type="submit"], &>input.btn.dateRemover, &>a, &>button, &>select {
display: inline-block;
padding: 8px;
vertical-align: bottom;
text-shadow: none;
border:0;
background-color: #fff;
color: #000;
box-shadow: 0 1px 2px rgba(0,0,0,0.16), 0 1px 2px rgba(0,0,0,0.23);
margin-top: 1px;
margin-bottom: 2px;
}
&>input[type="submit"], &>input.btn.dateRemover {
.bg-contrast(#000; lighten(@color,5%); darken(@color,5%); 3.0);
}
}
}
form div.control-group>input[type="submit"], .sw-footer{
margin: 15px 0 0;
}
.sw-footer.sw-headers{
position:relative;
margin: 0 20px 10px;
}
form.pos-left>div.control-group, form.pos-right>div.control-group {
input, select, a
{
display:inline-block;
float: left;
margin-top: 0;
margin-left: 5px;
width: auto;
}
}
/* Tab over the main content. */
div.rx_simple_tab{
background: #ffffff;
margin: 5px 0;
box-shadow: 0 1px 2px rgba(0,0,0,0.16), 0 1px 2px rgba(0,0,0,0.23);
box-sizing: border-box;
}
ul.rx_simple_tab{
list-style: outside none none;
margin: 0;
display: block;
padding: 6px 0;
text-decoration: none;
}
ul.rx_simple_tab>li {
display:inline-block;
height: 40px;
line-height: 18px;
position: relative;
a {
display:inline-block;
color: #000;
font-weight: 400;
letter-spacing: -1px;
line-height: 40px;
text-decoration: none;
&:hover, &:focus {
.text-contrast(#fff; darken(@color,5%); lighten(@color,5%));
font-weight: 700;
}
span {
border-left: 1px solid #e0e0e0;
padding: 0 15px;
}
}
&:first-child a span {
border-left: 0 none;
}
}
ul.rx_simple_tab>li.active a, .sw-anchor-buttons a.active{
.text-contrast(#fff; darken(@color,5%); lighten(@color,5%));
font-weight: 700;
}
.sw-footer.sw-anchor-buttons {
text-align:right;
a, button, input, select{
display:inline-block;
}
}
/* The list of document style */
.rx_sw_list .cont_a {
color: #222;
display: block;
letter-spacing: -1px;
line-height: 18px;
margin: 0;
overflow: hidden;
padding: 0.667em 70px 0.733em 15px;
text-overflow: ellipsis;
white-space: nowrap;
text-decoration: none;
&.no_delete {
padding-right: 15px;
}
&:hover, &:focus {
.text-contrast(#fff; darken(@color,5%); lighten(@color,5%));
}
}
.content_basic{
position:relative;
display:inline-block;
max-width:100%;
vertical-align: middle;
overflow:hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.content_subinfo
{
color: #9e9e9e;
font-size: 0.94em;
margin: 0 3px 0 7px;
overflow:hidden;
}
ul.rx_sw_list {
list-style: outside none none;
padding: 0;
margin: 0;
border-bottom: 1px solid #e0e0e0;
li {
position:relative;
border-top: 1px solid #e0e0e0;
overflow: hidden;
padding:0;
}
.content_delete {
position:absolute;
top:0;
right:0;
&>input {
margin: 10px;
width:20px;
height:20px;
vertical-align: bottom;
}
}
}
/* button hover */
form div.control-group>input[type="submit"], .sw-footer>a, .sw-anchor-buttons input[type="submit"], .sw-anchor-buttons a, .sw-anchor-buttons button, .pagination ul li>a{
&:hover, &:focus{
.bg-contrast(#000; lighten(@color,5%); darken(@color,5%); 4.0);
color: #000;
box-shadow: 0 2px 4px rgba(0,0,0,0.16), 0 2px 4px rgba(0,0,0,0.23);
}
}
}

View file

@ -0,0 +1,9 @@
<filter name="add_friend" module="communication" act="procCommunicationAddFriend" confirm_msg_code="confirm_submit">
<form />
<parameter />
<response callback_func="completeAddFriend">
<tag name="error" />
<tag name="message" />
<tag name="member_srl" />
</response>
</filter>

View file

@ -0,0 +1,10 @@
<filter name="add_friend_group" module="communication" act="procCommunicationAddFriendGroup" confirm_msg_code="confirm_submit">
<form>
<node target="title" required="true" minlength="1" maxlength="240" />
</form>
<parameter />
<response callback_func="completeAddFriendGroup">
<tag name="error" />
<tag name="message" />
</response>
</filter>

View file

@ -0,0 +1 @@
<filter name="delete_checked_friend" module="communication" act="procCommunicationDeleteFriend" confirm_msg_code="confirm_delete" />

View file

@ -0,0 +1 @@
<filter name="delete_checked_message" module="communication" act="procCommunicationDeleteMessages" confirm_msg_code="confirm_delete" />

View file

@ -0,0 +1 @@
<filter name="delete_friend_group" module="communication" act="procCommunicationDeleteFriendGroup" confirm_msg_code="confirm_delete" />

View file

@ -0,0 +1 @@
<filter name="move_friend" module="communication" act="procCommunicationMoveFriend" confirm_msg_code="confirm_move" />

View file

@ -0,0 +1,12 @@
<filter name="send_message" module="communication" act="procCommunicationSendMessage" confirm_msg_code="confirm_submit">
<form>
<node target="title" required="true" minlength="1" maxlength="240" />
<node target="content" required="true" minlength="1" />
</form>
<parameter />
<response callback_func="completeSendMessage">
<tag name="error" />
<tag name="message" />
<tag name="redirect_url" />
</response>
</filter>

View file

@ -0,0 +1,5 @@
<filter name="update_allow_message" module="communication" act="procCommunicationUpdateAllowMessage">
<form />
<parameter />
<response />
</filter>

View file

@ -0,0 +1,72 @@
<include target="./common_header.html" />
<load target="filter/delete_friend_group.xml" />
<load target="filter/move_friend.xml" />
<section class="sw-body">
<h1>{$member_title = $lang->cmd_view_friend}</h1>
<div class="rx_member-notice">{lang('common.total')}: {number_format($total_count)}</div>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/communication/skins/simple_world/frineds/1'" class="rx_member-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<div class="sw-footer sw-anchor-buttons sw-headers">
<form action="./" method="get" class="pos-left">
<input type="hidden" name="act" value="dispCommunicationFriend" />
<input type="hidden" name="message_type" value="{$message_type}" />
<input type="hidden" name="mid" value="{$mid}" />
<div class="control-group">
<select name="friend_group_srl" id="jumpMenu">
<option value="">{$lang->default_friend_group}</option>
<option loop="$friend_group_list => $key,$val" value="{$val->friend_group_srl}" selected="selected"|cond="$val->friend_group_srl == $friend_group_srl">{$val->title}</option>
</select>
<input type="submit" value="{$lang->cmd_view_selected_frend_group}">
</div>
</form>
</div>
<form ruleset="deleteCheckedFriend" id="fo_friend_list" action="./" method="post">
<input type="hidden" name="module" value="communication" />
<input type="hidden" name="act" value="procCommunicationDeleteFriend" />
<input type="hidden" name="xe_validator_id" value="modules/communication/skins/simple_world/frineds/1" />
<ul class="rx_sw_list">
<li loop="$friend_list => $no,$val">
<a href="#popup_menu_area" class="cont_a member_{$val->target_srl}">
<span class="content_basic member_{$val->target_srl}">
<span class="content_title member_{$val->target_srl}">
{escape($val->nick_name)}
</span>
<span class="content_subinfo member_{$val->target_srl}">
{escape($val->group_title?$val->group_title:$lang->default_friend_group)} / {zdate($val->regdate,"Y-m-d H:i")}
</span>
</span>
</a>
<span class="content_delete">
<input name="friend_srl_list[]" type="checkbox" value="{$val->friend_srl}" />
</span>
</li>
</ul>
<div class="sw-footer sw-anchor-buttons">
<select name="target_friend_group_srl" id="target_friend_group_srl" cond="count($friend_group_list)" style="margin:0">
<option loop="$friend_group_list => $key,$val" value="{$val->friend_group_srl}">{$val->title}</option>
</select>
<button type="submit" name="act" cond="count($friend_group_list)" value="procCommunicationMoveFriend">{$lang->cmd_move}</button>
<button type="submit" name="act" value="procCommunicationDeleteFriend">{$lang->cmd_delete}</button>
<button type="button" value="{getUrl('','module','communication','act','dispCommunicationAddFriendGroup')}" onclick="popopen(this.value);return false;">{$lang->cmd_add_friend_group}</button>
<button type="button" cond="count($friend_group_list)" onclick="doRenameFriendGroup();return false;">{$lang->cmd_rename_friend_group}</button>
<button type="button" cond="count($friend_group_list)" onclick="doDeleteFriendGroup();return false;">{$lang->cmd_delete_friend_group}</button>
</div>
</form>
</section>
<div class="pagination pagination-centered">
<ul>
<li><a href="{getUrl('page','','document_srl','')}" class="direction">&laquo; {$lang->first_page}</a></li>
<!--@while($page_no = $page_navigation->getNextPage())-->
<li class="active"|cond="$page == $page_no"><a href="{getUrl('page',$page_no,'document_srl','')}">{$page_no}</a></li>
<!--@end-->
<li><a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="direction">{$lang->last_page} &raquo;</a></li>
</ul>
</div>
<form action="./" method="get" id="for_delete_group">
<input type="hidden" name="friend_group_srl" value="" />
<input type="hidden" name="xe_validator_id" value="modules/communication/skins/simple_world/frineds/1" />
</form>
<include target="./common_footer.html" />

View file

@ -0,0 +1,103 @@
/* 쪽지 발송 */
function completeSendMessage(ret_obj) {
alert(ret_obj['message']);
window.close();
}
function doSendMessage(member_srl, message_srl) {
if(typeof(message_srl)=='undefined') message_srl = 0;
var url = request_uri.setQuery('module','communication').setQuery('act','dispCommunicationSendMessage').setQuery('receiver_srl',member_srl).setQuery('message_srl',message_srl);
popopen(url, 'sendMessage');
}
/* 개별 쪽지 삭제 */
function doDeleteMessage(message_srl) {
if(!message_srl) return;
var params = new Array();
params['message_srl'] = message_srl;
exec_xml('communication', 'procCommunicationDeleteMessage', params, completeDeleteMessage);
}
function completeDeleteMessage(ret_obj) {
alert(ret_obj['message']);
location.href = current_url.setQuery('message_srl','');
}
/* 개별 쪽지 보관 */
function doStoreMessage(message_srl) {
if(!message_srl) return;
var params = new Array();
params['message_srl'] = message_srl;
exec_xml('communication', 'procCommunicationStoreMessage', params, completeStoreMessage);
}
function completeStoreMessage(ret_obj) {
alert(ret_obj['message']);
location.href = current_url.setQuery('message_srl','');
}
/* 친구 추가 후 */
function completeAddFriend(ret_obj) {
alert(ret_obj['message']);
var member_srl = ret_obj['member_srl'];
if(opener && opener.loaded_member_menu_list) {
opener.loaded_member_menu_list[ret_obj['member_srl']] = '';
}
window.close();
}
/* 친구 그룹 추가 후 */
function completeAddFriendGroup(ret_obj) {
alert(ret_obj['message']);
if(opener) opener.location.href = opener.location.href;
window.close();
}
/* 친구 그룹 삭제 */
function doDeleteFriendGroup() {
var friend_group_srl = jQuery('#target_friend_group_srl option:selected').val();
if(!friend_group_srl) return;
var fo_obj = jQuery('#for_delete_group').get(0);
fo_obj.friend_group_srl.value = friend_group_srl;
procFilter(fo_obj, delete_friend_group);
}
function completeDeleteFriendGroup(ret_obj) {
alert(ret_obj['message']);
location.href = current_url.setQuery('friend_group_srl','');
}
/* 친구 그룹의 이름 변경 */
function doRenameFriendGroup() {
var friend_group_srl = jQuery('#target_friend_group_srl option:selected').val();
if(!friend_group_srl) return;
popopen("./?module=communication&act=dispCommunicationAddFriendGroup&friend_group_srl="+friend_group_srl);
}
/* 친구 그룹 이동 */
function doMoveFriend() {
var fo_obj = jQuery('#fo_friend_list').get(0);
procFilter(fo_obj, move_friend);
}
/* 친구 그룹 선택 */
function doJumpFriendGroup() {
var sel_val = jQuery('#jumpMenu option:selected').val();
location.href = current_url.setQuery('friend_group_srl', sel_val);
}
jQuery(function($){
$('.__submit_group button[type=submit]').click(function(e){
var sel_val = $('input[name="friend_srl_list[]"]:checked').length;
if(sel_val == 0)
{
e.preventDefault();
return false;
}
});
});

View file

@ -0,0 +1,78 @@
<include target="./common_header.html" />
<load target="filter/delete_checked_message.xml" />
<load target="filter/update_allow_message.xml" />
<section class="sw-body" cond="$message">
<h1>{escape($message->title)}</h1>
<div>
<a href="popup_menu_area" class="member_{$message->member_srl}">{$message->nick_name}</a> / {zdate($message->regdate, "Y-m-d H:i")}
</div>
<div class="xe_content">
{$message->content}
</div>
<div class="sw-footer sw-anchor-buttons">
<a cond="$message->message_type != 'S' && $message->member_srl != $logged_info->member_srl" href="#" onclick="doSendMessage('{$message->sender_srl}','{$message->message_srl}');">{$lang->cmd_reply_message}</a>
<a cond="$message->message_type == 'R'" href="#" onclick="doStoreMessage('{$message->message_srl}');">{$lang->cmd_store}</a>
<a href="#" onclick="doDeleteMessage('{$message->message_srl}');">{$lang->cmd_delete}</a>
</div>
</section>
<section class="sw-body">
<h1 loop="$lang->message_box => $key,$val" cond="$message_type == $key">{$val}</h1>
<div class="sw-footer sw-anchor-buttons sw-headers" cond="$message_type == 'R'">
<form action="./" method="POST" class="pos-left">
<input type="hidden" name="module" value="communication" />
<input type="hidden" name="act" value="procCommunicationUpdateAllowMessage" />
<input type="hidden" name="message_type" value="{$message_type}" />
<div class="control-group">
<select name="allow_message">
<option loop="$lang->allow_message_type => $key,$val" value="{$key}" selected="selected"|cond="$logged_info->allow_message==$key">{$val}</option>
</select>
<input type="submit" value="{$lang->cmd_save}">
</div>
</form>
<div style="clear:both"></div>
</div>
<form action="./" method="post" id="fo_message_list">
<input type="hidden" name="module" value="communication" />
<input type="hidden" name="act" value="procCommunicationDeleteMessages" />
<input type="hidden" name="message_type" value="{$message_type}" />
<ul class="rx_sw_list">
<li loop="$message_list => $key, $val">
<a href="{getUrl('message_srl',$val->message_srl)}" class="cont_a">
<span class="content_basic">
<span class="content_title">
{escape($val->title)}
</span>
<span class="content_subinfo">
{escape($val->nick_name)} / {zdate($val->regdate,"Y-m-d H:i")}<block cond="$val->readed=='Y'"> / {zdate($val->readed_date,"Y-m-d H:i")}</block>
</span>
</span>
</a>
<span class="content_delete">
<input name="message_srl_list[]" type="checkbox" value="{$val->message_srl}" />
</span>
</li>
</ul>
<div class="sw-footer sw-anchor-buttons">
<label for="check_all">{$lang->cmd_select_all}</label>
<input name="check_all" id="check_all" type="checkbox" onclick="XE.checkboxToggleAll('message_srl_list[]', {wrap:'fo_message_list'})"/>
<input type="submit" value="{$lang->cmd_delete}" />
</div>
</form>
<div class="sw-footer sw-anchor-buttons">
<a loop="$lang->message_box => $key,$val" href="{getUrl('message_type', $key, 'message_srl', '')}" class="active"|cond="$message_type == $key">{$val}</a>
</div>
</section>
<div class="pagination pagination-centered">
<ul>
<li><a href="{getUrl('page','','document_srl','')}" class="direction">&laquo; {$lang->first_page}</a></li>
<!--@while($page_no = $page_navigation->getNextPage())-->
<li class="active"|cond="$page == $page_no"><a href="{getUrl('page',$page_no,'document_srl','')}">{$page_no}</a></li>
<!--@end-->
<li><a href="{getUrl('page',$page_navigation->last_page,'document_srl','')}" class="direction">{$lang->last_page} &raquo;</a></li>
</ul>
</div>
<include target="./common_footer.html" />

View file

@ -0,0 +1,17 @@
{@ $communication_popup = TRUE}
<include target="./common_header.html" />
<section class="sw-body" cond="$message">
<h1>{escape($message->title)}</h1>
<div>
<a href="popup_menu_area" class="member_{$message->member_srl}">{$message->nick_name}</a> / {zdate($message->regdate, "Y-m-d H:i")}
</div>
<div class="xe_content">
{$message->content}
</div>
<div class="sw-footer sw-anchor-buttons">
<a cond="$message->message_type != 'S' && $message->member_srl != $logged_info->member_srl" href="#" onclick="doSendMessage('{$message->sender_srl}','{$message->message_srl}');">{$lang->cmd_reply_message}</a>
<a cond="$message->message_type == 'R'" href="#" onclick="doStoreMessage('{$message->message_srl}');">{$lang->cmd_store}</a>
<a href="#" onclick="doDeleteMessage('{$message->message_srl}');">{$lang->cmd_delete}</a>
</div>
</section>
<include target="./common_footer.html" />

View file

@ -0,0 +1,28 @@
{@ $communication_popup = TRUE}
<include target="./common_header.html" />
<section class="sw-body">
<h1>{$lang->cmd_send_message}</h1>
<div cond="$XE_VALIDATOR_MESSAGE && $XE_VALIDATOR_ID == 'modules/communication/skins/simple_world/send_message/1'" class="rx_member-notice {$XE_VALIDATOR_MESSAGE_TYPE}">
<p>{$XE_VALIDATOR_MESSAGE}</p>
</div>
<form ruleset="sendMessage" action="./" method="post">
<input type="hidden" name="module" value="communication" />
<input type="hidden" name="act" value="procCommunicationSendMessage" />
<input type="hidden" name="content" value="{htmlspecialchars($source_message->content)}" />
<input type="hidden" name="receiver_srl" value="{$receiver_info->member_srl}" />
<input type="hidden" name="xe_validator_id" value="modules/communication/skins/simple_world/send_message/1" />
<div class="control-group">
<label for="message_receiver">{$lang->receiver}</label>
<a id="message_receiver" href="#popup_menu_area" class="member_{$receiver_info->member_srl}">{$receiver_info->nick_name}</a>
<label for="message_title">{$lang->title}</label>
<input type="text" name="title" id="message_title" value="{$source_message->title}" />
<label for="message_send_mail"><input type="checkbox" value="Y" name="send_mail" id="message_send_mail" /> {$lang->cmd_send_mail}</label>
<div class="rx_member-notice info">{$lang->msg_send_mail_privacy}</div>
</div>
{$editor}
<div class="control-group">
<input type="submit" value="{$lang->cmd_send_message}" />
</div>
</form>
</section>
<include target="./common_footer.html" />

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<skin version="0.2">
<title xml:lang="ko">네모의 꿈</title>
<title xml:lang="en">Rectangular World</title>
<description xml:lang="ko">
면과 선으로 이루어진 단순한 모양의 깔끔한 스킨
</description>
<description xml:lang="en">
Simple rectangular planes and shadows
</description>
<version>0.1</version>
<date>2017-04-30</date>
<author email_address="misol.kr@gmail.com" link="https://github.com/misol">
<name xml:lang="ko">misol</name>
<name xml:lang="en">misol</name>
</author>
</skin>

View file

@ -8,7 +8,7 @@
<ul class="rx_sw_list">
<li loop="$active_logins => $no, $autologin_info">
{@ $autologin_info->user_agent = @json_decode($autologin_info->user_agent) ?: new stdClass()}
<span class="content_basic">
<span class="content_basic cont_a">
<span class="content_title">
{escape($autologin_info->user_agent->browser)} {escape($autologin_info->user_agent->version)} ({escape($autologin_info->user_agent->os)})
</span>

View file

@ -15,9 +15,9 @@
</span>
</span>
</a>
<span class="content_delete">
<button type="button" class="text" onclick="doDeleteSavedDocument({$item->document_srl},'{lang('common.confirm_delete')}');return false;">{$lang->cmd_delete}</button>
</span>
<span class="content_delete">
<button type="button" class="text" onclick="doDeleteSavedDocument({$item->document_srl},'{lang('common.confirm_delete')}');return false;">{$lang->cmd_delete}</button>
</span>
</li>
</ul>
</div>