From f2e7ea4c4c7aca6c30c974f599d1c6a04196c8f5 Mon Sep 17 00:00:00 2001 From: Juan Tejada Date: Thu, 13 Oct 2016 09:43:20 -0700 Subject: [PATCH] feat(reminders): Add send reminders functionality Summary: Add reminders plugin which lets you set reminder if you don't get a reply for a message within a specified time in the future Test Plan: TODO Reviewers: halla, bengotow, evan Reviewed By: halla, bengotow, evan Differential Revision: https://phab.nylas.com/D3356 --- .gitignore | 1 + .../lib/sidebar-section.coffee | 30 ++++- .../lib/markdown-editor.cjsx | 1 + .../draft-list/lib/draft-list-store.coffee | 2 +- .../message-list/lib/message-list.cjsx | 1 + .../thread-list/lib/thread-list-columns.cjsx | 49 +++++--- .../lib/thread-list-data-source.coffee | 10 +- .../thread-list/lib/thread-list-icon.cjsx | 17 ++- .../lib/thread-list-participants.cjsx | 13 ++- .../thread-list/lib/thread-list.cjsx | 13 ++- .../spec/thread-list-participants-spec.cjsx | 8 +- .../lib/search-mailbox-perspective.es6 | 1 - .../thread-snooze/lib/snooze-buttons.jsx | 26 ++--- .../thread-snooze/lib/snooze-popover.jsx | 2 +- .../stylesheets/snooze-popover.less | 2 +- spec/components/date-input-spec.jsx | 8 +- spec/components/date-picker-popover-spec.jsx | 81 +++++++++++++ src/components/date-input.jsx | 52 ++++++--- src/components/date-picker-popover.jsx | 110 ++++++++++++++++++ .../decorators/listens-to-observable.jsx | 10 +- src/components/mail-label-set.jsx | 5 +- src/components/menu.cjsx | 34 ++++-- src/date-utils.es6 | 14 +++ src/extension-registry.es6 | 4 + src/extensions/account-sidebar-extension.es6 | 17 +++ src/extensions/thread-list-extension.es6 | 10 ++ src/flux/models/message.es6 | 8 ++ src/flux/stores/message-store.coffee | 7 +- src/global/nylas-component-kit.coffee | 10 ++ src/pro | 2 +- static/components/date-input.less | 2 + static/components/date-picker-popover.less | 17 +++ static/components/fixed-popover.less | 9 ++ .../composer/icon-composer-reminders@1x.png | Bin 0 -> 15808 bytes .../composer/icon-composer-reminders@2x.png | Bin 0 -> 15174 bytes .../ic-emptystate-reminders@1x.png | Bin 0 -> 16420 bytes .../ic-emptystate-reminders@2x.png | Bin 0 -> 18925 bytes static/images/source-list/reminders@1x.png | Bin 0 -> 15985 bytes static/images/source-list/reminders@2x.png | Bin 0 -> 1305 bytes .../thread-list/ic-timestamp-reminder@2x.png | Bin 0 -> 14998 bytes .../thread-list/ic-timestamp-snooze@2x.png | Bin 0 -> 14960 bytes .../images/thread-list/icon-reminder@1x.png | Bin 0 -> 15733 bytes .../images/thread-list/icon-reminder@2x.png | Bin 0 -> 14997 bytes .../images/thread-list/in-label-bell@1x.png | Bin 0 -> 250537 bytes .../images/thread-list/in-label-bell@2x.png | Bin 0 -> 14777 bytes .../toolbar/ic-toolbar-native-reminder@1x.png | Bin 0 -> 14820 bytes .../toolbar/ic-toolbar-native-reminder@2x.png | Bin 0 -> 15113 bytes static/index.less | 1 + 48 files changed, 478 insertions(+), 99 deletions(-) create mode 100644 spec/components/date-picker-popover-spec.jsx create mode 100644 src/components/date-picker-popover.jsx create mode 100644 src/extensions/account-sidebar-extension.es6 create mode 100644 src/extensions/thread-list-extension.es6 create mode 100644 static/components/date-picker-popover.less create mode 100644 static/images/composer/icon-composer-reminders@1x.png create mode 100644 static/images/composer/icon-composer-reminders@2x.png create mode 100644 static/images/empty-state/ic-emptystate-reminders@1x.png create mode 100644 static/images/empty-state/ic-emptystate-reminders@2x.png create mode 100644 static/images/source-list/reminders@1x.png create mode 100644 static/images/source-list/reminders@2x.png create mode 100644 static/images/thread-list/ic-timestamp-reminder@2x.png create mode 100644 static/images/thread-list/ic-timestamp-snooze@2x.png create mode 100644 static/images/thread-list/icon-reminder@1x.png create mode 100644 static/images/thread-list/icon-reminder@2x.png create mode 100644 static/images/thread-list/in-label-bell@1x.png create mode 100644 static/images/thread-list/in-label-bell@2x.png create mode 100644 static/images/toolbar/ic-toolbar-native-reminder@1x.png create mode 100644 static/images/toolbar/ic-toolbar-native-reminder@2x.png diff --git a/.gitignore b/.gitignore index 45ca173b1..f9b54ef15 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,5 @@ internal_packages/composer-scheduler internal_packages/link-tracking internal_packages/open-tracking internal_packages/send-later +internal_packages/send-reminders internal_packages/thread-sharing diff --git a/internal_packages/account-sidebar/lib/sidebar-section.coffee b/internal_packages/account-sidebar/lib/sidebar-section.coffee index 4a3884071..ceff3e96b 100644 --- a/internal_packages/account-sidebar/lib/sidebar-section.coffee +++ b/internal_packages/account-sidebar/lib/sidebar-section.coffee @@ -4,6 +4,7 @@ _ = require 'underscore' DestroyCategoryTask, CategoryStore, Category, + ExtensionRegistry, RegExpUtils} = require 'nylas-exports' SidebarItem = require './sidebar-item' SidebarActions = require './sidebar-actions' @@ -42,8 +43,15 @@ class SidebarSection draftsItem = SidebarItem.forDrafts([account.id]) snoozedItem = SidebarItem.forSnoozed([account.id]) + extensionItems = ExtensionRegistry.AccountSidebar.extensions() + .filter((ext) => ext.sidebarItem?) + .map((ext) => ext.sidebarItem([account.id])) + .map(({id, name, iconName, perspective}) => + SidebarItem.forPerspective(id, perspective, {name, iconName}) + ) + # Order correctly: Inbox, Unread, Starred, rest... , Drafts - items.splice(1, 0, unreadItem, starredItem, snoozedItem) + items.splice(1, 0, unreadItem, starredItem, snoozedItem, extensionItems...) items.push(draftsItem) return { @@ -96,8 +104,26 @@ class SidebarSection children: accounts.map (acc) -> SidebarItem.forSnoozed([acc.id], name: acc.label) ) + extensionItems = ExtensionRegistry.AccountSidebar.extensions() + .filter((ext) => ext.sidebarItem?) + .map((ext) => + {id, name, iconName, perspective} = ext.sidebarItem(accountIds) + return SidebarItem.forPerspective(id, perspective, { + name, + iconName, + children: accounts.map((acc) => + subItem = ext.sidebarItem([acc.id]) + return SidebarItem.forPerspective( + subItem.id + "-#{acc.id}", + subItem.perspective, + {name: acc.label, iconName: subItem.iconName} + ) + ) + }) + ) + # Order correctly: Inbox, Unread, Starred, rest... , Drafts - items.splice(1, 0, unreadItem, starredItem, snoozedItem) + items.splice(1, 0, unreadItem, starredItem, snoozedItem, extensionItems...) items.push(draftsItem) return { diff --git a/internal_packages/composer-markdown/lib/markdown-editor.cjsx b/internal_packages/composer-markdown/lib/markdown-editor.cjsx index cd9237510..daae60aee 100644 --- a/internal_packages/composer-markdown/lib/markdown-editor.cjsx +++ b/internal_packages/composer-markdown/lib/markdown-editor.cjsx @@ -111,6 +111,7 @@ class MarkdownEditor extends React.Component {".btn-templates { display:none; }"} {".btn-scheduler { display:none; }"} {".btn-translate { display:none; }"} + {".btn-send-reminder { display:none; }"}
diff --git a/internal_packages/message-list/lib/message-list.cjsx b/internal_packages/message-list/lib/message-list.cjsx index 91ecf2c35..d5692a1ea 100644 --- a/internal_packages/message-list/lib/message-list.cjsx +++ b/internal_packages/message-list/lib/message-list.cjsx @@ -195,6 +195,7 @@ class MessageList extends React.Component {subject} diff --git a/internal_packages/thread-list/lib/thread-list-columns.cjsx b/internal_packages/thread-list/lib/thread-list-columns.cjsx index 914ffe239..fda7a11fa 100644 --- a/internal_packages/thread-list/lib/thread-list-columns.cjsx +++ b/internal_packages/thread-list/lib/thread-list-columns.cjsx @@ -7,6 +7,7 @@ moment = require 'moment' RetinaImg, MailLabelSet, MailImportantIcon, + InjectedComponent, InjectedComponentSet} = require 'nylas-component-kit' {Thread, FocusedPerspectiveStore, Utils, DateUtils} = require 'nylas-exports' @@ -19,13 +20,13 @@ ThreadListStore = require './thread-list-store' ThreadListIcon = require './thread-list-icon' # Get and format either last sent or last received timestamp depending on thread-list being viewed -TimestampComponentForPerspective = (thread) -> +ThreadListTimestamp = ({thread}) -> if FocusedPerspectiveStore.current().isSent() rawTimestamp = thread.lastMessageSentTimestamp else rawTimestamp = thread.lastMessageReceivedTimestamp timestamp = DateUtils.shortTimeString(rawTimestamp) - {timestamp} + return {timestamp} subject = (subj) -> if (subj ? "").trim().length is 0 @@ -42,6 +43,13 @@ subject = (subj) -> else return subj +getSnippet = (thread) -> + messages = thread.__messages || [] + if (messages.length is 0) + return thread.snippet + + return messages[messages.length - 1].snippet + c1 = new ListTabular.Column name: "★" @@ -51,21 +59,23 @@ c1 = new ListTabular.Column + showIfAvailableForAnyAccount={true} + /> + exposedProps={thread: thread} + /> ] c2 = new ListTabular.Column name: "Participants" width: 200 resolver: (thread) => - hasDraft = _.find (thread.metadata ? []), (m) -> m.draft + hasDraft = (thread.__messages || []).find((m) => m.draft) if hasDraft
@@ -81,23 +91,23 @@ c3 = new ListTabular.Column flex: 4 resolver: (thread) => attachment = false - metadata = (thread.metadata ? []) + messages = (thread.__messages || []) - hasAttachments = thread.hasAttachments and metadata.find (m) -> Utils.showIconForAttachments(m.files) + hasAttachments = thread.hasAttachments and messages.find (m) -> Utils.showIconForAttachments(m.files) if hasAttachments attachment =
{subject(thread.subject)} - {thread.snippet} + {getSnippet(thread)} {attachment} c4 = new ListTabular.Column name: "Date" resolver: (thread) => - TimestampComponentForPerspective(thread) + return c5 = new ListTabular.Column name: "HoverActions" @@ -114,7 +124,8 @@ c5 = new ListTabular.Column ]} matching={role: "ThreadListQuickAction"} className="thread-injected-quick-actions" - exposedProps={thread: thread}/> + exposedProps={thread: thread} + />
cNarrow = new ListTabular.Column @@ -123,13 +134,13 @@ cNarrow = new ListTabular.Column resolver: (thread) => pencil = false attachment = false - metadata = (thread.metadata ? []) + messages = (thread.__messages || []) - hasAttachments = thread.hasAttachments and metadata.find (m) -> Utils.showIconForAttachments(m.files) + hasAttachments = thread.hasAttachments and messages.find (m) -> Utils.showIconForAttachments(m.files) if hasAttachments attachment =
- hasDraft = _.find metadata, (m) -> m.draft + hasDraft = messages.find((m) => m.draft) if hasDraft pencil = @@ -159,11 +170,19 @@ cNarrow = new ListTabular.Column {pencil} {attachment} - {TimestampComponentForPerspective(thread)} +
{subject(thread.subject)}
-
{thread.snippet} 
+
{getSnippet(thread)} 
diff --git a/internal_packages/thread-list/lib/thread-list-data-source.coffee b/internal_packages/thread-list/lib/thread-list-data-source.coffee index 19f994481..77eb61141 100644 --- a/internal_packages/thread-list/lib/thread-list-data-source.coffee +++ b/internal_packages/thread-list/lib/thread-list-data-source.coffee @@ -9,7 +9,7 @@ Rx = require 'rx-lite' _flatMapJoiningMessages = ($threadsResultSet) => # DatabaseView leverages `QuerySubscription` for threads /and/ for the - # messages on each thread, which are passed to out as `thread.metadata`. + # messages on each thread, which are passed to out as `thread.__messages`. $messagesResultSets = {} @@ -52,13 +52,13 @@ _flatMapJoiningMessages = ($threadsResultSet) => Rx.Observable.combineLatest(sets) .flatMapLatest ([threadsResultSet, messagesResultSets...]) => - threadsWithMetadata = {} + threadsWithMessages = {} threadsResultSet.models().map (thread, idx) -> thread = new thread.constructor(thread) - thread.metadata = messagesResultSets[idx]?.models() - threadsWithMetadata[thread.id] = thread + thread.__messages = messagesResultSets[idx]?.models().filter((m) => !m.isHidden()) + threadsWithMessages[thread.id] = thread - Rx.Observable.from([QueryResultSet.setByApplyingModels(threadsResultSet, threadsWithMetadata)]) + Rx.Observable.from([QueryResultSet.setByApplyingModels(threadsResultSet, threadsWithMessages)]) _observableForThreadMessages = (id, initialModels) -> subscription = new QuerySubscription(DatabaseStore.findAll(Message, threadId: id), { diff --git a/internal_packages/thread-list/lib/thread-list-icon.cjsx b/internal_packages/thread-list/lib/thread-list-icon.cjsx index 268ae2cea..b22d4b913 100644 --- a/internal_packages/thread-list/lib/thread-list-icon.cjsx +++ b/internal_packages/thread-list/lib/thread-list-icon.cjsx @@ -4,6 +4,7 @@ React = require 'react' Actions, Thread, ChangeStarredTask, + ExtensionRegistry, AccountStore} = require 'nylas-exports' class ThreadListIcon extends React.Component @@ -11,10 +12,20 @@ class ThreadListIcon extends React.Component @propTypes: thread: React.PropTypes.object - _iconType: => + _extensionsIconClassNames: => + return ExtensionRegistry.ThreadList.extensions() + .filter((ext) => ext.cssClassNamesForThreadListIcon?) + .reduce(((prev, ext) => prev + ' ' + ext.cssClassNamesForThreadListIcon(@props.thread)), '') + .trim() + + _iconClassNames: => if !@props.thread return 'thread-icon-star-on-hover' + extensionIconClassNames = @_extensionsIconClassNames() + if extensionIconClassNames.length > 0 + return extensionIconClassNames + if @props.thread.starred return 'thread-icon-star' @@ -33,7 +44,7 @@ class ThreadListIcon extends React.Component return 'thread-icon-none thread-icon-star-on-hover' _nonDraftMessages: => - msgs = @props.thread.metadata + msgs = @props.thread.__messages return [] unless msgs and msgs instanceof Array msgs = _.filter msgs, (m) -> m.serverId and not m.draft return msgs @@ -43,7 +54,7 @@ class ThreadListIcon extends React.Component true render: => -
diff --git a/internal_packages/thread-list/lib/thread-list-participants.cjsx b/internal_packages/thread-list/lib/thread-list-participants.cjsx index ac6713e8a..425286d92 100644 --- a/internal_packages/thread-list/lib/thread-list-participants.cjsx +++ b/internal_packages/thread-list/lib/thread-list-participants.cjsx @@ -53,15 +53,16 @@ class ThreadListParticipants extends React.Component short += ", " accumulate(short, unread) - if @props.thread.metadata and @props.thread.metadata.length > 1 - accumulate(" (#{@props.thread.metadata.length})") + messages = (@props.thread.__messages ? []) + if messages.length > 1 + accumulate(" (#{messages.length})") flush() return spans - getTokensFromMetadata: => - messages = @props.thread.metadata + getTokensFromMessages: => + messages = @props.thread.__messages tokens = [] field = 'from' @@ -94,8 +95,8 @@ class ThreadListParticipants extends React.Component contacts.map (contact) -> { contact: contact, unread: false } getTokens: => - if @props.thread.metadata instanceof Array - list = @getTokensFromMetadata() + if @props.thread.__messages instanceof Array + list = @getTokensFromMessages() else list = @getTokensFromParticipants() diff --git a/internal_packages/thread-list/lib/thread-list.cjsx b/internal_packages/thread-list/lib/thread-list.cjsx index 058b6f59f..cdd4bff83 100644 --- a/internal_packages/thread-list/lib/thread-list.cjsx +++ b/internal_packages/thread-list/lib/thread-list.cjsx @@ -1,7 +1,7 @@ _ = require 'underscore' React = require 'react' ReactDOM = require 'react-dom' -classNames = require 'classnames' +classnames = require 'classnames' {MultiselectList, FocusContainer, @@ -18,6 +18,7 @@ classNames = require 'classnames' WorkspaceStore, AccountStore, CategoryStore, + ExtensionRegistry, FocusedContentStore, FocusedPerspectiveStore} = require 'nylas-exports' @@ -109,9 +110,15 @@ class ThreadList extends React.Component _threadPropsProvider: (item) -> + classes = classnames({ + 'unread': item.unread + }) + classes += ExtensionRegistry.ThreadList.extensions() + .filter((ext) => ext.cssClassNamesForThreadListItem?) + .reduce(((prev, ext) => prev + ' ' + ext.cssClassNamesForThreadListItem(item)), ' ') + props = - className: classNames - 'unread': item.unread + className: classes props.shouldEnableSwipe = => perspective = FocusedPerspectiveStore.current() diff --git a/internal_packages/thread-list/spec/thread-list-participants-spec.cjsx b/internal_packages/thread-list/spec/thread-list-participants-spec.cjsx index 454f21398..bec3690b6 100644 --- a/internal_packages/thread-list/spec/thread-list-participants-spec.cjsx +++ b/internal_packages/thread-list/spec/thread-list-participants-spec.cjsx @@ -20,7 +20,7 @@ describe "ThreadListParticipants", -> ben = new Contact(email: 'ben@nylas.com', name: 'ben') ben.unread = true thread = new Thread() - thread.metadata = [new Message(from: [ben], unread:true)] + thread.__messages = [new Message(from: [ben], unread:true)] @participants = ReactTestUtils.renderIntoDocument( @@ -171,7 +171,7 @@ describe "ThreadListParticipants", -> for scenario in scenarios thread = new Thread() - thread.metadata = scenario.in + thread.__messages = scenario.in participants = ReactTestUtils.renderIntoDocument( ) @@ -191,9 +191,9 @@ describe "ThreadListParticipants", -> @michael = new Contact(email: 'michael@nylas.com', name: 'michael') @kavya = new Contact(email: 'kavya@nylas.com', name: 'kavya') - getTokens = (threadMetadata) -> + getTokens = (threadMessages) -> thread = new Thread() - thread.metadata = threadMetadata + thread.__messages = threadMessages participants = ReactTestUtils.renderIntoDocument( ) diff --git a/internal_packages/thread-search/lib/search-mailbox-perspective.es6 b/internal_packages/thread-search/lib/search-mailbox-perspective.es6 index 9ac6e56e4..0de3b40e1 100644 --- a/internal_packages/thread-search/lib/search-mailbox-perspective.es6 +++ b/internal_packages/thread-search/lib/search-mailbox-perspective.es6 @@ -13,7 +13,6 @@ class SearchMailboxPerspective extends MailboxPerspective { if (!_.isString(this.searchQuery)) { throw new Error("SearchMailboxPerspective: Expected a `string` search query") } - return this } emptyMessage() { diff --git a/internal_packages/thread-snooze/lib/snooze-buttons.jsx b/internal_packages/thread-snooze/lib/snooze-buttons.jsx index d9b0fab44..b8bf85fee 100644 --- a/internal_packages/thread-snooze/lib/snooze-buttons.jsx +++ b/internal_packages/thread-snooze/lib/snooze-buttons.jsx @@ -11,35 +11,30 @@ class SnoozeButton extends Component { className: PropTypes.string, threads: PropTypes.array, direction: PropTypes.string, - renderImage: PropTypes.bool, + shouldRenderIconImg: PropTypes.bool, getBoundingClientRect: PropTypes.func, }; static defaultProps = { className: 'btn btn-toolbar', direction: 'down', - renderImage: true, + shouldRenderIconImg: true, + getBoundingClientRect: (inst) => ReactDOM.findDOMNode(inst).getBoundingClientRect(), }; onClick = (event) => { event.stopPropagation() - const buttonRect = this.getBoundingClientRect() + const {threads, direction, getBoundingClientRect} = this.props + const buttonRect = getBoundingClientRect(this) Actions.openPopover( , - {originRect: buttonRect, direction: this.props.direction} + {originRect: buttonRect, direction: direction} ) }; - getBoundingClientRect = () => { - if (this.props.getBoundingClientRect) { - return this.props.getBoundingClientRect() - } - return ReactDOM.findDOMNode(this).getBoundingClientRect() - }; - render() { if (!FocusedPerspectiveStore.current().isInbox()) { return ; @@ -51,11 +46,12 @@ class SnoozeButton extends Component { className={`snooze-button ${this.props.className}`} onClick={this.onClick} > - {this.props.renderImage ? + {this.props.shouldRenderIconImg ? : null + /> : + null } ); @@ -89,9 +85,9 @@ export class QuickActionSnooze extends Component { return ( ); diff --git a/internal_packages/thread-snooze/lib/snooze-popover.jsx b/internal_packages/thread-snooze/lib/snooze-popover.jsx index 666a817ed..79cf25fa0 100644 --- a/internal_packages/thread-snooze/lib/snooze-popover.jsx +++ b/internal_packages/thread-snooze/lib/snooze-popover.jsx @@ -117,7 +117,7 @@ class SnoozePopover extends Component { ); diff --git a/internal_packages/thread-snooze/stylesheets/snooze-popover.less b/internal_packages/thread-snooze/stylesheets/snooze-popover.less index 4f1f810ba..633e9f5f4 100644 --- a/internal_packages/thread-snooze/stylesheets/snooze-popover.less +++ b/internal_packages/thread-snooze/stylesheets/snooze-popover.less @@ -7,7 +7,7 @@ } .snooze-button { - order: -104; + order: -103; } .snooze-popover { diff --git a/spec/components/date-input-spec.jsx b/spec/components/date-input-spec.jsx index c42b1ba83..952aa0249 100644 --- a/spec/components/date-input-spec.jsx +++ b/spec/components/date-input-spec.jsx @@ -22,8 +22,8 @@ const makeInput = (props = {}) => { describe('DateInput', function dateInput() { describe('onInputKeyDown', () => { it('should submit the input if Enter or Escape pressed', () => { - const onSubmitDate = jasmine.createSpy('onSubmitDate') - const component = makeInput({onSubmitDate: onSubmitDate}) + const onDateSubmitted = jasmine.createSpy('onDateSubmitted') + const component = makeInput({onDateSubmitted: onDateSubmitted}) const inputNode = ReactDOM.findDOMNode(component).querySelector('input') const stopPropagation = jasmine.createSpy('stopPropagation') const keys = ['Enter', 'Return'] @@ -34,10 +34,10 @@ describe('DateInput', function dateInput() { keys.forEach((key) => { Simulate.keyDown(inputNode, {key, stopPropagation}) expect(stopPropagation).toHaveBeenCalled() - expect(onSubmitDate).toHaveBeenCalledWith('someday', 'tomorrow') + expect(onDateSubmitted).toHaveBeenCalledWith('someday', 'tomorrow') expect(component.setState).toHaveBeenCalledWith({inputDate: null}) stopPropagation.reset() - onSubmitDate.reset() + onDateSubmitted.reset() component.setState.reset() }) }); diff --git a/spec/components/date-picker-popover-spec.jsx b/spec/components/date-picker-popover-spec.jsx new file mode 100644 index 000000000..e8ffadc86 --- /dev/null +++ b/spec/components/date-picker-popover-spec.jsx @@ -0,0 +1,81 @@ +import React from 'react'; +import {mount} from 'enzyme' +import {DateUtils} from 'nylas-exports' +import {DatePickerPopover} from 'nylas-component-kit' + + +const makePopover = (props = {}) => { + return mount( + my header} + onSelectDate={() => {}} + {...props} + /> + ); +}; + +describe('DatePickerPopover', function sendLaterPopover() { + beforeEach(() => { + spyOn(DateUtils, 'format').andReturn('formatted') + }); + + describe('selectDate', () => { + it('calls props.onSelectDate', () => { + const onSelectDate = jasmine.createSpy('onSelectDate') + const popover = makePopover({onSelectDate}) + popover.instance().selectDate({utc: () => 'utc'}, 'Custom') + + expect(onSelectDate).toHaveBeenCalledWith('formatted', 'Custom') + }); + }); + + describe('onSelectMenuOption', () => { + + }); + + describe('onSelectCustomOption', () => { + it('selects date', () => { + const popover = makePopover() + const instance = popover.instance() + spyOn(instance, 'selectDate') + instance.onSelectCustomOption('date', 'abc') + expect(instance.selectDate).toHaveBeenCalledWith('date', 'Custom') + }); + + it('throws error if date is invalid', () => { + spyOn(NylasEnv, 'showErrorDialog') + const popover = makePopover() + popover.instance().onSelectCustomOption(null, 'abc') + expect(NylasEnv.showErrorDialog).toHaveBeenCalled() + }); + }); + + describe('render', () => { + it('renders the provided dateOptions', () => { + const popover = makePopover({ + dateOptions: { + 'label 1-': () => {}, + 'label 2-': () => {}, + }, + }) + const items = popover.find('.item') + expect(items.at(0).text()).toEqual('label 1-formatted') + expect(items.at(1).text()).toEqual('label 2-formatted') + }); + + it('renders header components', () => { + const popover = makePopover() + expect(popover.find('.header').text()).toEqual('my header') + }) + + it('renders footer components', () => { + const popover = makePopover({ + footer: footer, + }) + expect(popover.find('.footer').text()).toEqual('footer') + expect(popover.find('.date-input-section').isEmpty()).toBe(false) + }); + }); +}); + diff --git a/src/components/date-input.jsx b/src/components/date-input.jsx index 111392673..deb176a4e 100644 --- a/src/components/date-input.jsx +++ b/src/components/date-input.jsx @@ -10,23 +10,30 @@ class DateInput extends Component { static propTypes = { className: PropTypes.string, dateFormat: PropTypes.string.isRequired, - onSubmitDate: PropTypes.func, + onDateInterpreted: PropTypes.func, + onDateSubmitted: PropTypes.func, }; static defaultProps = { - onSubmitDate: () => {}, + onDateInterpreted: () => {}, + onDateSubmitted: () => {}, }; constructor(props) { super(props) - this.unmounted = false + this._mounted = false this.state = { inputDate: null, + inputValue: '', } } + componentDidMount() { + this._mounted = true + } + componentWillUnmount() { - this.unmounted = true + this._mounted = false } onInputKeyDown = (event) => { @@ -35,39 +42,46 @@ class DateInput extends Component { // This prevents onInputChange from being fired event.stopPropagation(); const date = DateUtils.futureDateFromString(value); - this.props.onSubmitDate(date, value); - - // this.props.onSubmitDate may have unmounted this component - if (!this.unmounted) { - this.setState({inputDate: null}) - } + this.props.onDateSubmitted(date, value); } }; onInputChange = (event) => { - this.setState({inputDate: DateUtils.futureDateFromString(event.target.value)}); + const {target: {value}} = event + const nextDate = DateUtils.futureDateFromString(value) + if (nextDate) { + this.props.onDateInterpreted(nextDate.clone(), value) + } + this.setState({inputDate: nextDate, inputValue: value}); }; + clearInput() { + setImmediate(() => { + if (!this._mounted) { return } + this.setState({inputValue: '', inputDate: null}) + }) + } + render() { - let dateInterpretation; - if (this.state.inputDate) { - dateInterpretation = ( - - {DateUtils.format(this.state.inputDate, this.props.dateFormat)} - - ); - } const {className} = this.props + const {inputDate, inputValue} = this.state const classes = classnames({ "nylas-date-input": true, [className]: className != null, }) + const dateInterpretation = inputDate ? + + {DateUtils.format(this.state.inputDate, this.props.dateFormat)} + : + ; + return (
{ + const {dateOptions} = this.props + const date = dateOptions[optionKey](); + this.refs.dateInput.clearInput() + this.selectDate(date, optionKey); + }; + + onCustomDateInterpreted = (date) => { + const {shouldSelectDateWhenInterpreted} = this.props + if (date && shouldSelectDateWhenInterpreted) { + this.refs.menu.clearSelection() + this.selectDate(date, "Custom"); + } + } + + onCustomDateSelected = (date, inputValue) => { + if (date) { + this.refs.menu.clearSelection() + this.selectDate(date, "Custom"); + } else { + NylasEnv.showErrorDialog(`Sorry, we can't interpret ${inputValue} as a valid date.`); + } + }; + + selectDate = (date, dateLabel) => { + const formatted = DateUtils.format(date.utc()); + this.props.onSelectDate(formatted, dateLabel); + }; + + renderMenuOption = (optionKey) => { + const {dateOptions} = this.props + const date = dateOptions[optionKey](); + const formatted = DateUtils.format(date, DATE_FORMAT_SHORT); + return ( +
+ {optionKey} + {formatted} +
+ ); + } + + render() { + const {className, header, footer, dateOptions} = this.props + + let footerComponents = [ +
, + , + ] + if (footer) { + if (Array.isArray(footer)) { + footerComponents = footerComponents.concat(footer) + } else { + footerComponents = footerComponents.concat([footer]) + } + } + + return ( +
+ item} + itemContent={this.renderMenuOption} + defaultSelectedIndex={-1} + headerComponents={header} + footerComponents={footerComponents} + onEscape={this.onEscape} + onSelect={this.onSelectMenuOption} + /> +
+ ); + } +} + +export default DatePickerPopover diff --git a/src/components/decorators/listens-to-observable.jsx b/src/components/decorators/listens-to-observable.jsx index be2c173fd..1a8b20c7c 100644 --- a/src/components/decorators/listens-to-observable.jsx +++ b/src/components/decorators/listens-to-observable.jsx @@ -6,10 +6,10 @@ function ListensToObservable(ComposedComponent, {getObservable, getStateFromObse static containerRequired = ComposedComponent.containerRequired; - constructor() { - super() - this.state = getStateFromObservable() - this.observable = getObservable() + constructor(props) { + super(props) + this.state = getStateFromObservable(null, {props}) + this.observable = getObservable(props) } componentDidMount() { @@ -24,7 +24,7 @@ function ListensToObservable(ComposedComponent, {getObservable, getStateFromObse onObservableChanged = (data) => { if (this.unmounted) return; - this.setState(getStateFromObservable(data)) + this.setState(getStateFromObservable(data, {props: this.props})) }; render() { diff --git a/src/components/mail-label-set.jsx b/src/components/mail-label-set.jsx index 5b40b4395..830b7d26e 100644 --- a/src/components/mail-label-set.jsx +++ b/src/components/mail-label-set.jsx @@ -15,6 +15,7 @@ export default class MailLabelSet extends React.Component { static propTypes = { thread: React.PropTypes.object.isRequired, + messages: React.PropTypes.array, includeCurrentCategories: React.PropTypes.bool, removable: React.PropTypes.bool, }; @@ -28,7 +29,7 @@ export default class MailLabelSet extends React.Component { } render() { - const {thread, includeCurrentCategories} = this.props; + const {thread, messages, includeCurrentCategories} = this.props; const labels = []; if (AccountStore.accountForId(thread.accountId).usesLabels()) { @@ -73,7 +74,7 @@ export default class MailLabelSet extends React.Component { containersRequired={false} matching={{role: "Thread:MailLabel"}} className="thread-injected-mail-labels" - exposedProps={{thread: thread}} + exposedProps={{thread, messages}} > {labels} diff --git a/src/components/menu.cjsx b/src/components/menu.cjsx index 4a00edfff..59bcfe897 100644 --- a/src/components/menu.cjsx +++ b/src/components/menu.cjsx @@ -12,17 +12,20 @@ MenuItem's props allow you to display dividers as well as standard items. Section: Component Kit ### class MenuItem extends React.Component + @displayName = 'MenuItem' ### Public: React `props` supported by MenuItem: + - `index`: {Number} of the index of the current menu item - `divider` (optional) Pass a {Boolean} to render the menu item as a section divider. - `key` (optional) Pass a {String} to be the React key to optimize rendering lists of items. - `selected` (optional) Pass a {Boolean} to specify whether the item is selected. - `checked` (optional) Pass a {Boolean} to specify whether the item is checked. ### @propTypes: + index: React.PropTypes.number.isRequired divider: React.PropTypes.oneOfType([React.PropTypes.string, React.PropTypes.bool]) selected: React.PropTypes.bool checked: React.PropTypes.bool @@ -140,8 +143,8 @@ class Menu extends React.Component ### @propTypes: className: React.PropTypes.string, - footerComponents: React.PropTypes.arrayOf(React.PropTypes.element), - headerComponents: React.PropTypes.arrayOf(React.PropTypes.element), + footerComponents: React.PropTypes.node, + headerComponents: React.PropTypes.node, itemContext: React.PropTypes.object, itemContent: React.PropTypes.func.isRequired, itemKey: React.PropTypes.func.isRequired, @@ -159,6 +162,7 @@ class Menu extends React.Component onEscape: -> constructor: (@props) -> + @_mounted = false @state = selectedIndex: @props.defaultSelectedIndex ? 0 @@ -167,6 +171,18 @@ class Menu extends React.Component getSelectedItem: => @props.items[@state.selectedIndex] + # TODO this is a hack, refactor + clearSelection: => + setImmediate(=> + return if @_mounted is false + @setState({selectedIndex: -1}) + ) + + componentDidMount: => + @_mounted = true + + componentWillUnmount: => + @_mounted = false componentWillReceiveProps: (newProps) => # Attempt to preserve selection across props.items changes by @@ -194,12 +210,11 @@ class Menu extends React.Component container.scrollTop += adjustment render: => - hc = @props.headerComponents ? [] - if hc.length is 0 then hc = - fc = @props.footerComponents ? [] - if fc.length is 0 then fc = + hc = @props.headerComponents ? + fc = @props.footerComponents ? + className = if @props.className then @props.className else ''
{hc} @@ -236,7 +251,9 @@ class Menu extends React.Component onMouseDown = (event) => event.preventDefault() - @props.onSelect(item) if @props.onSelect + @setState({selectedIndex: i}, => + @props.onSelect(item) if @props.onSelect + ) key = @props.itemKey(item) if not key @@ -246,6 +263,7 @@ class Menu extends React.Component seenItemKeys[key] = item .*<\/signature>)|(?:<.+?>)|\s/gmi; return this.body.replace(re, "").length === 0; } + + isHidden() { + return ( + this.to.length === 1 && this.from.length === 1 && + this.to[0].email === this.from[0].email && + (this.snippet || "").startsWith('Nylas N1 Reminder:') + ) + } } diff --git a/src/flux/stores/message-store.coffee b/src/flux/stores/message-store.coffee index 05330a3f2..a71634042 100644 --- a/src/flux/stores/message-store.coffee +++ b/src/flux/stores/message-store.coffee @@ -125,14 +125,14 @@ class MessageStore extends NylasStore itemIndex = _.findIndex @_items, (msg) -> msg.id is item.id or msg.clientId is item.clientId if change.type is 'persist' and itemIndex is -1 - @_items = [].concat(@_items, [item]) + @_items = [].concat(@_items, [item]).filter((m) => !m.isHidden()) @_items = @_sortItemsForDisplay(@_items) @_expandItemsToDefault() @trigger() return if change.type is 'unpersist' and itemIndex isnt -1 - @_items = [].concat(@_items) + @_items = [].concat(@_items).filter((m) => !m.isHidden()) @_items.splice(itemIndex, 1) @_expandItemsToDefault() @trigger() @@ -250,7 +250,8 @@ class MessageStore extends NylasStore loaded = true - @_items = @_sortItemsForDisplay(items) + @_items = items.filter((m) => !m.isHidden()) + @_items = @_sortItemsForDisplay(@_items) # If no items were returned, attempt to load messages via the API. If items # are returned, this will trigger a refresh here. diff --git a/src/global/nylas-component-kit.coffee b/src/global/nylas-component-kit.coffee index f00133b36..d62f6b440 100644 --- a/src/global/nylas-component-kit.coffee +++ b/src/global/nylas-component-kit.coffee @@ -8,6 +8,15 @@ class NylasComponentKit get: -> NylasComponentKit.default(require "../components/#{path}") + # We load immediately when the component won't be loaded until the user + # performs an action. For example, opening a popover. In this case, the + # popover would take a long time to open the first time the user tries to open + # the popover + @loadImmediately = (prop, path) -> + exported = NylasComponentKit.default(require "../components/#{path}") + Object.defineProperty @prototype, prop, + get: -> exported + @loadFrom = (prop, path) -> Object.defineProperty @prototype, prop, get: -> @@ -28,6 +37,7 @@ class NylasComponentKit @load "Switch", 'switch' @loadDeprecated "Popover", 'popover', instead: 'Actions.openPopover' @load "FixedPopover", 'fixed-popover' + @loadImmediately "DatePickerPopover", 'date-picker-popover' @load "Modal", 'modal' @load "Flexbox", 'flexbox' @load "RetinaImg", 'retina-img' diff --git a/src/pro b/src/pro index ad9ff8f68..701ccb72d 160000 --- a/src/pro +++ b/src/pro @@ -1 +1 @@ -Subproject commit ad9ff8f680f72bdbe2f30a613215a95f515eb891 +Subproject commit 701ccb72d1bc9b7d9f0a31e829be2fc3fe52a964 diff --git a/static/components/date-input.less b/static/components/date-input.less index ffee83e1e..1eec6a182 100644 --- a/static/components/date-input.less +++ b/static/components/date-input.less @@ -1,6 +1,8 @@ @import "ui-variables"; .nylas-date-input { + text-align: center; + .date-interpretation { color: @text-color-subtle; font-size: @font-size-small; diff --git a/static/components/date-picker-popover.less b/static/components/date-picker-popover.less new file mode 100644 index 000000000..c93bde6c1 --- /dev/null +++ b/static/components/date-picker-popover.less @@ -0,0 +1,17 @@ +@import "ui-variables"; + +.date-picker-popover { + .menu .item { + .time { + display: none; + float: right; + padding-right: @padding-base-horizontal; + } + &.selected, + &:hover { + .time { + display: inline-block; + } + } + } +} diff --git a/static/components/fixed-popover.less b/static/components/fixed-popover.less index 836d12d14..5c961877d 100644 --- a/static/components/fixed-popover.less +++ b/static/components/fixed-popover.less @@ -25,6 +25,7 @@ .menu { z-index:1; position: relative; + width: 250px; .content-container { background: none; } @@ -50,6 +51,14 @@ } } + .section { + padding: @padding-base-vertical * 1.5 @padding-base-horizontal; + } + + .divider { + border-top: 1px solid @border-color-divider; + } + input[type=text] { border: 1px solid darken(@background-secondary, 10%); border-radius: 3px; diff --git a/static/images/composer/icon-composer-reminders@1x.png b/static/images/composer/icon-composer-reminders@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..1e22291c2ae4169098d078d4cb4573b3f0443e6b GIT binary patch literal 15808 zcmeI3dyErB9LE=xSB)sjD~M+;8c)vcZnwMb?%FGySMUxk!rdW9#K(4b+FNP6rMq`m zPBbD!MU)sw3_%k?MMaH*F@TV0P6H&OauGyC1$;!nKM;)|zQEbOZ>~2XK4LV}wB7#Z zH{aiH=QA_E-Ttvlrcb-!0>@YfMNt>$m~B$j`Ip$A z0o1A|$57OD8}*h}t2KO+tQrZoq8Sn3&LmQ>H$?>|W>She7g){+i0R2%*LPdrayfOa z)-_8Av*A=dXww_I(xAC(T8r8>SCur^#GoUPkzs%YuoPz|5l@E5qM*Gvjh* zyI6B;U3GRsXKQ%6v))Jpr{MO{s>jPY{gT@wNSw%D>*QFEk70SnBhenO4BtHK%)eYg z2mBRCYf-r=G$o%7TD7h=%Sy=%)7jbS?)18ibPUQRiD5a0<7n7}Hs>cTB||68@wp&{ zI3ZxFX+34>M$&1=RU$^aRqJxuiHfiMxDu&iqNJH;2PrZcCB=B$EK^COsYOkyJsr=U znx--!4iX?~nNa7cs7tjOmSMIT{iH0q`%MhzBpfd0u6VwQM8(vmHMs*K$Rn+&G+XAU z0Mi6aqdl#H$sKSg<13Bc(xaux=@rTL^n30gqxU1TJvmu+Ddc7-0LLoVr-5P_=@!F? z2Xm`zdI6!czTRF{f?IG_hZR*%+GMW@FsQ6F=cR}sq*x$muSwd&(jLBr6=gw`IlhLK zWR@)plIw}Y2pgIno!=)0lyb7rD@IvQGzQ#5nqnzu6{WmySsYE3qeeQRSV29Z!~l~@ z#sW;Kv8-otWy$qM+(^UI0zq$psnlGi%C0uKF=<*#QU#5nAZ&2!x+bfBzsgCHmyW0$ zPxF4Cj~4x^Kzn%>2oY8gL- zqO`~3muLxS3atP|jqs9R1){Hzs4Q5YL^r2(So@TCSs!~W8cZhoyrS37X*B%6u|%R8 zErKXVD^ZE(CBet}L2g07u~Z1tCsl)P!WBEeY$e0>oULxnU|#Rmf+MbHt5ix!o50?K zwXVV@ES9xm)v`6&y(}xLUEhMLy+wc)V0yKdPOGTQ%k;j}d3FeL@yq1>=jdz$N!<3z zh06BoKZt2WtxhEk>SAz(obB$+s@<(VTqN+6S ziTLP<<`rnc7Zrh~sUpvM3RC^(rUI!_|L#ReX~4eCuxl}_3re;I!Y$FKt+Z}({afvt8gI|`_j4?KF&_InFD-YY z(%E=vxf_+1lrxjM73A{SkmfR#eJ_-|NH@dVb`bOlf>#JIXfvvqu4h2JHKfC4T@Fu~9=Yx0&E(8ePB)IT=5HG=n0KuCC7oHE|CAbhEc$475^Fh1>7Xk!tVsSZ2 z595L)d;+%-|hrhjduxD6D)rx)FhJSYKWcNb% z;T@i(otu~KTzO<**U(qjFPRxXH2m0?1DE|?^P_9j@o}@(kNWk(c_Zsvw|_C`2z6Ix z+)D?n(?dUIAG!36o(sr zUcUCd?Yh|Vb!NYLaO3@_KWKY+N@!q5diB-bHFt{-cTel7yXlJ&w?`-WkIVZr&)&AC zYVpdsr^Ys~t2+8ZX!D8V>&NbjwRT^;{nomgQ&kCZ_+xMGJ2PX;?#sVC_~?RLR*h_a z;J}UrD~?U^%o?%HvA22ZPpHcKQgu|(GcAx6m8TkC2$ke0v pOx3BIk3aX)-jiQlej-MlH*Cf;yMADo+Rs=wPM#Ke<@!7C{{wUNVYdJP literal 0 HcmV?d00001 diff --git a/static/images/composer/icon-composer-reminders@2x.png b/static/images/composer/icon-composer-reminders@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e180a7addb2cde07a8cf4bedfdc4a1b9e047f3ea GIT binary patch literal 15174 zcmeI3e{d6J8pjv#suqjq$c8bOR6f%vNCfs34+L~D7RFD??Yo z$z`0gNM5J6scimI*3Ff-2H2X`%37wii7`6mlg*i?5Csx=S&^27ydIxGg^J|SycCF~ zW>PMTO2nojd9hSbX17(zO8EdQ(<==MMy=Jz3XDp%-l!?mO_XU=Y6Gd#k!qttt);-9 zP9=-KEXl1r7FJ*aoL}U4pG?Y2H}K73kz6hnO1$FN<@F~D`Ghz-K#>g5ep0Pek?BlM zCgJfn2RzZCIT@1muwK?D3c#mM>+`#Lkr&+jFeMY+!xjc}VzVV`ryZ}?o3^wdTIT`; zainRTLT!tmC97G1Zw@f5buPG+3F)q0U2iEK~uoSAlhuOeMo8x&ooOrCZ5{)BU3~6 zA*p8sIB?q09!MjN{>PR`lV(V%a!vqiv;|tbU z`K@i2ILH#`l;nx-UW#U<6V1#>n}T(k$U&{iVI`b#8~6WCU@SjmAHGJ=&H8S)p<=0` zs^OCeyh{wy0k*gitcf4G-(#5vTT@GzNaXnjx2T z0>_Sq8gR3~nhkorR&OFxn^PTCT!{79Egaaxg0wPqpi|dIg+v4kFfNz|GRC-&h+qN61=B#r7#9)|EWo&6 z8ps&qLL!0%7#Bj0>iLj4>`GB3OWN z!8DLD#)U)#3otI21~SIDkceOb#s$+r#uyh85iG#CU>e96<3b{W1sE4h0~upnNJOvz zL~BAnOCq{RP1Te%;45ya*l+lriPi zHiBqwVEKZ`RAYNd7L0duBxyU*M>g5bYf0t_RO3E z{U873a`~pt)6?8b@*|5@O?4`2cb2;vvX9K%wzXbWa^a&q&FOJ(h%3f>>KEp%$etQm zv@yKD+D<=rX8gjruUNVA6`_rh3*BY*H}>r&uLgtt1Mgj#B%J@}nM2yErq4}U$JB#W zJAYI9!Qy)&S7xnidEy$oqu;*B_-1F(L*Bo(XBoPBKX6=nuk{bl2rW+AQA{$|{3 z{yg#@^w%TjEYI#A|KzgZu7bIv{??bd{=lTK32*n!yH0jC&AaEbiz^!GX-}@2usvhm z&$Rx#@BD5JH|Fffm+KwJ!qZBwhxgs+e)`=b^I!kn;hv4BYIi^1yjb~at~e{QW$6@h zapjI&u_5yM(kTO98F)54A)~eLvpj2VIO}jm0I(--aM$Ml_BT0Gl-$I8QNvd>MMH)2i)sm|EY)BC-vCtUFU12?YZJbT{y z)}}pSp0OXjbg^lyZ{~?F^Tq_}vHvo=PhS~W;}#xV{-2{YZO@ghZ3_+j_MNVq`CG0H z96j#1<{B&P1t^b?d8w>R+_vrS$5yv-ySwg?o;U_&?S}^@IQb literal 0 HcmV?d00001 diff --git a/static/images/empty-state/ic-emptystate-reminders@1x.png b/static/images/empty-state/ic-emptystate-reminders@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..861811824fe2f7aea21f0495fc5589a83e8d2ef4 GIT binary patch literal 16420 zcmeI3X;>528plT#Q7nqVl`9%kQU%Eh36L8=1rdy~Dj*Rzk}!}Vki;ZF6s=NG35rE1 zP{9=u7cdeL#SLi7rBcSCP-0?Y$T5y&sXPp}ySh@SbPAnLf)ymi3W<`hB1sfqb`|+h z#|u;l<&aDXNhNrFUA{mXrF0_@^d0rQy00rz*3*$h(ajE~NKx@+6dIXI>CY4*?D5E= z(?g}NtIHCNcx#BdzwGnF+3++ZcpF+jyE#0->wzP8PPC; zZlwJ>75*z^AZ0$NkVeUc;EZVaQoii(>XlGv@8o<`N#F9>v4bk;Gd6uom(8#gx@L$C zUn|Q~4)T>!xxZ8z;oh~%=6*nk_w>}SDh8Q>pUmY8A&H)>9h=hE);s6D6+th)5_H$E zNfM1pqSO3o&MYdEMPrbta6m;A=~DKo!Ig$Up)2~Y!Js2+Ae4P;znGA*_gH7q1?(3KfslW)H7XT6HYK-ARMT8V!xR5kZV+5L`?D;^|e!jjn zzp&l?WQ|C-TGjEGF+SD!MQPEINsV_Joc+$8TU)%zbobEfYmfRy2|a!@9zAuKi>Wtj z39dEvK^$ZEfbBqJW5pW6jqLJvKxHzn;f?JNx>Kpd;EL>O>8L$z+0r9csrdugX3=p| zc3fzX9*__?LOpZuLX7jGnqwK zJf+h$*}4~5ENX!Xd(a&2H4AmKvsf{E%`%|_6d>sEEuUrbaAIfM&;o+CGY6OA-?S=k zLtY)n;VO@C=2UG`vt$#l!o$3js=Mc*Yce`^+2TI!n*Zc@9S+CwahUjR3H?P9U1Pu0 zi0s+9ovGOuI>2Q}hq=F?%qy*7OLd&Z?-!HJPKUj}8OL3G>yce`kuaHOw@)-&I5u$5 zQ=^T;XKvYfwnWwt_1aPM%RQ~o+Bg6A*-?3;>@rI?#?ST~-5&mnWYS@vl?fg%ubZCa zpbjwlreJ&Sy4Ivw_7B_bGlML<}H}kacXK)aB!`nVaxlOn?y_0 zBPkWk9ovC(IWEh_X3ll17!vq|b1j2cGxMND7SnxETZ-ugzXvWWZE_rp-g{aP$pLT6 z^QN4xzntiwdhAKI@QiKbG{O1``vT#L@`*pUgbP@!Bq_f6mUX3!sL+MiM5?;p$pQ6Z&=8{>AmJzSwPrDtn*S4gFSICo$ zO``X_Fq1f@Y|v%8?SITU^uFc<`z1}YWs){G*d}mqivO~6f=$~fFz^JWKmNR4=j;La6mO<^H1 zFgF(>CM4=!I}&xp( zA1%Co=+##Xs&c0_FSzf0cw>n=;Dj_SJD|9EqcyF_=^}A~XN^6sU42kGWvF%(Y5BS8 z;+eRj$2!?M)=+Kwb1}_p`{E|aueVlN=FJ(Hp1hwL4hH2vFL}5+DJEy%#!C}IEsJ;z ziLarJDGUtb<2zzDwf_+_uuk&zLuW zWqqp-G8UJvJGQCFh&}MGc(&D#mao2G4+w`wipSOg?m(b*t*+YfE>Cz&88evBw#AM! zG*DU4(P1nv=d{&Z^Gw;RJ03^T9JHe*<%G9xk0l2Fr*50K2GZ3ZubzCcv#Bohz+tM+ zUiA89rd6&8=Py1w$g~@_VDNDEdb@k?r|+*659BBOkyn*>?o8~PudXMgT{!5T(b!b+ zgm5>1(;o?gMuk=RkShwO-Ym1;S{a*V+IUi9UdsuI9a(94*c-<+L>R0Muv|63kmXP*!qmoBxiVb=t<2>A+%q&UfeX}WQ*3s~VoYEwD z{_nNtpRP^)-h7qCumzjn;BPV{Pn%{<-x6jsEa=Q?C=0rOJb!Z*csth)E@nX{g}ZI; zaIr34G}|ZtNwx0jn8jNjy}Tv6(LO|-MjBXr_A6@|@kw5L2i&?`knwt6%Oc`!!97Yy z=eylk1^ju!A0L>XHknsebn(gkpL3NZcz- literal 0 HcmV?d00001 diff --git a/static/images/empty-state/ic-emptystate-reminders@2x.png b/static/images/empty-state/ic-emptystate-reminders@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0a411f0edc9aa2327c32c68a45453faade91115a GIT binary patch literal 18925 zcmeI3dpy(q`^Try(7_?2RF-40nUTYmW6m^G%$%~B#hPuJ8R@{iZY6ZEkW#rTNem;0 z97=O1;*L8ZCAT|2k{r6rT@vZ{k?#7`-TmG7`}=+W+#cAq>;1Z}>-~AY51;ou9-qUW z?oLZ&SIR;lkR>k8_FEwk2?X$K1C<6m(r&h1z?)2jvu`8>BBwO>D*-uuMil}vH=ueE z*aX~WESX6+AcZi4DF!k02tW;iSXjqIkjOL&8y-vvr7|ovUewfSz^NgY8a^gCLtKO% zC5-AE%c5+Hb@w92(#V()4Qne|ix@1BfKFkP;4$=YMkF@IQsZM@EMU*MQ5x`%5;o0J z!*;G9oPhI$+c8-bxQT%&l8iPsf}3Fs&?Xoo^9=~Nks;a?Ww-%_#vswgSm0-aA^g)z z!%7ygELb5suv_gNKa~SMS!#r_*%4S2DmpsaAlle~$qEI+F&LDg5z5F22`G?}yBTa! z43ZJ4IiKXOJoc1GGK(6)rZO4uxxA!cW)#~}Lu0Pc=hvs}qDOo##EAUF4xosNAw{6j z28O8b1%;45$3#T2!asH`gp8tuQ|J^1I}(UPe>W~7jLBw3hB5!4#4&wPS`e zSwOcaR>l^n@3}!yA7>lZg%QanF~}4bdn>?UK&6IYNruLzA!G~%X>NouMs5fu8zM<) z3>j%g!i4NFAyLp2;~gI%;&9;bzooWklB4EU%%{{L|6yuS_}@}{u&BUpM+ygN=6e61 zmiSJZzm;;PMgntmH)!qxGx+0vwvDpuYwuqT;na`&QUr+=Nts)9mKuL8yU!ch=Y47} z=Hu$clE`yAniY9&QBXoGP+xh!bnA2Er!eaObpYq{gTnv0Msyg3@vj!te5#MCe@+s~ z+`*0}u_(5oz?}GZ*ZX|tuS35rVS$>v3xrd@9*lYK*JJe8to{3#TFh;3SYSQ?eItDw z2ebw1Z@w>;=k zuOdM$pCac63v^@uIF|EX;Mf41SWusjEME`v=jHHUHojcae>pKYowx{?hDckCOC%z& zK#U7aL!>RnB@z)>AjSozA<`D(5{U>b5aR;V5NV5Xi9`ezh;e~wh_uDHL?QwU#JIpT zMA~9pA`yWFVq9PvB5g4)k%+(oF)lC-k+v9@NJLx1QLG$0-5>% zybnVlQHBu6b0P$S&4fTyn7p6{M+ig#<6>{?74vAc*WX8@am~S(DxO|878|jbLxwgE z=tNHqRJGu&>~CX+S6S%iK}VC{Jz(E4U*Tcn(>dXvtnIs}SaM}do2GtR%dnCGU3jvAfqT*mpZ zL;J3jW@&CtMQ@STYG-Wl0|iOBW8SG{dQ?ql=V7U*Gec~(hN$Qhe-T>MSm5l%i!>3=pVB{u$$6NlVx;!>5yWBfO{ zGcm1N*JUm=jIV{lZtONNi)I@&q;}>p4BH>2WgTAx#XrRlblC-FtiwNXZfT>^lY`1^ z1*P~C{>$~MqP9>hZZka?w!d6eE%5B{c%zj2eV?ksZ+9z)?uQ6B>12#CH!oT>tvsn;yH`?fD(}vF zqjl+f#&@RmA;TX=0t)Gs!e@H96P~Z>Y2KvDcfalt*YWO#6vbjR8XxEke_QY{9tG+wN)2HVH|&Q?*Y^wlioq_nb6Cz1l)jiYH1y zgbN^Csd>Xj009~2m+SFh+_*K4?<}xyD%ax2LJ!fdU!uE@heYG1dzeZ#jVUJ+IP*`X=dil7&CI9Vr?`=u&pLaV~qoss7>GA z&dYhzM2n@SVy`ZXuudJSVOHi#Jvs&-8Z_8i60F&zq=w_fB+DZ<{kl1uJUVxzNCGI?{g*+9G+_(aDIQ%t>%u#jgX## zwbZ+eA(qeYn88AOf#DiuxsKC}b8Rynj!QzrFT4nFc^5pXf_UYo_p~;aw={fuNq2yx zoQG0AMXobk&=Sp1FI$uK%)Oe^v&8Z85|=iu!k)wto8ezxDj+sndhI{?;`rSOqMh9R zA097T-eUU5?_`;tS!&$P#AM==@kcz<1D;d&I%Kk*x}5C>7FD&WV|_y@l$)SV5Co6_$ZTD}oGJd2%xWXKvS78)= zb2tsCE$C;iv9ycGIDW8QyA!(7L7>=?_UGe@=(ZbYeRJirE!F6j+t8J-9U4|>*$6IF zGHR4~(}(x^@biv7OvqWShD7y@zvmvQ=yq6T+-i=sGO0T8%M@X?ORNWv?9+i;ND5R0LTEu6UhBF5sPxW;UwT#7tk?ut z$8qb6M(qTyVS$VzM+acaukM~M-sbWlKQkrn?obLb{Z4LD&;sj3vc!|4#O~CMBUC$v z(T&?X))MYloDb%{E+i~Ys!zYJTg_@&tx8qkUuoRgJ3iqCXWYNKrSe!8YVT8M*9N{+ zNvwX+o(P|G_}93#tN@fSwyfeYn#-F`A3BZW z>Xzw8uWL(5n%W}IUvz5QOSjf@M+EV^>_^%iU#f*K<-V3zp1wVCVl<#*`Tw;0pgRRR zl>-uzBil{sKXxjd7*(w+Vz}2EXFCYS`Rk+aZN3xOE1mhHWz~TpTJV?acO5M5!HKXHuBicYomhaT%2_ z^}>VOpz~`k{gBeG{rYLi+3`UomJn|G)I^ZyuGnQdkG7bq=q)|I|MpWjAxrp2O=FLQ zcA0MU(!$)wS{A})uWb!fa%Py5?~=g`tn;c>XQKo&$!+D5TR1`90a3aml%-YDv@ML; z=k>oWwt0wdZZ;>-Qi|kH*;PexU!QUE#Yh*dNGT#jCuF`wb%#Ho45}imtAp<<2d|<; z4R(c4rjkhv;ps|+uJp{BO=sMlZp6so>+#%soyRAwG|GzmSN$;|sUK*fT=3{vOrK`( z(3|LV;w75zxcs4QyWXkZ8oN1Lk^b=1DwbS^7e7=YxbrINH`hOI=n!P6O@%?j`I%*s z!JG}R95xFS`-h6KwQZ@1#?uRmS_<{G2r`z9Z<;Cm^qnP%E=J5dqOeaJ^lP zS&J-!+@4ST=5Vmc@y!M(?4o{r;3n?tm|ud{M%z^d$?3D|V2XUj36%U$-KN&qE8{Rl z1l-a`GkX!Y!C>u8Xfo0AXi#s9GRsDw7%+Bjt3Xdu?%K;)U4k}V6AuvvN6RO=WfL2W z>w^GP zIB5KP2F3eChhTd3cKq)>Lq9nPnpFxO@Scu3R1aL2eYUyX1~^F|x!&g*Ke)En<`m^D ztM!m@+3L}*R#V4wEz3`}e)E6_(+VW;i*{!(=nHUtXO`Gy%=JD>xL(Oz4lxUqyyths z(y!B5-MD1IxJsd!ZJDVItYkqmU(KF|>KqEaptY%g*zpW9V1A1yx6PdN0S_Rd2H-b!}BD91o?0maP(YZ zSJu3epVW{~Es1sG$CsF&n3ia9qNNjit?|W)%7*C6wq@tiF@6*|ym{&K5;f@N4St7g z%ka>y-r&ws=j-JPu=qROau>?IZ-=F86K=__3oXl#>6$EwwdKceb)?m7zIU1<*vp3v zx-YTg$Fm%1>nDjvZtpxqkhqlGmD(G({a_eQpP<|W0YWQ#Q^U$57iYxv?+cc)S1we! zpVGB~`&uKhQw{ixY4`hOEdizKD{;?B|4f{_DdA$x4*^Hz60QA|u8%*-;SR=;ROR*I zSHiBJ2`ST2;2YwZiOR=A%1*DBY(bf;DeA+A!>+%3f6TgZP2n!-7SynMbD+u*f&|rZ zr2AOe?bU_5q>>2|Q*XoW<@=SbL`%_tPrgngo!2hB?hwkhod^1#GBYt5bn%|wx;=u7 zL}i;YKGNfcfE^G?IMb!t^q^Z>-@5`CPXJbjq#Oha1Lpd7j6oyg+_)DOS+J&-7jZKy z=z{GNuOxtktq<=?63@+4U-VebpR9GXIX62sU0m|POm&Gw6X&G-iL19pCW%8lgYLzW zawo1Lt_XL;9Jk~;2n>Dgrfb@AuU*YgO3sNVl4OO?ow4M|$9E=D>4%_oyW}t5cwbnu ze*FFZ7gyIqVLG&%w70)cPRHYHfzSt|U48yX6kx&y!lZ^@nkp6ohTcAbDhW7GW?H)! zwB}wr;XB=qp*JY)WU54@Few} zkNTEoafzhrR+%mj6UTnw%h`HNdRCV2!0X!1lp_M^6af^LTdbZ^n(=T|A9c}1ef%{g zMA}VsO@eiYtm6eZVci`DsgJXd(C?X9NpIH$IxvV%V~0)p0D8W(rYC2S49s=FreR=u zL6)5{>*S_w@{#h0G<)l}#G(>RnZl?+PzeSKYYq(>ADVWk8QkeUu5$l;PFpP!a1Q&m z`_yDl1Z1cOu0~gD5Y|;LtRg>M$*VBlJBw5cT*{3(Ks=vwkjELDEq&$p)KkXMC#a!8 z2MW9J>k>y5|K_3Kf*uyFxSBPw8%{{Py>Nvdzvc-GSG{)_6-c`5)zpY{sKf6v8R!o8 zXKP2BE1npYl#{7GUUo5=d-m1Rog$r) z?1YTNtHjL=iCdTerZY)-^g;0-4N#J}Kqd~8Vjz%7X=yuQn8dDK8c$#X1sE$O$v{r-NppWXfK>5qG{V&(E_IS=Jf6g929%vS|JXXyX;WW)ElS8nt0 zV`{jpE=p1NKA`{KMQ!h#O;Jk@$~CoGt^aYipoUDms0M&39ty+W6y;eO5A#A3&qg>V+0oAQ5YlPM&ffJ2Oy*Zw^8wLmgjW@(YK_%*r z7a9|B-SE5K%oq)cE?QHeu}Dv7sP$JEiq!}(*i8;vV67H|lQXe)&f>ByHdxH8gE89} zmZMp#8~)kMhT)gdn*+ajBBJE3@|6y!gI1xjQPaY1hKa>urkK^FMjD`;;~2Aru~=x> zgO0W+8Xu>XXkIeNNE{!C3K2Q1$*N+|B$)tN%u^6?I12sAk#fbSz;+9 zXUGG`>Mo7|UQ;7Asv7hrS6RgfLPK$}zN+jdyJ5bc7i2{zyTHSsvhg`ZFjnDjzwn9Z8m2FN%lly_*GGsTE@hHQj6O?6GzQ#5BCqjx6eY87 zMjTOaOKK#F}3Vv%T;b#gQZM4pCegn*563c%$UNt6+6Orlj08P+~Nn9)Zc ziwKihtpS%Lxp-P+g#c}1VV;1*iL~9pxvX}xWEWk@1p&u0PM9&N%H$|qu`L-Z8LsC< zb*l!?jBXuq1m#4P3iFXD(Dz`Waby#w%37*w>6*k|cJqQ>-@JmpMS$pGMzy9dE2SKk z$z!MU&JZNyXUHec5o-hrZhIv|C3;O9B&teUjE{h#2Dn1*boVDCkCvh-JdA!O1m*w0 zWJLMZUv4TmmlUwEK%%YAfJECI7C^f!BA_MS>0%u&yG=5?MyC4Tn+l{#{dcD#y_$ta zUTFZLml+w|NW=fq?A=*i{4yKq|8w?|J92b=94YH#>#0Y-&CqKxtP6ai2C^PzOj~;0 zB>UIuH8t3r=Wku@(o6%!YVG-s&vd!ghZT@7#B zf!ATTTkReOZAKLpavTI}eKI^vqxz}9!ecR^K^@}?>n0LrIEIDEsmi#)PE^rkE4+P& zzZ{s4T@Fu~9=Yx0&E(8ePB)IT=5HG=n0KuCC z7oHE|CAbhEc$475^Fh1>7Xk!tVsYi9AI1d=d;&KHAGLk$t%?KiFchRsNrY#oaTm}?K+j; z?o-wpoOJ%$d!BfsY0IpS_AvLK+2eh*M5o=9_Z-1>=8iIEgt;s__`SproXT3sT)h%-d;FR`9*)< zmED`??mySGL_U>{If-^@optIceRosq5dJ{%5Lc@{-(nMIBRKzM3_;W9EW3*Sj+o{B+Zi%hQYRFUiXH^<+=ay;Og;{bKMZyHEGtm)&%1-`%xY z^|x7e(q+$%UmH6onXeyzVb`|OHT@-vWYgBimanW{NPTkZ@bg;WQsqnKZ`wjk!TX=> zh_uvaAN|>sw%6wmuDP|_dVJMO-q-#*b^5ltAA^B~l&|u+j*Gc%Z*Kc^S8wm&Umkhf zSNUYYz||E?<}Ulq$I85}qW5-3w8tWcrd`d=re^gn9?0IeV@~g-nDYen&!ZPUm_}t^ k_)g{ez1{miKS!NxyP1FNy}RFmi;XHTS?SxqtbXmk03^?`t^fc4 literal 0 HcmV?d00001 diff --git a/static/images/source-list/reminders@2x.png b/static/images/source-list/reminders@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d418af7d9c02876bde786c1c1831de888d460ab GIT binary patch literal 1305 zcmV+!1?KvRP)-^jl;(7i1S2AR2!e_rh>D~~o2j~sIt?%gUs?W{k0A&F!(p0>Q)+H-kYx|0)fP=uB zVP!-TA*w9=_BL>+qqFPjj?OOeKf^@;$um-5e8=MD*8^Vx?*lV{U1s+3=*Y;6F}5rl zeFk_1*aO@Mya#OU=TNP;0Ul1c>WTGjg6DS)L78A^cvt#V9My|=)HS;w{Jtj%yKJ;oXm26u()JqWVE%f zyj#-Oz$sv6ty(#o7^a5vla0U>pt5h*j%|eYh-`}VB$u;RVHL;DTFF)~oN&99S^`=fB9wZz4&dttBwCj|0a2MZj`u3*Y4}03##A-v!H4U_hQN z%mmKBe9ICJ{sQ3d<){hc_1oIGzA6!0G>Cnw2C zI7t@<&L0UFH(Uf5E`BruoajF~R4-)&&+{o4RFndgB0pvUBoc%nTA6VG_p*NL^P%%NN6CRTc1@|8dKDA zffsf2ypwamEcddMio$^!O2-$Eb7KRhKnt1{{4te<3h9bji>J5prU&Q9UFg!`V%}R8 zENV)CvB5~e2m4OmqtFs~pKppz2udmq6>68o#n&O6uWlSRkjxi6%j~zWQI5@Db2T1KGfHzoI;?H zDkdC0j+{p{rF>?|bp7Sz@qZ2s4qR9lD6CQYidA*5rB{25=>}JG=-R2xg`+35GLYU? z1#@m&@D}i#nQc1s`@SdQfm|_5 zxpnUC10%!3A4-~BDwiJ*VE+OijEmvaY0c510!9p>;4r}KdGj9zJ_0U&r9TU-uT?AG zj0dpP*f`;rqg7# P00000NkvXXu0mjf>qu@S literal 0 HcmV?d00001 diff --git a/static/images/thread-list/ic-timestamp-reminder@2x.png b/static/images/thread-list/ic-timestamp-reminder@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd12fcb7b1ff8d9500d1578ac28a2447cd97f19 GIT binary patch literal 14998 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 Az5oCK literal 0 HcmV?d00001 diff --git a/static/images/thread-list/icon-reminder@1x.png b/static/images/thread-list/icon-reminder@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..704903c9e305d140fd3cfa5472f44c84cd493d87 GIT binary patch literal 15733 zcmeI3Yitx%6o3aM2qi?4N=v^29UcmciRcOJIl_L z-8QJaL?9r(K;k2s7$1r8jgR;ULd2LDjiwQlgsK<}k_J=~r3p#Bv)g_2cJ~Gpe`xL| z`#AU9bI#oFoO|x^eTp7CN(#O+R*o8=RJNL`kZxc2%xVC$)@EN!%VDp z-eZ_2o|?um^IkXFJM50|?W$(RJwP`j(36QL(QJkZ%+Dl&wg%d+2<$Wxb?&nt9B{h~ zz0SQ%4)ft;1MD)IdQ)&oZ%ez@yGB!V_xxa0AfqA&acBcqCLT*zYNpPe^{b-a&M@b8 zWvAF{>fH5CKvze&)zx68piB1nSdI7jU4F&mmHmFnf2&L2y)ws(oXE3+s7kyl39jLn zJ6MH&1yXucZ42Et91cl!?k?L-svMV2r#)%WW2QPeuc9a%FK~juq8Y5!ldwUCO;|NK zCwV_1XlW@UX&Yw3<@f~=v)it7yPZIV*YLXH$wHunHOvlC|dT!>xvdgJl3p)I>{9YQdSw5+Ao z-jjq}8??;slm;8up{3N6TfJ>Wi^&<`$Dq}H#n3XFOqGK?y6t&oKn4wssbavd_YZfCzB*SXfBn;LRoyeuG# zAR_uCRtE}Xy3Uo)xK%Ec7O6E9g(NQo>Qp8A!~!K!%j$|h>XRZsiPq){0f3=7q3Pe~o4YR>kyC2;M?(YzvNWP4N+ zq%7#{z&dw+3l^GMp=UWZ*`2Hc&FOAI&DkIjQ5Z2=ysU!du$eJBofn57=fA|fa*T8r zOpvx$&Q*3+Wha&ywbLL4>pM|}RNDIBOdMbXZxl|>dvy2ko}tn*S7=#pQ~r~1-UQKm~>zEoU#B8s)Fb%8`D)Pr1pZTW%! zQtmFUEB@VW^ncA=Za0qXjro>7x|ar=8w{rpqn-e={m&cVMvWD#CO5ys>8G*o?0mn# zqZfzHFXy1onwF|@)8%B-QZ;T`v|O4n>>xT3v(d2O5-aB}D0e_FK{xC$=#ym;?RI<^ zw`esoFxC+=&`D}JCxX{EY=bMx8ZNJ7SfUs<%%!U2);ilkbED|S9sOtE3V#|#HP^y9 zbUA+%S9CeOV!mh)3Vor!L$??281k9Tx33& zmg2&IkVT4%%m>p_To@3tNO6(*U|Na`140%lE;1iXOL1X9$Rfo>=7VV|E({1+q`1g@ zFfGM}0U?VN7nu*HrMNI4WRc<`^TD(f7Y2kZQe0#{n3m$gfRIIsi_8bpQd}4ivPf}} z`CwX#3j;zHDK0V}OiOWLK*%D+MdpKPDJ~2MS){ngd@wD=g#jUp6c?Efrlq(rAY_r^ zBJ;tt6c+}BED~{56(7Te3H0o38a-tD(*E5qpa*naT2ot?VS48<%!bVjGdP64e_@zz zo?%X}W*BuJ!%Q_Fx%=>K3^QhabEv*Ob8LOzM=evp_F8}JoQ>J+~?D(o<&4tC|?;M;_HTTUk%I7yc`Q6~pPp5xA zKIjwrj-5`|3{3drjR(G1m+JiU`cuEW^LS?4(T;&DcDXY<8$LXA?U@tR{X5;$_Mhlk z|H+jrj#yjgefw!`f4}cw@06i~jVG%Q+;ZUSy?r-kj?9*mtE%VEdSvo_-@mwaXz%Xc zrS~SbJ$sbfF>vbmXN?zX-k*JH;njlsHT}7!3(J}pJ=`#M^QsS4zGa=eRe!KUJ8*|E zXIJ;4_qNZi+4}D5GuLn9tLwM?_Pbl(QvXxzI_}um8JQi=oZs~56P}6IcJus-^RM_0 zPLICPI@Ngoi0{sKf4%4AEKs#LzG>DsKkh%F4M>lj-7~aw-)k#}7WDP+d8%fnz46tn a82;r2&z_lh|8(cU=;p?j(5nkpZ~6=8NI2F2 literal 0 HcmV?d00001 diff --git a/static/images/thread-list/icon-reminder@2x.png b/static/images/thread-list/icon-reminder@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2a820142ecff8fab08fb666b852485b2174f2742 GIT binary patch literal 14997 zcmeI3d2ka|9LJY(^#G?pIYnj-AT2c6oNcp{grg~>(9}{2wjk2&X4C96$%gEfrWJ*% zoH{6s9D+!vjOgf45FCWz>TnbMQB=}1N!EFhx zvZ4nF$=qCdRT)$UGTqLwyjLchVWMJf(K(N1!dT)TosjeTh1UHe}OU-6*w@ zR;!^TA!SSsyWrrRwe4~MtA^HO!#N;jY!0x89E`*~QWjVX<#DjIQ}BBj$-;Y>N{;e* zD@|0i5mH807M&}&1wR-TXVICcc+HS2xZ3D^uP8BImdm$VK!b|s9W<*q>MERSK(9i_ zD)pRRuVjoBIZB5y+nJ@WV2sY35JbBjwzo@d71(Nd$AnWm9y2v$Z+a*##NDcKX; zy)?thCz^$oHwEV~QEghI!-_b=Hva!kU?@Li@3=;di}OBgLxoZWRUIc01*cTQ__?u_ zU`;&geh+1CYmF^oqU2uzH{W(LLalA*D7f{(s%<}~Ci!rq!Fm8=V}kRbF;VT>qLoAX zQh8q8)j@r>Rt;X1M*a+2;qF*#*~6`HcdRw)oa*Hzi#A*>rWta{CvfO!m;!DVI7^nn zpfi}L*ydPA5g*{(rB)v7VNqV0I#4O-iS3AMEbGV!b%c$fse*pigEJXw1vd@geuawM zu(X}z$YyxLLG+5AaAG(eE&|g)#uyh85iG#CU>e96<3b{W1sE4h0~upnNJOvz zK*kss5)mxGxL_K{7~?`Bf&~~COamEXTu4N)0ONvbAY+URi3k>8Trdq}jBz0m!2*m6 zrh$wxE+isYfN{YzkTJ%EL<9>kE|>-~#<-A(U;)Mj(?G@;7ZMRHz_?%<$Qa{7B7y}N z7fb^gV_Zl?umIzNX&~c=;!2J_0?2v6bAL790Y7I;UOIRYA5qFPN5m&yr(UPBQ5g%z_7k0*#u=ku*&O9E%UUA>#?GC8efUgdJ~jm!lTE}wK+ zw_GdGj~m+f&cMkBhCL(_Md?`*NbITUKM2iFw1+ zn>K%>X!-29qRs_G&og)Xl^?3!^U1_ssm)!7%-1zcYt8Qbd-M9sf!3@phsdPM^||FO ziYrN5rFZl9w@f9w4xaJSQ|gq#JC}`^owT#rap>OKuKmuZe%yJ-l127Y*9JBAUeoP_ zCh7Bq_Zxprd}~FIg&TVhuq|$Gn4Pg|!}a0ybHs$}8+Q(?uS-cdAe^7q%XaarhJ>oV zCo-4Cvct0)AN|{)ek(#*j zi^Bz97q58p)bxrW*?o4))$@1DW*)ow-pXIT>tjy* z>9xdb8~(gBv1!DMo&M;zGtD*W)~jc_Y^xfzt7)rK8aQn?+i>vhS*ylOSdcQS@^pD| z)%Vl4d~>^U&aHK-k;eX}gsa@WzgG?^_@MrW-uu?AzrShG&jXJBSU=;hvwgOv?tXgE uf!6LPW;dMLe=i}hWL!hJ_D;&&9>jdzO!JZT##Z^k(fqtZYty*$*Zu>XR)kOh literal 0 HcmV?d00001 diff --git a/static/images/thread-list/in-label-bell@1x.png b/static/images/thread-list/in-label-bell@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..04d5505d54a780687a1dc80537c7716822cbc7d2 GIT binary patch literal 250537 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 s`^V`EamjInXz6W={nySF}YZ%=#w4>FUKnE(I) literal 0 HcmV?d00001 diff --git a/static/images/thread-list/in-label-bell@2x.png b/static/images/thread-list/in-label-bell@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..93fbcf7b3a9c17f5f689fc2e65f4aad74d8d87da GIT binary patch literal 14777 zcmeI3Z)_7~9LEo%{Fwn25l|tNf<(;P>s@>6dbEYP4mPA?jtL#UV7I$x+l97w-d$<8 zL?yzaBpQ+tBLNcSg)sp!ic`R$f&voX2tm;(F%lAtfB{V;B8m81+qJ)SEe{x8KF!+x z_B`M3@Aus2`O|xIn_8NeOssmOieZ?EO^uOO{5{ovj~|Oaj||2a;I9dKW4p;P_daO9 z$1vM=OlO$dYPBt9#iGkZSxdMjMe9WFOhU(Mh6ygr=#sn^S&mNBttLax%R`?#9jX#? zt`ef2s9ukH)W$vot>|lRll#`n0mZp6ToufSI6(qgk|UFdCrvREa%S_2IJTQvrz0z| z)`pyQc0orh+Ty6!4CD~pH7=R+@(zE%%?Sa%)>rM|JzNdz@v&UM#d$^i=kqx7FK4(4 zM?pjB5?dpS^X2e=A!m(-2JY!3uj56|+v3oBe^Z_<)7uB169mt;6k z1evm->Xxb{9d=%+Q%hMPr_(M}c;&Avp%)4z%{)6yk!n^wa*j3AG+tkZ1k)e+l@ zOf6-|s9_zxlsVk*W#LihlRr4AX}~(xU#EFY)YDzl$23ZB#ax}s;Y>*EO-Mbptxj-Q(V4)&+n21 zui^^S`ed%g#|vHl+APFq6xv6nj%aeq-ZA;q%5A0w_ED*q8!A5Sq&U#nqrcq}Wzvi) z)u@_yjrM}Ii&t>=JX?XD8`(PC5m&S4k}er0vUgp`IlS!(2U+2qvOU?|D@w9`qJ?F9 zQy?YCj%Y0otKiJr)c-qyx%|LhxkkDNC2zK&a;dVa%1KPE%SuZIs_VvU;#T*2F7rrh zX^9|f{|dy_k&}^Y9XUtCt9JC92JOR5#Onc%P0G##7i34Z6)WfTF?(L)sjS}5d+>|p z?9aRvc9&Y)Z*GO%rPiYJnWSok`FypKX5g|<;M~!$0^cm4aE%~%g&n3(_FQ6c-T@ z6i{4{1~I0%h=`zo;(|1YF~vnh1O*fqq(O`+E+Qf*ptv9nVoY%n5kUdP1!)jtii?N{ z3Mei}gBVj>L_|tEf z9|1&3{M=s}Kj1h2kpi6ow6-9Y5KC+2M3z3htr>KST%U@(6gDtt%sjl z5ZiN?|I}t*EC17kGm!^Ip`H3}=b1_UUp?`~xzvUI>;66a*_9J- zjs4;HPQP$=xAo;e_bl0etS?0D%v DjQ=GM literal 0 HcmV?d00001 diff --git a/static/images/toolbar/ic-toolbar-native-reminder@1x.png b/static/images/toolbar/ic-toolbar-native-reminder@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7794e167a756842487319dbd59224aa5d095c86f GIT binary patch literal 14820 zcmeI3e{2(F7{?D{R0b>{QOLk}If6Q%z3cDwymmr6*u;)8hHNq;x9i*Ovi9zFciXy& zj)9t~L4}Yo=FgZI2{E8CAsRq3gYXZD1{DbgH;IA}Gelw{NWk~nu6@^aykPkAZPMMd z_x(Q4^WNuq-naM9y;4)Xe0oty5k*nct182_@H)f#-g`Iv`_SbZBD_q|DjN)nvd_1^ zlae2ncTiN>LbH0_w9a42bd+c7D#Cd(R&u@2ld_K2tG413W9+q>lF3#q3@otWHJL$}a2^K+1 z(4#TFHoPp84*nNlT1->pS+=vY)86T_t9mo*@caEN=VYBu8&uegF2xj+HpQ5q4l)`i z3=Bz^HB(j<+KMYSsqJQfVXQ>iPv*W7S~ihlWY|H9Y*N%%hn-^!IYp(ckJhfoQ%j3V zEQo^yP)q~*ISTq|Evl&+E$Rd*v(pnMhBb*qvbhVcH<2iq+Au3RAc73if}TcQmj>8c zV5sf71S&eCYmOSM9}LIS*3KBNQDRP{PljR(_R zRx^r_4uw)(ML!x5C0Vh!mI`dXQ?BB7;pzgMN_<`D5w^R6P5UwswYG?D>M}g*#5kg{R)4!G3WOP# zs!}#!hjt;I3;Q>9nym(HV@F3P;&SR#(nQ?=)}9M6qnj>!jAc(L%O|yWc~P>?v!G;c z2@n<7F{8O9}JZ z^AiZH^$QS}$Ce^JI<`WiJv+Xlf_1R*up8jY#8ed=0y}OjmpQGkx2hU%Pw8D;>ccv$ zOU4(S&-ZP>_@eXqzB$)5ifjg*nRI!>h?jN#rjLfz@KFH-y&jLtBe40y`5rZL62$An zGTg(4)tL@&#wUNGpku>Cj>tsDFkimp#p*nrGd2xE-WHcKyaZnur|SkMT80nE|dn=Cb+POPyxY((!kmT z7ZwpJAh=K(SexL&B0>cO7fJ(b6I@tCsDR)?X<%)F3yTO95L_q?tW9uX5upNt3#Eaz zZ;GoZ_W~eL;9Gy4@b$jdV&NC~Y9K9D)cV=8;`=FT zwz}=vua{BOBzIMKNnP^P_U{g@SR>B4=g)7xXq@}vuiN@RbNi+$y*(S3_G~idys@?H z`!mCT4by|qT%9$oZQ&=MI$CB-d3w{dk#C2OGlzfDiyL1**ZB8i2QOYeFm&N?X@HKop2h*7jVD-(=}7taO~Kcx5argSMXfR z)^n|2v48w+1vK+PPQZzyFS?Q&WS|_&TpaKN`5qV`N{sBlb_Ol zp0D*ja`n`zAK&lqm3vAnN`H&Z9(iqW`_;|+XE048FFzg@jx=xh{H2~(SI)e&>%qZw z8;)LHcbC^OSp8h_!nnAIDH*zd;Dap}eA9~uLPPe(GYzrpeSNDA&YHUO%HGol#g)6H zdCLz^IdSQQ0ipHHflH^4+V`~e?RdW8N;##Lw03QLukB&$JhPYW>o@%emtH)b literal 0 HcmV?d00001 diff --git a/static/images/toolbar/ic-toolbar-native-reminder@2x.png b/static/images/toolbar/ic-toolbar-native-reminder@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..59a67bb9c8890f92f004cac2b542ef10b80e246b GIT binary patch literal 15113 zcmeI3e{d7W701s%z+h?@LLe@saFGKE2I(Z7B+D0B*pWAOyU$Larn`+iQ^;_D9oU?fuX?!N~cU(l8!U^gQmu@+qiBTesxch zrL`<)lT7|x&B*t>`+e{2ecs#E{c{~P>mJO@U6e}@L|#>;eLc96%6HaG@KNbKf7x7M)>~egMaSMJ8>k%3`P1qjXyU5kGuXDQFTihic)oN?5CCq>Teokh|u-_Mum~g2o z8kYgKGEAw+s6=ilRh26VNtdIBv*V{x&econJF>Wq|@rf98N zPcsHBW6+cFkII@0EQ{#zGVASY;_1MDrK)CG4l)!K3WYQwS|f-}l&++tgwpCMyUD=1Y1R4bZH(p#rZft7my|3r%US>Y!+leY8IwRnV6n7F{p{dk;t8Py?%e% z)RJ7$1`x!NruCGZTZ0_6o|A-D(alw~fmyO%`WTBxPpWwR2&98aHJo<`!** zScNR$UKyLnv9cgK1;J;Hby>{>Legf7b`^P_gLU%(h3g6nmFkqNcrqSmXJyU`I?|-p zfp#=Fb$Uiu%xGz~7W~yhL1N037!JY1d$*>Ep*JwJ9*zMiQ)7S~mw{o6Y-O85WJQixwXmVKz&$t`^RSOu454lgDBh<_VK5s+C zLPb^62ayD?9AZVTyb1Kg7u)TzxRV`I6Idwa7r@6)E=6o~a)l;(c4|c}%E88fZU8G| zqgBvZs3~K~%rU)7sj9Cvs;9Nl52aHsabI{o)wdqu3(u$eCS4y2@Um4OPnR+bc`4^_ z>}aS1j|!aCWHi!73za&Y>QTdoIiJhUgFP%Mok@dCQJ>U_w2t-DIYJY0$5^qTAN6Q0 zW24}a0X(fxiN}@6Wln5{uh~f6(bpUp4u_M#G>|sNg+v4kFfNz|(#E)uh+qN61=B#< z7#9)|EWo&68b}-CLL!0%7#Bj0>iL zv@tFuB3OWN!8DLI#)U)#3otI22GYj3kceOb#s$+r+87rS5iG#CU>Zmp<3b{W1sE4h z18HMiNJOvzK-w4=5)mxGxL_Jc`*U&SCSL&L0^qH`5O}@MuRpB3QAoNg*E4x8L=df7g7{|xK`>neahK4!`Scos$gHojmpj9MySD%SW@qi(U8hbw zrZN@n-tehw^E_S8qqTERA6b#Tbk+~&EzH|c@NM<-@yGUb-F(Jijr{)3+?9X&qrq_b?m$!}l{ry(;;$z>qdhNg`x9@Lyr~5#Uv*=H24=i1h zUH-(`vjb0My&oxR$PC~2QPUk)-d?@#uhV&hN_) zXUN|zI`iJoaw2yRuI#g2l1rETBQ#n&=(^Lqy?4c+dGzw|XLZ{m1DChGbs=-O^GxT= zrw;i49qG<_y=qbQhda9O{nZ2N!H+w1J%i)NkGxTvoqtTzJJA30jiE!!`p*C7#J=pe z+lKks`|5_BYcshMFY>dqfBZ{{zqsuD^5gusHmtfm`^GciPAdw_pC3QxtUo!U;9nnv zpM7`!%MT9tT2^JyS8`5f^xq z|I(k$nR9+{uygFCc~?iScaMLt^K8H69@;zp-|IUc5g)#Ey6AUT_V*GU_mC@gA6uKV zGl^36Hsi~+)yN1d~kHEq8h>AvgW3z0R0 zmcD|5C*3ibdgEtl`FRNBnth2xTK*P@e18XG0L;wH) literal 0 HcmV?d00001 diff --git a/static/index.less b/static/index.less index ec54dc80a..6732a47b5 100644 --- a/static/index.less +++ b/static/index.less @@ -30,6 +30,7 @@ @import "components/editable-list"; @import "components/outline-view"; @import "components/fixed-popover"; +@import "components/date-picker-popover"; @import "components/modal"; @import "components/date-input"; @import "components/nylas-calendar";