From b28b18a19a16ab979f0444eb724f28dfa2837ef4 Mon Sep 17 00:00:00 2001 From: Rokt33r Date: Sun, 15 Nov 2015 23:20:06 +0900 Subject: [PATCH] =?UTF-8?q?//=20filter=E3=82=92=E4=BD=BF=E3=81=86=E3=81=A8?= =?UTF-8?q?=E7=A2=BA=E5=AE=9F=E3=81=ABFolder=E5=90=8D=E3=81=8C=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E3=81=99=E3=82=8B=E3=82=82=E3=81=AE=E3=81=AE=E3=81=BF?= =?UTF-8?q?=E3=82=92=E8=A1=A8=E7=A4=BA=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- browser/finder/index.js | 43 +++++++++++++++------ browser/main/HomePage.js | 52 ++++++++++++++++++-------- browser/main/HomePage/ArticleTopBar.js | 2 + lib/reducer.js | 5 ++- 4 files changed, 73 insertions(+), 29 deletions(-) diff --git a/browser/finder/index.js b/browser/finder/index.js index 921abf1d..8ef40501 100644 --- a/browser/finder/index.js +++ b/browser/finder/index.js @@ -23,6 +23,7 @@ function getIconPath () { require('../styles/finder/index.styl') const FOLDER_FILTER = 'FOLDER_FILTER' +const FOLDER_EXACT_FILTER = 'FOLDER_EXACT_FILTER' const TEXT_FILTER = 'TEXT_FILTER' const TAG_FILTER = 'TAG_FILTER' @@ -136,27 +137,47 @@ FinderMain.propTypes = { dispatch: PropTypes.func } +// Ignore invalid key +function ignoreInvalidKey (key) { + return key.length > 0 && !key.match(/^\/\/$/) && !key.match(/^\/$/) && !key.match(/^#$/) +} + +// Build filter object by key +function buildFilter (key) { + if (key.match(/^\/\/.+/)) { + return {type: FOLDER_EXACT_FILTER, value: key.match(/^\/\/(.+)$/)[1]} + } + if (key.match(/^\/.+/)) { + return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]} + } + if (key.match(/^#(.+)/)) { + return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]} + } + return {type: TEXT_FILTER, value: key} +} + function remap (state) { let { articles, folders, status } = state - let filters = status.search.split(' ').map(key => key.trim()).filter(key => key.length > 0 && !key.match(/^\/$/) && !key.match(/^#$/)).map(key => { - if (key.match(/^\/.+$/)) { - return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]} - } - if (key.match(/^#(.+)/)) { - return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]} - } - return {type: TEXT_FILTER, value: key} - }) + let filters = status.search.split(' ') + .map(key => key.trim()) + .filter(ignoreInvalidKey) + .map(buildFilter) + + let folderExactFilters = filters.filter(filter => filter.type === FOLDER_EXACT_FILTER) let folderFilters = filters.filter(filter => filter.type === FOLDER_FILTER) let textFilters = filters.filter(filter => filter.type === TEXT_FILTER) let tagFilters = filters.filter(filter => filter.type === TAG_FILTER) + let targetFolders if (folders != null) { - let targetFolders = folders.filter(folder => { + let exactTargetFolders = folders.filter(folder => { + return _.find(folderExactFilters, filter => folder.name.match(new RegExp(`^${filter.value}$`))) + }) + let fuzzyTargetFolders = folders.filter(folder => { return _.find(folderFilters, filter => folder.name.match(new RegExp(`^${filter.value}`))) }) - status.targetFolders = targetFolders + targetFolders = status.targetFolders = exactTargetFolders.concat(fuzzyTargetFolders) if (targetFolders.length > 0) { articles = articles.filter(article => { diff --git a/browser/main/HomePage.js b/browser/main/HomePage.js index 1504cda9..beb312ee 100644 --- a/browser/main/HomePage.js +++ b/browser/main/HomePage.js @@ -12,6 +12,7 @@ import { isModalOpen, closeModal } from 'boost/modal' const TEXT_FILTER = 'TEXT_FILTER' const FOLDER_FILTER = 'FOLDER_FILTER' +const FOLDER_EXACT_FILTER = 'FOLDER_EXACT_FILTER' const TAG_FILTER = 'TAG_FILTER' class HomePage extends React.Component { @@ -135,6 +136,25 @@ class HomePage extends React.Component { } } +// Ignore invalid key +function ignoreInvalidKey (key) { + return key.length > 0 && !key.match(/^\/\/$/) && !key.match(/^\/$/) && !key.match(/^#$/) +} + +// Build filter object by key +function buildFilter (key) { + if (key.match(/^\/\/.+/)) { + return {type: FOLDER_EXACT_FILTER, value: key.match(/^\/\/(.+)$/)[1]} + } + if (key.match(/^\/.+/)) { + return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]} + } + if (key.match(/^#(.+)/)) { + return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]} + } + return {type: TEXT_FILTER, value: key} +} + function remap (state) { let { folders, articles, status } = state @@ -145,24 +165,25 @@ function remap (state) { let allArticles = articles.slice() // Filter articles - let filters = status.search.split(' ').map(key => key.trim()).filter(key => key.length > 0 && !key.match(/^\/$/) && !key.match(/^#$/)).map(key => { - if (key.match(/^\/.+/)) { - return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]} - } - if (key.match(/^#(.+)/)) { - return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]} - } - return {type: TEXT_FILTER, value: key} - }) + let filters = status.search.split(' ') + .map(key => key.trim()) + .filter(ignoreInvalidKey) + .map(buildFilter) + + let folderExactFilters = filters.filter(filter => filter.type === FOLDER_EXACT_FILTER) let folderFilters = filters.filter(filter => filter.type === FOLDER_FILTER) let textFilters = filters.filter(filter => filter.type === TEXT_FILTER) let tagFilters = filters.filter(filter => filter.type === TAG_FILTER) + let targetFolders if (folders != null) { - let targetFolders = folders.filter(folder => { + let exactTargetFolders = folders.filter(folder => { + return _.find(folderExactFilters, filter => folder.name.match(new RegExp(`^${filter.value}$`))) + }) + let fuzzyTargetFolders = folders.filter(folder => { return _.find(folderFilters, filter => folder.name.match(new RegExp(`^${filter.value}`))) }) - status.targetFolders = targetFolders + targetFolders = status.targetFolders = exactTargetFolders.concat(fuzzyTargetFolders) if (targetFolders.length > 0) { articles = articles.filter(article => { @@ -204,11 +225,10 @@ function remap (state) { // or Change IDLE MODE if (status.mode === CREATE_MODE) { let newArticle = _.findWhere(articles, {status: 'NEW'}) - let FolderKey = folders[0].key - if (folderFilters.length > 0) { - let targetFolder = _.find(folders, folder => folder.name.match(new RegExp(`^${folderFilters[0].value}`))) - if (targetFolder != null) FolderKey = targetFolder.key - } + console.log('targetFolders') + let FolderKey = targetFolders.length > 0 + ? targetFolders[0].key + : folders[0].key if (newArticle == null) { newArticle = { diff --git a/browser/main/HomePage/ArticleTopBar.js b/browser/main/HomePage/ArticleTopBar.js index 285b95de..62880bc7 100644 --- a/browser/main/HomePage/ArticleTopBar.js +++ b/browser/main/HomePage/ArticleTopBar.js @@ -11,6 +11,8 @@ const searchTutorialElement = ( {'- Search by tag : #{string}'} {'- Search by folder : /{folder_name}\n'} + + {'exact match : //{folder_name}'}