1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 17:56:25 +00:00

// filterを使うと確実にFolder名が一致するもののみを表示する

This commit is contained in:
Rokt33r
2015-11-15 23:20:06 +09:00
parent bbc3c85212
commit b28b18a19a
4 changed files with 73 additions and 29 deletions

View File

@@ -23,6 +23,7 @@ function getIconPath () {
require('../styles/finder/index.styl') require('../styles/finder/index.styl')
const FOLDER_FILTER = 'FOLDER_FILTER' const FOLDER_FILTER = 'FOLDER_FILTER'
const FOLDER_EXACT_FILTER = 'FOLDER_EXACT_FILTER'
const TEXT_FILTER = 'TEXT_FILTER' const TEXT_FILTER = 'TEXT_FILTER'
const TAG_FILTER = 'TAG_FILTER' const TAG_FILTER = 'TAG_FILTER'
@@ -136,27 +137,47 @@ FinderMain.propTypes = {
dispatch: PropTypes.func dispatch: PropTypes.func
} }
function remap (state) { // Ignore invalid key
let { articles, folders, status } = state function ignoreInvalidKey (key) {
return key.length > 0 && !key.match(/^\/\/$/) && !key.match(/^\/$/) && !key.match(/^#$/)
}
let filters = status.search.split(' ').map(key => key.trim()).filter(key => key.length > 0 && !key.match(/^\/$/) && !key.match(/^#$/)).map(key => { // Build filter object by key
if (key.match(/^\/.+$/)) { 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]} return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]}
} }
if (key.match(/^#(.+)/)) { if (key.match(/^#(.+)/)) {
return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]} return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]}
} }
return {type: TEXT_FILTER, value: key} return {type: TEXT_FILTER, value: key}
}) }
function remap (state) {
let { articles, folders, status } = state
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 folderFilters = filters.filter(filter => filter.type === FOLDER_FILTER)
let textFilters = filters.filter(filter => filter.type === TEXT_FILTER) let textFilters = filters.filter(filter => filter.type === TEXT_FILTER)
let tagFilters = filters.filter(filter => filter.type === TAG_FILTER) let tagFilters = filters.filter(filter => filter.type === TAG_FILTER)
let targetFolders
if (folders != null) { 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}`))) return _.find(folderFilters, filter => folder.name.match(new RegExp(`^${filter.value}`)))
}) })
status.targetFolders = targetFolders targetFolders = status.targetFolders = exactTargetFolders.concat(fuzzyTargetFolders)
if (targetFolders.length > 0) { if (targetFolders.length > 0) {
articles = articles.filter(article => { articles = articles.filter(article => {

View File

@@ -12,6 +12,7 @@ import { isModalOpen, closeModal } from 'boost/modal'
const TEXT_FILTER = 'TEXT_FILTER' const TEXT_FILTER = 'TEXT_FILTER'
const FOLDER_FILTER = 'FOLDER_FILTER' const FOLDER_FILTER = 'FOLDER_FILTER'
const FOLDER_EXACT_FILTER = 'FOLDER_EXACT_FILTER'
const TAG_FILTER = 'TAG_FILTER' const TAG_FILTER = 'TAG_FILTER'
class HomePage extends React.Component { 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) { function remap (state) {
let { folders, articles, status } = state let { folders, articles, status } = state
@@ -145,24 +165,25 @@ function remap (state) {
let allArticles = articles.slice() let allArticles = articles.slice()
// Filter articles // Filter articles
let filters = status.search.split(' ').map(key => key.trim()).filter(key => key.length > 0 && !key.match(/^\/$/) && !key.match(/^#$/)).map(key => { let filters = status.search.split(' ')
if (key.match(/^\/.+/)) { .map(key => key.trim())
return {type: FOLDER_FILTER, value: key.match(/^\/(.+)$/)[1]} .filter(ignoreInvalidKey)
} .map(buildFilter)
if (key.match(/^#(.+)/)) {
return {type: TAG_FILTER, value: key.match(/^#(.+)$/)[1]} let folderExactFilters = filters.filter(filter => filter.type === FOLDER_EXACT_FILTER)
}
return {type: TEXT_FILTER, value: key}
})
let folderFilters = filters.filter(filter => filter.type === FOLDER_FILTER) let folderFilters = filters.filter(filter => filter.type === FOLDER_FILTER)
let textFilters = filters.filter(filter => filter.type === TEXT_FILTER) let textFilters = filters.filter(filter => filter.type === TEXT_FILTER)
let tagFilters = filters.filter(filter => filter.type === TAG_FILTER) let tagFilters = filters.filter(filter => filter.type === TAG_FILTER)
let targetFolders
if (folders != null) { 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}`))) return _.find(folderFilters, filter => folder.name.match(new RegExp(`^${filter.value}`)))
}) })
status.targetFolders = targetFolders targetFolders = status.targetFolders = exactTargetFolders.concat(fuzzyTargetFolders)
if (targetFolders.length > 0) { if (targetFolders.length > 0) {
articles = articles.filter(article => { articles = articles.filter(article => {
@@ -204,11 +225,10 @@ function remap (state) {
// or Change IDLE MODE // or Change IDLE MODE
if (status.mode === CREATE_MODE) { if (status.mode === CREATE_MODE) {
let newArticle = _.findWhere(articles, {status: 'NEW'}) let newArticle = _.findWhere(articles, {status: 'NEW'})
let FolderKey = folders[0].key console.log('targetFolders')
if (folderFilters.length > 0) { let FolderKey = targetFolders.length > 0
let targetFolder = _.find(folders, folder => folder.name.match(new RegExp(`^${folderFilters[0].value}`))) ? targetFolders[0].key
if (targetFolder != null) FolderKey = targetFolder.key : folders[0].key
}
if (newArticle == null) { if (newArticle == null) {
newArticle = { newArticle = {

View File

@@ -11,6 +11,8 @@ const searchTutorialElement = (
<text x='450' y='60' fill={BRAND_COLOR} fontSize='18'>{'- Search by tag : #{string}'}</text> <text x='450' y='60' fill={BRAND_COLOR} fontSize='18'>{'- Search by tag : #{string}'}</text>
<text x='450' y='85' fill={BRAND_COLOR} fontSize='18'> <text x='450' y='85' fill={BRAND_COLOR} fontSize='18'>
{'- Search by folder : /{folder_name}\n'}</text> {'- Search by folder : /{folder_name}\n'}</text>
<text x='465' y='105' fill={BRAND_COLOR} fontSize='14'>
{'exact match : //{folder_name}'}</text>
<svg width='500' height='300'> <svg width='500' height='300'>
<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 <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

View File

@@ -29,7 +29,8 @@ function folders (state = initialFolders, action) {
updatedAt: new Date() updatedAt: new Date()
}) })
if (newFolder.length === 0) throw new Error('Folder name is required') if (newFolder.name == null && newFolder.name.length === 0) throw new Error('Folder name is required')
if (newFolder.name.match(/\//)) throw new Error('`/` is not available for folder name')
let conflictFolder = _.findWhere(state, {name: newFolder.name}) let conflictFolder = _.findWhere(state, {name: newFolder.name})
if (conflictFolder != null) throw new Error(`${newFolder.name} already exists!`) if (conflictFolder != null) throw new Error(`${newFolder.name} already exists!`)
@@ -129,7 +130,7 @@ function status (state = initialStatus, action) {
return state return state
case SWITCH_FOLDER: case SWITCH_FOLDER:
state.mode = IDLE_MODE state.mode = IDLE_MODE
state.search = `/${action.data} ` state.search = `//${action.data} `
return state return state
case SWITCH_MODE: case SWITCH_MODE: