mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-09-12 07:34:52 +08:00
Summary: Initial hooks for reply to message Per-message actions and reply to message! Always commit changes before openinig popout composer Flip message display - newest at bottom like Gmail WIP specs New activity bar inspector for deltas Don't allow long polling connection to restart after end() called A bit of activity bar refactoring and filter options, clear Include "On ... someone wrote" in replies / fw Slightly more robust quoted text removal, detects "On..." Abort request to really end it Additional specs for draft store Test Plan: Run 20 new tests! Reviewers: evan Reviewed By: evan Differential Revision: https://review.inboxapp.com/D1230
86 lines
2.6 KiB
CoffeeScript
86 lines
2.6 KiB
CoffeeScript
_ = require "underscore-plus"
|
|
React = require "react"
|
|
|
|
positions =
|
|
top:
|
|
transform: (state, event) ->
|
|
height: state.bcr.bottom - Math.max(5, event.pageY)
|
|
cursor: "ns-resize"
|
|
bottom:
|
|
transform: (state, event) ->
|
|
height: Math.max(state.initialHeight, event.pageY - state.bcr.top)
|
|
cursor: "ns-resize"
|
|
left:
|
|
transform: (state, event) ->
|
|
width: Math.max(5, state.bcr.right - event.pageX)
|
|
cursor: "ew-resize"
|
|
right:
|
|
transform: (state, event) ->
|
|
width: Math.max(5, - state.bcr.left + event.pageX)
|
|
cursor: "ew-resize"
|
|
|
|
module.exports = ResizableComponent =
|
|
React.createClass
|
|
displayName: 'ResizableComponent'
|
|
propTypes:
|
|
position: React.PropTypes.string
|
|
onResize: React.PropTypes.func
|
|
|
|
render: ->
|
|
position = @props?.position ? 'top'
|
|
h = @state.height ? @props.initialHeight
|
|
style = _.extend({}, @props.style ? {}, {height: h, width: @state.width})
|
|
<div style={style} className="resizable">
|
|
<div className={"resizeBar " + position} ref="resizeBar" style={@props.barStyle ? {}}/>
|
|
{@props.children}
|
|
</div>
|
|
|
|
getInitialState: ->
|
|
dragging: off
|
|
|
|
componentDidMount: ->
|
|
@refs.resizeBar.getDOMNode().addEventListener('mousedown', @_mouseDown)
|
|
|
|
componentWillReceiveProps: (nextProps) ->
|
|
if nextProps.initialHeight != @props.initialHeight
|
|
@setState(height: nextProps.initialHeight)
|
|
|
|
position: ->
|
|
positions[@props?.position ? 'top']
|
|
|
|
componentWillUnmount: ->
|
|
@refs.resizeBar.getDOMNode().removeEventListener('mousedown', @_mouseDown)
|
|
|
|
componentDidUpdate: (lastProps, lastState) ->
|
|
if lastState.dragging && !@state.dragging
|
|
document.body.style.cursor = ""
|
|
document.removeEventListener('mousemove', @_mouseMove)
|
|
document.removeEventListener('mouseup', @_mouseUp)
|
|
else if !lastState.dragging && @state.dragging
|
|
document.body.style.cursor = @position().cursor
|
|
document.addEventListener('mousemove', @_mouseMove)
|
|
document.addEventListener('mouseup', @_mouseUp)
|
|
|
|
_mouseDown: (event) ->
|
|
return if event.button != 0
|
|
bcr = @getDOMNode().getBoundingClientRect()
|
|
@setState
|
|
dragging: on
|
|
initialHeight: @state.initialHeight ? bcr.height
|
|
bcr: bcr
|
|
event.stopPropagation()
|
|
event.preventDefault()
|
|
|
|
_mouseUp: (event) ->
|
|
return if event.button != 0
|
|
@setState
|
|
dragging: off
|
|
@props.onResize(@state.height) if @props.onResize
|
|
event.stopPropagation()
|
|
event.preventDefault()
|
|
|
|
_mouseMove: (event) ->
|
|
return if !@state.dragging
|
|
@setState @position().transform(@state, event)
|
|
event.stopPropagation()
|
|
event.preventDefault()
|