home/billing: modify plan titles

home/billing: modify plan titles

Signed-off-by: Umut Sirin <4055abbc0e40a1254e715b952ccd414607e0b365@gmail.com>

--- client/home/lib/billing/components/subscriptioncontainer.coffee
+++ client/home/lib/billing/components/subscriptioncontainer.coffee
@@ -17,11 +17,13 @@
   subscription.planAmount
   info.userCount
   (amount, userCount) ->
-    name = "$#{amount.dollars} Plan"
-    type = if userCount is 1 then 'Solo' else userCount
-    pluralized = pluralize 'Developer', userCount
+    name = "$#{amount.toString()} Plan"

-    return "#{name} (#{type} #{pluralized})"
+    type = if userCount is 1 then 'Solo'
+    else if userCount <= 10 then 'Single Cloud'
+    else 'Dev Team'
+
+    return "#{name} (#{type})"
 )


Changed arrow keybinding in message popups

Message popups are invoked in chat window, when selecting channel suggestions, emoji, and more.
Before:
- suggestion is moved up/down on keyup
- long holding does nothing

Now:
- suggestion moves on keydown, which feels much more natural, as it fits behaviour from other parts of OS
- long holding cycles through all options

--- packages/rocketchat-ui-message/message/popup/messagePopup.coffee
+++ packages/rocketchat-ui-message/message/popup/messagePopup.coffee
@@ -1,3 +1,15 @@
+# This is not supposed to be a complete list
+# it is just to improve readability in this file
+keys = {
+	TAB: 9
+	ENTER: 13
+	ESC: 27
+	ARROW_LEFT: 37
+	ARROW_UP: 38
+	ARROW_RIGHT: 39
+	ARROW_DOWN: 40
+}
+
 getCursorPosition = (input) ->
 	if not input? then return
 	if input.selectionStart?
@@ -84,24 +96,29 @@
 		if template.open.curValue isnt true or template.hasData.curValue isnt true
 			return

-		if event.which in [38, 40]
+		if event.which in [keys.ARROW_UP, keys.ARROW_DOWN]
 			event.preventDefault()
 			event.stopPropagation()

-		if event.which in [13, 9]
+		if event.which in [keys.ENTER, keys.TAB]
 			template.open.set false

 			template.enterValue()

 			event.preventDefault()
 			event.stopPropagation()
+
+		if event.which is keys.ARROW_UP
+			template.up()
+		else if event.which is keys.ARROW_DOWN
+			template.down()

 	template.setTextFilter = _.debounce (value) ->
 		template.textFilter.set(value)
 	, template.textFilterDelay

 	template.onInputKeyup = (event) =>
-		if template.open.curValue is true and event.which is 27
+		if template.open.curValue is true and event.which is keys.ESC
 			template.open.set false
 			event.preventDefault()
 			event.stopPropagation()
@@ -119,11 +136,7 @@
 		if template.open.curValue isnt true
 			return

-		if event.which is 38
-			template.up()
-		else if event.which is 40
-			template.down()
-		else
+		if event.which not in [keys.ARROW_UP, keys.ARROW_DOWN]
 			Meteor.defer =>
 				template.verifySelection()


add dice-rolling script

add dice-rolling script

error: pathspec 'src/scripts/dice.coffee' did not match any file(s) known to git

--- src/scripts/dice.coffee
+++ src/scripts/dice.coffee
@@ -0,0 +1,38 @@
+# Allows Hubot to roll dice.
+#
+# roll dice - Roll two six-sided dice.
+#
+# roll <x>d<y> - roll x dice, each of which has y sides.
+
+module.exports = (robot) ->
+  robot.respond /roll dice/i, (msg) ->
+    msg.send report roll 2, 6
+  robot.respond /roll (\d+)d(\d+)/i, (msg) ->
+    dice = parseInt msg.match[1]
+    sides = parseInt msg.match[2]
+    answer = if sides < 1
+      "I don't know how to roll a zero-sided die."
+    else if dice > 100
+      "I'm not going to roll more than 100 dice for you."
+    else
+      report roll dice, sides
+    msg.send answer
+
+report = (results) ->
+  if results?
+    switch results.length
+      when 0
+        "I didn't roll any dice."
+      when 1
+        "I rolled a #{results[0]}."
+      else
+        total = results.reduce (x, y) -> x + y
+        finalComma = if (results.length > 2) then "," else ""
+        last = results.pop()
+        "I rolled #{results.join(", ")}#{finalComma} and #{last}, making #{total}."
+
+roll = (dice, sides) ->
+  rollOne(sides) for i in [0...dice]
+
+rollOne = (sides) ->
+  1 + Math.floor(Math.random() * sides)


Fixed typo in hub.stop : extensions.start was called instead of extensions.stop

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nanoko-project/h-ubu.git/'


refresh formula evaluation on widget reload

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xaun/impac-angular.git/'


Removed unnecessary comments.

Removed unnecessary comments.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bewitchingme/gleam.git/'


Update button selector

Update button selector

--- app/assets/javascripts/merge_request_tabs.js.coffee
+++ app/assets/javascripts/merge_request_tabs.js.coffee
@@ -181,7 +181,7 @@

   # Returns diff view type
   diffViewType: ->
-    $('.diffs a[id$="-diff-btn"].active').data('view-type')
+    $('.inline-parallel-buttons a.active').data('view-type')

   expandViewContainer: ->
     $('.container-fluid').removeClass('container-limited')


hound happy.

hound happy.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mokhan/surface.git/'


[test,tool] helper module to fill queue with test jobs

error: pathspec 'test/job-creator.coffee' did not match any file(s) known to git

--- test/job-creator.coffee
+++ test/job-creator.coffee
@@ -0,0 +1,37 @@
+Queue = require "bull"
+redis = require "redis"
+log   = console.log.bind console
+
+
+class JobCreator
+  constructor: ->
+    @proteins = "carnitas brisket camarones".split " "
+    @salsas   = "habanero chipotle tomatillo".split " "
+    @client   = redis.createClient()
+    @queue    = Queue "tacos"
+
+    @queue.process @cookTaco
+
+  cookTaco: (job, done) ->
+    {data} = job
+    {protein, salsa, cooktime, orderNumber} = data
+    log "##{orderNumber}: #{protein}, #{salsa} cooking for #{(cooktime/1000).toFixed 2}s"
+    wake = ->
+      log "##{orderNumber}: #{protein}, #{salsa} served"
+      done()
+    setTimeout wake, cooktime
+
+  makeJob: (orderNumber) ->
+    protein  = @proteins[Math.floor Math.random() * 3]
+    salsa    = @salsas[Math.floor Math.random() * 3]
+    cooktime = Math.random() * 10 * 1000
+
+    log "ordering taco ##{orderNumber} #{protein}, #{salsa} with cooktime #{(cooktime/1000).toFixed 2}s"
+    @queue.add {protein, salsa, cooktime, orderNumber}
+
+  keepMaking10PacksOfTacos: (num = 1) ->
+    @makeJob i for i in [num..num+10]
+    setTimeout (=> @keepMaking10PacksOfTacos ++num), 15 * 1000
+
+
+module.exports = JobCreator


Show message if pending licences

Show message if pending licences

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


Ignore abnormal response

Ignore abnormal response

--- views/env.coffee
+++ views/env.coffee
@@ -406,7 +406,7 @@
   locked = false
 proxy.addListener 'game.on.response', (method, path, body, postBody) ->
   # Invalid response
-  return if body.api_result is 100
+  return if body.api_result isnt 1
   body = body.api_data if body.api_data?
   responses.push [method, path, body, postBody]
   resolveResponses() if !locked


Uncomment header in fa.coffee

Uncomment header in fa.coffee

--- app/locale/fa.coffee
+++ app/locale/fa.coffee
@@ -1,5 +1,5 @@
 module.exports = nativeDescription: "فارسی", englishDescription: "Persian", translation:
-#  new_home:
+  new_home:
     slogan: "بهترین بازی برای یاد گرفتن برنامه نویسی"
 #    classroom_edition: "Classroom Edition:"
 #    learn_to_code: "Learn to code:"


Update vi.coffee

Update vi.coffee

Fix bug on line 1150:
Line 1234: edit a few word
Line 665: thuê bao -> gói đăng ký

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/VilkkuV/codecombat.git/'


Adds ExpressionEquality library

Adds ExpressionEquality library

error: pathspec 'javascripts/lib/math/expression_equality.coffee' did not match any file(s) known to git

--- javascripts/lib/math/expression_equality.coffee
+++ javascripts/lib/math/expression_equality.coffee
@@ -0,0 +1,65 @@
+#= require lib
+#= require lib/math/expression_components
+#= require lib/math/expression_equality
+#= require almond_wrapper
+
+ttm.define 'lib/math/expression_equality',
+  ['lib/class_mixer', 'lib/object_refinement', 'lib/math/expression_components'],
+  (class_mixer, object_refinement, comps)->
+    ref = object_refinement.build()
+
+
+    buildIsEqual = (for_type)->
+      (other)->
+        if other instanceof for_type
+          @_simpleIsEqual(other)
+        else if other instanceof comps.expression
+          ref.refine(other).isEqual @
+        else
+          false
+
+    ref.forType(comps.expression, {
+      isExpressionEqual: (other)->
+        if _(@expression).size() == _(@expression).size()
+          contains_unequal =
+            _.chain(@expression).map((element, i)->
+              ref.refine(element).isEqual(other.nth(i))
+            ).contains(false).value()
+          !contains_unequal
+        else
+          false
+
+      isNonExpressionEqual: (other)->
+        @size() == 1 && ref.refine(@first()).isEqual(other)
+
+      isEqual: (other)->
+        if other instanceof comps.expression
+          @isExpressionEqual(other)
+        else
+          @isNonExpressionEqual(other)
+    })
+
+    ref.forType(comps.number, {
+      isEqual: (buildIsEqual(comps.number)),
+      _simpleIsEqual: (other)->
+        @value() == other.value()
+    })
+
+    ref.forType(comps.addition, {
+      isEqual: (buildIsEqual(comps.addition)),
+      _simpleIsEqual: (other)-> true # two additions are always equal to one another
+      })
+
+    class ExpressionEquality
+      initialize: (@first)->
+      isEqual: (@second)->
+        firstp = ref.refine @first
+        firstp.isEqual @second
+
+
+    class_mixer ExpressionEquality
+
+    ExpressionEquality.isEqual = (a,b)->
+      ExpressionEquality.build(a).isEqual(b)
+
+    return ExpressionEquality


Fix wrong check on overlay setter

Fix wrong check on overlay setter

Previously checked class exists even though the upload button doesn't.

--- resources/assets/coffee/_classes/forum-cover.coffee
+++ resources/assets/coffee/_classes/forum-cover.coffee
@@ -118,7 +118,7 @@

   setOverlay: (targetState) =>
-    return unless @header.length
+    return unless @hasCoverEditor()

     return if targetState == @overlay[0].getAttribute('data-state')


initial repository.coffee - commit.

initial repository.coffee - commit.

CoffeeScript, http://coffeescript.org/
npm install -g coffee-script

error: pathspec 'source/API/code/assets/coffee/lib/repository.coffee' did not match any file(s) known to git

--- source/API/code/assets/coffee/lib/repository.coffee
+++ source/API/code/assets/coffee/lib/repository.coffee
@@ -0,0 +1,5 @@
+###!
+# api.prabhatkumar.org® [v0.0.1]
+# @author    : Prabhat Kumar [http://prabhatkumar.org/]
+# @copyright : Prabhat Kumar [http://prabhatkumar.org/]
+###


Fixed updating the sprite sheets in the thang type editor.

--- app/models/ThangType.coffee
+++ app/models/ThangType.coffee
@@ -22,6 +22,7 @@
   resetSpriteSheetCache: ->
     @buildActions()
     @spriteSheets = {}
+    @building = {}

   getActions: ->
     return @actions or @buildActions()
@@ -138,10 +139,12 @@
     console.warn 'Building', @get('name'), 'and blocking the main thread.'
     spriteSheet = @builder.build()
     @spriteSheets[key] = spriteSheet
+    delete @building[key]
     spriteSheet

   onBuildSpriteSheetComplete: (e, key) ->
     @spriteSheets[key] = e.target.spriteSheet
+    delete @building[key]
     @trigger 'build-complete'
     @builder = null
     @vectorParser = null


Various fixes.

Various fixes.

--- app/modules/vm/index.coffee
+++ app/modules/vm/index.coffee
@@ -62,7 +62,7 @@
             () => this.stop(),
             this.baseTimeOut
           )
-          return $scope.refreshStats($scope.VM.UUID)
+          return $scope.refreshStats($scope.VM.id)
           .then () => this._reset()
           .catch (err) =>
             if !this.running || this.attempt >= 2 || $scope.VM.power_state isnt 'Running' || $scope.isVMWorking($scope.VM)
@@ -88,6 +88,8 @@

     $scope.hosts = xoApi.getView('hosts')

+    srsByContainer = xoApi.getIndex('srsByContainer')
+
     $scope.$watch(
       -> get $stateParams.id, 'VM'
       (VM) ->
@@ -112,7 +114,7 @@

           VDIs.push oVdi if oVdi and not oVbd.is_cd_drive
           if oVbd.is_cd_drive and oVdi # "Load" the cd drive
-            mountedIso = oVdi.UUID
+            mountedIso = oVdi.id

         $scope.VDIs = _sortBy(VDIs, (value) -> (get resolveVBD(value))?.position);

@@ -127,13 +129,16 @@

         $scope.networks = get pool.networks

-        default_SR = get pool.default_SR
-        default_SR = if default_SR
-          default_SR.UUID
-        else
-          ''
-
-        SRs = $scope.SRs = get (merge pool.SRs, host.SRs)
+        # Computes the list of srs.
+        SRs = $scope.SRs = []
+        forEach(srsByContainer[host.id], (template) =>
+          SRs.push(template)
+          return
+        )
+        forEach(srsByContainer[pool.id], (template) =>
+          SRs.push(template)
+          return
+        )
         # compute writable accessible SR from this VM
         $scope.writable_SRs = (SR for SR in SRs when SR.content_type isnt 'iso')

@@ -219,13 +224,13 @@
       $scope.bootParams[index + move] = $scope.bootParams[index]
       $scope.bootParams[index] = tmp

-    $scope.saveBootParams = (UUID, bootParams) ->
+    $scope.saveBootParams = (id, bootParams) ->
       if $scope.savingBootOrder
         return
       $scope.savingBootOrder = true
       paramString = ''
       forEach(bootParams, (boot) -> boot.v && paramString += boot.e)
-      return xoApi.call 'vm.bootOrder', {vm: UUID, order: paramString}
+      return xoApi.call 'vm.bootOrder', {vm: id, order: paramString}
       .finally () ->
         $scope.savingBootOrder = false
         $scope.bootReordering = false
@@ -335,7 +340,7 @@
       snapshot = get (id)

       result = {
-        id: snapshot.UUID
+        id: snapshot.id
         name_label: $data
       }

@@ -349,7 +354,7 @@
       {CPUs, memory, name_label, name_description, high_availability, auto_poweron} = $data

       $data = {
-        id: VM.UUID
+        id: VM.id
       }
       if memory isnt $scope.memorySize and (memory = sizeToBytesFilter memory)
         $data.memory = memory
@@ -442,12 +447,12 @@
           message: err
         }

-    $scope.deleteDisk = (UUID) ->
+    $scope.deleteDisk = (id) ->
       modal.confirm({
         title: 'Disk deletion'
         message: 'Are you sure you want to delete this disk? This operation is irreversible'
       }).then ->
-        xoApi.call 'vdi.delete', {id: UUID}
+        xoApi.call 'vdi.delete', {id: id}
         return
       return

@@ -614,8 +619,8 @@
         bootable
         mode : if (readonly || !isFreeForWriting(vdi)) then 'RO' else 'RW'
         position: String(position)
-        vdi: vdi.UUID
-        vm: $scope.VM.UUID
+        vdi: vdi.id
+        vm: $scope.VM.id
       }

       console.log(params)
@@ -662,7 +667,7 @@
           mode: if readonly then 'RO' else 'RW'
           position: String(position)
           vdi: diskUuid
-          vm: $scope.VM.UUID
+          vm: $scope.VM.id
         }

         # console.log(params)
@@ -702,8 +707,8 @@
       position++

       params = {
-        vm: $scope.VM.UUID
-        network: network.UUID
+        vm: $scope.VM.id
+        network: network.id
         position: String(position) # TODO
         mtu: String(mtu) || String(network.mtu)
       }


enabled line wrapping

enabled line wrapping

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lavelle/coursework.git/'


use getOtherParticipants in initial view creation

--- src/packages/collaboration/lib/collaboration.coffee
+++ src/packages/collaboration/lib/collaboration.coffee
@@ -12,8 +12,7 @@

     if atom.getLoadSettings().sessionId
       session = atom.guestSession
-      for participant in session.getParticipants()
-        continue if participant.id == session.getId()
+      for participant in session.getOtherParticipants()
         @createParticipant(session, participant)
     else
       session = new Session(site: window.site)


Close contact completion Refs #53

Close contact completion Refs #53

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-emails.git/'


Added error handling for API calls that return a status code other than 200

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/gregweston/fullcourtreport.git/'


oops file

oops file

error: pathspec 'assets/coffee/wb_views.coffee' did not match any file(s) known to git

--- assets/coffee/wb_views.coffee
+++ assets/coffee/wb_views.coffee
@@ -0,0 +1,110 @@
+
+Handlebars.registerHelper "fullName", (person) ->
+  person.firstName + " " + person.lastName
+
+
+Handlebars.registerHelper "relativeTime", (timeString) ->
+  moment(timeString).fromNow()
+
+
+
+window.renderData = =>
+	$('body').append(template(data));
+
+
+class App.PostModel extends Backbone.Model
+
+
+
+class App.PostView extends Backbone.View
+	className: 'post-bar'
+	tagName: 'li'
+
+	initialize: ->
+		_.bindAll(@, 'selectPost')
+
+
+	events:
+		'click' : 'selectPost'
+
+
+	selectPost: ->
+		if not @$el.hasClass 'selected'
+			@$el.siblings().removeClass('selected')
+			@$el.addClass 'selected'
+			@renderPostSelection()
+
+	renderPostSelection: ->
+		detail = new App.PostDetailView({model: @model})
+		$('#app-right').velocity("transition.slideUpOut",
+			duration: 100,
+			complete: ->
+				$('#post-detail').empty()
+				$('#post-detail').append detail.render()
+				$('#app-right').velocity("transition.slideUpIn", {stagger: 100}))
+
+
+
+
+
+class App.PostInsightView extends Backbone.View
+	postInsightTemplate = Handlebars.compile($('#post-insight-template').html())
+
+	render: =>
+		@$el.html postInsightTemplate({ insight: @model.get('insight') })
+		$('.insight-section').empty()
+		$('.insight-section').append @$el
+		@$el
+
+
+
+
+
+class App.PostDetailView extends Backbone.View
+	postDetailTemplate = Handlebars.compile($('#post-detail-template').html())
+
+
+	render: =>
+		fetchInsightData()
+		@$el.html postDetailTemplate({ blob: JSON.stringify(@model.toJSON(), null, 4) })
+		@$el
+
+
+class App.PostStatusView extends App.PostView
+	postStatusTemplate = Handlebars.compile($('#status-post-template').html())
+
+	render: =>
+		if not @model.get('message')
+			@model.set('message', @model.get('story'))
+		@$el.html postStatusTemplate( @model.toJSON() )
+		@$el
+
+
+class App.PostPhotoView extends App.PostView
+	postPhotoTemplate = Handlebars.compile($('#photo-post-template').html())
+
+	render: =>
+		if not @model.get('story')
+			@model.set('story', @model.get('message'))
+		@$el.html postPhotoTemplate( @model.toJSON() )
+		@$el
+
+class App.FeedCollection extends Backbone.Collection
+
+
+class App.FeedCollectionView extends Backbone.View
+
+	render: ->
+		$('.post-list').empty()
+		@collection.each (post) =>
+			console.log post.get('type')
+			postR = switch
+				when post.get('type') is 'status' then new App.PostStatusView({model: post})
+				when post.get('type') is 'photo' then new App.PostPhotoView({model: post})
+				when post.get('type') is 'video' then new App.PostPhotoView({model: post})
+				else null
+			$('.post-list').append postR.render()
+
+
+
+


Adds ExpressionPosition class to represent places that expression is pointed to

error: pathspec 'javascripts/lib/math/expression_position.coffee' did not match any file(s) known to git

--- javascripts/lib/math/expression_position.coffee
+++ javascripts/lib/math/expression_position.coffee
@@ -0,0 +1,34 @@
+#= require ./base
+
+
+position_at_end = (expression)->
+  expression.id()
+
+class ExpressionPosition
+  initialize: (opts={})->
+    @expr = opts.expression
+    @pos = opts.position
+    @type_val = opts.type
+  expression: -> @expr
+
+  position: -> @pos
+
+  type: -> @type_val
+
+  isPointedAt: (expression_component)->
+    "#{expression_component.id()}" == "#{@position()}"
+
+  clone: (new_vals={})->
+    data =
+      expression: @expr
+      position: @pos
+      type: @type_val
+    other = @klass.build(_.extend({}, data, new_vals))
+    other
+
+
+  @buildExpressionPositionAsLast: (expression)->
+    @build expression: expression, position: position_at_end(expression)
+
+ttm.lib.math.ExpressionPosition = ttm.class_mixer(ExpressionPosition)
+


Add log to main Alchemy class

Add log to main Alchemy class

--- app/scripts/alchemy/start.coffee
+++ app/scripts/alchemy/start.coffee
@@ -7,6 +7,7 @@
         @visControls = {}
         @styles = {}
         @drawing = {}
+        @log = {}

 graph_elem = $('#graph')
 igraph_search = $('#igraph-search')


Adicionando lib render_partial.js

Adicionando lib render_partial.js

error: pathspec 'lib/assets/javascripts/render_partial.js.coffee' did not match any file(s) known to git

--- lib/assets/javascripts/render_partial.js.coffee
+++ lib/assets/javascripts/render_partial.js.coffee
@@ -0,0 +1,15 @@
+# Render Partials in ECO-Templates like in Rails-ERB
+#
+# usefull to clean up structure in spine.js and other js-mvc´s like backbone
+#
+# usage:
+#   <%- render_partial 'path/to/partial' %>  ..  will render app/assets/templates/path/to/_partial.jst.eco
+#   <%- render_partial 'path/to/partial', foo: 'bar' %>  ..  will render app/assets/templates/path/to/_partial.jst.eco  ..  locals = @foo
+
+window.render_partial = ( path, options = {} ) ->
+  # add the leading underscore (like rails-partials)
+  path = path.split('/')
+  path[ path.length - 1 ] = '_' + path[ path.length - 1 ]
+  path = path.join('/')
+  # render and return the partial if existing
+  JST["#{ path }"]( options )


:new: Add a spec

:new: Add a spec

error: pathspec 'spec/package-deps-spec.coffee' did not match any file(s) known to git

--- spec/package-deps-spec.coffee
+++ spec/package-deps-spec.coffee
@@ -0,0 +1,36 @@
+jasmine.getEnv().defaultTimeoutInterval = 360 * 1000
+describe 'Package-Deps', ->
+  CP = require('child_process')
+  CP.execSync("#{atom.packages.getApmPath()} uninstall vim-mode pigments test-dependent-package")
+  CP.execSync("#{atom.packages.getApmPath()} install test-dependent-package")
+  atom.packages.activatePackage('test-dependent-package')
+  {Emitter} = require('event-kit')
+  PackageDeps = require('../lib/main')
+
+  beforeEach ->
+    global.setTimeout = require('remote').getGlobal('setTimeout')
+    console.log(setTimeout)
+    PackageDeps.debug?.dispose()
+    PackageDeps.debug = new Emitter
+
+    waitsForPromise ->
+      atom.packages.activatePackage('notifications')
+
+  it 'installs dependencies', ->
+    waitsForPromise ->
+      packagesToInstall = null
+      packagesInstalled = 0
+      PackageDeps.debug.on('packagesToInstall', (packages)->
+        packagesToInstall = packages
+      )
+      PackageDeps.debug.on('installPackage', ->
+        packagesInstalled++
+        console.log(packagesInstalled)
+      )
+      PackageDeps.install('test-dependent-package').then( ->
+        expect(packagesToInstall instanceof Array).toBe(true)
+        expect(packagesToInstall.length).toBe(packagesInstalled)
+        packagesToInstall.forEach((name) ->
+          expect(atom.packages.getActivePackage(name)).toBeDefined()
+        )
+      )


CoffeeScript OOP

CoffeeScript OOP

error: pathspec 'coffeescript/animals.coffee' did not match any file(s) known to git

--- coffeescript/animals.coffee
+++ coffeescript/animals.coffee
@@ -0,0 +1,20 @@
+class Animal
+  constructor: (@name) ->
+
+  speak: ->
+    "#{@name} says #{this.sound()}"
+
+class Cow extends Animal
+  sound: -> "moooo"
+
+class Horse extends Animal
+  sound: -> "neigh"
+
+class Sheep extends Animal
+  sound: -> "baaaa"
+
+s = new Horse "CJ"
+console.log s.speak()
+c = new Cow "Bessie"
+console.log c.speak()
+console.log new Sheep("Little Lamb").speak()


some fixes

some fixes

error: pathspec 'app/views/labels/get_section_and_system.js.coffee' did not match any file(s) known to git

--- app/views/labels/get_section_and_system.js.coffee
+++ app/views/labels/get_section_and_system.js.coffee
@@ -0,0 +1,23 @@
+<% if @class == "C1" %>
+	$("#C2").empty()
+					.append("<%= escape_javascript(options_from_collection_for_select(@sections, :id, :description)) %>");
+	$("#C3").empty();
+
+<% end %>
+
+<% if @class == "C2" %>
+	$("#C3").empty()
+					.append("<%= escape_javascript(options_from_collection_for_select(@devices, :id, :abbr)) %>");
+<% end %>
+
+<% if @class == "C4" %>
+	$("#C5").empty()
+					.append("<%= escape_javascript(options_from_collection_for_select(@sections, :id, :description)) %>");
+	$("#C6").empty();
+
+<% end %>
+
+<% if @class == "C5" %>
+	$("#C6").empty()
+					.append("<%= escape_javascript(options_from_collection_for_select(@devices, :id, :abbr)) %>");
+<% end %>


Stop cast button progress overlay before cast settings gear.

--- app/views/play/level/tome/cast_button_view.coffee
+++ app/views/play/level/tome/cast_button_view.coffee
@@ -63,7 +63,7 @@

   onWorldLoadProgressChanged: (e) ->
     overlay = @castButtonGroup.find '.button-progress-overlay'
-    overlay.css 'width', e.progress * @castButtonGroup.width() + 1
+    overlay.css 'width', e.progress * @castButton.outerWidth() + 1

   onNewWorld: (e) ->
     @casting = false


happy path testing for SendMessage2: The More Sendy, More Messagy

error: pathspec 'test/integration/send-broadcast-message-2-spec.coffee' did not match any file(s) known to git

--- test/integration/send-broadcast-message-2-spec.coffee
+++ test/integration/send-broadcast-message-2-spec.coffee
@@ -0,0 +1,86 @@
+_              = require 'lodash'
+mongojs        = require 'mongojs'
+redis          = require 'redis'
+bcrypt         = require 'bcrypt'
+RedisNS        = require '@octoblu/redis-ns'
+
+TestDispatcher = require './test-dispatcher'
+JobManager     = require 'meshblu-core-job-manager'
+
+describe 'SendMessage: broadcast', ->
+  beforeEach (done)->
+    @db = mongojs 'meshblu-core-test'
+    @collection = @db.collection 'devices'
+    @collection.drop => done()
+
+  beforeEach ->
+    redisUri = process.env.REDIS_URI
+    @dispatcher = new TestDispatcher
+
+    client = _.bindAll new RedisNS 'meshblu-test', redis.createClient(redisUri)
+
+    client.del 'request:queue'
+
+    @jobManager = new JobManager
+      client: client
+      timeoutSeconds: 15
+
+  beforeEach (done) ->
+    @auth =
+      uuid: 'sender-uuid'
+      token: 'leak'
+
+    @senderDevice =
+      uuid: 'sender-uuid'
+      type: 'device:sender'
+      token: bcrypt.hashSync @auth.token, 8
+      receiveWhitelist: [ 'receiver-uuid' ]
+
+    @collection.insert @senderDevice, done
+
+  beforeEach (done) ->
+    @receiverDevice =
+      uuid: 'receiver-uuid'
+      type: 'device:receiver'
+
+    @collection.insert @receiverDevice, done
+
+  describe "sending to a device with sendWhitelist", ->
+    beforeEach (done) ->
+      job =
+        metadata:
+          auth: @auth
+          toUuid: @auth.uuid
+          jobType: 'SendMessage2'
+        rawData: JSON.stringify devices:['*'], payload: 'boo'
+
+      @jobManager.do 'request', 'response', job, (error, @response) => done error
+
+      @dispatcher.doSingleRun (error) =>
+        throw error if error?
+
+    it 'should return a 204', ->
+      expectedResponse =
+        metadata:
+          code: 204
+          status: 'No Content'
+
+      expect(@response).to.containSubset expectedResponse
+
+    describe 'JobManager gets DeliverBroadcastSent job', (done) ->
+      beforeEach (done) ->
+        @jobManager.getRequest ['request'], (error, @request) =>
+          done error
+
+      it 'should be a sent messageType', ->
+        auth =
+          uuid: 'sender-uuid'
+          token: 'leak'
+
+        {rawData, metadata} = @request
+        expect(metadata.auth.uuid).to.deep.equal auth.uuid
+        expect(metadata.auth.token).to.exist
+        expect(metadata.jobType).to.equal 'DeliverBroadcastSent'
+        expect(metadata.messageType).to.equal 'broadcast-sent'
+        expect(metadata.toUuid).to.equal 'sender-uuid'
+        expect(rawData).to.equal JSON.stringify devices: ['*'], payload: 'boo'


Refactor.

Refactor.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Add statechart implementation

Add statechart implementation

error: pathspec 'app/assets/javascripts/rglossa/react/statechart.coffee' did not match any file(s) known to git

--- app/assets/javascripts/rglossa/react/statechart.coffee
+++ app/assets/javascripts/rglossa/react/statechart.coffee
@@ -0,0 +1,133 @@
+createStates = (statechart, parent, configs) ->
+  states = {}
+  for name, config of configs
+    actions = config.actions or {}
+    substates = config.substates or {}
+    initialSubstate = config.initialSubstate
+    states[name] = new State(statechart, parent, name, actions,
+      substates, initialSubstate)
+  states
+
+
+class Statechart
+  constructor: (@name, states, initialPath, @currentStateChangedHandler) ->
+    initialPath = '/' + initialPath unless initialPath[0] is '/'
+    @root = new State(@, null, 'root', null, states)
+    @root.transitionTo(initialPath)
+
+  setCurrentState: (@currentState) ->
+    # Call the handler provided by our creator even if the new state might be the same
+    # as the old one, since we might have set different args data along the way (e.g. when
+    # we move from one page of paginated data to another, displayed in the same
+    # state but with a different page number provided in the args structure).
+    @currentStateChangedHandler(@) if @currentStateChangedHandler
+
+
+  getCurrentPath: -> @currentState.getPath()
+
+  # Searches for a state argument (i.e. data stored in the args property on a state)
+  # that matches the given name, beginning at the current state and working upwards
+  # towards the root state.
+  getArgumentValue: (argname) ->
+    state = @currentState
+    while state
+      value = state.args?[argname]
+      return value if value?
+      state = state.parent
+    return null
+
+  # Checks whether the current state path contains the given subpath, which
+  # should be a string of one or more state names separated by a slash
+  # (e.g. "posts" or "posts/editing"). Components can use this to customize
+  # their behaviour or rendering depending on the current state.
+  pathContains: (subpath) ->
+    new RegExp(subpath).test(@getCurrentPath()) # use RegExp to avoid escaping the slash
+
+  # Handles an action sent by a React component, the server etc.
+  # The action will be handled by the first state that
+  # defines a method named after the action, beginning at the current
+  # state and working upwards towards the root state. This allows the
+  # behaviour of the system to depend on the current state.
+  handleAction: (action, data...) ->
+    state = @currentState
+    while state
+      handler = state.actions?[action]
+      if handler
+        handler.apply(state, data)
+        return
+      else
+        state = state.parent
+    console?.warn?("No state handled the action '#{action}'")
+
+
+class State
+  constructor: (@statechart, @parent, @name, @actions, substates, @initialSubstate) ->
+    @substates = createStates(statechart, @, substates)
+
+  # Transitions to a state located at the given path, with path being a UNIX-style
+  # absolute or relative path. In the case of a relative path, it will be relative
+  # to the `this` state, which is normally a state handling an action and
+  # calling `transitionTo` in its action handler. This means that the state
+  # we transition to only depends on the one handling the action, not the
+  # current application state, and this is typically what we want: the same action
+  # will always put us into the same state no matter which substate we were
+  # in prior to the action being sent.
+  #
+  # The `args` argument will be set on the last state mentioned in the path (which
+  # will be the final target state only if it is a leaf state) and can be used to
+  # provide component code with additional data. For instance, when showing a paginated
+  # set of search results, we typically don't want to have a separate state for each
+  # page, but rather a single result state with an `args` property set to something
+  # like {currentPageNo: 1}.
+  transitionTo: (path, args) ->
+    [start, segments...] = path.split('/')
+
+    if start
+      # relative path
+      startState = @
+      segments.unshift(start)
+    else
+      # absolute path
+      startState = @statechart.root
+
+    targetState = startState.traversePath(segments)
+
+    # Set args on the last state explicitly mentioned in the path, even though we may actually
+    # traverse further by following initialSubstate properties until we reach a leaf state.
+    if args?
+      targetState.args = args
+      argsMsg = " with the following args set on #{targetState.getPath()}:" if window.console
+
+    # Unless targetState is already a leaf state, traverse further until we reach one
+    while targetState.initialSubstate
+      targetState = targetState.substates[targetState.initialSubstate]
+
+    if targetState.isLeaf()
+      @statechart.setCurrentState(targetState)
+      if window.console
+        msg = "#{@statechart.name}: Transitioned to #{targetState.getPath()}"
+        msg += argsMsg if argsMsg
+        console.log(msg)
+        console.log(args) if args?
+    else
+      throw new Error("Trying to transition to non-leaf state '#{targetState.getPath()}'!")
+
+  traversePath: (segments) ->
+    firstSegment = segments.shift()
+    if firstSegment
+      nextState = switch firstSegment
+        when '.' then @
+        when '..' then @parent or throw new Error("Trying to traverse beyond root state!")
+        else @substates[firstSegment] or throw new Error("Trying to traverse to non-existent substate '#{firstSegment}'!")
+      nextState.traversePath(segments)
+    else @  # there were no more path segments, so this state is the traversal target
+
+  getPath: -> if @parent then "#{@parent.getPath()}/#{@name}" else '' # don't include the name of 'root'
+
+  isLeaf: ->
+    return false for k of @substates  # returns false if @substates is non-empty
+    true
+
+
+window.Statechart = Statechart
+window.State = State


do not focus room name on webcollab flex panel open

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/VoiSmart/Rocket.Chat.git/'


Retry models when they time out

Retry models when they time out


Add placeholder on the video input component

Signed-off-by: Renato Carvalho <3a567acd0cc20231ba7f35c2bad7076ae1d7999b@gmail.com>

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/startae/hub.git/'


commented out messages in user dropdown

commented out messages in user dropdown

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lonelyplanet/rizzo.git/'


Add Frontend-Test for Bricklet HTTP Load

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/BennySamir/Tinkerforge-Home.git/'


Client: Activity: Created CommentListItem component for feedItem comments

error: pathspec 'client/activity/lib/components/commentlist/commentlistitem.coffee' did not match any file(s) known to git

--- client/activity/lib/components/commentlist/commentlistitem.coffee
+++ client/activity/lib/components/commentlist/commentlistitem.coffee
@@ -0,0 +1,60 @@
+kd                   = require 'kd'
+React                = require 'kd-react'
+Avatar               = require 'app/components/profile/avatar'
+Link                 = require 'app/components/common/link'
+TimeAgo              = require 'app/components/common/timeago'
+immutable            = require 'immutable'
+MessageLink          = require 'activity/components/messagelink'
+MessageBody          = require 'activity/components/common/messagebody'
+ProfileText          = require 'app/components/profile/profiletext'
+ProfileLinkContainer = require 'app/components/profile/profilelinkcontainer'
+ActivityLikeLink     = require 'activity/components/chatlistitem/activitylikelink'
+
+module.exports = class CommentListItem extends React.Component
+
+  defaultProps=
+    comment        : immutable.Map()
+    onMentionClick : kd.noop
+
+
+  onClick: (event) ->
+
+    kd.utils.stopDOMEvent event
+
+    { onMentionClick, comment } = @props
+
+    onMentionClick comment
+
+
+  render: ->
+
+    { comment } = @props
+    return null  unless comment
+
+

+

+        <ProfileLinkContainer origin={comment.get('account').toJS()}>
+          <Avatar className='FeedItem-Avatar' width={35} height={35} />
+        </ProfileLinkContainer>
+

+      <ProfileLinkContainer key={comment.getIn(['account', 'id'])} origin={comment.get('account').toJS()}>
+        <ProfileText />
+      </ProfileLinkContainer>
+

+        {comment.get 'body'}
+

+

+        <TimeAgo from={comment.get 'createdAt'} className='CommentListItem-date' />
+        <ActivityLikeLink
+          tooltip={no}
+          messageId={comment.get('id')}
+          interactions={comment.get('interactions').toJS()}>
+          Like
+
+            {comment.getIn ['interactions', 'like', 'actorsCount']}
+
+        </ActivityLikeLink>
+        <Link onClick={ @bound 'onClick' }>Mention</Link>
+

+

+


Implemented SignOut

Implemented SignOut

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/jhbruhn/keybase-gui.git/'


unneeded change.

unneeded change.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ndlib/honeycomb.git/'


Script to generate header and implementation

--- generator.coffee
+++ generator.coffee
@@ -0,0 +1,138 @@
+# Script to generate the UIColor Category to add flat colors, from the very cool FlatUI framework: http://designmodo.github.io/Flat-UI/
+
+css = """
+.palette-turquoise {
+  background-color: #1abc9c;
+}
+.palette-green-sea {
+  background-color: #16a085;
+}
+.palette-emerald {
+  background-color: #2ecc71;
+}
+.palette-nephritis {
+  background-color: #27ae60;
+}
+.palette-peter-river {
+  background-color: #3498db;
+}
+.palette-belize-hole {
+  background-color: #2980b9;
+}
+.palette-amethyst {
+  background-color: #9b59b6;
+}
+.palette-wisteria {
+  background-color: #8e44ad;
+}
+.palette-wet-asphalt {
+  background-color: #34495e;
+}
+.palette-midnight-blue {
+  background-color: #2c3e50;
+}
+.palette-sun-flower {
+  background-color: #f1c40f;
+}
+.palette-orange {
+  background-color: #f39c12;
+}
+.palette-carrot {
+  background-color: #e67e22;
+}
+.palette-pumpkin {
+  background-color: #d35400;
+}
+.palette-alizarin {
+  background-color: #e74c3c;
+}
+.palette-pomegranate {
+  background-color: #c0392b;
+}
+.palette-clouds {
+  background-color: #ecf0f1;
+}
+.palette-silver {
+  background-color: #bdc3c7;
+}
+.palette-concrete {
+  background-color: #95a5a6;
+}
+.palette-asbestos {
+  background-color: #7f8c8d;
+}
+.palette-clouds {
+  color: #bdc3c7;
+}
+"""
+
+h_template = """
+- (UIColor *)_name_Color;
+
+"""
+
+m_template = """
+- (UIColor *)_name_Color {
+  return [UIColor colorWithRed:_red_ green:_green_ blue:_blue_];
+}
+
+"""
+
+css_definitions = css.replace(/(\r\n|\n|\r)/gm,"").split "}"
+
+colors_data = []
+for color_definition in css_definitions
+  do () ->
+    if color_definition != ''
+      components = color_definition.split(' ')
+
+      dashed_name =  components[0].replace /.palette-/, ''
+      name_components = dashed_name.split '-'
+      i = 0
+      objc_components = []
+      for name_component in name_components
+        do () ->
+          if i != 0
+            objc_components.push name_component.charAt(0).toUpperCase() + name_component.slice(1)
+          else
+            objc_components.push name_component
+          i++
+
+      color_string = components[components.length - 1].replace /#/, ''
+      red_string = color_string[0..1]
+      green_string = color_string[2..3]
+      blue_string = color_string[4..5]
+
+      hex_to_dec = (string) ->
+        letters = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ]
+        dec = letters.indexOf(string[0]) * 16
+        uni = letters.indexOf(string[1])
+
+        v = parseInt(dec) + parseInt(uni)
+
+      r = parseFloat(hex_to_dec red_string) / 255.0
+      g = parseFloat(hex_to_dec green_string) / 255.0
+      b = parseFloat(hex_to_dec blue_string) / 255.0
+
+      colors_data.push {
+        name: objc_components.join('')
+        red: r
+        green: g
+        blue: b
+      }
+
+console.log colors_data
+
+# headers
+for data in colors_data
+  do () ->
+    console.log h_template.replace(/_name_/, data.name)
+
+# implementations
+for data in colors_data
+  do () ->
+    console.log m_template
+      .replace(/_name_/, data.name)
+      .replace(/_red_/, data.red)
+      .replace(/_green_/, data.green)
+      .replace(/_blue_/, data.blue)


put passport as initializer

put passport as initializer

error: pathspec 'config/initializers/passport.coffee' did not match any file(s) known to git

--- config/initializers/passport.coffee
+++ config/initializers/passport.coffee
@@ -0,0 +1,11 @@
+passport = require 'passport'
+
+passport.serializeUser = (user, done) ->
+    done null, user.email
+
+passport.deserializeUser = (email, done) ->
+    User.all (err, users) ->
+        if users.length > 0
+            done err, users[0]
+        else
+            done err, null


Stopped sending multiple requests to populate a month.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


Change dummy data

Change dummy data

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kjirou/monsters-flow.git/'


exit early

exit early

--- resources/assets/lib/store-xsolla.coffee
+++ resources/assets/lib/store-xsolla.coffee
@@ -36,7 +36,7 @@
       $.get laroute.route('payments.xsolla.token')
       .done (data) ->
         # Make sure laroute hasn't trolled us.
-        reject(message: 'wrong token length') unless data.length == 32
+        return reject(message: 'wrong token length') unless data.length == 32
         resolve(data)
       .fail (xhr) ->
         reject(xhr: xhr)


close

close

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/stevelacy/portal.git/'


Fixed bug related to clicking disabled tabs

--- resources/assets/coffee/react/beatmapset-page/contents-tab.coffee
+++ resources/assets/coffee/react/beatmapset-page/contents-tab.coffee
@@ -19,7 +19,7 @@

 class BeatmapSetPage.ContentsTab extends React.Component
   onClick: (e) =>
-    return if @props.count == 0
+    return if @props.disabled
     e.preventDefault()
     $.publish 'beatmapset:playmode:set', @props.playmode
     $.publish 'beatmapset:mode:set', @props.newMode


add moment library to application.coffee

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/netguru/review.git/'


Test overlongs

Test overlongs

error: pathspec 'test/overlong.coffee' did not match any file(s) known to git

--- test/overlong.coffee
+++ test/overlong.coffee
@@ -0,0 +1,26 @@
+utf8 = require './8'
+random = require './random'
+assert = require './assert'
+valid8 = require '..'
+
+describe 'Overlongs', ->
+  it 'are invalid', ->
+    [7].concat (5*i+1 for i in [2..6])
+    .reduce (ranges, n)->
+      ranges.push
+        max: 1 << n >>> 0
+        min: if ranges.length
+          ranges[ranges.length - 1].max - 1
+        else
+          0
+      ranges
+    , []
+    .forEach (range)->
+      for i in [1..27]
+        z = random range.min, range.max - 1
+        assert z == utf8.code q = utf8 z
+        utf8.overlongs q
+        .forEach (overlong)->
+          assert utf8.valid overlong
+          assert z == utf8.code overlong
+          random.test4 false, overlong


Initial commit with some POC code

Initial commit with some POC code

error: pathspec 'hubot-bangarang-annotations.coffee' did not match any file(s) known to git

--- hubot-bangarang-annotations.coffee
+++ hubot-bangarang-annotations.coffee
@@ -0,0 +1,51 @@
+nconf = require("nconf")
+deployments = require './data/deployments.json'
+
+cwd = process.cwd()
+DEFAULTS_FILE = "#{__dirname}/data/defaults.json"
+
+nconf.argv()
+    .env()
+    .file('defaults', DEFAULTS_FILE)
+
+sanity_check_args = (msg) ->
+  required_args = [
+  ]
+
+  for arg in required_args
+    if !nconf.get(arg)
+      buf = "#hubot-grafana-annotations is not properly configured. #{arg} is not set."
+      msg.reply buf
+      return false
+
+  return true
+
+help = (msg) ->
+  commands = [
+    "grafana-annotations show deployments"
+    "grafana-annotations help"
+  ]
+  buf = ""
+  for command in commands
+    buf += "#{command}\n"
+
+  msg.reply buf
+
+deployment_event = (msg, deployment) ->
+  text = msg.message.text
+  msg.reply "#{deployment}: #{text}"
+
+module.exports = (robot) ->
+
+  robot.hear /grafana-annotations help/i, (msg) ->
+    help(msg)
+
+  robot.hear /grafana-annotations show deployments/i, (msg) ->
+    msg.reply triggers.join('\n')
+
+  for deployment in deployments
+    regex = new RegExp "(#{deployment})", 'i'
+    robot.hear regex, (msg) ->
+      if !sanity_check_args(msg)
+        return
+      deployment_event(msg, msg.match[1])


Fix for when there are no tags

Fix for when there are no tags


add coffeescript version

add coffeescript version

error: pathspec 'jslibraryboilerplate_coffee.coffee' did not match any file(s) known to git

--- jslibraryboilerplate_coffee.coffee
+++ jslibraryboilerplate_coffee.coffee
@@ -0,0 +1,84 @@
+###
+  JavaScript Library Boilerplate
+  Copyright (c) 2012 Denis Ciccale (@tdecs)
+  Released under MIT license (https:#raw.github.com/dciccale/jslibraryboilerplate/master/LICENSE.txt)
+###
+
+
+# helper methods
+push = [].push
+slice = [].slice
+splice = [].splice
+forEach = [].forEach
+
+class JSLB
+  # auto-create new instance without the 'new' keyword
+  constructor: (selector) ->
+    return new JSLB.prototype.init(selector)
+
+  # handle the use of $(...)
+  init: (selector) ->
+    # no selector, return empty JSLB object
+    return this if !selector
+
+    # already a JSLB object
+    return selector if selector instanceof JSLB
+
+    # already a dom element?
+    if selector.nodeType
+      this[0] = selector
+      this.length = 1
+      return this
+
+    # is css selector, query the dom
+    if typeof selector == 'string'
+      # find elements, turn NodeList to array and push them to JSLB
+      return push.apply(this, slice.call(document.querySelectorAll(selector)))
+
+    # it's a function, call it when DOM is ready
+    if typeof selector == 'function'
+      return JSLB(document).ready(selector)
+
+  # default length of a JSLB object is 0
+  length: 0
+
+  # document ready method
+  ready: (callback) ->
+    # first check if already loaded
+    if /complete|loaded|interactive/.test(document.readyState)
+      callback(JSLB)
+
+    # listen when it loads
+    else
+      document.addEventListener('DOMContentLoaded',
+        -> callback(JSLB),
+        false)
+
+  # iterate JSLB object
+  each: (callback) ->
+    forEach.call(this, (el, i) -> callback.call(el, i, el))
+
+  # sample method to change text of an element
+  text: (value) ->
+    # no element
+    if !this[0]
+      return this
+
+    # get value
+    if !value
+      return this[0].textContent
+
+    # set value to all elements on the collection
+    else
+      return this.each(-> this.textContent = value)
+
+# abbreviate "prototype" to "fn"
+JSLB.fn = JSLB.prototype
+# the init method uses JSLB prototype and constructor
+JSLB.prototype.init.prototype = JSLB.prototype
+JSLB.prototype.init.prototype.constructor = JSLB
+# just to have an array like instanceof JSLB object
+JSLB.prototype.splice = splice
+
+# expose to global object
+window.JSLB = window.$ = JSLB


Render snapshot mark only if correct month is currently selected


Fixed snapshot recording play functionality


Removed unnecessary newConsole line in headless client.

--- headless_client/worker_world.coffee
+++ headless_client/worker_world.coffee
@@ -193,8 +193,6 @@

 #window.BOX2D_ENABLED = true;

-newConsole = "newConsole = #{}(newConsole.toString())}()"
-
 ret = """

   GLOBAL = root = window = self;


add test params

add test params

--- src/desktop/components/split_test/running_tests.coffee
+++ src/desktop/components/split_test/running_tests.coffee
@@ -40,5 +40,14 @@
       control: 50
     control_group: 'control'
     edge: 'experiment'
+
+  article_tooltips:
+    key: 'article_tooltips'
+    weighting: 'equal'
+    outcomes: [
+      'bio',
+      'market',
+      'control'
+    ]
 }


Refs #99; Added tests for the key-value data formatter.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/kidaa/epoch.git/'


Add source code

Add source code

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/rubene/timePicker.git/'


add tests for Apollos.person.delete

add tests for Apollos.person.delete

error: pathspec 'tests/mocha/apollos/person/delete.coffee' did not match any file(s) known to git

--- tests/mocha/apollos/person/delete.coffee
+++ tests/mocha/apollos/person/delete.coffee
@@ -0,0 +1,65 @@
+MochaWeb?.testOnly ->
+
+  assert = chai.assert
+
+  describe 'Apollos', ->
+    describe 'person', ->
+      describe 'delete', ->
+
+        if Meteor.isServer
+
+          # unknown person
+          getPersonProps = ->
+            Id: 34567
+            PersonId: 34567
+            Guid: '12345678-1234-1234-1234-123456789013'
+            FirstName: 'Jim'
+            MiddleName: 'Allen'
+            LastName: 'Bo'
+            NickName: 'Jimmy'
+            Email: 'jim@jimmy.bo'
+            BirthDay: 1
+            BirthMonth: 1
+            BirthYear: 2000
+            Gender: 1
+            RecordStatusValueId: 3
+            TitleValueId: 1
+            SuffixValueId: 1
+            MaritalStatusValueId: 1
+            GivingGroupId: 1
+            EmailPreference: 1
+            Photo:
+              Path: '//meow.com/meow'
+              Id: 1
+            AnniversaryDate: '2015-03-10T00:00:00'
+            PhoneNumbers: [
+              NumberTypeValue:
+                Value: 'Mobile'
+              Number: '1123456789'
+            ,
+              NumberTypeValue:
+                Value: 'Home'
+              Number: '1123456789'
+            ,
+              NumberTypeValue:
+                Value: 'Work'
+              Number: '1123456789'
+            ]
+
+          it 'should exist', ->
+            assert.isDefined Apollos.person.delete
+
+          it 'should be a function', ->
+            assert typeof Apollos.person.delete is 'function'
+
+          it 'should delete based on number', ->
+            person = getPersonProps()
+            person.Id = 191919
+            Apollos.person.update person
+            assert.equal Apollos.person.delete(191919, "ROCK"), 1
+
+          it 'should delete based on string', ->
+            person = getPersonProps()
+            person.Id = 181818
+            personId = Apollos.person.update person
+            assert.equal Apollos.person.delete(personId, "ROCK"), 1


Fix Results#openFirst when firstChild isn't an element

--- assets/javascripts/views/sidebar/results.coffee
+++ assets/javascripts/views/sidebar/results.coffee
@@ -33,11 +33,11 @@
     return

   focusFirst: ->
-    @listFocus?.focus @el.firstChild
+    @listFocus?.focus @el.firstElementChild
     return

   openFirst: ->
-    @el.firstChild?.click()
+    @el.firstElementChild?.click()
     return

   afterRoute: (route, context) =>


RIP animation

RIP animation

--- resources/assets/coffee/react/beatmap-discussions/discussion.coffee
+++ resources/assets/coffee/react/beatmap-discussions/discussion.coffee
@@ -78,9 +78,8 @@
               div
                 className: "beatmap-discussion-expand #{'beatmap-discussion-expand--expanded' if !@state.collapsed}"
                 el Icon, name: 'chevron-down'
-        el ReactCollapse,
-          isOpened: !@state.collapsed
-          className: "#{bn}__expanded"
+        div
+          className: "#{bn}__expanded #{'hidden' if @state.collapsed}"
           div
             className: "#{bn}__replies"
             @props.discussion.beatmap_discussion_posts.slice(1).map (reply) =>


Don't fail on guest

Don't fail on guest

--- resources/assets/coffee/react/beatmap-discussions/discussion.coffee
+++ resources/assets/coffee/react/beatmap-discussions/discussion.coffee
@@ -155,7 +155,7 @@

     return if !baseScore?

-    currentVote = @props.discussion.current_user_attributes.data.vote_score
+    currentVote = @props.discussion.current_user_attributes?.data?.vote_score

     classes = "#{vbn} #{vbn}--#{type}"


event might've changed after a while

event might've changed after a while

--- resources/assets/coffee/_classes/post-preview.coffee
+++ resources/assets/coffee/_classes/post-preview.coffee
@@ -18,13 +18,17 @@

 class @PostPreview
   constructor: ->
-    $(document).on 'input', '.js-post-preview--auto', _.debounce(@loadPreview, 500)
+    @debouncedLoadPreview = _.debounce @loadPreview, 500
+
+    $(document).on 'input', '.js-post-preview--auto', (e) =>
+      # get the target immediately because event object may change later.
+      @debouncedLoadPreview(e.currentTarget)

-  loadPreview: (e) =>
-    $form = $(e.target).closest('form')
+  loadPreview: (target) =>
+    $form = $(target).closest('form')
     url = laroute.route('bbcode-preview')
-    body = e.currentTarget.value
+    body = target.value
     $preview = $form.find('.js-post-preview--body')
     $previewBox = $form.find('.js-post-preview--box')


refactored sync

refactored sync

error: pathspec 'lib/util/optionsParser.coffee' did not match any file(s) known to git

--- lib/util/optionsParser.coffee
+++ lib/util/optionsParser.coffee
@@ -0,0 +1,23 @@
+#!/usr/bin/env coffee
+
+fs = (require "fs")
+
+##Read creds from config
+exports.getCreds = (config_file)->
+    data = fs.readFileSync(config_file)
+    dataObj = JSON.parse(data)
+
+    return [dataObj.user_name, dataObj.password]
+
+exports.parseMapping = (mapping)->
+    #Assume local dir by default
+    if mapping.indexOf(':') is -1
+        local = process.cwd()
+        remote = mapping
+    else
+        [local,remote] =  mapping.split(':')
+
+    #Add trailing slash if not provided
+    local += "/" if local.charAt(local.length - 1) isnt "/"
+
+    return [local, remote]


replace canvas with rendered page after 1 second

--- services/web/public/coffee/ide/pdfng/directives/pdfRenderer.coffee
+++ services/web/public/coffee/ide/pdfng/directives/pdfRenderer.coffee
@@ -224,7 +224,10 @@
 					navigateFn: @navigateFn
 				})

-				element.canvas.replaceWith(canvas)
+				renderTimer = setTimeout () ->
+					renderTimer = null
+					element.canvas.replaceWith(canvas)
+				, 1000

 				# console.log 'staring page render', pagenum

@@ -245,6 +248,9 @@

 				result.then () ->
 					# console.log 'page rendered', pagenum
+					if renderTimer?
+						element.canvas.replaceWith(canvas)
+						clearTimeout renderTimer
 					$timeout.cancel(timer)
 					canvas.removeClass('pdfng-rendering')
 					page.getTextContent().then (textContent) ->


Fixed auto scroll down issue

Fixed auto scroll down issue


Fixed another couple of variable names I missed

--- packages/meteor-accounts-saml/saml_rocketchat.coffee
+++ packages/meteor-accounts-saml/saml_rocketchat.coffee
@@ -86,11 +86,11 @@
 configureSamlService = (samlConfigs) ->
 	privateKey = false
 	privateCert = false
-	if samlConfigs.secret.privateKeyFilePath and samlConfigs.secret.publicCert
+	if samlConfigs.secret.privateKey and samlConfigs.secret.publicCert
 		privateKey = samlConfigs.secret.privateKey
 		privateCert = samlConfigs.secret.publicCert
 	else
-		if samlConfigs.secret.privateKeyFilePath or samlConfigs.secret.publicCertFilePath
+		if samlConfigs.secret.privateKey or samlConfigs.secret.publicCert
 			logger.error "You must specify both cert and key files."
 			privateKey = false
 			privateCert = false


Add infinite scroll module

Add infinite scroll module

error: pathspec 'app/assets/javascripts/neighborly/modules/infinite-scroll.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/neighborly/modules/infinite-scroll.js.coffee
+++ app/assets/javascripts/neighborly/modules/infinite-scroll.js.coffee
@@ -0,0 +1,27 @@
+Neighborly.InfiniteScroll =
+  setupScroll: ->
+    _.bindAll(this, 'onScroll', 'onSuccess')
+    this.$window().scroll(this.onScroll)
+
+  fetchPage: ->
+    # the isLoaderDivVisible check if the div is already in the view pane to load more content
+    # the $loader.is(:visible) is here to avoid trigerring two concurrent fetchPage calls
+    if this.isLoaderDivVisible() and not this.$loader.is(":visible") and not this.EOF
+      this.$loader.show()
+      $.get(this.path, this.filter).success this.onSuccess
+      this.filter.page += 1
+
+  onSuccess: (data) ->
+    this.EOF = true  if $.trim(data) is ""
+    this.$results.append data
+    this.$loader.hide()
+    this.trigger "scroll:success", data
+
+  $window: ->
+    $(window)
+
+  isLoaderDivVisible: ->
+    this.$loaderDiv.is(":visible") and this.$window().scrollTop() + this.$window().height() > this.$loaderDiv.offset().top
+
+  onScroll: (event) ->
+    this.fetchPage()


Add A to Z lib

Add A to Z lib

error: pathspec 'lib/a_to_z.coffee' did not match any file(s) known to git

--- lib/a_to_z.coffee
+++ lib/a_to_z.coffee
@@ -0,0 +1,69 @@
+_ = require 'underscore'
+
+# Lifted from:
+# https://raw.githubusercontent.com/artsy/artsy-backbone-mixins/master/lib/a_to_z.coffee
+
+module.exports =
+  #
+  # Collection models must specify what to sort by through an `alphaSortKey` method
+  # Sample output:
+  # {
+  #   '0-9': [ model_instance, model_instance, model_instance ],
+  #   A: [ model_instance, model_instance, model_instance ],
+  #   ...
+  #   Z: [ model_instance, model_instance, model_instance ]
+  # }
+  groupByAlpha: ->
+    instance = new @model()
+    @groupBy (model) ->
+      key = model.get('title')
+      letter = key[0]
+      if /^\d$/.test letter
+        '0-9'
+      else
+        letter.toUpperCase()
+
+  #
+  # Groups collection output in a format suitable for rendering in an A-Z list with
+  # a specified number of columns.
+  #
+  # Sample Output:
+  # [
+  #  { letter: '0-9', columns: [ ... ] },
+  #  { letter: 'A', columns: [ ... ] },
+  #   ...
+  #  { letter: 'Z', columns: [ ... ] }
+  # ]
+  # Each column is a 2D array of objects with `href`, and `name` properties:
+  # columns: [
+  #   [ { href: '...', name: '...' }, ... { href: '...', name: '...' } ],
+  #   [ { href: '...', name: '...' }, ... { href: '...', name: '...' } ],
+  #   [ { href: '...', name: '...' }, ... { href: '...', name: '...' } ]
+  # ]
+  groupByAlphaWithColumns: (numberOfColumns = 3) ->
+    instance = new @model()
+    unless _.isFunction instance.href
+      throw "You must implement an `href` method for these models."
+    unless _.isFunction instance.displayName
+      throw "You must implement a `displayName` method for these models."
+
+    itemsByLetter = @groupByAlpha()
+    letters = _.keys(itemsByLetter)
+    letters.sort()
+
+    itemsToColumns = (items, numberOfColumns) ->
+      maxRows = Math.floor(items.length / numberOfColumns)
+      items[(i * maxRows + i)..((i + 1) * maxRows + i)] for i in [0...numberOfColumns]
+
+    _.map(letters, (letter) =>
+      models = itemsByLetter[letter]
+      items = _.map(models,
+        (model) ->
+          linkToPage = if model.has('artworks_count') then model.get('artworks_count') > 0 else true
+          { href: model.href(), name: model.displayName(), linkToPage: linkToPage }
+      )
+      {
+        letter: letter
+        columns: itemsToColumns(items, numberOfColumns)
+      }
+    )


show storage

show storage

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/sharabash/hubot.git/'


i18n Sequence XModule

i18n Sequence XModule

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bmedx/modulestore.git/'


feat: send api version

feat: send api version

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-gooddata-writer-add.git/'


Another stab at fixing the tests.

Another stab at fixing the tests.

--- test/app/views/editor/component/ThangComponentsEditView.spec.coffee
+++ test/app/views/editor/component/ThangComponentsEditView.spec.coffee
@@ -35,27 +35,31 @@
     supermodel.registerModel(componentC)
     view = new ThangComponentEditView({ components: [], supermodel: supermodel })
     jasmine.Ajax.requests.sendResponses { '/db/thang.type': [] }
-    _.delay ->
+    _.defer ->
       view.render()
       view.componentsTreema.set('/', [ { original: 'C', majorVersion: 0 }])
       spyOn(window, 'noty')
-      done()
+      success = jasmine.Ajax.requests.sendResponses(responses)
+      expect(success).toBeTruthy()
+      _.defer ->
+        done()
+
+  afterEach ->
+    view.destroy()

   it 'loads dependencies when you add a component with the left side treema', ->
-    success = jasmine.Ajax.requests.sendResponses(responses)
-    expect(success).toBeTruthy()
     expect(_.size(view.subviews)).toBe(3)

   # TODO: Figure out why this is breaking karma but not always
-  xit 'adds dependencies to its components list', ->
-    jasmine.Ajax.requests.sendResponses(responses)
+  it 'adds dependencies to its components list', ->
+#    jasmine.Ajax.requests.sendResponses(responses)
     componentOriginals = (c.original for c in view.components)
     expect('A' in componentOriginals).toBeTruthy()
     expect('B' in componentOriginals).toBeTruthy()
     expect('C' in componentOriginals).toBeTruthy()

   it 'removes components that are dependent on a removed component', ->
-    jasmine.Ajax.requests.sendResponses(responses)
+#    jasmine.Ajax.requests.sendResponses(responses)
     view.components = (c for c in view.components when c.original isnt 'A')
     view.onComponentsChanged()
     expect(view.components.length).toBe(0)


Update for Don's change.

Update for Don's change.


Unable checking signature

Unable checking signature

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/nunulk/robo-blanca.git/'


Fix for 5ea41275b36f43dca9ea1c5bc3db196bf4aba5d8

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/netguru/people.git/'


Update portrait image class name

Update portrait image class name

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lonelyplanet/rizzo.git/'


update accordion logic to allow closing the active section (no longer qualifies as an accordion ;))

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/PLOS/open_evaluation.git/'


Levels and Components with i18nCoverage update that coverage from the level editor now.

--- app/views/editor/level/modals/SaveLevelModal.coffee
+++ app/views/editor/level/modals/SaveLevelModal.coffee
@@ -96,6 +96,7 @@
     @showLoading()
     tuples = _.zip(modelsToSave, formsToSave)
     for [newModel, form] in tuples
+      newModel.updateI18NCoverage() if newModel.get('i18nCoverage')
       res = newModel.save()
       do (newModel, form) =>
         res.error =>


app/flux: add team stack templates store

error: pathspec 'client/app/lib/flux/environment/stores/teamstacktemplatesstore.coffee' did not match any file(s) known to git

--- client/app/lib/flux/environment/stores/teamstacktemplatesstore.coffee
+++ client/app/lib/flux/environment/stores/teamstacktemplatesstore.coffee
@@ -0,0 +1,26 @@
+KodingFluxStore      = require 'app/flux/base/store'
+toImmutable          = require 'app/util/toImmutable'
+immutable            = require 'immutable'
+actions              = require '../actiontypes'
+
+
+module.exports = class TeamStackTemplatesStore extends KodingFluxStore
+
+  @getterPath = 'TeamStackTemplatesStore'
+
+  getInitialState: -> immutable.Map()
+
+  initialize: ->
+
+    @on actions.LOAD_TEAM_STACK_TEMPLATES_SUCCESS, @load
+
+
+  load: (stackTemplates, { templates }) ->
+
+    stackTemplates = stackTemplates.withMutations (_templates) ->
+      templates.forEach (template) ->
+        _templates.set template._id, toImmutable template
+
+    return stackTemplates
+
+


commit

commit

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Romaboy/awesomeadmin.git/'


Add tests for AWS.ResourceWaiter

Add tests for AWS.ResourceWaiter

error: pathspec 'test/resource_waiter.spec.coffee' did not match any file(s) known to git

--- test/resource_waiter.spec.coffee
+++ test/resource_waiter.spec.coffee
@@ -0,0 +1,102 @@
+# Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"). You
+# may not use this file except in compliance with the License. A copy of
+# the License is located at
+#
+#     http://aws.amazon.com/apache2.0/
+#
+# or in the "license" file accompanying this file. This file is
+# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+# ANY KIND, either express or implied. See the License for the specific
+# language governing permissions and limitations under the License.
+
+helpers = require('./helpers')
+AWS = helpers.AWS
+
+describe 'AWS.ResourceWaiter', ->
+  describe 'wait', ->
+    it 'waits until a given state is met', ->
+      err = null; data = null; resp = null
+      db = new AWS.DynamoDB
+      helpers.mockResponses db, [
+        {data: {Table: TableStatus: 'LOADING'}},
+        {data: {Table: TableStatus: 'LOADING'}},
+        {data: {Table: TableStatus: 'ACTIVE'}}
+      ]
+
+      waiter = new AWS.ResourceWaiter(db, 'tableExists')
+      waiter.wait (e, d) -> resp = this; err = e; data = d
+      expect(err).toEqual(null)
+      expect(data.Table.TableStatus).toEqual('ACTIVE')
+      expect(resp.waiterRetryCount).toEqual(2)
+
+    it 'can override the final state', ->
+      err = null; data = null; resp = null
+      db = new AWS.DynamoDB
+      helpers.mockResponses db, [
+        {data: {Table: TableStatus: 'LOADING'}},
+        {data: {Table: TableStatus: 'LOADING'}},
+        {data: {Table: TableStatus: 'ACTIVE'}},
+        {data: {Table: TableStatus: 'FOO'}}
+      ]
+
+      waiter = new AWS.ResourceWaiter(db, {tableExists: 'FOO'})
+      waiter.wait (e, d) -> resp = this; err = e; data = d
+      expect(err).toEqual(null)
+      expect(data.Table.TableStatus).toEqual('FOO')
+      expect(resp.waiterRetryCount).toEqual(3)
+
+    it 'throws an error if terminal state is not configured', ->
+      try
+        new AWS.ResourceWaiter(new AWS.DynamoDB, 'invalidState')
+      catch e
+        err = e
+      expect(err.message).toEqual('State invalidState not found.')
+
+    it 'gives up after a maximum number of retries', ->
+      err = null; data = null; resp = null
+      db = new AWS.DynamoDB
+      resps = ({data: {Table: {TableStatus: 'LOADING'}}} for _ in [1..26])
+      resps.push({data: {Table: {TableStatus: 'ACTIVE'}}})
+      helpers.mockResponses db, resps
+
+      waiter = new AWS.ResourceWaiter(db, 'tableExists')
+      waiter.wait (e, d) -> resp = this; err = e; data = d
+      expect(data).toEqual(null)
+      expect(err.code).toEqual('ResourceNotReady')
+      expect(resp.waiterRetryCount).toEqual(25)            # 25 max retries
+      expect(resp.request.retryDelay(resp)).toEqual(20000) # 20s delay
+
+    it 'accepts error state as a terminal state', ->
+      err = null; data = null; resp = null
+      s3 = new AWS.S3
+      helpers.mockResponses s3, [
+        {httpResponse: {statusCode: 200}},
+        {httpResponse: {statusCode: 200}},
+        {httpResponse: {statusCode: 404}}
+      ]
+
+      waiter = new AWS.ResourceWaiter(s3, 'bucketNotExists')
+      waiter.wait Bucket: 'bucket', (e, d) -> resp = this; err = e; data = d
+      expect(err).toEqual(null)
+      expect(resp.httpResponse.statusCode).toEqual(404)
+      expect(resp.waiterRetryCount).toEqual(2)
+
+    it 'fails fast if failure value is found', ->
+      err = null; data = null; resp = null
+      ec2 = new AWS.EC2
+      helpers.mockResponses ec2, [
+        {data: {Reservations: [{Instances: [{State: {Name: 'pending'}}]}]}},
+        {data: {Reservations: [{Instances: [{State: {Name: 'pending'}}]}]}},
+        {data: {Reservations: [{Instances: [{State: {Name: 'pending'}}]}]}},
+        {data: {Reservations: [{Instances: [{State: {Name: 'terminated'}}]}]}},
+        {data: {Reservations: [{Instances: [{State: {Name: 'pending'}}]}]}},
+        {data: {Reservations: [{Instances: [{State: {Name: 'running'}}]}]}}
+      ]
+
+      waiter = new AWS.ResourceWaiter(ec2, 'instanceRunning')
+      waiter.wait InstanceIds: ['id-123456'], (e, d) -> resp = this; err = e; data = d
+      expect(data).toEqual(null)
+      expect(err.code).toEqual('ResourceNotReady')
+      expect(resp.waiterRetryCount).toEqual(3)


ensure first view is activated

ensure first view is activated

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Creative-Licence-Digital/backbone.viewstack.git/'


convenience for accessing store

convenience for accessing store

error: pathspec 'app/initializers/store-convenience.coffee' did not match any file(s) known to git


feat(super): Also use super in generated subgenerator

Uses super in the generated subgenerator and updates corresponding comment.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tuxracer/generator-generatorcs.git/'


resolved conflict

resolved conflict

--- lib/assets/javascripts/turbolinks.js.coffee
+++ lib/assets/javascripts/turbolinks.js.coffee
@@ -21,8 +21,8 @@
   xhr.setRequestHeader 'X-Push-State-Referer', referer

   xhr.onload  = ->
+    changePage extractTitleAndBody(xhr.responseText)...
     checkHeaders xhr
-    changePage extractTitleAndBody(xhr.responseText)...
     triggerEvent 'page:load'
   xhr.onabort = -> console.log 'Aborted turbolink fetch!'
   xhr.send()
@@ -158,12 +158,12 @@
 noTurbolink = (link) ->
   link.getAttribute('data-no-turbolink')?

-newTabClick = (event) ->
-  event.which > 1 or event.metaKey or event.ctrlKey
+nonStandardClick = (event) ->
+  event.which > 1 or event.metaKey or event.ctrlKey or event.shiftKey or event.altKey

 ignoreClick = (event, link) ->
   crossOriginLink(link) or anchoredLink(link) or nonHtmlLink(link) or
-  remoteLink(link)      or noTurbolink(link)  or newTabClick(event)
+  remoteLink(link)      or noTurbolink(link)  or nonStandardClick(event)

 historyReplaceState = (state, title, url) ->
   window.history.replaceState state, title, url
@@ -172,7 +172,6 @@
 historyPushState = (state, title, url) ->
   window.history.pushState state, title, url
   historyState = state
-

 browserSupportsPushState =


sometimes a node is clicked, then it is removed from the dom before extractLink can climb it's tree

--- lib/assets/javascripts/turbolinks.js.coffee
+++ lib/assets/javascripts/turbolinks.js.coffee
@@ -155,14 +155,14 @@
 handleClick = (event) ->
   unless event.defaultPrevented
     link = extractLink event
-    if link.nodeName is 'A' and !ignoreClick(event, link)
+    if link?.nodeName is 'A' and !ignoreClick(event, link)
       visit link.href
       event.preventDefault()

 extractLink = (event) ->
   link = event.target
-  link = link.parentNode until link is document or link.nodeName is 'A'
+  link = link.parentNode until link is document or !link or link.nodeName is 'A'
   link

 samePageLink = (link) ->


Set `startConnect` option on Sauce Labs Karma config when in CI env.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/JoshuaToenyes/stout-core.git/'


Common sku line functionality

Common sku line functionality

error: pathspec 'client/skr/models/mixins/SkuLine.coffee' did not match any file(s) known to git

--- client/skr/models/mixins/SkuLine.coffee
+++ client/skr/models/mixins/SkuLine.coffee
@@ -0,0 +1,58 @@
+ASSOCIATIONS =
+    uom_choices: { collection: "Uom", options: ->
+        with: {for_sku_loc: @sku_loc_id}, query: {}
+
+    }
+    sku_choices: { collection: "Sku", options: ->
+        with: {in_location: @location_id}, query: {}
+        include: ['sku_locs', 'uoms']
+    }
+    sku:         { model: "Sku"    }
+    uom:         { model: "Uom"    }
+    sku_loc:     { model: "SkuLoc" }
+
+
+DERIVED =
+    total:  deps: ['qty', 'price'], fn: -> _.bigDecimal(@qty * @price)
+
+Skr.Models.Mixins.SkuLine = {
+
+    included: (klass) ->
+        _.extend( klass::derived ||= {},      DERIVED)
+        _.extend( klass::associations ||= {}, ASSOCIATIONS)
+
+    initialize: ->
+        @on("change:sku", @onSkuChange)
+        @on("change:uom", @onUomChange)
+        @on('change:location_id', @onLocationChange)
+        @uom_choices.on("add", @onUomsLoad, this)
+        @uom.size = @uom_size
+        @uom.code = @uom_code
+
+    onLocationChange: ->
+        if @location_id
+            @sku_choices.options.with.in_location = @location_id
+
+    onUomsLoad: ->
+        uom = this.uom_choices.findWhere(size: @uom_size, code: @uom_code)
+        this.uom.copyFrom(uom) if uom
+
+    onSkuChange: ->
+        return unless @sku
+        sl = @sku.sku_locs.findWhere(sku_id: @sku.id)
+        if sl
+            @set(sku_loc: sl)
+            @uom_choices.options.with.for_sku_loc = sl.id
+        unless @sku.uoms.isEmpty()
+            @uom_choices.reset(@sku.uoms.models)
+            this.set(uom: @sku.uoms.findWhere(size: @uom_size) or @sku.uoms.first())
+
+        @sku_code    = @sku.code if @sku.code
+        @description = @sku.description if @sku.description
+
+    onUomChange: (uom) ->
+        if @uom_code isnt uom.code or @uom_size isnt uom.size
+            @price = Skr.Models.PricingProvider.price({uom})
+        @uom_code = uom.code
+        @uom_size = uom.size
+}


Un-F. 2 failures left in suite.

Un-F. 2 failures left in suite.

--- spec/app/editor-spec.coffee
+++ spec/app/editor-spec.coffee
@@ -9,7 +9,7 @@
 _ = require 'underscore'
 fs = require 'fs'

-fdescribe "Editor", ->
+describe "Editor", ->
   [rootView, project, buffer, editor, cachedLineHeight] = []

   getLineHeight = ->


Fix slides controller dependency injection

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/minamarkham/gifpoint.git/'


Allow updates to the application menu

Allow updates to the application menu

--- src/atom-application.coffee
+++ src/atom-application.coffee
@@ -165,7 +165,7 @@
       else
         @promptForPath()

-    ipc.once 'update-application-menu', (processId, routingId, template, keystrokesByCommand) =>
+    ipc.on 'update-application-menu', (processId, routingId, template, keystrokesByCommand) =>
       @applicationMenu.update(template, keystrokesByCommand)

     ipc.on 'run-package-specs', (processId, routingId, specDirectory) =>


Allow CommandRegistry::rootNode to be reassigned

--- src/command-registry.coffee
+++ src/command-registry.coffee
@@ -9,11 +9,13 @@
   constructor: (@rootNode) ->
     @listenersByCommandName = {}

-  setRootNode: (rootNode) ->
-    throw new Error("Already assigned root node.") if @rootNode?
-    @rootNode = rootNode
+  setRootNode: (newRootNode) ->
+    oldRootNode = @rootNode
+    @rootNode = newRootNode
+
     for commandName of @listenersByCommandName
-      @rootNode?.addEventListener(commandName, @dispatchCommand, true)
+      oldRootNode?.removeEventListener(commandName, @dispatchCommand, true)
+      newRootNode?.addEventListener(commandName, @dispatchCommand, true)

   add: (selector, commandName, callback) ->
     if typeof commandName is 'object'


this commit should fail

this commit should fail

--- spec/atom/editor-spec.coffee
+++ spec/atom/editor-spec.coffee
@@ -24,7 +24,7 @@
       expect(editor.lines.find('.line:eq(2)').html()).toContain '<'

       # renders empty lines with a non breaking space
-      expect(buffer.lineForRow(10)).toBe ''
+      expect(buffer.lineForRow(10)).toBe 'something'
       expect(editor.lines.find('.line:eq(10)').html()).toBe ' '

     it "syntax highlights code based on the file type", ->


Use Project::addBuffer instead of ::openSync

--- spec/text-buffer-spec.coffee
+++ spec/text-buffer-spec.coffee
@@ -955,14 +955,14 @@

           filePath = temp.openSync('atom').path
           fs.writeFileSync(filePath, "words")
-          {buffer} = project.openSync(filePath)
+          buffer = project.addBuffer(new TextBuffer({filePath}))
           buffer.setText("BUFFER CHANGE")

-          state = buffer.serialize()
+          state = buffer.getState().clone()
           expect(state.getObject('text')).toBe 'BUFFER CHANGE'
           fs.writeFileSync(filePath, "DISK CHANGE")

-          buffer2 = deserialize(state, {project})
+          buffer2 = project.addBuffer(new TextBuffer(state))

           waitsFor ->
             buffer2.cachedDiskContents


:lipstick:

:lipstick:

--- src/app/event-emitter.coffee
+++ src/app/event-emitter.coffee
@@ -83,4 +83,3 @@
     for name, handlers of @eventHandlersByEventName
       count += handlers.length
     count
-


Add css task

Add css task

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/chuckeles/chuckeles.github.io.git/'


Added 'buffs' file

Added 'buffs' file

error: pathspec 'src/definitions/buffs.coffee' did not match any file(s) known to git

--- src/definitions/buffs.coffee
+++ src/definitions/buffs.coffee
@@ -0,0 +1,10 @@
+class exports.SizeAltered
+	name: ->
+		if @factor < 1 then 'shrunken x' + (1/@factor)
+		else 'enlarged x' + @factor
+
+	constructor: ({@factor}) ->
+
+	modifyStat: (creature, stat, name) ->
+		if name in ['strength', 'agility', 'endurance', 'weight']
+			Math.max 1, stat * @factor // 1


Adding logging

Adding logging

error: pathspec 'src/logger.subscriber.coffee' did not match any file(s) known to git

--- src/logger.subscriber.coffee
+++ src/logger.subscriber.coffee
@@ -0,0 +1,12 @@
+errorToJson = require "error-to-json"
+
+module.exports =
+  listenTo: (observable) ->
+    observable.on "started", ({ context: { log }, message })->
+      log "An new message has been received", message
+
+    observable.on "successful", ({ context: { log } }) ->
+      log "Process successful"
+
+    observable.on "unsuccessful", ({ context: { log }, err }) ->
+      log "Process unsuccessful", errorToJson(err)


allow negatives in smartnumber

allow negatives in smartnumber

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/UM-USElab/gradecraft-development.git/'


start of making CodeView a class -- works, mostly, so far

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/robey/carrot16.git/'


Input: Added Input component.

Input: Added Input component.

error: pathspec 'src/coffee/components/Input.coffee' did not match any file(s) known to git

--- src/coffee/components/Input.coffee
+++ src/coffee/components/Input.coffee
@@ -0,0 +1,71 @@
+goog.provide 'spark.components.Input'
+goog.require 'spark.core.View'
+
+
+###*
+  Input component of Spark Framework.
+###
+class spark.components.Input extends spark.core.View
+
+  ###*
+    @constructor
+    @param   {Object=} options Class options.
+    @param   {*=} data Class data
+    @extends {spark.core.View}
+  ###
+
+  constructor: (options = {}, data) ->
+
+    options.tagName          = 'input'
+    options.cssClass         = "#{spark.utils.concatString 'input', options.cssClass}"
+    options.type           or= 'text'
+    options.placeholder    or= null
+    options.callback       or= null
+    options.eventHandlers  or= {}
+    options.value          or= ""
+
+    {callback} = options
+    if typeof callback is 'function'
+      options.eventHandlers.keypress = (event) =>
+        if event.charCode is 13
+          callback.call this, event
+
+    super options, data
+
+    @setAttribute 'type', options.type
+
+    if options.placeholder
+      @setPlaceholder options.placeholder
+
+    if options.value
+      @setValue options.value
+
+
+  ###*
+    Sets input value.
+    @param {!string} value Input value.
+  ###
+  setValue: (value) ->
+    @getElement().value = value
+
+
+  ###*
+    Return input value.
+  ###
+  getValue: ->
+    return @getElement().value
+
+
+  ###*
+    Sets placeholder attribute.
+    @param {!string} value Placeholder value.
+  ###
+  setPlaceholder: (value) ->
+    @setAttribute 'placeholder', value
+
+
+  ###*
+    Clears placeholder attribute.
+  ###
+  clearPlaceholder: ->
+    @removeAttribute 'placeholder'


change View example to use view that exists in default project

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


client: create generic checkbox

client: create generic checkbox

error: pathspec 'client/app/lib/components/common/checkbox.coffee' did not match any file(s) known to git

--- client/app/lib/components/common/checkbox.coffee
+++ client/app/lib/components/common/checkbox.coffee
@@ -0,0 +1,26 @@
+_ = require 'lodash'
+kd = require 'kd'
+React = require 'kd-react'
+
+module.exports = class CheckBox extends React.Component
+
+  @propTypes =
+    checked: React.PropTypes.bool.isRequired
+    onChange: React.PropTypes.func
+    onClick: React.PropTypes.func
+
+  @defaultProps =
+    onChange: kd.noop
+    onClick: kd.noop
+
+
+  render: ->
+    props = _.omit @props, ['onClick', 'className']
+
+

+      <input
+        type='checkbox'
+        className={kd.utils.curry 'kdinput checkbox', @props.className}
+        {...props} />
+
+


EnvironmentsModal: will be the main modal for machine listing from now on

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Client: Activity: Creted isScrollTreshholdReached method. it returns boolean for is scroll threshold reached or not with calculating scroll position


IDETailerPane: basically readonly editor pane with log.tail ability of new klient


Measure activate time of TextMate packages

--- src/text-mate-package.coffee
+++ src/text-mate-package.coffee
@@ -15,7 +15,7 @@
     @activationPromise = @activationPromise.then =>
       pack.loadGrammars()
         .then -> pack.loadScopedProperties()
-        .fail (error) -> console.log pack.name, error
+        .fail (error) -> console.log pack.name, error.stack ? error

   constructor: ->
     super
@@ -29,8 +29,9 @@
     @measure 'loadTime', =>
       @metadata = Package.loadMetadata(@path, true)

-  activate: ({sync, immediate}={})->
-    TextMatePackage.addToActivationPromise(this)
+  activate: ->
+    @measure 'activateTime', =>
+      TextMatePackage.addToActivationPromise(this)

   activateSync: ->
     @loadGrammarsSync()


Initial tracker event type mapping

Initial tracker event type mapping


Wire up the separate action button

Wire up the separate action button

--- lms/static/coffee/src/staff_grading/staff_grading.coffee
+++ lms/static/coffee/src/staff_grading/staff_grading.coffee
@@ -26,7 +26,7 @@
           response =
             success: true
             problem_name: 'Problem 1'
-            num_left: 3
+            num_graded: 3
             num_total: 5
             prompt: '''

S11E3: Metal Bands

@@ -56,7 +56,7 @@
           response =
             success: true
             problem_name: 'Problem 2'
-            num_left: 2
+            num_graded: 2
             num_total: 5
             prompt: 'This is a fake second problem'
             submission: 'This is the best submission ever! ' + @mock_cnt
@@ -75,16 +75,16 @@
         @mock('get_next', {location: data.location})
     # get_problem_list
     # sends in a course_id and a grader_id
-    # should get back a list of problem_ids, problem_names, num_left, num_total
+    # should get back a list of problem_ids, problem_names, num_graded, num_total
     else if cmd == 'get_problem_list'
       @mock_cnt = 1
       response =
         success: true
         problem_list: [
           {location: 'i4x://MITx/3.091x/problem/open_ended_demo1', \
-            problem_name: "Problem 1", num_left: 3, num_total: 5},
+            problem_name: "Problem 1", num_graded: 3, num_total: 5},
           {location: 'i4x://MITx/3.091x/problem/open_ended_demo2', \
-            problem_name: "Problem 2", num_left: 1, num_total: 5}
+            problem_name: "Problem 2", num_graded: 1, num_total: 5}
         ]
     else
       response =
@@ -97,7 +97,7 @@
           message: 'No more submissions'

-    if @mock_cnt % 7 == 0
+    if @mock_cnt % 3 == 0
       response =
         success: false
         error: 'An error for testing'
@@ -139,6 +139,7 @@
     @feedback_area = $('.feedback-area')
     @score_selection_container = $('.score-selection-container')
     @submit_button = $('.submit-button')
+    @action_button = $('.action-button')
     @ml_error_info_container = $('.ml-error-info-container')

     @breadcrumbs = $('.breadcrumbs')
@@ -156,16 +157,15 @@
     @location = ''
     @prompt_name = ''
     @num_total = 0
-    @num_left = 0
+    @num_graded = 0

     @score = null
     @problems = null

     # action handlers
     @submit_button.click @submit
-
-    # render intial state
-    #@render_view()
+    # TODO: fix this to do something more intelligent
+    @action_button.click @submit

     # send initial request automatically
     @get_problem_list()
@@ -190,7 +190,7 @@

   set_button_text: (text) =>
-    @submit_button.attr('value', text)
+    @action_button.attr('value', text)

   graded_callback: (event) =>
     @score = event.target.value
@@ -207,7 +207,7 @@
       if response.problem_list
         @problems = response.problem_list
       else if response.submission
-        @data_loaded(response.prompt, response.submission, response.rubric, response.submission_id, response.max_score, response.ml_error_info, response.problem_name, response.num_left, response.num_total)
+        @data_loaded(response.prompt, response.submission, response.rubric, response.submission_id, response.max_score, response.ml_error_info, response.problem_name, response.num_graded, response.num_total)
       else
         @no_more(response.message)
     else
@@ -237,7 +237,7 @@
     @error_msg = msg
     @state = state_error

-  data_loaded: (prompt, submission, rubric, submission_id, max_score, ml_error_info, prompt_name, num_left, num_total) ->
+  data_loaded: (prompt, submission, rubric, submission_id, max_score, ml_error_info, prompt_name, num_graded, num_total) ->
     @prompt = prompt
     @submission = submission
     @rubric = rubric
@@ -247,7 +247,7 @@
     @score = null
     @ml_error_info=ml_error_info
     @prompt_name = prompt_name
-    @num_left = num_left
+    @num_graded = num_graded
     @num_total = num_total
     @state = state_grading
     if not @max_score?
@@ -256,7 +256,7 @@
   no_more: (message) ->
     @prompt = null
     @prompt_name = ''
-    @num_left = 0
+    @num_graded = 0
     @num_total = 0
     @submission = null
     @rubric = null
@@ -267,11 +267,6 @@
     @max_score = 0
     @state = state_no_data

-  hide_if_empty: (container,message) ->
-    if message == ''
-      container.hide()
-    else
-      container.html(message)

   render_view: () ->
     # clear the problem list and breadcrumbs
@@ -280,8 +275,10 @@
     @problem_list_container.toggle(@list_view)
     if @backend.mock_backend
       @message = @message + "
NOTE: Mocking backend.
"
-    @hide_if_empty(@message_container, @message)
-    @hide_if_empty(@error_container, @error_msg)
+    @message_container.html(@message)
+    @error_container.html(@error_msg)
+    @message_container.toggle(@message != "")
+    @error_container.toggle(@error_msg != "")

     # only show the grading elements when we are not in list view or the state
@@ -293,7 +290,7 @@
     @rubric_wrapper.toggle(show_grading_elements)
     @grading_wrapper.toggle(show_grading_elements)
     @ml_error_info_container.toggle(show_grading_elements)
-    @submit_button.hide()
+    @action_button.hide()

     if @list_view
       @render_list()
@@ -302,7 +299,7 @@

   problem_link:(problem) ->
     link = $('').attr('href', "javascript:void(0)").append(
-      "#{problem.problem_name} (#{problem.num_left} left out of #{problem.num_total})")
+      "#{problem.problem_name} (#{problem.num_graded} graded out of #{problem.num_total})")
         .click =>
           @get_next_submission problem.location

@@ -320,6 +317,7 @@
   render_problem: () ->
     # make the view elements match the state.  Idempotent.
     show_submit_button = true
+    show_action_button = true

     problem_list_link = $('').attr('href', 'javascript:void(0);')
       .append("< Back to problem list")
@@ -331,21 +329,24 @@

     if @state == state_error
       @set_button_text('Try loading again')
+      show_action_button = true

     else if @state == state_grading
       @ml_error_info_container.html(@ml_error_info)
       @prompt_container.html(@prompt)
-      @prompt_name_container.html("#{@prompt_name} (#{@num_left} left out of #{@num_total})")
+      @prompt_name_container.html("#{@prompt_name} (#{@num_graded} completed out of #{@num_total})")
       @submission_container.html(@make_paragraphs(@submission))
       @rubric_container.html(@rubric)

       # no submit button until user picks grade.
       show_submit_button = false
+      show_action_button = false

       @setup_score_selection()

     else if @state == state_graded
       @set_button_text('Submit')
+      show_action_button = false

     else if @state == state_no_data
       @message_container.html(@message)
@@ -355,6 +356,7 @@
       @error('System got into invalid state ' + @state)

     @submit_button.toggle(show_submit_button)
+    @action_button.toggle(show_action_button)

   submit: (event) =>
     event.preventDefault()