Mailspring/internal_packages/search-playground/lib/search-store.coffee
Ben Gotow df38008c56 fix(*): Small fixes from Lake Tahoe. See Summary.
Summary:
This diff includes a few small things:

- Menu: Don't select the first item until the user taps down arrow, and allow the user to use the arrow keys to move up and down through Menu items.

- Menu: Make scroll code from MultiselectList re-usable, use in Menu. Now if you use the keys to move to an item that is offscreen it will follow.

- Popover: Tapping the button that opened popover should close it

- Make sure buttons in toolbars are at least standard height

- Re-enable Markdown processing via `grunt docs`

- A bit of initial inline documentation for crosjdoc. Need to evaluate whether this is worth doing everywhere.

- New `search-playground` package for experimenting with search and search weights.

- Swap itemClassProvider for more generic itemPropProvider

- Add crojsdoc config file

- Export React, because third party packages can't require things from our app

- [FEATURE] Bring back static file support in third party packages via `nylas://translate/IMG_20150417_124142.jpg`

- Fix invariant error with search bar

- [FEATURE] "Show Original" under Message actions

- Fix DatabaseView so that many archives at once don't cause problems

Test Plan: Run specs

Reviewers: evan

Reviewed By: evan

Differential Revision: https://review.inboxapp.com/D1426
2015-04-22 16:41:29 -07:00

91 lines
1.9 KiB
CoffeeScript

Reflux = require 'reflux'
_ = require 'underscore-plus'
{DatabaseStore,
SearchView,
NamespaceStore,
FocusedContentStore,
Actions,
Utils,
Thread,
Message} = require 'inbox-exports'
module.exports =
SearchStore = Reflux.createStore
init: ->
@_resetInstanceVars()
@listenTo Actions.searchQueryCommitted, @_onSearchCommitted
@listenTo Actions.searchWeightsChanged, @_onSearchWeightsChanged
@listenTo DatabaseStore, @_onDataChanged
@listenTo NamespaceStore, @_onNamespaceChanged
_resetInstanceVars: ->
@_lastQuery = null
@_searchQuery = null
@_searchWeights = {"from": 4, "subject": 2}
view: ->
@_view
searchWeights: ->
@_searchWeights
searchQuery: ->
@_searchQuery
setView: (view) ->
@_viewUnlisten() if @_viewUnlisten
@_view = view
if view
@_viewUnlisten = view.listen ->
@trigger(@)
,@
@trigger(@)
createView: ->
namespaceId = NamespaceStore.current()?.id
if @_searchQuery
query = JSON.parse(JSON.stringify(@_searchQuery))
for term in query
if term['all']
term['weights'] = @_searchWeights
v = new SearchView(query, namespaceId)
v.setSortOrder('relevance')
@setView(v)
else
@setView(null)
Actions.focusInCollection(collection: 'thread', item: null)
# Inbound Events
_onNamespaceChanged: ->
@createView()
_onSearchCommitted: (query) ->
@_searchQuery = query
@createView()
_onSearchWeightsChanged: (weights) ->
@_searchWeights = weights
@createViewDebounced ?= _.debounce =>
@createView()
, 500
@createViewDebounced()
@trigger(@)
_onDataChanged: (change) ->
return unless @_view
if change.objectClass is Thread.name
@_view.invalidate({changed: change.objects, shallow: true})
if change.objectClass is Message.name
threadIds = _.uniq _.map change.objects, (m) -> m.threadId
@_view.invalidateMetadataFor(threadIds)