frontend spring cleaning: admin: file deleted

--- client/admin/lib/views/permissions/groupsmemberroleseditview.coffee
+++ client/admin/lib/views/permissions/groupsmemberroleseditview.coffee
@@ -1,159 +0,0 @@
-kd = require 'kd'
-KDButtonView = kd.ButtonView
-KDInputCheckboxGroup = kd.InputCheckboxGroup
-KDLoaderView = kd.LoaderView
-KDModalView = kd.ModalView
-KDNotificationView = kd.NotificationView
-GroupsDangerModalView = require './groupsdangermodalview'
-remote = require('app/remote').getInstance()
-showError = require 'app/util/showError'
-JView = require 'app/jview'
-$ = require 'jquery'
-
-
-module.exports = class GroupsMemberRolesEditView extends JView
-
-  constructor:(options = {}, data)->
-
-    super
-
-    @loader   = new KDLoaderView
-      size    :
-        width : 22
-
-  setRoles:(editorsRoles, allRoles)->
-    allRoles = allRoles.reduce (acc, role)->
-      acc.push role.title  unless role.title in ['owner', 'guest', 'member']
-      return acc
-    , []
-
-    @roles      = {
-      usersRole    : @getDelegate().usersRole
-      allRoles
-      editorsRoles
-    }
-
-  setMember:(@member)->
-
-  setGroup:(@group)->
-
-  setStatus:(@status)->
-
-  getSelectedRoles:->
-    @checkboxGroup.getValue()
-
-  addViews:->
-
-    @loader.hide()
-
-    isAdmin = 'admin' in @roles.usersRole
-    @checkboxGroup = new KDInputCheckboxGroup
-      name           : 'user-role'
-      cssClassPrefix : 'role-'
-      defaultValue   : @roles.usersRole
-      checkboxes     : @roles.allRoles.map (role)=>
-        if role is 'admin'
-          callback = =>
-            isAdmin = 'admin' in @checkboxGroup.getValue()
-            for el in @checkboxGroup.getInputElements()
-              el = $(el)
-              if el.val() isnt 'admin'
-                if isAdmin
-                  el.removeAttr 'checked'
-                  el.parent().hide()
-                else
-                  el.parent().show()
-        else
-          callback = ->
-
-        value      : role
-        title      : role.capitalize()
-        visible    : if role isnt 'admin' and isAdmin then no else yes
-        callback   : callback
-
-    @addSubView @checkboxGroup, '.checkboxes'
-
-    @addSubView (new KDButtonView
-      title    : 'Save'
-      style    : 'solid small green'
-      callback : =>
-        @getDelegate().emit 'RolesChanged', @getDelegate().getData(), @getSelectedRoles()
-        @getDelegate().hideEditMemberRolesView()
-        kd.log "save"
-    ), '.buttons'
-
-    @addSubView (new KDButtonView
-      title    : "Kick"
-      style    : 'solid small red'
-      callback : => @showKickModal()
-    ), '.buttons'
-
-    if 'owner' in @roles.editorsRoles
-      @addSubView (new KDButtonView
-        title    : "Make Owner"
-        style    : 'solid small'
-        callback : => @showTransferOwnershipModal()
-      ), '.buttons'
-
-    if @group.slug is "koding" and @status is "unconfirmed"
-      @addSubView (confirmButton = new KDButtonView
-        title    : "Confirm"
-        style    : 'solid small'
-        callback : =>
-          remote.api.JAccount.verifyEmailByUsername @member.profile.nickname, (err) =>
-            return showError err  if err
-            new KDNotificationView title: 'User confirmed'
-            @status = "confirmed"
-            @emit 'UserConfirmed', @member
-            confirmButton.destroy()
-      ), '.buttons'
-
-    @$('.buttons').removeClass 'hidden'
-
-  showTransferOwnershipModal:->
-    modal = new GroupsDangerModalView
-      action     : 'Transfer Ownership'
-      longAction : 'transfer the ownership to this user'
-      callback   : =>
-        @group.transferOwnership @member.getId(), (err)=>
-          return @showErrorMessage err if err
-          new KDNotificationView title:'Ownership transferred!'
-          @getDelegate().emit 'OwnershipChanged'
-          modal.destroy()
-    , @group
-
-  showKickModal:->
-    modal = new KDModalView
-      title          : 'Kick Member'
-      content        : "
Are you sure you want to kick this member?
"
-      height         : 'auto'
-      overlay        : yes
-      buttons        :
-        Kick         :
-          style      : "solid red medium"
-          loader     :
-            color    : "#444444"
-          callback   : =>
-            @group.kickMember @member.getId(), (err)=>
-              return @showErrorMessage err if err
-              @getDelegate().destroy()
-              modal.buttons.Kick.hideLoader()
-              modal.destroy()
-        Cancel       :
-          style      : "solid light-gray medium"
-          callback   : (event)-> modal.destroy()
-
-  showErrorMessage:(err)-> showError err
-
-  pistachio:->
-    """
-    {{> @loader}}
-

-

-    """
-
-  viewAppended:->
-
-    super
-
-    @loader.show()


activity feed: fix bug where opening content display by itself causes reconnect

--- client/app/Applications/Activity.kdapplication/AppController.coffee
+++ client/app/Applications/Activity.kdapplication/AppController.coffee
@@ -67,7 +67,7 @@
   loadView:->
     @getView().feedWrapper.ready (controller)=>
       @attachEvents @getView().feedWrapper.controller
-      @ready @bound "refresh"
+      @ready @bound "populateActivity"
     @emit 'ready'

   resetAll:->


fixes JunoLab/atom-julia-client#66

fixes JunoLab/atom-julia-client#66

--- lib/editor/results.coffee
+++ lib/editor/results.coffee
@@ -33,7 +33,7 @@
     if clas then view.classList.add clas
     if plainresult then view.setAttribute 'plain', plainresult
     if @monotypeResults then view.style.font = 'inherit'
-    view.style.position = 'relative'
+    view.style.position = 'absolute'
     view.style.top = -ed.getLineHeightInPixels() + 'px'
     view.style.left = '10px'
     view.style.pointerEvents = 'auto'
@@ -58,13 +58,10 @@
     result.decorator = ed.decorateMarker mark,
       type: 'overlay'
       item: result.view
+    # TODO: clean some of this up. It probably belongs in a constructor
     @methods result
-    setTimeout (->
-      result.view.parentElement.style.pointerEvents = 'none'
-      result.view.addEventListener 'click', =>
-        # change natural ordering so that a click brings the current overlay
-        # to the top of the stack:
-        result.view.parentNode.parentNode.appendChild result.view.parentNode), 100
+    result.view.addEventListener 'click', =>
+      result.view.parentNode.parentNode.appendChild result.view.parentNode
     if !flag
       result.view.classList.add 'ink-hide'
       @timeout 20, =>


Delete unnecessary lines in getNewForm

Delete unnecessary lines in getNewForm

--- app/assets/javascripts/views/restrooms/new.coffee
+++ app/assets/javascripts/views/restrooms/new.coffee
@@ -65,8 +65,6 @@
         restroom:
           latitude: coords.lat
           longitude: coords.long
-      success: (data, textStatus) ->
-        # $('.new-restrooms-form-container').html(data)

   _updateForm: (coords, data, textStatus) =>
     $('.form-container').html(data).hide().fadeIn()


Play jt theme on first contact

Play jt theme on first contact

--- app/models/Event.coffee
+++ app/models/Event.coffee
@@ -28,3 +28,6 @@
           }

         @level.addEntity yeti
+
+        mediator.soundManager.stopAll()
+        mediator.soundManager.playSound @level.manifest.sounds.sounds[0], 1, true


remove offset

remove offset

--- lib/available-package-view.coffee
+++ lib/available-package-view.coffee
@@ -106,7 +106,7 @@

   widen: ->
     # Set grid classes appropriate for installed package panel
-    @addClass('col-lg-8 col-lg-offset-1').removeClass('col-lg-4')
+    @addClass('col-lg-8').removeClass('col-lg-4')

   updateEnablement: ->
     if atom.packages.isPackageDisabled(@pack.name)


:lipstick:

:lipstick:

--- lib/file-info-view.coffee
+++ lib/file-info-view.coffee
@@ -12,33 +12,29 @@
     @bufferModified.classList.add('buffer-modified')
     @appendChild(@bufferModified)

+    @newTooltip()

+    @activeItemSubscription = atom.workspace.onDidChangeActivePaneItem =>
+      @subscribeToActiveItem()
+    @subscribeToActiveItem()
+
+    clickHandler = ->
+      atom.clipboard.write(@getActiveItem()?.getPath?())
+      setTimeout =>
+        @newTooltip()
+      , 2000
+
+    @addEventListener('click', clickHandler)
+    @clickSubscription = new Disposable => @removeEventListener('click', clickHandler)
+
+  newTooltip: ->
+    @myTip?.dispose()
     @myTip = atom.tooltips.add(this,
       title: 'Copied: '+@getActiveItem()?.getPath?()
       trigger: 'click'
       delay:
         show: 0
     )
-
-    @activeItemSubscription = atom.workspace.onDidChangeActivePaneItem =>
-      @subscribeToActiveItem()
-    @subscribeToActiveItem()
-
-    clickHandler = ->
-      getPath = @getActiveItem()?.getPath?()
-      atom.clipboard.write(getPath)
-      setTimeout =>
-        @myTip?.dispose()
-        @myTip = atom.tooltips.add(this,
-          title: 'Copied: '+@getActiveItem()?.getPath?()
-          trigger: 'click'
-          delay:
-            show: 0
-        )
-      , 1500
-
-    @addEventListener('click', clickHandler)
-    @clickSubscription = new Disposable => @removeEventListener('click', clickHandler)

   subscribeToActiveItem: ->
     @modifiedSubscription?.dispose()
@@ -71,13 +67,7 @@

   update: ->
     @updatePathText()
-    @myTip?.dispose()
-    @myTip = atom.tooltips.add(this,
-      title: 'Copied: '+@getActiveItem()?.getPath?()
-      trigger: 'click'
-      delay:
-        show: 0
-    )
+    @newTooltip()
     @updateBufferHasModifiedText(@getActiveItem()?.isModified?())

   updateBufferHasModifiedText: (isModified) ->


fix animation duration calculation and other oddities

--- lib/autohide-tree-view.coffee
+++ lib/autohide-tree-view.coffee
@@ -187,6 +187,7 @@

   # show the tree view
   show: (delay = getConfig('showDelay'), disableHoverEvents = false) ->
+    @visible = true
     # disable hover events on the tree view when not triggered
     # by a hover event
     @disableHoverEvents() if disableHoverEvents
@@ -196,7 +197,6 @@
     # show the content of the tree view
     @treeView.scroller[0].style.display = ''
     @animate(@treeView.list[0].clientWidth, delay).then (finished) =>
-      @visible = true
       # focus the tree view when the animation is done
       @treeView.focus() if finished

@@ -275,7 +275,8 @@
     # get the initial width of the element
     initialWidth = @treeViewEl.clientWidth
     # calculate the animation duration
-    duration = Math.abs targetWidth - initialWidth / (getConfig('animationSpeed') or Infinity)
+    # if animationSpeed equals 0, divide by Infinity for a duration of 0
+    duration = Math.abs (targetWidth - initialWidth) / (getConfig('animationSpeed') or Infinity)

     # cancel any current animation
     if @currentAnimation? and @currentAnimation.playState isnt 'finished'
@@ -285,13 +286,17 @@
       # should trigger immediately
       delay = 0

-    # explicitly set the elements initial width
-    # @treeViewEl.style.width = "#{initialWidth}px"
-    @treeViewEl.style.width = "#{initialWidth}px"
     new Promise (resolve) =>
       # no animation necessary
-      if targetWidth is initialWidth
-        return resolve true
+      if duration is 0
+        setTimeout =>
+          @treeViewEl.style.width = "#{targetWidth}px"
+          resolve true
+        , delay
+        return
+
+      # explicitly set the elements initial width
+      @treeViewEl.style.width = "#{initialWidth}px"

       # cache the current animationPlayer so we can
       # cancel it as another animation begins


daily

daily

--- lib/cli/generators/nim.coffee
+++ lib/cli/generators/nim.coffee
@@ -1,15 +1,15 @@
 #!/usr/bin/env coffee
 ###
- * Entitas code generation
+ * bosco code generation
  *
- * Generate Vala stubs for
- * use by Bosco.ECS/Genie
+ * Generate Nim stubs for
+ * use by bosco.ECS
  *
 ###
 fs = require('fs')
 path = require('path')
 mkdirp = require('mkdirp')
-config = require("#{process.cwd()}/entitas.json")
+config = require("#{process.cwd()}/bosco.json")

 params = (a, sep = ', ') ->
@@ -75,8 +75,6 @@
     s2.push "import bosco/ECS"
     s2.push "import ComponentEx"
     s2.push "type TMatch = ref object of RootObj"
-    s2.push ""
-    s2.push ""

     s3.push "##"
     s3.push "## Entitas Generated World Extensions for #{config.namespace}"
@@ -126,6 +124,7 @@
         when false
           sv.push "  ## @type {#{config.namespace}.#{Name}Component}"
           sv.push "  #{name}Component* : #{Name}Component"
+          sc.push ""
           sc.push "Pool.#{name}Component = #{Name}Component()"
           s1.push "## @type {boolean} "
           s1.push "proc is#{Name}*(this : Entity) : bool ="
@@ -139,7 +138,7 @@
           s1.push ""
           s1.push "##"
           s1.push "## @param {boolean} value"
-          s1.push "## @returns {entitas.Entity}"
+          s1.push "## @returns {bosco.Entity}"
           s1.push "##"
           s1.push "proc set#{Name}*(this : Entity, value : bool) : Entity ="
           s1.push "  this.is#{Name} = value"
@@ -147,17 +146,16 @@
           s1.push ""

         else
-          sv.push "  ## @type {entitas.utils.Bag}"
-          sv.push "  #{name}ComponentPool* : Queue[#{Name}Component]"
+          sv.push "  ## @type {bosco.utils.Bag}"
+          sv.push "  #{name}Component* : Queue[#{Name}Component]"
           s1.push ""

-          sc.push "#Pool.{name}ComponentPool = initQueue[Entity]()"
-          sc.push "Pool.#{name}ComponentPool = initQueue[#{Name}Component]()"
-          sc.push "for i in 1..POOL_SIZE:"
-          sc.push "  Pool.#{name}ComponentPool.add(#{Name}Component())"
+          sc.push ""
+          sc.push "Pool.#{name}Component = initQueue[#{Name}Component]()"
+          sc.push "for i in 1..POOL_SIZE:Pool.#{name}Component.add(#{Name}Component())"

-          s1.push "proc clear#{Name}ComponentPool*(this : Entity) ="
-          s1.push "  Pool.#{name}ComponentPool = initQueue[#{Name}Component]()"
+          s1.push "proc clear#{Name}Component*(this : Entity) ="
+          s1.push "  Pool.#{name}Component = initQueue[#{Name}Component]()"
           s1.push ""
           s1.push "## @type {#{config.namespace}.#{Name}Component} "
           s1.push "proc #{name}*(this : Entity) : #{Name}Component ="
@@ -170,10 +168,10 @@
           s1.push "##"
           for p in properties
             s1.push "## @param {#{p.split(':')[1]}} #{p.split(':')[0]}"
-          s1.push "## @returns {entitas.Entity}"
+          s1.push "## @returns {bosco.Entity}"
           s1.push "##"
           s1.push "proc add#{Name}*(this : Entity, #{properties.join(', ')}) : Entity ="
-          s1.push "  var component = if Pool.#{name}ComponentPool.len > 0 : Pool.#{name}ComponentPool.dequeue() else: #{Name}Component()"
+          s1.push "  var component = if Pool.#{name}Component.len > 0 : Pool.#{name}Component.dequeue() else: #{Name}Component()"
           for p in properties
             s1.push "  component.#{p.split(':')[0]} = #{p.split(':')[0]}"
           s1.push "  discard this.addComponent(int(Component.#{Name}), component)"
@@ -182,26 +180,26 @@
           s1.push "##"
           for p in properties
             s1.push "## @param {#{p.split(':')[1]}} #{p.split(':')[0]}"
-          s1.push "## @returns {entitas.Entity}"
+          s1.push "## @returns {bosco.Entity}"
           s1.push "##"
           s1.push "proc replace#{Name}*(this : Entity, #{properties.join(', ')}) : Entity ="
           s1.push "  var previousComponent = if this.has#{Name} : this.#{name} else: nil"
-          s1.push "  var component = if Pool.#{name}ComponentPool.len > 0 : Pool.#{name}ComponentPool.dequeue() else: #{Name}Component()"
+          s1.push "  var component = if Pool.#{name}Component.len > 0 : Pool.#{name}Component.dequeue() else: #{Name}Component()"
           for p in properties
             s1.push "  component.#{p.split(':')[0]} = #{p.split(':')[0]}"
           s1.push "  discard this.replaceComponent(int(Component.#{Name}), component)"
           s1.push "  if previousComponent != nil:"
-          s1.push "    Pool.#{name}ComponentPool.enqueue(previousComponent)"
+          s1.push "    Pool.#{name}Component.enqueue(previousComponent)"
           s1.push ""
           s1.push "  return this"
           s1.push ""
           s1.push "##"
-          s1.push "## @returns {entitas.Entity}"
+          s1.push "## @returns {bosco.Entity}"
           s1.push "##"
           s1.push "proc remove#{Name}*(this : Entity) : Entity ="
           s1.push "  var component = this.#{name}"
           s1.push "  discard this.removeComponent(int(Component.#{Name}))"
-          s1.push "  Pool.#{name}ComponentPool.enqueue(component)"
+          s1.push "  Pool.#{name}Component.enqueue(component)"
           s1.push "  return this"
           s1.push ""

@@ -211,16 +209,15 @@
     ###
     for Name, properties of config.components
       name = Name[0].toLowerCase()+Name[1...];
-      s2.push "  ## @type {entitas.Match} "
+      s2.push "  ## @type {bosco.Match} "
       s2.push "  match#{Name} : Matcher"

       sm.push ""
-      sm.push "## @type {entitas.Matcher} "
+      sm.push "## @type {bosco.Matcher} "
       sm.push "proc #{Name}*(this : TMatch) : Matcher ="
       sm.push "  if this.match#{Name} == nil:"
       sm.push "    this.match#{Name} = MatchAllOf(@[int(Component.#{Name})])"
       sm.push "  return this.match#{Name}"
-      sm.push ""

@@ -229,7 +226,7 @@
         name = Name[0].toLowerCase()+Name[1...];
         properties = config.components[Name]
         if config.components[Name] is false
-          s3.push "## @type {entitas.Match} "
+          s3.push "## @type {bosco.Match} "
           s3.push "proc #{name}Entity*(this : World) : Entity ="
           s3.push "  return this.getGroup(Match.#{Name}).getSingleEntity()"
           s3.push ""
@@ -247,7 +244,7 @@

         else
-          s3.push "## @type {entitas.Entity} "
+          s3.push "## @type {bosco.Entity} "
           s3.push "proc #{name}Entity*(this : World) : Entity ="
           s3.push "  return this.getGroup(Match.#{Name}).getSingleEntity()"
           s3.push ""
@@ -262,7 +259,7 @@
           s3.push "##"
           for p in properties
             s3.push "## @param {#{p.split(':')[1]}} #{p.split(':')[0]}"
-          s3.push "## @returns {entitas.Entity}"
+          s3.push "## @returns {bosco.Entity}"
           s3.push "##"
           s3.push "proc set#{Name}*(this : World, #{properties.join(', ')}) : Entity ="
           s3.push "  if this.has#{Name}:"
@@ -275,7 +272,7 @@
           s3.push "##"
           for p in properties
             s3.push "## @param {#{p.split(':')[1]}} #{p.split(':')[0]}"
-          s3.push "## @returns {entitas.Entity}"
+          s3.push "## @returns {bosco.Entity}"
           s3.push "##"
           s3.push "proc replace#{Name}*(this : World, #{properties.join(', ')}) : Entity ="
           s3.push "  var entity = this.#{name}Entity"
@@ -286,7 +283,7 @@
           s3.push "  return entity"
           s3.push ""
           s3.push "##"
-          s3.push "## @returns {entitas.Entity}"
+          s3.push "## @returns {bosco.Entity}"
           s3.push "##"
           s3.push "proc remove#{Name}*(this : World) ="
           s3.push "  this.destroyEntity(this.#{name}Entity)"
@@ -294,7 +291,7 @@

-    se.push "type TPool = ref object"
+    se.push "type TPool = ref object of RootObj"
     se.push sv.join('\n')
     se.push "var Pool* = TPool()"
     se.push sc.join('\n')


0.X4a Experiment

0.X4a Experiment

-Added voice notification as experiment

--- Eva.widget/index.coffee
+++ Eva.widget/index.coffee
@@ -1,4 +1,4 @@
-# Version: 0.X3a
+# Version: 0.X4a
 ## If you do not want a transparent widget, please adjust the opacity setting under STYLE
 ## If you do not know how to write HTML/CSS, it is best for you to learn it first before
 ## attempting to customise the UI. Or you can contact me.
@@ -665,6 +665,16 @@
 afterRender: (domEl) ->
 #   Get System Language
     language = navigator.language;
+#   Voice settings
+    window.voiceEnabled = 1
+    window.voice = "yannick"
+    window.voiceBatteryLow = "warnung, batterie fast leer"
+    window.voiceBatteryCharging = "batterie laden"
+    window.voiceCPUzuHohe = "warnung, cpu auslastung zu hohe"
+    window.voiceNichtStoerenEin = "nicht stören modus eingeschaltet"
+    window.voiceNichtStoerenAus = "nicht stören modus ausgeschaltet"
+
+    window.voiceCommand = "say -v " + window.voice + " "
 #   Define constants
     window.segments = ["子時", "丑時", "寅時", "卯時", "辰時", "巳時", "午時", "未時", "申時", "酉時", "戌時", "亥時"]
     if (language.indexOf("de") > -1)
@@ -822,8 +832,6 @@
                 setTimeout (work(element)), Math.random() * 1000
             setTimeout (animation_on(".a0", cellColour)), 1000

-
-
 #   Processing time
     # This is for outputing the time. Nothing really
     date = new Date()
@@ -994,12 +1002,14 @@
     # Bwarning stands for Battery warning, triggers when battery drops below 20% without charging.
     if (parseInt(BatteryPercentage) <= 20 & BatteryState.indexOf("discharging") > -1)
         if (Bwarning == 0)
+            @run voiceCommand + voiceBatteryLow
             colorChange(".a3", "rgba(256,0,0,1)")
             colorChange("#15", "rgba(128,0,0,1)")
             $(domEl).find("#15").css("visibility","visible")
             Bwarning += 1
     else
         if (Bwarning == 1)
+            @run voiceCommand + voiceBatteryCharging
             colorChange(".a3", "rgba(10,10,10,1)")
             colorChange("#15", "rgba(128,0,0,0)")
             $(domEl).find("#15").css("visibility","hidden")
@@ -1007,6 +1017,7 @@
     # Cwarning is for CPU usage. Default value is to trigger when CPU usage reaches 90%
     if CPUUsage/CPUAmount > 90
         if (Cwarning == 0)
+            @run voiceCommand + voiceCPUzuHohe
             colorChange("#CPUCell", "rgba(256,0,0,1)")
             Cwarning += 1
     else
@@ -1014,9 +1025,13 @@
             colorChange("#CPUCell", "rgba(10,10,10,1)")
             Cwarning -= 1
     if Disturbvalues == '1'
-        Mwarning = 1
-    else
-        Mwarning = 0
+        if (Mwarning == 0)
+            @run voiceCommand + voiceNichtStoerenEin
+            Mwarning += 1
+    else
+        if (Mwarning == 1)
+            @run voiceCommand + voiceNichtStoerenAus
+            Mwarning -= 1

     warning_switch(Bwarning+Cwarning, Mwarning)


Add and use editRuleset helper method

Add and use editRuleset helper method

--- karma/flows/test_controllers.coffee
+++ karma/flows/test_controllers.coffee
@@ -124,6 +124,16 @@
         edits(modalScope)
       $timeout.flush()

+    editRuleset = (ruleset, edits) ->
+      # open our editor modal so we can save it
+      $scope.clickRuleset(ruleset)
+      $scope.dialog.opened.then ->
+        modalScope = $modalStack.getTop().value.modalScope
+        edits(modalScope)
+        modalScope.ok()
+      $timeout.flush()
+
+
     it 'should show warning when attempting an infinite loop', ->

       flowService.fetch(flows.webhook_rule_first.id).then ->
@@ -179,18 +189,10 @@

       # now toggle our language so we are in translation mode
       flowService.language = {iso_code:'ara', name:'Arabic'}
-      $scope.clickRuleset(ruleset)
-      $scope.dialog.opened.then ->
-        modalScope = $modalStack.getTop().value.modalScope
-
+      editRuleset ruleset, (scope) ->
         # we should be in translation mode now
-        expect(modalScope.languages.from).toBe('eng')
-        expect(modalScope.languages.to).toBe('ara')
-
-        # test we submit without error
-        modalScope.ok()
-
-      $timeout.flush()
+        expect(scope.languages.from).toBe('eng')
+        expect(scope.languages.to).toBe('ara')

     it 'should filter split options based on flow type', ->

@@ -607,29 +609,20 @@
       $http.flush()

       ruleset = flowService.flow.rule_sets[0]
-      $scope.clickRuleset(ruleset)
-
-      $scope.dialog.opened.then ->
-        modalScope = $modalStack.getTop().value.modalScope
-
-        for rule in modalScope.ruleset.rules
+      editRuleset ruleset, (scope) ->
+        for rule in scope.ruleset.rules
           if rule.label
             expect(rule.uuid).toBeDefined()
             expect(rule.category.base).toBeDefined()
             expect(rule.label).toBeDefined()
             expect(rule._config.type).toBe('eq')

-      $timeout.flush()
-
     it 'isRuleComplete should have proper validation', ->

       loadFavoritesFlow()

       ruleset = flowService.flow.rule_sets[0]
-      $scope.clickRuleset(ruleset)
-
-      $scope.dialog.opened.then ->
-        modalScope = $modalStack.getTop().value.modalScope
+      editRuleset ruleset, (scope) ->

         rule_tests = [
           {rule: {category: null, _config: {operands: null}, test: {}}, complete: false},
@@ -649,6 +642,4 @@
         ]

         for rule_test in rule_tests
-          expect(modalScope.isRuleComplete(rule_test['rule'])).toBe(rule_test['complete'])
-
-      $timeout.flush()
+          expect(scope.isRuleComplete(rule_test['rule'])).toBe(rule_test['complete'])


Decode vm.return and view plaintext

Decode vm.return and view plaintext

--- lib/ethereum-interface.coffee
+++ lib/ethereum-interface.coffee
@@ -540,11 +540,11 @@
                                             _handleSubmit: (childFunction, event) ->
                                                 self = this
                                                 # Get arguments ready here
-                                                that.typesToArray this.refs, childFunction, (error, typArray) ->
+                                                that.typesToArray this.refs, childFunction, (error, argTypArray) ->
                                                     if !error
                                                         that.argsToArray self.refs, childFunction, (error, argArray) ->
                                                             if !error
-                                                                that.callVM(myContract, childFunction, typArray, argArray)
+                                                                that.callVM(myContract, that.abi, childFunction, argTypArray, argArray)
                                                                 ++vmBlockNumber
                                             render: ->
                                                 self = this
@@ -697,36 +697,63 @@
                     result = that.myContract[that.functionName]()
                 that.showOutput that.myContract.address, result

-    callVM: (@myContract, @functionName, @argTypes, @arguments) ->
-        that = this
+    callVM: (@myContract, @abi, @functionName, @argTypes, @arguments) ->
+        that = this
+        # @myContract refers to previously created object
         to = that.myContract.createdAddress.toString('hex')
-        # Buffer.concat([ ethJSABI.methodID(Method Name, input variable types), ethJSABI.rawEncode(input variable types, input variables) ]).toString('hex')
-        buffer = Buffer.concat([ ethJSABI.methodID(that.functionName, that.argTypes), ethJSABI.rawEncode(that.argTypes, that.arguments) ]).toString('hex')
-        rawTx = {
-            nonce: '0x' + vmAccounts['0x' + Coinbase].nonce++,
-            gasPrice: 0x09184e72a000,
-            gasLimit: 0x300000,
-            to: '0x' + to,
-            data: '0x' + buffer
-        }
-        tx = new EthJSTX(rawTx)
-        block = new EthJSBlock({
-                header: {
-                    timestamp: new Date().getTime() / 1000 | 0,
-                    number: vmBlockNumber
-                },
-                transactions: [],
-                uncleHeaders: []
-            })
-        @exeVM block, tx, (error, result) ->
-            if error
-                console.error error
-                that.showErrorMessage 508, error
-            else
-                console.log result
-                outputBuffer = ethJSABI.rawDecode(that.argTypes, result.vm.return)
-                console.log outputBuffer
-                that.showOutput 'Method call is yet to be implemented', 'See github issue https://github.com/gmtDevs/atom-ethereum-interface/issues/23'
+        # Only proceed if the to account exists
+        @checkVMAccExists to, (error, status) ->
+            if status == true
+                # Buffer.concat([ ethJSABI.methodID(Method Name, input variable types), ethJSABI.rawEncode(input variable types, input variables) ]).toString('hex')
+                buffer = Buffer.concat([ ethJSABI.methodID(that.functionName, that.argTypes), ethJSABI.rawEncode(that.argTypes, that.arguments) ]).toString('hex')
+                rawTx = {
+                    nonce: '0x' + vmAccounts['0x' + Coinbase].nonce++,
+                    gasPrice: 0x09184e72a000,
+                    gasLimit: 0x300000,
+                    to: '0x' + to,
+                    data: '0x' + buffer
+                }
+                tx = new EthJSTX(rawTx)
+                block = new EthJSBlock({
+                        header: {
+                            timestamp: new Date().getTime() / 1000 | 0,
+                            number: vmBlockNumber
+                        },
+                        transactions: [],
+                        uncleHeaders: []
+                    })
+                that.exeVM block, tx, (error, result) ->
+                    if error
+                        console.error error
+                        that.showErrorMessage 508, error
+                    else
+                        that.getOutputTypes that.abi, that.functionName, (error, outputTypes) ->
+                            outputBuffer = ethJSABI.rawDecode(outputTypes, result.vm.return)
+                            outputBuffer = ethJSABI.stringify(outputTypes, outputBuffer)
+                            that.showOutput '0x' + that.myContract.createdAddress.toString('hex'), outputBuffer
+
+    checkVMAccExists: (@address, callback) ->
+        that = this
+        VM.stateManager.getAccount '0x' + @address, (error, account) ->
+            callback(null, account.exists)
+
+    getOutputTypes: (@abi, @functionName, callback) ->
+        that = this
+        @asyncLoop @abi.length, ((cycle) ->
+            if that.abi[cycle.iteration()].name == that.functionName
+                that.outputTypestoArray that.abi[cycle.iteration()], (error, outputTypes) ->
+                    callback(null, outputTypes)
+            cycle.next()
+        ), ->
+
+    outputTypestoArray: (@funcAbi, callback) ->
+        that = this
+        types = new Array()
+        @asyncLoop @funcAbi.outputs.length, ((cycle) ->
+            types.push(that.funcAbi.outputs[cycle.iteration()].type)
+            cycle.next()
+        ), ->
+            callback(null, types)

     exeVM: (@block, @tx, callback) ->
         that = this


activity event binding fix

activity event binding fix

--- client/app/Applications/Activity.kdapplication/AppController.coffee
+++ client/app/Applications/Activity.kdapplication/AppController.coffee
@@ -64,7 +64,6 @@
     @lastTo    = null
     @lastFrom  = Date.now()
     @isLoading = no
-    @clearPopulateActivityBindings()
     @listController.resetList()
     @listController.removeAllItems()

@@ -100,6 +99,7 @@

       @resetAll()

+      @clearPopulateActivityBindings()
       if data.type in ["Public", "Followed"]
       then @setFeedFilter data.type
       else @setActivityFilter data.type
@@ -114,8 +114,9 @@

   clearPopulateActivityBindings:->
     eventSuffix = "#{@getFeedFilter()}_#{@getActivityFilter()}"
-    @off "activitiesFetched_#{eventSuffix}"
-    @off "cacheFetched_#{eventSuffix}"
+    @off "followingFeedFetched_#{eventSuffix}"
+    @off "publicFeedFetched_#{eventSuffix}"
+    # log "------------------ bindingsCleared", dateFormat(@lastFrom, "mmmm dS HH:mm:ss"), @_e

   populateActivity:(options = {}, callback=noop)->
     return  if @isLoading
@@ -165,7 +166,7 @@

         @fetchFollowingActivities options

-      # log "------------------    populateActivity", @getActivityFilter(), @lastFrom
+      # log "------------------ populateActivity", dateFormat(@lastFrom, "mmmm dS HH:mm:ss"), @_e

     if isReady
     then fetch()
@@ -193,16 +194,20 @@
       then @emit "activitiesCouldntBeFetched", err
       else @emit "followingFeedFetched_#{eventSuffix}", activities

+  setLastTimestamps:(from, to)->
+    # debugger
+    @lastTo   = to
+    @lastFrom = from
+
+
   # Store first & last cache activity timestamp.
   extractCacheTimeStamps: (cache)->
-    @lastTo   = (new Date cache.to).getTime()
-    @lastFrom = (new Date cache.from).getTime()
+    @setLastTimestamps (new Date cache.from).getTime(), (new Date cache.to).getTime()

   # Store first & last activity timestamp.
   extractTeasersTimeStamps:(teasers)->
     return unless teasers.first
-    @lastTo   = new Date(teasers.first.meta.createdAt).getTime()
-    @lastFrom = new Date(teasers.last.meta.createdAt).getTime()
+    @setLastTimestamps new Date(teasers.last.meta.createdAt).getTime(), new Date(teasers.first.meta.createdAt).getTime()

   sanitizeCache:(cache, callback)->
     activities = clearQuotes cache.activities


Activity: fixes for connection drops on activity feed

--- client/app/Applications/Activity.kdapplication/AppController.coffee
+++ client/app/Applications/Activity.kdapplication/AppController.coffee
@@ -50,9 +50,7 @@
     # else @mainController.on 'AppIsReady', => @putListeners()

     @status = KD.getSingleton "status"
-    @status.on "reconnected", (conn)=>
-      if conn && conn.reason is "internetDownForLongTime"
-      then @refresh()
+    @status.on "reconnected", (conn)=> @refresh()  if conn?.reason is "internetDownForLongTime"

   loadView:->
     @getView().feedWrapper.ready (controller)=>
@@ -66,6 +64,7 @@
     @lastTo    = null
     @lastFrom  = Date.now()
     @isLoading = no
+    @clearPopulateActivityBindings()
     @listController.resetList()
     @listController.removeAllItems()

@@ -99,7 +98,6 @@
     appView.innerNav.on "NavItemReceivedClick", (data)=>
       KD.track "Activity", data.type + "FilterClicked"

-      @clearPopulateActivityBindings()
       @resetAll()

       if data.type in ["Public", "Followed"]
@@ -119,7 +117,7 @@
     @off "activitiesFetched_#{eventSuffix}"
     @off "cacheFetched_#{eventSuffix}"

-  populateActivity:(options = {}, callback)->
+  populateActivity:(options = {}, callback=noop)->
     return  if @isLoading

     @listController.showLazyLoader no
@@ -155,7 +153,7 @@
           reset()
           @extractCacheTimeStamps cache
           @listController.listActivitiesFromCache cache
-          callback? cache
+          callback cache

         @fetchPublicActivities options
       else
@@ -163,7 +161,7 @@
           reset()
           @extractTeasersTimeStamps activities
           @listController.listActivities activities
-          callback? activities
+          callback activities

         @fetchFollowingActivities options


Workspace: User presence on history node.

--- client/landing/CollaborativeWorkspace/collaborativeworkspace.coffee
+++ client/landing/CollaborativeWorkspace/collaborativeworkspace.coffee
@@ -46,6 +46,8 @@
       @userRef = @workspaceRef.child("users").child @nickname
       @userRef.set "online"
       @userRef.onDisconnect().set "offline"
+      record = if isOldSession then "$0 joined the session" else "$0 started the session"
+      @addToHistory record

       if @amIHost()
         @workspaceRef.onDisconnect().remove()
@@ -62,10 +64,14 @@
     @workspaceRef.child("users").on "child_changed", (snapshot) =>
       name = snapshot.name()
       if @amIHost() and snapshot.val() is "offline"
+        message = "#{name} has left the session"
+
         @broadcastMessage
-          title     : "#{name} has left the session"
+          title     : message
           cssClass  : "error"
           sender    : name
+
+        @addToHistory message

     @workspaceRef.on "child_removed", (snapshot) =>
       return  if @disconnectedModal


Cleanup, dangling property

Cleanup, dangling property

--- client/landing/app/Applications/Topics.kdapplication/AppView.coffee
+++ client/landing/app/Applications/Topics.kdapplication/AppView.coffee
@@ -13,11 +13,7 @@
     """

 class TopicsMainView extends KDView
-  listControllerClassMap = ->
-    all         : TopicsListViewController
-    followed    : TopicsListViewControllerFollowed
-    recommended : TopicsListViewControllerRecommended
-
+
   constructor:(options,data)->
     options = $.extend
       ownScrollBars : yes


Fix possible bug

Fix possible bug

--- lib/pg-hoff-server-request.coffee
+++ lib/pg-hoff-server-request.coffee
@@ -41,7 +41,7 @@
                     try
                         json = JSON.parse(body)
                     catch err then ->
-                        reject(err)
+                        throw('Could not parse JSON')
                         atom.notifications.addError('Could not parse JSON: ' + json)

                     fulfil(json)
@@ -79,7 +79,7 @@
                         try
                             json = JSON.parse(body)
                         catch err then ->
-                            reject(err)
+                            throw('Could not parse JSON')
                             atom.notifications.addError('Could not parse JSON: ' + json)

                         fulfil(json)


Code cleanup

Code cleanup

--- configs/build-mode.coffee
+++ configs/build-mode.coffee
@@ -23,6 +23,5 @@

 # For prod, ignore any test assets
 setProdMode = (config) ->
-  config.conventions ?= {}
   addIgnored config, /^test/
   config


cleanup js

cleanup js

--- app/assets/javascripts/ab_admin/components/google_translate.js.coffee
+++ app/assets/javascripts/ab_admin/components/google_translate.js.coffee
@@ -65,7 +65,6 @@
       _.each @locales, (to) =>
         _.each @locales, (from) =>
           $cont_to = $tabs.find(".tab_#{to}")
-          $cont_from = $tabs.find(".tab_#{from}")
           $el = $cont_to.find(".t_locale_#{from}")
           $el.click =>
             for el_to in $cont_to.find("input.string, textarea")


Fixes

Fixes

--- app/assets/javascripts/active_admin/active_admin_globalize3.js.coffee
+++ app/assets/javascripts/active_admin/active_admin_globalize3.js.coffee
@@ -1,14 +1,29 @@
 $ ->
-  $(".activeadmin-translations > ul").each ->
-    $tabs = $("li > a", this)
-    $contents = $(this).siblings("fieldset")

-    $tabs.click ->
-      $tab = $(this)
-      $tabs.not($tab).removeClass("active")
-      $tab.addClass("active")
-      $contents.hide()
-      $contents.filter($tab.attr("href")).show()
-      false
+  translations = ->
+    $(".activeadmin-translations > ul").each ->
+      $dom = $(this)
+      if !$dom.data("ready")
+        $dom.data("ready", true)
+        $tabs = $("li > a", this)
+        $contents = $(this).siblings("fieldset")

-    $tabs.eq(0).click()
+        $tabs.click ->
+          $tab = $(this)
+          $tabs.not($tab).removeClass("active")
+          $tab.addClass("active")
+          $contents.hide()
+          $contents.filter($tab.attr("href")).show()
+          false
+
+        $tabs.eq(0).click()
+
+  # this is to handle elements created with has_many
+  $("a").live "click", ->
+    setTimeout(
+      -> translations()
+      50
+    )
+
+  translations()
+


only navigate on upload success; fixes #1081

--- app/assets/javascripts/admin/views/dataset/dataset_upload_view.coffee
+++ app/assets/javascripts/admin/views/dataset/dataset_upload_view.coffee
@@ -107,13 +107,14 @@
         data : new FormData(form)
       )
       .then(
-        -> Toast.success()
+        ->
+          Toast.success()
+          app.router.navigate("/dashboard", { trigger: true })
         -> # NOOP
       )
       .then(
-        =>
+        => # always do
           @ui.spinner.addClass("hidden")
-          app.router.navigate("/dashboard", { trigger: true })
       )


remove legacy console option

remove legacy console option

--- lib/package/config.coffee
+++ lib/package/config.coffee
@@ -163,7 +163,7 @@
       consoleStyle:
         title: 'Style (requires restart)'
         type: 'string'
-        enum: ['REPL-based', 'Legacy']
+        enum: ['REPL-based']
         default: 'REPL-based'
         order: 1
       maximumConsoleSize:


change config ordering

change config ordering

--- lib/package/config.coffee
+++ lib/package/config.coffee
@@ -16,33 +16,25 @@
         enum: ['Basic', 'Cycler', 'Remote']
         default: 'Cycler'
         order: 1
-      arguments:
-        title: 'Arguments'
-        type: 'array'
-        description: 'Set `ARGS` to the following entries. Requires restart of Julia process.'
-        default: []
-        items:
-          type: 'string'
-        order: 2
       optimisationLevel:
         title: 'Optimisation Level'
         description: 'Higher levels take longer to compile, but produce faster code.'
         type: 'integer'
         enum: [0, 1, 2, 3]
         default: 3
-        order: 3
+        order: 2
       deprecationWarnings:
         title: 'Deprecation Warnings'
         type: 'boolean'
         description: 'Hides deprecation warnings if disabled.'
         default: true
-        order: 4
+        order: 3
       numberOfThreads:
         title: 'Number of Threads'
         type: 'string'
         description: '`global` will use global setting, `auto` sets it to number of cores.'
         default: 'auto'
-        order: 5
+        order: 4
       startupArguments:
         title: 'Additional Julia Startup Arguments'
         type: 'array'
@@ -51,12 +43,20 @@
         default: []
         items:
           type: 'string'
-        order: 6
+        order: 5
       externalProcessPort:
         title: 'Port of external Julia process'
         type: 'string'
         description: '`random` will use a new port each time, or enter an integer to set the port statically.'
         default: 'random'
+        order: 6
+      arguments:
+        title: 'Arguments'
+        type: 'array'
+        description: 'Set `ARGS` to the following entries. Requires restart of Julia process.'
+        default: []
+        items:
+          type: 'string'
         order: 7
       persistWorkingDir:
         title: 'Persist Working Directory'


Reset lines on switching to unified

Reset lines on switching to unified

--- SingularityUI/app/components/aggregateTail/InterleavedTail.cjsx
+++ SingularityUI/app/components/aggregateTail/InterleavedTail.cjsx
@@ -34,6 +34,9 @@
     });

   componentDidMount: ->
+    for logLines in @props.logLines
+      logLines.reset()
+
     if @props.offset?
       for logLines in @props.logLines
         logLines.fetchOffset(@props.offset)
@@ -80,11 +83,13 @@
       @mergeLines(newLines)

   fetchPrevious: (callback) ->
+    console.log 'prev'
     for logLines in @props.logLines
       @prevLines = logLines.toJSON().length
       _.defer( =>
         logLines.fetchPrevious().done =>
           newLines = logLines.toJSON().length - @prevLines
+          console.log newLines
           if newLines > 0
             @scrollToLine(newLines)
           callback()


remove local variables

remove local variables

--- lib/lib/TiActiveRecord.coffee
+++ lib/lib/TiActiveRecord.coffee
@@ -26,9 +26,7 @@
     sql = "CREATE TABLE IF NOT EXISTS #{@tableName} ("
     i = 0
     for k, v of @tableProperties()
-      columnName = k
-      columnType = v
-      column = columnName + " " + columnType
+      column = "#{k} #{v}"
       sql += column if i == 0
       sql += "," + column if i > 0
       i++


Moving the profile interface to the left of slime status (sorry Steve!).

--- lib/atom-slime-profiler-view.coffee
+++ lib/atom-slime-profiler-view.coffee
@@ -8,7 +8,7 @@
     @swank = sw
     @enabled = false
     @content = $('<div>').addClass('inline-block')
-    @content.css({'max-width':'100vw', 'margin-left':'32px'}) # Prevent from getting cut off
+    @content.css({'max-width':'100vw', 'margin-left':'13px'}) # Prevent from getting cut off
     @main = $('<div>')
     @content.append(@main)
     console.log(@swank)
@@ -59,7 +59,7 @@
     func_dialog.attach(((sw) -> ((pack) -> sw.profile_invoke_toggle_package(pack)))(@swank))

   attach: (@statusBar) ->
-    @statusBar.addLeftTile(item: @content[0], priority: 1000)
+    @statusBar.addLeftTile(item: @content[0], priority: 9)

   destroy: ->
     @content.remove()


no id on visibility change

no id on visibility change

--- components/channel_visibility/client/channel_visibility_view.coffee
+++ components/channel_visibility/client/channel_visibility_view.coffee
@@ -29,8 +29,7 @@
     @$('.metadata--selector__option.is-active').removeClass 'is-active'
     $selection.addClass 'is-active'

-    analytics.track.click "Channel visibility changed to #{$selection.data('value')}",
-      label: analytics.modelNameAndIdToLabel 'Channel', @model.id
+    analytics.track.click "Channel visibility changed to #{$selection.data('value')}"

     @model.set 'status', $selection.data('value')
     @model.url = "#{sd.API_URL}/channels/#{@model.id}"


require lodash

require lodash

--- tutor/specs/components/task-plan/mini-editor/editor.spec.cjsx
+++ tutor/specs/components/task-plan/mini-editor/editor.spec.cjsx
@@ -1,4 +1,5 @@
-{React, _} = require '../../helpers/component-testing'
+{React} = require '../../helpers/component-testing'
+_ = require 'underscore'

 moment = require 'moment'


Fix incorrect use of `Promise.props`

Fix incorrect use of `Promise.props`

Change-type: patch

--- lib/models/application.coffee
+++ lib/models/application.coffee
@@ -448,7 +448,7 @@
 			if not deviceManifest?
 				throw new errors.BalenaInvalidDeviceType(deviceType)

-		return Promise.props([
+		return Promise.all([
 			deviceManifestPromise
 			applicationTypePromise
 			parentAppPromise


remove stuff

remove stuff

--- src/client/querystring/index.coffee
+++ src/client/querystring/index.coffee
@@ -5,25 +5,15 @@
   m[k.replace(prefix,'')] = k if k.indexOf(prefix) == 0
   m

-# Segment QueryString API compatibility layer
 class QueryString
   constructor : (traits, tracker, alias, currentUser)->
     @alias = alias
     @currentUser = currentUser
     @traits = traits
     @track = track
-
     @parse()
-    @pardot()

   getCurrentUserId: -> @currentUser.get('id')
-
-  pardot: () =>
-    ref = window.location.referrer
-    return unless ref.indexOf("https://go.pardot.com")
-    q = qs.decode(window.location.referrer.split('httpsRedirect?')[1])
-    return unless _.size(q)
-    @alias("pardot:#{q.visitor_id}") if q.visitor_id

   parse: () =>
     q = qs.decode()


Better naming.

Better naming.

--- src/coffee/customerxmlimport.coffee
+++ src/coffee/customerxmlimport.coffee
@@ -56,7 +56,7 @@
         paymentInfo = data.paymentInfo
         if _.has email2id, customer.email
           Q 'Update of customer is not implemented yet!'
-          #@update customer, customer.email, email2id[customer.email]
+          #@resetPassword customer, customer.email, email2id[customer.email]
         else
           @create customer, paymentInfo

@@ -66,7 +66,7 @@
       console.log "Processing #{_.size posts} customer(s)..."
       Q.all posts

-  update: (newCustomer, email, existingCustomer) ->
+  resetPassword: (newCustomer, email, existingCustomer) ->
     deferred = Q.defer()
     @client._rest.POST '/customers/password-token', email: email, (error, response, body) =>
       if error?


Unknown scope modifier should not be affected by removeDotNotation option

--- spec/robot-framework-keywords-autocomplete-spec.coffee
+++ spec/robot-framework-keywords-autocomplete-spec.coffee
@@ -615,7 +615,7 @@
             for suggestion in suggestions when suggestion.type is 'keyword'
               suggestedUnits.add(suggestion.rightLabel)
             expect(['Test_Autocomplete_Libdoc', 'FileSizeLimit', 'BuiltIn', 'Test_Autocomplete_Keywords', 'package.modules.TestModule'].sort()).toEqual(Array.from(suggestedUnits).sort())
-      it 'reacts on removeDotNotation configuration changes', ->
+      it 'is not affected by removeDotNotation configuration changes', ->
         runs ->
           atom.config.set("#{CFG_KEY}.removeDotNotation", true)
         waitsFor ->
@@ -628,7 +628,7 @@
           getCompletions(editor, provider).then (suggestions) ->
             expect(suggestions.length).toEqual(1)
             expect(suggestions[0]?.displayText).toEqual('Call Method')
-            expect(suggestions[0]?.replacementPrefix).toEqual('UnknownLibrary.callme')
+            expect(suggestions[0]?.replacementPrefix).toEqual('callme')
         runs ->
           atom.config.set("#{CFG_KEY}.removeDotNotation", false)
         waitsFor ->


fix typo

fix typo

--- lib/runtime/evaluation.coffee
+++ lib/runtime/evaluation.coffee
@@ -4,7 +4,7 @@
 {client} =  require '../connection'
 {notifications, views, selector} = require '../ui'
 {paths, blocks, cells, words} = require '../misc'
-{workspace} = require './workspace'
+workspace = require './workspace'
 modules = require './modules'

 {eval: evaluate, evalall, evalrepl, cd, clearLazy} =
@@ -26,13 +26,13 @@
         selector.moveNext editor, selection, range if move
         [[start], [end]] = range
         @ink.highlight editor, start, end
-        r = null
         rtype = if cell? then "block" else atom.config.get 'julia-client.resultsDisplayMode'
         if rtype is 'console'
           evalrepl(code: text, mod: mod)
             .then (result) => workspace.update()
             .catch =>
         else
+          r = null
           setTimeout (=> r ?= new @ink.Result editor, [start, end], type: rtype), 0.1
           evaluate({text, line: line+1, mod, path: edpath})
             .then (result) =>


Don't use workspaceView

Don't use workspaceView

--- lib/views/git-palette-view.coffee
+++ lib/views/git-palette-view.coffee
@@ -32,7 +32,7 @@
     if @previouslyFocusedElement[0] and @previouslyFocusedElement[0] isnt document.body
       @commandElement = @previouslyFocusedElement
     else
-      @commandElement = atom.workspaceView
+      @commandElement = atom.views.getView(atom.workspace)
     @keyBindings = atom.keymap.findKeyBindings(target: @commandElement[0])

     commands = []


Remove duplicate networks

Remove duplicate networks

--- lib/views/select-wifi-view.coffee
+++ lib/views/select-wifi-view.coffee
@@ -69,26 +69,31 @@
         networks = []
         for line in stdout.split "\n"
           network = regex.exec line
+
           if !!network
-            if network[7].indexOf 'WPA2' > -1
-              security = 3
-            else if network[7].indexOf 'WPA(' > -1
-              security = 2
-            else if network[7].indexOf 'WEP' > -1
-              security = 1
-            else
-              security = 0
+            notAdded = (networks.length == 0) || networks.reduce (prev, current) ->
+              prev && (current.ssid != network[1])

-            networks.push {
-              ssid: network[1],
-              bssid: network[2],
-              rssi: network[3],
-              channel: network[4],
-              ht: network[5],
-              cc: network[6],
-              security_string: network[7],
-              security: security
-            }
+            if notAdded
+              if network[7].indexOf 'WPA2' > -1
+                security = 3
+              else if network[7].indexOf 'WPA(' > -1
+                security = 2
+              else if network[7].indexOf 'WEP' > -1
+                security = 1
+              else
+                security = 0
+
+              networks.push {
+                ssid: network[1],
+                bssid: network[2],
+                rssi: network[3],
+                channel: network[4],
+                ht: network[5],
+                cc: network[6],
+                security_string: network[7],
+                security: security
+              }

         networks.sort (a, b) ->
           if a.ssid == ssid


FSItem: getKite: use provided machines baseKite from Machine::getBaseKite.

--- client/Finder/fs/fsitem.coffee
+++ client/Finder/fs/fsitem.coffee
@@ -42,6 +42,9 @@
     sourceItem.emit "fs.job.started"

     kite = sourceItem.getKite()
+  # Helper to get corresponding kite
+  # TODO: add check kite state functionality
+  getKite: -> @machine.getBaseKite()# kites.klient

     targetPath = FSHelper.plainPath "#{targetItem.path}/#{sourceItem.name}"

@@ -260,23 +263,3 @@

     .then =>
       @emit "fs.job.started"
-
-  getKite: ->
-    if @options.dummy
-      return null
-
-    FSItem.getKite { @vm, @vmName }
-
-  @getKite = ({vm, vmName})->
-    if KD.useNewKites
-      kontrol = KD.getSingleton 'kontrol'
-      kontrol.getKite \
-        if vm?
-          name              : 'oskite'
-          correlationName   : vm.hostnameAlias
-          region            : vm.region
-        else
-          name              : 'oskite'
-          correlationName   : vmName
-    else
-      KD.getSingleton('vmController').getKiteByVmName vmName


removed default mercator extent

removed default mercator extent

--- bokehjs/src/coffee/renderer/geo/tile_layer.coffee
+++ bokehjs/src/coffee/renderer/geo/tile_layer.coffee
@@ -443,8 +443,7 @@

   _map_data: () ->
     if not @map_initialized?
-      debugger
-      @initial_extent = [-20037508.34, -20037508.34, 20037508.34, 20037508.34 ]
+      @initial_extent = @get_extent()
       zoom_level = @tile_source.get_level_by_extent(@initial_extent, @map_frame.get('height'), @map_frame.get('width'))
       new_extent = @tile_source.snap_to_zoom(@initial_extent, @map_frame.get('height'), @map_frame.get('width'), zoom_level)
       @x_range.set('start', new_extent[0])


Remove unnecessary container span

Remove unnecessary container span

--- app/assets/javascripts/rglossa/react/components/centre/main_area_bottom.jsx.coffee
+++ app/assets/javascripts/rglossa/react/components/centre/main_area_bottom.jsx.coffee
@@ -9,7 +9,7 @@
     corpus: React.PropTypes.object.isRequired

   rowWithSidebar: ->
-    `
+    `

         METADATA_CATEGORIES

@@ -18,16 +18,16 @@
           ? <StartMain statechart={this.props.statechart} corpus={this.props.corpus} />
           : <ResultsMain />}

-    `
+
`

   rowWithoutSidebar: ->
-    `

-      {this.props.statechart.pathContains('start')
-        ? <StartMain statechart={this.props.statechart} corpus={this.props.corpus} />
-        : <ResultsMain />}
+    `

+

+        {this.props.statechart.pathContains('start')
+          ? <StartMain statechart={this.props.statechart} corpus={this.props.corpus} />
+          : <ResultsMain />}
+

`

   render: ->
-    `

-      {true ? this.rowWithSidebar() : this.rowWithoutSidebar()}
-
`+    if true then @rowWithSidebar() else @rowWithoutSidebar()


Fix jPlayer JSX

Fix jPlayer JSX

--- app/assets/javascripts/rglossa/speech/components/centre/results/jplayer.jsx.coffee
+++ app/assets/javascripts/rglossa/speech/components/centre/results/jplayer.jsx.coffee
@@ -193,47 +193,47 @@

   render: ->
     `
-

-

-

-
-                 <object id="jp_flash_1" name="jp_flash_1" data="assets/rglossa/speech/Jplayer.swf" type="application/x-shockwave-flash" width="1" height="1" tabindex="-1" style="width: 1px; height: 1px;">
+

+

+

+
+                 <object id="jp_flash_1" name="jp_flash_1" data="assets/rglossa/speech/Jplayer.swf" type="application/x-shockwave-flash" width="1" height="1" tabIndex="-1" style={{width: 1, height: 1}}>
                      <param name="flashvars" value="jQuery=jQuery&id=jplayer&vol=0.8&muted=false" />
                      <param name="allowscriptaccess" value="always" />
                      <param name="bgcolor" value="#000000" />
                      <param name="wmode" value="opaque" />
                  </object>

-

-

-                     play
+

+

+                     play

-

+

-

-

-
play

-
pause

-
mute

-
unmute

-
volume-max

+

+

+
play

+
pause

+
mute

+
unmute

+
volume-max

-

-

+

+

-

kristiansand_01um-02uk

+

kristiansand_01um-02uk

-

+

                  Update requiredFlash plugin

-

-

-

-
-
+

+

+

+
+

     `


Remove old Atom Elmjutsu settings

Remove old Atom Elmjutsu settings

--- atom/config.cson
+++ atom/config.cson
@@ -11,7 +11,6 @@
   core:
     audioBeep: false
     disabledPackages: [
-      "elmjutsu"
       "exception-reporting"
       "language-haml"
       "linter-write-good"
@@ -48,10 +47,6 @@
     autocompleteFuzzyFilteringEnabled: true
     autocompleteSnippetsEnabled: true
     cacheDirectory: "/var/folders/zl/k42vwnzn4k304yvfxwztjsl00000gn/T/elmjutsu18500B070yRkXpcaW"
-    elmExecPath: "node_modules/.bin/elm"
-    elmMakeExecPath: "node_modules/.bin/elm-make --warn"
-    elmPackageExecPath: "node_modules/.bin/elm-package"
-    elmReplExecPath: "node_modules/.bin/elm-repl"
     globalAutocompleteEnabled: true
     showDocCommentsInSidekick: false
     showScopeBar: true


:atom: Update config.cson for Atom

:atom: Update config.cson for Atom

--- atom/config.cson
+++ atom/config.cson
@@ -48,7 +48,9 @@
     revealTreeView: false
   "find-and-replace":
     projectSearchResultsPaneSplitDirection: "right"
+    useRipgrep: true
   "fuzzy-finder":
+    scoringSystem: "fast"
     useRipGrep: true
   "highlight-line":
     enableBackgroundColor: false


add settings for nim files

add settings for nim files

--- atom/config.cson
+++ atom/config.cson
@@ -43,6 +43,14 @@
     plugins:
       "git-diff": true
       selection: true
+".cpp.source":
+  editor:
+    preferredLineLength: 100
+    softTabs: false
+".c.source":
+  editor:
+    preferredLineLength: 100
+    softTabs: false
 ".lua.source":
   editor:
     tabLength: 2
@@ -52,7 +60,6 @@
 ".python.source":
   editor:
     softTabs: false
-".cpp.source":
+".nim.source":
   editor:
-    preferredLineLength: 100
-    softTabs: false
+    tabLength: 2


fixed not showing of datasets on startup at dashboard page

--- app/assets/javascripts/views/spotlight_dataset_list_view.coffee
+++ app/assets/javascripts/views/spotlight_dataset_list_view.coffee
@@ -21,4 +21,6 @@
     @collection.fetch(
       silent : true
       data: "isActive=true"
+      ).done( =>
+        @collection.goTo(1)
       )


Send emails to offline users when mentioned in a channel

--- packages/rocketchat-lib/server/functions/sendMessage.coffee
+++ packages/rocketchat-lib/server/functions/sendMessage.coffee
@@ -88,7 +88,7 @@
 			toAll = mentionIds.indexOf('all') > -1

 			if mentionIds.length > 0
-				usersOfMention = RocketChat.models.Users.find({_id: {$in: mentionIds}}, {fields: {_id: 1, username: 1}}).fetch()
+				usersOfMention = RocketChat.models.Users.find({_id: {$in: mentionIds}}, {fields: {_id: 1, username: 1, status: 1, emails: 1}}).fetch()

 				if room.t is 'c' and !toAll
 					for usersOfMentionItem in usersOfMention
@@ -111,17 +111,22 @@
 				userIdsToNotify = _.pluck(usersOfMention, '_id')
 				userIdsToPushNotify = userIdsToNotify

+				offlineMentionsRoom = _.filter usersOfMention, (user) ->
+					user.status is 'offline'
+
 				# If the message is @all, notify all room users except for the sender.
 				if toAll and room.usernames?.length > 0
 					usersOfRoom = RocketChat.models.Users.find({
 							username: {$in: room.usernames},
 							_id: {$ne: user._id}},
-						{fields: {_id: 1, username: 1, status: 1}})
+						{fields: {_id: 1, username: 1, status: 1, emails: 1}})
 						.fetch()
 					onlineUsersOfRoom = _.filter usersOfRoom, (user) ->
 						user.status in ['online', 'away', 'busy']
 					userIdsToNotify = _.union userIdsToNotify, _.pluck(onlineUsersOfRoom, '_id')
 					userIdsToPushNotify = _.union userIdsToPushNotify, _.pluck(usersOfRoom, '_id')
+					offlineMentionsRoom = _.filter usersOfRoom, (user) ->
+						user.status is 'offline'

 				if userIdsToNotify.length > 0
 					for usersOfMentionId in userIdsToNotify
@@ -153,6 +158,13 @@
 							query:
 								userId: $in: userIdsToPushNotify

+				if offlineMentionsRoom.length > 0
+					for offlineUser in offlineMentionsRoom
+						Email.send
+							to: offlineUser.emails[0].address
+							from: RocketChat.settings.get('From_Email')
+							subject: "[#{RocketChat.settings.get('Site_Name')}] You have been mentioned by #{user.username} in ##{room.name}"
+							html: "> " + message.msg
 		###
 		Update all other subscriptions to alert their owners but witout incrementing
 		the unread counter, as it is only for mentions and direct messages


Bring Bootstrap JS back by requiring it from main script.

--- assets/js/script.coffee
+++ assets/js/script.coffee
@@ -1,3 +1,5 @@
+bootstrap = require('bootstrap')
+
 $ = jQuery
 $ ->
     updateJulianDate = ->


qui jan 23 21:45:37 -03 2020

qui jan 23 21:45:37 -03 2020

--- assets/js/search.coffee
+++ assets/js/search.coffee
@@ -26,8 +26,15 @@
 #   fuzzy:!1
 # });

+# Using Javascript
 # /* Empty input search in moment closed */
 # ClearFieldSearch = function() {
-#   document.getElementById("layout-search__input").value = "";
-#   document.getElementById("layout-search__data").innerHTML = "";
+#  document.getElementById("layout-search__input").value = "";
+#  document.getElementById("layout-search__data").innerHTML = "";
 # }
+
+# Using Coffescript
+# /* Empty input search in moment closed */
+this.ClearFieldSearch = ->
+    document.getElementById('layout-search__input').value = ''
+    document.getElementById('layout-search__data').innerHTML = ''


Make config persistence async

Make config persistence async

--- picksel.coffee
+++ picksel.coffee
@@ -74,6 +74,10 @@
     @directory = ''
     @images = []

+class User
+  constructor: () ->
+    @apiKey = ''
+
 # Redacts the user's API key from the given URL.
 #
 # @param [String] url the URL to redact the API key from
@@ -117,25 +121,28 @@

 # Persists an object to a file as JSON.
 #
+# @param [String] filename the name of the file to persist to
 # @param [Object] obj the object to persist
-# @param [String] filename the name of the file to persist to
-#
-persist = (obj, filename) ->
+# @param [Function] callback the function to call back on
+#
+persist = (filename, obj, callback) ->
   options =
     spaces: 4
-  jsonfile.writeFileSync filename, obj, options
+  jsonfile.writeFile filename, obj, options, callback

 # Persists the currently loaded configuration settings
 #
-persistProject = (obj) ->
+persistProject = (obj, callback) ->
   if obj then config = obj # Replace loaded config.
-  persist config, CONFIG_PATH
+  persist CONFIG_PATH, config, callback

 # Persists the currently loaded user settings.
 #
-persistUser = () -> persist user, USER_PATH
+persistUser = (obj, callback) ->
+  if obj then user = obj # Replace loaded user.
+  persist USER_PATH, user, callback

 # Returns true if a request to the Pixabay API was successful.
@@ -297,7 +304,7 @@
     if err || exists
       callback err, exists # Folder exists already, or error.
     else
-      ask "Doesn't look like the #{dir} directory exists, create it?", \
+      ask "Doesn't look like the #{dir} directory exists, create it? (y/n)", \
         (answer) ->
           if yn answer # Create directory? Yes or no.
             mkdirp dir, (err) ->
@@ -327,42 +334,40 @@
           promptDirectoryCreation answer, (err, exists) ->
             if !exists # Warn user about missing assets directory.
               log.warning "The #{answer} directory isn't present on-disk. You" \
-                + " won't be able to install assets until it is."
+                + ' won\'t be able to install assets until it is.'
             newProj.directory = answer # Add asset path to project.
-            persistProject newProj # Persist new project file.
-            log.info "New file created at '#{CONFIG_PATH}' for holding your" \
-              + ' asset dependencies. Feel free to check this file in to' \
-              + ' source control.' # Project setup success!
+            persistProject newProj, (err) -> # Persist new project file.
+              if err
+                log.error 'Error writing your project file to disk!'
+              else
+                log.info "New file created at '#{CONFIG_PATH}' for holding" \
+                  + ' your asset dependencies. Feel free to check this file' \
+                  + ' in to source control.' # Project setup success!

 # Walks the user through initializing their user file.
 #
 auth = () ->
-
-  # Check we're not going to overwrite an existing user file.
-  if existsFile.sync USER_PATH
-    log.warning 'Looks like authentication is already set up for this project.'
-    return false
-
-  newUser =
-    apiKey: ''
-
-  console.log 'Let\'s associate a Pixabay account with your local copy of' \
-    + ' this project...'
-
-  apiKey = readline.question 'What\'s your Pixabay API key? To find it you' \
-    + ' can log in to the Pixabay website and visit: ' \
-    + 'https://pixabay.com/api/docs/ '
-  # TODO: Validate API key?
-  newUser.apiKey = apiKey
-
-  # Persist user file.
-  user = newUser
-  persistUser()
-
-  log.info "New file created at '#{USER_PATH}' containing your API key." \
-    + " DON'T CHECK THIS FILE IN TO SOURCE CONTROL BECAUSE IT HAS YOUR" \
-    + " SECRET API KEY IN IT."
+  existsFile USER_PATH, (err, stats) -> # Check for an existing user file.
+    if stats
+      log.warning 'Looks like authentication is already set up for this' \
+        + ' project.'
+    else
+      log.info 'Let\'s associate a Pixabay account with your local copy of' \
+        + ' this project...'
+      newUser = new User() # Initialize new user.
+      ask 'What\'s your Pixabay API key? To find it you can log in to the' \
+        + ' Pixabay website and visit: https://pixabay.com/api/docs/ ', \
+        (answer) ->
+          # TODO: Validate API key?
+          newUser.apiKey = apiKey # Add API key to user.
+          persistUser newUser, (err) -> # Persist new user file.
+            if err
+              log.error 'Error writing your user file to disk!'
+            else
+              log.info "New file created at '#{USER_PATH}' containing your" \
+                + ' API key. DON\'T CHECK THIS FILE IN TO SOURCE CONTROL' \
+                + ' BECAUSE IT HAS YOUR SECRET API KEY IN IT.'

 # Prints usage information for the application.


Fix bug with large resolutions not installing

--- picksel.coffee
+++ picksel.coffee
@@ -71,11 +71,12 @@
 #
 # @param [String] apiKey the API key to use for the request
 # @param [Number] id the ID of the image to get information for
-# @param [Number] res the resolution code of the image to get
-#
-buildUrl = (apiKey, id, res) ->
+# @param [Number] resolution the resolution code of the image to get
+#
+buildUrl = (apiKey, id, resolution) ->
+  code = humanResolutionToCode resolution
   "https://pixabay.com/api/?key=#{apiKey}" \
-    + (if res > 1 then '&response_group=high_resolution' else '') \
+    + (if code > 1 then '&response_group=high_resolution' else '') \
     + "&id=#{id}"

@@ -264,7 +265,7 @@
 # @param [String] id the ID to check
 #
 validateId = (id, callback) ->
-  url = buildUrl user.apiKey, id, (if isNumeric then 0 else 2) # Hash ID?
+  url = buildUrl user.apiKey, id, (if isNumeric(id) then 0 else 2) # Hash ID?
   requestJson url, (error, response, body) -> # Request image JSON.
     callback(!error && response.statusCode == 200)


Add null checks

Add null checks

--- avstreams.coffee
+++ avstreams.coffee
@@ -136,8 +136,8 @@
         else
           logger.debug "[stream:#{@id}] update #{name}: #{value}"
         if name is 'audioASCInfo'
-          if value.sbrPresentFlag is 1
-            if value.psPresentFlag is 1
+          if value?.sbrPresentFlag is 1
+            if value?.psPresentFlag is 1
               logger.debug "[stream:#{@id}] audio: HE-AAC v2"
             else
               logger.debug "[stream:#{@id}] audio: HE-AAC v1"


Clarification of simulation import settings in comments, test will follow later

--- src/code/data/migrations/23_add_simulation_type.coffee
+++ src/code/data/migrations/23_add_simulation_type.coffee
@@ -18,7 +18,8 @@
     #  0: simulation: diagramOnly / complexity: basic
     #  1: simulation: static      / complexity: basic
     #  2: simulation: static      / complexity: expanded
-    #  3: simulation: time        / complexity: expanded
+    #  3 (for models with nodes set up as collectors): simulation: time   / complexity: expanded
+    #  3 (no collectors in model):                     simulation: static / complexity: expanded

     previousComplexity = if data.settings.complexity? then data.settings.complexity else 2


fix missing local var

fix missing local var

--- lib/app.coffee
+++ lib/app.coffee
@@ -8,7 +8,7 @@
 CURRENT_LOCAL_SLIDE_STATE = null
 setSlideState = (state) ->
   CURRENT_LOCAL_SLIDE_STATE = state
-exports.getCurrentState = () -> CURRENT_LOCAL_SLIDE_STATE
+exports.getCurrentState = getCurrentState = () -> CURRENT_LOCAL_SLIDE_STATE

 ################################################################################


update to use the dd tag instead

update to use the dd tag instead

--- cf/spell.coffee
+++ cf/spell.coffee
@@ -26,8 +26,8 @@
   update_question = (data) ->
     word = random_question(data)
     update_keyHandler()
-    $("p#hint_define").empty().append(word['hint'])
-    $("p#hint_sentence").empty().append(word['example'])
+    $("dd#hint_define").empty().append(word['hint'])
+    $("dd#hint_sentence").empty().append(word['example'])

   emptyInput = () ->
     $("input#input_answer").val("")


NWK release fix

NWK release fix

--- Gulpfile.coffee
+++ Gulpfile.coffee
@@ -19,9 +19,9 @@
     dest: './build/package.json'

   nwk_release:
-    src:  './build/**/**'
-    platforms: ['oxs64']
-    version: '0.14.6'
+    src:        './build/**/**'
+    version:    '0.14.6'
+    platforms: ['osx64']

   sass:
     src:  './app/sass/app.sass'
@@ -120,14 +120,11 @@
 # Build tasks
 gulp.task 'default', ['dev']

-gulp.task 'build', =>
-  plugins.runSequence.use(gulp)('copy_fontawesome', 'copy_images', 'sass', 'jade', 'concat', 'bundle')
-
 gulp.task 'dev', =>
-  plugins.runSequence.use(gulp)('env_dev', 'build', 'watch', 'webserver')
+  plugins.runSequence.use(gulp)('env_dev', 'copy_fontawesome', 'copy_images', 'sass', 'jade', 'concat', 'bundle', 'watch', 'webserver')

 gulp.task 'release', =>
-  plugins.runSequence.use(gulp)('env_prod', 'build', => console.log 'Release completed.' )
+  plugins.runSequence.use(gulp)('env_prod', 'copy_fontawesome', 'copy_images', 'sass', 'jade', 'concat', 'bundle', => console.log 'Release completed.' )

 gulp.task 'nwk_release', =>
-  plugins.runSequence.use(gulp)('env_dev', 'build', 'nodewebkit_package', 'nodewebkit_release', => console.log 'NWK Release completed.' )
+  plugins.runSequence.use(gulp)('env_dev', 'copy_fontawesome', 'copy_images', 'sass', 'jade', 'concat', 'bundle', 'nodewebkit_package', 'nodewebkit_release', => console.log 'NWK Release completed.' )


Wrap rendered root with hostloading AppContainer

It looks like this somehow this got missed when implementing hot reloading

--- coach/src/helpers/index.coffee
+++ coach/src/helpers/index.coffee
@@ -2,6 +2,8 @@
 ReactDOM = require 'react-dom'
 _ = require 'underscore'
 deepMerge = require 'lodash/merge'
+
+{AppContainer} = require 'react-hot-loader'

 helpers =

@@ -16,7 +18,10 @@

     update: (props = {}) ->
       @props = deepMerge({}, cache.component.props, props)
-      ReactDOM.render React.createElement(component, @props), cache.DOMNode
+      ReactDOM.render(
+        React.createElement(AppContainer, {}, React.createElement(component, @props))
+        cache.DOMNode
+      )

     unmount: ->
       ReactDOM.unmountComponentAtNode(cache.DOMNode)


on enter in completions do "ER" instead of nothing

--- client/autocompletion.coffee
+++ client/autocompletion.coffee
@@ -18,7 +18,7 @@
         completeOnSingleClick: true
         completeSingle: false
         extraKeys:
-          Enter: ->
+          Enter: -> (if f = cm.getOption('extraKeys')?.Enter then f() else cm.execCommand 'newlineAndIndent'); return
           Right: (cm, m) -> m.pick(); return
           Tab: (cm, m) -> m.moveFocus 1; return
           'Shift-Tab': (cm, m) -> m.moveFocus -1; return


Fix XSS on file name in file upload

Fix XSS on file name in file upload

--- client/lib/fileUpload.coffee
+++ client/lib/fileUpload.coffee
@@ -33,14 +33,14 @@
 							Your browser does not support the audio element.
 						</audio>

-
#{file.name}

+
#{Handlebars._escape(file.name)}

 				"""
 			else
 				text = """

-
#{file.name}

+
#{Handlebars._escape(file.name)}

 				"""

 			swal
@@ -147,4 +147,4 @@
 									Session.set 'uploading', _.without(uploading, item)
 							, 1000

-	consume()+	consume()


fix the bilateral linking logic

fix the bilateral linking logic

--- library/membrane/bilateral.coffee
+++ library/membrane/bilateral.coffee
@@ -82,7 +82,7 @@
             assert qualified = "#{symbol}.#{name}" # full
             assert setter = try "#{qualified}.%s = (%s)"
             directives = value?.uplink?.directives or 0
-            return no unless _.isPlainObject directives
+            return -1 unless _.isPlainObject directives
             assert json = try JSON.stringify directives
             template = format setter, "directives", json
             context.invokes.push "\r\n#{template}\r\n"
@@ -149,12 +149,13 @@
     bilateral: @autocall z: +102, ->
         assert _.isFunction o = -> try _.head arguments
         assert _.isFunction i = -> try _.head arguments
+        assert _.isPlainObject @uplinks ?= new Object()
         assert _.isString(@service), "invalid service data"
         assert _.isString(@location), "location misconfied"
         assert _.isString(@nsp), "bilateral nsp malfunction"
         assert uplinking = "Uplink %s at %s using nsp=%s"
         _.forIn this, (value, reference, context) => do =>
-            return unless reference of (this.uplinks or {})
+            return -1 unless _.has @uplinks or {}, reference
             assert mangled = try "#{@location}/#{reference}"
             mangled += "/#{nsp}" if _.isString nsp = this.nsp
             assert try xref = ref = reference.toString().bold


allow Ctrl-C to escape an unwanted continuation prompt

--- repl.coffee
+++ repl.coffee
@@ -28,18 +28,18 @@
 error = (err) ->
   stdout.write (err.stack or err.toString()) + '\n\n'

+# The current backlog of multi-line code.
+backlog = ''

 # The main REPL function. **run** is called every time a line of code is entered.
 # Attempt to evaluate the command. If there's an exception, print it out instead
 # of exiting.
 run = do ->
-  # The current backlog of multi-line code.
-  backlog = ''
   # The REPL context
   sandbox = Script.createContext()
   sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox
   (buffer) ->
-    unless buffer.toString().trim()
+    if !buffer.toString().trim() and !backlog
       repl.prompt()
       return
     code = backlog += buffer
@@ -111,9 +111,20 @@
 else
   repl = readline.createInterface stdin, stdout, autocomplete

-repl.setPrompt REPL_PROMPT
-repl.on  'close',  ->
+repl.on 'attemptClose', ->
+  if backlog
+    backlog = ''
+    process.stdout.write '\n'
+    repl.setPrompt REPL_PROMPT
+    repl.prompt()
+  else
+    repl.close()
+
+repl.on 'close', ->
   process.stdout.write '\n'
   stdin.destroy()
-repl.on  'line',   run
+
+repl.on 'line', run
+
+repl.setPrompt REPL_PROMPT
 repl.prompt()


sidebar: invoke 'fetchForSearch' method on lazy loader if search is active

--- client/Social/Activity/sidebar/searchmodal.coffee
+++ client/Social/Activity/sidebar/searchmodal.coffee
@@ -73,7 +73,12 @@
     return @listController.hideLazyLoader()  if @reachedEndOfTheList

     options = @getLazyLoadOptions()
-    @fetch options, @bound 'populate'
+
+    if @searchActive
+    then fn = @bound 'fetchForSearch'
+    else fn = @bound 'fetch'
+
+    fn options, @bound 'populate'

   getLazyLoadOptions: ->


UserEnvironmentDataProvider: Data existence check.

--- client/app/lib/userenvironmentdataprovider.coffee
+++ client/app/lib/userenvironmentdataprovider.coffee
@@ -16,7 +16,8 @@

   revive: ->

-    data = globals.userEnvironmentData
+    empty = own: [], shared: [], collaboration: []
+    data  = globals.userEnvironmentData or empty

     for section in [ data.own, data.shared, data.collaboration ]
       for obj in section


Break mouse and keyboard out into their own classes, automatically send onmousemove events when registered

--- layout.coffee
+++ layout.coffee
@@ -830,17 +830,63 @@
       return pos

+  # singleton that listens for keyboard and mouse events. Holds data about the most recent left and top mouse coordinates
   mouseEvents = ['click', 'mouseover', 'mouseout', 'mousedown', 'mouseup']
-  keyboardEvents = ['focus', 'blur', 'select', 'keyup', 'keydown']
-  # singleton that listens for keyboard and mouse events. Holds data about the most recent left and top mouse coordinates
-  class Inputs extends Eventable
+  class Mouse extends Eventable
     constructor: ->
       @docSelector = $(document)
-      @docSelector.on(mouseEvents.join(' '), @handleMouse)
-      @docSelector.on(keyboardEvents.join(' '), @handleKeyboard)
-    sender: ->
-      @trigger("mousemove", left, top)
-    handleKeyboard: (event) =>
+      @docSelector.on(mouseEvents.join(' '), @handle)
+    bind: (ev, callback) ->
+      super(ev, callback)
+      if @events['mousemove'].length
+        @start()
+    unbind: (ev, callback) ->
+      super(ev, callback)
+      if @events['mousemove'].length is 0
+        @stop()
+    handle: (event) =>
+      view = event.target.$view
+      type = event.type
+      # console.log 'event', type, view
+      if view
+        view.sendEvent(type, view)
+
+      @pos = {x: event.pageX, y: event.pageY}
+      @sendEvent(type, view) unless type is 'mousemove'
+
+    sender: =>
+      @sendEvent("mousemove", @pos) if @pos
+
+    start: (event) =>
+      return if @started
+      return if event and event.target != document
+      @started = true
+      @tId = setInterval(@sender, 17)
+      # console.log 'start'
+      @docSelector.on("mousemove", @handle).one("mouseout", @stop)
+
+    stop: (event) =>
+      return if not @started
+      return if event and event.target != document
+      @started = false
+      clearInterval(@tId)
+      # console.log 'stop'
+      @docSelector.off("mousemove", @handle).one("mouseover", @start)
+
+
+  keyboardEvents = ['focus', 'blur', 'select', 'keyup', 'keydown']
+  class Keyboard extends Eventable
+    keys =
+      shiftKey: false
+      altKey: false
+      ctrlKey: false
+      metaKey: false
+      keyCode: 0
+
+    constructor: ->
+      $(document).on(keyboardEvents.join(' '), @handle)
+
+    handle: (event) =>
       view = event.target.$view
       type = event.type
       if view
@@ -852,30 +898,17 @@
             view.text = value
             view.sendEvent('text', value);

-      @sendEvent(type, view)
-      # console.log 'handleKeyboard', type, view, event
-    handleMouse: (event) =>
-      view = event.target.$view
-      type = event.type
-      if view
-        view.sendEvent(type, view)
-
-      @sendEvent(type, view)
-      # console.log 'event', event.type, event.target.$view
-      if @started
-        requestTick 0, sender
-        @left = event.pageX
-        @top = event.pageY
-    start: ->
-      return if @started
-      @started = true
-      @docSelector.on("mousemove", @handler).one("mouseout", @stop)
-    stop: ->
-      return if not @started
-      @started = false
-      @docSelector.off("mousemove", @handler).one("mouseover", @start)
-
-  new Inputs()
+      for key, value of keys
+        # console.log value, key
+        keys[key] = event[key]
+
+      @sendEvent(type, view, keys)
+      # console.log 'handleKeyboard', type, view, keys, event
+
+
+  mouse = new Mouse()
+  keyboard = new Keyboard()
+

   exports = {
     view: View,


Remove unused file

Remove unused file

--- app/assets/javascripts/neighborly/projects/index.js.coffee
+++ app/assets/javascripts/neighborly/projects/index.js.coffee
@@ -1,6 +0,0 @@
-Neighborly.Projects = {} if Neighborly.Projects is undefined
-
-Neighborly.Projects.Index = Backbone.View.extend
-  el: '.home-page'
-
-  initialize: ->


skype_id added

skype_id added

--- client/templates/user_profile/user_profile.coffee
+++ client/templates/user_profile/user_profile.coffee
@@ -10,3 +10,4 @@
     Router.go 'home'

   'click .cancel': (e) -> Router.go 'home'
+


Tests: environmnets: Fixed addVm test.

Tests: environmnets: Fixed addVm test.

--- client/test/lib/helpers/environmenthelpers.coffee
+++ client/test/lib/helpers/environmenthelpers.coffee
@@ -268,7 +268,8 @@
       .waitForElementVisible    '.env-modal.paid-plan', 50000
       .click                    '.env-modal.paid-plan button'
       .waitForElementNotVisible '.env-modal.paid-plan', 50000
-      .waitForElementVisible    '.my-machines .koding-vm-1 a:first-child', 50000
+      .pause                    5000 # wait for action complete
+      .waitForElementVisible    '.my-machines .sidebar-machine-box.koding-vm-1', 50000

   nameVM: (browser, name) ->


Added CreditCard.label()

Added CreditCard.label()

--- app/assets/javascripts/sprangular/models/creditCard.coffee
+++ app/assets/javascripts/sprangular/models/creditCard.coffee
@@ -37,6 +37,9 @@
   isNew: ->
     not (@token and @token.length > 0)

+  label: ->
+    "#{type} XXXX-XXXX-XXXX-#{@lastDigits}"
+
   determineType: ->
     @type = if @number.match /^3[47]/
               'amex'


fixes #166

fixes #166

--- chrome/content/zotero-better-bibtex/zotero-better-bibtex.coffee
+++ chrome/content/zotero-better-bibtex/zotero-better-bibtex.coffee
@@ -245,12 +245,12 @@
       unique (collection_id, path, context))
     ")

-  ### schema 3 & 7 had a scanning flaw, force rescan ###
-  if version < 7
+  ### schema 3, 7 & 12 had a scanning flaw, force rescan ###
+  if version < 12
     @pref.set('scan-citekeys', true)

   ### mark current version ###
-  Zotero.DB.query("insert or replace into betterbibtex.schema (lock, version) values ('schema', 11)")
+  Zotero.DB.query("insert or replace into betterbibtex.schema (lock, version) values ('schema', 12)")

   Zotero.Translate.Export::Sandbox.BetterBibTeX = {
     __exposedProps__: {keymanager: 'r', cache: 'r'}


Move search

Move search

--- vendor/assets/javascripts/brainstem/data-loader.coffee
+++ vendor/assets/javascripts/brainstem/data-loader.coffee
@@ -13,7 +13,6 @@
     @_parseLoadOptions(loadOptions)

     options = @loadOptions
-    search = options.search
     include = _(options.include).map((i) -> _.keys(i)[0]) # pull off the top layer of includes
     filters = options.filters || {}
     order = options.order || "updated_at:desc"
@@ -85,7 +84,7 @@
         syncOptions.data.per_page = options.perPage
         syncOptions.data.page = options.page

-    syncOptions.data.search = search if search
+    syncOptions.data.search = @loadOptions.search if @loadOptions.search

     modelOrCollection = collection
     modelOrCollection = options.model if @loadOptions.only && options.model


Removed console.info

Removed console.info

--- core/app/backbone/views/activities/activities_group_view.coffee
+++ core/app/backbone/views/activities/activities_group_view.coffee
@@ -32,7 +32,6 @@
     new User @model.get('user')

   onRender: ->
-    console.info @fact()
     @factRegion.show new ReactView
       component: ReactFact
         model: @fact()


Started working around with tweets

Started working around with tweets

--- server/models/twitterAccount.coffee
+++ server/models/twitterAccount.coffee
@@ -67,14 +67,16 @@
 		parameters = []
 		for key, value of params
 			if oauthParams.indexOf(key) isnt -1
-				if value is null
-					switch key
-						when "oauth_nonce" then finalValue = @getNonce()
-						when "oauth_timestamp" then finalValue = Math.round(Date.now()/1000)
-						else finalValue = additionalInfo[key]
-				else
+				finalValue = null
+				switch key
+					when "oauth_nonce" then finalValue = @getNonce()
+					when "oauth_timestamp" then finalValue = Math.round(Date.now()/1000)
+				if additionalInfo[key]
+					finalValue = additionalInfo[key]
+				if finalValue is null
 					finalValue = value
 				parameters.push encodeURIComponent(key)+"="+encodeURIComponent(finalValue)
+		console.log parameters
 		parameters = parameters.sort()


removed translation editor

removed translation editor

--- app/main.coffee
+++ app/main.coffee
@@ -38,9 +38,6 @@
   t7e.load strings
   t7e.refresh()

-#TODO investigate this functionality
-TranslationEditor = require 't7e/editor'
-TranslationEditor.init() if !!~location.search.indexOf 'translate=1'

 # #TODO Analytics values
 # googleAnalytics.init


Fix default page

Fix default page

--- app/main.coffee
+++ app/main.coffee
@@ -21,7 +21,7 @@

 StackOfPages = require 'stack-of-pages'
 stack = new StackOfPages
-  DEFAULT: '#/classify'
+  DEFAULT: '#/'
   '#/': require './controllers/home'
   '#/classify': require './controllers/classify'
   '#/subject/:id': require './controllers/subject'


Fix migration v3

Fix migration v3

--- server/startup/migrations/v3.coffee
+++ server/startup/migrations/v3.coffee
@@ -49,9 +49,11 @@
 						delete room[k]

 					oldId = room._id
-					room._id = usernames.sort().join('')
+					room._id = usernames.sort().join(',')
 					ChatRoom.insert(room)
 					ChatRoom.remove({_id: oldId})
+					ChatSubscription.update({rid: oldId}, {$set: {rid: room._id}}, {multi: true})
+					ChatMessage.update({rid: oldId}, {$set: {rid: room._id}}, {multi: true})
 				else
 					ChatRoom.update(room._id, update)


fix missing contact

fix missing contact

--- server/utils/import_calendar.coffee
+++ server/utils/import_calendar.coffee
@@ -65,7 +65,7 @@
     # and then
     , (err)->
         return callback err if err
-        log.debug "cozy to create #{calendarEvents.length} event"
+        log.debug "cozy to create #{calendarEvents.length} events"
         callback null, calendarEvents

@@ -84,6 +84,8 @@
             numberProcessed = 0
             async.eachSeries gEvents, (gEvent, next)->
                 unless Event.validGoogleEvent gEvent
+                    log.debug "invalid event"
+
                     realtimer.sendCalendar
                         number: ++numberProcessed
                         total: gEvents.length
@@ -95,10 +97,11 @@
                     Event.createIfNotExist cozyEvent, (err) ->
                         return callback err if err
                         log.error err if err
-                        setTimeout next, 100
                         realtimer.sendCalendar
                             number: ++numberProcessed
                             total: gEvents.length
+
+                        setTimeout next, 100
             , (err)->
                 return callback err if err


Slow down of task startup of prevent same tasks opened at same time.

--- app/assets/javascripts/app/lib/app_post/task_manager.js.coffee
+++ app/assets/javascripts/app/lib/app_post/task_manager.js.coffee
@@ -488,7 +488,7 @@
                   persistent: true
                   init:       true
                 )
-              task_count * 350
+              task_count * 450
               undefined
               'task'
             )
@@ -507,7 +507,7 @@
               persistent: false
               init:       true
             )
-          task_count * 600
+          task_count * 800
           undefined
           'task'
         )


Added hc.marked dependency to Sprangular.StaticContent

--- app/assets/javascripts/sprangular/static_content/module.coffee
+++ app/assets/javascripts/sprangular/static_content/module.coffee
@@ -1 +1 @@
-angular.module('Sprangular.StaticContent', ['Sprangular'])
+angular.module('Sprangular.StaticContent', ['Sprangular', 'hc.marked'])


add support for video-in-group links to vimeo scraper

--- scripts/preview/vimeo.coffee
+++ scripts/preview/vimeo.coffee
@@ -1,12 +1,14 @@
 class VimeoScraper extends Preview.ThumbnailScraper
   Preview.register this

+  VIDEO_PATTERN = ///^ (?: /groups/.+/videos )? / (\d+) $///i
+
   @doesUriMatch: (uri) ->
     uri.isInDomain('vimeo.com') and
-    uri.path.search(/^\/\d+$/) >= 0
+    uri.path.search(VIDEO_PATTERN) >= 0

   scrape: ->
-    if id = @uri.path.match(/^\/(\d+)$/)?[1]
+    if id = @uri.path.match(VIDEO_PATTERN)?[1]
       $.ajax "http://vimeo.com/api/v2/video/#{id}.json",
         type: 'get', dataType: 'json', error: @pass
         success: ([video]) =>


Add value, text, and html

Add value, text, and html

--- lib/bindings.coffee
+++ lib/bindings.coffee
@@ -1,10 +1,6 @@
 addBinding = ViewModel.addBinding

-addBinding
-  name: 'text'
-  autorun: (c, bindArg) ->
-    bindArg.element.text bindArg.getVmValue()
-    return
+

 addBinding
   name: 'default'
@@ -40,5 +36,19 @@
   events:
     'input propertychange': (event, bindArg) ->
       bindArg.setVmValue bindArg.element.val()
+      return
   autorun: (c, bindArg) ->
-    bindArg.element.val bindArg.getVmValue()+    bindArg.element.val bindArg.getVmValue()
+    return
+
+addBinding
+  name: 'text'
+  autorun: (c, bindArg) ->
+    bindArg.element.text bindArg.getVmValue()
+    return
+
+addBinding
+  name: 'html'
+  autorun: (c, bindArg) ->
+    bindArg.element.html bindArg.getVmValue()
+    return


extract the modulo operation into a method and explain it

--- lib/commands.coffee
+++ lib/commands.coffee
@@ -51,13 +51,19 @@
     catch error
       atom.notifications.addError error.message, {detail: error.stack, dismissable: true}

+  getMessage: (index) ->
+    messages = @linter.views.messages
+    # Use the dividend independent modulo so that the index stays inside the
+    # array's bounds, even when negative.
+    # That way the index can be ++ an -- without caring about the array bounds.
+    messages[index %% messages.length]
+
   nextError: ->
     if @index?
       @index++
     else
       @index = 0
-    messages = @linter.views.messages
-    message = messages[@index %% messages.length]
+    message = @getMessage(@index)
     return unless message?.filePath
     return unless message?.range
     atom.workspace.open(message.filePath).then ->
@@ -68,8 +74,7 @@
       @index--
     else
       @index = 0
-    messages = @linter.views.messages
-    message = messages[@index %% messages.length]
+    message = @getMessage(@index)
     return unless message?.filePath
     return unless message?.range
     atom.workspace.open(message.filePath).then ->


Don't sync on unsaved or non-TeX files

Don't sync on unsaved or non-TeX files

--- lib/composer.coffee
+++ lib/composer.coffee
@@ -49,6 +49,7 @@

   sync: ->
     {filePath, lineNumber} = @getEditorDetails()
+    return unless filePath? and @isTexFile(filePath)

     unless outputFilePath = @resolveOutputFilePath(filePath)
       latex.log.warning('Could not resolve path to output file associated with the current file.')
@@ -57,7 +58,6 @@
     if opener = latex.getOpener()
       opener.open(outputFilePath, filePath, lineNumber)

-  # TODO: Improve overall code quality within this function.
   # NOTE: Does not support `latex.outputDirectory` setting!
   clean: ->
     {filePath} = @getEditorDetails()
@@ -69,7 +69,7 @@
     rootFile = rootFile.substring(0, rootFile.lastIndexOf('.'))

     cleanExtensions = atom.config.get('latex.cleanExtensions')
-    # NOTE: This needs to be done async.
+    # NOTE: This needs to be made async.
     for extension in cleanExtensions
       candidatePath = path.join(rootPath, rootFile + extension)
       fs.removeSync(candidatePath) if fs.existsSync(candidatePath)


Added some `propTypes` to `PickerMixin`

Added some `propTypes` to `PickerMixin`

--- lib.coffee
+++ lib.coffee
@@ -6,6 +6,11 @@
 formatRegex = /([QeEAaXx]|M{1,4}o?|D{1,4}o?|d{1,4}o?|w{1,2}o?|W{1,2}o?|Y{2,4}|g{2,4}|G{2,4}|H{1,2}|h{1,2}|m{1,2}|s{1,2}|S{1,3}|z{1,2}|Z{1,2})/

 PickerMixin =
+  propTypes: ->
+    format: PropTypes.string
+    value: PropTypes.string
+    defaultValue: PropTypes.string
+
   getDefaultProps: ->
     format = defaultFormat
     defaultValue = (do moment).format format


Use Error for internal errors.

Use Error for internal errors.

--- lib.coffee
+++ lib.coffee
@@ -22,7 +22,7 @@
         throw new Error INVALID_TARGET

     contributeToClass: (@sourceDocument, @sourceField, @isArray) =>
-      throw new Meteor.Error 500, "Only non-array values can be optional" if @isArray and not @required
+      throw new Error "Only non-array values can be optional" if @isArray and not @required

       @sourceCollection = @sourceDocument.Meta.collection

@@ -99,4 +99,4 @@
       document.Meta = document.Meta._meta
       document.Meta metadata, true

-@Document = Document+@Document = Document


Update admin dashboard

Update admin dashboard

Caching invoices again, but using a different method.

--- server/payments/subscription_handler.coffee
+++ server/payments/subscription_handler.coffee
@@ -142,14 +142,14 @@
     # TODO: does not return free subs
     # TODO: add tests
     # TODO: take date range as input
-    # TODO: are ended counts correct for today?  E.g. retries may complicate things.

     return @sendForbiddenError(res) unless req.user?.isAdmin()

-    # TODO: disabling caching to investigate sub end counts bug
-    # @invoices ?= [] # Keep sorted newest to oldest
-    @invoices = []
+    @invoices ?= {}
     newInvoices = []
+
+    oldInvoiceDate = new Date()
+    oldInvoiceDate.setUTCDate(oldInvoiceDate.getUTCDate() - 20)

     processInvoices = (starting_after, done) =>
       options = limit: 100
@@ -157,30 +157,27 @@
       stripe.invoices.list options, (err, invoices) =>
         return done(err) if err
         for invoice in invoices.data
-          return done() if invoice.id is @invoices[0]?.invoiceID
+          invoiceDate = new Date(invoice.date * 1000)
+          # Assume we've cached all older invoices if we find a cached one that's old enough
+          return done() if invoice.id of @invoices and invoiceDate < oldInvoiceDate
           continue unless invoice.paid
           continue unless invoice.subscription
           continue unless invoice.total > 0
           continue unless invoice.lines?.data?[0]?.plan?.id is 'basic'
-          newInvoice =
+          @invoices[invoice.id] =
             customerID: invoice.customer
-            invoiceID: invoice.id
             subscriptionID: invoice.subscription
-            date: new Date(invoice.date * 1000)
-          newInvoice.userID = invoice.lines.data[0].metadata.id if invoice.lines?.data?[0]?.metadata?.id
-          newInvoices.push newInvoice
+            date: invoiceDate
+          @invoices[invoice.id].userID = invoice.lines.data[0].metadata.id if invoice.lines?.data?[0]?.metadata?.id
         if invoices.has_more
-          # console.log 'Fetching more invoices', @invoices.length, newInvoices.length
           return processInvoices(invoices.data[invoices.data.length - 1].id, done)
         else
           return done()

     processInvoices null, (err) =>
       return @sendDatabaseError(res, err) if err
-      @invoices = newInvoices.concat(@invoices)
-      @invoices = _.uniq @invoices, false, 'invoiceID'
       subMap = {}
-      for invoice in @invoices
+      for invoiceID, invoice of @invoices
         subID = invoice.subscriptionID
         if subID of subMap
           subMap[subID].first = invoice.date


fix fancy select term suffix

fix fancy select term suffix

--- app/assets/javascripts/ab_admin/core/ui_utils.js.coffee
+++ app/assets/javascripts/ab_admin/core/ui_utils.js.coffee
@@ -87,7 +87,7 @@
               if $el.data('c')[kind]
                 cond[kind] ||= {}
                 for attr, value of $el.data('c')[kind]
-                  cond[kind][attr] = value
+                  cond[kind.replace(/_term$/, '')][attr] = value

           data = {q: term, class: $el.data('class'), token: true}
           _.extend(data, cond)


Remove debugger statement

Remove debugger statement

--- app/assets/javascripts/components/timeline/grading.cjsx
+++ app/assets/javascripts/components/timeline/grading.cjsx
@@ -36,7 +36,6 @@
           deleteGradeable={@deleteGradeable.bind(this, gradeable.id)}
         />
     gradeables.sort (a, b) ->
-      debugger
       a.props.block.order - b.props.block.order
     if @props.editable && false
       addGradeable = (


Add mising params

Add mising params

--- app/assets/javascripts/issues-bulk-assignment.js.coffee
+++ app/assets/javascripts/issues-bulk-assignment.js.coffee
@@ -78,9 +78,12 @@
   getFormDataAsObject: ->
     formData =
       update:
-        issues_ids: @form.find('#update_issues_ids').val()
-        add_label_ids: []
-        remove_label_ids: []
+        state_event       : @form.find('input[name="update[state_event]"]').val()
+        assignee_id       : @form.find('input[name="update[assignee_id]"]').val()
+        milestone_id      : @form.find('input[name="update[milestone_id]"]').val()
+        issues_ids        : @form.find('input[name="update[issues_ids]"]').val()
+        add_label_ids     : []
+        remove_label_ids  : []

     for id in @getLabelsToApply()
       formData.update.add_label_ids.push id


Add scale_hint hackery

Add scale_hint hackery

--- bokehjs/src/coffee/models/canvas/cartesian_frame.coffee
+++ bokehjs/src/coffee/models/canvas/cartesian_frame.coffee
@@ -54,6 +54,8 @@
       if range instanceof FactorRange
         if not scale instanceof CategoricalScale
           throw new Error("Range #{range.constructor.name} is incompatible is Scale #{scale.constructor.name}")
+      if scale instanceof LogScale and range instanceof DataRange1d
+        range.scale_hint = "log"

       s = scale.clone()
       s.setv({source_range: range, target_range: frame_range})


Fix reference to GlyphRendererView

Fix reference to GlyphRendererView

--- bokehjs/src/coffee/renderer/glyph/glyph_renderer.coffee
+++ bokehjs/src/coffee/renderer/glyph/glyph_renderer.coffee
@@ -214,6 +214,6 @@

   return {
     Model: GlyphRenderer
-    View: GlyphVRendereriew
+    View: GlyphRendererView
     Collection: new GlyphRenderers()
   }


Workspace: Resized terminal pane.

Workspace: Resized terminal pane.

--- client/app/CommonViews/workspace/panes/terminalpane.coffee
+++ client/app/CommonViews/workspace/panes/terminalpane.coffee
@@ -16,6 +16,8 @@
       @runCommand command if command
       @webterm.terminal.setScrollbackLimit 50

+    @on "PaneResized", @bound "forceResize"
+
   runCommand: (command) ->
     return unless command
     return @remote.input "#{command}\n"  if @remote
@@ -25,6 +27,16 @@
         @runCommand command
         @triedAgain = yes

+  viewAppended: ->
+    super
+    @forceResize()
+
+  forceResize: ->
+    # TODO: fatihacet - temp fix, 37 is the height of top header bar.
+    # I need to set split view's height as its normal height - 37.
+    # It will be fixed, when I am done with KDSplitComboView.
+    @setHeight @parent.getHeight() - 37
+
   pistachio: ->
     """
       {{> @header}}