diff --git a/internal_packages/composer-emoji/lib/emoji-actions.es6 b/internal_packages/composer-emoji/lib/emoji-actions.es6
index 0be4551c2..ea0150df0 100644
--- a/internal_packages/composer-emoji/lib/emoji-actions.es6
+++ b/internal_packages/composer-emoji/lib/emoji-actions.es6
@@ -5,7 +5,7 @@ const EmojiActions = Reflux.createActions([
"useEmoji",
]);
-for (const key in EmojiActions) {
+for (const key of Object.keys(EmojiActions)) {
EmojiActions[key].sync = true;
}
diff --git a/internal_packages/composer-templates/lib/main.es6 b/internal_packages/composer-templates/lib/main.es6
index 91a12f262..a3b5558f9 100644
--- a/internal_packages/composer-templates/lib/main.es6
+++ b/internal_packages/composer-templates/lib/main.es6
@@ -1,3 +1,4 @@
+/* eslint global-require: 0 */
import {PreferencesUIStore, ComponentRegistry, ExtensionRegistry} from 'nylas-exports';
import TemplatePicker from './template-picker';
import TemplateStatusBar from './template-status-bar';
diff --git a/internal_packages/composer/lib/fields.es6 b/internal_packages/composer/lib/fields.es6
index 0593e7b0e..43487bb93 100644
--- a/internal_packages/composer/lib/fields.es6
+++ b/internal_packages/composer/lib/fields.es6
@@ -10,12 +10,12 @@ const Fields = {
Fields.ParticipantFields = [Fields.To, Fields.Cc, Fields.Bcc];
Fields.Order = {
- "textFieldTo": 1,
- "textFieldCc": 2,
- "textFieldBcc": 3,
- "fromField": -1, // Not selectable
- "textFieldSubject": 5,
- "contentBody": 6,
+ textFieldTo: 1,
+ textFieldCc: 2,
+ textFieldBcc: 3,
+ fromField: -1, // Not selectable
+ textFieldSubject: 5,
+ contentBody: 6,
};
export default Fields
diff --git a/internal_packages/message-autoload-images/spec/autoload-images-extension-spec.es6 b/internal_packages/message-autoload-images/spec/autoload-images-extension-spec.es6
index a161ecbba..a8c36322e 100644
--- a/internal_packages/message-autoload-images/spec/autoload-images-extension-spec.es6
+++ b/internal_packages/message-autoload-images/spec/autoload-images-extension-spec.es6
@@ -13,9 +13,9 @@ describe('AutoloadImagesExtension', function autoloadImagesExtension() {
const name = filename.replace('-in.html', '');
scenarios.push({
- name: name,
- in: fs.readFileSync(path.join(fixtures, filename)).toString(),
- out: fs.readFileSync(path.join(fixtures, `${name}-out.html`)).toString(),
+ 'name': name,
+ 'in': fs.readFileSync(path.join(fixtures, filename)).toString(),
+ 'out': fs.readFileSync(path.join(fixtures, `${name}-out.html`)).toString(),
});
}
});
diff --git a/internal_packages/message-list/lib/autolinker.es6 b/internal_packages/message-list/lib/autolinker.es6
index 064d52c1e..09462c6b1 100644
--- a/internal_packages/message-list/lib/autolinker.es6
+++ b/internal_packages/message-list/lib/autolinker.es6
@@ -59,7 +59,7 @@ export function autolink(doc, {async} = {}) {
['mailto:', RegExpUtils.emailRegex(), {
// Technically, gmail.com/bengotow@gmail.com is an email address. After
// matching, manully exclude any email that follows the .*[/?].*@ pattern.
- exclude: [/\..*[\/|\?].*\@/],
+ exclude: [/\..*[\/|\?].*@/],
}],
['tel:', RegExpUtils.phoneRegex()],
['', RegExpUtils.urlRegex({matchEntireString: false})],
@@ -85,7 +85,7 @@ export function autolink(doc, {async} = {}) {
// Traverse the new DOM tree and make sure everything with an href has a title.
const aTagWalker = document.createTreeWalker(doc.body, NodeFilter.SHOW_ELEMENT, {
acceptNode: (node) =>
- node.href ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP
+ (node.href ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP)
,
});
while (aTagWalker.nextNode()) {
diff --git a/internal_packages/preferences/lib/preferences-tabs-bar.jsx b/internal_packages/preferences/lib/preferences-tabs-bar.jsx
index ca54c58d7..fef877863 100644
--- a/internal_packages/preferences/lib/preferences-tabs-bar.jsx
+++ b/internal_packages/preferences/lib/preferences-tabs-bar.jsx
@@ -16,10 +16,6 @@ class PreferencesTabItem extends React.Component {
tabItem: React.PropTypes.instanceOf(PreferencesUIStore.TabItem).isRequired,
}
- constructor() {
- super();
- }
-
_onClick = () => {
Actions.switchPreferencesTab(this.props.tabItem.tabId);
}
@@ -33,18 +29,21 @@ class PreferencesTabItem extends React.Component {
const {tabId, displayName} = this.props.tabItem;
const classes = classNames({
- "item": true,
- "active": tabId === this.props.selection.get('tabId'),
+ item: true,
+ active: tabId === this.props.selection.get('tabId'),
});
let path = `icon-preferences-${displayName.toLowerCase().replace(" ", "-")}.png`
if (!fs.existsSync(Utils.imageNamed(path))) {
path = "icon-preferences-general.png";
}
- const icon = ();
+ const icon = (
+
+ );
return (
@@ -66,16 +65,13 @@ class PreferencesTabsBar extends React.Component {
selection: React.PropTypes.instanceOf(Immutable.Map).isRequired,
}
- constructor() {
- super();
- }
-
renderTabs() {
return this.props.tabs.map((tabItem) =>
+ selection={this.props.selection}
+ />
);
}
diff --git a/internal_packages/preferences/lib/tabs/config-schema-item.jsx b/internal_packages/preferences/lib/tabs/config-schema-item.jsx
index 297a6b44f..da01abee7 100644
--- a/internal_packages/preferences/lib/tabs/config-schema-item.jsx
+++ b/internal_packages/preferences/lib/tabs/config-schema-item.jsx
@@ -74,7 +74,12 @@ class ConfigSchemaItem extends React.Component {
} else if (this.props.configSchema.type === 'boolean') {
return (
-
+
);
diff --git a/internal_packages/preferences/lib/tabs/preferences-account-list.jsx b/internal_packages/preferences/lib/tabs/preferences-account-list.jsx
index 543bd6d1a..42bc1f5ef 100644
--- a/internal_packages/preferences/lib/tabs/preferences-account-list.jsx
+++ b/internal_packages/preferences/lib/tabs/preferences-account-list.jsx
@@ -15,11 +15,17 @@ class PreferencesAccountList extends Component {
_renderAccountStateIcon(account) {
if (account.syncState !== "running") {
- return (
)
+ return (
+
+
+
+ )
}
+ return null;
}
_renderAccount = (account) => {
@@ -29,14 +35,16 @@ class PreferencesAccountList extends Component {
return (
+ className={classnames({"account": true, "sync-error": syncError})}
+ key={account.id}
+ >
+ mode={RetinaImg.Mode.ContentPreserve}
+ />
@@ -62,7 +70,8 @@ class PreferencesAccountList extends Component {
onReorderItem={this.props.onReorderAccount}
onCreateItem={this.props.onAddAccount}
onSelectItem={this.props.onSelectAccount}
- onDeleteItem={this.props.onRemoveAccount} />
+ onDeleteItem={this.props.onRemoveAccount}
+ />
);
}
diff --git a/internal_packages/preferences/lib/tabs/preferences-accounts.jsx b/internal_packages/preferences/lib/tabs/preferences-accounts.jsx
index 9a83b6f98..3725012d6 100644
--- a/internal_packages/preferences/lib/tabs/preferences-accounts.jsx
+++ b/internal_packages/preferences/lib/tabs/preferences-accounts.jsx
@@ -64,10 +64,12 @@ class PreferencesAccounts extends React.Component {
onAddAccount={this._onAddAccount}
onReorderAccount={this._onReorderAccount}
onSelectAccount={this._onSelectAccount}
- onRemoveAccount={this._onRemoveAccount} />
+ onRemoveAccount={this._onRemoveAccount}
+ />
+ onAccountUpdated={this._onAccountUpdated}
+ />
);
diff --git a/internal_packages/preferences/lib/tabs/preferences-general.jsx b/internal_packages/preferences/lib/tabs/preferences-general.jsx
index 9f57e56aa..9681a4426 100644
--- a/internal_packages/preferences/lib/tabs/preferences-general.jsx
+++ b/internal_packages/preferences/lib/tabs/preferences-general.jsx
@@ -4,49 +4,47 @@ import ConfigSchemaItem from './config-schema-item';
import WorkspaceSection from './workspace-section';
import SendingSection from './sending-section';
-class PreferencesGeneral extends React.Component {
- static displayName = 'PreferencesGeneral';
+const PreferencesGeneral = (props) => {
+ return (
+
- static propTypes = {
- config: React.PropTypes.object,
- configSchema: React.PropTypes.object,
- }
+
- render() {
- return (
-
-
-
-
-
-
-
- N1 desktop notifications on Linux require Zenity. You may need to install
- it with your package manager (i.e., sudo apt-get install zenity
).
-
-
-
-
-
-
-
+
+
+ N1 desktop notifications on Linux require Zenity. You may need to install
+ it with your package manager (i.e., sudo apt-get install zenity
).
- );
- }
+
+
+
+
+
+
+
+ );
}
+PreferencesGeneral.propTypes = {
+ config: React.PropTypes.object,
+ configSchema: React.PropTypes.object,
+};
+
export default PreferencesGeneral;
diff --git a/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx b/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx
index 993c2990f..85c1b2a96 100644
--- a/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx
+++ b/internal_packages/preferences/lib/tabs/preferences-keymaps.jsx
@@ -111,7 +111,8 @@ class PreferencesKeymaps extends React.Component {
style={{margin: 0}}
tabIndex={-1}
value={this.props.config.get('core.keymapTemplate')}
- onChange={(event) => this.props.config.set('core.keymapTemplate', event.target.value)}>
+ onChange={(event) => this.props.config.set('core.keymapTemplate', event.target.value)}
+ >
{this.state.templates.map((template) => {
return
})}
diff --git a/internal_packages/preferences/lib/tabs/preferences-mail-rules.jsx b/internal_packages/preferences/lib/tabs/preferences-mail-rules.jsx
index 1b5afebe4..0a5b8c55b 100644
--- a/internal_packages/preferences/lib/tabs/preferences-mail-rules.jsx
+++ b/internal_packages/preferences/lib/tabs/preferences-mail-rules.jsx
@@ -141,7 +141,8 @@ class PreferencesMailRules extends React.Component {
);
@@ -154,7 +155,8 @@ class PreferencesMailRules extends React.Component {
+ mode={RetinaImg.Mode.ContentDark}
+ />
No rules
);
@@ -251,7 +256,9 @@ class PreferencesMailRules extends React.Component {
{` — ${Number(task.numberOfImpactedItems()).toLocaleString()} processed...`}
-
diff --git a/internal_packages/preferences/lib/tabs/sending-section.jsx b/internal_packages/preferences/lib/tabs/sending-section.jsx
index 2887e3c92..003e3bfaf 100644
--- a/internal_packages/preferences/lib/tabs/sending-section.jsx
+++ b/internal_packages/preferences/lib/tabs/sending-section.jsx
@@ -16,19 +16,19 @@ class SendingSection extends React.Component {
_getExtendedSchema(configSchema) {
const accounts = AccountStore.accounts();
- let values = accounts.map((acc) => {return acc.id});
- let labels = accounts.map((acc) => {return acc.me().toString()});
+ let values = accounts.map(acc => acc.id);
+ let labels = accounts.map(acc => acc.me().toString());
values = ['selected-mailbox'].concat(values);
labels = ['Account of selected mailbox'].concat(labels);
_.extend(configSchema.properties.sending.properties, {
defaultAccountIdForSend: {
- type: 'string',
- title: 'Send new messages from',
- default: 'selected-mailbox',
- enum: values,
- enumLabels: labels,
+ 'type': 'string',
+ 'title': 'Send new messages from',
+ 'default': 'selected-mailbox',
+ 'enum': values,
+ 'enumLabels': labels,
},
});
@@ -43,7 +43,8 @@ class SendingSection extends React.Component {
config={this.props.config}
configSchema={sendingSchema}
keyName="Sending"
- keyPath="core.sending" />
+ keyPath="core.sending"
+ />
);
}
diff --git a/internal_packages/preferences/lib/tabs/workspace-section.jsx b/internal_packages/preferences/lib/tabs/workspace-section.jsx
index 9a2902ed4..401e08501 100644
--- a/internal_packages/preferences/lib/tabs/workspace-section.jsx
+++ b/internal_packages/preferences/lib/tabs/workspace-section.jsx
@@ -111,49 +111,47 @@ class LaunchSystemStartItem extends React.Component {
}
-class WorkspaceSection extends React.Component {
+const WorkspaceSection = (props) => {
+ return (
+
+
- static displayName = 'WorkspaceSection';
+
- static propTypes = {
- config: React.PropTypes.object,
- configSchema: React.PropTypes.object,
- }
+
- render() {
- return (
-
-
+
-
+
-
+
-
-
-
-
-
-
-
- N1 launch on system start only works in XDG-compliant desktop environments.
-
-
- );
- }
+
+ N1 launch on system start only works in XDG-compliant desktop environments.
+
+
+ );
+}
+WorkspaceSection.propTypes = {
+ config: React.PropTypes.object,
+ configSchema: React.PropTypes.object,
}
export default WorkspaceSection;
diff --git a/internal_packages/theme-picker/lib/theme-picker.jsx b/internal_packages/theme-picker/lib/theme-picker.jsx
index 75b5d2d81..6c900b5ec 100644
--- a/internal_packages/theme-picker/lib/theme-picker.jsx
+++ b/internal_packages/theme-picker/lib/theme-picker.jsx
@@ -57,7 +57,8 @@ class ThemePicker extends React.Component {
key={theme.name}
theme={theme}
active={this.state.activeTheme === theme.name}
- onSelect={() => this._setActiveTheme(theme.name)} />
+ onSelect={() => this._setActiveTheme(theme.name)}
+ />
);
}
@@ -70,21 +71,24 @@ class ThemePicker extends React.Component {
style={{width: "14", WebkitFilter: "none"}}
name="picker-close.png"
mode={RetinaImg.Mode.ContentDark}
- onMouseDown={() => Actions.closeModal()} />
+ onMouseDown={() => Actions.closeModal()}
+ />
Themes
Click any theme to apply:
+ style={{alignItems: "flex-start", flexWrap: "wrap"}}
+ >
{this._renderThemeOptions()}
diff --git a/internal_packages/theme-picker/spec/theme-picker-spec.jsx b/internal_packages/theme-picker/spec/theme-picker-spec.jsx
index 8c729a87b..7ec27ac79 100644
--- a/internal_packages/theme-picker/spec/theme-picker-spec.jsx
+++ b/internal_packages/theme-picker/spec/theme-picker-spec.jsx
@@ -6,8 +6,8 @@ import ThemePackage from '../../../src/theme-package';
import ThemePicker from '../lib/theme-picker';
const {resourcePath} = NylasEnv.getLoadSettings();
-const light = new ThemePackage(resourcePath + '/internal_packages/ui-light');
-const dark = new ThemePackage(resourcePath + '/internal_packages/ui-dark');
+const light = new ThemePackage(`${resourcePath}/internal_packages/ui-light`);
+const dark = new ThemePackage(`${resourcePath}/internal_packages/ui-dark`);
describe('ThemePicker', function themePicker() {
beforeEach(() => {
diff --git a/internal_packages/thread-search-index/lib/search-index-store.es6 b/internal_packages/thread-search-index/lib/search-index-store.es6
index b505ce6b5..ae0552f85 100644
--- a/internal_packages/thread-search-index/lib/search-index-store.es6
+++ b/internal_packages/thread-search-index/lib/search-index-store.es6
@@ -29,7 +29,7 @@ class SearchIndexStore {
this.accountIds = _.pluck(AccountStore.accounts(), 'id')
this.initializeIndex()
.then(() => {
- console.log('Thread Search: Index built successfully in ' + ((Date.now() - date) / 1000) + 's')
+ console.log(`Thread Search: Index built successfully in ${((Date.now() - date) / 1000)}s`)
this.unsubscribers = [
AccountStore.listen(::this.onAccountsChanged),
DatabaseStore.listen(::this.onDataChanged),
@@ -50,7 +50,7 @@ class SearchIndexStore {
initializeIndex() {
return DatabaseStore.searchIndexSize(Thread)
.then((size) => {
- console.log('Thread Search: Current index size is ' + (size || 0) + ' threads')
+ console.log(`Thread Search: Current index size is ${(size || 0)} threads`)
if (!size || size >= MAX_INDEX_SIZE || size === 0) {
return this.clearIndex().thenReturn(this.accountIds)
}
@@ -85,7 +85,7 @@ class SearchIndexStore {
return;
}
const date = Date.now()
- console.log('Thread Search: Updating thread search index for accounts: ' + latestIds)
+ console.log(`Thread Search: Updating thread search index for accounts ${latestIds}`)
const newIds = _.difference(latestIds, this.accountIds)
const removedIds = _.difference(this.accountIds, latestIds)
@@ -102,7 +102,7 @@ class SearchIndexStore {
this.accountIds = latestIds
Promise.all(promises)
.then(() => {
- console.log('Thread Search: Index updated successfully in ' + ((Date.now() - date) / 1000) + 's')
+ console.log(`Thread Search: Index updated successfully in ${((Date.now() - date) / 1000)}s`)
})
})
})
@@ -212,9 +212,7 @@ class SearchIndexStore {
{body: QuotedHTMLTransformer.removeQuotedHTML(body)}
))
.map(({body, snippet}) => (
- snippet ?
- snippet :
- Utils.extractTextFromHtml(body, {maxLength: MESSAGE_BODY_LENGTH}).replace(/(\s)+/g, ' ')
+ snippet || Utils.extractTextFromHtml(body, {maxLength: MESSAGE_BODY_LENGTH}).replace(/(\s)+/g, ' ')
))
.join(' ')
)
diff --git a/internal_packages/thread-snooze/lib/snooze-popover.jsx b/internal_packages/thread-snooze/lib/snooze-popover.jsx
index b29ec0470..666a817ed 100644
--- a/internal_packages/thread-snooze/lib/snooze-popover.jsx
+++ b/internal_packages/thread-snooze/lib/snooze-popover.jsx
@@ -88,7 +88,7 @@ class SnoozePopover extends Component {
this.onSnooze(date, itemLabel)}
>
{
+ return TaskQueueStatusStore.waitForPerformRemote(task).then(() => {
return DatabaseStore.findBy(Category, {clientId: category.clientId})
.then((updatedCat) => {
if (updatedCat && updatedCat.isSavedRemotely()) {
diff --git a/internal_packages/thread-snooze/spec/snooze-store-spec.es6 b/internal_packages/thread-snooze/spec/snooze-store-spec.es6
index dba72788c..c56507e8a 100644
--- a/internal_packages/thread-snooze/spec/snooze-store-spec.es6
+++ b/internal_packages/thread-snooze/spec/snooze-store-spec.es6
@@ -17,12 +17,12 @@ describe('SnoozeStore', function snoozeStore() {
this.accounts = [{id: 123}, {id: 321}]
this.snoozeCatsByAccount = {
- '123': new Category({accountId: 123, displayName: this.name, serverId: 'sn-1'}),
- '321': new Category({accountId: 321, displayName: this.name, serverId: 'sn-2'}),
+ 123: new Category({accountId: 123, displayName: this.name, serverId: 'sn-1'}),
+ 321: new Category({accountId: 321, displayName: this.name, serverId: 'sn-2'}),
}
this.inboxCatsByAccount = {
- '123': new Category({accountId: 123, name: 'inbox', serverId: 'in-1'}),
- '321': new Category({accountId: 321, name: 'inbox', serverId: 'in-2'}),
+ 123: new Category({accountId: 123, name: 'inbox', serverId: 'in-1'}),
+ 321: new Category({accountId: 321, name: 'inbox', serverId: 'in-2'}),
}
this.threads = [
new Thread({accountId: 123, serverId: 's-1'}),
@@ -30,12 +30,12 @@ describe('SnoozeStore', function snoozeStore() {
new Thread({accountId: 321, serverId: 's-3'}),
]
this.updatedThreadsByAccountId = {
- '123': {
+ 123: {
threads: [this.threads[0], this.threads[1]],
snoozeCategoryId: 'sn-1',
returnCategoryId: 'in-1',
},
- '321': {
+ 321: {
threads: [this.threads[2]],
snoozeCategoryId: 'sn-2',
returnCategoryId: 'in-2',
diff --git a/spec/extensions/composer-extension-adapter-spec.es6 b/spec/extensions/composer-extension-adapter-spec.es6
deleted file mode 100644
index f1d45f4d6..000000000
--- a/spec/extensions/composer-extension-adapter-spec.es6
+++ /dev/null
@@ -1,141 +0,0 @@
-import * as adapter from '../../src/extensions/composer-extension-adapter';
-import {DOMUtils} from 'nylas-exports';
-
-const selection = 'selection';
-const node = 'node';
-const event = 'event';
-const extra = 'extra';
-const editor = {
- rootNode: node,
- currentSelection() {
- return selection;
- },
-};
-
-describe('ComposerExtensionAdapter', function composerExtensionAdapter() {
- describe('adaptOnInput', () => {
- it('adapts correctly if onContentChanged already defined', () => {
- const onInputSpy = jasmine.createSpy('onInput');
- const extension = {
- onContentChanged() {},
- onInput(ev, editableNode, sel) {
- onInputSpy(ev, editableNode, sel);
- },
- };
- adapter.adaptOnInput(extension);
- extension.onContentChanged({editor, mutations: []});
- expect(onInputSpy).not.toHaveBeenCalled();
- });
-
- it('adapts correctly when signature is (event, ...)', () => {
- const onInputSpy = jasmine.createSpy('onInput');
- const extension = {
- onInput(ev, editableNode, sel) {
- onInputSpy(ev, editableNode, sel);
- },
- };
- adapter.adaptOnInput(extension);
- expect(extension.onContentChanged).toBeDefined();
- extension.onContentChanged({editor, mutations: []});
- expect(onInputSpy).toHaveBeenCalledWith([], node, selection);
- });
-
- it('adapts correctly when signature is (editableNode, selection, ...)', () => {
- const onInputSpy = jasmine.createSpy('onInput');
- const extension = {
- onInput(editableNode, sel, ev) {
- onInputSpy(editableNode, sel, ev);
- },
- };
- adapter.adaptOnInput(extension);
- expect(extension.onContentChanged).toBeDefined();
- extension.onContentChanged({editor, mutations: []});
- expect(onInputSpy).toHaveBeenCalledWith(node, selection, []);
- });
- });
-
- describe('adaptOnTabDown', () => {
- it('adapts onTabDown correctly', () => {
- const onTabDownSpy = jasmine.createSpy('onTabDownSpy');
- const mockEvent = {key: 'Tab'};
- const range = 'range';
- spyOn(DOMUtils, 'getRangeInScope').andReturn(range);
- const extension = {
- onTabDown(editableNode, rn, ev) {
- onTabDownSpy(editableNode, rn, ev);
- },
- };
- adapter.adaptOnTabDown(extension, 'method');
- expect(extension.onKeyDown).toBeDefined();
- extension.onKeyDown({editor, event: mockEvent});
- expect(onTabDownSpy).toHaveBeenCalledWith(node, range, mockEvent);
- });
- });
-
- describe('adaptContenteditableMethod', () => {
- it('adapts correctly when signature is (editor, ...)', () => {
- const methodSpy = jasmine.createSpy('methodSpy');
- const extension = {
- method(e, ev, other) {
- methodSpy(e, ev, other);
- },
- };
- adapter.adaptContenteditableMethod(extension, 'method');
- extension.method({editor, event, extra});
- expect(methodSpy).toHaveBeenCalledWith(editor, event, extra);
- });
-
- it('adapts correctly when signature is (event, ...)', () => {
- const methodSpy = jasmine.createSpy('methodSpy');
- const extension = {
- method(ev, editableNode, sel, other) {
- methodSpy(ev, editableNode, sel, other);
- },
- };
- adapter.adaptContenteditableMethod(extension, 'method');
- extension.method({editor, event, extra});
- expect(methodSpy).toHaveBeenCalledWith(event, node, selection, extra);
- });
-
- it('adapts correctly when signature is (editableNode, selection, ...)', () => {
- const methodSpy = jasmine.createSpy('methodSpy');
- const extension = {
- method(editableNode, sel, ev, other) {
- methodSpy(editableNode, sel, ev, other);
- },
- };
- adapter.adaptContenteditableMethod(extension, 'method');
- extension.method({editor, event, extra});
- expect(methodSpy).toHaveBeenCalledWith(node, selection, event, extra);
- });
-
- it('adapts correctly when using mutations instead of an event', () => {
- const methodSpy = jasmine.createSpy('methodSpy');
- const extension = {
- method(e, mutations) {
- methodSpy(e, mutations);
- },
- };
- adapter.adaptContenteditableMethod(extension, 'method');
- extension.method({editor, mutations: []});
- expect(methodSpy).toHaveBeenCalledWith(editor, []);
- });
- });
-
- describe('adaptComposerMethod', () => {
- it('adapts correctly for other composer extension methods', () => {
- const methodSpy = jasmine.createSpy('methodSpy');
- const draft = 'draft';
- const extension = {
- warningsForSending(dr) {
- methodSpy(dr);
- return 'result';
- },
- };
- adapter.adaptComposerMethod(extension, 'warningsForSending');
- const res = extension.warningsForSending({draft});
- expect(res).toEqual('result');
- expect(methodSpy).toHaveBeenCalledWith(draft);
- });
- });
-});
diff --git a/src/flux/models/thread.es6 b/src/flux/models/thread.es6
index 1b61055f8..3bad1224a 100644
--- a/src/flux/models/thread.es6
+++ b/src/flux/models/thread.es6
@@ -40,31 +40,31 @@ import ModelWithMetadata from './model-with-metadata'
class Thread extends ModelWithMetadata {
static attributes = _.extend({}, ModelWithMetadata.attributes, {
- 'snippet': Attributes.String({
+ snippet: Attributes.String({
modelKey: 'snippet',
}),
- 'subject': Attributes.String({
+ subject: Attributes.String({
queryable: true,
modelKey: 'subject',
}),
- 'unread': Attributes.Boolean({
+ unread: Attributes.Boolean({
queryable: true,
modelKey: 'unread',
}),
- 'starred': Attributes.Boolean({
+ starred: Attributes.Boolean({
queryable: true,
modelKey: 'starred',
}),
- 'version': Attributes.Number({
+ version: Attributes.Number({
queryable: true,
modelKey: 'version',
}),
- 'categories': Attributes.Collection({
+ categories: Attributes.Collection({
queryable: true,
modelKey: 'categories',
joinOnField: 'id',
@@ -72,11 +72,11 @@ class Thread extends ModelWithMetadata {
itemClass: Category,
}),
- 'categoriesType': Attributes.String({
+ categoriesType: Attributes.String({
modelKey: 'categoriesType',
}),
- 'participants': Attributes.Collection({
+ participants: Attributes.Collection({
queryable: true,
modelKey: 'participants',
joinOnField: 'email',
@@ -84,23 +84,23 @@ class Thread extends ModelWithMetadata {
itemClass: Contact,
}),
- 'hasAttachments': Attributes.Boolean({
+ hasAttachments: Attributes.Boolean({
modelKey: 'has_attachments',
}),
- 'lastMessageReceivedTimestamp': Attributes.DateTime({
+ lastMessageReceivedTimestamp: Attributes.DateTime({
queryable: true,
modelKey: 'lastMessageReceivedTimestamp',
jsonKey: 'last_message_received_timestamp',
}),
- 'lastMessageSentTimestamp': Attributes.DateTime({
+ lastMessageSentTimestamp: Attributes.DateTime({
queryable: true,
modelKey: 'lastMessageSentTimestamp',
jsonKey: 'last_message_sent_timestamp',
}),
- 'inAllMail': Attributes.Boolean({
+ inAllMail: Attributes.Boolean({
queryable: true,
modelKey: 'inAllMail',
jsonKey: 'in_all_mail',
diff --git a/src/pro b/src/pro
index 797179d15..d2ba2ad62 160000
--- a/src/pro
+++ b/src/pro
@@ -1 +1 @@
-Subproject commit 797179d156bfeaba611e755b8c8abdc4615df0c8
+Subproject commit d2ba2ad629341375009b6270c3906c5933e1a255