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}'}