diff --git a/internal_packages/account-sidebar/lib/sidebar-item.coffee b/internal_packages/account-sidebar/lib/sidebar-item.coffee index 3313d6890..7c67c51ed 100644 --- a/internal_packages/account-sidebar/lib/sidebar-item.coffee +++ b/internal_packages/account-sidebar/lib/sidebar-item.coffee @@ -74,7 +74,7 @@ class SidebarItem jsonString = event.dataTransfer.getData(item.dataTransferType) data = Utils.jsonParse(jsonString) return unless data - item.perspective.applyToThreads(data.threadIds) + item.perspective.receiveThreads(data.threadIds) shouldAcceptDrop: (item, event) -> target = item.perspective current = FocusedPerspectiveStore.current() @@ -83,7 +83,7 @@ class SidebarItem return false unless data return false unless target return false if target.isEqual(current) - return false unless target.canApplyToThreads(data.accountIds) + return false unless target.canReceiveThreads(data.accountIds) return item.dataTransferType in event.dataTransfer.types diff --git a/spec/mailbox-perspective-spec.coffee b/spec/mailbox-perspective-spec.coffee new file mode 100644 index 000000000..ea21be4a7 --- /dev/null +++ b/spec/mailbox-perspective-spec.coffee @@ -0,0 +1,50 @@ +{AccountStore, MailboxPerspective, Category} = require 'nylas-exports' + + +describe 'MailboxPerspective', -> + beforeEach -> + spyOn(AccountStore, 'accountForId').andReturn {categoryIcon: -> 'icon'} + @accountIds = ['a1', 'a2', 'a3'] + @perspective = new MailboxPerspective(@accountIds) + + describe 'isEqual', -> + # TODO + + describe 'canReceiveThreads', -> + + it 'returns true if the thread account ids are included in the current account ids', -> + expect(@perspective.canReceiveThreads(['a1'])).toBe true + + it 'returns false otherwise', -> + expect(@perspective.canReceiveThreads(['a4'])).toBe false + expect(@perspective.canReceiveThreads([])).toBe false + expect(@perspective.canReceiveThreads()).toBe false + + describe 'CategoriesMailboxPerspective', -> + beforeEach -> + @accountIds = ['a1', 'a2'] + @categories = [ + new Category(displayName: 'c1', accountId: 'a1') + new Category(displayName: 'c2', accountId: 'a2') + new Category(displayName: 'c3', accountId: 'a2') + ] + @perspective = MailboxPerspective.forCategories(@categories) + + describe 'canReceiveThreads', -> + + it 'returns true if the thread account ids are included in the current account ids', -> + expect(@perspective.canReceiveThreads(['a2'])).toBe true + + it 'returns false otherwise', -> + expect(@perspective.canReceiveThreads(['a4'])).toBe false + expect(@perspective.canReceiveThreads([])).toBe false + expect(@perspective.canReceiveThreads()).toBe false + + it 'returns false if it is not a locked category', -> + @perspective._categories.push( + new Category(name: 'sent', displayName: 'c4', accountId: 'a1') + ) + expect(@perspective.canReceiveThreads(['a2'])).toBe false + + describe 'receiveThreads', -> + # TODO diff --git a/src/mailbox-perspective.coffee b/src/mailbox-perspective.coffee index 13f8fbcc8..df2cd39ee 100644 --- a/src/mailbox-perspective.coffee +++ b/src/mailbox-perspective.coffee @@ -73,12 +73,28 @@ class MailboxPerspective threadUnreadCount: => 0 - canApplyToThreads: (targetAccountIds) => - targetIdsInCurrent = _.difference(targetAccountIds, @accountIds).length is 0 - return targetIdsInCurrent + # Public: + # - accountIds {Array} Array of unique account ids associated with the threads + # that want to be included in this perspective + # + # Returns true if the accountIds are part of the current ids, or false + # otherwise. This means that it checks if I am moving trying to move threads + # betwee the same set of accounts: + # + # E.g.: + # perpective = Starred for accountIds: a1, a2 + # thread1 has accountId a3 + # thread2 has accountId a2 + # + # perspective.canReceiveThreads([a2, a3]) -> false -> I cant move those threads to Starred + # perspective.canReceiveThreads([a2]) -> true -> I can move that thread to # Starred + canReceiveThreads: (accountIds) => + return false unless accountIds and accountIds.length > 0 + incomingIdsInCurrent = _.difference(accountIds, @accountIds).length is 0 + return incomingIdsInCurrent - applyToThreads: (threadsOrIds) => - throw new Error("applyToThreads: Not implemented in base class.") + receiveThreads: (threadsOrIds) => + throw new Error("receiveThreads: Not implemented in base class.") # Whether or not the current MailboxPerspective can "archive" or "trash" # Subclasses should call `super` if they override these methods @@ -110,7 +126,7 @@ class SearchMailboxPerspective extends MailboxPerspective threads: => new SearchSubscription(@searchQuery, @accountIds) - canApplyToThreads: => + canReceiveThreads: => false canArchiveThreads: => @@ -131,7 +147,7 @@ class DraftsMailboxPerspective extends MailboxPerspective threads: => null - canApplyToThreads: => + canReceiveThreads: => false class StarredMailboxPerspective extends MailboxPerspective @@ -149,10 +165,10 @@ class StarredMailboxPerspective extends MailboxPerspective return new MutableQuerySubscription(query, {asResultSet: true}) - canApplyToThreads: => + canReceiveThreads: => super - applyToThreads: (threadsOrIds) => + receiveThreads: (threadsOrIds) => ChangeStarredTask = require './flux/tasks/change-starred-task' task = new ChangeStarredTask({threads:threadsOrIds, starred: true}) Actions.queueTask(task) @@ -166,7 +182,7 @@ class EmptyMailboxPerspective extends MailboxPerspective query = DatabaseStore.findAll(Thread).where(accountId: -1).limit(0) return new MutableQuerySubscription(query, {asResultSet: true}) - canApplyToThreads: => + canReceiveThreads: => false canArchiveThreads: => @@ -175,7 +191,7 @@ class EmptyMailboxPerspective extends MailboxPerspective canTrashThreads: => false - applyToThreads: (threadsOrIds) => + receiveThreads: (threadsOrIds) => class CategoryMailboxPerspective extends MailboxPerspective @@ -224,7 +240,7 @@ class CategoryMailboxPerspective extends MailboxPerspective isInbox: => @_categories[0].name is 'inbox' - canApplyToThreads: => + canReceiveThreads: => super and not _.any @_categories, (c) -> c.isLockedCategory() canArchiveThreads: => @@ -237,10 +253,13 @@ class CategoryMailboxPerspective extends MailboxPerspective return false if cat.name in ["trash"] super - applyToThreads: (threadsOrIds) => + receiveThreads: (threadsOrIds) => FocusedPerspectiveStore = require './flux/stores/focused-perspective-store' currentCategories = FocusedPerspectiveStore.current().categories() + # TODO + # This assumes that the we don't have more than one category per accountId + # attached to this perspective DatabaseStore.modelify(Thread, threadsOrIds).then (threads) => tasks = TaskFactory.tasksForApplyingCategories threads: threads