BigW Consortium Gitlab

build.coffee 2.99 KB
class @CiBuild
  @interval: null
  @state: null

  constructor: (@build_url, @build_status, @state) ->
    clearInterval(CiBuild.interval)

    # Init breakpoint checker
    @bp = Breakpoints.get()
    @hideSidebar()
    $('.js-build-sidebar').niceScroll()
    $(document)
      .off 'click', '.js-sidebar-build-toggle'
      .on 'click', '.js-sidebar-build-toggle', @toggleSidebar

    $(window)
      .off 'resize.build'
      .on 'resize.build', @hideSidebar

    if $('#build-trace').length
      @getInitialBuildTrace()
      @initScrollButtonAffix()

    if @build_status is "running" or @build_status is "pending"
      #
      # Bind autoscroll button to follow build output
      #
      $('#autoscroll-button').on 'click', ->
        state = $(this).data("state")
        if "enabled" is state
          $(this).data "state", "disabled"
          $(this).text "enable autoscroll"
        else
          $(this).data "state", "enabled"
          $(this).text "disable autoscroll"

      #
      # Check for new build output if user still watching build page
      # Only valid for runnig build when output changes during time
      #
      CiBuild.interval = setInterval =>
        if window.location.href.split("#").first() is @build_url
          @getBuildTrace()
      , 4000

  getInitialBuildTrace: ->
    $.ajax
      url: @build_url
      dataType: 'json'
      success: (build_data) ->
        $('.js-build-output').html build_data.trace_html

        if build_data.status is 'success' or build_data.status is 'failed'
          $('.js-build-refresh').remove()

  getBuildTrace: ->
    $.ajax
      url: "#{@build_url}/trace.json?state=#{encodeURIComponent(@state)}"
      dataType: "json"
      success: (log) =>
        if log.state
          @state = log.state

        if log.status is "running"
          if log.append
            $('.js-build-output').append log.html
          else
            $('.js-build-output').html log.html
          @checkAutoscroll()
        else if log.status isnt @build_status
          Turbolinks.visit @build_url

  checkAutoscroll: ->
    $("html,body").scrollTop $("#build-trace").height()  if "enabled" is $("#autoscroll-button").data("state")

  initScrollButtonAffix: ->
    $buildScroll = $('#js-build-scroll')
    $body = $('body')
    $buildTrace = $('#build-trace')

    $buildScroll.affix(
      offset:
        bottom: ->
          $body.outerHeight() - ($buildTrace.outerHeight() + $buildTrace.offset().top)
    )

  shouldHideSidebar: ->
    bootstrapBreakpoint = @bp.getBreakpointSize()

    bootstrapBreakpoint is 'xs' or bootstrapBreakpoint is 'sm'

  toggleSidebar: =>
    if @shouldHideSidebar()
      $('.js-build-sidebar')
        .toggleClass 'right-sidebar-expanded right-sidebar-collapsed'

  hideSidebar: =>
    if @shouldHideSidebar()
      $('.js-build-sidebar')
        .removeClass 'right-sidebar-expanded'
        .addClass 'right-sidebar-collapsed'
    else
      $('.js-build-sidebar')
        .removeClass 'right-sidebar-collapsed'
        .addClass 'right-sidebar-expanded'