Add coffee script to package

Add coffee script to package

error: pathspec 'skeleton/js/coffee/xo.coffee' did not match any file(s) known to git

--- skeleton/js/coffee/xo.coffee
+++ skeleton/js/coffee/xo.coffee
@@ -0,0 +1,1180 @@
+###*
+# Copyright (c) <2016> <David Maser>
+# Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+# and associated documentation files (the "Software"), to deal in the Software without restriction,
+# including without limitation the rights to use, copy, modify, merge, publish, distribute,
+# sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all copies or
+# substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+# BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+###
+
+xj = jQuery.noConflict()
+xo = {} or
+config:
+  loadPathDefault: '../dist/js/'
+  loadPathExtension: '.js'
+  ajax:
+    pathDefault: '../dist/json/'
+    fileExtension: '.json'
+    defaultMethod: 'get'
+    defaultDataType: 'json'
+  sessionStorageKey: 'xo-'
+  sessionFlushRule: false
+  dataLoadedItems: []
+  showErrorLog: true
+  showErrorLogDate: false
+  animationSpeed: 500
+  domParentNode: 'body'
+  defaultXOWrapper: 'section'
+  defaultXOPage: 'index'
+  defaultStickyOffset: 300
+  init:
+    accordion: true
+    data: false
+    dropdowns: true
+    forms: true
+    gutter: true
+    modal: true
+    nav: true
+    panel: true
+    placeholders: false
+    poster: false
+    sticky: true
+    tabs: true
+    video: false
+  appRunning: false
+  reInitKey: '0188846aREvvS7'
+_define:
+  domload: ->
+    window.addEventListener 'onload', (->
+      'l'
+    ), false
+    return
+  dataready: ->
+  domready: ->
+    window.addEventListener 'DOMContentLoaded', (->
+      'd'
+    ), false
+    return
+init: (advise, callback) ->
+  if `xo.config.appRunning != true`
+    xo.pageSetUp 'html', 'xo', 'true', 'xo set'
+    if `xo.config.init.accordion == true` then xo.navPanelBuilder('accordion') else null
+    if `xo.config.init.data == true` then xo.layoutToPage() else null
+    if `xo.config.init.dropdowns == true` then xo.dropDownInit() else null
+    if `xo.config.init.forms == true` then xo.formToPage() else null
+    if `xo.config.init.gutter == true` then xo.gutter('init') else null
+    if `xo.config.init.modal == true` then xo.modal('init') else null
+    if `xo.config.init.nav == true` then xo.navInit() else null
+    if `xo.config.init.panel == true` then xo.panel() else null
+    if `xo.config.init.placeholders == true` then xo.placeholder() else null
+    if `xo.config.init.poster == true` then xo.poster() else null
+    if `xo.config.init.sticky == true` then xo.sticky() else null
+    if `xo.config.init.tabs == true` then xo.navPanelBuilder('tabs') else null
+    if `xo.config.init.video == true` then xo.video() else null
+    xo.initMouseEvents()
+    xo.config.appRunning = true
+    if `advise == true` then xo.log('xo is running') else null
+    if callback and `typeof callback == 'function'`
+      callback()
+  else
+    xo.log 'An XO instance is already running'
+  return
+saveLoadedItems: (item) ->
+  xo.config.dataLoadedItems.push item
+  return
+checkLoadedItems: (item) ->
+  if xo.config.dataLoadedItems.indexOf(item) > -1
+    return true
+  return
+pageSetUp: (domItem, domPrefix, xoMin, xoClass) ->
+  if `xo.config.appRunning != true`
+    xj(domItem).attr(
+      'xo-prefix': domPrefix
+      'xo-min': xoMin).addClass xoClass
+    xj(xo.config.domParentNode).contents().wrapAll '<' + xo.config.defaultXOWrapper + ' class="xo" xo-reserved="true">'
+  else
+    xo.log 'An XO instance is already running'
+  return
+loadSuccess: ->
+  xj(xo.config.domParentNode).css 'opacity', 1
+  return
+loadExternal: (scriptPath, scriptURI, scriptExt) ->
+
+  ###
+   load external scripts asynchronously and execute their
+   functions. This can be used to load jQuery plugins or
+   other components after the main xo core has been built
+  ###
+
+  a = if `scriptPath == undefined` or null or ' ' then xo.config.loadPathDefault else scriptPath
+  b = if `scriptURI == undefined` then '' else scriptURI
+  c = if `scriptExt == undefined` or null or ' ' then xo.config.loadPathExtension else scriptExt
+  d = a + b + c
+  xj.getScript d, (xoCore) ->
+    eval xoCore
+    return
+  return
+log: (e) ->
+  a = navigator.vendor.indexOf('Google') > -1
+  b = if `xo.config.showErrorLogDate == true` then new Date else ''
+  if `xo.config.showErrorLog == true`
+    if `a == true` then console.warn(e, b) else console.log(e, b)
+  return
+prompt: (message, url) ->
+  r = confirm(message)
+  if `r == true`
+    window.location = url
+  document.getElementById('demo').innerHTML = txt
+  return
+createUniqueCode: ->
+  a = (new Date).valueOf()
+  b = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5)
+  a + b
+countDomTags: (pa) ->
+  pa = pa or document
+  O = {}
+  A = []
+  tag = undefined
+  D = pa.getElementsByTagName('*')
+  D = A.slice.apply(D, [
+    0
+    D.length
+  ])
+  while D.length
+    tag = D.shift().tagName.toLowerCase()
+    if !O[tag]
+      O[tag] = 0
+    O[tag] += 1
+  for p of O
+    A[A.length] = p + ': ' + O[p]
+  A.sort (a, b) ->
+    a = a.split(':')[1] * 1
+    b = b.split(':')[1] * 1
+    b - a
+  A.join ', '
+placeholder: ->
+
+  ###
+   creates a placeholder image from an img tag that
+   has the xo-type attribute placeholder. Placeholder
+   uses placeholdit.imgix.net to get the image.
+   Requires xo-type-param. Param should be:
+   ~text?txtsize=33&txt=Your Text×150&w=350&h=150
+  ###
+
+  _obj = '[xo-type="placeholder"]'
+  xj(_obj).each ->
+    _sourceURL = 'https://placeholdit.imgix.net/'
+    _sourcePARAM = xj(this).attr('xo-type-param')
+    xj(this).attr 'src', _sourceURL + _sourcePARAM
+    return
+  return
+switchNavMode: ->
+#not implemented yet
+  a = xj('html').attr('xo-prefix')
+  b = xj(xo.config.domParentNode).find(xo.config.defaultXOWrapper)
+  c = b.attr('xo-reserved')
+  d = if `c == true` then xo.config.ajax.pathDefault else scriptPath
+  return
+animate: (obj, type, speed, length) ->
+#not implemented yet
+  return
+getData: (scriptPath, scriptURI, method, identifier, target, flush) ->
+
+  ###
+   query a json file or json response object.
+   Loaded data can be saved to session, parse and
+   displayed or new functions can be created to
+   handle specific data formats.
+   The ajax call returns a data object.
+  ###
+
+  _path = if `scriptPath == undefined` or null or ' ' then xo.config.ajax.pathDefault else scriptPath
+  _uri = if `scriptURI == undefined` then '' else scriptURI
+  _extension = xo.config.ajax.fileExtension
+  _dataURL = _path + _uri + _extension
+  xj.ajax(
+    dataType: xo.config.ajax.defaultDataType
+    url: _dataURL
+    type: xo.config.ajax.defaultMethod
+    statusCode:
+      404: ->
+        xo.log 'XO can\'t load that file'
+        return
+      500: ->
+        xo.log 'the server has encountered an internal error'
+        return
+      502: ->
+        xo.log 'bad gateway'
+        return
+      503: ->
+        xo.log 'the service is unavailable'
+        return
+      504: ->
+        xo.log 'the gateway has timed out'
+        return
+  ).success((data) ->
+    xo._define.dataready()
+    if `method == 'p'`
+      xo.parseData data, true, target
+    else if `method == 's'`
+      xo.saveDataToSession JSON.stringify(data), 's', xo.config.sessionStorageKey, identifier
+    else if `method == 'b'`
+      if `sessionStorage.getItem(xo.config.sessionStorageKey + identifier) == null`
+        xo.saveDataToSession JSON.stringify(data), 's', xo.config.sessionStorageKey, identifier
+        xo.log 'Saved ' + xo.config.sessionStorageKey + identifier + ' to session storage'
+      xo.getDataFromSession 'xo', identifier, true, flush or xo.config.sessionFlushRule
+    return
+  ).error ->
+    xo.log 'ajax can\'t load that file'
+    return
+parseData: (data, parse, target) ->
+#working on this one
+  if `parse == true`
+    _data = JSON.parse(data)
+  xj(target).append _data
+  return
+saveDataToSession: (data, method, key, id) ->
+  if `typeof Storage != 'undefined'`
+    key = if `key == undefined` or null or ' ' then xo.config.sessionStorageKey else key
+    if `method == 's'` then sessionStorage.setItem(key + id, data) else localStorage.setItem(xo.config.sessionStorageKey + xo.createUniqueCode(), data)
+  else
+    xo.log 'Sorry! No Web Storage support..'
+  return
+getDataFromSession: (key, id, parse, flush) ->
+  _data = sessionStorage.getItem(key + '-' + id)
+  if `parse == true`
+    _data = JSON.parse(_data)
+  if `flush == true`
+    sessionStorage.removeItem key + '-' + id
+  _data
+trigger: (type, passValue, message) ->
+  message = message or null
+  if `type == 'direct'`
+    window.location = passValue
+  else if `type == 'kill-modal'`
+    xo.modal 'kill-modal', passValue
+  else if `type == 'prompt'`
+    xo.prompt message, passValue
+  return
+tooltip: (object, method) ->
+  if `method == 'add'`
+    tipText = xj(object).attr('xo-tooltip-text')
+    tipEnabled = `xj(object).attr('xo-trigger') == 'tooltip'`
+    toolTipTop = Math.round(xj(object).offset().top)
+    toolTipLeft = Math.round(xj(object).offset().left)
+    if `tipEnabled == true`
+      baseHTML = '
' + tipText + '
'
+      xj(baseHTML).insertAfter object
+  else if `method == 'delete'`
+    xj('.tooltip').remove()
+  return
+sticky: ->
+  xj(window).scroll ->
+    _stickyObj = xj('[xo-span="sticky"]')
+    if xj(window).scrollTop() >= xo.config.defaultStickyOffset
+      _stickyObj.addClass 'sticky-fixed'
+    else
+      _stickyObj.removeClass 'sticky-fixed'
+    return
+  return
+panel: ->
+  xj('[xo-type="panel-group"]').each ->
+    _obj = '[xo-type="panel"]'
+    _count = xj(this).children().length
+    _parent = xj(this).width()
+    xj(this).find(_obj).each ->
+      xj(this).css 'width', _parent / _count - (_count + 1)
+      return
+    return
+  return
+getTemplateObjects: (type, template, parent) ->
+
+  ###
+   Template items are wrapped in double curly brackets ({{}})
+   Comma (,) splits template items.
+   Brackets ([]) delimit action items.
+   Double hyphens (--) split action items.
+   Items with multiple children are split with ampersand (@)
+   Double bar symbols (||) split action items.
+   Action items can
+   var template = '{{title:This is the title}},{{body:This is the body}},{{buttons:Yes[action=xo-trigger--url=here.html]@No[action=xo-trigger--url=null]}}'
+  ###
+
+  _templateArray = template.split(',')
+  _brutObject = []
+  _itemHTML = ''
+  i = 0
+  ii = _templateArray.length
+  while i < ii
+    _brutObject.push
+      a: _templateArray[i].replace('{{', '').replace('}}', '').split(':')[0]
+      b: _templateArray[i].replace('{{', '').replace('}}', '').split(':')[1]
+    i++
+  switch type
+    when 'modal'
+      j = 0
+      jj = _brutObject.length
+      while j < jj
+        if _brutObject[j].a.indexOf('buttons') > -1
+          a = _brutObject[j].b.split('@')
+          if a.length > 1
+            _itemHTML += '
'
+            k = 0
+            kk = a.length
+            while k < kk
+              _tVal = a[k].split('action=')[1].split('--')
+              _tValA = _tVal[0]
+              if _tVal.length > 1
+                _tValB = _tVal[1].split('=')[0]
+              _tMethod = _tValA + '="' + _tValB + '"'
+              _tValue = _tValA + '-' + _tValB
+              if a[k].indexOf('url') > -1
+                _tAction = if `a[k].split('url=')[1].split(']')[0] != null` and `a[k].split('url=')[1].split(']')[0] != 'null'` then a[k].split('url=')[1].split(']')[0] else parent
+              else if a[k].indexOf('modal') > -1
+                _tAction = if `a[k].split('modal=')[1].split(']')[0] != null` and `a[k].split('modal=')[1].split(']')[0] != 'null'` then a[k].split('modal=')[1].split(']')[0] else parent
+              _itemHTML += '<button '
+              _itemHTML += _tMethod + ' '
+              _itemHTML += _tValue + '="' + _tAction + '"'
+              _itemHTML += '>' + a[k].split('[')[0] + '</button>'
+              k++
+            _itemHTML += '
'
+        else
+          _itemHTML += '
' + _brutObject[j].b + '
'
+        j++
+      return _itemHTML
+    when 'popup'
+  return
+modal: (method, template) ->
+  if `method != 'kill-modal'`
+    _obj = '[xo-type="modal"]'
+    _objName = xj(_obj).attr('xo-object-name')
+    _filterObj = '[xo-type="modal-filter"]'
+    _filterCode = '

'
+    _inlineTemplate = xj(_obj).attr('xo-data-template')
+    if `typeof _inlineTemplate != undefined` and `_inlineTemplate != false`
+      xj(_obj).contents().not('[xo-type="modal-toggle"]').remove()
+      xj(_obj).append xo.getTemplateObjects('modal', _inlineTemplate, _objName)
+    else if `template != typeof undefined` and `template != false`
+      xj(_obj).contents().not('[xo-type="modal-toggle"]').remove()
+      #empty modal content to avoid duplicates.
+      xj(_obj).append xo.getTemplateObjects('modal', template)
+    if xj(_obj).length > 0
+      _state = xj(_obj).attr('xo-state')
+    if `method == 'init'`
+      xj(_obj).prepend '
X
'
+      xj(_obj).wrap '
'
+    else
+      if `_state == 'open'`
+        xj(_obj).attr 'xo-state', 'closed'
+        xj(_obj).parent().attr 'xo-state', 'closed'
+        xj(_filterObj).animate { opacity: 0 }, xo.config.animationSpeed, ->
+          xj(_filterObj).remove()
+          return
+      else if `_state == 'closed'`
+        xj(xo.config.defaultXOWrapper + '.xo').prepend _filterCode
+        xj(_filterObj).animate { opacity: 1 }, xo.config.animationSpeed, ->
+          xj(_obj).attr 'xo-state', 'open'
+          xj(_obj).parent().attr 'xo-state', 'open'
+          return
+  else
+    xj('[xo-object-name="' + template + '"]').attr('xo-state', 'closed').parent().attr 'xo-state', 'closed'
+    xj('[xo-type="modal-filter"]').remove()
+  return
+gutter: (method, parent) ->
+
+  ###
+   creates an animatable gutter instance out of any html element. XO parameters
+   define where it is placed and what it's initial state is to be. You can place
+   as many XO gutters on your page as long as you make sure to give each one a
+   unique xo-object-name value. Toggles for a particular gutter can be created
+   by adding the xo-parent attribute
+   i.e.
+  ###
+
+  _baseObj = '[xo-type="gutter"]'
+  #check if a gutter exists
+  if `xj(_baseObj).length != 0`
+    _obj = if `parent != null` and `parent != undefined` then _baseObj + '[xo-object-name="' + parent + '"]' else _baseObj
+    _filterObj = '[xo-type="gutter-filter"]'
+    _filterCode = '

'
+    if xj(_obj).length > 0
+      _state = xj(_obj).attr('xo-state')
+      _width = xj(_obj).width()
+      _param = xj(_obj).attr('xo-type-param')
+    if `method == 'init'`
+
+      ###
+       loop through each gutter object to give each of
+       them and their enclosed close buttons and opacity
+       filters the correct values and parameters
+      ###
+
+      xj(_baseObj).each ->
+        `var _width`
+        _p = xj(this).attr('xo-object-name')
+        _width = xj(_obj).width()
+        xj(this).prepend '
X
'
+        if `xj(this).attr('xo-state') == 'closed'`
+          xj(this).css xj(this).attr('xo-type-param'), -_width
+        return
+    else
+      _width = xj(_obj).width()
+      if `_state == 'open'`
+        if `_param == 'left'`
+          xj(_obj).animate { left: -_width }, xo.config.animationSpeed, ->
+            xj(_obj).attr 'xo-state', 'closed'
+            return
+        else if `_param == 'right'`
+          xj(_obj).animate { right: -_width }, xo.config.animationSpeed, ->
+            xj(_obj).attr 'xo-state', 'closed'
+            return
+        xj(_filterObj).animate { opacity: 0 }, xo.config.animationSpeed, ->
+          xj(_filterObj).remove()
+          return
+      else if `_state == 'closed'`
+        if `_param == 'left'`
+          xj(_obj).animate { left: '0' }, xo.config.animationSpeed
+        else if `_param == 'right'`
+          xj(_obj).animate { right: '0' }, xo.config.animationSpeed
+        xj(xo.config.defaultXOWrapper + '.xo').prepend _filterCode
+        xj(_filterObj).animate { opacity: 1 }, xo.config.animationSpeed
+        xj(_obj).attr 'xo-state', 'open'
+  return
+video: ->
+
+  ###
+   creates a video instance on the page. Writes
+   the code necessary inside the html object that
+   has the xo-type video. XO params define the
+   source url, video format, etc..
+  ###
+
+  xj('[xo-type="video"]').each ->
+    _obj = '[xo-type="video"]'
+    _vdoW = xj(_obj).attr('xo-video-width') or 'auto'
+    _vdoH = xj(_obj).attr('xo-video-height') or 'auto'
+    _vdoS = xj(_obj).attr('xo-video-src')
+    _vdoT = xj(_obj).attr('xo-video-format')
+    _vdoC = xj(_obj).attr('xo-video-controls')
+    _vdoA = xj(_obj).attr('xo-video-autoplay')
+    _vdo = '<video width="' + _vdoW + '" height="' + _vdoH + '"'
+    if `_vdoC == 'true'`
+      _vdo += ' controls'
+    if `_vdoA == 'true'`
+      _vdo += ' autoplay'
+    _vdo += '>'
+    _vdo += '<source src="' + _vdoS + '" type="video/' + _vdoT + '">'
+    _vdo += 'Your browser does not support the video tag.'
+    _vdo += '</video>'
+    xj(_obj).contents().remove()
+    #removes content from the video placeholder
+    xj(_obj).append _vdo
+    return
+  return
+formToPage: ->
+
+  ###
+   function launched by init. Cycles through all objects
+   on the page that have the xo-type="form" attribute and
+   injects the correct form into them by calling the
+   formBuilder function.
+  ###
+
+  xj('[xo-type="form"]').each ->
+    _formTarget = xj(this).attr('xo-object-name')
+    xo.formBuilder 'forms/' + _formTarget, _formTarget, _formTarget
+    return
+  return
+formBuilder: (source, target, host) ->
+  _tempData = xo.getData(null, source, 'b', target, false)
+  _tempArray = []
+  _tempOptions = '['
+  _tempRadioOptions = '['
+  _tempCheckOptions = '['
+  _tempDataListOptions = '['
+  _sessionSourceLoaded = xo.checkLoadedItems(xo.config.sessionStorageKey + host)
+  if `_sessionSourceLoaded != true`
+    _tempData.success (data) ->
+      _initData = []
+      _processData = data.form
+      _initData.push
+        action: data.formAction
+        method: data.formMethod
+        id: data.formId
+        class: data.formClass
+      Object.keys(_processData).forEach (key) ->
+        switch _processData[key].item
+          when 'select'
+            if `typeof _processData[key].option == 'object'`
+              _optionDepth = _processData[key].option.length
+              o = 0
+              while o < _optionDepth
+                _tempOptions += '{"optionName":"' + _processData[key].option[o].name + '","optionValue":"' + _processData[key].option[o].value + '"'
+                _tempOptions += if `_processData[key].option[o].selected == true` then ',"optionSelected":true' else ',"optionSelected":false'
+                _tempOptions += '}'
+                if o < _optionDepth - 1
+                  _tempOptions += ','
+                o++
+              _tempOptions += ']'
+              _tempOptions = JSON.parse(_tempOptions)
+          when 'radiogroup'
+            if `typeof _processData[key].option == 'object'`
+              _optionDepth = _processData[key].option.length
+              o = 0
+              while o < _optionDepth
+                _tempRadioOptions += '{"optionName":"' + _processData[key].option[o].name + '","optionValue":"' + _processData[key].option[o].value + '"'
+                _tempRadioOptions += if `_processData[key].option[o].checked == true` then ',"optionChecked":true' else ',"optionChecked":false'
+                _tempRadioOptions += '}'
+                if o < _optionDepth - 1
+                  _tempRadioOptions += ','
+                o++
+              _tempRadioOptions += ']'
+              _tempRadioOptions = JSON.parse(_tempRadioOptions)
+          when 'checkbox'
+            if `typeof _processData[key].option == 'object'`
+              _optionDepth = _processData[key].option.length
+              o = 0
+              while o < _optionDepth
+                _tempCheckOptions += '{"optionName":"' + _processData[key].option[o].name + '","optionValue":"' + _processData[key].option[o].value + '"'
+                _tempCheckOptions += if `_processData[key].option[o].checked == true` then ',"optionChecked":true' else ',"optionChecked":false'
+                _tempCheckOptions += '}'
+                if o < _optionDepth - 1
+                  _tempCheckOptions += ','
+                o++
+              _tempCheckOptions += ']'
+              _tempCheckOptions = JSON.parse(_tempCheckOptions)
+          when 'datalist'
+            if `typeof _processData[key].option == 'object'`
+              _optionDepth = _processData[key].option.length
+              o = 0
+              while o < _optionDepth
+                _tempDataListOptions += '{"optionValue":"' + _processData[key].option[o].value + '"}'
+                if o < _optionDepth - 1
+                  _tempDataListOptions += ','
+                o++
+              _tempDataListOptions += ']'
+              _tempDataListOptions = JSON.parse(_tempDataListOptions)
+        _tempArray.push
+          item: _processData[key].item
+          name: _processData[key].name
+          label: _processData[key].label or null
+          class: _processData[key].class or null
+          id: _processData[key].id or null
+          required: _processData[key].required or null
+          multiple: _processData[key].multiple or null
+          placeholder: _processData[key].placeholder or null
+          value: _processData[key].value or null
+          min: _processData[key].min - length or null
+          max: _processData[key].max - length or null
+          rows: _processData[key].rows or null
+          cols: _processData[key].cols or null
+          submit: _processData[key].submit or null
+          options: _tempOptions or _tempRadioOptions or _tempCheckOptions or _tempDataListOptions
+        return
+      _formLength = _tempArray.length
+      i = 0
+      while i < _formLength
+        switch _tempArray[i].item
+          when 'text'
+            _formCode = '
'
+            _formCode += if `_tempArray[i].label != null` then '' + _tempArray[i].label + '' else ''
+            _formCode += '<input type="text"'
+            _formCode += if `_tempArray[i].name != null` then ' name="' + _tempArray[i].name + '"' else ''
+            _formCode += if `_tempArray[i].class != null` then ' class="' + _tempArray[i].class + '"' else ''
+            _formCode += if `_tempArray[i].id != null` then ' id="' + _tempArray[i].id + '"' else ''
+            _formCode += if `_tempArray[i].required != null` and `_tempArray[i].required == true` then ' required' else ''
+            _formCode += if `_tempArray[i].placeholder != null` then ' placeholder="' + _tempArray[i].placeholder + '"' else ''
+            _formCode += if `_tempArray[i].value != null` then ' value="' + _tempArray[i].value + '"' else ''
+            _formCode += if `_tempArray[i].min != null` then ' minlength="' + _tempArray[i].min + '"' else ''
+            _formCode += if `_tempArray[i].max != null` then ' maxlength="' + _tempArray[i].max + '"' else ''
+            _formCode += '>
'
+          when 'textarea'
+            _formCode += '
'
+            _formCode += if `_tempArray[i].label != null` then '' + _tempArray[i].label + '' else ''
+            _formCode += '<textarea'
+            _formCode += if `_tempArray[i].rows != null` then ' rows="' + _tempArray[i].rows + '"' else ''
+            _formCode += if `_tempArray[i].cols != null` then ' cols="' + _tempArray[i].cols + '"' else ''
+            _formCode += if `_tempArray[i].name != null` then ' name="' + _tempArray[i].name + '"' else ''
+            _formCode += if `_tempArray[i].class != null` then ' class="' + _tempArray[i].class + '"' else ''
+            _formCode += if `_tempArray[i].id != null` then ' id="' + _tempArray[i].id + '"' else ''
+            _formCode += if `_tempArray[i].required != null` and `_tempArray[i].required == true` then ' required' else ''
+            _formCode += if `_tempArray[i].placeholder != null` then ' placeholder="' + _tempArray[i].placeholder + '"' else ''
+            _formCode += if `_tempArray[i].max != null` then ' maxlength="' + _tempArray[i].max + '"' else ''
+            _formCode += '></textarea>
'
+          when 'select'
+            _formCode += '
'
+            _formCode += if `_tempArray[i].label != null` then '' + _tempArray[i].label + '' else ''
+            _formCode += '<select'
+            _formCode += if `_tempArray[i].name != null` then ' name="' + _tempArray[i].name + '"' else ''
+            _formCode += if `_tempArray[i].required != null` and `_tempArray[i].required == true` then ' required' else ''
+            _formCode += if `_tempArray[i].multiple != null` and `_tempArray[i].multiple == true` then ' multiple' else ''
+            _formCode += if `_tempArray[i].class != null` then ' class="' + _tempArray[i].class + '"' else ''
+            _formCode += if `_tempArray[i].id != null` then ' id="' + _tempArray[i].id + '"' else ''
+            _formCode += '>'
+            j = 0
+            jj = _tempArray[i].options.length
+            while j < jj
+              _formCode += '<option'
+              _formCode += if `_tempArray[i].options[j].optionSelected != null` and `_tempArray[i].options[j].optionSelected == true` then ' selected' else ''
+              _formCode += ' value="' + _tempArray[i].options[j].optionValue + '">'
+              _formCode += _tempArray[i].options[j].optionName + '</option>'
+              j++
+            _formCode += '</select>
'
+          when 'radiogroup'
+            _formCode += '
'
+            _formCode += if `_tempArray[i].label != null` then '' + _tempArray[i].label + '' else ''
+            k = 0
+            kk = _tempArray[i].options.length
+            while k < kk
+              _formCode += '<input type="radio"'
+              _formCode += ' name="' + _tempArray[i].name + '"'
+              _formCode += if `_tempArray[i].options[k].optionChecked != null` and `_tempArray[i].options[k].optionChecked == true` then ' checked' else ''
+              _formCode += ' value="' + _tempArray[i].options[k].optionValue + '">'
+              k++
+            _formCode += '
'
+          when 'checkbox'
+            _formCode += '
'
+            _formCode += if `_tempArray[i].label != null` then '' + _tempArray[i].label + '' else ''
+            l = 0
+            ll = _tempArray[i].options.length
+            while l < ll
+              _formCode += '<input type="checkbox"'
+              _formCode += ' name="' + _tempArray[i].name + '"'
+              _formCode += if `_tempArray[i].options[l].optionChecked != null` and `_tempArray[i].options[l].optionChecked == true` then ' checked' else ''
+              _formCode += ' value="' + _tempArray[i].options[l].optionValue + '">'
+              l++
+            _formCode += '
'
+          when 'datalist'
+            _formCode += '
'
+            _formCode += if `_tempArray[i].label != null` then '' + _tempArray[i].label + '' else ''
+            _formCode += '<input list="' + _tempArray[i].id + '" name="' + _tempArray[i].name + '">'
+            _formCode += '<datalist id="' + _tempArray[i].id + '">'
+            m = 0
+            mm = _tempArray[i].options.length
+            while m < mm
+              _formCode += '<option value="' + _tempArray[i].options[m].optionValue + '">'
+              m++
+            _formCode += '</datalist>'
+            _formCode += if `_tempArray[i].submit != true` then '' else '<input type="submit">'
+            _formCode += '
'
+        i++
+      _formPrepend = '<form action="' + _initData[0].action + '" method="' + _initData[0].method + '" id="' + _initData[0].id + '" class="' + _initData[0].class + '">'
+      _formAppend = '</form>'
+      xj('[xo-object-name="' + host + '"]').append _formPrepend + _formCode + _formAppend
+      xo.saveLoadedItems xo.config.sessionStorageKey + host
+      return
+  else
+    xo.warningBar 'attention', 'DATA LOADED', 'This form instance has already been loaded', 'body'
+  return
+layoutToPage: ->
+
+  ###
+   function launched by init. Cycles through all objects
+   on the page that have the xo-type="data" attribute and
+   injects the correct form into them by calling the
+   formBuilder function.
+  ###
+
+  xj('[xo-type="data"]').each ->
+    _dataTarget = xj(this).attr('xo-object-name')
+    _dataSource = xj(this).attr('xo-data-source')
+    xo.layoutBuilder _dataSource, _dataTarget, _dataTarget
+    return
+  return
+layoutBuilder: (source, target, host) ->
+  _tempData = xo.getData(null, source, 'b', target, false)
+  _tempArray = []
+  _tempOptions = '['
+  _sessionSourceLoaded = xo.checkLoadedItems(xo.config.sessionStorageKey + host)
+  if `_sessionSourceLoaded != true`
+    _tempData.success (data) ->
+      _processData = data.page
+      Object.keys(_processData).forEach (key) ->
+        if `typeof _processData[key].node == 'object'`
+          _optionDepth = _processData[key].node.length
+          o = 0
+          while o < _optionDepth
+            _tempOptions += '{"nodeType":"' + _processData[key].node[o].type + '",'
+            _tempOptions += if `_processData[key].node[o].class != null` then '"nodeClass":"' + _processData[key].node[o].class + '",' else '"nodeClass":null,'
+            _tempOptions += if `_processData[key].node[o].id != null` then '"nodeID":"' + _processData[key].node[o].id + '",' else '"nodeId":null,'
+            _tempOptions += if `_processData[key].node[o].xoType != null` then '"nodexoType":"' + _processData[key].node[o].xoType + '",' else '"nodexoType":null,'
+            _tempOptions += if `_processData[key].node[o].xoState != null` then '"nodexoState":"' + _processData[key].node[o].xoState + '",' else '"nodexoState":null,'
+            _tempOptions += if `_processData[key].node[o].xoSpan != null` then '"nodexoSpan":"' + _processData[key].node[o].xoSpan + '",' else '"nodexoSpan":null,'
+            _tempOptions += if `_processData[key].node[o].xoObjectName != null` then '"nodexoObjectName":"' + _processData[key].node[o].xoObjectName + '",' else '"nodexoObjectName":null,'
+            _tempOptions += if `_processData[key].node[o].xoTypeParam != null` then '"nodexoTypeParam":"' + _processData[key].node[o].xoTypeParam + '",' else '"nodexoTypeParam":null,'
+            _tempOptions += if `_processData[key].node[o].xoParent != null` then '"nodexoParent":"' + _processData[key].node[o].xoParent + '",' else '"nodexoParent":null,'
+            _tempOptions += '"nodeContent":"' + _processData[key].node[o].content + '"'
+            _tempOptions += '}'
+            if o < _optionDepth - 1
+              _tempOptions += ','
+            o++
+          _tempOptions += ']'
+          _tempOptions = JSON.parse(_tempOptions)
+        _tempArray.push
+          page: _processData[key].id
+          title: _processData[key].title
+          metas: _processData[key].metas
+          node: _tempOptions
+        _layoutCode = ''
+        _baseNode = _tempArray[0].node
+        i = 0
+        ii = _baseNode.length
+        while i < ii
+          _layoutCode += '<' + _baseNode[i].nodeType
+          _layoutCode += if `_baseNode[i].nodexoType != null` and `_baseNode[i].nodexoType != undefined` then ' xo-type="' + _baseNode[i].nodexoType + '"' else ''
+          _layoutCode += if `_baseNode[i].nodeClass != null` and `_baseNode[i].nodeClass != undefined` then ' class="' + _baseNode[i].nodeClass + '"' else ''
+          _layoutCode += if `_baseNode[i].nodeID != null` and `_baseNode[i].nodeID != undefined` then ' id="' + _baseNode[i].nodeID + '"' else ''
+          _layoutCode += if `_baseNode[i].nodexoState != null` and `_baseNode[i].nodexoState != undefined` then ' xo-state="' + _baseNode[i].nodexoState + '"' else ''
+          _layoutCode += if `_baseNode[i].nodexoSpan != null` and `_baseNode[i].nodexoSpan != undefined` then ' xo-span="' + _baseNode[i].nodexoSpan + '"' else ''
+          _layoutCode += if `_baseNode[i].nodexoObjectName != null` and `_baseNode[i].nodexoObjectName != undefined` then ' xo-object-name="' + _baseNode[i].nodexoObjectName + '"' else ''
+          _layoutCode += if `_baseNode[i].nodexoTypeParam != null` and `_baseNode[i].nodexoTypeParam != undefined` then ' xo-type-param="' + _baseNode[i].nodexoTypeParam + '"' else ''
+          _layoutCode += if `_baseNode[i].nodexoParent != null` and `_baseNode[i].nodexoParent != undefined` then ' xo-parent="' + _baseNode[i].nodexoParent + '"' else ''
+          _layoutCode += '>' + _baseNode[i].nodeContent + '</' + _baseNode[i].nodeType + '>'
+          i++
+        xj('[xo-object-name="' + host + '"]').append _layoutCode
+        xo.saveLoadedItems xo.config.sessionStorageKey + host
+        return
+      return
+  else
+    xo.warningBar 'attention', 'DATA LOADED', 'This data instance has already been loaded', 'body'
+  return
+dropDownInit: ->
+
+  ###
+   initializes the display of dropdown navigation bars as needed.
+   Feature can be enabled in xo.config. dropDownInit cycles
+   through the page dom to find xo-type dropdown objects
+   and displays the dropdowns in place. Dropdowns can be static
+   or json.
+  ###
+
+  xj('[xo-type="dropdown"]').each ->
+    _buttonLabel = xj(this).attr('xo-dropdown-button')
+    _objectName = xj(this).attr('xo-object-name')
+    xo.dropDownBuilder _buttonLabel, _objectName, 'static', null
+    return
+  xj('[xo-type="jsondropdown"]').each ->
+    _buttonLabel = xj(this).attr('xo-dropdown-button')
+    _objectName = xj(this).attr('xo-object-name')
+    _objectSource = xj(this).attr('xo-data-source')
+    xo.dropDownBuilder _buttonLabel, _objectName, 'json', _objectSource
+    return
+  return
+dropDownBuilder: (button, object, type, source) ->
+
+  ###*
+  # button @type=string : button text
+  # object @type=string : page dom element
+  # type @type=string : either static or json
+  # source @type= string : json source url
+  ###
+
+  switch type
+    when 'static'
+      _this = '[xo-object-name="' + object + '"]'
+      _initialState = xj(_this).attr('xo-state')
+      _buttonHTML = '<button xo-type="dropdown-button" xo-parent="' + object + '">' + button + '</button>'
+      xj(_this).prepend(_buttonHTML).find('ul').attr('xo-object-name', object).attr 'xo-state', _initialState
+    when 'json'
+      _this = '[xo-object-name="' + object + '"]'
+      _initialState = xj(_this).attr('xo-state')
+      _buttonHTML = '<button xo-type="dropdown-button" xo-parent="' + object + '">' + button + '</button>'
+      _tempData = xo.getData(null, source, 'b', object, false)
+      _sessionSourceLoaded = xo.checkLoadedItems(xo.config.sessionStorageKey + object)
+      _dropdownHTML = ''
+      if `_sessionSourceLoaded != true`
+        _tempData.success (data) ->
+          _processData = data.dropdown
+          _dropdownHTML += '
'
+          Object.keys(_processData).forEach (key) ->
+            _dropdownHTML += '<li'
+            _dropdownHTML += if `_processData[key].xotype != null` and `_processData[key].xotype != undefined` then ' xo-type="' + _processData[key].xotype + '"' else ''
+            _dropdownHTML += if `_processData[key].xotrigger != null` and `_processData[key].xotrigger != undefined` then ' xo-trigger="' + _processData[key].xotrigger + '"' else ''
+            _dropdownHTML += if `_processData[key].xotriggerurl != null` and `_processData[key].xotriggerurl != undefined` then ' xo-trigger-url="' + _processData[key].xotriggerurl + '"' else ''
+            _dropdownHTML += if `_processData[key].xostate != null` and `_processData[key].xostate != undefined` then ' xo-state="' + _processData[key].xostate + '"' else ''
+            _dropdownHTML += if `_processData[key].xoobjectname != null` and `_processData[key].xoobjectname != undefined` then ' xo-object-name="' + _processData[key].xoobjectname + '"' else ''
+            _dropdownHTML += if `_processData[key].xoparent != null` and `_processData[key].xoparent != undefined` then ' xo-parent="' + _processData[key].xoparent + '"' else ''
+            _dropdownHTML += if `_processData[key].class != null` and `_processData[key].class != undefined` then ' class="' + _processData[key].class + '"' else ''
+            _dropdownHTML += if `_processData[key].id != null` and `_processData[key].id != undefined` then ' id="' + _processData[key].id + '"' else ''
+            _dropdownHTML += '>'
+            _dropdownHTML += _processData[key].content
+            _dropdownHTML += '
'
+            return
+          _dropdownHTML += '
'
+          xj(_this).prepend(_buttonHTML).find('ul').attr('xo-object-name', object).attr 'xo-state', _initialState
+          xj('[xo-object-name="' + object + '"]').append _dropdownHTML
+          xo.saveLoadedItems xo.config.sessionStorageKey + object
+          return
+      else
+        xo.warningBar 'attention', 'DATA LOADED', 'This data instance has already been loaded', 'body'
+  return
+navInit: ->
+
+  ###
+   initializes the display of navigation bars as needed.
+   Feature can be enabled in xo.config. navInit cycles
+   through the page dom to find xo-type navigation objects
+   and displays the nav bar in place
+  ###
+
+  xj('[xo-type="navigation"]').each ->
+    _objectName = xj(this).attr('xo-object-name')
+    _objectSource = xj(this).attr('xo-data-source')
+    xo.navBuilder _objectSource, _objectName
+    return
+  return
+navBuilder: (source, target) ->
+
+  ###
+   this function builds a navigation bar from
+   a json file. Check the nav-bar.json file
+   in dist/json/nav for the structure and
+   options that are available.
+   The navBuilder reuses functions and features
+   such as buttons, dropdowns, form objects.
+  ###
+
+  _tempData = xo.getData(null, source, 'b', target, false)
+  _tempArray = []
+  _sessionSourceLoaded = xo.checkLoadedItems(xo.config.sessionStorageKey + target)
+  if `_sessionSourceLoaded != true`
+    _tempData.success (data) ->
+      _processData = data.nav
+      Object.keys(_processData).forEach (key) ->
+        if `_processData[key].nodes != null` and `_processData[key].nodes != undefined` and `_processData[key].nodes != 'undefined'` and `typeof _processData[key].nodes == 'object'`
+          _optionDepth = _processData[key].nodes.length
+          _tempNodes = '['
+          o = 0
+          while o < _optionDepth
+            _tempNodes += '{"nodetype":"' + _processData[key].nodes[o].type + '"'
+            _tempNodes += if `_processData[key].nodes[o].class != null` and `_processData[key].nodes[o].class != 'undefined'` and `_processData[key].nodes[o].class != undefined` then ',"nodeclass":"' + _processData[key].nodes[o].class + '"' else ''
+            _tempNodes += if `_processData[key].nodes[o].id != null` and `_processData[key].nodes[o].id != 'undefined'` and `_processData[key].nodes[o].id != undefined` then ',"nodeid":"' + _processData[key].nodes[o].id + '"' else ''
+            _tempNodes += if `_processData[key].nodes[o].xotype != null` and `_processData[key].nodes[o].xotype != 'undefined'` and `_processData[key].nodes[o].xotype != undefined` then ',"nodexotype":"' + _processData[key].nodes[o].xotype + '"' else ''
+            _tempNodes += if `_processData[key].nodes[o].xostate != null` and `_processData[key].nodes[o].xostate != 'undefined'` and `_processData[key].nodes[o].xostate != undefined` then ',"nodexostate":"' + _processData[key].nodes[o].xostate + '"' else ''
+            _tempNodes += if `_processData[key].nodes[o].xoObjectName != null` and `_processData[key].nodes[o].xoobjectname != 'undefined'` and `_processData[key].nodes[o].xoobjectname != undefined` then ',"nodexoobjectname":"' + _processData[key].nodes[o].xoobjectname + '"' else ''
+            _tempNodes += if `_processData[key].nodes[o].xoParent != null` and `_processData[key].nodes[o].xoparent != 'undefined'` and `_processData[key].nodes[o].xoparent != undefined` then ',"nodexoparent":"' + _processData[key].nodes[o].xoparent + '"' else ''
+            _tempNodes += if `_processData[key].nodes[o].label != null` and `_processData[key].nodes[o].label != 'undefined'` and `_processData[key].nodes[o].label != undefined` then ',"nodecontent":"' + _processData[key].nodes[o].label + '"' else ''
+            _tempNodes += '}'
+            if o < _optionDepth - 1
+              _tempNodes += ','
+            o++
+          _tempNodes += ']'
+          _tempNodes = JSON.parse(_tempNodes)
+        _tempArray.push
+          type: _processData[key].type
+          label: _processData[key].label
+          url: _processData[key].url
+          class: _processData[key].class
+          id: _processData[key].id
+          xotype: _processData[key].xotype
+          xotrigger: _processData[key].xotrigger
+          xotriggerurl: _processData[key].xotriggerurl
+          xostate: _processData[key].xostate
+          xoobjectname: _processData[key].xoobjectname
+          xoparent: _processData[key].xoparent
+          placeholder: _processData[key].placeholder
+          button: _processData[key].buttonLabel
+          node: _tempNodes
+        return
+      _navCode = ''
+      i = 0
+      ii = _tempArray.length
+      while i < ii
+        switch _tempArray[i].type
+          when 'icon'
+            _navCode += '<div class="nav-icon"'
+            _navCode += if `_tempArray[i].xostate != null` and `_tempArray[i].xostate != 'undefined'` and `_tempArray[i].xostate != undefined` then ' xo-state="' + _tempArray[i].xostate + '"' else ''
+            _navCode += if `_tempArray[i].xotype != null` and `_tempArray[i].xotype != 'undefined'` and `_tempArray[i].xotype != undefined` then ' xo-type="' + _tempArray[i].xotype + '"' else ''
+            _navCode += if `_tempArray[i].xoparent != null` and `_tempArray[i].xoparent != 'undefined'` and `_tempArray[i].xoparent != undefined` then ' xo-parent="' + _tempArray[i].xoparent + '"' else ''
+            _navCode += '>'
+            _navCode += if `_tempArray[i].class != null` and `_tempArray[i].class != 'undefined'` and `_tempArray[i].class != undefined` then '' else ''
+            _navCode += '
'
+          when 'image'
+            _navCode += '<img'
+            _navCode += if `_tempArray[i].xotype != null` and `_tempArray[i].xotype != 'undefined'` and `_tempArray[i].xotype != undefined` then ' xo-type="' + _tempArray[i].xotype + '"' else ''
+            _navCode += if `_tempArray[i].xotrigger != null` and `_tempArray[i].xotrigger != 'undefined'` and `_tempArray[i].xotrigger != undefined` then ' xo-trigger="' + _tempArray[i].xotrigger + '"' else ''
+            _navCode += if `_tempArray[i].xotriggerurl != null` and `_tempArray[i].xotriggerurl != 'undefined'` and `_tempArray[i].xotriggerurl != undefined` then ' xo-trigger-url="' + _tempArray[i].xotriggerurl + '"' else ''
+            _navCode += if `_tempArray[i].xostate != null` and `_tempArray[i].xostate != 'undefined'` and `_tempArray[i].xostate != undefined` then ' xo-state="' + _tempArray[i].xostate + '"' else ''
+            _navCode += if `_tempArray[i].xoobjectname != null` and `_tempArray[i].xoobjectname != 'undefined'` and `_tempArray[i].xoobjectname != undefined` then ' xo-object-name="' + _tempArray[i].xoobjectname + '"' else ''
+            _navCode += if `_tempArray[i].xoparent != null` and `_tempArray[i].xoparent != 'undefined'` and `_tempArray[i].xoparent != undefined` then ' xo-parent="' + _tempArray[i].xoparent + '"' else ''
+            _navCode += if `_tempArray[i].class != null` and `_tempArray[i].class != 'undefined'` and `_tempArray[i].class != undefined` then ' class="' + _tempArray[i].class + '"' else ''
+            _navCode += if `_tempArray[i].id != null` and `_tempArray[i].id != 'undefined'` and `_tempArray[i].id != undefined` then ' id="' + _tempArray[i].id + '"' else ''
+            _navCode += ' src="' + _tempArray[i].url
+            _navCode += '" />'
+          when 'button'
+            _navCode += '<button'
+            _navCode += if `_tempArray[i].xotype != null` and `_tempArray[i].xotype != 'undefined'` and `_tempArray[i].xotype != undefined` then ' xo-type="' + _tempArray[i].xotype + '"' else ''
+            _navCode += if `_tempArray[i].xotrigger != null` and `_tempArray[i].xotrigger != 'undefined'` and `_tempArray[i].xotrigger != undefined` then ' xo-trigger="' + _tempArray[i].xotrigger + '"' else ''
+            _navCode += if `_tempArray[i].xotriggerurl != null` and `_tempArray[i].xotriggerurl != 'undefined'` and `_tempArray[i].xotriggerurl != undefined` then ' xo-trigger-url="' + _tempArray[i].xotriggerurl + '"' else ''
+            _navCode += if `_tempArray[i].xostate != null` and `_tempArray[i].xostate != 'undefined'` and `_tempArray[i].xostate != undefined` then ' xo-state="' + _tempArray[i].xostate + '"' else ''
+            _navCode += if `_tempArray[i].xoobjectname != null` and `_tempArray[i].xoobjectname != 'undefined'` and `_tempArray[i].xoobjectname != undefined` then ' xo-object-name="' + _tempArray[i].xoobjectname + '"' else ''
+            _navCode += if `_tempArray[i].xoparent != null` and `_tempArray[i].xoparent != 'undefined'` and `_tempArray[i].xoparent != undefined` then ' xo-parent="' + _tempArray[i].xoparent + '"' else ''
+            _navCode += if `_tempArray[i].class != null` and `_tempArray[i].class != 'undefined'` and `_tempArray[i].class != undefined` then ' class="' + _tempArray[i].class + '"' else ''
+            _navCode += if `_tempArray[i].id != null` and `_tempArray[i].id != 'undefined'` and `_tempArray[i].id != undefined` then ' id="' + _tempArray[i].id + '"' else ''
+            _navCode += '>'
+            _navCode += _tempArray[i].label
+            _navCode += '</button>'
+          when 'search'
+            _navCode += '<form'
+            _navCode += if `_tempArray[i].xotype != null` and `_tempArray[i].xotype != 'undefined'` and `_tempArray[i].xotype != undefined` then ' xo-type="' + _tempArray[i].xotype + '"' else ''
+            _navCode += if `_tempArray[i].xotrigger != null` and `_tempArray[i].xotrigger != 'undefined'` and `_tempArray[i].xotrigger != undefined` then ' xo-trigger="' + _tempArray[i].xotrigger + '"' else ''
+            _navCode += if `_tempArray[i].xotriggerurl != null` and `_tempArray[i].xotriggerurl != 'undefined'` and `_tempArray[i].xotriggerurl != undefined` then ' xo-trigger-url="' + _tempArray[i].xotriggerurl + '"' else ''
+            _navCode += if `_tempArray[i].xostate != null` and `_tempArray[i].xostate != 'undefined'` and `_tempArray[i].xostate != undefined` then ' xo-state="' + _tempArray[i].xostate + '"' else ''
+            _navCode += if `_tempArray[i].xoobjectname != null` and `_tempArray[i].xoobjectname != 'undefined'` and `_tempArray[i].xoobjectname != undefined` then ' xo-object-name="' + _tempArray[i].xoobjectname + '"' else ''
+            _navCode += if `_tempArray[i].xoparent != null` and `_tempArray[i].xoparent != 'undefined'` and `_tempArray[i].xoparent != undefined` then ' xo-parent="' + _tempArray[i].xoparent + '"' else ''
+            _navCode += if `_tempArray[i].class != null` and `_tempArray[i].class != 'undefined'` and `_tempArray[i].class != undefined` then ' class="' + _tempArray[i].class + '"' else ''
+            _navCode += if `_tempArray[i].id != null` and `_tempArray[i].id != 'undefined'` and `_tempArray[i].id != undefined` then ' id="' + _tempArray[i].id + '"' else ''
+            _navCode += '><input type="text"'
+            _navCode += if `_tempArray[i].placeholder != null` and `_tempArray[i].placeholder != 'undefined'` and `_tempArray[i].placeholder != undefined` then ' placeholder="' + _tempArray[i].placeholder + '"' else ''
+            _navCode += '>'
+            _navCode += if `_tempArray[i].buttonLabel != null` and `_tempArray[i].buttonLabel != 'undefined'` and `_tempArray[i].buttonLabel != undefined` then '<input type="submit" value="' + _tempArray[i].buttonLabel + '">' else ''
+            _navCode += '</form>'
+          when 'dropdown'
+            _navCode += '
'
+            _navCode += '<button xo-type="' + _tempArray[i].xotype + '" xo-parent="' + _tempArray[i].xoparent + '" class="' + _tempArray[i].class + '">' + _tempArray[i].label + '</button>'
+            if `_tempArray[i].node != null` and `_tempArray[i].node != undefined` and `_tempArray[i].node != 'undefined'` and `_tempArray[i].node != ''`
+
+              ###
+               this creates a dropdown below the nav item
+               (usually a button) if the json has child
+               nodes. See the documentation for how this
+               is used
+              ###
+
+              _navCode += '
'
+              j = 0
+              jj = _tempArray[i].node.length
+              while j < jj
+                if `_tempArray[i].node[j].nodetype == 'line'`
+                  _navCode += '
' + _tempArray[i].node[j].nodecontent + '
'
+                else if `_tempArray[i].node[j].nodetype == 'seperator'`
+                  _navCode += '

'
+                j++
+            _navCode += '
'
+        i++
+      xj('[xo-object-name="' + target + '"]').append _navCode
+      return
+  return
+warningBar: (type, title, content, host) ->
+
+  ###
+   xo-type can be
+   success : green bar
+   attention : blue bar
+   alert : yellow bar
+   error : red bar
+  ###
+
+  _objectHTML = '
'
+  _objectHTML += if `title != null` and `title != undefined` then '
' + title + '
' else ''
+  _objectHTML += if `content != null` and `content != undefined` then '
' + content + '
' else ''
+  _objectHTML += '
'
+  if `host == 'body'` then xj(xo.config.domParentNode).prepend(_objectHTML) else xj('[xo-object-name="' + host + '"]').prepend(_objectHTML)
+  return
+poster: ->
+  _obj = xj('[xo-type="poster"]')
+  _objName = _obj.attr('xo-object-name')
+  _objParent = _obj.attr('xo-parent')
+  _objState = _obj.attr('xo-state')
+  _posterBackground = _obj.attr('xo-poster-source')
+  _posterSize = _obj.attr('xo-poster-size')
+  _posterProportion = _obj.attr('xo-type-param')
+  _posterText = _obj.find('[xo-type="poster-text"]')
+
+  ###
+   poster text can have 7 parameters
+   xo-type-param="font-size,color,text align,background color,box width,box height,padding"
+   font-size can be numeric or string (10 or 10px or 1em)
+   color can be hex or rgb (#000 or rgb(0,0,0,1) or rgba(0,0,0,1))
+   text align can be a string (center, left...)
+   background color can be hex or rgb (#000 or rgb(0,0,0) or rgba(0,0,0,0.7))
+   box width can be numeric or string (10 or 10px or 1em)
+   box height can be numeric or string (10 or 10px or 1em)
+   padding can be either a general value (i.e 0) or specific values (i.e. 0 10px 5ps 15px)
+   use the letter x to undefine an item (i.e. xo-type-param="x,x,center,500,x,10")
+  ###
+
+  if `_posterProportion == 'fullscreen'`
+    _posterWidth = '100%'
+    _posterHeight = '100%'
+  else
+    _posterWidth = _posterSize.split(',')[0]
+    _posterHeight = _posterSize.split(',')[1]
+  if _posterText.length > 0
+    xj(_posterText).each ->
+      _textParams = xj(this).attr('xo-type-param')
+      _textSize = if `_textParams.split(',')[0] != 'x'` then _textParams.split(',')[0] else null
+      _textColor = if `_textParams.split(',')[1] != 'x'` then _textParams.split(',')[1] else null
+      _textAlign = if `_textParams.split(',')[2] != 'x'` then _textParams.split(',')[2] else null
+      if _textParams.split(',')[3].indexOf('rgb') > -1
+        _textBoxColor = if `_textParams.split(',')[3] != 'x'` then _textParams.split(',')[3].replace(/-/g, ',') else null
+      _textBoxWidth = if `_textParams.split(',')[4] != 'x'` then _textParams.split(',')[4] else null
+      _textBoxHeight = if `_textParams.split(',')[5] != 'x'` then _textParams.split(',')[5] else null
+      _textBoxPadding = if `_textParams.split(',')[6] != 'x'` then _textParams.split(',')[6] else null
+      xj(this).css
+        'font-size': _textSize
+        'color': _textColor
+        'text-align': _textAlign
+        'background-color': _textBoxColor
+        'width': _textBoxWidth
+        'height': _textBoxHeight
+        'padding': _textBoxPadding
+        'margin': '0 auto'
+      return
+  if `_objParent != undefined`
+    _item = xj('[xo-object-name="' + _objName + '"]').detach()
+    xj(_objParent).prepend _item
+  _obj.css
+    'position': 'absolute'
+    'display': 'block'
+    'width': _posterWidth
+    'height': _posterHeight
+    'background-image': 'url(' + _posterBackground + ')'
+    'background-repeat': 'no-repeat'
+    'background-size': 'cover'
+  if `_objState == 'closed'` then _obj.attr('xo-state', 'open') else _obj.attr('xo-state', 'closed')
+  return
+navPanelBuilder: (mode) ->
+  if `mode == 'tabs'`
+    _tabObject = '[xo-type="tabs"]'
+    _tabObjectId = xj(_tabObject).attr('xo-object-name')
+    _tabObjectMode = xj(_tabObject).attr('xo-type-param')
+    _tabHeader = '
'
+
+    ###
+     it's probably not necessary to wrap the nodes in a header div.
+     This would make the code identical to the accordion builder
+     and could be switched out by a function parameter
+    ###
+
+    xj(_tabObject).find('[xo-type="node"]').each ->
+      _tabHeaderLabel = xj(this).attr('xo-header')
+      _tabHeaderParent = xj(this).attr('xo-object-name')
+      _tabDefaultState = xj(this).attr('xo-state')
+      _tabHeader += '<div xo-type="header-node" xo-type-param="'
+      _tabHeader += if `_tabDefaultState == 'open'` then 'active' else ''
+      _tabHeader += '" xo-parent="' + _tabHeaderParent + '">'
+      if `_tabObjectMode == 'text'`
+        _tabHeader += _tabHeaderLabel
+      else if `_tabObjectMode == 'icon'`
+        _tabHeader += ''
+      _tabHeader += '
'
+      return
+    _tabHeader += '
'
+    xj('[xo-object-name="' + _tabObjectId + '"]').prepend _tabHeader
+    xj('[xo-object-name="' + _tabObjectId + '"]').find('[xo-type="node"]').wrapAll '
'
+  else if `mode == 'accordion'`
+    _accObject = '[xo-type="accordion"]'
+    _accObjectId = xj(_accObject).attr('xo-object-name')
+    _accObjectMode = xj(_accObject).attr('xo-type-param')
+    xj(_accObject).find('[xo-type="node"]').each ->
+      _accHeaderLabel = xj(this).attr('xo-header')
+      _accHeaderParent = xj(this).attr('xo-object-name')
+      _accDefaultState = xj(this).attr('xo-state')
+      _accHeader = '<div xo-type="header-node" xo-type-param="'
+      _accHeader += if `_accDefaultState == 'open'` then 'active' else ''
+      _accHeader += '" xo-parent="' + _accHeaderParent + '">'
+      if `_accObjectMode == 'text'`
+        _accHeader += _accHeaderLabel
+      else if `_accObjectMode == 'icon'`
+        _accHeader += ''
+      _accHeader += '
'
+      xj(_accHeader).insertBefore this
+      return
+  return
+initMouseEvents: ->
+  mouseX = undefined
+  mouseY = undefined
+  xj('body').on('mouseover', '[xo-trigger="tooltip"]', (e) ->
+    mouseX = e.pageX
+    mouseY = e.pageY
+    xo.tooltip xj(this), 'add'
+    return
+  ).on('mouseout', '[xo-trigger="tooltip"]', ->
+    xo.tooltip null, 'delete'
+    return
+  ).on('click', '[xo-trigger="url"]', ->
+    _goToUrl = xj(this).attr('xo-trigger-url')
+    xo.trigger 'direct', _goToUrl, null
+    return
+  ).on('click', '[xo-trigger-close="modal"]', ->
+    xo.modal()
+
+    ###var _targetModal = xj(this).attr('xo-trigger-close-modal');
+     xo.trigger('kill-modal', _targetModal, null);
+    ###
+
+    return
+  ).on('click', '[xo-type="gutter-toggle"]', ->
+    a = xj(this).attr('xo-parent') or null
+    xo.gutter null, a
+    return
+  ).on('click', '[xo-trigger="gutter-toggle"]', ->
+    a = xj(this).attr('xo-parent') or null
+    xo.gutter null, a
+    return
+  ).on('click', '[xo-trigger="poster"]', ->
+    xo.poster()
+    return
+  ).on('click', '[xo-type="poster-toggle"]', ->
+    xo.poster()
+    return
+  ).on('click', '[xo-type="data-toggle"]', ->
+    xo.layoutToPage()
+    return
+  ).on('click', '[xo-trigger="data-toggle"]', ->
+    xo.layoutToPage()
+    return
+  ).on('click', '[xo-type="gutter-filter"]', ->
+    a = xj(this).attr('xo-parent') or null
+    xo.gutter null, a
+    return
+  ).on('click', '[xo-type="modal-toggle"]', ->
+    if `xj(this).attr('xo-data-template') != ''`
+      xo.modal null, xj(this).attr('xo-data-template')
+    return
+  ).on('click', '[xo-type="modal-filter"]', ->
+    xo.modal()
+    return
+  ).on('click', '[xo-type="dropdown-button"]', ->
+    _target = xj(this).attr('xo-parent')
+    _object = 'ul[xo-object-name="' + _target + '"]'
+    _clickedState = xj(_object).attr('xo-state')
+    _parentSize = xj(this).parent().width()
+    if `_clickedState == 'open'`
+      xj(_object).attr('xo-state', 'closed').parent().attr 'xo-state', 'closed'
+    else if `_clickedState == 'closed'`
+      xj(_object).attr('xo-state', 'open').css('width', _parentSize).parent().attr 'xo-state', 'open'
+    return
+  ).on('click', '[xo-type="warning"]', ->
+    xj(this).slideToggle 500
+    return
+  ).on('click', '[xo-type="tabs"] [xo-type="header-node"]', ->
+    _toggleTabContent = xj(this).attr('xo-parent')
+    xj('[xo-type="tabs"] [xo-type="node"]').attr 'xo-state', 'closed'
+    xj('[xo-type="tabs"] [xo-type="node"][xo-object-name="' + _toggleTabContent + '"]').attr 'xo-state', 'open'
+    xj('[xo-type="tabs"] [xo-type="header-node"]').attr 'xo-type-param', ''
+    xj(this).attr 'xo-type-param', 'active'
+    return
+  ).on 'click', '[xo-type="accordion"] [xo-type="header-node"]', ->
+    _toggleAccordionContent = xj(this).attr('xo-parent')
+    xj('[xo-type="accordion"] [xo-type="node"]').attr 'xo-state', 'closed'
+    xj('[xo-type="accordion"] [xo-type="node"][xo-object-name="' + _toggleAccordionContent + '"]').attr 'xo-state', 'open'
+    xj('[xo-type="accordion"] [xo-type="header-node"]').attr 'xo-type-param', ''
+    xj(this).attr 'xo-type-param', 'active'
+    return
+  return
+app = {}
+app.method = {}
+
+app::quit = ->


file structure changes

file structure changes

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


activity: refactored widget construction. all is well.

--- client/landing/app/Applications/Activity.kdapplication/widgets/widgetcontroller.coffee
+++ client/landing/app/Applications/Activity.kdapplication/widgets/widgetcontroller.coffee
@@ -13,7 +13,6 @@
     # __utils.wait 20000, -> submissionStopped = no

   loadView:(mainView)->
-
     activityController = @getSingleton('activityController')

     paneMap = [
@@ -30,18 +29,18 @@
         widgetName      : 'codeWidget'
         widgetType      : ActivityCodeSnippetWidget
       ,
-        name            : 'codeSharePane'
-        paneName        : 'codeshare'
-        constructorName : 'JCodeShare'
-        widgetName      : 'codeShareWidget'
-        widgetType      : ActivityCodeShareWidget
-      ,
-        name            : 'linkPane'
-        paneName        : 'link'
-        constructorName : 'JLink'
-        widgetName      : 'linkWidget'
-        widgetType      : ActivityLinkWidget
-      ,
+      #   name            : 'codeSharePane'
+      #   paneName        : 'codeshare'
+      #   constructorName : 'JCodeShare'
+      #   widgetName      : 'codeShareWidget'
+      #   widgetType      : ActivityCodeShareWidget
+      # ,
+      #   name            : 'linkPane'
+      #   paneName        : 'link'
+      #   constructorName : 'JLink'
+      #   widgetName      : 'linkWidget'
+      #   widgetType      : ActivityLinkWidget
+      # ,
         name            : 'tutorialPane'
         paneName        : 'tutorial'
         constructorName : 'JTutorial'
@@ -55,8 +54,9 @@
         widgetType      : ActivityDiscussionWidget
       ]

-    for pane in paneMap
-      self = @
+
+    widgetController = @
+    paneMap.forEach (pane)=>
       @[pane.name] = mainView.addWidgetPane
         paneName : pane.paneName
         mainContent : @[pane.widgetName] = new pane.widgetType
@@ -66,9 +66,9 @@
             if submissionStopped
               return notifySubmissionStopped()
             else
-              self.widgetSubmit formData, @getOptions().pane.constructorName, stopSubmission
+              widgetController.widgetSubmit formData, @getOptions().pane.constructorName, stopSubmission
               if @getOptions().pane.constructorName in ['JStatusUpdate']
-                self[@getOptions().pane.widgetName].switchToSmallView()
+                widgetController[@getOptions().pane.widgetName].switchToSmallView()
               mainView.resetWidgets()

     mainView.showPane "update"
@@ -113,7 +113,6 @@

   widgetSubmit:(data,constructorName,callback)->
-
     # if troll clear the tag input
     data.meta?.tags = [] if KD.checkFlag 'exempt'

@@ -127,7 +126,6 @@
         else
           new KDNotificationView type : "mini", title : err.message
     else
-
       @emitFakeData constructorName, data
       updateTimeout = @utils.wait 20000, =>
         @emit 'OwnActivityHasFailed', data


spelling: beginning

spelling: beginning

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


add selectize triggers

add selectize triggers

fixed before found, ‘coz that’s how I roll, baby!

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


report if fileInfo.dimensions() failed

report if fileInfo.dimensions() failed

--- app/assets/javascripts/uploadcare/files/base.js.coffee
+++ app/assets/javascripts/uploadcare/files/base.js.coffee
@@ -91,6 +91,9 @@
           @resolve
             width: img.width
             height: img.height
+
+        img.onerror = =>
+          @reject()

         img.src = url
       ).promise()


Set background color on Paper edit screen

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

--- app/assets/javascripts/views/paper_edit_view.js.coffee
+++ app/assets/javascripts/views/paper_edit_view.js.coffee
@@ -0,0 +1,8 @@
+ETahi.PaperEditView = Ember.View.extend
+  setBackgroundColor:(->
+    $('body').addClass('matte')
+  ).on('didInsertElement')
+
+  resetBackgroundColor:(->
+    $('body').removeClass('matte')
+  ).on('willDestroyElement')


Fix refresh of main screen on Android

Fix refresh of main screen on Android

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


Add missing Downloader.

Add missing Downloader.

error: pathspec 'application/chrome/content/wesabe/io/Downloader.coffee' did not match any file(s) known to git

--- application/chrome/content/wesabe/io/Downloader.coffee
+++ application/chrome/content/wesabe/io/Downloader.coffee
@@ -0,0 +1,50 @@
+{open} = require 'io/file'
+
+class Downloader
+  constructor: (@url, @file, @callback) ->
+    @_downloader = Cc["@mozilla.org/network/downloader;1"].createInstance()
+    @_ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService)
+
+    @_downloader.QueryInterface Ci.nsIDownloader
+    @_downloader.init this, @file
+
+  @::__defineGetter__ 'file', ->
+    @_file
+
+  @::__defineSetter__ 'file', (file) ->
+    if file.path?
+      @_file = file
+    else
+      @_file = open file
+
+  #
+  # Starts the download. This is the only public method for this class.
+  #
+  download: ->
+    @_httpChannel = ioService.newChannel @url, '', null
+    @_httpChannel.QueryInterface Ci.nsIHttpChannel
+    @_httpChannel.asyncOpen @_downloader, null
+
+  @download: (url, file, callback) ->
+    (new Downloader url, file, callback).download()
+
+  #
+  # nsIDownloader delegate callback function.
+  #
+  onDownloadComplete: (dl, req, ctxt, status, file) ->
+     try
+       match = @_httpChannel.getResponseHeader('Content-Disposition').match(/filename="([^"]+)"/i)
+       suggestedFilename = match?[1]
+     catch err
+       match = url.match(/.+\/([^\/\?]+)/)
+       suggestedFilename = match?[1]
+
+     wesabe.callback @callback, req.status is 0, [file, suggestedFilename]
+
+     delete @_httpChannel
+     delete @_downloader
+     delete @_ioService
+     delete @callback
+
+
+module.exports = Downloader


JStack: Basic stack to use with vms/domains stacks

error: pathspec 'workers/social/lib/social/models/stack.coffee' did not match any file(s) known to git

--- workers/social/lib/social/models/stack.coffee
+++ workers/social/lib/social/models/stack.coffee
@@ -0,0 +1,90 @@
+jraphical = require 'jraphical'
+module.exports = class JStack extends jraphical.Module
+
+  KodingError        = require '../error'
+
+  {secure, ObjectId, signature} = require 'bongo'
+  {Relationship}     = jraphical
+  {permit}           = require './group/permissionset'
+
+  @trait __dirname, '../traits/protected'
+
+  @share()
+
+  @set
+
+    softDelete        : yes
+
+    permissions       :
+      'create stacks' : ['member']
+      'update stacks' : ['member']
+      'get stacks'    : ['member']
+
+    sharedMethods     :
+      static          :
+        one           :
+          (signature Object, Function)
+        getStack      :
+          (signature Function)
+        getStacks     :
+          (signature Function)
+      instance        :
+        remove        :
+          (signature Function)
+        push          :
+          (signature Object, Function)
+
+    sharedEvents      :
+      static          : [ ]
+      instance        : [
+        { name : "RemovedFromCollection" }
+        { name : 'updateInstance' }
+      ]
+
+    schema            :
+      user            : String
+      group           : String
+      sid             : Number
+      meta            : Object
+
+  @getStacks = ({user, group}, callback)->
+
+    JStack.some {user, group}, {}, (err, stacks)->
+      return callback err  if err
+      callback null, stacks or []
+
+  @getStackId = (selector, callback)->
+    @getStack selector, (err, stack)->
+      callback err, stack?.getId()
+
+  @getStack = ({user, group, sid}, callback)->
+
+    sid ?= 0
+
+    JStack.one {user, group, sid}, (err, stack)->
+      return callback err  if err
+
+      if stack
+        console.log "Found stack, returning."
+        return callback null, stack
+
+      console.log "Stack not found, creating new one."
+
+      stack = new JStack {user, group, sid}
+      stack.save (err)->
+        if err then callback err
+        else callback null, stack
+
+  @getStack$ = permit 'get stacks',
+
+    success: (client, callback)->
+
+      {user, group} = client.context
+      @getStack {user, group}, callback
+
+  @getStacks$ = permit 'get stacks',
+
+    success: (client, callback)->
+
+      {user, group} = client.context
+      @getStacks {user, group}, callback


Add spec to validate invalid executable error message

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

--- spec/linter-helperexec-spec.coffee
+++ spec/linter-helperexec-spec.coffee
@@ -0,0 +1,21 @@
+#!/usr/bin/env coffee
+#
+# This spec file validates:
+#  * The atom-linter method used by linter-mypy.
+#    * Make sure that over time the behavior is as expected.
+#
+#  If it fails:
+#  * Validate everywhere in the code where the problematic method is used and validate that linter-mypy still works.
+
+{CompositeDisposable} = require 'atom'
+helpers = require 'atom-linter'
+
+describe "The Helpers `exec` method", ->
+  dummyExecName = "aNonExistingExecutable"
+  describe "When is launching a non-existing executable", ->
+    it 'returns the expected error message', ->
+      return helpers.exec(dummyExecName, [], {}).then ((outputStream) ->
+        #'This promise is not expected to be successful
+        expect(true).toBe(false)
+      ), (err) ->
+        expect(err.message).toBe 'Failed to spawn command `' + dummyExecName + '`. Make sure `' + dummyExecName + '` is installed and on your PATH'


Fixed the inactive window message for jpeg/video stream. (#2157)

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


build the listing in the background.

build the listing in the background.

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


Multi-file input value

Multi-file input value

--- app/assets/javascripts/uploadcare/widget/widget.js.coffee
+++ app/assets/javascripts/uploadcare/widget/widget.js.coffee
@@ -39,19 +39,20 @@
         if @ignoreChange
           @ignoreChange = false
           return
-        id = @element.val()
-        if id
-          @__setLoaded(new uploads.FileInfo(id))
+        ids = @element.val()
+        if ids
+          fis = (new uploads.FileInfo(id) for id in ids.split(','))
+          @__setLoaded(fis)
         else
           @__reset()

       __setLoaded: (uploadedFiles...) ->
-        uploadedFile = uploadedFiles[0] # FIXME Still needs multiple files
-        uploadedFile.info(@settings)
+        infos = (file.info(@settings) for file in uploadedFiles)
+        $.when(infos...)
           .fail(@__fail)
-          .done =>
-            @template.setFileInfo(uploadedFile.fileName, uploadedFile.fileSize)
-            @setValue(uploadedFile.fileId)
+          .done (infos...) =>
+            @template.setFileInfo(infos[0].fileName, infos[0].fileSize) # FIXME
+            @setValue((info.fileId for info in infos).join(','))
             @template.loaded()

       __fail: =>


Tweak offline page Q&A

Tweak offline page Q&A

--- assets/javascripts/templates/pages/offline_tmpl.coffee
+++ assets/javascripts/templates/pages/offline_tmpl.coffee
@@ -23,7 +23,7 @@

Questions & Answers

How does this work?
-
Each page is cached as a key-value pair in IndexedDB (downloaded from a single JSON file).

+
Each page is cached as a key-value pair in IndexedDB (downloaded from a single file).

         The app also uses AppCache and localStorage to cache the assets and index files.

Can I close the tab/browser?

#{canICloseTheTab()}
@@ -44,7 +44,7 @@
     """ Yes! Even offline, you can open a new tab, go to devdocs.io, and everything will work as if you were online (provided you installed all the documentations you want to use beforehand).

         Note that loading any page other than devdocs.io directly won't work (due to limitations in AppCache). """
   else
-    """ No. Because AppCache is unavailable in your browser (or has been disabled), loading devdocs.io offline won't work.

+    """ No. AppCache isn't available in your browser (or is disabled) so loading devdocs.io offline won't work.

         The current tab will continue to work, though (provided you installed all the documentations you want to use beforehand). """

 app.templates.offlineDoc = (doc, status) ->


Add the ComponentSet class.

Add the ComponentSet class.

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


Temp scoreboard changes.

Temp scoreboard changes.

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


Update configuration

Update configuration

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


Update configuration

Update configuration


Fix typo

Fix typo

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


Updated social icon status on check is_public


deduplicate mock resource bundle

deduplicate mock resource bundle

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


checkbox-fix

checkbox-fix

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


Remove extraneous log

Remove extraneous log

--- SingularityUI/app/utils.coffee
+++ SingularityUI/app/utils.coffee
@@ -234,7 +234,6 @@
         return false

     @fuzzyAdjustScore: (filter, fuzzyObject) ->
-        console.log(fuzzyObject)
         if fuzzyObject.original.id.toLowerCase().startsWith(filter.toLowerCase())
             fuzzyObject.score * 10
         else if fuzzyObject.original.id.toLowerCase().indexOf(filter.toLowerCase()) > -1


Client: Activity: Updated chatlistitem for edit message and delete message functionality

--- client/activity/lib/components/chatlistitem/index.coffee
+++ client/activity/lib/components/chatlistitem/index.coffee
@@ -7,9 +7,11 @@
 ProfileText          = require 'app/components/profile/profiletext'
 ProfileLinkContainer = require 'app/components/profile/profilelinkcontainer'
 ButtonWithMenu       = require 'app/components/buttonwithmenu'
+ActivityPromptModal  = require 'app/components/activitypromptmodal'
 ActivityLikeLink     = require 'activity/components/chatlistitem/activitylikelink'
 MessageTime          = require 'activity/components/chatlistitem/messagetime'
 keycode              = require 'keycode'
+ActivityFlux         = require 'activity/flux'

 module.exports = class ChatListItem extends React.Component

@@ -31,12 +33,34 @@

   getMenuItems: ->
     return [
-      {title: 'Edit Post',   key: 'editpost',  onClick: @bound 'editPost'}
-      {title: 'Delete Post', key: 'deletepost', onClick: @bound 'deletePost'}
-      {title: 'Mark User as Troll', key: 'markuser', onClick: @bound 'markUser'}
-      {title: 'Block User', key: 'blockuser', onClick: @bound 'blockUser'}
-      {title: 'impersonate User', key: 'impersonate', onClick: @bound 'impersonate'}
+      {title: 'Edit Post',          key: 'editpost',    onClick: @bound 'editPost'}
+      {title: 'Delete Post',        key: 'deletepost',  onClick: @bound 'deletePost'}
+      {title: 'Mark User as Troll', key: 'markuser',    onClick: @bound 'markUser'}
+      {title: 'Block User',         key: 'blockuser',   onClick: @bound 'blockUser'}
+      {title: 'impersonate User',   key: 'impersonate', onClick: @bound 'impersonate'}
     ]
+
+
+  getDeleteItemModalProps: ->
+    className          : 'activityDeleteItemModal'
+    title              : 'Delete post'
+    body               : 'Are you sure you want to delete this post?'
+    buttonYESText      : 'DELETE'
+    buttonNOText       : 'CANCEL'
+    buttonYESHandler   : @bound 'deletePostButtonHandler'
+    buttonNOHandler    : @bound 'closeDeletePostModal'
+    buttonCloseHandler : @bound 'closeDeletePostModal'
+
+
+  deletePostButtonHandler: ->
+
+    ActivityFlux.actions.message.removeMessage @props.message.get('id')
+    @closeDeletePostModal()
+
+
+  closeDeletePostModal: ->
+
+    @modalContainer.classList.add 'hidden'

   editPost: ->
@@ -46,7 +70,10 @@

   deletePost: ->

-    console.log "delete post clicked"
+    @modalContainer = document.getElementsByClassName("PublicChatPane-ModalContainer")[0]
+    @modalContainer.classList.remove 'hidden'
+    React.render <ActivityPromptModal {...@getDeleteItemModalProps()}/>, @modalContainer
+    @setState showMenuForMouseAction: no

   markUser: ->
@@ -66,7 +93,9 @@

   updateMessage: ->

-    console.log "update message"
+    @setState editMode: no
+    messageBody = @refs.EditMessageTextarea.getDOMNode().value
+    ActivityFlux.actions.message.editMessage @props.message.get('id'), messageBody

   cancelEdit: ->
@@ -80,7 +109,11 @@
     key  = keycode code

     @setState editMode: no if key is 'esc'
-    @setState editMode: no if key is 'enter'
+
+    if key is 'enter'
+
+      @setState editMode: no
+      ActivityFlux.actions.message.editMessage @props.message.get('id'), event.target.value

   render: ->
@@ -107,7 +140,7 @@
           </div>
         </div>
         <div className={editFormClass}>
-          <textarea onKeyDown = { @bound 'handleEditMessageKeyDown' } defaultValue={ message.get 'body' }></textarea>
+          <textarea onKeyDown = { @bound 'handleEditMessageKeyDown' } defaultValue={ message.get 'body' } ref="EditMessageTextarea"></textarea>
           <button className="solid green done-button" type="button" onClick={@bound 'updateMessage'} >DONE</button>
           <button className="cancel-editing" type="button" onClick={@bound 'cancelEdit'} >CANCEL</button>
         </div>


fixes a typo

fixes a typo


test for hacking potential and tests in controller to reject tracks that are valid, but not approved for this user

error: pathspec 'app/assets/javascripts/testing/test-locations-controller.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/testing/test-locations-controller.js.coffee
+++ app/assets/javascripts/testing/test-locations-controller.js.coffee
@@ -0,0 +1,5 @@
+root = exports ? this
+root.test_locations_controller_hack_hack_hack = ->
+  $('#location-form').find('select[name="track"]').append('<option value="badbogusvalue">BadBogusValue')
+  $('#freebusy-form').find('select[name="track"]').append('<option value="badbogusvalue">BadBogusValue')
+  true


Update patch properties

Update patch properties

Patch now has parameters for an envelope

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


Fix issue #1832

Fix issue #1832

--- app/views/play/menu/InventoryModal.coffee
+++ app/views/play/menu/InventoryModal.coffee
@@ -250,6 +250,7 @@

   onUnequippedItemClick: (e) ->
     return if @justDoubleClicked
+    return if @justClickedEquipItemButton
     itemEl = $(e.target).closest('.item')
     #@playSound 'menu-button-click'
     @selectUnequippedItem(itemEl)
@@ -270,6 +271,8 @@
     itemEl = $(e.target).closest('.item')
     @selectUnequippedItem(itemEl)
     @equipSelectedItem()
+    @justClickedEquipItemButton = true
+    _.defer => @justClickedEquipItemButton = false

   #- Select/equip higher-level, all encompassing methods the callbacks all use


Add mirage snippets

Add mirage snippets

error: pathspec 'snippets/mirage.cson' did not match any file(s) known to git

--- snippets/mirage.cson
+++ snippets/mirage.cson
@@ -0,0 +1,26 @@
+# ember-cli-mirage snippets
+
+'.source.js':
+  'Mirage factory: afterCreate':
+    'prefix': 'afterCreate'
+    'body': """
+      afterCreate(${1:model}, server) {
+        $2
+      },
+    """
+
+  'Mirage factory: trait':
+    'prefix': 'trait'
+    'body': """
+      $1: trait({
+        $2
+      }),
+    """
+
+  'Mirage server endpoint':
+    'prefix': 'server'
+    'body': """
+      server.${1:get}('${2:/}', (${3:schema, request}) => {
+        $4
+      });
+    """


atom: fix go base snippet

atom: fix go base snippet

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


mod.exp = f() snippet

mod.exp = f() snippet

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


fix save changes button

fix save changes button

--- packages/rocketchat-ui-admin/admin/admin.coffee
+++ packages/rocketchat-ui-admin/admin/admin.coffee
@@ -314,14 +314,6 @@
 			group: group
 			changed: true

-		if @section is ''
-			query.$or = [
-				{section: ''}
-				{section: {$exists: false}}
-			]
-		else
-			query.section = @section
-
 		settings = TempSettings.find(query, {fields: {_id: 1, value: 1, editor: 1}}).fetch()

 		if not _.isEmpty settings


adding multiline syntax for C#

adding multiline syntax for C#

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


Remove cmd+w for closing the tree view

Remove cmd+w for closing the tree view

--- lib/tree-view.coffee
+++ lib/tree-view.coffee
@@ -32,7 +32,6 @@
     @on 'mousedown', '.tree-view-resize-handle', (e) => @resizeStarted(e)
     @command 'core:move-up', => @moveUp()
     @command 'core:move-down', => @moveDown()
-    @command 'core:close', => @detach(); false
     @command 'tree-view:expand-directory', => @expandDirectory()
     @command 'tree-view:collapse-directory', => @collapseDirectory()
     @command 'tree-view:open-selected-entry', => @openSelectedEntry(true)


Fix regular expression

Fix regular expression

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


angular-route not necessary anymore

angular-route not necessary anymore

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


fixes #324

fixes #324

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


added test

added test

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

--- test/chickendance_test.coffee
+++ test/chickendance_test.coffee
@@ -0,0 +1,22 @@
+chai = require 'chai'
+sinon = require 'sinon'
+chai.use require 'sinon-chai'
+
+expect = chai.expect
+
+describe 'Business Cat:', ->
+  businesscat_module = require('../src/businesscat')
+
+  beforeEach ->
+    @robot =
+      respond: sinon.spy()
+      hear: sinon.spy()
+    @msg =
+      send: sinon.spy()
+      random: sinon.spy()
+    @businesscat_module = businesscat_module(@robot)
+
+  describe 'summon a business cat', ->
+
+    it 'registers a respond listener', ->
+      expect(@robot.respond).to.have.been.calledWith(/chicken dance/)


bug fix

bug fix

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


better logic for modifying RDS instances and waiting for it to compelte


added interpolate test

added interpolate test

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


watch系タスクを分割

watch系タスクを分割

error: pathspec 'gulp/tasks/watch.coffee' did not match any file(s) known to git

--- gulp/tasks/watch.coffee
+++ gulp/tasks/watch.coffee
@@ -0,0 +1,6 @@
+gulp   = require('gulp')
+config = require('../config')
+
+
+gulp.task 'watch', (callback) ->
+  gulp.watch('./src/**', ['develop'])


Simplified logic for tooltip

Simplified logic for tooltip

Instead of trying to prevent tooltip from showing during touch events, just automatically hide it after a second.

--- resources/assets/coffee/forum-posts-seek.coffee
+++ resources/assets/coffee/forum-posts-seek.coffee
@@ -23,28 +23,15 @@

   constructor: (forum) ->
     @forum = forum
-    $(document).on 'touchstart', '.js-forum__posts-seek', @onTouchstart
-    $(document).on 'mouseenter', '.js-forum__posts-seek', @enter
-    $(document).on 'mouseleave', '.js-forum__posts-seek', @leave
     $(document).on 'mousemove', '.js-forum__posts-seek', @move
+    $(document).on 'mouseleave', '.js-forum__posts-seek', @hideTooltip
     $(document).on 'click', '.js-forum__posts-seek', @click

     $(document).on 'click', '.js-forum-posts-seek--jump', @jump

-  enter: (e) =>
-    return if @tooltip[0]._visible
-
-    @move(e)
-    fade.in @tooltip[0]
-
-
-  leave: (e) =>
-    return unless @tooltip[0]._visible
-
-    @tooltip[0]._visible = false
+  hideTooltip: =>
     fade.out @tooltip[0]
-

   move: (e) =>
     e.preventDefault()
@@ -52,9 +39,15 @@

     @setPostPosition(e.offsetX)

+    fade.in @tooltip[0]
+
+    clearTimeout @_autohide
+    @_autohide = setTimeout @hideTooltip, 1000
+

   click: =>
     @forum.jumpTo @postPosition
+

   jump: (e) =>
     e.preventDefault()
@@ -74,14 +67,6 @@
     @forum.jumpTo n

-  onTouchstart: (e) =>
-    e.preventDefault()
-    e.stopPropagation()
-
-    @setPostPosition e.originalEvent.layerX
-    setTimeout @click, 10
-
-
   setPostPosition: (x) =>
     seekbarPos = @seekbar[0].getBoundingClientRect()


add classdata.coffee

add classdata.coffee

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

--- src/classdata.coffee
+++ src/classdata.coffee
@@ -0,0 +1,159 @@
+Skills = require './skills'
+
+
+class WeaponMastery
+  # 武器全般のマスタリ
+
+class DaggerMastery
+class SwordMastery
+class AxeMastery
+class LanceMastery
+
+class TwoHandedMastery
+  # 武器攻撃力が増加
+  # 武器命中率上昇
+
+class DualWeaponMastery
+  # 両手で命中率が落ちない
+  # 攻撃速度上昇
+
+class MagicMastery
+  # 魔法全般のマスタリ
+  # とくに魔法属性に強く依存
+
+class FireMastery
+class IceMastery
+class ThunderMastery
+
+class ChainLightning
+  # 雷属性 Lord
+  # 高回転+ 長射程 + 低攻撃力
+  # Lv5 麻痺延長 or 回避低下
+  # Lv10 麻痺延長 or 爆発
+
+class HolySanctuary
+  # マップスキル
+  # 味方ダメージ上昇 + 敵に聖属性経過ダメージ
+
+class ManaSwap
+  # Lord
+  # スイッチ
+  # HPダメージをMPに変換
+  # Lv5 被ダメージ時HPカウンター or MPカウンター
+  # Lv10 低減 or
+
+class ShockSwap
+  # Warrior専用 スイッチ: 永続
+  # 打撃ダメージをMagic属性に変換
+  # Lv1(0.9,0.1) ... Lv10(0,1.0) Lv15(0,1.5)
+
+class Survive
+  # HP増加
+  # バッドコンディション抵抗
+
+class MagicBoost
+  # Lord
+  # 武器の魔法効果をブースト
+
+class Vampire
+  # Rogue
+  # 武器の吸収効果をブースト
+  # lv5 rate上昇 or 素ダメージ上昇
+  # lv10 HP吸収->MP変換 or 逆
+
+class ShadowServant
+  # 分身を創りだす 範囲攻撃に巻き込まれると死ぬ
+  # ターゲット共有
+  # DarkMastery で攻撃力+HP上昇
+
+ClassData =
+  Lord :
+    str : 11
+    int : 9
+    dex : 10
+    skills:
+      WeaponMastery: 0
+      LanceMastery: 0
+
+      ArmorMastery : 0
+      HolyMastery  : 0
+
+      ThunderMastery  : 0
+      Lightning: 0
+
+  Warrior :
+    str : 14
+    int : 6
+    dex : 9
+    skills:
+      WeaponMastery: 1
+      SwordMastery : 0
+      LanceMastery : 0
+      ArmorMastery : 0
+
+      EarthWave : 0
+      Berserk : 0
+      EnvokeElement : 0
+
+  Rogue :
+    str : 8
+    int : 7
+    dex : 14
+    skills:
+      DaggerMastery: 0
+      PoizonMastery: 0
+      Tricky: 0
+
+  Sorcerer :
+    str : 5
+    int : 15
+    dex : 9
+    skills:
+      FireMastery   : 0
+      FireArrow : 0
+      Meteor : 0
+
+      IceMastery    : 0
+      ThunderMastery: 0
+      Lightning: 0
+
+      PoizonMastery : 0
+      MagicMastery  : 0
+
+class JobClass
+class Lord extends JobClass
+  constructor:->
+    @str = 10
+    @int = 10
+    @dex = 10
+
+  toData:->
+    str:@str
+    int:@int
+    dex:@dex
+
+class Rogue extends JobClass
+  constructor:->
+    @str = 7
+    @int = 9
+    @dex = 14
+
+  toData:->
+    str:@str
+    int:@int
+    dex:@dex
+
+RacialData =
+  human :
+    str : 0
+    int : 0
+    dex : 0
+
+  human :
+    str : 0
+    int : 0
+    dex : 0
+
+
+
+exports.ClassData = ClassData


Update MainPlayView.coffee

Update MainPlayView.coffee

--- app/views/play/MainPlayView.coffee
+++ app/views/play/MainPlayView.coffee
@@ -319,6 +319,13 @@
     image: '/file/db/level/526711d9add4f8965f000002/hunter_triplets_icon.png'
     description: 'There is a horde of ogres marching on your village.  Stay out of reach and use your bow to take them out! - by Danny Whittaker'
   }
+  {
+    name: "IFC - Videira"
+    difficulty: 3
+    id: 'ifc-videira'
+    image: ''
+    description: 'Nível inspirado em IFC - Videira.'
+  }
 ]

 campaigns = [


bug fixes

bug fixes


bug fix

bug fix


Simplify installed view

Simplify installed view

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


Guard against null repo

Guard against null repo

--- src/file-view.coffee
+++ src/file-view.coffee
@@ -31,11 +31,14 @@
   updateStatus: ->
     path = @getPath()
     @removeClass('ignored modified new')
-    if @project.repo.isPathIgnored(path)
+    repo = @project.repo
+    return unless repo?
+
+    if repo.isPathIgnored(path)
       @addClass('ignored')
-    else if @project.repo.isPathModified(path)
+    else if repo.isPathModified(path)
       @addClass('modified')
-    else if @project.repo.isPathNew(path)
+    else if repo.isPathNew(path)
       @addClass('new')

   getPath: ->


email notification: add signature annotations

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


JVerificationToken: store simple pin in DB no need for another security layer

Since all the emails are in plain format in the DB we no longer need to store verification tokens hashed. This provides us to be able to send same verification token if needed. This change also includes that ability by passing resendIfExists option as true.


add jasmine test for scroll to top

add jasmine test for scroll to top

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


Fix duplicate rules for std type variants

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


temporarily remove SR on capa alerts to fix problem submissions (LMS-2474)


data cache

data cache

error: pathspec 'src/javascripts/factories/data_cache.coffee' did not match any file(s) known to git


Add spec for PathWatcher.closeAllWatchers()

--- spec/pathwatcher-spec.coffee
+++ spec/pathwatcher-spec.coffee
@@ -2,6 +2,9 @@
 fs = require 'fs'

 describe "PathWatcher", ->
+  afterEach ->
+    pathWatcher.closeAllWatchers()
+
   describe ".getWatchedPaths()", ->
     it "returns an array of all watched paths", ->
       fs.writeFileSync('/tmp/watch.txt', '')
@@ -15,3 +18,13 @@
       expect(pathWatcher.getWatchedPaths()).toEqual ['/tmp/watch.txt']
       watcher2.close()
       expect(pathWatcher.getWatchedPaths()).toEqual []
+
+  describe ".closeAllWatchers()", ->
+    it "closes all watched paths", ->
+      fs.writeFileSync('/tmp/watch.txt', '')
+
+      expect(pathWatcher.getWatchedPaths()).toEqual []
+      watcher = pathWatcher.watch '/tmp/watch.txt', ->
+      expect(pathWatcher.getWatchedPaths()).toEqual ['/tmp/watch.txt']
+      pathWatcher.closeAllWatchers()
+      expect(pathWatcher.getWatchedPaths()).toEqual []


padding element heights setting fix

padding element heights setting fix

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


Also copy JS files individually

Also copy JS files individually

--- config.coffee
+++ config.coffee
@@ -277,7 +277,7 @@
     if stat.isDirectory()
       dirStack.push(fullPath)
     else
-      if _.str.endsWith(file, '.coffee')
+      if _.str.endsWith(file, '.coffee') or _.str.endsWith(file, '.js')
         coffeeFiles.push(fullPath)
       else if _.str.endsWith(file, '.jade')
         jadeFiles.push(fullPath)


Use '$' prefix convention to indicate jquery object variables

--- app/assets/javascripts/backbone/helpers/channels.js.coffee
+++ app/assets/javascripts/backbone/helpers/channels.js.coffee
@@ -89,14 +89,14 @@
   @createChannelArea: (channel)->
     channelArea = "#channels-#{channel.get('id')}"
     totalTabs = $("#kandan").tabs("length")
-    createTab = $("#create_channel").parents("li").detach()
+    $createTab = $("#create_channel").parents("li").detach()
     $("#kandan").tabs("add", channelArea, "#{channel.get("name")}", totalTabs)
-    createTab.appendTo("ul.ui-tabs-nav")
+    $createTab.appendTo("ul.ui-tabs-nav")
     $('#ui-tabs-1').remove()
     view = new Kandan.Views.ChannelPane({channel: channel})
-    newChannel = $(channelArea)
-    view.render newChannel
-    newChannel.addClass('ui-tabs-panel')
+    $newChannel = $(channelArea)
+    view.render $newChannel
+    $newChannel.addClass('ui-tabs-panel')

   @newActivityView: (activityAttributes)->
     activity = new Kandan.Models.Activity(activityAttributes)


Change js around

Change js around


Updates to atom config

Updates to atom config

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


nicer formating for deployment announcements