Implement creating, renaming, and deleting scrap folders

This commit is contained in:
Kijin Sung 2017-09-28 14:09:57 +09:00
parent cf0a5d019c
commit 4a5385a635
10 changed files with 226 additions and 10 deletions

View file

@ -47,6 +47,9 @@
<action name="procMemberScrapDocument" type="controller" permission="member" /> <action name="procMemberScrapDocument" type="controller" permission="member" />
<action name="procMemberDeleteScrap" type="controller" permission="member" /> <action name="procMemberDeleteScrap" type="controller" permission="member" />
<action name="procMemberMoveScrapFolder" type="controller" permission="member" /> <action name="procMemberMoveScrapFolder" type="controller" permission="member" />
<action name="procMemberInsertScrapFolder" type="controller" permission="member" />
<action name="procMemberRenameScrapFolder" type="controller" permission="member" />
<action name="procMemberDeleteScrapFolder" type="controller" permission="member" />
<action name="procMemberSaveDocument" type="controller" permission="member" /> <action name="procMemberSaveDocument" type="controller" permission="member" />
<action name="procMemberDeleteSavedDocument" type="controller" permission="member" /> <action name="procMemberDeleteSavedDocument" type="controller" permission="member" />
<action name="procMemberDeleteAutologin" type="controller" permission="member" /> <action name="procMemberDeleteAutologin" type="controller" permission="member" />

View file

@ -121,6 +121,8 @@ $lang->cmd_view_saved_document = 'Saved Articles';
$lang->cmd_send_email = 'Send Mail'; $lang->cmd_send_email = 'Send Mail';
$lang->msg_email_not_exists = 'You have entered an invalid email address.'; $lang->msg_email_not_exists = 'You have entered an invalid email address.';
$lang->msg_alreay_scrapped = 'This article is already scrapped.'; $lang->msg_alreay_scrapped = 'This article is already scrapped.';
$lang->msg_folder_alreay_exists = 'A folder with the same name already exists.';
$lang->msg_folder_not_empty = 'The folder is not empty.';
$lang->msg_cart_is_null = 'Please select the target.'; $lang->msg_cart_is_null = 'Please select the target.';
$lang->msg_checked_file_is_deleted = '%d attached file(s) is(are) deleted.'; $lang->msg_checked_file_is_deleted = '%d attached file(s) is(are) deleted.';
$lang->msg_find_account_title = 'Account Info'; $lang->msg_find_account_title = 'Account Info';
@ -309,3 +311,6 @@ $lang->msg_spammer_complete = 'Completed.';
$lang->cmd_login_browser_info = 'Browser Information'; $lang->cmd_login_browser_info = 'Browser Information';
$lang->cmd_initial_login = 'First Login'; $lang->cmd_initial_login = 'First Login';
$lang->cmd_recent_visit = 'Recent Visit'; $lang->cmd_recent_visit = 'Recent Visit';
$lang->scrap_folder_create = 'New Folder';
$lang->scrap_folder_rename = 'Rename';
$lang->scrap_folder_delete = 'Delete';

View file

@ -125,6 +125,8 @@ $lang->cmd_modify_nickname_log = '닉네임 변경 기록';
$lang->cmd_member_profile_view = '회원 프로필사진 보이기'; $lang->cmd_member_profile_view = '회원 프로필사진 보이기';
$lang->msg_email_not_exists = '이메일 주소가 존재하지 않습니다.'; $lang->msg_email_not_exists = '이메일 주소가 존재하지 않습니다.';
$lang->msg_alreay_scrapped = '이미 스크랩된 게시물입니다.'; $lang->msg_alreay_scrapped = '이미 스크랩된 게시물입니다.';
$lang->msg_folder_alreay_exists = '이미 존재하는 폴더 이름입니다.';
$lang->msg_folder_not_empty = '폴더가 비어 있지 않습니다.';
$lang->msg_cart_is_null = '대상을 선택해주세요.'; $lang->msg_cart_is_null = '대상을 선택해주세요.';
$lang->msg_checked_file_is_deleted = '%d개의 첨부 파일이 삭제되었습니다.'; $lang->msg_checked_file_is_deleted = '%d개의 첨부 파일이 삭제되었습니다.';
$lang->msg_find_account_title = '아이디/비밀번호 정보입니다.'; $lang->msg_find_account_title = '아이디/비밀번호 정보입니다.';
@ -329,3 +331,6 @@ $lang->nick_name_after_changing = '닉네임 변경 후';
$lang->cmd_login_browser_info = '브라우저 정보'; $lang->cmd_login_browser_info = '브라우저 정보';
$lang->cmd_initial_login = '최초 로그인'; $lang->cmd_initial_login = '최초 로그인';
$lang->cmd_recent_visit = '최근 방문'; $lang->cmd_recent_visit = '최근 방문';
$lang->scrap_folder_create = '폴더 추가';
$lang->scrap_folder_rename = '이름 변경';
$lang->scrap_folder_delete = '삭제';

View file

@ -222,11 +222,12 @@ class memberController extends member
return new Object(-1,'msg_invalid_request'); return new Object(-1,'msg_invalid_request');
} }
// Check folder // Check that the target folder exists and belongs to member
$args = new stdClass; $args = new stdClass;
$args->member_srl = $logged_info->member_srl; $args->member_srl = $logged_info->member_srl;
$args->folder_srl = $folder_srl;
$output = executeQueryArray('member.getScrapFolderList', $args); $output = executeQueryArray('member.getScrapFolderList', $args);
if(!array_filter($output->data, function($folder) use($folder_srl) { return $folder->folder_srl == $folder_srl; })) if(!count($output->data))
{ {
return new Object(-1, 'msg_invalid_request'); return new Object(-1, 'msg_invalid_request');
} }
@ -239,6 +240,137 @@ class memberController extends member
return executeQuery('member.updateScrapDocumentFolder', $args); return executeQuery('member.updateScrapDocumentFolder', $args);
} }
/**
* Create a scrap folder
*
* @return void|Object (void : success, Object : fail)
*/
function procMemberInsertScrapFolder()
{
// Check login information
if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged');
$logged_info = Context::get('logged_info');
// Get new folder name
$folder_name = Context::get('name');
$folder_name = escape(trim(utf8_normalize_spaces($folder_name)));
if(!$folder_name)
{
return new Object(-1, 'msg_invalid_request');
}
// Check existing folder with same name
$args = new stdClass;
$args->member_srl = $logged_info->member_srl;
$args->name = $folder_name;
$output = executeQueryArray('member.getScrapFolderList', $args);
if(count($output->data) || $folder_name === lang('default_folder'))
{
return new Object(-1, 'msg_folder_alreay_exists');
}
// Create folder
$args = new stdClass;
$args->folder_srl = getNextSequence();
$args->member_srl = $logged_info->member_srl;
$args->name = $folder_name;
$args->list_order = $args->folder_srl;
$this->add('folder_srl', $args->folder_srl);
return executeQuery('member.insertScrapFolder', $args);
}
/**
* Rename a scrap folder
*
* @return void|Object (void : success, Object : fail)
*/
function procMemberRenameScrapFolder()
{
// Check login information
if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged');
$logged_info = Context::get('logged_info');
// Get new folder name
$folder_srl = intval(Context::get('folder_srl'));
$folder_name = Context::get('name');
$folder_name = escape(trim(utf8_normalize_spaces($folder_name)));
if(!$folder_srl || !$folder_name)
{
return new Object(-1, 'msg_invalid_request');
}
// Check that the original folder exists and belongs to member
$args = new stdClass;
$args->member_srl = $logged_info->member_srl;
$args->folder_srl = $folder_srl;
$output = executeQueryArray('member.getScrapFolderList', $args);
if(!count($output->data))
{
return new Object(-1, 'msg_invalid_request');
}
// Check existing folder with same name
$args = new stdClass;
$args->member_srl = $logged_info->member_srl;
$args->not_folder_srl = $folder_srl;
$args->name = $folder_name;
$output = executeQueryArray('member.getScrapFolderList', $args);
if(count($output->data) || $folder_name === lang('default_folder'))
{
return new Object(-1, 'msg_folder_alreay_exists');
}
// Rename folder
$args = new stdClass;
$args->folder_srl = $folder_srl;
$args->name = $folder_name;
return executeQuery('member.updateScrapFolder', $args);
}
/**
* Delete a scrap folder
*
* @return void|Object (void : success, Object : fail)
*/
function procMemberDeleteScrapFolder()
{
// Check login information
if(!Context::get('is_logged')) return new Object(-1, 'msg_not_logged');
$logged_info = Context::get('logged_info');
// Get folder_srl to delete
$folder_srl = intval(Context::get('folder_srl'));
if(!$folder_srl)
{
return new Object(-1, 'msg_invalid_request');
}
// Check that the folder exists and belongs to member
$args = new stdClass;
$args->member_srl = $logged_info->member_srl;
$args->folder_srl = $folder_srl;
$output = executeQueryArray('member.getScrapFolderList', $args);
if(!count($output->data))
{
return new Object(-1, 'msg_invalid_request');
}
// Check that the folder is empty
$args = new stdClass;
$args->member_srl = $logged_info->member_srl;
$args->folder_srl = $folder_srl;
$output = executeQueryArray('member.getScrapDocumentList', $args);
if(count($output->data))
{
return new Object(-1, 'msg_folder_not_empty');
}
// Delete folder
$args = new stdClass;
$args->folder_srl = $folder_srl;
return executeQuery('member.deleteScrapFolder', $args);
}
/** /**
* Save posts * Save posts
* @deprecated - instead Document Controller - procDocumentTempSave method use * @deprecated - instead Document Controller - procDocumentTempSave method use

View file

@ -460,6 +460,7 @@ class memberView extends member
Context::set('document_list', $output->data); Context::set('document_list', $output->data);
Context::set('page_navigation', $output->page_navigation); Context::set('page_navigation', $output->page_navigation);
Context::set('scrap_folders', $folders); Context::set('scrap_folders', $folders);
Context::set('folder_srl', $folder_srl);
$security = new Security($output->data); $security = new Security($output->data);
$security->encodeHTML('..nick_name'); $security->encodeHTML('..nick_name');

View file

@ -0,0 +1,8 @@
<query id="deleteScrapFolder" action="delete">
<tables>
<table name="member_scrap_folders" />
</tables>
<conditions>
<condition operation="equal" column="folder_srl" var="folder_srl" notnull="notnull" />
</conditions>
</query>

View file

@ -7,6 +7,9 @@
</columns> </columns>
<conditions> <conditions>
<condition operation="equal" column="member_srl" var="member_srl" filter="number" /> <condition operation="equal" column="member_srl" var="member_srl" filter="number" />
<condition operation="equal" column="folder_srl" var="folder_srl" pipe="and" />
<condition operation="notequal" column="folder_srl" var="not_folder_srl" pipe="and" />
<condition operation="equal" column="name" var="name" pipe="and" />
</conditions> </conditions>
<navigation> <navigation>
<index var="sort_index" default="list_order" order="asc" /> <index var="sort_index" default="list_order" order="asc" />

View file

@ -0,0 +1,11 @@
<query id="updateScrapFolder" action="update">
<tables>
<table name="member_scrap_folders" />
</tables>
<columns>
<column name="name" var="name" notnull="notnull" />
</columns>
<conditions>
<condition operation="equal" column="folder_srl" var="folder_srl" notnull="notnull" />
</conditions>
</query>

View file

@ -163,14 +163,48 @@ function insertSelectedModule(id, module_srl, mid, browser_title) {
/* 스크랩 폴더 이동 */ /* 스크랩 폴더 이동 */
jQuery(function($) { jQuery(function($) {
$("#scrap_folder_create").on("click", function() {
var input = $(this).siblings("input.folder_name").first();
if (!input.is(":visible")) {
input.show();
} else {
if (!input.val()) return;
var params = { name: input.val() };
exec_json('member.procMemberInsertScrapFolder', params, function(data) {
window.location.href = current_url.setQuery("folder_srl", data.folder_srl);
});
}
});
$("#scrap_folder_rename").on("click", function() {
var folder_srl = $(this).data("folder-srl");
var input = $(this).siblings("input.folder_name").first();
if (!input.is(":visible")) {
input.show();
} else {
if (!input.val()) return;
var params = { folder_srl: folder_srl, name: input.val() };
exec_json('member.procMemberRenameScrapFolder', params, function() {
window.location.reload();
});
}
});
$("#scrap_folder_delete").on("click", function() {
var folder_srl = $(this).data("folder-srl");
var params = { folder_srl: folder_srl };
exec_json('member.procMemberDeleteScrapFolder', params, function() {
window.location.href = current_url.setQuery("folder_srl", "");
});
});
$("#scrap_folder_list").on("change", function() { $("#scrap_folder_list").on("change", function() {
location.href = current_url.setQuery("folder_srl", $(this).val()); window.location.href = current_url.setQuery("folder_srl", $(this).val());
}); });
$(".scrap_folder_move").on("change", function() { $(".scrap_folder_move").on("change", function() {
var document_srl = $(this).data('document-srl'); var document_srl = $(this).data('document-srl');
var folder_srl = $(this).val(); var folder_srl = $(this).val();
if (!folder_srl) return; if (!folder_srl) return;
var params = { document_srl: document_srl, folder_srl: folder_srl }; var params = { document_srl: document_srl, folder_srl: folder_srl };
exec_json('member.procMemberMoveScrapFolder', params, function() { location.reload(); }); exec_json('member.procMemberMoveScrapFolder', params, function() {
window.location.reload();
});
}); });
}); });

View file

@ -1,11 +1,25 @@
<include target="./common_header.html" /> <include target="./common_header.html" />
<h1>{$member_title = $lang->cmd_view_scrapped_document}</h1> <h1>{$member_title = $lang->cmd_view_scrapped_document}</h1>
<select id="scrap_folder_list"> <div>
<!--@foreach($scrap_folders as $folder)--> <div class="btnArea" style="clear:none;float:left">
<option value="{$folder->folder_srl}" selected="selected"|cond="$folder_srl == $folder->folder_srl">{$folder->name == '/DEFAULT/' ? $lang->default_folder : $folder_name}</option> <select id="scrap_folder_list" style="margin:0">
<!--@endforeach--> <!--@foreach($scrap_folders as $folder)-->
</select> <option value="{$folder->folder_srl}" selected="selected"|cond="$folder_srl == $folder->folder_srl">{$folder->name == '/DEFAULT/' ? $lang->default_folder : $folder->name}</option>
<!--@endforeach-->
</select>
<div class="btn-group">
<input type="text" class="folder_name" style="margin:0;display:none" />
<button id="scrap_folder_rename" class="btn" data-folder-srl="{$folder_srl}">{$lang->scrap_folder_rename}</button>
<button id="scrap_folder_delete" class="btn" data-folder-srl="{$folder_srl}">{$lang->scrap_folder_delete}</button>
</div>
</div>
<div class="btnArea" style="clear:none;float:right">
<input type="text" class="folder_name" style="margin:0;display:none" />
<button id="scrap_folder_create" class="btn">{$lang->scrap_folder_create}</button>
</div>
<div class="clear:both"></div>
</div>
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
@ -29,7 +43,7 @@
<select class="scrap_folder_move" data-document-srl="{$val->document_srl}"> <select class="scrap_folder_move" data-document-srl="{$val->document_srl}">
<option value="">{$lang->cmd_move}</option> <option value="">{$lang->cmd_move}</option>
<!--@foreach($scrap_folders as $folder)--> <!--@foreach($scrap_folders as $folder)-->
<option value="{$folder->folder_srl}">{$folder->name == '/DEFAULT/' ? $lang->default_folder : $folder_name}</option> <option value="{$folder->folder_srl}">{$folder->name == '/DEFAULT/' ? $lang->default_folder : $folder->name}</option>
<!--@endforeach--> <!--@endforeach-->
</select> </select>
</td> </td>