mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-12 12:40:08 +08:00
4f34c8403f
Summary: This diff centralizes logic for creating common tasks for things like moving to trash, archive, etc. TaskFactory exposes a set of convenience methods and hides the whole "and also remove the current label" business from the user. This diff also formally separates the concept of "moving to trash" and "archiving" so that "remove" isn't used in an unclear way. I also refactored where selection is managed. Previously you'd fire some action like archiveSelection and it'd clear the selection, but if you selected some items and used another method to archive a few, they were still selected. The selection is now bound to the ModelView as intended, so if items are removed from the modelView, they are removed from it's attached selection. This means that it shouldn't /technically/ be possible to have selected items which are not in view. I haven't refactored the tests yet. They are likely broken... Fix next/prev logic Test Plan: Run tests Reviewers: evan Reviewed By: evan Differential Revision: https://phab.nylas.com/D2157
290 lines
7.1 KiB
CoffeeScript
290 lines
7.1 KiB
CoffeeScript
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
moment = require "moment"
|
|
_ = require 'underscore'
|
|
CSON = require 'season'
|
|
React = require "react/addons"
|
|
ReactTestUtils = React.addons.TestUtils
|
|
ReactTestUtils = _.extend ReactTestUtils, require "jasmine-react-helpers"
|
|
|
|
{Thread,
|
|
Actions,
|
|
Account,
|
|
DatabaseStore,
|
|
WorkspaceStore,
|
|
NylasTestUtils,
|
|
AccountStore,
|
|
ComponentRegistry} = require "nylas-exports"
|
|
{ListTabular} = require 'nylas-component-kit'
|
|
|
|
|
|
ThreadStore = require "../lib/thread-store"
|
|
ThreadList = require "../lib/thread-list"
|
|
|
|
ParticipantsItem = React.createClass
|
|
render: -> <div></div>
|
|
|
|
test_threads = -> [
|
|
(new Thread).fromJSON({
|
|
"id": "111",
|
|
"object": "thread",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"account_id": TEST_ACCOUNT_ID,
|
|
"snippet": "snippet 111",
|
|
"subject": "Subject 111",
|
|
"tags": [
|
|
{
|
|
"id": "unseen",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "unseen"
|
|
},
|
|
{
|
|
"id": "all",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "all"
|
|
},
|
|
{
|
|
"id": "inbox",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "inbox"
|
|
},
|
|
{
|
|
"id": "unread",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "unread"
|
|
},
|
|
{
|
|
"id": "attachment",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "attachment"
|
|
}
|
|
],
|
|
"participants": [
|
|
{
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "User One",
|
|
"email": "user1@nylas.com"
|
|
},
|
|
{
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "User Two",
|
|
"email": "user2@nylas.com"
|
|
}
|
|
],
|
|
"last_message_received_timestamp": 1415742036
|
|
}),
|
|
(new Thread).fromJSON({
|
|
"id": "222",
|
|
"object": "thread",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"account_id": TEST_ACCOUNT_ID,
|
|
"snippet": "snippet 222",
|
|
"subject": "Subject 222",
|
|
"tags": [
|
|
{
|
|
"id": "unread",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "unread"
|
|
},
|
|
{
|
|
"id": "all",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "all"
|
|
},
|
|
{
|
|
"id": "unseen",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "unseen"
|
|
},
|
|
{
|
|
"id": "inbox",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "inbox"
|
|
}
|
|
],
|
|
"participants": [
|
|
{
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "User One",
|
|
"email": "user1@nylas.com"
|
|
},
|
|
{
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "User Three",
|
|
"email": "user3@nylas.com"
|
|
}
|
|
],
|
|
"last_message_received_timestamp": 1415741913
|
|
}),
|
|
(new Thread).fromJSON({
|
|
"id": "333",
|
|
"object": "thread",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"account_id": TEST_ACCOUNT_ID,
|
|
"snippet": "snippet 333",
|
|
"subject": "Subject 333",
|
|
"tags": [
|
|
{
|
|
"id": "inbox",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "inbox"
|
|
},
|
|
{
|
|
"id": "all",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "all"
|
|
},
|
|
{
|
|
"id": "unseen",
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "unseen"
|
|
}
|
|
],
|
|
"participants": [
|
|
{
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "User One",
|
|
"email": "user1@nylas.com"
|
|
},
|
|
{
|
|
"created_at": null,
|
|
"updated_at": null,
|
|
"name": "User Four",
|
|
"email": "user4@nylas.com"
|
|
}
|
|
],
|
|
"last_message_received_timestamp": 1415741837
|
|
})
|
|
]
|
|
|
|
|
|
cjsxSubjectResolver = (thread) ->
|
|
<div>
|
|
<span>Subject {thread.id}</span>
|
|
<span className="snippet">Snippet</span>
|
|
</div>
|
|
|
|
describe "ThreadList", ->
|
|
|
|
Foo = React.createClass({render: -> <div>{@props.children}</div>})
|
|
c1 = new ListTabular.Column
|
|
name: "Name"
|
|
flex: 1
|
|
resolver: (thread) -> "#{thread.id} Test Name"
|
|
c2 = new ListTabular.Column
|
|
name: "Subject"
|
|
flex: 3
|
|
resolver: cjsxSubjectResolver
|
|
c3 = new ListTabular.Column
|
|
name: "Date"
|
|
resolver: (thread) -> <Foo>{thread.id}</Foo>
|
|
|
|
columns = [c1,c2,c3]
|
|
|
|
beforeEach ->
|
|
NylasTestUtils.loadKeymap("internal_packages/thread-list/keymaps/thread-list")
|
|
spyOn(ThreadStore, "_onAccountChanged")
|
|
spyOn(DatabaseStore, "findAll").andCallFake ->
|
|
new Promise (resolve, reject) -> resolve(test_threads())
|
|
ReactTestUtils.spyOnClass(ThreadList, "_prepareColumns").andCallFake ->
|
|
@_columns = columns
|
|
|
|
ThreadStore._resetInstanceVars()
|
|
|
|
ComponentRegistry.register
|
|
name: 'Participants'
|
|
view: ParticipantsItem
|
|
|
|
@thread_list = ReactTestUtils.renderIntoDocument(
|
|
<ThreadList />
|
|
)
|
|
|
|
it "renders into the document", ->
|
|
expect(ReactTestUtils.isCompositeComponentWithType(@thread_list,
|
|
ThreadList)).toBe true
|
|
|
|
it "has the expected columns", ->
|
|
expect(@thread_list._columns).toEqual columns
|
|
|
|
it "by default has zero children", ->
|
|
items = ReactTestUtils.scryRenderedComponentsWithType(@thread_list, ListTabular.Item)
|
|
expect(items.length).toBe 0
|
|
|
|
describe "when the workspace is in list mode", ->
|
|
beforeEach ->
|
|
spyOn(WorkspaceStore, "layoutMode").andReturn "list"
|
|
@thread_list.setState focusedId: "t111"
|
|
|
|
it "allows reply only when the sheet type is 'Thread'", ->
|
|
spyOn(WorkspaceStore, "sheet").andCallFake -> {type: "Thread"}
|
|
spyOn(Actions, "composeReply")
|
|
@thread_list._onReply()
|
|
expect(Actions.composeReply).toHaveBeenCalled()
|
|
expect(@thread_list._actionInVisualScope()).toBe true
|
|
|
|
it "doesn't reply only when the sheet type isnt 'Thread'", ->
|
|
spyOn(WorkspaceStore, "sheet").andCallFake -> {type: "Root"}
|
|
spyOn(Actions, "composeReply")
|
|
@thread_list._onReply()
|
|
expect(Actions.composeReply).not.toHaveBeenCalled()
|
|
expect(@thread_list._actionInVisualScope()).toBe false
|
|
|
|
describe "when the workspace is in split mode", ->
|
|
beforeEach ->
|
|
spyOn(WorkspaceStore, "layoutMode").andReturn "split"
|
|
@thread_list.setState focusedId: "t111"
|
|
|
|
it "allows reply and reply-all regardless of sheet type", ->
|
|
spyOn(WorkspaceStore, "sheet").andCallFake -> {type: "anything"}
|
|
spyOn(Actions, "composeReply")
|
|
@thread_list._onReply()
|
|
expect(Actions.composeReply).toHaveBeenCalled()
|
|
expect(@thread_list._actionInVisualScope()).toBe true
|
|
|
|
describe "Populated thread list", ->
|
|
beforeEach ->
|
|
view =
|
|
loaded: -> true
|
|
get: (i) -> test_threads()[i]
|
|
count: -> test_threads().length
|
|
setRetainedRange: ->
|
|
ThreadStore._view = view
|
|
ThreadStore._focusedId = null
|
|
ThreadStore.trigger(ThreadStore)
|
|
@thread_list_node = React.findDOMNode(@thread_list)
|
|
spyOn(@thread_list, "setState").andCallThrough()
|
|
|
|
it "renders all of the thread list items", ->
|
|
advanceClock(100)
|
|
items = ReactTestUtils.scryRenderedComponentsWithType(@thread_list, ListTabular.Item)
|
|
expect(items.length).toBe(test_threads().length)
|