diff --git a/internal_packages/account-sidebar/lib/sidebar-item.coffee b/internal_packages/account-sidebar/lib/sidebar-item.coffee index 92c127e7f..cd55a4595 100644 --- a/internal_packages/account-sidebar/lib/sidebar-item.coffee +++ b/internal_packages/account-sidebar/lib/sidebar-item.coffee @@ -7,7 +7,8 @@ _str = require 'underscore.string' DestroyCategoryTask, CategoryStore, Actions, - Utils} = require 'nylas-exports' + Utils, + RegExpUtils} = require 'nylas-exports' {OutlineViewItem} = require 'nylas-component-kit' SidebarActions = require './sidebar-actions' @@ -51,7 +52,19 @@ onEditItem = (item, value) -> return if item.deleted is true category = item.perspective.category() return unless category - Actions.queueTask(new SyncbackCategoryTask({category, displayName: value})) + re = RegExpUtils.subcategorySplitRegex() + match = re.exec(category.displayName) + lastMatch = match + while match + lastMatch = match + match = re.exec(category.displayName) + if lastMatch + newDisplayName = category.displayName.slice(0, lastMatch.index + 1) + value + else + newDisplayName = value + if newDisplayName is category.displayName + return + Actions.queueTask(new SyncbackCategoryTask({category, displayName: newDisplayName})) class SidebarItem diff --git a/internal_packages/account-sidebar/lib/sidebar-section.coffee b/internal_packages/account-sidebar/lib/sidebar-section.coffee index 7ae953781..4a3884071 100644 --- a/internal_packages/account-sidebar/lib/sidebar-section.coffee +++ b/internal_packages/account-sidebar/lib/sidebar-section.coffee @@ -3,7 +3,8 @@ _ = require 'underscore' SyncbackCategoryTask, DestroyCategoryTask, CategoryStore, - Category} = require 'nylas-exports' + Category, + RegExpUtils} = require 'nylas-exports' SidebarItem = require './sidebar-item' SidebarActions = require './sidebar-actions' @@ -119,7 +120,8 @@ class SidebarSection seenItems = {} for category in CategoryStore.userCategories(account) # https://regex101.com/r/jK8cC2/1 - itemKey = category.displayName.replace(/[./\\]/g, '/') + re = RegExpUtils.subcategorySplitRegex() + itemKey = category.displayName.replace(re, '/') parent = null parentComponents = itemKey.split('/') diff --git a/internal_packages/account-sidebar/spec/sidebar-item-spec.es6 b/internal_packages/account-sidebar/spec/sidebar-item-spec.es6 new file mode 100644 index 000000000..3103bf16c --- /dev/null +++ b/internal_packages/account-sidebar/spec/sidebar-item-spec.es6 @@ -0,0 +1,23 @@ +import {Category, Actions} from "nylas-exports" +import SidebarItem from "../lib/sidebar-item" + +describe("sidebar-item", function sidebarItemSpec() { + it("preserves nested labels on rename", () => { + spyOn(Actions, "queueTask") + const categories = [new Category({displayName: 'a.b/c', accountId: window.TEST_ACCOUNT_ID})] + NylasEnv.savedState.sidebarKeysCollapsed = {} + const item = SidebarItem.forCategories(categories) + item.onEdited(item, 'd') + const task = Actions.queueTask.calls[0].args[0] + expect(task.displayName).toBe("a.b/d") + }) + it("preserves labels on rename", () => { + spyOn(Actions, "queueTask") + const categories = [new Category({displayName: 'a', accountId: window.TEST_ACCOUNT_ID})] + NylasEnv.savedState.sidebarKeysCollapsed = {} + const item = SidebarItem.forCategories(categories) + item.onEdited(item, 'b') + const task = Actions.queueTask.calls[0].args[0] + expect(task.displayName).toBe("b") + }) +}) diff --git a/src/regexp-utils.coffee b/src/regexp-utils.coffee index 5d0c1a692..2e27039e4 100644 --- a/src/regexp-utils.coffee +++ b/src/regexp-utils.coffee @@ -175,4 +175,8 @@ RegExpUtils = n1QuoteStartRegex: -> new RegExp(/<\w+[^>]*gmail_quote/i) + # https://regex101.com/r/jK8cC2/1 + subcategorySplitRegex: -> + /[./\\]/g + module.exports = RegExpUtils