summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/ci/build.coffee
blob: 2d515d7efa271213675f9e4f6892c67491d4249b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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

    @updateArtifactRemoveDate()

    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'

  updateArtifactRemoveDate: ->
    $date = $('.js-artifacts-remove')

    if $date.length
      date = $date.text()
      $date.text $.timefor(new Date(date), ' ')