diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml index f9afc1ac3..dced1ca9e 100644 --- a/modules/member/conf/module.xml +++ b/modules/member/conf/module.xml @@ -47,6 +47,9 @@ + + + diff --git a/modules/member/lang/en.php b/modules/member/lang/en.php index 725155d3b..38b40c931 100644 --- a/modules/member/lang/en.php +++ b/modules/member/lang/en.php @@ -121,6 +121,8 @@ $lang->cmd_view_saved_document = 'Saved Articles'; $lang->cmd_send_email = 'Send Mail'; $lang->msg_email_not_exists = 'You have entered an invalid email address.'; $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_checked_file_is_deleted = '%d attached file(s) is(are) deleted.'; $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_initial_login = 'First Login'; $lang->cmd_recent_visit = 'Recent Visit'; +$lang->scrap_folder_create = 'New Folder'; +$lang->scrap_folder_rename = 'Rename'; +$lang->scrap_folder_delete = 'Delete'; diff --git a/modules/member/lang/ko.php b/modules/member/lang/ko.php index bbf2e0bef..dbd493c3b 100644 --- a/modules/member/lang/ko.php +++ b/modules/member/lang/ko.php @@ -125,6 +125,8 @@ $lang->cmd_modify_nickname_log = '닉네임 변경 기록'; $lang->cmd_member_profile_view = '회원 프로필사진 보이기'; $lang->msg_email_not_exists = '이메일 주소가 존재하지 않습니다.'; $lang->msg_alreay_scrapped = '이미 스크랩된 게시물입니다.'; +$lang->msg_folder_alreay_exists = '이미 존재하는 폴더 이름입니다.'; +$lang->msg_folder_not_empty = '폴더가 비어 있지 않습니다.'; $lang->msg_cart_is_null = '대상을 선택해주세요.'; $lang->msg_checked_file_is_deleted = '%d개의 첨부 파일이 삭제되었습니다.'; $lang->msg_find_account_title = '아이디/비밀번호 정보입니다.'; @@ -329,3 +331,6 @@ $lang->nick_name_after_changing = '닉네임 변경 후'; $lang->cmd_login_browser_info = '브라우저 정보'; $lang->cmd_initial_login = '최초 로그인'; $lang->cmd_recent_visit = '최근 방문'; +$lang->scrap_folder_create = '폴더 추가'; +$lang->scrap_folder_rename = '이름 변경'; +$lang->scrap_folder_delete = '삭제'; diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 30ee59123..5f983b040 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -222,11 +222,12 @@ class memberController extends member return new Object(-1,'msg_invalid_request'); } - // Check folder + // Check that the target 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(!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'); } @@ -239,6 +240,137 @@ class memberController extends member 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 * @deprecated - instead Document Controller - procDocumentTempSave method use diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 5a578c06f..121f9c92e 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -460,6 +460,7 @@ class memberView extends member Context::set('document_list', $output->data); Context::set('page_navigation', $output->page_navigation); Context::set('scrap_folders', $folders); + Context::set('folder_srl', $folder_srl); $security = new Security($output->data); $security->encodeHTML('..nick_name'); diff --git a/modules/member/queries/deleteScrapFolder.xml b/modules/member/queries/deleteScrapFolder.xml new file mode 100644 index 000000000..b890a1639 --- /dev/null +++ b/modules/member/queries/deleteScrapFolder.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/modules/member/queries/getScrapFolderList.xml b/modules/member/queries/getScrapFolderList.xml index fd13f3c0b..a8005a88a 100644 --- a/modules/member/queries/getScrapFolderList.xml +++ b/modules/member/queries/getScrapFolderList.xml @@ -7,6 +7,9 @@ + + + diff --git a/modules/member/queries/updateScrapFolder.xml b/modules/member/queries/updateScrapFolder.xml new file mode 100644 index 000000000..773823233 --- /dev/null +++ b/modules/member/queries/updateScrapFolder.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/modules/member/skins/default/js/member.js b/modules/member/skins/default/js/member.js index 192ca5692..25d7998b0 100644 --- a/modules/member/skins/default/js/member.js +++ b/modules/member/skins/default/js/member.js @@ -163,14 +163,48 @@ function insertSelectedModule(id, module_srl, mid, browser_title) { /* 스크랩 폴더 이동 */ 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() { - 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() { var document_srl = $(this).data('document-srl'); var folder_srl = $(this).val(); if (!folder_srl) return; 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(); + }); }); }); diff --git a/modules/member/skins/default/scrapped_list.html b/modules/member/skins/default/scrapped_list.html index 37021f99d..8ac8c4838 100644 --- a/modules/member/skins/default/scrapped_list.html +++ b/modules/member/skins/default/scrapped_list.html @@ -1,11 +1,25 @@ {$member_title = $lang->cmd_view_scrapped_document} - - - folder_srl">{$folder->name == '/DEFAULT/' ? $lang->default_folder : $folder_name} - - + + + + + folder_srl">{$folder->name == '/DEFAULT/' ? $lang->default_folder : $folder->name} + + + + + {$lang->scrap_folder_rename} + {$lang->scrap_folder_delete} + + + + + {$lang->scrap_folder_create} + + + @@ -29,7 +43,7 @@ {$lang->cmd_move} - {$folder->name == '/DEFAULT/' ? $lang->default_folder : $folder_name} + {$folder->name == '/DEFAULT/' ? $lang->default_folder : $folder->name}