Commit 091a4477 authored by Sean Roberts's avatar Sean Roberts

Adding support for onLayoutChange notifier configuration

parent 2cb95beb
...@@ -10,29 +10,26 @@ var settingsFrom = require('./settings'); ...@@ -10,29 +10,26 @@ var settingsFrom = require('./settings');
function configFrom(window_) { function configFrom(window_) {
var settings = settingsFrom(window_); var settings = settingsFrom(window_);
return { return {
annotations: settings.annotations,
// URL where client assets are served from. Used when injecting the client // URL where client assets are served from. Used when injecting the client
// into child iframes. // into child iframes.
assetRoot: settings.hostPageSetting('assetRoot', {allowInBrowserExt: true}), assetRoot: settings.hostPageSetting('assetRoot', {allowInBrowserExt: true}),
branding: settings.hostPageSetting('branding'),
// URL of the client's boot script. Used when injecting the client into // URL of the client's boot script. Used when injecting the client into
// child iframes. // child iframes.
clientUrl: settings.clientUrl, clientUrl: settings.clientUrl,
// Temporary feature flag override for 1st-party OAuth
annotations: settings.annotations, oauthEnabled: settings.hostPageSetting('oauthEnabled'),
branding: settings.hostPageSetting('branding'), onLayoutChange: settings.hostPageSetting('onLayoutChange'),
openLoginForm: settings.hostPageSetting('openLoginForm', {allowInBrowserExt: true}),
openSidebar: settings.hostPageSetting('openSidebar', {allowInBrowserExt: true}),
query: settings.query,
services: settings.hostPageSetting('services'), services: settings.hostPageSetting('services'),
showHighlights: settings.showHighlights, showHighlights: settings.showHighlights,
sidebarAppUrl: settings.sidebarAppUrl, sidebarAppUrl: settings.sidebarAppUrl,
// Subframe identifier given when a frame is being embedded into // Subframe identifier given when a frame is being embedded into
// by a top level client // by a top level client
subFrameIdentifier: settings.hostPageSetting('subFrameIdentifier', {allowInBrowserExt: true}), subFrameIdentifier: settings.hostPageSetting('subFrameIdentifier', {allowInBrowserExt: true}),
openLoginForm: settings.hostPageSetting('openLoginForm', {allowInBrowserExt: true}),
openSidebar: settings.hostPageSetting('openSidebar', {allowInBrowserExt: true}),
query: settings.query,
// Temporary feature flag override for 1st-party OAuth
oauthEnabled: settings.hostPageSetting('oauthEnabled'),
}; };
} }
......
...@@ -5,8 +5,8 @@ Hammer = require('hammerjs') ...@@ -5,8 +5,8 @@ Hammer = require('hammerjs')
Host = require('./host') Host = require('./host')
annotationCounts = require('./annotation-counts') annotationCounts = require('./annotation-counts')
sidebarTrigger = require('./sidebar-trigger') sidebarTrigger = require('./sidebar-trigger')
events = require('../shared/bridge-events'); events = require('../shared/bridge-events')
features = require('./features'); features = require('./features')
# Minimum width to which the frame can be resized. # Minimum width to which the frame can be resized.
MIN_RESIZE = 280 MIN_RESIZE = 280
...@@ -35,6 +35,7 @@ module.exports = class Sidebar extends Host ...@@ -35,6 +35,7 @@ module.exports = class Sidebar extends Host
@plugins.BucketBar.element.on 'click', (event) => this.show() @plugins.BucketBar.element.on 'click', (event) => this.show()
if @plugins.Toolbar? if @plugins.Toolbar?
@toolbarWidth = parseInt(window.getComputedStyle(this.plugins.Toolbar.toolbar[0]).width)
this._setupGestures() this._setupGestures()
# The partner-provided callback functions. # The partner-provided callback functions.
...@@ -46,6 +47,11 @@ module.exports = class Sidebar extends Host ...@@ -46,6 +47,11 @@ module.exports = class Sidebar extends Host
@onProfileRequest = serviceConfig.onProfileRequest @onProfileRequest = serviceConfig.onProfileRequest
@onHelpRequest = serviceConfig.onHelpRequest @onHelpRequest = serviceConfig.onHelpRequest
@onLayoutChange = config.onLayoutChange
# initial layout notification
this._notifyOfLayoutChange(false)
this._setupSidebarEvents() this._setupSidebarEvents()
_setupSidebarEvents: -> _setupSidebarEvents: ->
...@@ -58,23 +64,23 @@ module.exports = class Sidebar extends Host ...@@ -58,23 +64,23 @@ module.exports = class Sidebar extends Host
@crossframe.on(events.LOGIN_REQUESTED, => @crossframe.on(events.LOGIN_REQUESTED, =>
if @onLoginRequest if @onLoginRequest
@onLoginRequest() @onLoginRequest()
); )
@crossframe.on(events.LOGOUT_REQUESTED, => @crossframe.on(events.LOGOUT_REQUESTED, =>
if @onLogoutRequest if @onLogoutRequest
@onLogoutRequest() @onLogoutRequest()
); )
@crossframe.on(events.SIGNUP_REQUESTED, => @crossframe.on(events.SIGNUP_REQUESTED, =>
if @onSignupRequest if @onSignupRequest
@onSignupRequest() @onSignupRequest()
); )
@crossframe.on(events.PROFILE_REQUESTED, => @crossframe.on(events.PROFILE_REQUESTED, =>
if @onProfileRequest if @onProfileRequest
@onProfileRequest() @onProfileRequest()
); )
@crossframe.on(events.HELP_REQUESTED, => @crossframe.on(events.HELP_REQUESTED, =>
if @onHelpRequest if @onHelpRequest
@onHelpRequest() @onHelpRequest()
); )
# Return this for chaining # Return this for chaining
this this
...@@ -120,6 +126,46 @@ module.exports = class Sidebar extends Host ...@@ -120,6 +126,46 @@ module.exports = class Sidebar extends Host
w = -m w = -m
@frame.css('margin-left', "#{m}px") @frame.css('margin-left', "#{m}px")
if w >= MIN_RESIZE then @frame.css('width', "#{w}px") if w >= MIN_RESIZE then @frame.css('width', "#{w}px")
this._notifyOfLayoutChange()
_notifyOfLayoutChange: (explicitExpandedState) =>
toolbarWidth = @toolbarWidth || 0
if @onLayoutChange
rect = @frame[0].getBoundingClientRect()
computedStyle = window.getComputedStyle(@frame[0])
width = parseInt(computedStyle.width)
leftMargin = parseInt(computedStyle.marginLeft)
# the lowest bound still shows the toolbar so setting the default/lower
# bound to the width of the toolbar and expand the width form here
frameVisbileWidth = toolbarWidth
if explicitExpandedState?
# When we are explicitly saying to open or close, jump
# straight to the upper and lower bounding widths.
if explicitExpandedState
frameVisbileWidth += width
else
if leftMargin < MIN_RESIZE
# When the width hits its threshold of MIN_RESIZE,
# the left margin continues to push the sidebar off screen.
# So it's the best indicator of width when we get below that threshold.
# Note: when we hit the right edge, it will be -0
frameVisbileWidth += -leftMargin
else
frameVisbileWidth += width
# Since we have added logic on if this is a expclicit show/hide
# and applied proper width to the visible value above, we can infer
# expanded state on that width value vs the lower bound
expanded = frameVisbileWidth > toolbarWidth
@onLayoutChange({
expanded: expanded,
width: if expanded then frameVisbileWidth else toolbarWidth,
height: rect.height,
})
onPan: (event) => onPan: (event) =>
switch event.type switch event.type
...@@ -176,6 +222,8 @@ module.exports = class Sidebar extends Host ...@@ -176,6 +222,8 @@ module.exports = class Sidebar extends Host
if @options.showHighlights == 'whenSidebarOpen' if @options.showHighlights == 'whenSidebarOpen'
@setVisibleHighlights(true) @setVisibleHighlights(true)
this._notifyOfLayoutChange(true)
hide: -> hide: ->
@frame.css 'margin-left': '' @frame.css 'margin-left': ''
@frame.addClass 'annotator-collapsed' @frame.addClass 'annotator-collapsed'
...@@ -188,6 +236,8 @@ module.exports = class Sidebar extends Host ...@@ -188,6 +236,8 @@ module.exports = class Sidebar extends Host
if @options.showHighlights == 'whenSidebarOpen' if @options.showHighlights == 'whenSidebarOpen'
@setVisibleHighlights(false) @setVisibleHighlights(false)
this._notifyOfLayoutChange(false)
isOpen: -> isOpen: ->
!@frame.hasClass('annotator-collapsed') !@frame.hasClass('annotator-collapsed')
......
events = require('../../shared/bridge-events') events = require('../../shared/bridge-events')
proxyquire = require('proxyquire') proxyquire = require('proxyquire')
Sidebar = proxyquire('../sidebar', {})
rafStub = (fn) ->
fn()
Sidebar = proxyquire('../sidebar', { raf: rafStub })
describe 'Sidebar', -> describe 'Sidebar', ->
sandbox = sinon.sandbox.create() sandbox = sinon.sandbox.create()
...@@ -253,3 +257,67 @@ describe 'Sidebar', -> ...@@ -253,3 +257,67 @@ describe 'Sidebar', ->
assert.calledWith(fakeCrossFrame.call, 'setVisibleHighlights', true) assert.calledWith(fakeCrossFrame.call, 'setVisibleHighlights', true)
assert.calledWith(sidebar.publish, 'setVisibleHighlights', true) assert.calledWith(sidebar.publish, 'setVisibleHighlights', true)
describe 'layout change notifier', ->
layoutChangeHandlerSpy = null
sidebar = null
frame = null
DEFAULT_WIDTH = 350
DEFAULT_HEIGHT = 600
assertLayoutValues = (args, expectations) ->
expected = Object.assign {
width: DEFAULT_WIDTH,
height: DEFAULT_HEIGHT,
expanded: true
}, expectations
assert.deepEqual args, expected
beforeEach ->
layoutChangeHandlerSpy = sandbox.spy()
sidebar = createSidebar { onLayoutChange: layoutChangeHandlerSpy, sidebarAppUrl: '/' }
# remove info about call that happens on creation of sidebar
layoutChangeHandlerSpy.reset()
frame = sidebar.frame[0]
Object.assign frame.style, {
display: 'block',
width: DEFAULT_WIDTH + 'px',
height: DEFAULT_HEIGHT + 'px',
# width is based on left position of the window,
# we need to apply the css that puts the frame in the
# correct position
position: 'fixed',
top: 0,
left: '100%',
}
document.body.appendChild frame
afterEach ->
frame.remove()
it 'notifies when sidebar changes expanded state', ->
sidebar.show()
assert.calledOnce layoutChangeHandlerSpy
assertLayoutValues layoutChangeHandlerSpy.lastCall.args[0], {expanded: true}
sidebar.hide()
assert.calledTwice layoutChangeHandlerSpy
assertLayoutValues layoutChangeHandlerSpy.lastCall.args[0], {
expanded: false,
width: 0,
}
it 'notifies when sidebar is panned left', ->
sidebar.gestureState = { initial: -DEFAULT_WIDTH }
sidebar.onPan({type: 'panleft', deltaX: -50})
assertLayoutValues layoutChangeHandlerSpy.lastCall.args[0], { width: 400 }
it 'notifies when sidebar is panned right', ->
sidebar.gestureState = { initial: -DEFAULT_WIDTH }
sidebar.onPan({type: 'panright', deltaX: 50})
assertLayoutValues layoutChangeHandlerSpy.lastCall.args[0], { width: 300 }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment