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...`}
- + ); })} @@ -277,7 +284,7 @@ class PreferencesMailRules extends React.Component {
-
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()}
+ style={{color: "#3187e1"}} + > Create a Theme
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