_ = require 'underscore' React = require 'react' classNames = require 'classnames' {ListTabular, MultiselectList, RetinaImg, MailLabel} = require 'nylas-component-kit' {timestamp, subject} = require './formatting-utils' {Actions, Utils, CanvasUtils, Thread, WorkspaceStore, AccountStore, CategoryStore, FocusedMailViewStore} = require 'nylas-exports' ThreadListParticipants = require './thread-list-participants' ThreadListQuickActions = require './thread-list-quick-actions' ThreadListStore = require './thread-list-store' ThreadListIcon = require './thread-list-icon' EmptyState = require './empty-state' {MailImportantIcon} = require 'nylas-component-kit' class ThreadListScrollTooltip extends React.Component @displayName: 'ThreadListScrollTooltip' @propTypes: viewportCenter: React.PropTypes.number.isRequired totalHeight: React.PropTypes.number.isRequired componentWillMount: => @setupForProps(@props) componentWillReceiveProps: (newProps) => @setupForProps(newProps) shouldComponentUpdate: (newProps, newState) => @state?.idx isnt newState.idx setupForProps: (props) -> idx = Math.floor(ThreadListStore.view().count() / @props.totalHeight * @props.viewportCenter) @setState idx: idx item: ThreadListStore.view().get(idx) render: -> if @state.item content = timestamp(@state.item.lastMessageReceivedTimestamp) else content = "Loading..."
{content}
class ThreadList extends React.Component @displayName: 'ThreadList' @containerRequired: false @containerStyles: minWidth: 300 maxWidth: 999999 constructor: (@props) -> @state = style: 'unknown' componentWillMount: => c1 = new ListTabular.Column name: "★" resolver: (thread) => c2 = new ListTabular.Column name: "Participants" width: 200 resolver: (thread) => hasDraft = _.find (thread.metadata ? []), (m) -> m.draft if hasDraft
else c3LabelComponentCache = {} c3 = new ListTabular.Column name: "Message" flex: 4 resolver: (thread) => attachment = [] labels = [] hasAttachments = _.find (thread.metadata ? []), (m) -> m.files.length > 0 if hasAttachments attachment =
currentCategoryId = FocusedMailViewStore.mailView()?.categoryId() allCategoryId = CategoryStore.getStandardCategory('all')?.id ignoredIds = [currentCategoryId] ignoredIds.push(cat.id) for cat in CategoryStore.getHiddenCategories() for label in (thread.sortedLabels()) continue if label.id in ignoredIds c3LabelComponentCache[label.id] ?= labels.push c3LabelComponentCache[label.id] {labels} {subject(thread.subject)} {thread.snippet} {attachment} c4 = new ListTabular.Column name: "Date" resolver: (thread) => {timestamp(thread.lastMessageReceivedTimestamp)} c5 = new ListTabular.Column name: "HoverActions" resolver: (thread) => currentCategoryId = FocusedMailViewStore.mailView()?.categoryId() @wideColumns = [c1, c2, c3, c4, c5] cNarrow = new ListTabular.Column name: "Item" flex: 1 resolver: (thread) => pencil = [] attachment = [] hasDraft = _.find (thread.metadata ? []), (m) -> m.draft hasAttachments = _.find (thread.metadata ? []), (m) -> m.files.length > 0 if hasDraft pencil = if hasAttachments attachment =
{pencil} {attachment} {timestamp(thread.lastMessageReceivedTimestamp)}
{subject(thread.subject)}
{thread.snippet}
@narrowColumns = [cNarrow] @commands = 'core:remove-item': @_onArchive 'core:star-item': @_onStarItem 'core:remove-and-previous': -> Actions.archiveAndPrevious() 'core:remove-and-next': -> Actions.archiveAndNext() @itemPropsProvider = (item) -> className: classNames 'unread': item.unread 'data-thread-id': item.id componentDidMount: => window.addEventListener('resize', @_onResize, true) @_onResize() componentWillUnmount: => window.removeEventListener('resize', @_onResize, true) render: => if @state.style is 'wide' else if @state.style is 'narrow' else
_threadIdAtPoint: (x, y) -> item = document.elementFromPoint(event.clientX, event.clientY).closest('.list-item') return null unless item return item.dataset.threadId _onDragStart: (event) => itemThreadId = @_threadIdAtPoint(event.clientX, event.clientY) unless itemThreadId event.preventDefault() return if itemThreadId in ThreadListStore.view().selection.ids() dragThreadIds = ThreadListStore.view().selection.ids() else dragThreadIds = [itemThreadId] event.dataTransfer.effectAllowed = "move" event.dataTransfer.dragEffect = "move" canvas = CanvasUtils.canvasWithThreadDragImage(dragThreadIds.length) event.dataTransfer.setDragImage(canvas, 10, 10) event.dataTransfer.setData('nylas-thread-ids', JSON.stringify(dragThreadIds)) return _onDragEnd: (event) => _onResize: (event) => current = @state.style desired = if React.findDOMNode(@).offsetWidth < 540 then 'narrow' else 'wide' if current isnt desired @setState(style: desired) # Additional Commands _onStarItem: => return unless ThreadListStore.view() if WorkspaceStore.layoutMode() is "list" and WorkspaceStore.topSheet() is WorkspaceStore.Sheet.Thread Actions.toggleStarFocused() else if ThreadListStore.view().selection.count() > 0 Actions.toggleStarSelection() else Actions.toggleStarFocused() _onArchive: => return unless ThreadListStore.view() if WorkspaceStore.layoutMode() is "list" and WorkspaceStore.topSheet() is WorkspaceStore.Sheet.Thread Actions.archive() else if ThreadListStore.view().selection.count() > 0 Actions.archiveSelection() else Actions.archive() module.exports = ThreadList