Skip to content

Commit b28b18a

Browse files
committed
// filterを使うと確実にFolder名が一致するもののみを表示する
1 parent bbc3c85 commit b28b18a

4 files changed

Lines changed: 73 additions & 29 deletions

File tree

browser/finder/index.js

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ function getIconPath () {
2323
require('../styles/finder/index.styl')
2424

2525
const FOLDER_FILTER = 'FOLDER_FILTER'
26+
const FOLDER_EXACT_FILTER = 'FOLDER_EXACT_FILTER'
2627
const TEXT_FILTER = 'TEXT_FILTER'
2728
const TAG_FILTER = 'TAG_FILTER'
2829

@@ -136,27 +137,47 @@ FinderMain.propTypes = {
136137
dispatch: PropTypes.func
137138
}
138139

140+
// Ignore invalid key
141+
function ignoreInvalidKey (key) {
142+
return key.length > 0 && !key.match(/^\/\/$/) && !key.match(/^\/$/) && !key.match(/^#$/)
143+
}
144+
145+
// Build filter object by key
146+
function buildFilter (key) {
147+
if (key.match(/^\/\/.+/)) {
148+
return {type: FOLDER_EXACT_FILTER, value: key.match(/^\/\/(.+)$/)[1]}
149+
}
150+
if (key.match(/^\/.+/)) {
151+
return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]}
152+
}
153+
if (key.match(/^#(.+)/)) {
154+
return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]}
155+
}
156+
return {type: TEXT_FILTER, value: key}
157+
}
158+
139159
function remap (state) {
140160
let { articles, folders, status } = state
141161

142-
let filters = status.search.split(' ').map(key => key.trim()).filter(key => key.length > 0 && !key.match(/^\/$/) && !key.match(/^#$/)).map(key => {
143-
if (key.match(/^\/.+$/)) {
144-
return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]}
145-
}
146-
if (key.match(/^#(.+)/)) {
147-
return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]}
148-
}
149-
return {type: TEXT_FILTER, value: key}
150-
})
162+
let filters = status.search.split(' ')
163+
.map(key => key.trim())
164+
.filter(ignoreInvalidKey)
165+
.map(buildFilter)
166+
167+
let folderExactFilters = filters.filter(filter => filter.type === FOLDER_EXACT_FILTER)
151168
let folderFilters = filters.filter(filter => filter.type === FOLDER_FILTER)
152169
let textFilters = filters.filter(filter => filter.type === TEXT_FILTER)
153170
let tagFilters = filters.filter(filter => filter.type === TAG_FILTER)
154171

172+
let targetFolders
155173
if (folders != null) {
156-
let targetFolders = folders.filter(folder => {
174+
let exactTargetFolders = folders.filter(folder => {
175+
return _.find(folderExactFilters, filter => folder.name.match(new RegExp(`^${filter.value}$`)))
176+
})
177+
let fuzzyTargetFolders = folders.filter(folder => {
157178
return _.find(folderFilters, filter => folder.name.match(new RegExp(`^${filter.value}`)))
158179
})
159-
status.targetFolders = targetFolders
180+
targetFolders = status.targetFolders = exactTargetFolders.concat(fuzzyTargetFolders)
160181

161182
if (targetFolders.length > 0) {
162183
articles = articles.filter(article => {

browser/main/HomePage.js

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { isModalOpen, closeModal } from 'boost/modal'
1212

1313
const TEXT_FILTER = 'TEXT_FILTER'
1414
const FOLDER_FILTER = 'FOLDER_FILTER'
15+
const FOLDER_EXACT_FILTER = 'FOLDER_EXACT_FILTER'
1516
const TAG_FILTER = 'TAG_FILTER'
1617

1718
class HomePage extends React.Component {
@@ -135,6 +136,25 @@ class HomePage extends React.Component {
135136
}
136137
}
137138

139+
// Ignore invalid key
140+
function ignoreInvalidKey (key) {
141+
return key.length > 0 && !key.match(/^\/\/$/) && !key.match(/^\/$/) && !key.match(/^#$/)
142+
}
143+
144+
// Build filter object by key
145+
function buildFilter (key) {
146+
if (key.match(/^\/\/.+/)) {
147+
return {type: FOLDER_EXACT_FILTER, value: key.match(/^\/\/(.+)$/)[1]}
148+
}
149+
if (key.match(/^\/.+/)) {
150+
return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]}
151+
}
152+
if (key.match(/^#(.+)/)) {
153+
return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]}
154+
}
155+
return {type: TEXT_FILTER, value: key}
156+
}
157+
138158
function remap (state) {
139159
let { folders, articles, status } = state
140160

@@ -145,24 +165,25 @@ function remap (state) {
145165
let allArticles = articles.slice()
146166

147167
// Filter articles
148-
let filters = status.search.split(' ').map(key => key.trim()).filter(key => key.length > 0 && !key.match(/^\/$/) && !key.match(/^#$/)).map(key => {
149-
if (key.match(/^\/.+/)) {
150-
return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]}
151-
}
152-
if (key.match(/^#(.+)/)) {
153-
return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]}
154-
}
155-
return {type: TEXT_FILTER, value: key}
156-
})
168+
let filters = status.search.split(' ')
169+
.map(key => key.trim())
170+
.filter(ignoreInvalidKey)
171+
.map(buildFilter)
172+
173+
let folderExactFilters = filters.filter(filter => filter.type === FOLDER_EXACT_FILTER)
157174
let folderFilters = filters.filter(filter => filter.type === FOLDER_FILTER)
158175
let textFilters = filters.filter(filter => filter.type === TEXT_FILTER)
159176
let tagFilters = filters.filter(filter => filter.type === TAG_FILTER)
160177

178+
let targetFolders
161179
if (folders != null) {
162-
let targetFolders = folders.filter(folder => {
180+
let exactTargetFolders = folders.filter(folder => {
181+
return _.find(folderExactFilters, filter => folder.name.match(new RegExp(`^${filter.value}$`)))
182+
})
183+
let fuzzyTargetFolders = folders.filter(folder => {
163184
return _.find(folderFilters, filter => folder.name.match(new RegExp(`^${filter.value}`)))
164185
})
165-
status.targetFolders = targetFolders
186+
targetFolders = status.targetFolders = exactTargetFolders.concat(fuzzyTargetFolders)
166187

167188
if (targetFolders.length > 0) {
168189
articles = articles.filter(article => {
@@ -204,11 +225,10 @@ function remap (state) {
204225
// or Change IDLE MODE
205226
if (status.mode === CREATE_MODE) {
206227
let newArticle = _.findWhere(articles, {status: 'NEW'})
207-
let FolderKey = folders[0].key
208-
if (folderFilters.length > 0) {
209-
let targetFolder = _.find(folders, folder => folder.name.match(new RegExp(`^${folderFilters[0].value}`)))
210-
if (targetFolder != null) FolderKey = targetFolder.key
211-
}
228+
console.log('targetFolders')
229+
let FolderKey = targetFolders.length > 0
230+
? targetFolders[0].key
231+
: folders[0].key
212232

213233
if (newArticle == null) {
214234
newArticle = {

browser/main/HomePage/ArticleTopBar.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ const searchTutorialElement = (
1111
<text x='450' y='60' fill={BRAND_COLOR} fontSize='18'>{'- Search by tag : #{string}'}</text>
1212
<text x='450' y='85' fill={BRAND_COLOR} fontSize='18'>
1313
{'- Search by folder : /{folder_name}\n'}</text>
14+
<text x='465' y='105' fill={BRAND_COLOR} fontSize='14'>
15+
{'exact match : //{folder_name}'}</text>
1416

1517
<svg width='500' height='300'>
1618
<path fill='white' d='M54.5,51.5c-12.4,3.3-27.3-1.4-38.4-7C11.2,42,5,38.1,5.6,31.8c0.7-6.9,8.1-11.2,13.8-13.7

lib/reducer.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ function folders (state = initialFolders, action) {
2929
updatedAt: new Date()
3030
})
3131

32-
if (newFolder.length === 0) throw new Error('Folder name is required')
32+
if (newFolder.name == null && newFolder.name.length === 0) throw new Error('Folder name is required')
33+
if (newFolder.name.match(/\//)) throw new Error('`/` is not available for folder name')
3334

3435
let conflictFolder = _.findWhere(state, {name: newFolder.name})
3536
if (conflictFolder != null) throw new Error(`${newFolder.name} already exists!`)
@@ -129,7 +130,7 @@ function status (state = initialStatus, action) {
129130
return state
130131
case SWITCH_FOLDER:
131132
state.mode = IDLE_MODE
132-
state.search = `/${action.data} `
133+
state.search = `//${action.data} `
133134

134135
return state
135136
case SWITCH_MODE:

0 commit comments

Comments
 (0)