123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- class Sidebar extends Class
- constructor: ->
- @tag = null
- @container = null
- @opened = false
- @width = 410
- @fixbutton = $(".fixbutton")
- @fixbutton_addx = 0
- @fixbutton_initx = 0
- @fixbutton_targetx = 0
- @frame = $("#inner-iframe")
- @initFixbutton()
- @dragStarted = 0
- @globe = null
- @original_set_site_info = wrapper.setSiteInfo # We going to override this, save the original
- # Start in opened state for debugging
- if false
- @startDrag()
- @moved()
- @fixbutton_targetx = @fixbutton_initx - @width
- @stopDrag()
- initFixbutton: ->
- # Detect dragging
- @fixbutton.on "mousedown", (e) =>
- e.preventDefault()
- # Disable previous listeners
- @fixbutton.off "click"
- @fixbutton.off "mousemove"
- # Make sure its not a click
- @dragStarted = (+ new Date)
- @fixbutton.one "mousemove", (e) =>
- @fixbutton_addx = @fixbutton.offset().left-e.pageX
- @startDrag()
- @fixbutton.parent().on "click", (e) =>
- @stopDrag()
- @fixbutton_initx = @fixbutton.offset().left # Initial x position
- # Start dragging the fixbutton
- startDrag: ->
- @log "startDrag"
- @fixbutton_targetx = @fixbutton_initx # Fallback x position
- @fixbutton.addClass("dragging")
- # Fullscreen drag bg to capture mouse events over iframe
- $("<div class='drag-bg'></div>").appendTo(document.body)
- # IE position wrap fix
- if navigator.userAgent.indexOf('MSIE') != -1 or navigator.appVersion.indexOf('Trident/') > 0
- @fixbutton.css("pointer-events", "none")
- # Don't go to homepage
- @fixbutton.one "click", (e) =>
- @stopDrag()
- @fixbutton.removeClass("dragging")
- if Math.abs(@fixbutton.offset().left - @fixbutton_initx) > 5
- # If moved more than some pixel the button then don't go to homepage
- e.preventDefault()
- # Animate drag
- @fixbutton.parents().on "mousemove", @animDrag
- @fixbutton.parents().on "mousemove" ,@waitMove
- # Stop dragging listener
- @fixbutton.parents().on "mouseup", (e) =>
- e.preventDefault()
- @stopDrag()
- # Wait for moving the fixbutton
- waitMove: (e) =>
- if Math.abs(@fixbutton.offset().left - @fixbutton_targetx) > 10 and (+ new Date)-@dragStarted > 100
- @moved()
- @fixbutton.parents().off "mousemove" ,@waitMove
- moved: ->
- @log "Moved"
- @createHtmltag()
- $(document.body).css("perspective", "1000px").addClass("body-sidebar")
- $(window).off "resize"
- $(window).on "resize", =>
- $(document.body).css "height", $(window).height()
- @scrollable()
- $(window).trigger "resize"
- # Override setsiteinfo to catch changes
- wrapper.setSiteInfo = (site_info) =>
- @setSiteInfo(site_info)
- @original_set_site_info.apply(wrapper, arguments)
- setSiteInfo: (site_info) ->
- @updateHtmlTag()
- @displayGlobe()
- # Create the sidebar html tag
- createHtmltag: ->
- if not @container
- @container = $("""
- <div class="sidebar-container"><div class="sidebar scrollable"><div class="content-wrapper"><div class="content">
- </div></div></div></div>
- """)
- @container.appendTo(document.body)
- @tag = @container.find(".sidebar")
- @updateHtmlTag()
- @scrollable = window.initScrollable()
- updateHtmlTag: ->
- wrapper.ws.cmd "sidebarGetHtmlTag", {}, (res) =>
- if @tag.find(".content").children().length == 0 # First update
- @log "Creating content"
- morphdom(@tag.find(".content")[0], '<div class="content">'+res+'</div>')
- @scrollable()
- else # Not first update, patch the html to keep unchanged dom elements
- @log "Patching content"
- morphdom @tag.find(".content")[0], '<div class="content">'+res+'</div>', {
- onBeforeMorphEl: (from_el, to_el) -> # Ignore globe loaded state
- if from_el.className == "globe"
- return false
- else
- return true
- }
- animDrag: (e) =>
- mousex = e.pageX
- overdrag = @fixbutton_initx-@width-mousex
- if overdrag > 0 # Overdragged
- overdrag_percent = 1+overdrag/300
- mousex = (e.pageX + (@fixbutton_initx-@width)*overdrag_percent)/(1+overdrag_percent)
- targetx = @fixbutton_initx-mousex-@fixbutton_addx
- @fixbutton.offset
- left: mousex+@fixbutton_addx
- if @tag
- @tag.css("transform", "translateX(#{0-targetx}px)")
- # Check if opened
- if (not @opened and targetx > @width/3) or (@opened and targetx > @width*0.9)
- @fixbutton_targetx = @fixbutton_initx - @width # Make it opened
- else
- @fixbutton_targetx = @fixbutton_initx
- # Stop dragging the fixbutton
- stopDrag: ->
- @fixbutton.parents().off "mousemove"
- @fixbutton.off "mousemove"
- @fixbutton.css("pointer-events", "")
- $(".drag-bg").remove()
- if not @fixbutton.hasClass("dragging")
- return
- @fixbutton.removeClass("dragging")
- # Move back to initial position
- if @fixbutton_targetx != @fixbutton.offset().left
- # Animate fixbutton
- @fixbutton.stop().animate {"left": @fixbutton_targetx}, 500, "easeOutBack", =>
- # Switch back to auto align
- if @fixbutton_targetx == @fixbutton_initx # Closed
- @fixbutton.css("left", "auto")
- else # Opened
- @fixbutton.css("left", @fixbutton_targetx)
- $(".fixbutton-bg").trigger "mouseout" # Switch fixbutton back to normal status
- # Animate sidebar and iframe
- if @fixbutton_targetx == @fixbutton_initx
- # Closed
- targetx = 0
- @opened = false
- else
- # Opened
- targetx = @width
- if not @opened
- @onOpened()
- @opened = true
- # Revent sidebar transitions
- @tag.css("transition", "0.4s ease-out")
- @tag.css("transform", "translateX(-#{targetx}px)").one transitionEnd, =>
- @tag.css("transition", "")
- if not @opened
- @container.remove()
- @container = null
- @tag.remove()
- @tag = null
- # Revert body transformations
- @log "stopdrag", "opened:", @opened
- if not @opened
- @onClosed()
- onOpened: ->
- @log "Opened"
- @scrollable()
- # Re-calculate height when site admin opened or closed
- @tag.find("#checkbox-owned").off("click").on "click", =>
- setTimeout (=>
- @scrollable()
- ), 300
- # Site limit button
- @tag.find("#button-sitelimit").on "click", =>
- wrapper.ws.cmd "siteSetLimit", $("#input-sitelimit").val(), =>
- wrapper.notifications.add "done-sitelimit", "done", "Site storage limit modified!", 5000
- @updateHtmlTag()
- return false
- # Change identity button
- @tag.find("#button-identity").on "click", =>
- wrapper.ws.cmd "certSelect"
- return false
- # Owned checkbox
- @tag.find("#checkbox-owned").on "click", =>
- wrapper.ws.cmd "siteSetOwned", [@tag.find("#checkbox-owned").is(":checked")]
- # Save settings
- @tag.find("#button-settings").on "click", =>
- wrapper.ws.cmd "fileGet", "content.json", (res) =>
- data = JSON.parse(res)
- data["title"] = $("#settings-title").val()
- data["description"] = $("#settings-description").val()
- json_raw = unescape(encodeURIComponent(JSON.stringify(data, undefined, '\t')))
- wrapper.ws.cmd "fileWrite", ["content.json", btoa(json_raw)], (res) =>
- if res != "ok" # fileWrite failed
- wrapper.notifications.add "file-write", "error", "File write error: #{res}"
- else
- wrapper.notifications.add "file-write", "done", "Site settings saved!", 5000
- @updateHtmlTag()
- return false
- # Sign content.json
- @tag.find("#button-sign").on "click", =>
- inner_path = @tag.find("#select-contents").val()
- if wrapper.site_info.privatekey
- # Privatekey stored in users.json
- wrapper.ws.cmd "siteSign", ["stored", inner_path], (res) =>
- wrapper.notifications.add "sign", "done", "#{inner_path} Signed!", 5000
- else
- # Ask the user for privatekey
- wrapper.displayPrompt "Enter your private key:", "password", "Sign", (privatekey) => # Prompt the private key
- wrapper.ws.cmd "siteSign", [privatekey, inner_path], (res) =>
- if res == "ok"
- wrapper.notifications.add "sign", "done", "#{inner_path} Signed!", 5000
- return false
- # Publish content.json
- @tag.find("#button-publish").on "click", =>
- inner_path = @tag.find("#select-contents").val()
- @tag.find("#button-publish").addClass "loading"
- wrapper.ws.cmd "sitePublish", {"inner_path": inner_path, "sign": false}, =>
- @tag.find("#button-publish").removeClass "loading"
- @loadGlobe()
- onClosed: ->
- $(window).off "resize"
- $(document.body).css("transition", "0.6s ease-in-out").removeClass("body-sidebar").on transitionEnd, (e) =>
- if e.target == document.body
- $(document.body).css("height", "auto").css("perspective", "").css("transition", "").off transitionEnd
- @unloadGlobe()
- # We dont need site info anymore
- wrapper.setSiteInfo = @original_set_site_info
- loadGlobe: =>
- if @tag.find(".globe").hasClass("loading")
- setTimeout (=>
- if typeof(DAT) == "undefined" # Globe script not loaded, do it first
- $.getScript("/uimedia/globe/all.js", @displayGlobe)
- else
- @displayGlobe()
- ), 600
- displayGlobe: =>
- wrapper.ws.cmd "sidebarGetPeers", [], (globe_data) =>
- if @globe
- @globe.scene.remove(@globe.points)
- @globe.addData( globe_data, {format: 'magnitude', name: "hello", animated: false} )
- @globe.createPoints()
- else
- @globe = new DAT.Globe( @tag.find(".globe")[0], {"imgDir": "/uimedia/globe/"} )
- @globe.addData( globe_data, {format: 'magnitude', name: "hello"} )
- @globe.createPoints()
- @globe.animate()
- @tag.find(".globe").removeClass("loading")
- unloadGlobe: =>
- if not @globe
- return false
- @globe.unload()
- @globe = null
- window.sidebar = new Sidebar()
- window.transitionEnd = 'transitionend webkitTransitionEnd oTransitionEnd otransitionend'
|