From 776192a45b4d280fa3a6ab7c3322bbc20b305602 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Wed, 16 May 2018 00:52:17 -0400 Subject: [PATCH 01/68] React Sidebar --- .babelrc | 3 + package.json | 7 + src/client/Components/Button/index.jsx | 17 + src/client/Components/Nav/NavButton/index.jsx | 57 ++ .../Components/Nav/NavSeperator/index.jsx | 12 + src/client/Components/Nav/Sidebar/index.jsx | 67 ++ src/client/Components/Nav/Submenu/index.jsx | 73 ++ .../Components/Nav/SubmenuItem/index.jsx | 30 + src/client/app.jsx | 9 + src/public/js/app.js | 5 + src/public/js/modules/ajaxify.js | 1 - src/public/js/modules/helpers.js | 8 +- src/public/js/pages/pageloader.js | 4 +- .../js/vendor/uikit/js/uikit_combined.min.js | 8 +- src/views/layout/main.hbs | 8 +- src/views/partials/nav.hbs | 287 +++---- webpack.config.dist.js | 8 +- webpack.config.js | 5 +- yarn.lock | 736 +++++++++++++++++- 19 files changed, 1173 insertions(+), 172 deletions(-) create mode 100644 .babelrc create mode 100644 src/client/Components/Button/index.jsx create mode 100644 src/client/Components/Nav/NavButton/index.jsx create mode 100644 src/client/Components/Nav/NavSeperator/index.jsx create mode 100644 src/client/Components/Nav/Sidebar/index.jsx create mode 100644 src/client/Components/Nav/Submenu/index.jsx create mode 100644 src/client/Components/Nav/SubmenuItem/index.jsx create mode 100644 src/client/app.jsx diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..68e7f1a6a --- /dev/null +++ b/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["react", "env"] +} \ No newline at end of file diff --git a/package.json b/package.json index cae643fb1..3370fe671 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,9 @@ "passport.socketio": "3.7.0", "pm2": "2.10.0", "prompt": "1.0.0", + "prop-types": "15.6.1", + "react": "16.3.2", + "react-dom": "16.3.2", "redis": "2.8.0", "request": "2.83.0", "rimraf": "2.6.2", @@ -94,6 +97,10 @@ "winston": "2.4.0" }, "devDependencies": { + "babel-core": "6.26.3", + "babel-loader": "7.1.4", + "babel-preset-env": "1.6.1", + "babel-preset-react": "6.24.1", "chai": "*", "codacy-coverage": "^2.0.3", "cross-env": "^5.1.3", diff --git a/src/client/Components/Button/index.jsx b/src/client/Components/Button/index.jsx new file mode 100644 index 000000000..d35be8f78 --- /dev/null +++ b/src/client/Components/Button/index.jsx @@ -0,0 +1,17 @@ +import isUndefined from 'lodash/isUndefined'; +import React from 'react'; + +class Button extends React.Component { + constructor(props) { + super(props); + this.text = (isUndefined(props.text)) ? 'Button' : props.text; + } + + render() { + return ( + + ) + } +} + +export default Button; \ No newline at end of file diff --git a/src/client/Components/Nav/NavButton/index.jsx b/src/client/Components/Nav/NavButton/index.jsx new file mode 100644 index 000000000..042d96bfe --- /dev/null +++ b/src/client/Components/Nav/NavButton/index.jsx @@ -0,0 +1,57 @@ +import isUndefined from 'lodash/isUndefined'; +import React from 'react'; +import PropTypes from 'prop-types'; + +import Helpers from 'modules/helpers' + +class NavButton extends React.Component { + constructor(props) { + super(props); + } + + componentDidUpdate() { + Helpers.UI.bindAccordion(); + } + + renderAnchorLink() { + return ( + + {this.props.icon} + {this.props.text} + + ) + } + + render() { + if (this.props.hasSubmenu) { + return ( +
  • + + {this.renderAnchorLink()} + {this.props.children} +
  • + ) + } else { + return ( +
  • + {this.renderAnchorLink()} + {this.props.children} +
  • + ) + } + } +} + +NavButton.propTypes = { + href: PropTypes.string.isRequired, + icon: PropTypes.string.isRequired, + text: PropTypes.string.isRequired, + class: PropTypes.string, + hasSubmenu: PropTypes.bool, + subMenuTarget: PropTypes.string +}; + +export default NavButton; \ No newline at end of file diff --git a/src/client/Components/Nav/NavSeperator/index.jsx b/src/client/Components/Nav/NavSeperator/index.jsx new file mode 100644 index 000000000..a5cab7486 --- /dev/null +++ b/src/client/Components/Nav/NavSeperator/index.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +class NavSeperator extends React.Component { + render() { + return ( +
    + ) + } +} + +export default NavSeperator; \ No newline at end of file diff --git a/src/client/Components/Nav/Sidebar/index.jsx b/src/client/Components/Nav/Sidebar/index.jsx new file mode 100644 index 000000000..44ffd8a8d --- /dev/null +++ b/src/client/Components/Nav/Sidebar/index.jsx @@ -0,0 +1,67 @@ +import React from 'react'; +import NavButton from "../NavButton/index.jsx"; +import NavSeperator from '../NavSeperator/index.jsx'; +import Submenu from '../Submenu/index.jsx'; +import SubmenuItem from '../SubmenuItem/index.jsx'; + +import Permissions from '../../../../permissions/index.js'; + +class Sidebar extends React.Component { + constructor(props) { + super(props); + this.state = { + activeItem: '', + activeSubItem: '', + sessionUser: null + }; + } + + componentWillMount() { + global.react.updateSidebar = (data) => { + this.setState(data); + }; + } + + render() { + return ( + + ) + } +} + +export default Sidebar; \ No newline at end of file diff --git a/src/client/Components/Nav/Submenu/index.jsx b/src/client/Components/Nav/Submenu/index.jsx new file mode 100644 index 000000000..0d8119f67 --- /dev/null +++ b/src/client/Components/Nav/Submenu/index.jsx @@ -0,0 +1,73 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import IsArray from 'lodash/isArray'; +import $ from 'jquery'; + +import Helpers from 'modules/helpers'; + +class Submenu extends React.Component { + componentDidMount() { + this.buildFloatingMenu(this.props.id); + } + + componentDidUpdate() { + this.buildFloatingMenu(this.props.id); + } + + shouldComponentUpdate(nextProps) { + if (this.props.children !== nextProps.children) { + return true; + } else { + return false; + } + } + + buildFloatingMenu(navId) { + if (this.props.children) { + var $sideBarToRight = $('.sidebar-to-right'); + $sideBarToRight.find('#side-nav-sub-' + navId).remove(); + var ul = $(''); + var li = null; + if (!IsArray(this.props.children)) { + if (this.props.children.type.name === 'NavSeperator') + return; + + li = $('
  • ' + this.props.children.props.text +'
  • '); + ul.append(li); + } else { + var children = []; + for (var i = 0; i < this.props.children.length; i++) { + if (!this.props.children[i]) + continue; + if (this.props.children[i].type.name === 'NavSeperator') + ul.append('
    '); + else { + if (this.props.children[i].props.hasSeperator) + ul.append('
    '); + li = $('
  • ' + this.props.children[i].props.text + '
  • '); + ul.append(li); + } + } + } + + $sideBarToRight.append(ul); + + Helpers.UI.setupSidebarTether() + //Ajaxify new floating menu links + $('body').ajaxify(); + } + } + + render() { + return ( +
    + +
    + ) + } +} + +export default Submenu; \ No newline at end of file diff --git a/src/client/Components/Nav/SubmenuItem/index.jsx b/src/client/Components/Nav/SubmenuItem/index.jsx new file mode 100644 index 000000000..31d79ef00 --- /dev/null +++ b/src/client/Components/Nav/SubmenuItem/index.jsx @@ -0,0 +1,30 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +class SubmenuItem extends React.Component { + render() { + return ( +
    + {this.props.hasSeperator && +
    + } +
  • + + {this.props.icon} + {this.props.text} + +
  • +
    + ) + } +} + +SubmenuItem.proptypes = { + href: PropTypes.string.isRequired, + text: PropTypes.string.isRequired, + icon: PropTypes.string.isRequired, + hasSeperator: PropTypes.bool, + active: PropTypes.bool +}; + +export default SubmenuItem; \ No newline at end of file diff --git a/src/client/app.jsx b/src/client/app.jsx new file mode 100644 index 000000000..4557bbf3c --- /dev/null +++ b/src/client/app.jsx @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; + +import Sidebar from './Components/Nav/Sidebar/index.jsx'; + +ReactDOM.render( + , + document.getElementById('side-nav') +); \ No newline at end of file diff --git a/src/public/js/app.js b/src/public/js/app.js index c4e792a3c..41c6d0beb 100644 --- a/src/public/js/app.js +++ b/src/public/js/app.js @@ -15,6 +15,8 @@ //Load SASS (Webpack) require('../../sass/app.sass'); +global.react = {}; // Global react var for calling state outside react. + require(['jquery', 'modules/helpers', 'angular', 'sessionLoader'], function($, helpers, angular) { helpers.init(); @@ -51,6 +53,9 @@ require(['jquery', 'modules/helpers', 'angular', 'sessionLoader'], function($, h ], function(_, nav, socket) { //Page loading (init) require(['pages/pageloader'], function(pl) { + //React + require('../../client/app.jsx'); + pl.init(function() { nav.init(); diff --git a/src/public/js/modules/ajaxify.js b/src/public/js/modules/ajaxify.js index bdc83315e..75c8a45e1 100644 --- a/src/public/js/modules/ajaxify.js +++ b/src/public/js/modules/ajaxify.js @@ -42,7 +42,6 @@ define('modules/ajaxify', [ helpers.init(true); helpers.hideAllUiKitDropdowns(); - // helpers.UI.setNavItem($('#__sidebar_route').text().toLowerCase()); nav.init(); diff --git a/src/public/js/modules/helpers.js b/src/public/js/modules/helpers.js index 2cc0ed99c..cda1eb241 100644 --- a/src/public/js/modules/helpers.js +++ b/src/public/js/modules/helpers.js @@ -112,9 +112,11 @@ function($, _, moment, UIkit, CountUp, Waves, Selectize, Snackbar, ROLES, Cookie helpers.UI.bindAccordion = function() { $('li[data-nav-accordion]').each(function() { + //Remove hasSubMenuOpen from LI and subMenuOpen from submenu UL to prevent menu from staying open after page load + var subMenu = $(this).find('#' + $(this).attr('data-nav-accordion-target')); + if (subMenu.length > 0) subMenu.removeClass('subMenuOpen'); if ($(this).hasClass('active') && $(this).parents('.sidebar').hasClass('expand')) { $(this).addClass('hasSubMenuOpen'); - var subMenu = $(this).find('#' + $(this).attr('data-nav-accordion-target')); if (subMenu.length > 0) subMenu.addClass('subMenuOpen'); } var $this = $(this).find('> a'); @@ -163,7 +165,7 @@ function($, _, moment, UIkit, CountUp, Waves, Selectize, Snackbar, ROLES, Cookie if ($sidebar.hasClass('expand')) { $('.sidebar').find('.tether-element.tether-enabled').hide(); $sidebar.find('li[data-nav-accordion-target].active').addClass('hasSubMenuOpen'); - $sidebar.find('li[data-nav-accordion-target].active > ul').addClass('subMenuOpen'); + $sidebar.find('li[data-nav-accordion-target].active ul.side-nav-accordion').addClass('subMenuOpen'); } else { setTimeout(function() { Tether.position(); $('.sidebar').find('.tether-element.tether-enabled').show();}, 500); $sidebar.find('li[data-nav-accordion-target]').removeClass('hasSubMenuOpen'); @@ -207,9 +209,9 @@ function($, _, moment, UIkit, CountUp, Waves, Selectize, Snackbar, ROLES, Cookie ]; _.each(sidebarElements, function(item) { + var sidebar = $('.sidebar'); var element = $('.sidebar-to-right').find(item.element); if (element.length < 1) return; - var sidebar = $('.sidebar'); var target = sidebar.find('li[data-nav-id="' + item.target + '"]'); if (target.length < 1) return; helpers.UI.sidebarTether(element, target); diff --git a/src/public/js/pages/pageloader.js b/src/public/js/pages/pageloader.js index b2deec193..3513a06ad 100644 --- a/src/public/js/pages/pageloader.js +++ b/src/public/js/pages/pageloader.js @@ -15,10 +15,10 @@ **/ -define('pages/pageloader', ['async'], function(async) { +define('pages/pageloader', ['async', 'jquery'], function(async, $) { var pageLoader = {}; - pageLoader.init = function(callback) { + global.react.updateSidebar({activeItem: $('#__sidebar_route').text(), activeSubItem: $('#__sidebar_sub_route').text(), sessionUser: window.trudeskSessionService.getUser()}); require([ 'pages/dashboard', 'pages/messages', diff --git a/src/public/js/vendor/uikit/js/uikit_combined.min.js b/src/public/js/vendor/uikit/js/uikit_combined.min.js index af8c133ec..f612c322d 100644 --- a/src/public/js/vendor/uikit/js/uikit_combined.min.js +++ b/src/public/js/vendor/uikit/js/uikit_combined.min.js @@ -1,7 +1 @@ -!function(core){if("function"==typeof define&&define.amd&&define("uikit",function(){var uikit=window.UIkit||core(window,window.jQuery,window.document);return uikit.load=function(res,req,onload,config){var i,resources=res.split(","),load=[],base=(config.config&&config.config.uikit&&config.config.uikit.base?config.config.uikit.base:"").replace(/\/+$/g,"");if(!base)throw new Error("Please define base path to UIkit in the requirejs config.");for(i=0;i0||global.navigator.pointerEnabled&&global.navigator.maxTouchPoints>0||!1,UI.support.mutationobserver=global.MutationObserver||global.WebKitMutationObserver||null,UI.Utils={},UI.Utils.isFullscreen=function(){return document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.fullscreenElement||!1},UI.Utils.str2json=function(str,notevil){try{return notevil?JSON.parse(str.replace(/([\$\w]+)\s*:/g,function(_,$1){return'"'+$1+'":'}).replace(/'([^']+)'/g,function(_,$1){return'"'+$1+'"'})):new Function("","var json = "+str+"; return JSON.parse(JSON.stringify(json));")()}catch(e){return!1}},UI.Utils.debounce=function(func,wait,immediate){var timeout;return function(){var context=this,args=arguments,later=function(){timeout=null,immediate||func.apply(context,args)},callNow=immediate&&!timeout;clearTimeout(timeout),timeout=setTimeout(later,wait),callNow&&func.apply(context,args)}},UI.Utils.removeCssRules=function(selectorRegEx){var idx,idxs,stylesheet,_i,_j,_k,_len,_len1,_len2,_ref;selectorRegEx&&setTimeout(function(){try{for(_ref=document.styleSheets,_i=0,_len=_ref.length;_i<_len;_i++){for(stylesheet=_ref[_i],idxs=[],stylesheet.cssRules=stylesheet.cssRules,idx=_j=0,_len1=stylesheet.cssRules.length;_j<_len1;idx=++_j)stylesheet.cssRules[idx].type===CSSRule.STYLE_RULE&&selectorRegEx.test(stylesheet.cssRules[idx].selectorText)&&idxs.unshift(idx);for(_k=0,_len2=idxs.length;_k<_len2;_k++)stylesheet.deleteRule(idxs[_k])}}catch(_error){}},0)},UI.Utils.isInView=function(element,options){var $element=$(element);if(!$element.is(":visible"))return!1;var window_left=UI.$win.scrollLeft(),window_top=UI.$win.scrollTop(),offset=$element.offset(),left=offset.left,top=offset.top;return options=$.extend({topoffset:0,leftoffset:0},options),top+$element.height()>=window_top&&top-options.topoffset<=window_top+UI.$win.height()&&left+$element.width()>=window_left&&left-options.leftoffset<=window_left+UI.$win.width()},UI.Utils.checkDisplay=function(context,initanimation){var elements=UI.$("[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]",context||document);return context&&!elements.length&&(elements=$(context)),elements.trigger("display.uk.check"),initanimation&&("string"!=typeof initanimation&&(initanimation='[class*="uk-animation-"]'),elements.find(initanimation).each(function(){var ele=UI.$(this),cls=ele.attr("class"),anim=cls.match(/uk\-animation\-(.+)/);ele.removeClass(anim[0]).width(),ele.addClass(anim[0])})),elements},UI.Utils.options=function(string){if("string"!=$.type(string))return string;string.indexOf(":")!=-1&&"}"!=string.trim().substr(-1)&&(string="{"+string+"}");var start=string?string.indexOf("{"):-1,options={};if(start!=-1)try{options=UI.Utils.str2json(string.substr(start))}catch(e){}return options},UI.Utils.animate=function(element,cls){var d=$.Deferred();return element=UI.$(element),element.css("display","none").addClass(cls).one(UI.support.animation.end,function(){element.removeClass(cls),d.resolve()}),element.css("display",""),d.promise()},UI.Utils.uid=function(prefix){return(prefix||"id")+(new Date).getTime()+"RAND"+Math.ceil(1e5*Math.random())},UI.Utils.template=function(str,data){for(var toc,cmd,prop,fn,tokens=str.replace(/\n/g,"\\n").replace(/\{\{\{\s*(.+?)\s*\}\}\}/g,"{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g),i=0,output=[],openblocks=0;i/g, '>');}"].join("\n")),data?fn(data):fn},UI.Utils.events={},UI.Utils.events.click=UI.support.touch?"tap":"click",global.UIkit=UI,UI.fn=function(command,options){var args=arguments,cmd=command.match(/^([a-z\-]+)(?:\.([a-z]+))?/i),component=cmd[1],method=cmd[2];return UI[component]?this.each(function(){var $this=$(this),data=$this.data(component);data||$this.data(component,data=UI[component](this,method?void 0:options)),method&&data[method].apply(data,Array.prototype.slice.call(args,1))}):($.error("UIkit component ["+component+"] does not exist."),this)},$.UIkit=UI,$.fn.uk=UI.fn,UI.langdirection="rtl"==UI.$html.attr("dir")?"right":"left",UI.components={},UI.component=function(name,def){var fn=function(element,options){var $this=this;return this.UIkit=UI,this.element=element?UI.$(element):null,this.options=$.extend(!0,{},this.defaults,options),this.plugins={},this.element&&this.element.data(name,this),this.init(),(this.options.plugins.length?this.options.plugins:Object.keys(fn.plugins)).forEach(function(plugin){fn.plugins[plugin].init&&(fn.plugins[plugin].init($this),$this.plugins[plugin]=!0)}),this.trigger("init.uk.component",[name,this]),this};return fn.plugins={},$.extend(!0,fn.prototype,{defaults:{plugins:[]},boot:function(){},init:function(){},on:function(a1,a2,a3){return UI.$(this.element||this).on(a1,a2,a3)},one:function(a1,a2,a3){return UI.$(this.element||this).one(a1,a2,a3)},off:function(evt){return UI.$(this.element||this).off(evt)},trigger:function(evt,params){return UI.$(this.element||this).trigger(evt,params)},find:function(selector){return UI.$(this.element?this.element:[]).find(selector)},proxy:function(obj,methods){var $this=this;methods.split(" ").forEach(function(method){$this[method]||($this[method]=function(){return obj[method].apply(obj,arguments)})})},mixin:function(obj,methods){var $this=this;methods.split(" ").forEach(function(method){$this[method]||($this[method]=obj[method].bind($this))})},option:function(){return 1==arguments.length?this.options[arguments[0]]||void 0:void(2==arguments.length&&(this.options[arguments[0]]=arguments[1]))}},def),this.components[name]=fn,this[name]=function(){var element,options;if(arguments.length)switch(arguments.length){case 1:"string"==typeof arguments[0]||arguments[0].nodeType||arguments[0]instanceof jQuery?element=$(arguments[0]):options=arguments[0];break;case 2:element=$(arguments[0]),options=arguments[1]}return element&&element.data(name)?element.data(name):new UI.components[name](element,options)},UI.domready&&UI.component.boot(name),fn},UI.plugin=function(component,name,def){this.components[component].plugins[name]=def},UI.component.boot=function(name){UI.components[name].prototype&&UI.components[name].prototype.boot&&!UI.components[name].booted&&(UI.components[name].prototype.boot.apply(UI,[]),UI.components[name].booted=!0)},UI.component.bootComponents=function(){for(var component in UI.components)UI.component.boot(component)},UI.domObservers=[],UI.domready=!1,UI.ready=function(fn){UI.domObservers.push(fn),UI.domready&&fn(document)},UI.on=function(a1,a2,a3){return a1&&a1.indexOf("ready.uk.dom")>-1&&UI.domready&&a2.apply(UI.$doc),UI.$doc.on(a1,a2,a3)},UI.one=function(a1,a2,a3){return a1&&a1.indexOf("ready.uk.dom")>-1&&UI.domready?(a2.apply(UI.$doc),UI.$doc):UI.$doc.one(a1,a2,a3)},UI.trigger=function(evt,params){return UI.$doc.trigger(evt,params)},UI.domObserve=function(selector,fn){UI.support.mutationobserver&&(fn=fn||function(){},UI.$(selector).each(function(){var element=this,$element=UI.$(element);if(!$element.data("observer"))try{var observer=new UI.support.mutationobserver(UI.Utils.debounce(function(mutations){fn.apply(element,[]),$element.trigger("changed.uk.dom")},50));observer.observe(element,{childList:!0,subtree:!0}),$element.data("observer",observer)}catch(e){}}))},UI.init=function(root){root=root||document,UI.domObservers.forEach(function(fn){fn(root)})},UI.on("domready.uk.dom",function(){UI.init(),UI.domready&&UI.Utils.checkDisplay()}),document.addEventListener("DOMContentLoaded",function(){var domReady=function(){UI.$body=UI.$("body"),UI.ready(function(context){UI.domObserve("[data-uk-observe]")}),UI.on("changed.uk.dom",function(e){UI.init(e.target),UI.Utils.checkDisplay(e.target)}),UI.trigger("beforeready.uk.dom"),UI.component.bootComponents(),requestAnimationFrame(function(){var memory={dir:{x:0,y:0},x:window.pageXOffset,y:window.pageYOffset},fn=function(){var wpxo=window.pageXOffset,wpyo=window.pageYOffset;memory.x==wpxo&&memory.y==wpyo||(wpxo!=memory.x?memory.dir.x=wpxo>memory.x?1:-1:memory.dir.x=0,wpyo!=memory.y?memory.dir.y=wpyo>memory.y?1:-1:memory.dir.y=0,memory.x=wpxo,memory.y=wpyo,UI.$doc.trigger("scrolling.uk.document",[{dir:{x:memory.dir.x,y:memory.dir.y},x:wpxo,y:wpyo}])),requestAnimationFrame(fn)};return UI.support.touch&&UI.$html.on("touchmove touchend MSPointerMove MSPointerUp pointermove pointerup",fn),(memory.x||memory.y)&&fn(),fn}()),UI.trigger("domready.uk.dom"),UI.support.touch&&navigator.userAgent.match(/(iPad|iPhone|iPod)/g)&&UI.$win.on("load orientationchange resize",UI.Utils.debounce(function(){var fn=function(){return $(".uk-height-viewport").css("height",window.innerHeight),fn};return fn()}(),100)),UI.trigger("afterready.uk.dom"),UI.domready=!0};return"complete"!=document.readyState&&"interactive"!=document.readyState||setTimeout(domReady),domReady}()),UI.$html.addClass(UI.support.touch?"uk-touch":"uk-notouch"),UI.support.touch){var exclude,hoverset=!1,hovercls="uk-hover",selector=".uk-overlay, .uk-overlay-hover, .uk-overlay-toggle, .uk-animation-hover, .uk-has-hover";UI.$html.on("mouseenter touchstart MSPointerDown pointerdown",selector,function(){hoverset&&$("."+hovercls).removeClass(hovercls),hoverset=$(this).addClass(hovercls)}).on("mouseleave touchend MSPointerUp pointerup",function(e){exclude=$(e.target).parents(selector),hoverset&&hoverset.not(exclude).removeClass(hovercls)})}return UI}),function($){function swipeDirection(x1,x2,y1,y2){return Math.abs(x1-x2)>=Math.abs(y1-y2)?x1-x2>0?"Left":"Right":y1-y2>0?"Up":"Down"}function longTap(){longTapTimeout=null,touch.last&&(void 0!==touch.el&&touch.el.trigger("longTap"),touch={})}function cancelLongTap(){longTapTimeout&&clearTimeout(longTapTimeout),longTapTimeout=null}function cancelAll(){touchTimeout&&clearTimeout(touchTimeout),tapTimeout&&clearTimeout(tapTimeout),swipeTimeout&&clearTimeout(swipeTimeout),longTapTimeout&&clearTimeout(longTapTimeout),touchTimeout=tapTimeout=swipeTimeout=longTapTimeout=null,touch={}}function isPrimaryTouch(event){return event.pointerType==event.MSPOINTER_TYPE_TOUCH&&event.isPrimary}if(!$.fn.swipeLeft){var touchTimeout,tapTimeout,swipeTimeout,longTapTimeout,gesture,touch={},longTapDelay=750;$(function(){var now,delta,firstTouch,deltaX=0,deltaY=0;"MSGesture"in window&&(gesture=new MSGesture,gesture.target=document.body),$(document).on("MSGestureEnd gestureend",function(e){var swipeDirectionFromVelocity=e.originalEvent.velocityX>1?"Right":e.originalEvent.velocityX<-1?"Left":e.originalEvent.velocityY>1?"Down":e.originalEvent.velocityY<-1?"Up":null;swipeDirectionFromVelocity&&void 0!==touch.el&&(touch.el.trigger("swipe"),touch.el.trigger("swipe"+swipeDirectionFromVelocity))}).on("touchstart MSPointerDown pointerdown",function(e){("MSPointerDown"!=e.type||isPrimaryTouch(e.originalEvent))&&(firstTouch="MSPointerDown"==e.type||"pointerdown"==e.type?e:e.originalEvent.touches[0],now=Date.now(),delta=now-(touch.last||now),touch.el=$("tagName"in firstTouch.target?firstTouch.target:firstTouch.target.parentNode),touchTimeout&&clearTimeout(touchTimeout),touch.x1=firstTouch.pageX,touch.y1=firstTouch.pageY,delta>0&&delta<=250&&(touch.isDoubleTap=!0),touch.last=now,longTapTimeout=setTimeout(longTap,longTapDelay),!gesture||"MSPointerDown"!=e.type&&"pointerdown"!=e.type&&"touchstart"!=e.type||gesture.addPointer(e.originalEvent.pointerId))}).on("touchmove MSPointerMove pointermove",function(e){("MSPointerMove"!=e.type||isPrimaryTouch(e.originalEvent))&&(firstTouch="MSPointerMove"==e.type||"pointermove"==e.type?e:e.originalEvent.touches[0],cancelLongTap(),touch.x2=firstTouch.pageX,touch.y2=firstTouch.pageY,deltaX+=Math.abs(touch.x1-touch.x2),deltaY+=Math.abs(touch.y1-touch.y2))}).on("touchend MSPointerUp pointerup",function(e){("MSPointerUp"!=e.type||isPrimaryTouch(e.originalEvent))&&(cancelLongTap(),touch.x2&&Math.abs(touch.x1-touch.x2)>30||touch.y2&&Math.abs(touch.y1-touch.y2)>30?swipeTimeout=setTimeout(function(){void 0!==touch.el&&(touch.el.trigger("swipe"),touch.el.trigger("swipe"+swipeDirection(touch.x1,touch.x2,touch.y1,touch.y2))),touch={}},0):"last"in touch&&(isNaN(deltaX)||deltaX<30&&deltaY<30?tapTimeout=setTimeout(function(){var event=$.Event("tap");event.cancelTouch=cancelAll,void 0!==touch.el&&touch.el.trigger(event),touch.isDoubleTap?(void 0!==touch.el&&touch.el.trigger("doubleTap"),touch={}):touchTimeout=setTimeout(function(){touchTimeout=null,void 0!==touch.el&&touch.el.trigger("singleTap"),touch={}},250)},0):touch={},deltaX=deltaY=0))}).on("touchcancel MSPointerCancel",cancelAll),$(window).on("scroll",cancelAll)}),["swipe","swipeLeft","swipeRight","swipeUp","swipeDown","doubleTap","tap","singleTap","longTap"].forEach(function(eventName){$.fn[eventName]=function(callback){return $(this).on(eventName,callback)}})}}(jQuery),function(UI){"use strict";var stacks=[];UI.component("stackMargin",{defaults:{cls:"uk-margin-small-top",rowfirst:!1},boot:function(){UI.ready(function(context){UI.$("[data-uk-margin]",context).each(function(){var ele=UI.$(this);ele.data("stackMargin")||UI.stackMargin(ele,UI.Utils.options(ele.attr("data-uk-margin")))})})},init:function(){var $this=this;UI.$win.on("resize orientationchange",function(){var fn=function(){$this.process()};return UI.$(function(){fn(),UI.$win.on("load",fn)}),UI.Utils.debounce(fn,20)}()),UI.$html.on("changed.uk.dom",function(e){$this.process()}),this.on("display.uk.check",function(e){this.element.is(":visible")&&this.process()}.bind(this)),stacks.push(this)},process:function(){var $this=this,columns=this.element.children();if(UI.Utils.stackMargin(columns,this.options),!this.options.rowfirst)return this;var pos_cache=columns.removeClass(this.options.rowfirst).filter(":visible").first().position();return pos_cache&&columns.each(function(){UI.$(this)[UI.$(this).position().left==pos_cache.left?"addClass":"removeClass"]($this.options.rowfirst)}),this}}),function(){var elements=[],check=function(ele){if(ele.is(":visible")){var width=ele.parent().width(),iwidth=ele.data("width"),ratio=width/iwidth,height=Math.floor(ratio*ele.data("height"));ele.css({height:width=offset&&(skip=column.addClass(options.cls)))})},UI.Utils.matchHeights=function(elements,options){elements=UI.$(elements).css("min-height",""),options=UI.$.extend({row:!0},options);var matchHeights=function(group){if(!(group.length<2)){var max=0;group.each(function(){max=Math.max(max,UI.$(this).outerHeight())}).each(function(){var element=UI.$(this),height=max-("border-box"==element.css("box-sizing")?0:element.outerHeight()-element.height());element.css("min-height",height+"px")})}};options.row?(elements.first().width(),setTimeout(function(){var lastoffset=!1,group=[];elements.each(function(){var ele=UI.$(this),offset=ele.offset().top;offset!=lastoffset&&group.length&&(matchHeights(UI.$(group)),group=[],offset=ele.offset().top),group.push(ele),lastoffset=offset}),group.length&&matchHeights(UI.$(group))},0)):matchHeights(elements)},function(cacheSvgs){UI.Utils.inlineSvg=function(selector,root){UI.$(selector||'img[src$=".svg"]',root||document).each(function(){var img=UI.$(this),src=img.attr("src");if(!cacheSvgs[src]){var d=UI.$.Deferred();UI.$.get(src,{nc:Math.random()},function(data){d.resolve(UI.$(data).find("svg"))}),cacheSvgs[src]=d.promise()}cacheSvgs[src].then(function(svg){var $svg=UI.$(svg).clone();img.attr("id")&&$svg.attr("id",img.attr("id")),img.attr("class")&&$svg.attr("class",img.attr("class")),img.attr("style")&&$svg.attr("style",img.attr("style")),img.attr("width")&&($svg.attr("width",img.attr("width")),img.attr("height")||$svg.removeAttr("height")),img.attr("height")&&($svg.attr("height",img.attr("height")),img.attr("width")||$svg.removeAttr("width")),img.replaceWith($svg)})})},UI.ready(function(context){UI.Utils.inlineSvg("[data-uk-svg]",context)})}({})}(UIkit),function(UI){"use strict";function scrollToElement(ele,options){options=UI.$.extend({duration:1e3,transition:"easeOutExpo",offset:0,complete:function(){}},options);var target=ele.offset().top-options.offset,docheight=UI.$doc.height(),winheight=window.innerHeight;target+winheight>docheight&&(target=docheight-winheight),UI.$("html,body").stop().animate({scrollTop:target},options.duration,options.transition).promise().done(options.complete)}UI.component("smoothScroll",{boot:function(){UI.$html.on("click.smooth-scroll.uikit","[data-uk-smooth-scroll]",function(e){var ele=UI.$(this);if(!ele.data("smoothScroll")){UI.smoothScroll(ele,UI.Utils.options(ele.attr("data-uk-smooth-scroll")));ele.trigger("click")}return!1})},init:function(){var $this=this;this.on("click",function(e){e.preventDefault(),scrollToElement(UI.$(this.hash).length?UI.$(this.hash):UI.$("body"),$this.options)})}}),UI.Utils.scrollToElement=scrollToElement,UI.$.easing.easeOutExpo||(UI.$.easing.easeOutExpo=function(x,t,b,c,d){return t==d?b+c:c*(-Math.pow(2,-10*t/d)+1)+b})}(UIkit),function(UI){"use strict";var $win=UI.$win,$doc=UI.$doc,scrollspies=[],checkScrollSpy=function(){for(var i=0;i=scrollTop)return inviews[i]}();if(!target)return;$this.options.closest?(links.blur().closest(clsClosest).removeClass(clsActive),navitems=links.filter("a[href='#"+target.attr("id")+"']").closest(clsClosest).addClass(clsActive)):navitems=links.removeClass(clsActive).filter("a[href='#"+target.attr("id")+"']").addClass(clsActive),$this.element.trigger("inview.uk.scrollspynav",[target,navitems])}};this.options.smoothscroll&&UI.smoothScroll&&links.each(function(){UI.smoothScroll(this,$this.options.smoothscroll)}),fn(),this.element.data("scrollspynav",this),this.check=fn,scrollspynavs.push(this)}})}(UIkit),function(UI){"use strict";var toggles=[];UI.component("toggle",{defaults:{target:!1,cls:"uk-hidden",animation:!1,duration:200},boot:function(){UI.ready(function(context){UI.$("[data-uk-toggle]",context).each(function(){var ele=UI.$(this);if(!ele.data("toggle")){UI.toggle(ele,UI.Utils.options(ele.attr("data-uk-toggle")))}}),setTimeout(function(){toggles.forEach(function(toggle){toggle.getToggles()})},0)})},init:function(){var $this=this;this.aria=this.options.cls.indexOf("uk-hidden")!==-1,this.getToggles(),this.on("click",function(e){$this.element.is('a[href="#"]')&&e.preventDefault(),$this.toggle()}),toggles.push(this)},toggle:function(){if(this.totoggle.length){if(this.options.animation&&UI.support.animation){var $this=this,animations=this.options.animation.split(",");1==animations.length&&(animations[1]=animations[0]),animations[0]=animations[0].trim(),animations[1]=animations[1].trim(),this.totoggle.css("animation-duration",this.options.duration+"ms"),this.totoggle.each(function(){var ele=UI.$(this);ele.hasClass($this.options.cls)?(ele.toggleClass($this.options.cls),UI.Utils.animate(ele,animations[0]).then(function(){ele.css("animation-duration",""),UI.Utils.checkDisplay(ele)})):UI.Utils.animate(this,animations[1]+" uk-animation-reverse").then(function(){ele.toggleClass($this.options.cls).css("animation-duration",""),UI.Utils.checkDisplay(ele)})})}else this.totoggle.toggleClass(this.options.cls),UI.Utils.checkDisplay(this.totoggle);this.updateAria()}},getToggles:function(){this.totoggle=this.options.target?UI.$(this.options.target):[],this.updateAria()},updateAria:function(){this.aria&&this.totoggle.length&&this.totoggle.each(function(){UI.$(this).attr("aria-hidden",UI.$(this).hasClass("uk-hidden"))})}})}(UIkit),function(UI){"use strict";UI.component("alert",{defaults:{fade:!0,duration:200,trigger:".uk-alert-close"},boot:function(){UI.$html.on("click.alert.uikit","[data-uk-alert]",function(e){var ele=UI.$(this);if(!ele.data("alert")){var alert=UI.alert(ele,UI.Utils.options(ele.attr("data-uk-alert")));UI.$(e.target).is(alert.options.trigger)&&(e.preventDefault(),alert.close())}})},init:function(){var $this=this;this.on("click",this.options.trigger,function(e){e.preventDefault(),$this.close()})},close:function(){var element=this.trigger("close.uk.alert"),removeElement=function(){this.trigger("closed.uk.alert").remove()}.bind(this);this.options.fade?element.css("overflow","hidden").css("max-height",element.height()).animate({height:0,opacity:0,"padding-top":0,"padding-bottom":0,"margin-top":0,"margin-bottom":0},this.options.duration,removeElement):removeElement()}})}(UIkit),function(UI){"use strict";UI.component("buttonRadio",{defaults:{activeClass:"uk-active",target:".uk-button"},boot:function(){UI.$html.on("click.buttonradio.uikit","[data-uk-button-radio]",function(e){var ele=UI.$(this);if(!ele.data("buttonRadio")){var obj=UI.buttonRadio(ele,UI.Utils.options(ele.attr("data-uk-button-radio"))),target=UI.$(e.target);target.is(obj.options.target)&&target.trigger("click")}})},init:function(){var $this=this;this.find($this.options.target).attr("aria-checked","false").filter("."+$this.options.activeClass).attr("aria-checked","true"),this.on("click",this.options.target,function(e){var ele=UI.$(this);ele.is('a[href="#"]')&&e.preventDefault(),$this.find($this.options.target).not(ele).removeClass($this.options.activeClass).blur(),ele.addClass($this.options.activeClass),$this.find($this.options.target).not(ele).attr("aria-checked","false"),ele.attr("aria-checked","true"),$this.trigger("change.uk.button",[ele])})},getSelected:function(){return this.find("."+this.options.activeClass)}}),UI.component("buttonCheckbox",{defaults:{activeClass:"uk-active",target:".uk-button"},boot:function(){UI.$html.on("click.buttoncheckbox.uikit","[data-uk-button-checkbox]",function(e){var ele=UI.$(this);if(!ele.data("buttonCheckbox")){var obj=UI.buttonCheckbox(ele,UI.Utils.options(ele.attr("data-uk-button-checkbox"))),target=UI.$(e.target);target.is(obj.options.target)&&target.trigger("click")}})},init:function(){var $this=this;this.find($this.options.target).attr("aria-checked","false").filter("."+$this.options.activeClass).attr("aria-checked","true"),this.on("click",this.options.target,function(e){var ele=UI.$(this);ele.is('a[href="#"]')&&e.preventDefault(),ele.toggleClass($this.options.activeClass).blur(),ele.attr("aria-checked",ele.hasClass($this.options.activeClass)),$this.trigger("change.uk.button",[ele])})},getSelected:function(){return this.find("."+this.options.activeClass)}}),UI.component("button",{defaults:{},boot:function(){UI.$html.on("click.button.uikit","[data-uk-button]",function(e){var ele=UI.$(this);if(!ele.data("button")){UI.button(ele,UI.Utils.options(ele.attr("data-uk-button")));ele.trigger("click")}})},init:function(){var $this=this;this.element.attr("aria-pressed",this.element.hasClass("uk-active")),this.on("click",function(e){$this.element.is('a[href="#"]')&&e.preventDefault(),$this.toggle(),$this.trigger("change.uk.button",[$this.element.blur().hasClass("uk-active")])})},toggle:function(){this.element.toggleClass("uk-active"),this.element.attr("aria-pressed",this.element.hasClass("uk-active"))}})}(UIkit),function(UI){"use strict";function justify(ele,justifyTo,boundarywidth,offset){if(ele=UI.$(ele),justifyTo=UI.$(justifyTo),boundarywidth=boundarywidth||window.innerWidth,offset=offset||ele.offset(),justifyTo.length){var jwidth=justifyTo.outerWidth();if(ele.css("min-width",jwidth),"right"==UI.langdirection){var right1=boundarywidth-(justifyTo.offset().left+jwidth),right2=boundarywidth-(ele.offset().left+ele.outerWidth());ele.css("margin-right",right1-right2)}else ele.css("margin-left",justifyTo.offset().left-offset.left)}}var hoverIdle,active=!1,flips={x:{"bottom-left":"bottom-right","bottom-right":"bottom-left","bottom-center":"bottom-center","top-left":"top-right","top-right":"top-left","top-center":"top-center","left-top":"right-top","left-bottom":"right-bottom","left-center":"right-center","right-top":"left-top","right-bottom":"left-bottom","right-center":"left-center"},y:{"bottom-left":"top-left","bottom-right":"top-right","bottom-center":"top-center","top-left":"bottom-left","top-right":"bottom-right","top-center":"bottom-center","left-top":"left-bottom","left-bottom":"left-top","left-center":"left-center","right-top":"right-bottom","right-bottom":"right-top","right-center":"right-center"},xy:{"bottom-left":"top-right","bottom-right":"top-left","bottom-center":"top-center","top-left":"bottom-right","top-right":"bottom-left","top-center":"bottom-center", -"left-top":"right-bottom","left-bottom":"right-top","left-center":"right-center","right-top":"left-bottom","right-bottom":"left-top","right-center":"left-center"}};UI.component("dropdown",{defaults:{mode:"hover",pos:"bottom-left",offset:0,remaintime:800,justify:!1,boundary:UI.$win,delay:0,dropdownSelector:".uk-dropdown,.uk-dropdown-blank",hoverDelayIdle:250,preventflip:!1},remainIdle:!1,boot:function(){var triggerevent=UI.support.touch?"click":"mouseenter";UI.$html.on(triggerevent+".dropdown.uikit","[data-uk-dropdown]",function(e){var ele=UI.$(this);if(!ele.data("dropdown")){var dropdown=UI.dropdown(ele,UI.Utils.options(ele.attr("data-uk-dropdown")));("click"==triggerevent||"mouseenter"==triggerevent&&"hover"==dropdown.options.mode)&&dropdown.element.trigger(triggerevent),dropdown.element.find(dropdown.options.dropdownSelector).length&&e.preventDefault()}})},init:function(){var $this=this;this.dropdown=this.find(this.options.dropdownSelector),this.offsetParent=this.dropdown.parents().filter(function(){return UI.$.inArray(UI.$(this).css("position"),["relative","fixed","absolute"])!==-1}).slice(0,1),this.centered=this.dropdown.hasClass("uk-dropdown-center"),this.justified=!!this.options.justify&&UI.$(this.options.justify),this.boundary=UI.$(this.options.boundary),this.boundary.length||(this.boundary=UI.$win),this.dropdown.hasClass("uk-dropdown-up")&&(this.options.pos="top-left"),this.dropdown.hasClass("uk-dropdown-flip")&&(this.options.pos=this.options.pos.replace("left","right")),this.dropdown.hasClass("uk-dropdown-center")&&(this.options.pos=this.options.pos.replace(/(left|right)/,"center")),this.element.attr("aria-haspopup","true"),this.element.attr("aria-expanded",this.element.hasClass("uk-open")),"click"==this.options.mode||UI.support.touch?this.on("click.uk.dropdown",function(e){var $target=UI.$(e.target);$target.parents($this.options.dropdownSelector).length||(($target.is("a[href='#']")||$target.parent().is("a[href='#']")||$this.dropdown.length&&!$this.dropdown.is(":visible"))&&e.preventDefault(),$target.blur()),$this.element.hasClass("uk-open")?(!$this.dropdown.find(e.target).length||$target.is(".uk-dropdown-close")||$target.parents(".uk-dropdown-close").length)&&$this.hide():$this.show()}):this.on("mouseenter",function(e){$this.trigger("pointerenter.uk.dropdown",[$this]),$this.remainIdle&&clearTimeout($this.remainIdle),hoverIdle&&clearTimeout(hoverIdle),active&&active==$this||(hoverIdle=active&&active!=$this?setTimeout(function(){hoverIdle=setTimeout($this.show.bind($this),$this.options.delay)},$this.options.hoverDelayIdle):setTimeout($this.show.bind($this),$this.options.delay))}).on("mouseleave",function(){hoverIdle&&clearTimeout(hoverIdle),$this.remainIdle=setTimeout(function(){active&&active==$this&&$this.hide()},$this.options.remaintime),$this.trigger("pointerleave.uk.dropdown",[$this])}).on("click",function(e){var $target=UI.$(e.target);return $this.remainIdle&&clearTimeout($this.remainIdle),active&&active==$this?void((!$this.dropdown.find(e.target).length||$target.is(".uk-dropdown-close")||$target.parents(".uk-dropdown-close").length)&&$this.hide()):(($target.is("a[href='#']")||$target.parent().is("a[href='#']"))&&e.preventDefault(),void $this.show())})},show:function(){UI.$html.off("click.outer.dropdown"),active&&active!=this&&active.hide(!0),hoverIdle&&clearTimeout(hoverIdle),this.trigger("beforeshow.uk.dropdown",[this]),this.checkDimensions(),this.element.addClass("uk-open"),this.element.attr("aria-expanded","true"),this.trigger("show.uk.dropdown",[this]),UI.Utils.checkDisplay(this.dropdown,!0),active=this,this.registerOuterClick()},hide:function(force){this.trigger("beforehide.uk.dropdown",[this,force]),this.element.removeClass("uk-open"),this.remainIdle&&clearTimeout(this.remainIdle),this.remainIdle=!1,this.element.attr("aria-expanded","false"),this.trigger("hide.uk.dropdown",[this,force]),active==this&&(active=!1)},registerOuterClick:function(){var $this=this;UI.$html.off("click.outer.dropdown"),setTimeout(function(){UI.$html.on("click.outer.dropdown",function(e){hoverIdle&&clearTimeout(hoverIdle);UI.$(e.target);active!=$this||$this.element.find(e.target).length||($this.hide(!0),UI.$html.off("click.outer.dropdown"))})},10)},checkDimensions:function(){if(this.dropdown.length){this.dropdown.removeClass("uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack").css({"top-left":"",left:"","margin-left":"","margin-right":""}),this.justified&&this.justified.length&&this.dropdown.css("min-width","");var pp,pos=UI.$.extend({},this.offsetParent.offset(),{width:this.offsetParent[0].offsetWidth,height:this.offsetParent[0].offsetHeight}),posoffset=this.options.offset,dropdown=this.dropdown,width=(dropdown.show().offset()||{left:0,top:0},dropdown.outerWidth()),height=dropdown.outerHeight(),boundarywidth=this.boundary.width(),dpos=(this.boundary[0]!==window&&this.boundary.offset()?this.boundary.offset():{top:0,left:0},this.options.pos),variants={"bottom-left":{top:0+pos.height+posoffset,left:0},"bottom-right":{top:0+pos.height+posoffset,left:0+pos.width-width},"bottom-center":{top:0+pos.height+posoffset,left:0+pos.width/2-width/2},"top-left":{top:0-height-posoffset,left:0},"top-right":{top:0-height-posoffset,left:0+pos.width-width},"top-center":{top:0-height-posoffset,left:0+pos.width/2-width/2},"left-top":{top:0,left:0-width-posoffset},"left-bottom":{top:0+pos.height-height,left:0-width-posoffset},"left-center":{top:0+pos.height/2-height/2,left:0-width-posoffset},"right-top":{top:0,left:0+pos.width+posoffset},"right-bottom":{top:0+pos.height-height,left:0+pos.width+posoffset},"right-center":{top:0+pos.height/2-height/2,left:0+pos.width+posoffset}},css={};if(pp=dpos.split("-"),css=variants[dpos]?variants[dpos]:variants["bottom-left"],this.justified&&this.justified.length)justify(dropdown.css({left:0}),this.justified,boundarywidth);else if(this.options.preventflip!==!0){var fdpos;switch(this.checkBoundary(pos.left+css.left,pos.top+css.top,width,height,boundarywidth)){case"x":"x"!==this.options.preventflip&&(fdpos=flips.x[dpos]||"right-top");break;case"y":"y"!==this.options.preventflip&&(fdpos=flips.y[dpos]||"top-left");break;case"xy":this.options.preventflip||(fdpos=flips.xy[dpos]||"right-bottom")}fdpos&&(pp=fdpos.split("-"),css=variants[fdpos]?variants[fdpos]:variants["bottom-left"],this.checkBoundary(pos.left+css.left,pos.top+css.top,width,height,boundarywidth)&&(pp=dpos.split("-"),css=variants[dpos]?variants[dpos]:variants["bottom-left"]))}width>boundarywidth&&(dropdown.addClass("uk-dropdown-stack"),this.trigger("stack.uk.dropdown",[this])),dropdown.css(css).css("display","").addClass("uk-dropdown-"+pp[0])}},checkBoundary:function(left,top,width,height,boundarywidth){var axis="";return(left<0||left-UI.$win.scrollLeft()+width>boundarywidth)&&(axis+="x"),(top-UI.$win.scrollTop()<0||top-UI.$win.scrollTop()+height>window.innerHeight)&&(axis+="y"),axis}}),UI.component("dropdownOverlay",{defaults:{justify:!1,cls:"",duration:200},boot:function(){UI.ready(function(context){UI.$("[data-uk-dropdown-overlay]",context).each(function(){var ele=UI.$(this);ele.data("dropdownOverlay")||UI.dropdownOverlay(ele,UI.Utils.options(ele.attr("data-uk-dropdown-overlay")))})})},init:function(){var $this=this;this.justified=!!this.options.justify&&UI.$(this.options.justify),this.overlay=this.element.find("uk-dropdown-overlay"),this.overlay.length||(this.overlay=UI.$('
    ').appendTo(this.element)),this.overlay.addClass(this.options.cls),this.on({"beforeshow.uk.dropdown":function(e,dropdown){$this.dropdown=dropdown,$this.justified&&$this.justified.length&&justify($this.overlay.css({display:"block","margin-left":"","margin-right":""}),$this.justified,$this.justified.outerWidth())},"show.uk.dropdown":function(e,dropdown){var h=$this.dropdown.dropdown.outerHeight(!0);$this.dropdown.element.removeClass("uk-open"),$this.overlay.stop().css("display","block").animate({height:h},$this.options.duration,function(){$this.dropdown.dropdown.css("visibility",""),$this.dropdown.element.addClass("uk-open"),UI.Utils.checkDisplay($this.dropdown.dropdown,!0)}),$this.pointerleave=!1},"hide.uk.dropdown":function(){$this.overlay.stop().animate({height:0},$this.options.duration)},"pointerenter.uk.dropdown":function(e,dropdown){clearTimeout($this.remainIdle)},"pointerleave.uk.dropdown":function(e,dropdown){$this.pointerleave=!0}}),this.overlay.on({mouseenter:function(){$this.remainIdle&&(clearTimeout($this.dropdown.remainIdle),clearTimeout($this.remainIdle))},mouseleave:function(){$this.pointerleave&&active&&($this.remainIdle=setTimeout(function(){active&&active.hide()},active.options.remaintime))}})}})}(UIkit),function(UI){"use strict";var grids=[];UI.component("gridMatchHeight",{defaults:{target:!1,row:!0,ignorestacked:!1},boot:function(){UI.ready(function(context){UI.$("[data-uk-grid-match]",context).each(function(){var obj,grid=UI.$(this);grid.data("gridMatchHeight")||(obj=UI.gridMatchHeight(grid,UI.Utils.options(grid.attr("data-uk-grid-match"))))})})},init:function(){var $this=this;this.columns=this.element.children(),this.elements=this.options.target?this.find(this.options.target):this.columns,this.columns.length&&(UI.$win.on("load resize orientationchange",function(){var fn=function(){$this.match()};return UI.$(function(){fn()}),UI.Utils.debounce(fn,50)}()),UI.$html.on("changed.uk.dom",function(e){$this.columns=$this.element.children(),$this.elements=$this.options.target?$this.find($this.options.target):$this.columns,$this.match()}),this.on("display.uk.check",function(e){this.element.is(":visible")&&this.match()}.bind(this)),grids.push(this))},match:function(){var firstvisible=this.columns.filter(":visible:first");if(firstvisible.length){var stacked=Math.ceil(100*parseFloat(firstvisible.css("width"))/parseFloat(firstvisible.parent().css("width")))>=100;return stacked&&!this.options.ignorestacked?this.revert():UI.Utils.matchHeights(this.elements,this.options),this}},revert:function(){return this.elements.css("min-height",""),this}}),UI.component("gridMargin",{defaults:{cls:"uk-grid-margin",rowfirst:"uk-row-first"},boot:function(){UI.ready(function(context){UI.$("[data-uk-grid-margin]",context).each(function(){var obj,grid=UI.$(this);grid.data("gridMargin")||(obj=UI.gridMargin(grid,UI.Utils.options(grid.attr("data-uk-grid-margin"))))})})},init:function(){UI.stackMargin(this.element,this.options)}})}(UIkit),function(UI){"use strict";function setContent(content,modal){if(modal)return"object"==typeof content?(content=content instanceof jQuery?content:UI.$(content),content.parent().length&&(modal.persist=content,modal.persist.data("modalPersistParent",content.parent()))):content="string"==typeof content||"number"==typeof content?UI.$("
    ").html(content):UI.$("
    ").html("UIkit.modal Error: Unsupported data type: "+typeof content),content.appendTo(modal.element.find(".uk-modal-dialog")),modal}var body,active=!1,activeCount=0,$html=UI.$html;UI.component("modal",{defaults:{keyboard:!0,bgclose:!0,minScrollHeight:150,center:!1,modal:!0},scrollable:!1,transition:!1,hasTransitioned:!0,init:function(){if(body||(body=UI.$("body")),this.element.length){var $this=this;this.paddingdir="padding-"+("left"==UI.langdirection?"right":"left"),this.dialog=this.find(".uk-modal-dialog"),this.active=!1,this.element.attr("aria-hidden",this.element.hasClass("uk-open")),this.on("click",".uk-modal-close",function(e){e.preventDefault(),$this.hide()}).on("click",function(e){var target=UI.$(e.target);target[0]==$this.element[0]&&$this.options.bgclose&&$this.hide()})}},toggle:function(){return this[this.isActive()?"hide":"show"]()},show:function(){if(this.element.length){var $this=this;if(!this.isActive())return this.options.modal&&active&&active.hide(!0),this.element.removeClass("uk-open").show(),this.resize(),this.options.modal&&(active=this),this.active=!0,activeCount++,UI.support.transition?(this.hasTransitioned=!1,this.element.one(UI.support.transition.end,function(){$this.hasTransitioned=!0}).addClass("uk-open")):this.element.addClass("uk-open"),$html.addClass("uk-modal-page").height(),this.element.attr("aria-hidden","false"),this.element.trigger("show.uk.modal"),UI.Utils.checkDisplay(this.dialog,!0),this}},hide:function(force){if(!force&&UI.support.transition&&this.hasTransitioned){var $this=this;this.one(UI.support.transition.end,function(){$this._hide()}).removeClass("uk-open")}else this._hide();return this},resize:function(){var bodywidth=body.width();if(this.scrollbarwidth=window.innerWidth-bodywidth,body.css(this.paddingdir,this.scrollbarwidth),this.element.css("overflow-y",this.scrollbarwidth?"scroll":"auto"),!this.updateScrollable()&&this.options.center){var dh=this.dialog.outerHeight(),pad=parseInt(this.dialog.css("margin-top"),10)+parseInt(this.dialog.css("margin-bottom"),10);dh+pad0?activeCount--:activeCount=0,this.element.hide().removeClass("uk-open"),this.element.attr("aria-hidden","true"),activeCount||($html.removeClass("uk-modal-page"),body.css(this.paddingdir,"")),active===this&&(active=!1),this.trigger("hide.uk.modal")},isActive:function(){return this.active}}),UI.component("modalTrigger",{boot:function(){UI.$html.on("click.modal.uikit","[data-uk-modal]",function(e){var ele=UI.$(this);if(ele.is("a")&&e.preventDefault(),!ele.data("modalTrigger")){var modal=UI.modalTrigger(ele,UI.Utils.options(ele.attr("data-uk-modal")));modal.show()}}),UI.$html.on("keydown.modal.uikit",function(e){active&&27===e.keyCode&&active.options.keyboard&&(e.preventDefault(),active.hide())}),UI.$win.on("resize orientationchange",UI.Utils.debounce(function(){active&&active.resize()},150))},init:function(){var $this=this;this.options=UI.$.extend({target:!!$this.element.is("a")&&$this.element.attr("href")},this.options),this.modal=UI.modal(this.options.target,this.options),this.on("click",function(e){e.preventDefault(),$this.show()}),this.proxy(this.modal,"show hide isActive")}}),UI.modal.dialog=function(content,options){var modal=UI.modal(UI.$(UI.modal.dialog.template).appendTo("body"),options);return modal.on("hide.uk.modal",function(){modal.persist&&(modal.persist.appendTo(modal.persist.data("modalPersistParent")),modal.persist=!1),modal.element.remove()}),setContent(content,modal),modal},UI.modal.dialog.template='
    ',UI.modal.alert=function(content,options){options=UI.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:UI.modal.labels},options);var modal=UI.modal.dialog(['
    '+String(content)+"
    ",'"].join(""),options);return modal.on("show.uk.modal",function(){setTimeout(function(){modal.element.find("button:first").focus()},50)}),modal.show()},UI.modal.confirm=function(content,onconfirm,oncancel){var options=arguments.length>1&&arguments[arguments.length-1]?arguments[arguments.length-1]:{};onconfirm=UI.$.isFunction(onconfirm)?onconfirm:function(){},oncancel=UI.$.isFunction(oncancel)?oncancel:function(){},options=UI.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:UI.modal.labels,confirmButtonClass:""},UI.$.isFunction(options)?{}:options);var modal=UI.modal.dialog(['
    '+String(content)+"
    ",'"].join(""),options);return modal.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click",function(){UI.$(this).is(".js-modal-confirm")?onconfirm():oncancel(),modal.hide()}),modal.on("show.uk.modal",function(){setTimeout(function(){modal.element.find(".js-modal-confirm").focus()},50)}),modal.show()},UI.modal.prompt=function(text,value,onsubmit,options){onsubmit=UI.$.isFunction(onsubmit)?onsubmit:function(value){},options=UI.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:UI.modal.labels},options);var modal=UI.modal.dialog([text?'
    '+String(text)+"
    ":"",'

    ','"].join(""),options),input=modal.element.find("input[type='text']").val(value||"").on("keyup",function(e){13==e.keyCode&&modal.element.find(".js-modal-ok").trigger("click")});return modal.element.find(".js-modal-ok").on("click",function(){onsubmit(input.val())!==!1&&modal.hide()}),modal.on("show.uk.modal",function(){setTimeout(function(){input.focus()},50)}),modal.show()},UI.modal.blockUI=function(content,options){var modal=UI.modal.dialog(['
    '+String(content||'
    ...
    ')+"
    "].join(""),UI.$.extend({bgclose:!1,keyboard:!1,modal:!1},options));return modal.content=modal.element.find(".uk-modal-content:first"),modal.show()},UI.modal.labels={Ok:"Ok",Cancel:"Cancel"}}(UIkit),function(UI){"use strict";function getHeight(ele){var $ele=UI.$(ele),height="auto";if($ele.is(":visible"))height=$ele.outerHeight();else{var tmp={position:$ele.css("position"),visibility:$ele.css("visibility"),display:$ele.css("display")};height=$ele.css({position:"absolute",visibility:"hidden",display:"block"}).outerHeight(),$ele.css(tmp)}return height}UI.component("nav",{defaults:{toggle:">li.uk-parent > a[href='#']",lists:">li.uk-parent > ul",multiple:!1},boot:function(){UI.ready(function(context){UI.$("[data-uk-nav]",context).each(function(){var nav=UI.$(this);if(!nav.data("nav")){UI.nav(nav,UI.Utils.options(nav.attr("data-uk-nav")))}})})},init:function(){var $this=this;this.on("click.uk.nav",this.options.toggle,function(e){e.preventDefault();var ele=UI.$(this);$this.open(ele.parent()[0]==$this.element[0]?ele:ele.parent("li"))}),this.find(this.options.lists).each(function(){var $ele=UI.$(this),parent=$ele.parent(),active=parent.hasClass("uk-active");$ele.wrap('
    '),parent.data("list-container",$ele.parent()[active?"removeClass":"addClass"]("uk-hidden")),parent.attr("aria-expanded",parent.hasClass("uk-open")),active&&$this.open(parent,!0)})},open:function(li,noanimation){var $this=this,element=this.element,$li=UI.$(li),$container=$li.data("list-container");this.options.multiple||element.children(".uk-open").not(li).each(function(){var ele=UI.$(this);ele.data("list-container")&&ele.data("list-container").stop().animate({height:0},function(){UI.$(this).parent().removeClass("uk-open").end().addClass("uk-hidden")})}),$li.toggleClass("uk-open"),$li.attr("aria-expanded",$li.hasClass("uk-open")),$container&&($li.hasClass("uk-open")&&$container.removeClass("uk-hidden"),noanimation?($container.stop().height($li.hasClass("uk-open")?"auto":0),$li.hasClass("uk-open")||$container.addClass("uk-hidden"),this.trigger("display.uk.check")):$container.stop().animate({height:$li.hasClass("uk-open")?getHeight($container.find("ul:first")):0},function(){$li.hasClass("uk-open")?$container.css("height",""):$container.addClass("uk-hidden"),$this.trigger("display.uk.check")}))}})}(UIkit),function(UI){"use strict";var scrollpos={x:window.scrollX,y:window.scrollY},$html=(UI.$win,UI.$doc,UI.$html),Offcanvas={show:function(element,options){if(element=UI.$(element),element.length){options=UI.$.extend({mode:"push"},options);var $body=UI.$("body"),bar=element.find(".uk-offcanvas-bar:first"),rtl="right"==UI.langdirection,flip=bar.hasClass("uk-offcanvas-bar-flip")?-1:1,dir=flip*(rtl?-1:1),scrollbarwidth=window.innerWidth-$body.width();scrollpos={x:window.pageXOffset,y:window.pageYOffset},bar.attr("mode",options.mode),element.addClass("uk-active"),$body.css({width:window.innerWidth-scrollbarwidth,height:window.innerHeight}).addClass("uk-offcanvas-page"),"push"!=options.mode&&"reveal"!=options.mode||$body.css(rtl?"margin-right":"margin-left",(rtl?-1:1)*(bar.outerWidth()*dir)),"reveal"==options.mode&&bar.css("clip","rect(0, "+bar.outerWidth()+"px, 100vh, 0)"),$html.css("margin-top",scrollpos.y*-1).width(),bar.addClass("uk-offcanvas-bar-show"),this._initElement(element),bar.trigger("show.uk.offcanvas",[element,bar]),element.attr("aria-hidden","false")}},hide:function(force){var $body=UI.$("body"),panel=UI.$(".uk-offcanvas.uk-active"),rtl="right"==UI.langdirection,bar=panel.find(".uk-offcanvas-bar:first"),finalize=function(){$body.removeClass("uk-offcanvas-page").css({width:"",height:"",marginLeft:"",marginRight:""}),panel.removeClass("uk-active"),bar.removeClass("uk-offcanvas-bar-show"),$html.css("margin-top",""),window.scrollTo(scrollpos.x,scrollpos.y),bar.trigger("hide.uk.offcanvas",[panel,bar]),panel.attr("aria-hidden","true")};panel.length&&("none"==bar.attr("mode")&&(force=!0),UI.support.transition&&!force?($body.one(UI.support.transition.end,function(){finalize()}).css(rtl?"margin-right":"margin-left",""),"reveal"==bar.attr("mode")&&bar.css("clip",""),setTimeout(function(){bar.removeClass("uk-offcanvas-bar-show")},0)):finalize())},_initElement:function(element){element.data("OffcanvasInit")||(element.on("click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas",function(e){var target=UI.$(e.target);if(!e.type.match(/swipe/)&&!target.hasClass("uk-offcanvas-close")){if(target.hasClass("uk-offcanvas-bar"))return;if(target.parents(".uk-offcanvas-bar:first").length)return}e.stopImmediatePropagation(),Offcanvas.hide()}),element.on("click",'a[href*="#"]',function(e){var link=UI.$(this),href=link.attr("href");"#"!=href&&(UI.$doc.one("hide.uk.offcanvas",function(){var target;try{target=UI.$(link[0].hash)}catch(e){target=""}target.length||(target=UI.$('[name="'+link[0].hash.replace("#","")+'"]')),target.length&&UI.Utils.scrollToElement?UI.Utils.scrollToElement(target,UI.Utils.options(link.attr("data-uk-smooth-scroll")||"{}")):window.location.href=href}),Offcanvas.hide())}),element.data("OffcanvasInit",!0))}};UI.component("offcanvasTrigger",{boot:function(){$html.on("click.offcanvas.uikit","[data-uk-offcanvas]",function(e){e.preventDefault();var ele=UI.$(this);if(!ele.data("offcanvasTrigger")){UI.offcanvasTrigger(ele,UI.Utils.options(ele.attr("data-uk-offcanvas")));ele.trigger("click")}}),$html.on("keydown.uk.offcanvas",function(e){27===e.keyCode&&Offcanvas.hide()})},init:function(){var $this=this;this.options=UI.$.extend({target:!!$this.element.is("a")&&$this.element.attr("href"),mode:"push"},this.options),this.on("click",function(e){e.preventDefault(),Offcanvas.show($this.options.target,$this.options)})}}),UI.offcanvas=Offcanvas}(UIkit),function(UI){"use strict";function coreAnimation(cls,current,next){var release,d=UI.$.Deferred(),clsIn=cls,clsOut=cls;return next[0]===current[0]?(d.resolve(),d.promise()):("object"==typeof cls&&(clsIn=cls[0],clsOut=cls[1]||cls[0]),UI.$body.css("overflow-x","hidden"),release=function(){current&¤t.hide().removeClass("uk-active "+clsOut+" uk-animation-reverse"),next.addClass(clsIn).one(UI.support.animation.end,function(){next.removeClass(""+clsIn).css({opacity:"",display:""}),d.resolve(),UI.$body.css("overflow-x",""),current&¤t.css({opacity:"",display:""})}.bind(this)).show()},next.css("animation-duration",this.options.duration+"ms"),current&¤t.length?(current.css("animation-duration",this.options.duration+"ms"),current.css("display","none").addClass(clsOut+" uk-animation-reverse").one(UI.support.animation.end,function(){release()}.bind(this)).css("display","")):(next.addClass("uk-active"),release()),d.promise())}var Animations;UI.component("switcher",{defaults:{connect:!1,toggle:">*",active:0,animation:!1,duration:200,swiping:!0},animating:!1,boot:function(){UI.ready(function(context){UI.$("[data-uk-switcher]",context).each(function(){var switcher=UI.$(this);if(!switcher.data("switcher")){UI.switcher(switcher,UI.Utils.options(switcher.attr("data-uk-switcher")))}})})},init:function(){var $this=this;if(this.on("click.uk.switcher",this.options.toggle,function(e){e.preventDefault(),$this.show(this)}),this.options.connect){this.connect=UI.$(this.options.connect),this.connect.find(".uk-active").removeClass(".uk-active"),this.connect.length&&(this.connect.children().attr("aria-hidden","true"),this.connect.on("click","[data-uk-switcher-item]",function(e){e.preventDefault();var item=UI.$(this).attr("data-uk-switcher-item");if($this.index!=item)switch(item){case"next":case"previous":$this.show($this.index+("next"==item?1:-1));break;default:$this.show(parseInt(item,10))}}),this.options.swiping&&this.connect.on("swipeRight swipeLeft",function(e){e.preventDefault(),window.getSelection().toString()||$this.show($this.index+("swipeLeft"==e.type?1:-1))}));var toggles=this.find(this.options.toggle),active=toggles.filter(".uk-active");if(active.length)this.show(active,!1);else{if(this.options.active===!1)return;active=toggles.eq(this.options.active),this.show(active.length?active:toggles.eq(0),!1)}toggles.not(active).attr("aria-expanded","false"),active.attr("aria-expanded","true"),this.on("changed.uk.dom",function(){$this.connect=UI.$($this.options.connect)})}},show:function(tab,animate){if(!this.animating){if(isNaN(tab))tab=UI.$(tab);else{var toggles=this.find(this.options.toggle);tab=tab<0?toggles.length-1:tab,tab=toggles.eq(toggles[tab]?tab:0)}var $this=this,toggles=this.find(this.options.toggle),active=UI.$(tab),animation=Animations[this.options.animation]||function(current,next){if(!$this.options.animation)return Animations.none.apply($this);var anim=$this.options.animation.split(",");return 1==anim.length&&(anim[1]=anim[0]),anim[0]=anim[0].trim(),anim[1]=anim[1].trim(),coreAnimation.apply($this,[anim,current,next])};animate!==!1&&UI.support.animation||(animation=Animations.none),active.hasClass("uk-disabled")||(toggles.attr("aria-expanded","false"),active.attr("aria-expanded","true"),toggles.filter(".uk-active").removeClass("uk-active"),active.addClass("uk-active"),this.options.connect&&this.connect.length&&(this.index=this.find(this.options.toggle).index(active),this.index==-1&&(this.index=0),this.connect.each(function(){var container=UI.$(this),children=UI.$(container.children()),current=UI.$(children.filter(".uk-active")),next=UI.$(children.eq($this.index));$this.animating=!0,animation.apply($this,[current,next]).then(function(){current.removeClass("uk-active"),next.addClass("uk-active"),current.attr("aria-hidden","true"),next.attr("aria-hidden","false"),UI.Utils.checkDisplay(next,!0),$this.animating=!1})})),this.trigger("show.uk.switcher",[active]))}}}),Animations={none:function(){var d=UI.$.Deferred();return d.resolve(),d.promise()},fade:function(current,next){return coreAnimation.apply(this,["uk-animation-fade",current,next])},"slide-bottom":function(current,next){return coreAnimation.apply(this,["uk-animation-slide-bottom",current,next])},"slide-top":function(current,next){return coreAnimation.apply(this,["uk-animation-slide-top",current,next])},"slide-vertical":function(current,next,dir){var anim=["uk-animation-slide-top","uk-animation-slide-bottom"];return current&¤t.index()>next.index()&&anim.reverse(),coreAnimation.apply(this,[anim,current,next])},"slide-left":function(current,next){return coreAnimation.apply(this,["uk-animation-slide-left",current,next])},"slide-right":function(current,next){return coreAnimation.apply(this,["uk-animation-slide-right",current,next])},"slide-horizontal":function(current,next,dir){var anim=["uk-animation-slide-right","uk-animation-slide-left"];return current&¤t.index()>next.index()&&anim.reverse(),coreAnimation.apply(this,[anim,current,next])},scale:function(current,next){return coreAnimation.apply(this,["uk-animation-scale-up",current,next])}},UI.switcher.animations=Animations}(UIkit),function(UI){"use strict";UI.component("tab",{defaults:{target:">li:not(.uk-tab-responsive, .uk-disabled)",connect:!1,active:0,animation:!1,duration:200,swiping:!0},boot:function(){UI.ready(function(context){UI.$("[data-uk-tab]",context).each(function(){var tab=UI.$(this);if(!tab.data("tab")){UI.tab(tab,UI.Utils.options(tab.attr("data-uk-tab")))}})})},init:function(){var $this=this;this.current=!1,this.on("click.uk.tab",this.options.target,function(e){if(e.preventDefault(),!$this.switcher||!$this.switcher.animating){var current=$this.find($this.options.target).not(this);current.removeClass("uk-active").blur(),$this.trigger("change.uk.tab",[UI.$(this).addClass("uk-active"),$this.current]),$this.current=UI.$(this),$this.options.connect||(current.attr("aria-expanded","false"),UI.$(this).attr("aria-expanded","true"))}}),this.options.connect&&(this.connect=UI.$(this.options.connect)),this.responsivetab=UI.$('
  • ').append('
      '),this.responsivetab.dropdown=this.responsivetab.find(".uk-dropdown"),this.responsivetab.lst=this.responsivetab.dropdown.find("ul"),this.responsivetab.caption=this.responsivetab.find("a:first"),this.element.hasClass("uk-tab-bottom")&&this.responsivetab.dropdown.addClass("uk-dropdown-up"),this.responsivetab.lst.on("click.uk.tab","a",function(e){e.preventDefault(),e.stopPropagation();var link=UI.$(this);$this.element.children("li:not(.uk-tab-responsive)").eq(link.data("index")).trigger("click")}),this.on("show.uk.switcher change.uk.tab",function(e,tab){$this.responsivetab.caption.html(tab.text())}),this.element.append(this.responsivetab),this.options.connect&&(this.switcher=UI.switcher(this.element,{toggle:">li:not(.uk-tab-responsive)",connect:this.options.connect,active:this.options.active,animation:this.options.animation,duration:this.options.duration,swiping:this.options.swiping})),UI.dropdown(this.responsivetab,{mode:"click",preventflip:"y"}),$this.trigger("change.uk.tab",[this.element.find(this.options.target).not(".uk-tab-responsive").filter(".uk-active")]),this.check(),UI.$win.on("resize orientationchange",UI.Utils.debounce(function(){$this.element.is(":visible")&&$this.check()},100)),this.on("display.uk.check",function(){$this.element.is(":visible")&&$this.check()})},check:function(){var children=this.element.children("li:not(.uk-tab-responsive)").removeClass("uk-hidden");if(!children.length)return void this.responsivetab.addClass("uk-hidden");var item,link,clone,top=children.eq(0).offset().top+Math.ceil(children.eq(0).height()/2),doresponsive=!1;if(this.responsivetab.lst.empty(),children.each(function(){UI.$(this).offset().top>top&&(doresponsive=!0)}),doresponsive)for(var i=0;i-1?"&":"?","enablejsapi=1&api=1"].join(""))}},check:function(){this.element.css({width:"",height:""}),this.dimension={w:this.element.width(),h:this.element.height()},this.element.attr("width")&&!isNaN(this.element.attr("width"))&&(this.dimension.w=this.element.attr("width")),this.element.attr("height")&&!isNaN(this.element.attr("height"))&&(this.dimension.h=this.element.attr("height")),this.ratio=this.dimension.w/this.dimension.h;var width,height,w=this.parent.width(),h=this.parent.height();w/this.ratio
      ').parent(),$wrapper.attr("aria-expanded","false")),$toggle=$this.toggle.eq(index),$wrapper.data("toggle",$toggle),$wrapper.data("content",$content),$toggle.data("wrapper",$wrapper),$content.data("wrapper",$wrapper)}),this.element.trigger("update.uk.accordion",[this])}}),UI.accordion}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-autocomplete",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var active;return UI.component("autocomplete",{defaults:{minLength:3,param:"search",method:"post",delay:300,loadingClass:"uk-loading",flipDropdown:!1,skipClass:"uk-skip",hoverClass:"uk-active",source:null,renderer:null,template:''},visible:!1,value:null,selected:null,boot:function(){UI.$html.on("focus.autocomplete.uikit","[data-uk-autocomplete]",function(e){var ele=UI.$(this);ele.data("autocomplete")||UI.autocomplete(ele,UI.Utils.options(ele.attr("data-uk-autocomplete")))}),UI.$html.on("click.autocomplete.uikit",function(e){active&&e.target!=active.input[0]&&active.hide()})},init:function(){var $this=this,select=!1,trigger=UI.Utils.debounce(function(e){return select?select=!1:void $this.handle()},this.options.delay);this.dropdown=this.find(".uk-dropdown"),this.template=this.find('script[type="text/autocomplete"]').html(),this.template=UI.Utils.template(this.template||this.options.template),this.input=this.find("input:first").attr("autocomplete","off"),this.dropdown.length||(this.dropdown=UI.$('
      ').appendTo(this.element)),this.options.flipDropdown&&this.dropdown.addClass("uk-dropdown-flip"),this.dropdown.attr("aria-expanded","false"),this.input.on({keydown:function(e){if(e&&e.which&&!e.shiftKey)switch(e.which){case 13:select=!0,$this.selected&&(e.preventDefault(),$this.select());break;case 38:e.preventDefault(),$this.pick("prev",!0);break;case 40:e.preventDefault(),$this.pick("next",!0);break;case 27:case 9:$this.hide()}},keyup:trigger}),this.dropdown.on("click",".uk-autocomplete-results > *",function(){$this.select()}),this.dropdown.on("mouseover",".uk-autocomplete-results > *",function(){$this.pick(UI.$(this))}),this.triggercomplete=trigger},handle:function(){var $this=this,old=this.value;return this.value=this.input.val(),this.value.lengthdpheight||top<0)&&$this.dropdown.scrollTop(scrollTop+top)}},select:function(){if(this.selected){var data=this.selected.data();this.trigger("selectitem.uk.autocomplete",[data,this]),data.value&&this.input.val(data.value).trigger("change"),this.hide()}},show:function(){if(!this.visible)return this.visible=!0,this.element.addClass("uk-open"),active&&active!==this&&active.hide(),active=this,this.dropdown.attr("aria-expanded","true"),this},hide:function(){if(this.visible)return this.visible=!1,this.element.removeClass("uk-open"),active===this&&(active=!1),this.dropdown.attr("aria-expanded","false"),this},request:function(){var $this=this,release=function(data){data&&$this.render(data),$this.element.removeClass($this.options.loadingClass)};if(this.element.addClass(this.options.loadingClass),this.options.source){var source=this.options.source;switch(typeof this.options.source){case"function":this.options.source.apply(this,[release]);break;case"object":if(source.length){var items=[];source.forEach(function(item){item.value&&item.value.toLowerCase().indexOf($this.value.toLowerCase())!=-1&&items.push(item)}),release(items)}break;case"string":var params={};params[this.options.param]=this.value,UI.$.ajax({url:this.options.source,data:params,type:this.options.method,dataType:"json"}).done(function(json){release(json||[])});break;default:release(null)}}else this.element.removeClass($this.options.loadingClass)},render:function(data){return this.dropdown.empty(),this.selected=!1,this.options.renderer?this.options.renderer.apply(this,[data]):data&&data.length&&(this.dropdown.append(this.template({items:data})),this.show(),this.trigger("show.uk.autocomplete")),this}}),UI.autocomplete}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-datepicker",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var dropdown,moment,active=!1;return UI.component("datepicker",{defaults:{mobile:!1,weekstart:1,i18n:{months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},format:"YYYY-MM-DD",offsettop:5,maxDate:!1,minDate:!1,pos:"auto",template:function(data,opts){var i,content="";if(content+='
      ',content+='',content+='',UI.formSelect){var months,years,minYear,maxYear,currentyear=(new Date).getFullYear(),options=[];for(i=0;i'+opts.i18n.months[i]+""):options.push('");for(months=''+opts.i18n.months[data.month]+'",options=[],minYear=data.minDate?data.minDate.year():currentyear-50,maxYear=data.maxDate?data.maxDate.year():currentyear+20,i=minYear;i<=maxYear;i++)i==data.year?options.push('"):options.push('");years=''+data.year+'",content+='
      '+months+" "+years+"
      "}else content+='
      '+opts.i18n.months[data.month]+" "+data.year+"
      ";for(content+="
      ",content+='',content+="",i=0;i"+data.weekdays[i]+"");for(content+="",content+="",i=0;i";for(var d=0;d'+day.day.format("D")+""}content+=""}return content+="",content+="
      "}},boot:function(){UI.$win.on("resize orientationchange",function(){active&&active.hide()}),UI.$html.on("focus.datepicker.uikit","[data-uk-datepicker]",function(e){var ele=UI.$(this);ele.data("datepicker")||(e.preventDefault(),UI.datepicker(ele,UI.Utils.options(ele.attr("data-uk-datepicker"))),ele.trigger("focus"))}),UI.$html.on("click focus","*",function(e){var target=UI.$(e.target);!active||target[0]==dropdown[0]||target.data("datepicker")||target.parents(".uk-datepicker:first").length||active.hide()})},init:function(){if(!UI.support.touch||"date"!=this.element.attr("type")||this.options.mobile){var $this=this;this.current=this.element.val()?moment(this.element.val(),this.options.format):moment(),this.on("click focus",function(){active!==$this&&$this.pick(this.value?this.value:$this.options.minDate?$this.options.minDate:"")}).on("change",function(){$this.element.val()&&!moment($this.element.val(),$this.options.format).isValid()&&$this.element.val(moment().format($this.options.format))}),dropdown||(dropdown=UI.$('
      '),dropdown.on("click",".uk-datepicker-next, .uk-datepicker-previous, [data-date]",function(e){e.stopPropagation(),e.preventDefault();var ele=UI.$(this);return!ele.hasClass("uk-datepicker-date-disabled")&&void(ele.is("[data-date]")?(active.current=moment(ele.data("date")),active.element.val(active.current.format(active.options.format)).trigger("change"),active.hide()):active.add(ele.hasClass("uk-datepicker-next")?1:-1,"months"))}),dropdown.on("change",".update-picker-month, .update-picker-year",function(){var select=UI.$(this);active[select.is(".update-picker-year")?"setYear":"setMonth"](Number(select.val()))}),dropdown.appendTo("body"))}},pick:function(initdate){var offset=this.element.offset(),css={left:offset.left,right:""};this.current=isNaN(initdate)?moment(initdate,this.options.format):moment(),this.initdate=this.current.format("YYYY-MM-DD"),this.update(),"right"==UI.langdirection&&(css.right=window.innerWidth-(css.left+this.element.outerWidth()),css.left="");var posTop=offset.top-this.element.outerHeight()+this.element.height()-this.options.offsettop-dropdown.outerHeight(),posBottom=offset.top+this.element.outerHeight()+this.options.offsettop;css.top=posBottom,"top"==this.options.pos?css.top=posTop:"auto"==this.options.pos&&window.innerHeight-posBottom-dropdown.outerHeight()<0&&posTop>=0&&(css.top=posTop),dropdown.css(css).show(),this.trigger("show.uk.datepicker"),active=this},add:function(unit,value){this.current.add(unit,value),this.update()},setMonth:function(month){this.current.month(month),this.update()},setYear:function(year){this.current.year(year),this.update()},update:function(){var data=this.getRows(this.current.year(),this.current.month()),tpl=this.options.template(data,this.options);dropdown.html(tpl),this.trigger("update.uk.datepicker")},getRows:function(year,month){var opts=this.options,now=moment().format("YYYY-MM-DD"),days=[31,year%4===0&&year%100!==0||year%400===0?29:28,31,30,31,30,31,31,30,31,30,31][month],before=new Date(year,month,1,12).getDay(),data={month:month,year:year,weekdays:[],days:[],maxDate:!1,minDate:!1},row=[];opts.maxDate!==!1&&(data.maxDate=isNaN(opts.maxDate)?moment(opts.maxDate,opts.format):moment().add(opts.maxDate,"days")),opts.minDate!==!1&&(data.minDate=isNaN(opts.minDate)?moment(opts.minDate,opts.format):moment().add(opts.minDate-1,"days")),data.weekdays=function(){for(var i=0,arr=[];i<7;i++){for(var day=i+(opts.weekstart||0);day>=7;)day-=7;arr.push(opts.i18n.weekdays[day])}return arr}(),opts.weekstart&&opts.weekstart>0&&(before-=opts.weekstart,before<0&&(before+=7));for(var cells=days+before,after=cells;after>7;)after-=7;cells+=7-after;for(var day,isDisabled,isSelected,isToday,isInMonth,i=0,r=0;iday||data.maxDate&&day>data.maxDate,isInMonth=!(i=days+before),day=moment(day),isSelected=this.initdate==day.format("YYYY-MM-DD"),isToday=now==day.format("YYYY-MM-DD"),row.push({selected:isSelected,today:isToday,disabled:isDisabled,day:day,inmonth:isInMonth}),7===++r&&(data.days.push(row),row=[],r=0);return data},hide:function(){active&&active===this&&(dropdown.hide(),active=!1,this.trigger("hide.uk.datepicker"))}}),moment=window.moment,UI.Utils.moment=moment,UI.datepicker}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-form-password",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";return UI.component("formPassword",{defaults:{lblShow:"Show",lblHide:"Hide"},boot:function(){UI.$html.on("click.formpassword.uikit","[data-uk-form-password]",function(e){var ele=UI.$(this);ele.data("formPassword")||(e.preventDefault(),UI.formPassword(ele,UI.Utils.options(ele.attr("data-uk-form-password"))),ele.trigger("click"))})},init:function(){var $this=this;this.on("click",function(e){if(e.preventDefault(),$this.input.length){var type=$this.input.attr("type");$this.input.attr("type","text"==type?"password":"text"),$this.element.html($this.options["text"==type?"lblShow":"lblHide"])}}),this.input=this.element.next("input").length?this.element.next("input"):this.element.prev("input"),this.element.html(this.options[this.input.is("[type='password']")?"lblShow":"lblHide"]),this.element.data("formPassword",this)}}),UI.formPassword}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-form-select",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";return UI.component("formSelect",{defaults:{target:">span:first",activeClass:"uk-active"},boot:function(){UI.ready(function(context){UI.$("[data-uk-form-select]",context).each(function(){var ele=UI.$(this);ele.data("formSelect")||UI.formSelect(ele,UI.Utils.options(ele.attr("data-uk-form-select")))})})},init:function(){var $this=this;this.target=this.find(this.options.target),this.select=this.find("select"),this.select.on("change",function(){var select=$this.select[0],fn=function(){try{$this.target.text(select.options[select.selectedIndex].text)}catch(e){}return $this.element[$this.select.val()?"addClass":"removeClass"]($this.options.activeClass),fn};return fn()}()),this.element.data("formSelect",this)}}),UI.formSelect}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-grid",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";function getElementSize(ele){return _getSize(ele)}UI.component("grid",{defaults:{colwidth:"auto",animation:!0,duration:300,gutter:0,controls:!1,filter:!1},boot:function(){UI.ready(function(context){UI.$("[data-uk-grid]",context).each(function(){var ele=UI.$(this);ele.data("grid")||UI.grid(ele,UI.Utils.options(ele.attr("data-uk-grid")))})})},init:function(){var $this=this,gutter=String(this.options.gutter).trim().split(" ");this.gutterv=parseInt(gutter[0],10),this.gutterh=parseInt(gutter[1]||gutter[0],10),this.element.css({position:"relative"}),this.controls=null,this.options.controls&&(this.controls=UI.$(this.options.controls),this.controls.on("click","[data-uk-filter]",function(e){e.preventDefault(),$this.filter(UI.$(this).data("ukFilter"))}),this.controls.on("click","[data-uk-sort]",function(e){e.preventDefault();var cmd=UI.$(this).attr("data-uk-sort").split(":");$this.sort(cmd[0],cmd[1])})),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){$this.currentfilter?$this.filter($this.currentfilter):this.updateLayout()}.bind(this),100)),this.on("display.uk.check",function(){$this.element.is(":visible")&&$this.updateLayout()}),UI.$html.on("changed.uk.dom",function(e){$this.updateLayout()}),this.options.filter!==!1?this.filter(this.options.filter):this.updateLayout()},_prepareElements:function(){var css,children=this.element.children(":not([data-grid-prepared])");children.length&&(css={position:"absolute","box-sizing":"border-box",width:"auto"==this.options.colwidth?"":this.options.colwidth},this.options.gutter&&(css["padding-left"]=this.gutterh,css["padding-bottom"]=this.gutterv,this.element.css("margin-left",this.gutterh*-1)),children.attr("data-grid-prepared","true").css(css))},updateLayout:function(elements){this._prepareElements(),elements=elements||this.element.children(":visible");var item,width,height,pos,i,z,max,size,children=elements,maxwidth=this.element.width()+2*this.gutterh+2,left=0,top=0,positions=[];this.trigger("beforeupdate.uk.grid",[children]),children.each(function(index){for(size=getElementSize(this),item=UI.$(this),width=size.outerWidth,height=size.outerHeight,left=0,top=0,i=0,max=positions.length;i-1&&(infilter=!0)})),elements[infilter?"visible":"hidden"].push(ele)}),elements.hidden=UI.$(elements.hidden).map(function(){return this[0]}),elements.visible=UI.$(elements.visible).map(function(){return this[0]}),elements.hidden.attr("aria-hidden","true").filter(":visible").fadeOut(this.options.duration),elements.visible.attr("aria-hidden","false").filter(":hidden").css("opacity",0).show(),$this.updateLayout(elements.visible),this.controls&&this.controls.length&&this.controls.find("[data-uk-filter]").removeClass("uk-active").filter('[data-uk-filter="'+filter+'"]').addClass("uk-active")},sort:function(by,order){order=order||1,"string"==typeof order&&(order="desc"==order.toLowerCase()?-1:1);var elements=this.element.children();elements.sort(function(a,b){return a=UI.$(a),b=UI.$(b),(b.data(by)||"")<(a.data(by)||"")?order:order*-1}).appendTo(this.element),this.updateLayout(elements.filter(":visible")),this.controls&&this.controls.length&&this.controls.find("[data-uk-sort]").removeClass("uk-active").filter('[data-uk-sort="'+by+":"+(order==-1?"desc":"asc")+'"]').addClass("uk-active")}});var _getSize=function(){function getStyleProperty(propName){if(propName){if("string"==typeof docElemStyle[propName])return propName;propName=propName.charAt(0).toUpperCase()+propName.slice(1);for(var prefixed,i=0,len=prefixes.length;i
      "].join(""),UI.plugin("htmleditor","base",{init:function(editor){function addAction(name,replace,mode){editor.on("action."+name,function(){"html"==editor.getCursorMode()&&editor["replaceLine"==mode?"replaceLine":"replaceSelection"](replace)})}editor.addButtons({fullscreen:{title:"Fullscreen",label:''},bold:{title:"Bold",label:''},italic:{title:"Italic",label:''},strike:{title:"Strikethrough",label:''},blockquote:{title:"Blockquote",label:''},link:{title:"Link",label:''},image:{title:"Image",label:''},listUl:{title:"Unordered List",label:''},listOl:{title:"Ordered List",label:''}}),addAction("bold","$1"),addAction("italic","$1"),addAction("strike","$1"),addAction("blockquote","

      $1

      ","replaceLine"),addAction("link",'$1'),addAction("image",'$1');var listfn=function(){if("html"==editor.getCursorMode()){for(var cm=editor.editor,pos=cm.getDoc().getCursor(!0),posend=cm.getDoc().getCursor(!1),i=pos.line;i"+cm.getLine(i)+"",{line:i,ch:0},{line:i,ch:cm.getLine(i).length});cm.setCursor({line:posend.line,ch:cm.getLine(posend.line).length}),cm.focus()}};editor.on("action.listUl",function(){listfn()}),editor.on("action.listOl",function(){listfn()}),editor.htmleditor.on("click",'a[data-htmleditor-button="fullscreen"]',function(){editor.htmleditor.toggleClass("uk-htmleditor-fullscreen");var wrap=editor.editor.getWrapperElement();if(editor.htmleditor.hasClass("uk-htmleditor-fullscreen"))editor.editor.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:wrap.style.width,height:wrap.style.height},wrap.style.width="",wrap.style.height=editor.content.height()+"px",document.documentElement.style.overflow="hidden";else{document.documentElement.style.overflow="";var info=editor.editor.state.fullScreenRestore;wrap.style.width=info.width,wrap.style.height=info.height,window.scrollTo(info.scrollLeft,info.scrollTop)}setTimeout(function(){editor.fit(),UI.$win.trigger("resize")},50)}),editor.addShortcut(["Ctrl-S","Cmd-S"],function(){editor.element.trigger("htmleditor-save",[editor])}),editor.addShortcutAction("bold",["Ctrl-B","Cmd-B"])}}),UI.plugin("htmleditor","markdown",{init:function(editor){function enableMarkdown(){editor.editor.setOption("mode","gfm"),editor.htmleditor.find(".uk-htmleditor-button-code a").html(editor.options.lblMarkedview)}function addAction(name,replace,mode){editor.on("action."+name,function(){"markdown"==editor.getCursorMode()&&editor["replaceLine"==mode?"replaceLine":"replaceSelection"](replace)})}var parser=editor.options.mdparser||marked||null;parser&&(editor.options.markdown&&enableMarkdown(),addAction("bold","**$1**"),addAction("italic","*$1*"),addAction("strike","~~$1~~"),addAction("blockquote","> $1","replaceLine"),addAction("link","[$1](http://)"),addAction("image","![$1](http://)"),editor.on("action.listUl",function(){if("markdown"==editor.getCursorMode()){for(var cm=editor.editor,pos=cm.getDoc().getCursor(!0),posend=cm.getDoc().getCursor(!1),i=pos.line;i0){var matches,prevline=cm.getLine(pos.line-1);(matches=prevline.match(/^(\d+)\./))&&(prefix=Number(matches[1])+1)}for(var i=pos.line;i','
      ','','
      ','
      ',"
      ",""].join("")).appendTo("body"),modal.dialog=modal.find(".uk-modal-dialog:first"),modal.content=modal.find(".uk-lightbox-content:first"),modal.loader=modal.find(".uk-modal-spinner:first"),modal.closer=modal.find(".uk-close.uk-close-alt"),modal.modal=UI.modal(modal,{modal:!1}),modal.on("swipeRight swipeLeft",function(e){modal.lightbox["swipeLeft"==e.type?"next":"previous"]()}).on("click","[data-lightbox-previous], [data-lightbox-next]",function(e){e.preventDefault(),modal.lightbox[UI.$(this).is("[data-lightbox-next]")?"next":"previous"]()}),modal.on("hide.uk.modal",function(e){modal.content.html("")}),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(e){modal.is(":visible")&&!UI.Utils.isFullscreen()&&modal.lightbox.fitSize()}.bind(this),100)),modal.lightbox=lightbox,modal)}var modal,cache={};return UI.component("lightbox",{defaults:{group:!1,duration:400,keyboard:!0},index:0,items:!1,boot:function(){UI.$html.on("click","[data-uk-lightbox]",function(e){e.preventDefault();var link=UI.$(this);link.data("lightbox")||UI.lightbox(link,UI.Utils.options(link.attr("data-uk-lightbox"))),link.data("lightbox").show(link)}),UI.$doc.on("keyup",function(e){if(modal&&modal.is(":visible")&&modal.lightbox.options.keyboard)switch(e.preventDefault(),e.keyCode){case 37:modal.lightbox.previous();break;case 39:modal.lightbox.next()}})},init:function(){var siblings=[];if(this.index=0,this.siblings=[],this.element&&this.element.length){var domSiblings=this.options.group?UI.$(['[data-uk-lightbox*="'+this.options.group+'"]',"[data-uk-lightbox*='"+this.options.group+"']"].join(",")):this.element;domSiblings.each(function(){var ele=UI.$(this);siblings.push({source:ele.attr("href"),title:ele.attr("data-title")||ele.attr("title"),type:ele.attr("data-lightbox-type")||"auto",link:ele})}),this.index=domSiblings.index(this.element),this.siblings=siblings}else this.options.group&&this.options.group.length&&(this.siblings=this.options.group);this.trigger("lightbox-init",[this])},show:function(index){this.modal=getModal(this),this.modal.dialog.stop(),this.modal.content.stop();var data,item,$this=this,promise=UI.$.Deferred();index=index||0,"object"==typeof index&&this.siblings.forEach(function(s,idx){index[0]===s.link[0]&&(index=idx)}),index<0?index=this.siblings.length-index:this.siblings[index]||(index=0),item=this.siblings[index],data={lightbox:$this,source:item.source,type:item.type,index:index,promise:promise,title:item.title,item:item,meta:{content:"",width:null,height:null}},this.index=index,this.modal.content.empty(),this.modal.is(":visible")||(this.modal.content.css({width:"",height:""}).empty(),this.modal.modal.show()),this.modal.loader.removeClass("uk-hidden"),promise.promise().done(function(){$this.data=data,$this.fitSize(data)}).fail(function(){data.meta.content='
      Loading resource failed!
      ',data.meta.width=400,data.meta.height=300,$this.data=data,$this.fitSize(data)}),$this.trigger("showitem.uk.lightbox",[data])},fitSize:function(){var $this=this,data=this.data,pad=this.modal.dialog.outerWidth()-this.modal.dialog.width(),dpadTop=parseInt(this.modal.dialog.css("margin-top"),10),dpadBot=parseInt(this.modal.dialog.css("margin-bottom"),10),dpad=dpadTop+dpadBot,content=data.meta.content,duration=$this.options.duration;this.siblings.length>1&&(content=[content,'',''].join(""));var maxwidth,maxheight,tmp=UI.$("
       
      ").css({opacity:0,position:"absolute",top:0,left:0,width:"100%","max-width":$this.modal.dialog.css("max-width"),padding:$this.modal.dialog.css("padding"),margin:$this.modal.dialog.css("margin")}),w=data.meta.width,h=data.meta.height;tmp.appendTo("body").width(),maxwidth=tmp.width(),maxheight=window.innerHeight-dpad,tmp.remove(),this.modal.dialog.find(".uk-modal-caption").remove(),data.title&&(this.modal.dialog.append('
      '+data.title+"
      "),maxheight-=this.modal.dialog.find(".uk-modal-caption").outerHeight()),maxwidth',width:width,height:height},data.type="image",data.promise.resolve()};if(cache[data.source])resolve(data.source,cache[data.source].width,cache[data.source].height);else{var img=new Image;img.onerror=function(){data.promise.reject("Loading image failed")},img.onload=function(){cache[data.source]={width:img.width,height:img.height},resolve(data.source,cache[data.source].width,cache[data.source].height)},img.src=data.source}}})}}),UI.plugin("lightbox","youtube",{init:function(lightbox){var youtubeRegExp=/(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,youtubeRegExpShort=/youtu\.be\/(.*)/;lightbox.on("showitem.uk.lightbox",function(e,data){var id,matches,resolve=function(id,width,height){data.meta={content:'',width:width,height:height},data.type="iframe",data.promise.resolve()};if((matches=data.source.match(youtubeRegExp))&&(id=matches[2]),(matches=data.source.match(youtubeRegExpShort))&&(id=matches[1]),id){if(cache[id])resolve(id,cache[id].width,cache[id].height);else{var img=new Image,lowres=!1;img.onerror=function(){cache[id]={width:640,height:320},resolve(id,cache[id].width,cache[id].height)},img.onload=function(){120==img.width&&90==img.height?lowres?(cache[id]={width:640,height:320},resolve(id,cache[id].width,cache[id].height)):(lowres=!0,img.src="//img.youtube.com/vi/"+id+"/0.jpg"):(cache[id]={width:img.width,height:img.height},resolve(id,img.width,img.height))},img.src="//img.youtube.com/vi/"+id+"/maxresdefault.jpg"}e.stopImmediatePropagation()}})}}),UI.plugin("lightbox","vimeo",{init:function(lightbox){var matches,regex=/(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/;lightbox.on("showitem.uk.lightbox",function(e,data){var id,resolve=function(id,width,height){data.meta={content:'',width:width,height:height},data.type="iframe",data.promise.resolve()};(matches=data.source.match(regex))&&(id=matches[2],cache[id]?resolve(id,cache[id].width,cache[id].height):UI.$.ajax({type:"GET",url:"http://vimeo.com/api/oembed.json?url="+encodeURI(data.source),jsonp:"callback",dataType:"jsonp",success:function(data){cache[id]={width:data.width,height:data.height},resolve(id,cache[id].width,cache[id].height)}}),e.stopImmediatePropagation())})}}),UI.plugin("lightbox","video",{init:function(lightbox){lightbox.on("showitem.uk.lightbox",function(e,data){var resolve=function(source,width,height){data.meta={content:'',width:width,height:height},data.type="video",data.promise.resolve()};if("video"==data.type||data.source.match(/\.(mp4|webm|ogv)$/i))if(cache[data.source])resolve(data.source,cache[data.source].width,cache[data.source].height);else var vid=UI.$('').attr("src",data.source).appendTo("body"),idle=setInterval(function(){vid[0].videoWidth&&(clearInterval(idle),cache[data.source]={width:vid[0].videoWidth,height:vid[0].videoHeight},resolve(data.source,cache[data.source].width,cache[data.source].height),vid.remove())},20)})}}),UI.lightbox.create=function(items,options){if(items){var o,group=[];return items.forEach(function(item){group.push(UI.$.extend({source:"",title:"",type:"auto",link:!1},"string"==typeof item?{source:item}:item))}),o=UI.lightbox(UI.$.extend({},options,{group:group}))}},UI.lightbox}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-nestable",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var draggingElement,hasTouch="ontouchstart"in window,html=UI.$html,touchedlists=[],$win=UI.$win,eStart=hasTouch?"touchstart":"mousedown",eMove=hasTouch?"touchmove":"mousemove",eEnd=hasTouch?"touchend":"mouseup",eCancel=hasTouch?"touchcancel":"mouseup";return UI.component("nestable",{defaults:{listBaseClass:"uk-nestable",listClass:"uk-nestable-list",listItemClass:"uk-nestable-item",dragClass:"uk-nestable-dragged",movingClass:"uk-nestable-moving",noChildrenClass:"uk-nestable-nochildren",emptyClass:"uk-nestable-empty",handleClass:"",collapsedClass:"uk-collapsed",placeholderClass:"uk-nestable-placeholder",noDragClass:"uk-nestable-nodrag",group:!1,maxDepth:10,threshold:20,idlethreshold:10},boot:function(){UI.$html.on("mousemove touchmove",function(e){if(draggingElement){var top=draggingElement.offset().top;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingElement.height()/2))}}),UI.ready(function(context){UI.$("[data-uk-nestable]",context).each(function(){var ele=UI.$(this);ele.data("nestable")||UI.nestable(ele,UI.Utils.options(ele.attr("data-uk-nestable")))})})},init:function(){var $this=this;Object.keys(this.options).forEach(function(key){String(key).indexOf("Class")!=-1&&($this.options["_"+key]="."+$this.options[key])}),this.find(this.options._listItemClass).find(">ul").addClass(this.options.listClass),this.checkEmptyList(),this.reset(),this.element.data("nestable-group",this.options.group||UI.Utils.uid("nestable-group")),this.find(this.options._listItemClass).each(function(){$this.setParent(UI.$(this))}),this.on("click","[data-nestable-action]",function(e){if(!$this.dragEl&&(hasTouch||0===e.button)){e.preventDefault();var target=UI.$(e.currentTarget),action=target.data("nestableAction"),item=target.closest($this.options._listItemClass);"collapse"===action&&$this.collapseItem(item),"expand"===action&&$this.expandItem(item),"toggle"===action&&$this.toggleItem(item)}});var onStartEvent=function(e){var handle=UI.$(e.target);e.target!==$this.element[0]&&(handle.is($this.options._noDragClass)||handle.closest($this.options._noDragClass).length||handle.is("[data-nestable-action]")||handle.closest("[data-nestable-action]").length||($this.options.handleClass&&!handle.hasClass($this.options.handleClass)&&$this.options.handleClass&&(handle=handle.closest($this.options._handleClass)),!handle.length||$this.dragEl||!hasTouch&&0!==e.button||hasTouch&&1!==e.touches.length||(e.originalEvent&&e.originalEvent.touches&&(e=evt.originalEvent.touches[0]),$this.delayMove=function(evt){evt.preventDefault(),$this.dragStart(e),$this.trigger("start.uk.nestable",[$this]),$this.delayMove=!1},$this.delayMove.x=parseInt(e.pageX,10),$this.delayMove.y=parseInt(e.pageY,10),$this.delayMove.threshold=$this.options.idlethreshold,e.preventDefault())))},onMoveEvent=function(e){e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),$this.delayMove&&(Math.abs(e.pageX-$this.delayMove.x)>$this.delayMove.threshold||Math.abs(e.pageY-$this.delayMove.y)>$this.delayMove.threshold)&&(window.getSelection().toString()?$this.delayMove=!1:$this.delayMove(e)),$this.dragEl&&(e.preventDefault(),$this.dragMove(e),$this.trigger("move.uk.nestable",[$this]))},onEndEvent=function(e){$this.dragEl&&(e.preventDefault(),$this.dragStop(hasTouch?e.touches[0]:e)),draggingElement=!1,$this.delayMove=!1};hasTouch?(this.element[0].addEventListener(eStart,onStartEvent,!1),window.addEventListener(eMove,onMoveEvent,!1),window.addEventListener(eEnd,onEndEvent,!1),window.addEventListener(eCancel,onEndEvent,!1)):(this.on(eStart,onStartEvent),$win.on(eMove,onMoveEvent),$win.on(eEnd,onEndEvent))},serialize:function(){var data,depth=0,list=this,step=function(level,depth){var array=[],items=level.children(list.options._listItemClass);return items.each(function(){for(var attribute,li=UI.$(this),item={},sub=li.children(list.options._listClass),i=0;i").addClass(this.options.listClass+" "+this.options.dragClass).append(dragItem.clone()),this.dragEl.css("width",dragItem.width()),this.placeEl.addClass(this.options.placeholderClass),draggingElement=this.dragEl,this.tmpDragOnSiblings=[dragItem[0].previousSibling,dragItem[0].nextSibling],UI.$body.append(this.dragEl),this.dragEl.css({left:offset.left,top:offset.top});var i,depth,items=this.dragEl.find(this.options._listItemClass);for(i=0;ithis.dragDepth&&(this.dragDepth=depth);html.addClass(this.options.movingClass)},dragStop:function(e){var el=UI.$(this.placeEl),root=this.placeEl.parents(this.options._listBaseClass+":first");this.placeEl.removeClass(this.options.placeholderClass),this.dragEl.remove(),this.element[0]!==root[0]?(root.trigger("change.uk.nestable",[root.data("nestable"),el,"added"]),this.element.trigger("change.uk.nestable",[this,el,"removed"])):this.element.trigger("change.uk.nestable",[this,el,"moved"]),this.trigger("stop.uk.nestable",[this,el]),this.reset(),html.removeClass(this.options.movingClass)},dragMove:function(e){var list,parent,prev,next,depth,opt=this.options,mouse=this.mouse,maxDepth=this.dragRootEl?this.dragRootEl.data("nestable").options.maxDepth:opt.maxDepth;this.dragEl.css({left:e.pageX-mouse.offsetX,top:e.pageY-mouse.offsetY}),mouse.lastX=mouse.nowX,mouse.lastY=mouse.nowY,mouse.nowX=e.pageX,mouse.nowY=e.pageY,mouse.distX=mouse.nowX-mouse.lastX,mouse.distY=mouse.nowY-mouse.lastY,mouse.lastDirX=mouse.dirX,mouse.lastDirY=mouse.dirY,mouse.dirX=0===mouse.distX?0:mouse.distX>0?1:-1,mouse.dirY=0===mouse.distY?0:mouse.distY>0?1:-1;var newAx=Math.abs(mouse.distX)>Math.abs(mouse.distY)?1:0;if(!mouse.moving)return mouse.dirAx=newAx,void(mouse.moving=!0);if(mouse.dirAx!==newAx?(mouse.distAxX=0,mouse.distAxY=0):(mouse.distAxX+=Math.abs(mouse.distX),0!==mouse.dirX&&mouse.dirX!==mouse.lastDirX&&(mouse.distAxX=0),mouse.distAxY+=Math.abs(mouse.distY),0!==mouse.dirY&&mouse.dirY!==mouse.lastDirY&&(mouse.distAxY=0)),mouse.dirAx=newAx,mouse.dirAx&&mouse.distAxX>=opt.threshold&&(mouse.distAxX=0,prev=this.placeEl.prev("li"),mouse.distX>0&&prev.length&&!prev.hasClass(opt.collapsedClass)&&!prev.hasClass(opt.noChildrenClass)&&(list=prev.find(opt._listClass).last(),depth=this.placeEl.parents(opt._listClass+","+opt._listBaseClass).length,depth+this.dragDepth<=maxDepth&&(list.length?(list=prev.children(opt._listClass).last(),list.append(this.placeEl)):(list=UI.$("
        ").addClass(opt.listClass),list.append(this.placeEl),prev.append(list),this.setParent(prev)))),mouse.distX<0&&(next=this.placeEl.next(opt._listItemClass),!next.length))){var parentUl=this.placeEl.closest([opt._listBaseClass,opt._listClass].join(",")),surroundingLi=parentUl.closest(opt._listItemClass);surroundingLi.length&&(surroundingLi.after(this.placeEl),parentUl.children().length||this.unsetParent(surroundingLi))}var isEmpty=!1,pointX=e.pageX-(window.pageXOffset||document.scrollLeft||0),pointY=e.pageY-(window.pageYOffset||document.documentElement.scrollTop);if(this.pointEl=UI.$(document.elementFromPoint(pointX,pointY)),opt.handleClass&&this.pointEl.hasClass(opt.handleClass))this.pointEl=this.pointEl.closest(opt._listItemClass);else{var nestableitem=this.pointEl.closest(opt._listItemClass);nestableitem.length&&(this.pointEl=nestableitem)}if(!this.placeEl.find(this.pointEl).length){if(this.pointEl.data("nestable")&&!this.pointEl.children().length)isEmpty=!0,this.checkEmptyList(this.pointEl);else if(!this.pointEl.length||!this.pointEl.hasClass(opt.listItemClass))return;var pointElRoot=this.element,tmpRoot=this.pointEl.closest(this.options._listBaseClass),isNewRoot=pointElRoot[0]!=tmpRoot[0];if(!mouse.dirAx||isNewRoot||isEmpty){if(isNewRoot&&opt.group!==tmpRoot.data("nestable-group"))return;if(touchedlists.push(pointElRoot),depth=this.dragDepth-1+this.pointEl.parents(opt._listClass+","+opt._listBaseClass).length,depth>maxDepth)return;var before=e.pageY','',"
        ",""].join("")).data("notifyMessage",this),this.content(this.options.message),this.options.status&&(this.element.addClass("uk-notify-message-"+this.options.status),this.currentstatus=this.options.status),this.group=this.options.group,messages[this.uuid]=this,containers[this.options.pos]||(containers[this.options.pos]=UI.$('
        ').appendTo("body").on("click",".uk-notify-message",function(){var message=UI.$(this).data("notifyMessage");message.element.trigger("manualclose.uk.notify",[message]),message.close()}))};return UI.$.extend(Message.prototype,{uuid:!1,element:!1,timout:!1,currentstatus:"",group:!1,show:function(){if(!this.element.is(":visible")){var $this=this;containers[this.options.pos].show().prepend(this.element);var marginbottom=parseInt(this.element.css("margin-bottom"),10);return this.element.css({opacity:0,"margin-top":-1*this.element.outerHeight(),"margin-bottom":0}).animate({opacity:1,"margin-top":0,"margin-bottom":marginbottom},function(){if($this.options.timeout){var closefn=function(){$this.close()};$this.timeout=setTimeout(closefn,$this.options.timeout),$this.element.hover(function(){clearTimeout($this.timeout)},function(){$this.timeout=setTimeout(closefn,$this.options.timeout)})}}),this}},close:function(instantly){var $this=this,finalize=function(){$this.element.remove(),containers[$this.options.pos].children().length||containers[$this.options.pos].hide(),$this.options.onClose.apply($this,[]),$this.element.trigger("close.uk.notify",[$this]),delete messages[$this.uuid]};this.timeout&&clearTimeout(this.timeout),instantly?finalize():this.element.animate({opacity:0,"margin-top":-1*this.element.outerHeight(),"margin-bottom":0},function(){finalize()})},content:function(html){var container=this.element.find(">div");return html?(container.html(html),this):container.html()},status:function(status){return status?(this.element.removeClass("uk-notify-message-"+this.currentstatus).addClass("uk-notify-message-"+status),this.currentstatus=status,this):this.currentstatus}}),Message.defaults={message:"",status:"",timeout:5e3,group:null,pos:"top-center",onClose:function(){}}, -UI.notify=notify,UI.notify.message=Message,UI.notify.closeAll=closeAll,notify}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-pagination",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";return UI.component("pagination",{defaults:{items:1,itemsOnPage:1,pages:0,displayedPages:7,edges:1,currentPage:0,lblPrev:!1,lblNext:!1,onSelectPage:function(){}},boot:function(){UI.ready(function(context){UI.$("[data-uk-pagination]",context).each(function(){var ele=UI.$(this);ele.data("pagination")||UI.pagination(ele,UI.Utils.options(ele.attr("data-uk-pagination")))})})},init:function(){var $this=this;this.pages=this.options.pages?this.options.pages:Math.ceil(this.options.items/this.options.itemsOnPage)?Math.ceil(this.options.items/this.options.itemsOnPage):1,this.currentPage=this.options.currentPage,this.halfDisplayed=this.options.displayedPages/2,this.on("click","a[data-page]",function(e){e.preventDefault(),$this.selectPage(UI.$(this).data("page"))}),this._render()},_getInterval:function(){return{start:Math.ceil(this.currentPage>this.halfDisplayed?Math.max(Math.min(this.currentPage-this.halfDisplayed,this.pages-this.options.displayedPages),0):0),end:Math.ceil(this.currentPage>this.halfDisplayed?Math.min(this.currentPage+this.halfDisplayed,this.pages):Math.min(this.options.displayedPages,this.pages))}},render:function(pages){this.pages=pages?pages:this.pages,this._render()},selectPage:function(pageIndex,pages){this.currentPage=pageIndex,this.render(pages),this.options.onSelectPage.apply(this,[pageIndex]),this.trigger("select.uk.pagination",[pageIndex,this])},_render:function(){var i,o=this.options,interval=this._getInterval();if(this.element.empty(),o.lblPrev&&this._append(this.currentPage-1,{text:o.lblPrev}),interval.start>0&&o.edges>0){var end=Math.min(o.edges,interval.start);for(i=0;i..."):interval.start-o.edges==1&&this._append(o.edges)}for(i=interval.start;i0){this.pages-o.edges>interval.end&&this.pages-o.edges-interval.end!=1?this.element.append("
      • ...
      • "):this.pages-o.edges-interval.end==1&&this._append(interval.end++);var begin=Math.max(this.pages-o.edges,interval.end);for(i=begin;i'+options.text+"":'
      • '+options.text+"
      • ",this.element.append(item)}}),UI.pagination}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-parallax",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";function initBgImageParallax(obj,prop,opts){var url,element,size,check,ratio,width,height,img=new Image;return element=obj.element.css({"background-size":"cover","background-repeat":"no-repeat"}),url=element.css("background-image").replace(/^url\(/g,"").replace(/\)$/g,"").replace(/("|')/g,""),check=function(){var w=element.innerWidth(),h=element.innerHeight(),extra="bg"==prop?opts.diff:opts.diff/100*h;return h+=extra,w+=Math.ceil(extra*ratio),w-extrawindow.innerHeight&&(width=1.2*width,height=1.2*height)):(width=w,height=Math.ceil(w/ratio)),void element.css({"background-size":width+"px "+height+"px"}).data("bgsize",{w:width,h:height}))},img.onerror=function(){},img.onload=function(){size={w:img.width,h:img.height},ratio=img.width/img.height,UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){check()},50)),check()},img.src=url,!0}function calcColor(start,end,pos){return start=parseColor(start),end=parseColor(end),pos=pos||0,calculateColor(start,end,pos)}function calculateColor(begin,end,pos){var color="rgba("+parseInt(begin[0]+pos*(end[0]-begin[0]),10)+","+parseInt(begin[1]+pos*(end[1]-begin[1]),10)+","+parseInt(begin[2]+pos*(end[2]-begin[2]),10)+","+(begin&&end?parseFloat(begin[3]+pos*(end[3]-begin[3])):1);return color+=")"}function parseColor(color){var match,quadruplet;return quadruplet=(match=/#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/.exec(color))?[parseInt(match[1],16),parseInt(match[2],16),parseInt(match[3],16),1]:(match=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/.exec(color))?[17*parseInt(match[1],16),17*parseInt(match[2],16),17*parseInt(match[3],16),1]:(match=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))?[parseInt(match[1]),parseInt(match[2]),parseInt(match[3]),1]:(match=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9\.]*)\s*\)/.exec(color))?[parseInt(match[1],10),parseInt(match[2],10),parseInt(match[3],10),parseFloat(match[4])]:colors[color]||[255,255,255,0]}var parallaxes=[],supports3d=!1,scrolltop=0,wh=window.innerHeight,checkParallaxes=function(){scrolltop=UI.$win.scrollTop(),window.requestAnimationFrame(function(){for(var i=0;i0&&"none"!==has3d}(),UI.$doc.on("scrolling.uk.document",checkParallaxes),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){wh=window.innerHeight,checkParallaxes()},50)),UI.ready(function(context){UI.$("[data-uk-parallax]",context).each(function(){var parallax=UI.$(this);parallax.data("parallax")||UI.parallax(parallax,UI.Utils.options(parallax.attr("data-uk-parallax")))})})},init:function(){this.base=this.options.target?UI.$(this.options.target):this.element,this.props={},this.velocity=this.options.velocity||1;var reserved=["target","velocity","viewport","plugins","media"];Object.keys(this.options).forEach(function(prop){if(reserved.indexOf(prop)===-1){var start,end,dir,diff,startend=String(this.options[prop]).split(",");prop.match(/color/i)?(start=startend[1]?startend[0]:this._getStartValue(prop),end=startend[1]?startend[1]:startend[0],start||(start="rgba(255,255,255,0)")):(start=parseFloat(startend[1]?startend[0]:this._getStartValue(prop)),end=parseFloat(startend[1]?startend[1]:startend[0]),diff=startscrolltop+wh?percent=0:top+height1&&(compercent=1),void 0!==this._percent&&this._percent==compercent||(Object.keys(this.props).forEach(function(prop){switch(opts=this.props[prop],0===percent?val=opts.start:1===percent?val=opts.end:void 0!==opts.diff&&(val=opts.start+opts.diff*compercent*opts.dir),"bg"!=prop&&"bgp"!=prop||this._bgcover||(this._bgcover=initBgImageParallax(this,prop,opts)),prop){case"x":css.transform+=supports3d?" translate3d("+val+"px, 0, 0)":" translateX("+val+"px)";break;case"xp":css.transform+=supports3d?" translate3d("+val+"%, 0, 0)":" translateX("+val+"%)";break;case"y":css.transform+=supports3d?" translate3d(0, "+val+"px, 0)":" translateY("+val+"px)";break;case"yp":css.transform+=supports3d?" translate3d(0, "+val+"%, 0)":" translateY("+val+"%)";break;case"rotate":css.transform+=" rotate("+val+"deg)";break;case"scale":css.transform+=" scale("+val+")";break;case"bg":css["background-position"]="50% "+val+"px";break;case"bgp":css["background-position"]="50% "+val+"%";break;case"color":case"background-color":case"border-color":css[prop]=calcColor(opts.start,opts.end,compercent);break;default:css[prop]=val}}.bind(this)),this.element.css(css),this._percent=compercent)},_getStartValue:function(prop){var value=0;switch(prop){case"scale":value=1;break;default:value=this.element.css(prop)}return value||0}});var colors={black:[0,0,0,1],blue:[0,0,255,1],brown:[165,42,42,1],cyan:[0,255,255,1],fuchsia:[255,0,255,1],gold:[255,215,0,1],green:[0,128,0,1],indigo:[75,0,130,1],khaki:[240,230,140,1],lime:[0,255,0,1],magenta:[255,0,255,1],maroon:[128,0,0,1],navy:[0,0,128,1],olive:[128,128,0,1],orange:[255,165,0,1],pink:[255,192,203,1],purple:[128,0,128,1],violet:[128,0,128,1],red:[255,0,0,1],silver:[192,192,192,1],white:[255,255,255,1],yellow:[255,255,0,1],transparent:[255,255,255,0]};return UI.parallax}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-grid-parallax",["uikit"],function(){return component||addon(UIkit)})}(function(UI){function getcolumns(element){for(var children=element.children(),first=children.filter(":visible:first"),top=first[0].offsetTop+first.outerHeight(),column=0;column=top);column++);return column||1}function percentageInViewport(element){var distance,percentage,percent,top=element.offset().top,height=element.outerHeight(),scrolltop=UIkit.$win.scrollTop(),wh=window.innerHeight;return top>scrolltop+wh?percent=0:top+height1?1:percent}var parallaxes=[],checkParallaxes=function(){requestAnimationFrame(function(){for(var i=0;i1&&$this.element.css("margin-bottom",$this.options.translate+parseInt($this.element.css("margin-bottom")))};return UI.$(function(){fn()}),UI.Utils.debounce(fn,50)}())},initItems:function(){var smooth=this.options.smooth;return this.items=(this.options.target?this.element.find(this.options.target):this.element.children()).each(function(){UI.$(this).css({transition:"transform "+smooth+"ms linear",transform:""})}),this},process:function(){var percent=percentageInViewport(this.element),columns=getcolumns(this.element),items=this.items,mods=[columns-1];if(1==columns||!percent)return void items.css("transform","");for(;mods.length {{#msgResultsHeader}}
      • {{msgResultsHeader}}
      • {{/msgResultsHeader}} {{#items && items.length}} {{~items}}
      • {{{$item.title}}} {{#$item.text}}
        {{{$item.text}}}
        {{/$item.text}}
      • {{/items}} {{#msgMoreResults}}
      • {{msgMoreResults}}
      • {{/msgMoreResults}} {{/end}} {{^items.length}} {{#msgNoResults}}
      • {{msgNoResults}}
      • {{/msgNoResults}} {{/end}}
      ',renderer:function(data){var opts=this.options;this.dropdown.append(this.template({items:data.results||[],msgResultsHeader:opts.msgResultsHeader,msgMoreResults:opts.msgMoreResults,msgNoResults:opts.msgNoResults})),this.show()}},boot:function(){UI.$html.on("focus.search.uikit","[data-uk-search]",function(e){var ele=UI.$(this);ele.data("search")||UI.search(ele,UI.Utils.options(ele.attr("data-uk-search")))})},init:function(){var $this=this;this.autocomplete=UI.autocomplete(this.element,this.options),this.autocomplete.dropdown.addClass("uk-dropdown-search"),this.autocomplete.input.on("keyup",function(){$this.element[$this.autocomplete.input.val()?"addClass":"removeClass"]("uk-active")}).closest("form").on("reset",function(){$this.value="",$this.element.removeClass("uk-active")}),this.on("selectitem.uk.autocomplete",function(e,data){data.url?location.href=data.url:data.moreresults&&$this.autocomplete.input.closest("form").submit()}),this.element.data("search",this)}})}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-slider",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var dragging,delayIdle,anchor,dragged,store={};return UI.component("slider",{defaults:{center:!1,threshold:10,infinite:!0,autoplay:!1,autoplayInterval:7e3,pauseOnHover:!0,activecls:"uk-active"},boot:function(){UI.ready(function(context){setTimeout(function(){UI.$("[data-uk-slider]",context).each(function(){var ele=UI.$(this);ele.data("slider")||UI.slider(ele,UI.Utils.options(ele.attr("data-uk-slider")))})},0)})},init:function(){var $this=this;this.container=this.element.find(".uk-slider"),this.focus=0,UI.$win.on("resize load",UI.Utils.debounce(function(){$this.resize(!0)},100)),this.on("click.uk.slider","[data-uk-slider-item]",function(e){e.preventDefault();var item=UI.$(this).attr("data-uk-slider-item");if($this.focus!=item)switch($this.stop(),item){case"next":case"previous":$this["next"==item?"next":"previous"]();break;default:$this.updateFocus(parseInt(item,10))}}),this.container.on({"touchstart mousedown":function(evt){evt.originalEvent&&evt.originalEvent.touches&&(evt=evt.originalEvent.touches[0]),evt.button&&2==evt.button||!$this.active||($this.stop(),anchor=UI.$(evt.target).is("a")?UI.$(evt.target):UI.$(evt.target).parents("a:first"),dragged=!1,anchor.length&&anchor.one("click",function(e){dragged&&e.preventDefault()}),delayIdle=function(e){dragged=!0,dragging=$this,store={touchx:parseInt(e.pageX,10),dir:1,focus:$this.focus,base:$this.options.center?"center":"area"},e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),dragging.element.data({"pointer-start":{x:parseInt(e.pageX,10),y:parseInt(e.pageY,10)},"pointer-pos-start":$this.pos}),$this.container.addClass("uk-drag"),delayIdle=!1},delayIdle.x=parseInt(evt.pageX,10),delayIdle.threshold=$this.options.threshold)},mouseenter:function(){$this.options.pauseOnHover&&($this.hovering=!0)},mouseleave:function(){$this.hovering=!1}}),this.resize(!0),this.on("display.uk.check",function(){$this.element.is(":visible")&&$this.resize(!0)}),this.element.find("a,img").attr("draggable","false"),this.options.autoplay&&this.start()},resize:function(focus){var item,width,cwidth,size,$this=this,pos=0,maxheight=0;return this.items=this.container.children().filter(":visible"),this.vp=this.element[0].getBoundingClientRect().width,this.container.css({"min-width":"","min-height":""}),this.items.each(function(idx){item=UI.$(this),size=item.css({left:"",width:""})[0].getBoundingClientRect(),width=size.width,cwidth=item.width(),maxheight=Math.max(maxheight,size.height),item.css({left:pos,width:width}).data({idx:idx,left:pos,width:width,cwidth:cwidth,area:pos+width,center:pos-($this.vp/2-cwidth/2)}),pos+=width}),this.container.css({"min-width":pos,"min-height":maxheight}),this.options.infinite&&(pos<=2*this.vp||this.items.length<5)&&!this.itemsResized?(this.container.children().each(function(idx){$this.container.append($this.items.eq(idx).clone(!0).attr("id",""))}).each(function(idx){$this.container.append($this.items.eq(idx).clone(!0).attr("id",""))}),this.itemsResized=!0,this.resize()):(this.cw=pos,this.pos=0,this.active=pos>=this.vp,this.container.css({"-ms-transform":"","-webkit-transform":"",transform:""}),void(focus&&this.updateFocus(this.focus)))},updatePos:function(pos){this.pos=pos,this.container.css({"-ms-transform":"translateX("+pos+"px)","-webkit-transform":"translateX("+pos+"px)",transform:"translateX("+pos+"px)"})},updateFocus:function(idx,dir){if(this.active){dir=dir||(idx>this.focus?1:-1);var area,i,item=this.items.eq(idx);if(this.options.infinite&&this.infinite(idx,dir),this.options.center)this.updatePos(item.data("center")*-1),this.items.filter("."+this.options.activecls).removeClass(this.options.activecls),item.addClass(this.options.activecls);else if(this.options.infinite)this.updatePos(item.data("left")*-1);else{for(area=0,i=idx;ithis.vp)this.updatePos(item.data("left")*-1);else if(1==dir){for(area=0,i=this.items.length-1;i>=0;i--){if(area+=this.items.eq(i).data("width"),area==this.vp){idx=i;break}if(area>this.vp){idx=ithis.vp?this.updatePos((this.container.width()-this.vp)*-1):this.updatePos(this.items.eq(idx).data("left")*-1)}}var left=this.items.eq(idx).data("left");this.items.removeClass("uk-slide-before uk-slide-after").each(function(i){i!==idx&&UI.$(this).addClass(UI.$(this).data("left")this.vp));i++)z=z+1==this.items.length?0:z+1;move.length&&move.forEach(function(itm){var left=item.data("area");itm.css({left:left}).data({left:left,area:left+itm.data("width"),center:left-($this.vp/2-itm.data("cwidth")/2)}),item=itm})}else{for(i=this.items.length-1;i>-1&&(area+=this.items.eq(z).data("width"),z!=baseidx&&move.push(this.items.eq(z)),!(area>this.vp));i--)z=z-1==-1?this.items.length-1:z-1;move.length&&move.forEach(function(itm){var left=item.data("left")-itm.data("width");itm.css({left:left}).data({left:left,area:left+itm.data("width"),center:left-($this.vp/2-itm.data("cwidth")/2)}),item=itm})}}}),UI.$doc.on("mousemove.uk.slider touchmove.uk.slider",function(e){if(e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),delayIdle&&Math.abs(e.pageX-delayIdle.x)>delayIdle.threshold&&(window.getSelection().toString()?dragging=delayIdle=!1:delayIdle(e)),dragging){var x,xDiff,pos,dir,focus,item,diff,i,z,itm;if(e.clientX||e.clientY?x=e.clientX:(e.pageX||e.pageY)&&(x=e.pageX-document.body.scrollLeft-document.documentElement.scrollLeft),focus=store.focus,xDiff=x-dragging.element.data("pointer-start").x,pos=dragging.element.data("pointer-pos-start")+xDiff,dir=x>dragging.element.data("pointer-start").x?-1:1,item=dragging.items.eq(store.focus),1==dir)for(diff=item.data("left")+Math.abs(xDiff),i=0,z=store.focus;idiff){focus=z;break}z=z+1==dragging.items.length?0:z+1}else for(diff=item.data("left")-Math.abs(xDiff),i=0,z=store.focus;istore.diff){focus=z;break}z=z+1==dragging.items.length?0:z+1}else for(i=0,z=store.focus;i').css({"background-image":"url("+media.attr("src")+")"});media.attr("width")&&media.attr("height")&&(placeholder=UI.$("").attr({width:media.attr("width"),height:media.attr("height")}),media.replaceWith(placeholder),media=placeholder,placeholder=void 0),media.css({width:"100%",height:"auto",opacity:0}),slide.prepend(cover).data("cover",cover);break;case"IFRAME":var src=media[0].src,iframeId="sw-"+ ++playerId;media.attr("src","").on("load",function(){if((index!==$this.current||index==$this.current&&!$this.options.videoautoplay)&&$this.pausemedia(media),$this.options.videomute){$this.mutemedia(media);var inv=setInterval(function(ic){return function(){$this.mutemedia(media),++ic>=4&&clearInterval(inv)}}(0),250)}}).data("slideshow",$this).attr("data-player-id",iframeId).attr("src",[src,src.indexOf("?")>-1?"&":"?","enablejsapi=1&api=1&player_id="+iframeId].join("")).addClass("uk-position-absolute"),UI.support.touch||media.css("pointer-events","none"),placeholder=!0,UI.cover&&(UI.cover(media),media.attr("data-uk-cover","{}"));break;case"VIDEO":media.addClass("uk-cover-object uk-position-absolute"),placeholder=!0,$this.options.videomute&&$this.mutemedia(media)}if(placeholder){canvas=UI.$("").attr({width:media[0].width,height:media[0].height});var img=UI.$('').attr("src",canvas[0].toDataURL());slide.prepend(img),slide.data("sizer",img)}}else slide.data("sizer",slide);$this.hasKenBurns(slide)&&slide.data("cover").css({"-webkit-animation-duration":kbanimduration,"animation-duration":kbanimduration})}),this.on("click.uk.slideshow","[data-uk-slideshow-item]",function(e){e.preventDefault();var slide=UI.$(this).attr("data-uk-slideshow-item");if($this.current!=slide){switch(slide){case"next":case"previous":$this["next"==slide?"next":"previous"]();break;default:$this.show(parseInt(slide,10))}$this.stop()}}),this.slides.attr("aria-hidden","true").eq(this.current).addClass("uk-active").attr("aria-hidden","false"),this.triggers.filter('[data-uk-slideshow-item="'+this.current+'"]').addClass("uk-active"),UI.$win.on("resize load",UI.Utils.debounce(function(){$this.resize(),$this.fixFullscreen&&($this.container.css("height",window.innerHeight),$this.slides.css("height",window.innerHeight))},100)),setTimeout(function(){$this.resize()},80),this.options.autoplay&&this.start(),this.options.videoautoplay&&this.slides.eq(this.current).data("media")&&this.playmedia(this.slides.eq(this.current).data("media")),this.options.kenburns&&this.applyKenBurns(this.slides.eq(this.current)),this.container.on({mouseenter:function(){$this.options.pauseOnHover&&($this.hovering=!0)},mouseleave:function(){$this.hovering=!1}}),this.on("swipeRight swipeLeft",function(e){$this["swipeLeft"==e.type?"next":"previous"]()}),this.on("display.uk.check",function(){$this.element.is(":visible")&&($this.resize(),$this.fixFullscreen&&($this.container.css("height",window.innerHeight),$this.slides.css("height",window.innerHeight)))})},resize:function(){if(!this.container.hasClass("uk-slideshow-fullscreen")){var height=this.options.height;"auto"===this.options.height&&(height=0,this.slides.css("height","").each(function(){height=Math.max(height,UI.$(this).height())})),this.container.css("height",height),this.slides.css("height",height)}},show:function(index,direction){if(!this.animating&&this.current!=index){this.animating=!0;var $this=this,current=this.slides.eq(this.current),next=this.slides.eq(index),dir=direction?direction:this.current-1&&"ready"==data.event&&data.player_id&&(iframe=UI.$('[data-player-id="'+data.player_id+'"]'),iframe.length&&iframe.data("slideshow").mutemedia(iframe))},!1)}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-slideshow-fx",["uikit","uikit-slideshow"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var Animations=UI.slideshow.animations;UI.$.extend(UI.slideshow.animations,{slice:function(current,next,dir,fromfx){if(!current.data("cover"))return Animations.fade.apply(this,arguments);for(var bar,d=UI.$.Deferred(),sliceWidth=Math.ceil(this.element.width()/this.options.slices),bgimage=next.data("cover").css("background-image"),ghost=UI.$("
    • ").css({top:0,left:0,width:this.container.width(),height:this.container.height(),opacity:1,zIndex:15}),ghostWidth=ghost.width(),ghostHeight=ghost.height(),pos="slice-up"==fromfx?ghostHeight:"0",i=0;i').css({position:"absolute",top:0,left:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,clip:clipfrom,opacity:0,transition:"all "+this.options.duration+"ms ease-in-out "+60*i+"ms","-webkit-transition":"all "+this.options.duration+"ms ease-in-out "+60*i+"ms"}).data("clip",clipto),ghost.append(bar)}return this.container.append(ghost),ghost.children().last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),ghost.children().each(function(){var bar=UI.$(this);bar.css({clip:bar.data("clip"),opacity:1})}),d.promise()},"slice-up":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-up"])},"slice-down":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-down"])},"slice-up-down":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-up-down"])},fold:function(current,next,dir){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var bar,d=UI.$.Deferred(),sliceWidth=Math.ceil(this.element.width()/this.options.slices),bgimage=next.data("cover").css("background-image"),ghost=UI.$("
    • ").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),i=0;i').css({position:"absolute",top:0,left:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,"transform-origin":sliceWidth*i+"px 0 0",clip:"rect(0px, "+sliceWidth*(i+1)+"px, "+ghostHeight+"px, "+sliceWidth*i+"px)",opacity:0,transform:"scaleX(0.000001)",transition:"all "+this.options.duration+"ms ease-in-out "+(100+60*i)+"ms","-webkit-transition":"all "+this.options.duration+"ms ease-in-out "+(100+60*i)+"ms"}),ghost.prepend(bar);return this.container.append(ghost),ghost.width(),ghost.children().first().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}).end().css({transform:"scaleX(1)",opacity:1}),d.promise()},puzzle:function(current,next,dir){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var box,rect,width,d=UI.$.Deferred(),$this=this,boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data("cover").css("background-image"),ghost=UI.$("
    • ").css({width:this.container.width(),height:this.container.height(),opacity:1,zIndex:15}),ghostWidth=this.container.width(),ghostHeight=this.container.height(),rows=0;rows').css({position:"absolute",top:0,left:0,opacity:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,clip:"rect("+rect.join(",")+")","-webkit-transform":"translateZ(0)",transform:"translateZ(0)"}),ghost.append(box);this.container.append(ghost);var boxes=shuffle(ghost.children());return boxes.each(function(i){UI.$(this).css({transition:"all "+$this.options.duration+"ms ease-in-out "+(50+25*i)+"ms","-webkit-transition":"all "+$this.options.duration+"ms ease-in-out "+(50+25*i)+"ms"})}).last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),boxes.css({opacity:1}),d.promise()},boxes:function(current,next,dir,fromfx){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var box,rect,width,cols,d=UI.$.Deferred(),boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data("cover").css("background-image"),ghost=UI.$("
    • ").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),rows=0;rows').css({position:"absolute",top:0,left:0,opacity:1,width:ghostWidth,height:ghostHeight,"background-image":bgimage,"transform-origin":rect[3]+" "+rect[0]+" 0",clip:"rect("+rect.join(",")+")","-webkit-transform":"scale(0.0000000000000001)",transform:"scale(0.0000000000000001)"}),ghost.append(box);this.container.append(ghost);var prevCol,rowIndex=0,colIndex=0,timeBuff=0,box2Darr=[[]],boxes=ghost.children();for("boxes-reverse"==fromfx&&(boxes=[].reverse.apply(boxes)),boxes.each(function(){box2Darr[rowIndex][colIndex]=UI.$(this),colIndex++,colIndex==boxCols&&(rowIndex++,colIndex=0,box2Darr[rowIndex]=[])}),cols=0,prevCol=0;cols=0&&prevColdelayIdle.threshold||Math.abs(src.pageY-delayIdle.pos.y)>delayIdle.threshold)&&delayIdle.apply(src)}if(draggingPlaceholder){moving||(moving=!0,draggingPlaceholder.show(),draggingPlaceholder.$current.addClass(draggingPlaceholder.$sortable.options.placeholderClass),draggingPlaceholder.$sortable.element.children().addClass(draggingPlaceholder.$sortable.options.childClass),UI.$html.addClass(draggingPlaceholder.$sortable.options.dragMovingClass));var offset=draggingPlaceholder.data("mouse-offset"),left=parseInt(e.originalEvent.pageX,10)+offset.left,top=parseInt(e.originalEvent.pageY,10)+offset.top;if(draggingPlaceholder.css({left:left,top:top}),top+draggingPlaceholder.height()/3>document.body.offsetHeight)return;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingPlaceholder.height()/3))}}),UI.$html.on("mouseup touchend",function(e){if(delayIdle=clickedlink=!1,!currentlyDraggingElement||!draggingPlaceholder)return void(currentlyDraggingElement=draggingPlaceholder=null);var sortable=closestSortable(currentlyDraggingElement),component=draggingPlaceholder.$sortable,ev={type:e.type};sortable[0]&&component.dragDrop(ev,component.element),component.dragEnd(ev,component.element)})},init:function(){function addDragHandlers(){supportsTouch?element.addEventListener("touchmove",handleTouchMove,!1):(element.addEventListener("mouseover",handleDragEnter,!1),element.addEventListener("mouseout",handleDragLeave,!1))}function removeDragHandlers(){supportsTouch?element.removeEventListener("touchmove",handleTouchMove,!1):(element.removeEventListener("mouseover",handleDragEnter,!1),element.removeEventListener("mouseout",handleDragLeave,!1))}function handleDragMove(e){currentlyDraggingElement&&$this.dragMove(e,$this)}function delegate(fn){return function(e){var touch,target,context;e&&(touch=supportsTouch&&e.touches&&e.touches[0]||{},target=touch.target||e.target,supportsTouch&&document.elementFromPoint&&(target=document.elementFromPoint(e.pageX-document.body.scrollLeft,e.pageY-document.body.scrollTop)),overElement=UI.$(target)),UI.$(target).hasClass($this.options.childClass)?fn.apply(target,[e]):target!==element&&(context=moveUpToChildNode(element,target),context&&fn.apply(context,[e]))}}var $this=this,element=this.element[0];touchedlists=[],this.checkEmptyList(),this.element.data("sortable-group",this.options.group?this.options.group:UI.Utils.uid("sortable-group"));var handleDragStart=delegate(function(e){if(!e.data||!e.data.sortable){var $target=UI.$(e.target),$link=$target.is("a[href]")?$target:$target.parents("a[href]");if(!$target.is(":input"))return e.preventDefault(),!supportsTouch&&$link.length&&$link.one("click",function(e){e.preventDefault()}).one("mouseup",function(){moved||$link.trigger("click")}),e.data=e.data||{},e.data.sortable=element,$this.dragStart(e,this)}}),handleDragEnter=delegate(UI.Utils.debounce(function(e){return $this.dragEnter(e,this)}),40),handleDragLeave=delegate(function(e){var previousCounter=$this.dragenterData(this);$this.dragenterData(this,previousCounter-1),$this.dragenterData(this)||(UI.$(this).removeClass($this.options.overClass),$this.dragenterData(this,!1))}),handleTouchMove=delegate(function(e){return!currentlyDraggingElement||currentlyDraggingElement===this||currentlyDraggingTarget===this||($this.element.children().removeClass($this.options.overClass),currentlyDraggingTarget=this,$this.moveElementNextTo(currentlyDraggingElement,this),prevent(e))});this.addDragHandlers=addDragHandlers,this.removeDragHandlers=removeDragHandlers,window.addEventListener(supportsTouch?"touchmove":"mousemove",handleDragMove,!1),element.addEventListener(supportsTouch?"touchstart":"mousedown",handleDragStart,!1)},dragStart:function(e,elem){moved=!1,moving=!1,dragging=!1;var $this=this,target=UI.$(e.target);if(supportsTouch||2!=e.button){if($this.options.handleClass){var handle=target.hasClass($this.options.handleClass)?target:target.closest("."+$this.options.handleClass,$this.element);if(!handle.length)return}if(!target.is("."+$this.options.noDragClass)&&!target.closest("."+$this.options.noDragClass).length&&!target.is(":input")){currentlyDraggingElement=elem,draggingPlaceholder&&draggingPlaceholder.remove();var $current=UI.$(currentlyDraggingElement),offset=$current.offset();delayIdle={pos:{x:e.pageX,y:e.pageY},threshold:$this.options.threshold,apply:function(evt){draggingPlaceholder=UI.$('
      ').css({display:"none",top:offset.top,left:offset.left,width:$current.width(),height:$current.height(),padding:$current.css("padding")}).data({"mouse-offset":{left:offset.left-parseInt(evt.pageX,10),top:offset.top-parseInt(evt.pageY,10)},origin:$this.element,index:$current.index()}).append($current.html()).appendTo("body"),draggingPlaceholder.$current=$current,draggingPlaceholder.$sortable=$this,$current.data({"start-list":$current.parent(),"start-index":$current.index(),"sortable-group":$this.options.group}),$this.addDragHandlers(),$this.options.start(this,currentlyDraggingElement),$this.trigger("start.uk.sortable",[$this,currentlyDraggingElement]),moved=!0,delayIdle=!1}}}}},dragMove:function(e,elem){overElement=UI.$(document.elementFromPoint(e.pageX-(document.body.scrollLeft||document.scrollLeft||0),e.pageY-(document.body.scrollTop||document.documentElement.scrollTop||0)));var overChild,overRoot=overElement.closest("."+this.options.baseClass),groupOver=overRoot.data("sortable-group"),$current=UI.$(currentlyDraggingElement),currentRoot=$current.parent(),groupCurrent=$current.data("sortable-group");overRoot[0]!==currentRoot[0]&&void 0!==groupCurrent&&groupOver===groupCurrent&&(overRoot.data("sortable").addDragHandlers(),touchedlists.push(overRoot),overRoot.children().addClass(this.options.childClass),overRoot.children().length>0?(overChild=overElement.closest("."+this.options.childClass),overChild.length?overChild.before($current):overRoot.append($current)):overElement.append($current),UIkit.$doc.trigger("mouseover")),this.checkEmptyList(),this.checkEmptyList(currentRoot)},dragEnter:function(e,elem){if(!currentlyDraggingElement||currentlyDraggingElement===elem)return!0;var previousCounter=this.dragenterData(elem);if(this.dragenterData(elem,previousCounter+1),0===previousCounter){var currentlist=UI.$(elem).parent(),startlist=UI.$(currentlyDraggingElement).data("start-list");if(currentlist[0]!==startlist[0]){var groupOver=currentlist.data("sortable-group"),groupCurrent=UI.$(currentlyDraggingElement).data("sortable-group");if((groupOver||groupCurrent)&&groupOver!=groupCurrent)return!1}UI.$(elem).addClass(this.options.overClass),this.moveElementNextTo(currentlyDraggingElement,elem)}return!1},dragEnd:function(e,elem){var $this=this;currentlyDraggingElement&&(this.options.stop(elem),this.trigger("stop.uk.sortable",[this])),currentlyDraggingElement=null,currentlyDraggingTarget=null,touchedlists.push(this.element),touchedlists.forEach(function(el,i){UI.$(el).children().each(function(){1===this.nodeType&&(UI.$(this).removeClass($this.options.overClass).removeClass($this.options.placeholderClass).removeClass($this.options.childClass),$this.dragenterData(this,!1))})}),touchedlists=[],UI.$html.removeClass(this.options.dragMovingClass),this.removeDragHandlers(),draggingPlaceholder&&(draggingPlaceholder.remove(),draggingPlaceholder=null)},dragDrop:function(e,elem){"drop"===e.type&&(e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault()),this.triggerChangeEvents()},triggerChangeEvents:function(){if(currentlyDraggingElement){var $current=UI.$(currentlyDraggingElement),oldRoot=draggingPlaceholder.data("origin"),newRoot=$current.closest("."+this.options.baseClass),triggers=[],el=UI.$(currentlyDraggingElement);oldRoot[0]===newRoot[0]&&draggingPlaceholder.data("index")!=$current.index()?triggers.push({sortable:this,mode:"moved"}):oldRoot[0]!=newRoot[0]&&triggers.push({sortable:UI.$(newRoot).data("sortable"),mode:"added"},{sortable:UI.$(oldRoot).data("sortable"),mode:"removed"}),triggers.forEach(function(trigger,i){trigger.sortable&&trigger.sortable.element.trigger("change.uk.sortable",[trigger.sortable,el,trigger.mode])})}},dragenterData:function(element,val){return element=UI.$(element),1==arguments.length?parseInt(element.data("child-dragenter"),10)||0:void(val?element.data("child-dragenter",Math.max(0,val)):element.removeData("child-dragenter"))},moveElementNextTo:function(element,elementToMoveNextTo){dragging=!0;var $this=this,list=UI.$(element).parent().css("min-height",""),next=isBelow(element,elementToMoveNextTo)?elementToMoveNextTo:elementToMoveNextTo.nextSibling,children=list.children(),count=children.length;return $this.options.animation?(list.css("min-height",list.height()),children.stop().each(function(){var ele=UI.$(this),offset=ele.position();offset.width=ele.width(),ele.data("offset-before",offset)}),elementToMoveNextTo.parentNode.insertBefore(element,next),UI.Utils.checkDisplay($this.element.parent()),children=list.children().each(function(){var ele=UI.$(this);ele.data("offset-after",ele.position())}).each(function(){var ele=UI.$(this),before=ele.data("offset-before");ele.css({position:"absolute",top:before.top,left:before.left,"min-width":before.width})}),void children.each(function(){var ele=UI.$(this),offset=(ele.data("offset-before"),ele.data("offset-after"));ele.css("pointer-events","none").width(),setTimeout(function(){ele.animate({top:offset.top,left:offset.left},$this.options.animation,function(){ele.css({position:"",top:"",left:"","min-width":"","pointer-events":""}).removeClass($this.options.overClass).removeData("child-dragenter"),count--,count||(list.css("min-height",""),UI.Utils.checkDisplay($this.element.parent()))})},0)})):(elementToMoveNextTo.parentNode.insertBefore(element,next),void UI.Utils.checkDisplay($this.element.parent()))},serialize:function(){var item,attribute,data=[];return this.element.children().each(function(j,child){item={};for(var i=0;idwh?dwh-scrollTop:0,i=0;idocumentHeight-containerBottom-(sticky.top<0?0:sticky.top)?documentHeight-containerBottom-(scrollTop+stickyHeight):newTop}if(sticky.currentTop!=newTop){if(sticky.element.css({position:"fixed",top:newTop,width:sticky.getWidthFrom.length?sticky.getWidthFrom.width():sticky.element.width()}),!sticky.init&&(sticky.element.addClass(sticky.options.clsinit),location.hash&&scrollTop>0&&sticky.options.target)){var $target=UI.$(location.hash);$target.length&&setTimeout(function($target,sticky){return function(){sticky.element.width();var offset=$target.offset(),maxoffset=offset.top+$target.outerHeight(),stickyOffset=sticky.element.offset(),stickyHeight=sticky.element.outerHeight(),stickyMaxOffset=stickyOffset.top+stickyHeight;stickyOffset.top').parent(),this.computeWrapper(),this.element.css("margin",0),boundary&&(boundary===!0||"!"===boundary[0]?(boundary=boundary===!0?this.wrapper.parent():this.wrapper.closest(boundary.substr(1)),boundtoparent=!0):"string"==typeof boundary&&(boundary=UI.$(boundary))),this.sticky={self:this,options:this.options,element:this.element,currentTop:null,wrapper:this.wrapper,init:!1,getWidthFrom:UI.$(this.options.getWidthFrom||this.wrapper),boundary:boundary,boundtoparent:boundtoparent,top:0,calcTop:function(){var top=this.options.top;if(this.options.top&&"string"==typeof this.options.top)if(this.options.top.match(/^(-|)(\d+)vh$/))top=window.innerHeight*parseInt(this.options.top,10)/100;else{var topElement=UI.$(this.options.top).first();topElement.length&&topElement.is(":visible")&&(top=-1*(topElement.offset().top+topElement.outerHeight()-this.wrapper.offset().top))}this.top=top},reset:function(force){this.calcTop();var finalize=function(){this.element.css({position:"",top:"",width:"",left:"",margin:"0"}),this.element.removeClass([this.options.animation,"uk-animation-reverse",this.options.clsactive].join(" ")),this.element.addClass(this.options.clsinactive),this.element.trigger("inactive.uk.sticky"),this.currentTop=null,this.animate=!1}.bind(this);!force&&this.options.animation&&UI.support.animation&&!UI.Utils.isInView(this.wrapper)?(this.animate=!0,this.element.removeClass(this.options.animation).one(UI.support.animation.end,function(){finalize()}).width(),this.element.addClass(this.options.animation+" uk-animation-reverse")):finalize()},check:function(){if(this.options.disabled)return!1;if(this.options.media)switch(typeof this.options.media){case"number":if(window.innerWidthdwh?dwh-scrollTop:0,elementTop=this.wrapper.offset().top,etse=elementTop-this.top-extra,active=scrollTop>=etse;return active&&this.options.showup&&(1==direction&&(active=!1),direction==-1&&!this.element.hasClass(this.options.clsactive)&&UI.Utils.isInView(this.wrapper)&&(active=!1)),active}},this.sticky.calcTop(),sticked.push(this.sticky)},update:function(){checkscrollposition(this.sticky)},enable:function(){this.options.disabled=!1,this.update()},disable:function(force){this.options.disabled=!0,this.sticky.reset(force)},computeWrapper:function(){this.wrapper.css({height:["absolute","fixed"].indexOf(this.element.css("position"))==-1?this.element.outerHeight():"","float":"none"!=this.element.css("float")?this.element.css("float"):"",margin:this.element.css("margin")}),"fixed"==this.element.css("position")&&this.element.css({width:this.sticky.getWidthFrom.length?this.sticky.getWidthFrom.width():this.element.width()})}}),UI.sticky}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-timepicker",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";function getTimeRange(start,end){start=start||0,end=end||24;var i,h,times={"12h":[],"24h":[]};for(i=start,h="";i0&&i<13&&12!==i&&(times["12h"].push({value:h+":00 AM"}),times["12h"].push({value:h+":30 AM"})),i>=12&&(h-=12,0===h&&(h=12),h<10&&(h="0"+String(h)),times["12h"].push({value:h+":00 PM"}),times["12h"].push({value:h+":30 PM"}));return times}UI.component("timepicker",{defaults:{format:"24h",delay:0,start:0,end:24},boot:function(){UI.$html.on("focus.timepicker.uikit","[data-uk-timepicker]",function(e){var ele=UI.$(this);if(!ele.data("timepicker")){var obj=UI.timepicker(ele,UI.Utils.options(ele.attr("data-uk-timepicker")));setTimeout(function(){obj.autocomplete.input.focus()},40)}})},init:function(){var container,$this=this,times=getTimeRange(this.options.start,this.options.end);this.options.minLength=0,this.options.template='',this.options.source=function(release){release(times[$this.options.format]||times["12h"])},this.element.is("input")?(this.element.wrap('
      '),container=this.element.parent()):container=this.element.addClass("uk-autocomplete"),this.autocomplete=UI.autocomplete(container,this.options),this.autocomplete.dropdown.addClass("uk-dropdown-small uk-dropdown-scrollable"),this.autocomplete.on("show.uk.autocomplete",function(){var selected=$this.autocomplete.dropdown.find('[data-value="'+$this.autocomplete.input.val()+'"]');setTimeout(function(){$this.autocomplete.pick(selected,!0)},10)}),this.autocomplete.input.on("focus",function(){$this.autocomplete.value=Math.random(),$this.autocomplete.triggercomplete()}).on("blur",UI.Utils.debounce(function(){$this.checkTime()},100)),this.element.data("timepicker",this)},checkTime:function(){var arr,timeArray,hour,minute,meridian="AM",time=this.autocomplete.input.val();"12h"==this.options.format?(arr=time.split(" "),timeArray=arr[0].split(":"),meridian=arr[1]):timeArray=time.split(":"),hour=parseInt(timeArray[0],10),minute=parseInt(timeArray[1],10),isNaN(hour)&&(hour=0),isNaN(minute)&&(minute=0),"12h"==this.options.format?(hour>12?hour=12:hour<0&&(hour=12),"am"===meridian||"a"===meridian?meridian="AM":"pm"!==meridian&&"p"!==meridian||(meridian="PM"),"AM"!==meridian&&"PM"!==meridian&&(meridian="AM")):hour>=24?hour=23:hour<0&&(hour=0),minute<0?minute=0:minute>=60&&(minute=0),this.autocomplete.input.val(this.formatTime(hour,minute,meridian)).trigger("change")},formatTime:function(hour,minute,meridian){return hour=hour<10?"0"+hour:hour,minute=minute<10?"0"+minute:minute,hour+":"+minute+("12h"==this.options.format?" "+meridian:"")}})}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-tooltip",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var $tooltip,tooltipdelay,checkdelay;return UI.component("tooltip",{defaults:{offset:5,pos:"top",animation:!1,delay:0,cls:"",activeClass:"uk-active",src:function(ele){var title=ele.attr("title");return void 0!==title&&ele.data("cached-title",title).removeAttr("title"),ele.data("cached-title")}},tip:"",boot:function(){UI.$html.on("mouseenter.tooltip.uikit focus.tooltip.uikit","[data-uk-tooltip]",function(e){var ele=UI.$(this);ele.data("tooltip")||(UI.tooltip(ele,UI.Utils.options(ele.attr("data-uk-tooltip"))),ele.trigger("mouseenter"))})},init:function(){ -var $this=this;$tooltip||($tooltip=UI.$('
      ').appendTo("body")),this.on({focus:function(e){$this.show()},blur:function(e){$this.hide()},mouseenter:function(e){$this.show()},mouseleave:function(e){$this.hide()}})},show:function(){if(this.tip="function"==typeof this.options.src?this.options.src(this.element):this.options.src,tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),"string"==typeof this.tip&&this.tip.length){$tooltip.stop().css({top:-2e3,visibility:"hidden"}).removeClass(this.options.activeClass).show(),$tooltip.html('
      '+this.tip+"
      ");var $this=this,pos=UI.$.extend({},this.element.offset(),{width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}),width=$tooltip[0].offsetWidth,height=$tooltip[0].offsetHeight,offset="function"==typeof this.options.offset?this.options.offset.call(this.element):this.options.offset,position="function"==typeof this.options.pos?this.options.pos.call(this.element):this.options.pos,tmppos=position.split("-"),tcss={display:"none",visibility:"visible",top:pos.top+pos.height+height,left:pos.left};if("fixed"==UI.$html.css("position")||"fixed"==UI.$body.css("position")){var bodyoffset=UI.$("body").offset(),htmloffset=UI.$("html").offset(),docoffset={top:htmloffset.top+bodyoffset.top,left:htmloffset.left+bodyoffset.left};pos.left-=docoffset.left,pos.top-=docoffset.top}"left"!=tmppos[0]&&"right"!=tmppos[0]||"right"!=UI.langdirection||(tmppos[0]="left"==tmppos[0]?"right":"left");var variants={bottom:{top:pos.top+pos.height+offset,left:pos.left+pos.width/2-width/2},top:{top:pos.top-height-offset,left:pos.left+pos.width/2-width/2},left:{top:pos.top+pos.height/2-height/2,left:pos.left-width-offset},right:{top:pos.top+pos.height/2-height/2,left:pos.left+pos.width+offset}};UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left="left"==tmppos[1]?pos.left:pos.left+pos.width-width);var boundary=this.checkBoundary(tcss.left,tcss.top,width,height);if(boundary){switch(boundary){case"x":position=2==tmppos.length?tmppos[0]+"-"+(tcss.left<0?"left":"right"):tcss.left<0?"right":"left";break;case"y":position=2==tmppos.length?(tcss.top<0?"bottom":"top")+"-"+tmppos[1]:tcss.top<0?"bottom":"top";break;case"xy":position=2==tmppos.length?(tcss.top<0?"bottom":"top")+"-"+(tcss.left<0?"left":"right"):tcss.left<0?"right":"left"}tmppos=position.split("-"),UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left="left"==tmppos[1]?pos.left:pos.left+pos.width-width)}tcss.left-=UI.$body.position().left,tooltipdelay=setTimeout(function(){$tooltip.css(tcss).attr("class",["uk-tooltip","uk-tooltip-"+position,$this.options.cls].join(" ")),$this.options.animation?$tooltip.css({opacity:0,display:"block"}).addClass($this.options.activeClass).animate({opacity:1},parseInt($this.options.animation,10)||400):$tooltip.show().addClass($this.options.activeClass),tooltipdelay=!1,checkdelay=setInterval(function(){$this.element.is(":visible")||$this.hide()},150)},parseInt(this.options.delay,10)||0)}},hide:function(){if(!this.element.is("input")||this.element[0]!==document.activeElement)if(tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),$tooltip.stop(),this.options.animation){var $this=this;$tooltip.fadeOut(parseInt(this.options.animation,10)||400,function(){$tooltip.removeClass($this.options.activeClass)})}else $tooltip.hide().removeClass(this.options.activeClass)},content:function(){return this.tip},checkBoundary:function(left,top,width,height){var axis="";return(left<0||left-UI.$win.scrollLeft()+width>window.innerWidth)&&(axis+="x"),(top<0||top-UI.$win.scrollTop()+height>window.innerHeight)&&(axis+="y"),axis}}),UI.tooltip}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-upload",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";function xhrupload(files,settings){function upload(files,settings){var formData=new FormData,xhr=new XMLHttpRequest;if(settings.before(settings,files)!==!1){for(var f,i=0;f=files[i];i++)formData.append(settings.param,f);for(var p in settings.params)formData.append(p,settings.params[p]);xhr.upload.addEventListener("progress",function(e){var percent=e.loaded/e.total*100;settings.progress(percent,e)},!1),xhr.addEventListener("loadstart",function(e){settings.loadstart(e)},!1),xhr.addEventListener("load",function(e){settings.load(e)},!1),xhr.addEventListener("loadend",function(e){settings.loadend(e)},!1),xhr.addEventListener("error",function(e){settings.error(e)},!1),xhr.addEventListener("abort",function(e){settings.abort(e)},!1),xhr.open(settings.method,settings.action,!0),"json"==settings.type&&xhr.setRequestHeader("Accept","application/json"),xhr.onreadystatechange=function(){if(settings.readystatechange(xhr),4==xhr.readyState){var response=xhr.responseText;if("json"==settings.type)try{response=UI.$.parseJSON(response)}catch(e){response=!1}settings.complete(response,xhr)}},settings.beforeSend(xhr),xhr.send(formData)}}if(!UI.support.ajaxupload)return this;if(settings=UI.$.extend({},xhrupload.defaults,settings),files.length){if("*.*"!==settings.allow)for(var file,i=0;file=files[i];i++)if(!matchName(settings.allow,file.name))return void("string"==typeof settings.notallowed?alert(settings.notallowed):settings.notallowed(file,settings));var complete=settings.complete;if(settings.single){var count=files.length,uploaded=0,allow=!0;settings.beforeAll(files),settings.complete=function(response,xhr){uploaded+=1,complete(response,xhr),settings.filelimit&&uploaded>=settings.filelimit&&(allow=!1),allow&&uploaded
      ',$body.on("show.uk.modal",".uk-modal-dialog-replace",function(){setTimeout(function(){var dialogReplace=$(".uk-modal-dialog-replace");if(dialogReplace.find(".uk-button-primary").length){var actionBtn=dialogReplace.find(".uk-button-primary").toggleClass("uk-button-primary md-btn-flat-primary");actionBtn.next("button")&&actionBtn.next("button").after(actionBtn)}dialogReplace.find(".uk-button").length&&dialogReplace.find(".uk-button").toggleClass("uk-button md-btn md-btn-flat"),dialogReplace.find(".uk-margin-small-top").length&&dialogReplace.find(".uk-margin-small-top").toggleClass("uk-margin-small-top uk-margin-top"),dialogReplace.find("input.uk-width-1-1").length&&(dialogReplace.find("input.uk-width-1-1").toggleClass("uk-width-1-1 md-input"),altair_md.inputs()),dialogReplace.find(".uk-form").length&&dialogReplace.find(".uk-form").removeClass("uk-form")},50)})}"undefined"!=typeof UIkit.components.tooltip&&$.extend(UIkit.components.tooltip.prototype.defaults,{animation:280,offset:8}),"undefined"!=typeof UIkit.components.sortable&&Modernizr.touch&&$("[data-uk-sortable]").children().addClass("needsclick")}); \ No newline at end of file +!function(core){if("function"==typeof define&&define.amd&&define("uikit",function(){var uikit=window.UIkit||core(window,window.jQuery,window.document);return uikit.load=function(res,req,onload,config){var i,resources=res.split(","),load=[],base=(config.config&&config.config.uikit&&config.config.uikit.base?config.config.uikit.base:"").replace(/\/+$/g,"");if(!base)throw new Error("Please define base path to UIkit in the requirejs config.");for(i=0;i0||global.navigator.pointerEnabled&&global.navigator.maxTouchPoints>0||!1,UI.support.mutationobserver=global.MutationObserver||global.WebKitMutationObserver||null,UI.Utils={},UI.Utils.isFullscreen=function(){return document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.fullscreenElement||!1},UI.Utils.str2json=function(str,notevil){try{return notevil?JSON.parse(str.replace(/([\$\w]+)\s*:/g,function(_,$1){return'"'+$1+'":'}).replace(/'([^']+)'/g,function(_,$1){return'"'+$1+'"'})):new Function("","var json = "+str+"; return JSON.parse(JSON.stringify(json));")()}catch(e){return!1}},UI.Utils.debounce=function(func,wait,immediate){var timeout;return function(){var context=this,args=arguments,callNow=immediate&&!timeout;clearTimeout(timeout),timeout=setTimeout(function(){timeout=null,immediate||func.apply(context,args)},wait),callNow&&func.apply(context,args)}},UI.Utils.removeCssRules=function(selectorRegEx){var idx,idxs,stylesheet,_i,_j,_k,_len,_len1,_len2,_ref;selectorRegEx&&setTimeout(function(){try{for(_ref=document.styleSheets,_i=0,_len=_ref.length;_i<_len;_i++){for(stylesheet=_ref[_i],idxs=[],stylesheet.cssRules=stylesheet.cssRules,idx=_j=0,_len1=stylesheet.cssRules.length;_j<_len1;idx=++_j)stylesheet.cssRules[idx].type===CSSRule.STYLE_RULE&&selectorRegEx.test(stylesheet.cssRules[idx].selectorText)&&idxs.unshift(idx);for(_k=0,_len2=idxs.length;_k<_len2;_k++)stylesheet.deleteRule(idxs[_k])}}catch(_error){}},0)},UI.Utils.isInView=function(element,options){var $element=$(element);if(!$element.is(":visible"))return!1;var window_left=UI.$win.scrollLeft(),window_top=UI.$win.scrollTop(),offset=$element.offset(),left=offset.left,top=offset.top;return options=$.extend({topoffset:0,leftoffset:0},options),top+$element.height()>=window_top&&top-options.topoffset<=window_top+UI.$win.height()&&left+$element.width()>=window_left&&left-options.leftoffset<=window_left+UI.$win.width()},UI.Utils.checkDisplay=function(context,initanimation){var elements=UI.$("[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]",context||document);return context&&!elements.length&&(elements=$(context)),elements.trigger("display.uk.check"),initanimation&&("string"!=typeof initanimation&&(initanimation='[class*="uk-animation-"]'),elements.find(initanimation).each(function(){var ele=UI.$(this),anim=ele.attr("class").match(/uk\-animation\-(.+)/);ele.removeClass(anim[0]).width(),ele.addClass(anim[0])})),elements},UI.Utils.options=function(string){if("string"!=$.type(string))return string;-1!=string.indexOf(":")&&"}"!=string.trim().substr(-1)&&(string="{"+string+"}");var start=string?string.indexOf("{"):-1,options={};if(-1!=start)try{options=UI.Utils.str2json(string.substr(start))}catch(e){}return options},UI.Utils.animate=function(element,cls){var d=$.Deferred();return(element=UI.$(element)).css("display","none").addClass(cls).one(UI.support.animation.end,function(){element.removeClass(cls),d.resolve()}),element.css("display",""),d.promise()},UI.Utils.uid=function(prefix){return(prefix||"id")+(new Date).getTime()+"RAND"+Math.ceil(1e5*Math.random())},UI.Utils.template=function(str,data){for(var toc,cmd,prop,fn,tokens=str.replace(/\n/g,"\\n").replace(/\{\{\{\s*(.+?)\s*\}\}\}/g,"{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g),i=0,output=[],openblocks=0;i/g, '>');}"].join("\n")),data?fn(data):fn},UI.Utils.events={},UI.Utils.events.click=UI.support.touch?"tap":"click",global.UIkit=UI,UI.fn=function(command,options){var args=arguments,cmd=command.match(/^([a-z\-]+)(?:\.([a-z]+))?/i),component=cmd[1],method=cmd[2];return UI[component]?this.each(function(){var $this=$(this),data=$this.data(component);data||$this.data(component,data=UI[component](this,method?void 0:options)),method&&data[method].apply(data,Array.prototype.slice.call(args,1))}):($.error("UIkit component ["+component+"] does not exist."),this)},$.UIkit=UI,$.fn.uk=UI.fn,UI.langdirection="rtl"==UI.$html.attr("dir")?"right":"left",UI.components={},UI.component=function(name,def){var fn=function(element,options){var $this=this;return this.UIkit=UI,this.element=element?UI.$(element):null,this.options=$.extend(!0,{},this.defaults,options),this.plugins={},this.element&&this.element.data(name,this),this.init(),(this.options.plugins.length?this.options.plugins:Object.keys(fn.plugins)).forEach(function(plugin){fn.plugins[plugin].init&&(fn.plugins[plugin].init($this),$this.plugins[plugin]=!0)}),this.trigger("init.uk.component",[name,this]),this};return fn.plugins={},$.extend(!0,fn.prototype,{defaults:{plugins:[]},boot:function(){},init:function(){},on:function(a1,a2,a3){return UI.$(this.element||this).on(a1,a2,a3)},one:function(a1,a2,a3){return UI.$(this.element||this).one(a1,a2,a3)},off:function(evt){return UI.$(this.element||this).off(evt)},trigger:function(evt,params){return UI.$(this.element||this).trigger(evt,params)},find:function(selector){return UI.$(this.element?this.element:[]).find(selector)},proxy:function(obj,methods){var $this=this;methods.split(" ").forEach(function(method){$this[method]||($this[method]=function(){return obj[method].apply(obj,arguments)})})},mixin:function(obj,methods){var $this=this;methods.split(" ").forEach(function(method){$this[method]||($this[method]=obj[method].bind($this))})},option:function(){if(1==arguments.length)return this.options[arguments[0]]||void 0;2==arguments.length&&(this.options[arguments[0]]=arguments[1])}},def),this.components[name]=fn,this[name]=function(){var element,options;if(arguments.length)switch(arguments.length){case 1:"string"==typeof arguments[0]||arguments[0].nodeType||arguments[0]instanceof jQuery?element=$(arguments[0]):options=arguments[0];break;case 2:element=$(arguments[0]),options=arguments[1]}return element&&element.data(name)?element.data(name):new UI.components[name](element,options)},UI.domready&&UI.component.boot(name),fn},UI.plugin=function(component,name,def){this.components[component].plugins[name]=def},UI.component.boot=function(name){UI.components[name].prototype&&UI.components[name].prototype.boot&&!UI.components[name].booted&&(UI.components[name].prototype.boot.apply(UI,[]),UI.components[name].booted=!0)},UI.component.bootComponents=function(){for(var component in UI.components)UI.component.boot(component)},UI.domObservers=[],UI.domready=!1,UI.ready=function(fn){UI.domObservers.push(fn),UI.domready&&fn(document)},UI.on=function(a1,a2,a3){return a1&&a1.indexOf("ready.uk.dom")>-1&&UI.domready&&a2.apply(UI.$doc),UI.$doc.on(a1,a2,a3)},UI.one=function(a1,a2,a3){return a1&&a1.indexOf("ready.uk.dom")>-1&&UI.domready?(a2.apply(UI.$doc),UI.$doc):UI.$doc.one(a1,a2,a3)},UI.trigger=function(evt,params){return UI.$doc.trigger(evt,params)},UI.domObserve=function(selector,fn){UI.support.mutationobserver&&(fn=fn||function(){},UI.$(selector).each(function(){var element=this,$element=UI.$(element);if(!$element.data("observer"))try{var observer=new UI.support.mutationobserver(UI.Utils.debounce(function(mutations){fn.apply(element,[]),$element.trigger("changed.uk.dom")},50));observer.observe(element,{childList:!0,subtree:!0}),$element.data("observer",observer)}catch(e){}}))},UI.init=function(root){root=root||document,UI.domObservers.forEach(function(fn){fn(root)})},UI.on("domready.uk.dom",function(){UI.init(),UI.domready&&UI.Utils.checkDisplay()}),document.addEventListener("DOMContentLoaded",(domReady=function(){var memory,fn;UI.$body=UI.$("body"),UI.ready(function(context){UI.domObserve("[data-uk-observe]")}),UI.on("changed.uk.dom",function(e){UI.init(e.target),UI.Utils.checkDisplay(e.target)}),UI.trigger("beforeready.uk.dom"),UI.component.bootComponents(),requestAnimationFrame((memory={dir:{x:0,y:0},x:window.pageXOffset,y:window.pageYOffset},fn=function(){var wpxo=window.pageXOffset,wpyo=window.pageYOffset;memory.x==wpxo&&memory.y==wpyo||(wpxo!=memory.x?memory.dir.x=wpxo>memory.x?1:-1:memory.dir.x=0,wpyo!=memory.y?memory.dir.y=wpyo>memory.y?1:-1:memory.dir.y=0,memory.x=wpxo,memory.y=wpyo,UI.$doc.trigger("scrolling.uk.document",[{dir:{x:memory.dir.x,y:memory.dir.y},x:wpxo,y:wpyo}])),requestAnimationFrame(fn)},UI.support.touch&&UI.$html.on("touchmove touchend MSPointerMove MSPointerUp pointermove pointerup",fn),(memory.x||memory.y)&&fn(),fn)),UI.trigger("domready.uk.dom"),UI.support.touch&&navigator.userAgent.match(/(iPad|iPhone|iPod)/g)&&UI.$win.on("load orientationchange resize",UI.Utils.debounce(function(){var fn=function(){return $(".uk-height-viewport").css("height",window.innerHeight),fn};return fn()}(),100)),UI.trigger("afterready.uk.dom"),UI.domready=!0},"complete"!=document.readyState&&"interactive"!=document.readyState||setTimeout(domReady),domReady)),UI.$html.addClass(UI.support.touch?"uk-touch":"uk-notouch"),UI.support.touch){var exclude,hoverset=!1,selector=".uk-overlay, .uk-overlay-hover, .uk-overlay-toggle, .uk-animation-hover, .uk-has-hover";UI.$html.on("mouseenter touchstart MSPointerDown pointerdown",selector,function(){hoverset&&$(".uk-hover").removeClass("uk-hover"),hoverset=$(this).addClass("uk-hover")}).on("mouseleave touchend MSPointerUp pointerup",function(e){exclude=$(e.target).parents(selector),hoverset&&hoverset.not(exclude).removeClass("uk-hover")})}return UI}),function($){if(!$.fn.swipeLeft){var touchTimeout,tapTimeout,swipeTimeout,longTapTimeout,gesture,touch={};$(function(){var now,delta,firstTouch,deltaX=0,deltaY=0;"MSGesture"in window&&((gesture=new MSGesture).target=document.body),$(document).on("MSGestureEnd gestureend",function(e){var swipeDirectionFromVelocity=e.originalEvent.velocityX>1?"Right":e.originalEvent.velocityX<-1?"Left":e.originalEvent.velocityY>1?"Down":e.originalEvent.velocityY<-1?"Up":null;swipeDirectionFromVelocity&&void 0!==touch.el&&(touch.el.trigger("swipe"),touch.el.trigger("swipe"+swipeDirectionFromVelocity))}).on("touchstart MSPointerDown pointerdown",function(e){("MSPointerDown"!=e.type||isPrimaryTouch(e.originalEvent))&&(firstTouch="MSPointerDown"==e.type||"pointerdown"==e.type?e:e.originalEvent.touches[0],now=Date.now(),delta=now-(touch.last||now),touch.el=$("tagName"in firstTouch.target?firstTouch.target:firstTouch.target.parentNode),touchTimeout&&clearTimeout(touchTimeout),touch.x1=firstTouch.pageX,touch.y1=firstTouch.pageY,delta>0&&delta<=250&&(touch.isDoubleTap=!0),touch.last=now,longTapTimeout=setTimeout(longTap,750),!gesture||"MSPointerDown"!=e.type&&"pointerdown"!=e.type&&"touchstart"!=e.type||gesture.addPointer(e.originalEvent.pointerId))}).on("touchmove MSPointerMove pointermove",function(e){("MSPointerMove"!=e.type||isPrimaryTouch(e.originalEvent))&&(firstTouch="MSPointerMove"==e.type||"pointermove"==e.type?e:e.originalEvent.touches[0],cancelLongTap(),touch.x2=firstTouch.pageX,touch.y2=firstTouch.pageY,deltaX+=Math.abs(touch.x1-touch.x2),deltaY+=Math.abs(touch.y1-touch.y2))}).on("touchend MSPointerUp pointerup",function(e){("MSPointerUp"!=e.type||isPrimaryTouch(e.originalEvent))&&(cancelLongTap(),touch.x2&&Math.abs(touch.x1-touch.x2)>30||touch.y2&&Math.abs(touch.y1-touch.y2)>30?swipeTimeout=setTimeout(function(){var x1,x2,y1,y2;void 0!==touch.el&&(touch.el.trigger("swipe"),touch.el.trigger("swipe"+(x1=touch.x1,x2=touch.x2,y1=touch.y1,y2=touch.y2,Math.abs(x1-x2)>=Math.abs(y1-y2)?x1-x2>0?"Left":"Right":y1-y2>0?"Up":"Down"))),touch={}},0):"last"in touch&&(isNaN(deltaX)||deltaX<30&&deltaY<30?tapTimeout=setTimeout(function(){var event=$.Event("tap");event.cancelTouch=cancelAll,void 0!==touch.el&&touch.el.trigger(event),touch.isDoubleTap?(void 0!==touch.el&&touch.el.trigger("doubleTap"),touch={}):touchTimeout=setTimeout(function(){touchTimeout=null,void 0!==touch.el&&touch.el.trigger("singleTap"),touch={}},250)},0):touch={},deltaX=deltaY=0))}).on("touchcancel MSPointerCancel",cancelAll),$(window).on("scroll",cancelAll)}),["swipe","swipeLeft","swipeRight","swipeUp","swipeDown","doubleTap","tap","singleTap","longTap"].forEach(function(eventName){$.fn[eventName]=function(callback){return $(this).on(eventName,callback)}})}function longTap(){longTapTimeout=null,touch.last&&(void 0!==touch.el&&touch.el.trigger("longTap"),touch={})}function cancelLongTap(){longTapTimeout&&clearTimeout(longTapTimeout),longTapTimeout=null}function cancelAll(){touchTimeout&&clearTimeout(touchTimeout),tapTimeout&&clearTimeout(tapTimeout),swipeTimeout&&clearTimeout(swipeTimeout),longTapTimeout&&clearTimeout(longTapTimeout),touchTimeout=tapTimeout=swipeTimeout=longTapTimeout=null,touch={}}function isPrimaryTouch(event){return event.pointerType==event.MSPOINTER_TYPE_TOUCH&&event.isPrimary}}(jQuery),function(UI){"use strict";var elements,check,cacheSvgs,stacks=[];UI.component("stackMargin",{defaults:{cls:"uk-margin-small-top",rowfirst:!1},boot:function(){UI.ready(function(context){UI.$("[data-uk-margin]",context).each(function(){var ele=UI.$(this);ele.data("stackMargin")||UI.stackMargin(ele,UI.Utils.options(ele.attr("data-uk-margin")))})})},init:function(){var fn,$this=this;UI.$win.on("resize orientationchange",(fn=function(){$this.process()},UI.$(function(){fn(),UI.$win.on("load",fn)}),UI.Utils.debounce(fn,20))),UI.$html.on("changed.uk.dom",function(e){$this.process()}),this.on("display.uk.check",function(e){this.element.is(":visible")&&this.process()}.bind(this)),stacks.push(this)},process:function(){var $this=this,columns=this.element.children();if(UI.Utils.stackMargin(columns,this.options),!this.options.rowfirst)return this;var pos_cache=columns.removeClass(this.options.rowfirst).filter(":visible").first().position();return pos_cache&&columns.each(function(){UI.$(this)[UI.$(this).position().left==pos_cache.left?"addClass":"removeClass"]($this.options.rowfirst)}),this}}),elements=[],check=function(ele){if(ele.is(":visible")){var width=ele.parent().width(),iwidth=ele.data("width"),ratio=width/iwidth,height=Math.floor(ratio*ele.data("height"));ele.css({height:width=offset&&(skip=column.addClass(options.cls)))})},UI.Utils.matchHeights=function(elements,options){elements=UI.$(elements).css("min-height","");var matchHeights=function(group){if(!(group.length<2)){var max=0;group.each(function(){max=Math.max(max,UI.$(this).outerHeight())}).each(function(){var element=UI.$(this),height=max-("border-box"==element.css("box-sizing")?0:element.outerHeight()-element.height());element.css("min-height",height+"px")})}};(options=UI.$.extend({row:!0},options)).row?(elements.first().width(),setTimeout(function(){var lastoffset=!1,group=[];elements.each(function(){var ele=UI.$(this),offset=ele.offset().top;offset!=lastoffset&&group.length&&(matchHeights(UI.$(group)),group=[],offset=ele.offset().top),group.push(ele),lastoffset=offset}),group.length&&matchHeights(UI.$(group))},0)):matchHeights(elements)},cacheSvgs={},UI.Utils.inlineSvg=function(selector,root){UI.$(selector||'img[src$=".svg"]',root||document).each(function(){var img=UI.$(this),src=img.attr("src");if(!cacheSvgs[src]){var d=UI.$.Deferred();UI.$.get(src,{nc:Math.random()},function(data){d.resolve(UI.$(data).find("svg"))}),cacheSvgs[src]=d.promise()}cacheSvgs[src].then(function(svg){var $svg=UI.$(svg).clone();img.attr("id")&&$svg.attr("id",img.attr("id")),img.attr("class")&&$svg.attr("class",img.attr("class")),img.attr("style")&&$svg.attr("style",img.attr("style")),img.attr("width")&&($svg.attr("width",img.attr("width")),img.attr("height")||$svg.removeAttr("height")),img.attr("height")&&($svg.attr("height",img.attr("height")),img.attr("width")||$svg.removeAttr("width")),img.replaceWith($svg)})})},UI.ready(function(context){UI.Utils.inlineSvg("[data-uk-svg]",context)})}(UIkit),function(UI){"use strict";function scrollToElement(ele,options){options=UI.$.extend({duration:1e3,transition:"easeOutExpo",offset:0,complete:function(){}},options);var target=ele.offset().top-options.offset,docheight=UI.$doc.height(),winheight=window.innerHeight;target+winheight>docheight&&(target=docheight-winheight),UI.$("html,body").stop().animate({scrollTop:target},options.duration,options.transition).promise().done(options.complete)}UI.component("smoothScroll",{boot:function(){UI.$html.on("click.smooth-scroll.uikit","[data-uk-smooth-scroll]",function(e){var ele=UI.$(this);if(!ele.data("smoothScroll")){UI.smoothScroll(ele,UI.Utils.options(ele.attr("data-uk-smooth-scroll")));ele.trigger("click")}return!1})},init:function(){var $this=this;this.on("click",function(e){e.preventDefault(),scrollToElement(UI.$(this.hash).length?UI.$(this.hash):UI.$("body"),$this.options)})}}),UI.Utils.scrollToElement=scrollToElement,UI.$.easing.easeOutExpo||(UI.$.easing.easeOutExpo=function(x,t,b,c,d){return t==d?b+c:c*(1-Math.pow(2,-10*t/d))+b})}(UIkit),function(UI){"use strict";var $win=UI.$win,$doc=UI.$doc,scrollspies=[],checkScrollSpy=function(){for(var i=0;i=scrollTop)return inviews[i]}();if(!target)return;$this.options.closest?(links.blur().closest(clsClosest).removeClass(clsActive),navitems=links.filter("a[href='#"+target.attr("id")+"']").closest(clsClosest).addClass(clsActive)):navitems=links.removeClass(clsActive).filter("a[href='#"+target.attr("id")+"']").addClass(clsActive),$this.element.trigger("inview.uk.scrollspynav",[target,navitems])}};this.options.smoothscroll&&UI.smoothScroll&&links.each(function(){UI.smoothScroll(this,$this.options.smoothscroll)}),fn(),this.element.data("scrollspynav",this),this.check=fn,scrollspynavs.push(this)}})}(UIkit),function(UI){"use strict";var toggles=[];UI.component("toggle",{defaults:{target:!1,cls:"uk-hidden",animation:!1,duration:200},boot:function(){UI.ready(function(context){UI.$("[data-uk-toggle]",context).each(function(){var ele=UI.$(this);if(!ele.data("toggle"))UI.toggle(ele,UI.Utils.options(ele.attr("data-uk-toggle")))}),setTimeout(function(){toggles.forEach(function(toggle){toggle.getToggles()})},0)})},init:function(){var $this=this;this.aria=-1!==this.options.cls.indexOf("uk-hidden"),this.getToggles(),this.on("click",function(e){$this.element.is('a[href="#"]')&&e.preventDefault(),$this.toggle()}),toggles.push(this)},toggle:function(){if(this.totoggle.length){if(this.options.animation&&UI.support.animation){var $this=this,animations=this.options.animation.split(",");1==animations.length&&(animations[1]=animations[0]),animations[0]=animations[0].trim(),animations[1]=animations[1].trim(),this.totoggle.css("animation-duration",this.options.duration+"ms"),this.totoggle.each(function(){var ele=UI.$(this);ele.hasClass($this.options.cls)?(ele.toggleClass($this.options.cls),UI.Utils.animate(ele,animations[0]).then(function(){ele.css("animation-duration",""),UI.Utils.checkDisplay(ele)})):UI.Utils.animate(this,animations[1]+" uk-animation-reverse").then(function(){ele.toggleClass($this.options.cls).css("animation-duration",""),UI.Utils.checkDisplay(ele)})})}else this.totoggle.toggleClass(this.options.cls),UI.Utils.checkDisplay(this.totoggle);this.updateAria()}},getToggles:function(){this.totoggle=this.options.target?UI.$(this.options.target):[],this.updateAria()},updateAria:function(){this.aria&&this.totoggle.length&&this.totoggle.each(function(){UI.$(this).attr("aria-hidden",UI.$(this).hasClass("uk-hidden"))})}})}(UIkit),function(UI){"use strict";UI.component("alert",{defaults:{fade:!0,duration:200,trigger:".uk-alert-close"},boot:function(){UI.$html.on("click.alert.uikit","[data-uk-alert]",function(e){var ele=UI.$(this);if(!ele.data("alert")){var alert=UI.alert(ele,UI.Utils.options(ele.attr("data-uk-alert")));UI.$(e.target).is(alert.options.trigger)&&(e.preventDefault(),alert.close())}})},init:function(){var $this=this;this.on("click",this.options.trigger,function(e){e.preventDefault(),$this.close()})},close:function(){var element=this.trigger("close.uk.alert"),removeElement=function(){this.trigger("closed.uk.alert").remove()}.bind(this);this.options.fade?element.css("overflow","hidden").css("max-height",element.height()).animate({height:0,opacity:0,"padding-top":0,"padding-bottom":0,"margin-top":0,"margin-bottom":0},this.options.duration,removeElement):removeElement()}})}(UIkit),function(UI){"use strict";UI.component("buttonRadio",{defaults:{activeClass:"uk-active",target:".uk-button"},boot:function(){UI.$html.on("click.buttonradio.uikit","[data-uk-button-radio]",function(e){var ele=UI.$(this);if(!ele.data("buttonRadio")){var obj=UI.buttonRadio(ele,UI.Utils.options(ele.attr("data-uk-button-radio"))),target=UI.$(e.target);target.is(obj.options.target)&&target.trigger("click")}})},init:function(){var $this=this;this.find($this.options.target).attr("aria-checked","false").filter("."+$this.options.activeClass).attr("aria-checked","true"),this.on("click",this.options.target,function(e){var ele=UI.$(this);ele.is('a[href="#"]')&&e.preventDefault(),$this.find($this.options.target).not(ele).removeClass($this.options.activeClass).blur(),ele.addClass($this.options.activeClass),$this.find($this.options.target).not(ele).attr("aria-checked","false"),ele.attr("aria-checked","true"),$this.trigger("change.uk.button",[ele])})},getSelected:function(){return this.find("."+this.options.activeClass)}}),UI.component("buttonCheckbox",{defaults:{activeClass:"uk-active",target:".uk-button"},boot:function(){UI.$html.on("click.buttoncheckbox.uikit","[data-uk-button-checkbox]",function(e){var ele=UI.$(this);if(!ele.data("buttonCheckbox")){var obj=UI.buttonCheckbox(ele,UI.Utils.options(ele.attr("data-uk-button-checkbox"))),target=UI.$(e.target);target.is(obj.options.target)&&target.trigger("click")}})},init:function(){var $this=this;this.find($this.options.target).attr("aria-checked","false").filter("."+$this.options.activeClass).attr("aria-checked","true"),this.on("click",this.options.target,function(e){var ele=UI.$(this);ele.is('a[href="#"]')&&e.preventDefault(),ele.toggleClass($this.options.activeClass).blur(),ele.attr("aria-checked",ele.hasClass($this.options.activeClass)),$this.trigger("change.uk.button",[ele])})},getSelected:function(){return this.find("."+this.options.activeClass)}}),UI.component("button",{defaults:{},boot:function(){UI.$html.on("click.button.uikit","[data-uk-button]",function(e){var ele=UI.$(this);if(!ele.data("button")){UI.button(ele,UI.Utils.options(ele.attr("data-uk-button")));ele.trigger("click")}})},init:function(){var $this=this;this.element.attr("aria-pressed",this.element.hasClass("uk-active")),this.on("click",function(e){$this.element.is('a[href="#"]')&&e.preventDefault(),$this.toggle(),$this.trigger("change.uk.button",[$this.element.blur().hasClass("uk-active")])})},toggle:function(){this.element.toggleClass("uk-active"),this.element.attr("aria-pressed",this.element.hasClass("uk-active"))}})}(UIkit),function(UI){"use strict";var hoverIdle,active=!1,flips={x:{"bottom-left":"bottom-right","bottom-right":"bottom-left","bottom-center":"bottom-center","top-left":"top-right","top-right":"top-left","top-center":"top-center","left-top":"right-top","left-bottom":"right-bottom","left-center":"right-center","right-top":"left-top","right-bottom":"left-bottom","right-center":"left-center"},y:{"bottom-left":"top-left","bottom-right":"top-right","bottom-center":"top-center","top-left":"bottom-left","top-right":"bottom-right","top-center":"bottom-center","left-top":"left-bottom","left-bottom":"left-top","left-center":"left-center","right-top":"right-bottom","right-bottom":"right-top","right-center":"right-center"},xy:{"bottom-left":"top-right","bottom-right":"top-left","bottom-center":"top-center","top-left":"bottom-right","top-right":"bottom-left","top-center":"bottom-center","left-top":"right-bottom","left-bottom":"right-top","left-center":"right-center","right-top":"left-bottom","right-bottom":"left-top","right-center":"left-center"}};function justify(ele,justifyTo,boundarywidth,offset){if(ele=UI.$(ele),justifyTo=UI.$(justifyTo),boundarywidth=boundarywidth||window.innerWidth,offset=offset||ele.offset(),justifyTo.length){var jwidth=justifyTo.outerWidth();if(ele.css("min-width",jwidth),"right"==UI.langdirection){var right1=boundarywidth-(justifyTo.offset().left+jwidth),right2=boundarywidth-(ele.offset().left+ele.outerWidth());ele.css("margin-right",right1-right2)}else ele.css("margin-left",justifyTo.offset().left-offset.left)}}UI.component("dropdown",{defaults:{mode:"hover",pos:"bottom-left",offset:0,remaintime:800,justify:!1,boundary:UI.$win,delay:0,dropdownSelector:".uk-dropdown,.uk-dropdown-blank",hoverDelayIdle:250,preventflip:!1},remainIdle:!1,boot:function(){var triggerevent=UI.support.touch?"click":"mouseenter";UI.$html.on(triggerevent+".dropdown.uikit","[data-uk-dropdown]",function(e){var ele=UI.$(this);if(!ele.data("dropdown")){var dropdown=UI.dropdown(ele,UI.Utils.options(ele.attr("data-uk-dropdown")));("click"==triggerevent||"mouseenter"==triggerevent&&"hover"==dropdown.options.mode)&&dropdown.element.trigger(triggerevent),dropdown.element.find(dropdown.options.dropdownSelector).length&&e.preventDefault()}})},init:function(){var $this=this;this.dropdown=this.find(this.options.dropdownSelector),this.offsetParent=this.dropdown.parents().filter(function(){return-1!==UI.$.inArray(UI.$(this).css("position"),["relative","fixed","absolute"])}).slice(0,1),this.centered=this.dropdown.hasClass("uk-dropdown-center"),this.justified=!!this.options.justify&&UI.$(this.options.justify),this.boundary=UI.$(this.options.boundary),this.boundary.length||(this.boundary=UI.$win),this.dropdown.hasClass("uk-dropdown-up")&&(this.options.pos="top-left"),this.dropdown.hasClass("uk-dropdown-flip")&&(this.options.pos=this.options.pos.replace("left","right")),this.dropdown.hasClass("uk-dropdown-center")&&(this.options.pos=this.options.pos.replace(/(left|right)/,"center")),this.element.attr("aria-haspopup","true"),this.element.attr("aria-expanded",this.element.hasClass("uk-open")),"click"==this.options.mode||UI.support.touch?this.on("click.uk.dropdown",function(e){var $target=UI.$(e.target);$target.parents($this.options.dropdownSelector).length||(($target.is("a[href='#']")||$target.parent().is("a[href='#']")||$this.dropdown.length&&!$this.dropdown.is(":visible"))&&e.preventDefault(),$target.blur()),$this.element.hasClass("uk-open")?(!$this.dropdown.find(e.target).length||$target.is(".uk-dropdown-close")||$target.parents(".uk-dropdown-close").length)&&$this.hide():$this.show()}):this.on("mouseenter",function(e){$this.trigger("pointerenter.uk.dropdown",[$this]),$this.remainIdle&&clearTimeout($this.remainIdle),hoverIdle&&clearTimeout(hoverIdle),active&&active==$this||(hoverIdle=active&&active!=$this?setTimeout(function(){hoverIdle=setTimeout($this.show.bind($this),$this.options.delay)},$this.options.hoverDelayIdle):setTimeout($this.show.bind($this),$this.options.delay))}).on("mouseleave",function(){hoverIdle&&clearTimeout(hoverIdle),$this.remainIdle=setTimeout(function(){active&&active==$this&&$this.hide()},$this.options.remaintime),$this.trigger("pointerleave.uk.dropdown",[$this])}).on("click",function(e){var $target=UI.$(e.target);$this.remainIdle&&clearTimeout($this.remainIdle),active&&active==$this?(!$this.dropdown.find(e.target).length||$target.is(".uk-dropdown-close")||$target.parents(".uk-dropdown-close").length)&&$this.hide():(($target.is("a[href='#']")||$target.parent().is("a[href='#']"))&&e.preventDefault(),$this.show())})},show:function(){UI.$html.off("click.outer.dropdown"),active&&active!=this&&active.hide(!0),hoverIdle&&clearTimeout(hoverIdle),this.trigger("beforeshow.uk.dropdown",[this]),this.checkDimensions(),this.element.addClass("uk-open"),this.element.attr("aria-expanded","true"),this.trigger("show.uk.dropdown",[this]),UI.Utils.checkDisplay(this.dropdown,!0),active=this,this.registerOuterClick()},hide:function(force){this.trigger("beforehide.uk.dropdown",[this,force]),this.element.removeClass("uk-open"),this.remainIdle&&clearTimeout(this.remainIdle),this.remainIdle=!1,this.element.attr("aria-expanded","false"),this.trigger("hide.uk.dropdown",[this,force]),active==this&&(active=!1)},registerOuterClick:function(){var $this=this;UI.$html.off("click.outer.dropdown"),setTimeout(function(){UI.$html.on("click.outer.dropdown",function(e){hoverIdle&&clearTimeout(hoverIdle);UI.$(e.target);active!=$this||$this.element.find(e.target).length||($this.hide(!0),UI.$html.off("click.outer.dropdown"))})},10)},checkDimensions:function(){if(this.dropdown.length){this.dropdown.removeClass("uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack").css({"top-left":"",left:"","margin-left":"","margin-right":""}),this.justified&&this.justified.length&&this.dropdown.css("min-width","");var pp,pos=UI.$.extend({},this.offsetParent.offset(),{width:this.offsetParent[0].offsetWidth,height:this.offsetParent[0].offsetHeight}),posoffset=this.options.offset,dropdown=this.dropdown,width=(dropdown.show().offset(),dropdown.outerWidth()),height=dropdown.outerHeight(),boundarywidth=this.boundary.width(),dpos=(this.boundary[0]!==window&&this.boundary.offset()&&this.boundary.offset(),this.options.pos),variants={"bottom-left":{top:0+pos.height+posoffset,left:0},"bottom-right":{top:0+pos.height+posoffset,left:0+pos.width-width},"bottom-center":{top:0+pos.height+posoffset,left:0+pos.width/2-width/2},"top-left":{top:0-height-posoffset,left:0},"top-right":{top:0-height-posoffset,left:0+pos.width-width},"top-center":{top:0-height-posoffset,left:0+pos.width/2-width/2},"left-top":{top:0,left:0-width-posoffset},"left-bottom":{top:0+pos.height-height,left:0-width-posoffset},"left-center":{top:0+pos.height/2-height/2,left:0-width-posoffset},"right-top":{top:0,left:0+pos.width+posoffset},"right-bottom":{top:0+pos.height-height,left:0+pos.width+posoffset},"right-center":{top:0+pos.height/2-height/2,left:0+pos.width+posoffset}},css={};if(pp=dpos.split("-"),css=variants[dpos]?variants[dpos]:variants["bottom-left"],this.justified&&this.justified.length)justify(dropdown.css({left:0}),this.justified,boundarywidth);else if(!0!==this.options.preventflip){var fdpos;switch(this.checkBoundary(pos.left+css.left,pos.top+css.top,width,height,boundarywidth)){case"x":"x"!==this.options.preventflip&&(fdpos=flips.x[dpos]||"right-top");break;case"y":"y"!==this.options.preventflip&&(fdpos=flips.y[dpos]||"top-left");break;case"xy":this.options.preventflip||(fdpos=flips.xy[dpos]||"right-bottom")}fdpos&&(pp=fdpos.split("-"),css=variants[fdpos]?variants[fdpos]:variants["bottom-left"],this.checkBoundary(pos.left+css.left,pos.top+css.top,width,height,boundarywidth)&&(pp=dpos.split("-"),css=variants[dpos]?variants[dpos]:variants["bottom-left"]))}width>boundarywidth&&(dropdown.addClass("uk-dropdown-stack"),this.trigger("stack.uk.dropdown",[this])),dropdown.css(css).css("display","").addClass("uk-dropdown-"+pp[0])}},checkBoundary:function(left,top,width,height,boundarywidth){var axis="";return(left<0||left-UI.$win.scrollLeft()+width>boundarywidth)&&(axis+="x"),(top-UI.$win.scrollTop()<0||top-UI.$win.scrollTop()+height>window.innerHeight)&&(axis+="y"),axis}}),UI.component("dropdownOverlay",{defaults:{justify:!1,cls:"",duration:200},boot:function(){UI.ready(function(context){UI.$("[data-uk-dropdown-overlay]",context).each(function(){var ele=UI.$(this);ele.data("dropdownOverlay")||UI.dropdownOverlay(ele,UI.Utils.options(ele.attr("data-uk-dropdown-overlay")))})})},init:function(){var $this=this;this.justified=!!this.options.justify&&UI.$(this.options.justify),this.overlay=this.element.find("uk-dropdown-overlay"),this.overlay.length||(this.overlay=UI.$('
      ').appendTo(this.element)),this.overlay.addClass(this.options.cls),this.on({"beforeshow.uk.dropdown":function(e,dropdown){$this.dropdown=dropdown,$this.justified&&$this.justified.length&&justify($this.overlay.css({display:"block","margin-left":"","margin-right":""}),$this.justified,$this.justified.outerWidth())},"show.uk.dropdown":function(e,dropdown){var h=$this.dropdown.dropdown.outerHeight(!0);$this.dropdown.element.removeClass("uk-open"),$this.overlay.stop().css("display","block").animate({height:h},$this.options.duration,function(){$this.dropdown.dropdown.css("visibility",""),$this.dropdown.element.addClass("uk-open"),UI.Utils.checkDisplay($this.dropdown.dropdown,!0)}),$this.pointerleave=!1},"hide.uk.dropdown":function(){$this.overlay.stop().animate({height:0},$this.options.duration)},"pointerenter.uk.dropdown":function(e,dropdown){clearTimeout($this.remainIdle)},"pointerleave.uk.dropdown":function(e,dropdown){$this.pointerleave=!0}}),this.overlay.on({mouseenter:function(){$this.remainIdle&&(clearTimeout($this.dropdown.remainIdle),clearTimeout($this.remainIdle))},mouseleave:function(){$this.pointerleave&&active&&($this.remainIdle=setTimeout(function(){active&&active.hide()},active.options.remaintime))}})}})}(UIkit),function(UI){"use strict";var grids=[];UI.component("gridMatchHeight",{defaults:{target:!1,row:!0,ignorestacked:!1},boot:function(){UI.ready(function(context){UI.$("[data-uk-grid-match]",context).each(function(){var grid=UI.$(this);grid.data("gridMatchHeight")||UI.gridMatchHeight(grid,UI.Utils.options(grid.attr("data-uk-grid-match")))})})},init:function(){var fn,$this=this;(this.columns=this.element.children(),this.elements=this.options.target?this.find(this.options.target):this.columns,this.columns.length)&&(UI.$win.on("load resize orientationchange",(fn=function(){$this.match()},UI.$(function(){fn()}),UI.Utils.debounce(fn,50))),UI.$html.on("changed.uk.dom",function(e){$this.columns=$this.element.children(),$this.elements=$this.options.target?$this.find($this.options.target):$this.columns,$this.match()}),this.on("display.uk.check",function(e){this.element.is(":visible")&&this.match()}.bind(this)),grids.push(this))},match:function(){var firstvisible=this.columns.filter(":visible:first");if(firstvisible.length)return Math.ceil(100*parseFloat(firstvisible.css("width"))/parseFloat(firstvisible.parent().css("width")))>=100&&!this.options.ignorestacked?this.revert():UI.Utils.matchHeights(this.elements,this.options),this},revert:function(){return this.elements.css("min-height",""),this}}),UI.component("gridMargin",{defaults:{cls:"uk-grid-margin",rowfirst:"uk-row-first"},boot:function(){UI.ready(function(context){UI.$("[data-uk-grid-margin]",context).each(function(){var grid=UI.$(this);grid.data("gridMargin")||UI.gridMargin(grid,UI.Utils.options(grid.attr("data-uk-grid-margin")))})})},init:function(){UI.stackMargin(this.element,this.options)}})}(UIkit),function(UI){"use strict";var body,active=!1,activeCount=0,$html=UI.$html;UI.component("modal",{defaults:{keyboard:!0,bgclose:!0,minScrollHeight:150,center:!1,modal:!0},scrollable:!1,transition:!1,hasTransitioned:!0,init:function(){if(body||(body=UI.$("body")),this.element.length){var $this=this;this.paddingdir="padding-"+("left"==UI.langdirection?"right":"left"),this.dialog=this.find(".uk-modal-dialog"),this.active=!1,this.element.attr("aria-hidden",this.element.hasClass("uk-open")),this.on("click",".uk-modal-close",function(e){e.preventDefault(),$this.hide()}).on("click",function(e){UI.$(e.target)[0]==$this.element[0]&&$this.options.bgclose&&$this.hide()})}},toggle:function(){return this[this.isActive()?"hide":"show"]()},show:function(){if(this.element.length){var $this=this;if(!this.isActive())return this.options.modal&&active&&active.hide(!0),this.element.removeClass("uk-open").show(),this.resize(),this.options.modal&&(active=this),this.active=!0,activeCount++,UI.support.transition?(this.hasTransitioned=!1,this.element.one(UI.support.transition.end,function(){$this.hasTransitioned=!0}).addClass("uk-open")):this.element.addClass("uk-open"),$html.addClass("uk-modal-page").height(),this.element.attr("aria-hidden","false"),this.element.trigger("show.uk.modal"),UI.Utils.checkDisplay(this.dialog,!0),this}},hide:function(force){if(!force&&UI.support.transition&&this.hasTransitioned){var $this=this;this.one(UI.support.transition.end,function(){$this._hide()}).removeClass("uk-open")}else this._hide();return this},resize:function(){var bodywidth=body.width();if(this.scrollbarwidth=window.innerWidth-bodywidth,body.css(this.paddingdir,this.scrollbarwidth),this.element.css("overflow-y",this.scrollbarwidth?"scroll":"auto"),!this.updateScrollable()&&this.options.center){var dh=this.dialog.outerHeight(),pad=parseInt(this.dialog.css("margin-top"),10)+parseInt(this.dialog.css("margin-bottom"),10);dh+pad0?activeCount--:activeCount=0,this.element.hide().removeClass("uk-open"),this.element.attr("aria-hidden","true"),activeCount||($html.removeClass("uk-modal-page"),body.css(this.paddingdir,"")),active===this&&(active=!1),this.trigger("hide.uk.modal")},isActive:function(){return this.active}}),UI.component("modalTrigger",{boot:function(){UI.$html.on("click.modal.uikit","[data-uk-modal]",function(e){var ele=UI.$(this);(ele.is("a")&&e.preventDefault(),ele.data("modalTrigger"))||UI.modalTrigger(ele,UI.Utils.options(ele.attr("data-uk-modal"))).show()}),UI.$html.on("keydown.modal.uikit",function(e){active&&27===e.keyCode&&active.options.keyboard&&(e.preventDefault(),active.hide())}),UI.$win.on("resize orientationchange",UI.Utils.debounce(function(){active&&active.resize()},150))},init:function(){var $this=this;this.options=UI.$.extend({target:!!$this.element.is("a")&&$this.element.attr("href")},this.options),this.modal=UI.modal(this.options.target,this.options),this.on("click",function(e){e.preventDefault(),$this.show()}),this.proxy(this.modal,"show hide isActive")}}),UI.modal.dialog=function(content,options){var modal=UI.modal(UI.$(UI.modal.dialog.template).appendTo("body"),options);return modal.on("hide.uk.modal",function(){modal.persist&&(modal.persist.appendTo(modal.persist.data("modalPersistParent")),modal.persist=!1),modal.element.remove()}),function(content,modal){if(!modal)return;"object"==typeof content?(content=content instanceof jQuery?content:UI.$(content)).parent().length&&(modal.persist=content,modal.persist.data("modalPersistParent",content.parent())):content="string"==typeof content||"number"==typeof content?UI.$("
      ").html(content):UI.$("
      ").html("UIkit.modal Error: Unsupported data type: "+typeof content);content.appendTo(modal.element.find(".uk-modal-dialog"))}(content,modal),modal},UI.modal.dialog.template='
      ',UI.modal.alert=function(content,options){options=UI.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:UI.modal.labels},options);var modal=UI.modal.dialog(['
      '+String(content)+"
      ",'"].join(""),options);return modal.on("show.uk.modal",function(){setTimeout(function(){modal.element.find("button:first").focus()},50)}),modal.show()},UI.modal.confirm=function(content,onconfirm,oncancel){var options=arguments.length>1&&arguments[arguments.length-1]?arguments[arguments.length-1]:{};onconfirm=UI.$.isFunction(onconfirm)?onconfirm:function(){},oncancel=UI.$.isFunction(oncancel)?oncancel:function(){},options=UI.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:UI.modal.labels,confirmButtonClass:""},UI.$.isFunction(options)?{}:options);var modal=UI.modal.dialog(['
      '+String(content)+"
      ",'"].join(""),options);return modal.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click",function(){UI.$(this).is(".js-modal-confirm")?onconfirm():oncancel(),modal.hide()}),modal.on("show.uk.modal",function(){setTimeout(function(){modal.element.find(".js-modal-confirm").focus()},50)}),modal.show()},UI.modal.prompt=function(text,value,onsubmit,options){onsubmit=UI.$.isFunction(onsubmit)?onsubmit:function(value){},options=UI.$.extend(!0,{bgclose:!1,keyboard:!1,modal:!1,labels:UI.modal.labels},options);var modal=UI.modal.dialog([text?'
      '+String(text)+"
      ":"",'

      ','"].join(""),options),input=modal.element.find("input[type='text']").val(value||"").on("keyup",function(e){13==e.keyCode&&modal.element.find(".js-modal-ok").trigger("click")});return modal.element.find(".js-modal-ok").on("click",function(){!1!==onsubmit(input.val())&&modal.hide()}),modal.on("show.uk.modal",function(){setTimeout(function(){input.focus()},50)}),modal.show()},UI.modal.blockUI=function(content,options){var modal=UI.modal.dialog(['
      '+String(content||'
      ...
      ')+"
      "].join(""),UI.$.extend({bgclose:!1,keyboard:!1,modal:!1},options));return modal.content=modal.element.find(".uk-modal-content:first"),modal.show()},UI.modal.labels={Ok:"Ok",Cancel:"Cancel"}}(UIkit),function(UI){"use strict";UI.component("nav",{defaults:{toggle:">li.uk-parent > a[href='#']",lists:">li.uk-parent > ul",multiple:!1},boot:function(){UI.ready(function(context){UI.$("[data-uk-nav]",context).each(function(){var nav=UI.$(this);if(!nav.data("nav"))UI.nav(nav,UI.Utils.options(nav.attr("data-uk-nav")))})})},init:function(){var $this=this;this.on("click.uk.nav",this.options.toggle,function(e){e.preventDefault();var ele=UI.$(this);$this.open(ele.parent()[0]==$this.element[0]?ele:ele.parent("li"))}),this.find(this.options.lists).each(function(){var $ele=UI.$(this),parent=$ele.parent(),active=parent.hasClass("uk-active");$ele.wrap('
      '),parent.data("list-container",$ele.parent()[active?"removeClass":"addClass"]("uk-hidden")),parent.attr("aria-expanded",parent.hasClass("uk-open")),active&&$this.open(parent,!0)})},open:function(li,noanimation){var $this=this,element=this.element,$li=UI.$(li),$container=$li.data("list-container");this.options.multiple||element.children(".uk-open").not(li).each(function(){var ele=UI.$(this);ele.data("list-container")&&ele.data("list-container").stop().animate({height:0},function(){UI.$(this).parent().removeClass("uk-open").end().addClass("uk-hidden")})}),$li.toggleClass("uk-open"),$li.attr("aria-expanded",$li.hasClass("uk-open")),$container&&($li.hasClass("uk-open")&&$container.removeClass("uk-hidden"),noanimation?($container.stop().height($li.hasClass("uk-open")?"auto":0),$li.hasClass("uk-open")||$container.addClass("uk-hidden"),this.trigger("display.uk.check")):$container.stop().animate({height:$li.hasClass("uk-open")?function(ele){var $ele=UI.$(ele),height="auto";if($ele.is(":visible"))height=$ele.outerHeight();else{var tmp={position:$ele.css("position"),visibility:$ele.css("visibility"),display:$ele.css("display")};height=$ele.css({position:"absolute",visibility:"hidden",display:"block"}).outerHeight(),$ele.css(tmp)}return height}($container.find("ul:first")):0},function(){$li.hasClass("uk-open")?$container.css("height",""):$container.addClass("uk-hidden"),$this.trigger("display.uk.check")}))}})}(UIkit),function(UI){"use strict";var scrollpos={x:window.scrollX,y:window.scrollY},$html=(UI.$win,UI.$doc,UI.$html),Offcanvas={show:function(element,options){if((element=UI.$(element)).length){options=UI.$.extend({mode:"push"},options);var $body=UI.$("body"),bar=element.find(".uk-offcanvas-bar:first"),rtl="right"==UI.langdirection,dir=(bar.hasClass("uk-offcanvas-bar-flip")?-1:1)*(rtl?-1:1),scrollbarwidth=window.innerWidth-$body.width();scrollpos={x:window.pageXOffset,y:window.pageYOffset},bar.attr("mode",options.mode),element.addClass("uk-active"),$body.css({width:window.innerWidth-scrollbarwidth,height:window.innerHeight}).addClass("uk-offcanvas-page"),"push"!=options.mode&&"reveal"!=options.mode||$body.css(rtl?"margin-right":"margin-left",(rtl?-1:1)*(bar.outerWidth()*dir)),"reveal"==options.mode&&bar.css("clip","rect(0, "+bar.outerWidth()+"px, 100vh, 0)"),$html.css("margin-top",-1*scrollpos.y).width(),bar.addClass("uk-offcanvas-bar-show"),this._initElement(element),bar.trigger("show.uk.offcanvas",[element,bar]),element.attr("aria-hidden","false")}},hide:function(force){var $body=UI.$("body"),panel=UI.$(".uk-offcanvas.uk-active"),rtl="right"==UI.langdirection,bar=panel.find(".uk-offcanvas-bar:first"),finalize=function(){$body.removeClass("uk-offcanvas-page").css({width:"",height:"",marginLeft:"",marginRight:""}),panel.removeClass("uk-active"),bar.removeClass("uk-offcanvas-bar-show"),$html.css("margin-top",""),window.scrollTo(scrollpos.x,scrollpos.y),bar.trigger("hide.uk.offcanvas",[panel,bar]),panel.attr("aria-hidden","true")};panel.length&&("none"==bar.attr("mode")&&(force=!0),UI.support.transition&&!force?($body.one(UI.support.transition.end,function(){finalize()}).css(rtl?"margin-right":"margin-left",""),"reveal"==bar.attr("mode")&&bar.css("clip",""),setTimeout(function(){bar.removeClass("uk-offcanvas-bar-show")},0)):finalize())},_initElement:function(element){element.data("OffcanvasInit")||(element.on("click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas",function(e){var target=UI.$(e.target);if(!e.type.match(/swipe/)&&!target.hasClass("uk-offcanvas-close")){if(target.hasClass("uk-offcanvas-bar"))return;if(target.parents(".uk-offcanvas-bar:first").length)return}e.stopImmediatePropagation(),Offcanvas.hide()}),element.on("click",'a[href*="#"]',function(e){var link=UI.$(this),href=link.attr("href");"#"!=href&&(UI.$doc.one("hide.uk.offcanvas",function(){var target;try{target=UI.$(link[0].hash)}catch(e){target=""}target.length||(target=UI.$('[name="'+link[0].hash.replace("#","")+'"]')),target.length&&UI.Utils.scrollToElement?UI.Utils.scrollToElement(target,UI.Utils.options(link.attr("data-uk-smooth-scroll")||"{}")):window.location.href=href}),Offcanvas.hide())}),element.data("OffcanvasInit",!0))}};UI.component("offcanvasTrigger",{boot:function(){$html.on("click.offcanvas.uikit","[data-uk-offcanvas]",function(e){e.preventDefault();var ele=UI.$(this);if(!ele.data("offcanvasTrigger")){UI.offcanvasTrigger(ele,UI.Utils.options(ele.attr("data-uk-offcanvas")));ele.trigger("click")}}),$html.on("keydown.uk.offcanvas",function(e){27===e.keyCode&&Offcanvas.hide()})},init:function(){var $this=this;this.options=UI.$.extend({target:!!$this.element.is("a")&&$this.element.attr("href"),mode:"push"},this.options),this.on("click",function(e){e.preventDefault(),Offcanvas.show($this.options.target,$this.options)})}}),UI.offcanvas=Offcanvas}(UIkit),function(UI){"use strict";var Animations;function coreAnimation(cls,current,next){var release,d=UI.$.Deferred(),clsIn=cls,clsOut=cls;return next[0]===current[0]?(d.resolve(),d.promise()):("object"==typeof cls&&(clsIn=cls[0],clsOut=cls[1]||cls[0]),UI.$body.css("overflow-x","hidden"),release=function(){current&¤t.hide().removeClass("uk-active "+clsOut+" uk-animation-reverse"),next.addClass(clsIn).one(UI.support.animation.end,function(){next.removeClass(""+clsIn).css({opacity:"",display:""}),d.resolve(),UI.$body.css("overflow-x",""),current&¤t.css({opacity:"",display:""})}.bind(this)).show()},next.css("animation-duration",this.options.duration+"ms"),current&¤t.length?(current.css("animation-duration",this.options.duration+"ms"),current.css("display","none").addClass(clsOut+" uk-animation-reverse").one(UI.support.animation.end,function(){release()}.bind(this)).css("display","")):(next.addClass("uk-active"),release()),d.promise())}UI.component("switcher",{defaults:{connect:!1,toggle:">*",active:0,animation:!1,duration:200,swiping:!0},animating:!1,boot:function(){UI.ready(function(context){UI.$("[data-uk-switcher]",context).each(function(){var switcher=UI.$(this);if(!switcher.data("switcher"))UI.switcher(switcher,UI.Utils.options(switcher.attr("data-uk-switcher")))})})},init:function(){var $this=this;if(this.on("click.uk.switcher",this.options.toggle,function(e){e.preventDefault(),$this.show(this)}),this.options.connect){this.connect=UI.$(this.options.connect),this.connect.find(".uk-active").removeClass(".uk-active"),this.connect.length&&(this.connect.children().attr("aria-hidden","true"),this.connect.on("click","[data-uk-switcher-item]",function(e){e.preventDefault();var item=UI.$(this).attr("data-uk-switcher-item");if($this.index!=item)switch(item){case"next":case"previous":$this.show($this.index+("next"==item?1:-1));break;default:$this.show(parseInt(item,10))}}),this.options.swiping&&this.connect.on("swipeRight swipeLeft",function(e){e.preventDefault(),window.getSelection().toString()||$this.show($this.index+("swipeLeft"==e.type?1:-1))}));var toggles=this.find(this.options.toggle),active=toggles.filter(".uk-active");if(active.length)this.show(active,!1);else{if(!1===this.options.active)return;active=toggles.eq(this.options.active),this.show(active.length?active:toggles.eq(0),!1)}toggles.not(active).attr("aria-expanded","false"),active.attr("aria-expanded","true"),this.on("changed.uk.dom",function(){$this.connect=UI.$($this.options.connect)})}},show:function(tab,animate){if(!this.animating){if(isNaN(tab))tab=UI.$(tab);else{var toggles=this.find(this.options.toggle);tab=tab<0?toggles.length-1:tab,tab=toggles.eq(toggles[tab]?tab:0)}var $this=this,active=(toggles=this.find(this.options.toggle),UI.$(tab)),animation=Animations[this.options.animation]||function(current,next){if(!$this.options.animation)return Animations.none.apply($this);var anim=$this.options.animation.split(",");return 1==anim.length&&(anim[1]=anim[0]),anim[0]=anim[0].trim(),anim[1]=anim[1].trim(),coreAnimation.apply($this,[anim,current,next])};!1!==animate&&UI.support.animation||(animation=Animations.none),active.hasClass("uk-disabled")||(toggles.attr("aria-expanded","false"),active.attr("aria-expanded","true"),toggles.filter(".uk-active").removeClass("uk-active"),active.addClass("uk-active"),this.options.connect&&this.connect.length&&(this.index=this.find(this.options.toggle).index(active),-1==this.index&&(this.index=0),this.connect.each(function(){var container=UI.$(this),children=UI.$(container.children()),current=UI.$(children.filter(".uk-active")),next=UI.$(children.eq($this.index));$this.animating=!0,animation.apply($this,[current,next]).then(function(){current.removeClass("uk-active"),next.addClass("uk-active"),current.attr("aria-hidden","true"),next.attr("aria-hidden","false"),UI.Utils.checkDisplay(next,!0),$this.animating=!1})})),this.trigger("show.uk.switcher",[active]))}}}),Animations={none:function(){var d=UI.$.Deferred();return d.resolve(),d.promise()},fade:function(current,next){return coreAnimation.apply(this,["uk-animation-fade",current,next])},"slide-bottom":function(current,next){return coreAnimation.apply(this,["uk-animation-slide-bottom",current,next])},"slide-top":function(current,next){return coreAnimation.apply(this,["uk-animation-slide-top",current,next])},"slide-vertical":function(current,next,dir){var anim=["uk-animation-slide-top","uk-animation-slide-bottom"];return current&¤t.index()>next.index()&&anim.reverse(),coreAnimation.apply(this,[anim,current,next])},"slide-left":function(current,next){return coreAnimation.apply(this,["uk-animation-slide-left",current,next])},"slide-right":function(current,next){return coreAnimation.apply(this,["uk-animation-slide-right",current,next])},"slide-horizontal":function(current,next,dir){var anim=["uk-animation-slide-right","uk-animation-slide-left"];return current&¤t.index()>next.index()&&anim.reverse(),coreAnimation.apply(this,[anim,current,next])},scale:function(current,next){return coreAnimation.apply(this,["uk-animation-scale-up",current,next])}},UI.switcher.animations=Animations}(UIkit),function(UI){"use strict";UI.component("tab",{defaults:{target:">li:not(.uk-tab-responsive, .uk-disabled)",connect:!1,active:0,animation:!1,duration:200,swiping:!0},boot:function(){UI.ready(function(context){UI.$("[data-uk-tab]",context).each(function(){var tab=UI.$(this);if(!tab.data("tab"))UI.tab(tab,UI.Utils.options(tab.attr("data-uk-tab")))})})},init:function(){var $this=this;this.current=!1,this.on("click.uk.tab",this.options.target,function(e){if(e.preventDefault(),!$this.switcher||!$this.switcher.animating){var current=$this.find($this.options.target).not(this);current.removeClass("uk-active").blur(),$this.trigger("change.uk.tab",[UI.$(this).addClass("uk-active"),$this.current]),$this.current=UI.$(this),$this.options.connect||(current.attr("aria-expanded","false"),UI.$(this).attr("aria-expanded","true"))}}),this.options.connect&&(this.connect=UI.$(this.options.connect)),this.responsivetab=UI.$('
    • ').append('
        '),this.responsivetab.dropdown=this.responsivetab.find(".uk-dropdown"),this.responsivetab.lst=this.responsivetab.dropdown.find("ul"),this.responsivetab.caption=this.responsivetab.find("a:first"),this.element.hasClass("uk-tab-bottom")&&this.responsivetab.dropdown.addClass("uk-dropdown-up"),this.responsivetab.lst.on("click.uk.tab","a",function(e){e.preventDefault(),e.stopPropagation();var link=UI.$(this);$this.element.children("li:not(.uk-tab-responsive)").eq(link.data("index")).trigger("click")}),this.on("show.uk.switcher change.uk.tab",function(e,tab){$this.responsivetab.caption.html(tab.text())}),this.element.append(this.responsivetab),this.options.connect&&(this.switcher=UI.switcher(this.element,{toggle:">li:not(.uk-tab-responsive)",connect:this.options.connect,active:this.options.active,animation:this.options.animation,duration:this.options.duration,swiping:this.options.swiping})),UI.dropdown(this.responsivetab,{mode:"click",preventflip:"y"}),$this.trigger("change.uk.tab",[this.element.find(this.options.target).not(".uk-tab-responsive").filter(".uk-active")]),this.check(),UI.$win.on("resize orientationchange",UI.Utils.debounce(function(){$this.element.is(":visible")&&$this.check()},100)),this.on("display.uk.check",function(){$this.element.is(":visible")&&$this.check()})},check:function(){var children=this.element.children("li:not(.uk-tab-responsive)").removeClass("uk-hidden");if(children.length){var item,clone,top=children.eq(0).offset().top+Math.ceil(children.eq(0).height()/2),doresponsive=!1;if(this.responsivetab.lst.empty(),children.each(function(){UI.$(this).offset().top>top&&(doresponsive=!0)}),doresponsive)for(var i=0;i-1?"&":"?","enablejsapi=1&api=1"].join(""))}},check:function(){this.element.css({width:"",height:""}),this.dimension={w:this.element.width(),h:this.element.height()},this.element.attr("width")&&!isNaN(this.element.attr("width"))&&(this.dimension.w=this.element.attr("width")),this.element.attr("height")&&!isNaN(this.element.attr("height"))&&(this.dimension.h=this.element.attr("height")),this.ratio=this.dimension.w/this.dimension.h;var width,height,w=this.parent.width(),h=this.parent.height();w/this.ratio
        ').parent()).attr("aria-expanded","false"),$toggle=$this.toggle.eq(index),$wrapper.data("toggle",$toggle),$wrapper.data("content",$content),$toggle.data("wrapper",$wrapper),$content.data("wrapper",$wrapper)}),this.element.trigger("update.uk.accordion",[this])}}),UI.accordion}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-autocomplete",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var active;return UI.component("autocomplete",{defaults:{minLength:3,param:"search",method:"post",delay:300,loadingClass:"uk-loading",flipDropdown:!1,skipClass:"uk-skip",hoverClass:"uk-active",source:null,renderer:null,template:''},visible:!1,value:null,selected:null,boot:function(){UI.$html.on("focus.autocomplete.uikit","[data-uk-autocomplete]",function(e){var ele=UI.$(this);ele.data("autocomplete")||UI.autocomplete(ele,UI.Utils.options(ele.attr("data-uk-autocomplete")))}),UI.$html.on("click.autocomplete.uikit",function(e){active&&e.target!=active.input[0]&&active.hide()})},init:function(){var $this=this,select=!1,trigger=UI.Utils.debounce(function(e){if(select)return select=!1;$this.handle()},this.options.delay);this.dropdown=this.find(".uk-dropdown"),this.template=this.find('script[type="text/autocomplete"]').html(),this.template=UI.Utils.template(this.template||this.options.template),this.input=this.find("input:first").attr("autocomplete","off"),this.dropdown.length||(this.dropdown=UI.$('
        ').appendTo(this.element)),this.options.flipDropdown&&this.dropdown.addClass("uk-dropdown-flip"),this.dropdown.attr("aria-expanded","false"),this.input.on({keydown:function(e){if(e&&e.which&&!e.shiftKey)switch(e.which){case 13:select=!0,$this.selected&&(e.preventDefault(),$this.select());break;case 38:e.preventDefault(),$this.pick("prev",!0);break;case 40:e.preventDefault(),$this.pick("next",!0);break;case 27:case 9:$this.hide()}},keyup:trigger}),this.dropdown.on("click",".uk-autocomplete-results > *",function(){$this.select()}),this.dropdown.on("mouseover",".uk-autocomplete-results > *",function(){$this.pick(UI.$(this))}),this.triggercomplete=trigger},handle:function(){var old=this.value;return this.value=this.input.val(),this.value.lengththis.dropdown.height()||top<0)&&this.dropdown.scrollTop(scrollTop+top)}},select:function(){if(this.selected){var data=this.selected.data();this.trigger("selectitem.uk.autocomplete",[data,this]),data.value&&this.input.val(data.value).trigger("change"),this.hide()}},show:function(){if(!this.visible)return this.visible=!0,this.element.addClass("uk-open"),active&&active!==this&&active.hide(),active=this,this.dropdown.attr("aria-expanded","true"),this},hide:function(){if(this.visible)return this.visible=!1,this.element.removeClass("uk-open"),active===this&&(active=!1),this.dropdown.attr("aria-expanded","false"),this},request:function(){var $this=this,release=function(data){data&&$this.render(data),$this.element.removeClass($this.options.loadingClass)};if(this.element.addClass(this.options.loadingClass),this.options.source){var source=this.options.source;switch(typeof this.options.source){case"function":this.options.source.apply(this,[release]);break;case"object":if(source.length){var items=[];source.forEach(function(item){item.value&&-1!=item.value.toLowerCase().indexOf($this.value.toLowerCase())&&items.push(item)}),release(items)}break;case"string":var params={};params[this.options.param]=this.value,UI.$.ajax({url:this.options.source,data:params,type:this.options.method,dataType:"json"}).done(function(json){release(json||[])});break;default:release(null)}}else this.element.removeClass($this.options.loadingClass)},render:function(data){return this.dropdown.empty(),this.selected=!1,this.options.renderer?this.options.renderer.apply(this,[data]):data&&data.length&&(this.dropdown.append(this.template({items:data})),this.show(),this.trigger("show.uk.autocomplete")),this}}),UI.autocomplete}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-datepicker",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var dropdown,moment,active=!1;return UI.component("datepicker",{defaults:{mobile:!1,weekstart:1,i18n:{months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},format:"YYYY-MM-DD",offsettop:5,maxDate:!1,minDate:!1,pos:"auto",template:function(data,opts){var i,content="";if(content+='
        ',content+='',content+='',UI.formSelect){var months,minYear,maxYear,currentyear=(new Date).getFullYear(),options=[];for(i=0;i'+opts.i18n.months[i]+""):options.push('");for(months=''+opts.i18n.months[data.month]+'",options=[],minYear=data.minDate?data.minDate.year():currentyear-50,maxYear=data.maxDate?data.maxDate.year():currentyear+20,i=minYear;i<=maxYear;i++)i==data.year?options.push('"):options.push('");content+='
        '+months+" "+(''+data.year+'")+"
        "}else content+='
        '+opts.i18n.months[data.month]+" "+data.year+"
        ";for(content+="
        ",content+='',content+="",i=0;i"+data.weekdays[i]+"");for(content+="",content+="",i=0;i";for(var d=0;d'+day.day.format("D")+""}content+=""}return content+="",content+="
        "}},boot:function(){UI.$win.on("resize orientationchange",function(){active&&active.hide()}),UI.$html.on("focus.datepicker.uikit","[data-uk-datepicker]",function(e){var ele=UI.$(this);ele.data("datepicker")||(e.preventDefault(),UI.datepicker(ele,UI.Utils.options(ele.attr("data-uk-datepicker"))),ele.trigger("focus"))}),UI.$html.on("click focus","*",function(e){var target=UI.$(e.target);!active||target[0]==dropdown[0]||target.data("datepicker")||target.parents(".uk-datepicker:first").length||active.hide()})},init:function(){if(!UI.support.touch||"date"!=this.element.attr("type")||this.options.mobile){var $this=this;this.current=this.element.val()?moment(this.element.val(),this.options.format):moment(),this.on("click focus",function(){active!==$this&&$this.pick(this.value?this.value:$this.options.minDate?$this.options.minDate:"")}).on("change",function(){$this.element.val()&&!moment($this.element.val(),$this.options.format).isValid()&&$this.element.val(moment().format($this.options.format))}),dropdown||((dropdown=UI.$('
        ')).on("click",".uk-datepicker-next, .uk-datepicker-previous, [data-date]",function(e){e.stopPropagation(),e.preventDefault();var ele=UI.$(this);if(ele.hasClass("uk-datepicker-date-disabled"))return!1;ele.is("[data-date]")?(active.current=moment(ele.data("date")),active.element.val(active.current.format(active.options.format)).trigger("change"),active.hide()):active.add(ele.hasClass("uk-datepicker-next")?1:-1,"months")}),dropdown.on("change",".update-picker-month, .update-picker-year",function(){var select=UI.$(this);active[select.is(".update-picker-year")?"setYear":"setMonth"](Number(select.val()))}),dropdown.appendTo("body"))}},pick:function(initdate){var offset=this.element.offset(),css={left:offset.left,right:""};this.current=isNaN(initdate)?moment(initdate,this.options.format):moment(),this.initdate=this.current.format("YYYY-MM-DD"),this.update(),"right"==UI.langdirection&&(css.right=window.innerWidth-(css.left+this.element.outerWidth()),css.left="");var posTop=offset.top-this.element.outerHeight()+this.element.height()-this.options.offsettop-dropdown.outerHeight(),posBottom=offset.top+this.element.outerHeight()+this.options.offsettop;css.top=posBottom,"top"==this.options.pos?css.top=posTop:"auto"==this.options.pos&&window.innerHeight-posBottom-dropdown.outerHeight()<0&&posTop>=0&&(css.top=posTop),dropdown.css(css).show(),this.trigger("show.uk.datepicker"),active=this},add:function(unit,value){this.current.add(unit,value),this.update()},setMonth:function(month){this.current.month(month),this.update()},setYear:function(year){this.current.year(year),this.update()},update:function(){var data=this.getRows(this.current.year(),this.current.month()),tpl=this.options.template(data,this.options);dropdown.html(tpl),this.trigger("update.uk.datepicker")},getRows:function(year,month){var opts=this.options,now=moment().format("YYYY-MM-DD"),days=[31,year%4==0&&year%100!=0||year%400==0?29:28,31,30,31,30,31,31,30,31,30,31][month],before=new Date(year,month,1,12).getDay(),data={month:month,year:year,weekdays:[],days:[],maxDate:!1,minDate:!1},row=[];!1!==opts.maxDate&&(data.maxDate=isNaN(opts.maxDate)?moment(opts.maxDate,opts.format):moment().add(opts.maxDate,"days")),!1!==opts.minDate&&(data.minDate=isNaN(opts.minDate)?moment(opts.minDate,opts.format):moment().add(opts.minDate-1,"days")),data.weekdays=function(){for(var i=0,arr=[];i<7;i++){for(var day=i+(opts.weekstart||0);day>=7;)day-=7;arr.push(opts.i18n.weekdays[day])}return arr}(),opts.weekstart&&opts.weekstart>0&&(before-=opts.weekstart)<0&&(before+=7);for(var day,isDisabled,isSelected,isToday,isInMonth,cells=days+before,after=cells;after>7;)after-=7;cells+=7-after;for(var i=0,r=0;iday||data.maxDate&&day>data.maxDate,isInMonth=!(i=days+before),day=moment(day),isSelected=this.initdate==day.format("YYYY-MM-DD"),isToday=now==day.format("YYYY-MM-DD"),row.push({selected:isSelected,today:isToday,disabled:isDisabled,day:day,inmonth:isInMonth}),7==++r&&(data.days.push(row),row=[],r=0);return data},hide:function(){active&&active===this&&(dropdown.hide(),active=!1,this.trigger("hide.uk.datepicker"))}}),moment=window.moment,UI.Utils.moment=moment,UI.datepicker}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-form-password",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";return UI.component("formPassword",{defaults:{lblShow:"Show",lblHide:"Hide"},boot:function(){UI.$html.on("click.formpassword.uikit","[data-uk-form-password]",function(e){var ele=UI.$(this);ele.data("formPassword")||(e.preventDefault(),UI.formPassword(ele,UI.Utils.options(ele.attr("data-uk-form-password"))),ele.trigger("click"))})},init:function(){var $this=this;this.on("click",function(e){if(e.preventDefault(),$this.input.length){var type=$this.input.attr("type");$this.input.attr("type","text"==type?"password":"text"),$this.element.html($this.options["text"==type?"lblShow":"lblHide"])}}),this.input=this.element.next("input").length?this.element.next("input"):this.element.prev("input"),this.element.html(this.options[this.input.is("[type='password']")?"lblShow":"lblHide"]),this.element.data("formPassword",this)}}),UI.formPassword}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-form-select",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";return UI.component("formSelect",{defaults:{target:">span:first",activeClass:"uk-active"},boot:function(){UI.ready(function(context){UI.$("[data-uk-form-select]",context).each(function(){var ele=UI.$(this);ele.data("formSelect")||UI.formSelect(ele,UI.Utils.options(ele.attr("data-uk-form-select")))})})},init:function(){var select,fn,$this=this;this.target=this.find(this.options.target),this.select=this.find("select"),this.select.on("change",(select=$this.select[0],(fn=function(){try{$this.target.text(select.options[select.selectedIndex].text)}catch(e){}return $this.element[$this.select.val()?"addClass":"removeClass"]($this.options.activeClass),fn})())),this.element.data("formSelect",this)}}),UI.formSelect}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-grid",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";UI.component("grid",{defaults:{colwidth:"auto",animation:!0,duration:300,gutter:0,controls:!1,filter:!1},boot:function(){UI.ready(function(context){UI.$("[data-uk-grid]",context).each(function(){var ele=UI.$(this);ele.data("grid")||UI.grid(ele,UI.Utils.options(ele.attr("data-uk-grid")))})})},init:function(){var $this=this,gutter=String(this.options.gutter).trim().split(" ");this.gutterv=parseInt(gutter[0],10),this.gutterh=parseInt(gutter[1]||gutter[0],10),this.element.css({position:"relative"}),this.controls=null,this.options.controls&&(this.controls=UI.$(this.options.controls),this.controls.on("click","[data-uk-filter]",function(e){e.preventDefault(),$this.filter(UI.$(this).data("ukFilter"))}),this.controls.on("click","[data-uk-sort]",function(e){e.preventDefault();var cmd=UI.$(this).attr("data-uk-sort").split(":");$this.sort(cmd[0],cmd[1])})),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){$this.currentfilter?$this.filter($this.currentfilter):this.updateLayout()}.bind(this),100)),this.on("display.uk.check",function(){$this.element.is(":visible")&&$this.updateLayout()}),UI.$html.on("changed.uk.dom",function(e){$this.updateLayout()}),!1!==this.options.filter?this.filter(this.options.filter):this.updateLayout()},_prepareElements:function(){var css,children=this.element.children(":not([data-grid-prepared])");children.length&&(css={position:"absolute","box-sizing":"border-box",width:"auto"==this.options.colwidth?"":this.options.colwidth},this.options.gutter&&(css["padding-left"]=this.gutterh,css["padding-bottom"]=this.gutterv,this.element.css("margin-left",-1*this.gutterh)),children.attr("data-grid-prepared","true").css(css))},updateLayout:function(elements){this._prepareElements();var item,width,height,pos,i,z,max,size,children=elements=elements||this.element.children(":visible"),maxwidth=this.element.width()+2*this.gutterh+2,left=0,top=0,positions=[];this.trigger("beforeupdate.uk.grid",[children]),children.each(function(index){for(size=_getSize(this),item=UI.$(this),width=size.outerWidth,height=size.outerHeight,left=0,top=0,i=0,max=positions.length;i-1&&(infilter=!0)})),elements[infilter?"visible":"hidden"].push(ele)}),elements.hidden=UI.$(elements.hidden).map(function(){return this[0]}),elements.visible=UI.$(elements.visible).map(function(){return this[0]}),elements.hidden.attr("aria-hidden","true").filter(":visible").fadeOut(this.options.duration),elements.visible.attr("aria-hidden","false").filter(":hidden").css("opacity",0).show(),this.updateLayout(elements.visible),this.controls&&this.controls.length&&this.controls.find("[data-uk-filter]").removeClass("uk-active").filter('[data-uk-filter="'+filter+'"]').addClass("uk-active")},sort:function(by,order){"string"==typeof(order=order||1)&&(order="desc"==order.toLowerCase()?-1:1);var elements=this.element.children();elements.sort(function(a,b){return a=UI.$(a),((b=UI.$(b)).data(by)||"")<(a.data(by)||"")?order:-1*order}).appendTo(this.element),this.updateLayout(elements.filter(":visible")),this.controls&&this.controls.length&&this.controls.find("[data-uk-sort]").removeClass("uk-active").filter('[data-uk-sort="'+by+":"+(-1==order?"desc":"asc")+'"]').addClass("uk-active")}});var _getSize=function(){var prefixes="Webkit Moz ms Ms O".split(" "),docElemStyle=document.documentElement.style;function getStyleSize(value){var num=parseFloat(value);return-1===value.indexOf("%")&&!isNaN(num)&&num}var logError="undefined"==typeof console?function(){}:function(message){console.error(message)},measurements=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"];var getStyle,boxSizingProp,isBoxSizeOuter,isSetup=!1;function setup(){if(!isSetup){isSetup=!0;var getStyleFn,getComputedStyle=window.getComputedStyle;if(getStyleFn=getComputedStyle?function(elem){return getComputedStyle(elem,null)}:function(elem){return elem.currentStyle},getStyle=function(elem){var style=getStyleFn(elem);return style||logError("Style returned "+style+". Are you running this code in a hidden iframe on Firefox? See http://bit.ly/getsizebug1"),style},boxSizingProp=function(propName){if(propName){if("string"==typeof docElemStyle[propName])return propName;var prefixed;propName=propName.charAt(0).toUpperCase()+propName.slice(1);for(var i=0,len=prefixes.length;i'),this.preview.append(this.iframe),this.iframe[0].contentWindow.document.open(),this.iframe[0].contentWindow.document.close(),this.preview.container=UI.$(this.iframe[0].contentWindow.document).find("body"),"string"==typeof this.options.iframe&&this.preview.container.parent().append('')):this.preview.container=this.preview,UI.$win.on("resize load",UI.Utils.debounce(function(){$this.fit()},200));var previewContainer=this.iframe?this.preview.container:$this.preview.parent(),codeContent=this.code.find(".CodeMirror-sizer"),codeScroll=this.code.find(".CodeMirror-scroll").on("scroll",UI.Utils.debounce(function(){if("tab"!=$this.htmleditor.attr("data-mode")){var codeHeight=codeContent.height()-codeScroll.height(),ratio=(previewContainer[0].scrollHeight-($this.iframe?$this.iframe.height():previewContainer.height()))/codeHeight,previewPosition=codeScroll.scrollTop()*ratio;previewContainer.scrollTop(previewPosition)}},10));this.htmleditor.on("click",".uk-htmleditor-button-code, .uk-htmleditor-button-preview",function(e){e.preventDefault(),"tab"==$this.htmleditor.attr("data-mode")&&($this.htmleditor.find(".uk-htmleditor-button-code, .uk-htmleditor-button-preview").removeClass("uk-active").filter(this).addClass("uk-active"),$this.activetab=UI.$(this).hasClass("uk-htmleditor-button-code")?"code":"preview",$this.htmleditor.attr("data-active-tab",$this.activetab),$this.editor.refresh())}),this.htmleditor.on("click","a[data-htmleditor-button]",function(){$this.code.is(":visible")&&$this.trigger("action."+UI.$(this).data("htmleditor-button"),[$this.editor])}),this.preview.parent().css("height",this.code.height()),this.options.autocomplete&&this.CodeMirror.showHint&&this.CodeMirror.hint&&this.CodeMirror.hint.html&&this.editor.on("inputRead",UI.Utils.debounce(function(){var POS=$this.editor.getDoc().getCursor();if("xml"==$this.CodeMirror.innerMode($this.editor.getMode(),$this.editor.getTokenAt(POS).state).mode.name){var cur=$this.editor.getCursor(),token=$this.editor.getTokenAt(cur);"<"!=token.string.charAt(0)&&"attribute"!=token.type||$this.CodeMirror.showHint($this.editor,$this.CodeMirror.hint.html,{completeSingle:!1})}},100)),this.debouncedRedraw=UI.Utils.debounce(function(){$this.redraw()},5),this.on("init.uk.component",function(){$this.debouncedRedraw()}),this.element.attr("data-uk-check-display",1).on("display.uk.check",function(e){this.htmleditor.is(":visible")&&this.fit()}.bind(this)),editors.push(this)},addButton:function(name,button){this.buttons[name]=button},addButtons:function(buttons){UI.$.extend(this.buttons,buttons)},replaceInPreview:function(regexp,callback){var editor=this.editor,results=[],value=editor.getValue(),offset=-1,index=0;function translateOffset(offset){var result=editor.getValue().substring(0,offset).split("\n");return{line:result.length-1,ch:result[result.length-1].length}}return this.currentvalue=this.currentvalue.replace(regexp,function(){var match={matches:arguments,from:translateOffset(offset=value.indexOf(arguments[0],++offset)),to:translateOffset(offset+arguments[0].length),replace:function(value){editor.replaceRange(value,match.from,match.to)},inRange:function(cursor){return cursor.line===match.from.line&&cursor.line===match.to.line?cursor.ch>=match.from.ch&&cursor.ch=match.from.ch||cursor.line>match.from.line&&cursor.line'+$this.buttons[button].label+"")}}),this.toolbar.html(bar.join("\n"))}},fit:function(){var mode=this.options.mode;"split"==mode&&this.htmleditor.width()','
        ','
          ','
          ','","
          ","
          ",'
          ','
          ','
          ',"
          ","
          "].join(""),UI.plugin("htmleditor","base",{init:function(editor){editor.addButtons({fullscreen:{title:"Fullscreen",label:''},bold:{title:"Bold",label:''},italic:{title:"Italic",label:''},strike:{title:"Strikethrough",label:''},blockquote:{title:"Blockquote",label:''},link:{title:"Link",label:''},image:{title:"Image",label:''},listUl:{title:"Unordered List",label:''},listOl:{title:"Ordered List",label:''}}),addAction("bold","$1"),addAction("italic","$1"),addAction("strike","$1"),addAction("blockquote","

          $1

          ","replaceLine"),addAction("link",'$1'),addAction("image",'$1');var listfn=function(){if("html"==editor.getCursorMode()){for(var cm=editor.editor,pos=cm.getDoc().getCursor(!0),posend=cm.getDoc().getCursor(!1),i=pos.line;i"+cm.getLine(i)+"",{line:i,ch:0},{line:i,ch:cm.getLine(i).length});cm.setCursor({line:posend.line,ch:cm.getLine(posend.line).length}),cm.focus()}};function addAction(name,replace,mode){editor.on("action."+name,function(){"html"==editor.getCursorMode()&&editor["replaceLine"==mode?"replaceLine":"replaceSelection"](replace)})}editor.on("action.listUl",function(){listfn()}),editor.on("action.listOl",function(){listfn()}),editor.htmleditor.on("click",'a[data-htmleditor-button="fullscreen"]',function(){editor.htmleditor.toggleClass("uk-htmleditor-fullscreen");var wrap=editor.editor.getWrapperElement();if(editor.htmleditor.hasClass("uk-htmleditor-fullscreen"))editor.editor.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:wrap.style.width,height:wrap.style.height},wrap.style.width="",wrap.style.height=editor.content.height()+"px",document.documentElement.style.overflow="hidden";else{document.documentElement.style.overflow="";var info=editor.editor.state.fullScreenRestore;wrap.style.width=info.width,wrap.style.height=info.height,window.scrollTo(info.scrollLeft,info.scrollTop)}setTimeout(function(){editor.fit(),UI.$win.trigger("resize")},50)}),editor.addShortcut(["Ctrl-S","Cmd-S"],function(){editor.element.trigger("htmleditor-save",[editor])}),editor.addShortcutAction("bold",["Ctrl-B","Cmd-B"])}}),UI.plugin("htmleditor","markdown",{init:function(editor){var parser=editor.options.mdparser||marked||null;function enableMarkdown(){editor.editor.setOption("mode","gfm"),editor.htmleditor.find(".uk-htmleditor-button-code a").html(editor.options.lblMarkedview)}function addAction(name,replace,mode){editor.on("action."+name,function(){"markdown"==editor.getCursorMode()&&editor["replaceLine"==mode?"replaceLine":"replaceSelection"](replace)})}parser&&(editor.options.markdown&&enableMarkdown(),addAction("bold","**$1**"),addAction("italic","*$1*"),addAction("strike","~~$1~~"),addAction("blockquote","> $1","replaceLine"),addAction("link","[$1](http://)"),addAction("image","![$1](http://)"),editor.on("action.listUl",function(){if("markdown"==editor.getCursorMode()){for(var cm=editor.editor,pos=cm.getDoc().getCursor(!0),posend=cm.getDoc().getCursor(!1),i=pos.line;i0)(matches=cm.getLine(pos.line-1).match(/^(\d+)\./))&&(prefix=Number(matches[1])+1);for(var i=pos.line;i','
          ','','
          ','
          ',"
          ",""].join("")).appendTo("body")).dialog=modal.find(".uk-modal-dialog:first"),modal.content=modal.find(".uk-lightbox-content:first"),modal.loader=modal.find(".uk-modal-spinner:first"),modal.closer=modal.find(".uk-close.uk-close-alt"),modal.modal=UI.modal(modal,{modal:!1}),modal.on("swipeRight swipeLeft",function(e){modal.lightbox["swipeLeft"==e.type?"next":"previous"]()}).on("click","[data-lightbox-previous], [data-lightbox-next]",function(e){e.preventDefault(),modal.lightbox[UI.$(this).is("[data-lightbox-next]")?"next":"previous"]()}),modal.on("hide.uk.modal",function(e){modal.content.html("")}),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(e){modal.is(":visible")&&!UI.Utils.isFullscreen()&&modal.lightbox.fitSize()}.bind(this),100)),modal.lightbox=lightbox,modal}(this),this.modal.dialog.stop(),this.modal.content.stop();var data,item,$this=this,promise=UI.$.Deferred();"object"==typeof(index=index||0)&&this.siblings.forEach(function(s,idx){index[0]===s.link[0]&&(index=idx)}),index<0?index=this.siblings.length-index:this.siblings[index]||(index=0),item=this.siblings[index],data={lightbox:$this,source:item.source,type:item.type,index:index,promise:promise,title:item.title,item:item,meta:{content:"",width:null,height:null}},this.index=index,this.modal.content.empty(),this.modal.is(":visible")||(this.modal.content.css({width:"",height:""}).empty(),this.modal.modal.show()),this.modal.loader.removeClass("uk-hidden"),promise.promise().done(function(){$this.data=data,$this.fitSize(data)}).fail(function(){data.meta.content='
          Loading resource failed!
          ',data.meta.width=400,data.meta.height=300,$this.data=data,$this.fitSize(data)}),$this.trigger("showitem.uk.lightbox",[data])},fitSize:function(){var $this=this,data=this.data,pad=this.modal.dialog.outerWidth()-this.modal.dialog.width(),dpad=parseInt(this.modal.dialog.css("margin-top"),10)+parseInt(this.modal.dialog.css("margin-bottom"),10),content=data.meta.content,duration=$this.options.duration;this.siblings.length>1&&(content=[content,'',''].join(""));var maxwidth,maxheight,tmp=UI.$("
           
          ").css({opacity:0,position:"absolute",top:0,left:0,width:"100%","max-width":$this.modal.dialog.css("max-width"),padding:$this.modal.dialog.css("padding"),margin:$this.modal.dialog.css("margin")}),w=data.meta.width,h=data.meta.height;tmp.appendTo("body").width(),maxwidth=tmp.width(),maxheight=window.innerHeight-dpad,tmp.remove(),this.modal.dialog.find(".uk-modal-caption").remove(),data.title&&(this.modal.dialog.append('
          '+data.title+"
          "),maxheight-=this.modal.dialog.find(".uk-modal-caption").outerHeight()),maxwidth',width:width,height:height},data.type="image",data.promise.resolve()};if(cache[data.source])resolve(data.source,cache[data.source].width,cache[data.source].height);else{var img=new Image;img.onerror=function(){data.promise.reject("Loading image failed")},img.onload=function(){cache[data.source]={width:img.width,height:img.height},resolve(data.source,cache[data.source].width,cache[data.source].height)},img.src=data.source}}})}}),UI.plugin("lightbox","youtube",{init:function(lightbox){var youtubeRegExp=/(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,youtubeRegExpShort=/youtu\.be\/(.*)/;lightbox.on("showitem.uk.lightbox",function(e,data){var id,matches,resolve=function(id,width,height){data.meta={content:'',width:width,height:height},data.type="iframe",data.promise.resolve()};if((matches=data.source.match(youtubeRegExp))&&(id=matches[2]),(matches=data.source.match(youtubeRegExpShort))&&(id=matches[1]),id){if(cache[id])resolve(id,cache[id].width,cache[id].height);else{var img=new Image,lowres=!1;img.onerror=function(){cache[id]={width:640,height:320},resolve(id,cache[id].width,cache[id].height)},img.onload=function(){120==img.width&&90==img.height?lowres?(cache[id]={width:640,height:320},resolve(id,cache[id].width,cache[id].height)):(lowres=!0,img.src="//img.youtube.com/vi/"+id+"/0.jpg"):(cache[id]={width:img.width,height:img.height},resolve(id,img.width,img.height))},img.src="//img.youtube.com/vi/"+id+"/maxresdefault.jpg"}e.stopImmediatePropagation()}})}}),UI.plugin("lightbox","vimeo",{init:function(lightbox){var matches,regex=/(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/;lightbox.on("showitem.uk.lightbox",function(e,data){var id,resolve=function(id,width,height){data.meta={content:'',width:width,height:height},data.type="iframe",data.promise.resolve()};(matches=data.source.match(regex))&&(id=matches[2],cache[id]?resolve(id,cache[id].width,cache[id].height):UI.$.ajax({type:"GET",url:"http://vimeo.com/api/oembed.json?url="+encodeURI(data.source),jsonp:"callback",dataType:"jsonp",success:function(data){cache[id]={width:data.width,height:data.height},resolve(id,cache[id].width,cache[id].height)}}),e.stopImmediatePropagation())})}}),UI.plugin("lightbox","video",{init:function(lightbox){lightbox.on("showitem.uk.lightbox",function(e,data){var resolve=function(source,width,height){data.meta={content:'',width:width,height:height},data.type="video",data.promise.resolve()};if("video"==data.type||data.source.match(/\.(mp4|webm|ogv)$/i))if(cache[data.source])resolve(data.source,cache[data.source].width,cache[data.source].height);else var vid=UI.$('').attr("src",data.source).appendTo("body"),idle=setInterval(function(){vid[0].videoWidth&&(clearInterval(idle),cache[data.source]={width:vid[0].videoWidth,height:vid[0].videoHeight},resolve(data.source,cache[data.source].width,cache[data.source].height),vid.remove())},20)})}}),UI.lightbox.create=function(items,options){if(items){var group=[];return items.forEach(function(item){group.push(UI.$.extend({source:"",title:"",type:"auto",link:!1},"string"==typeof item?{source:item}:item))}),UI.lightbox(UI.$.extend({},options,{group:group}))}},UI.lightbox}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-nestable",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var draggingElement,hasTouch="ontouchstart"in window,html=UI.$html,touchedlists=[],$win=UI.$win,eStart=hasTouch?"touchstart":"mousedown",eMove=hasTouch?"touchmove":"mousemove",eEnd=hasTouch?"touchend":"mouseup",eCancel=hasTouch?"touchcancel":"mouseup";return UI.component("nestable",{defaults:{listBaseClass:"uk-nestable",listClass:"uk-nestable-list",listItemClass:"uk-nestable-item",dragClass:"uk-nestable-dragged",movingClass:"uk-nestable-moving",noChildrenClass:"uk-nestable-nochildren",emptyClass:"uk-nestable-empty",handleClass:"",collapsedClass:"uk-collapsed",placeholderClass:"uk-nestable-placeholder",noDragClass:"uk-nestable-nodrag",group:!1,maxDepth:10,threshold:20,idlethreshold:10},boot:function(){UI.$html.on("mousemove touchmove",function(e){if(draggingElement){var top=draggingElement.offset().top;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingElement.height()/2))}}),UI.ready(function(context){UI.$("[data-uk-nestable]",context).each(function(){var ele=UI.$(this);ele.data("nestable")||UI.nestable(ele,UI.Utils.options(ele.attr("data-uk-nestable")))})})},init:function(){var $this=this;Object.keys(this.options).forEach(function(key){-1!=String(key).indexOf("Class")&&($this.options["_"+key]="."+$this.options[key])}),this.find(this.options._listItemClass).find(">ul").addClass(this.options.listClass),this.checkEmptyList(),this.reset(),this.element.data("nestable-group",this.options.group||UI.Utils.uid("nestable-group")),this.find(this.options._listItemClass).each(function(){$this.setParent(UI.$(this))}),this.on("click","[data-nestable-action]",function(e){if(!$this.dragEl&&(hasTouch||0===e.button)){e.preventDefault();var target=UI.$(e.currentTarget),action=target.data("nestableAction"),item=target.closest($this.options._listItemClass);"collapse"===action&&$this.collapseItem(item),"expand"===action&&$this.expandItem(item),"toggle"===action&&$this.toggleItem(item)}});var onStartEvent=function(e){var handle=UI.$(e.target);e.target!==$this.element[0]&&(handle.is($this.options._noDragClass)||handle.closest($this.options._noDragClass).length||handle.is("[data-nestable-action]")||handle.closest("[data-nestable-action]").length||($this.options.handleClass&&!handle.hasClass($this.options.handleClass)&&$this.options.handleClass&&(handle=handle.closest($this.options._handleClass)),!handle.length||$this.dragEl||!hasTouch&&0!==e.button||hasTouch&&1!==e.touches.length||(e.originalEvent&&e.originalEvent.touches&&(e=evt.originalEvent.touches[0]),$this.delayMove=function(evt){evt.preventDefault(),$this.dragStart(e),$this.trigger("start.uk.nestable",[$this]),$this.delayMove=!1},$this.delayMove.x=parseInt(e.pageX,10),$this.delayMove.y=parseInt(e.pageY,10),$this.delayMove.threshold=$this.options.idlethreshold,e.preventDefault())))},onMoveEvent=function(e){e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),$this.delayMove&&(Math.abs(e.pageX-$this.delayMove.x)>$this.delayMove.threshold||Math.abs(e.pageY-$this.delayMove.y)>$this.delayMove.threshold)&&(window.getSelection().toString()?$this.delayMove=!1:$this.delayMove(e)),$this.dragEl&&(e.preventDefault(),$this.dragMove(e),$this.trigger("move.uk.nestable",[$this]))},onEndEvent=function(e){$this.dragEl&&(e.preventDefault(),$this.dragStop(hasTouch?e.touches[0]:e)),draggingElement=!1,$this.delayMove=!1};hasTouch?(this.element[0].addEventListener(eStart,onStartEvent,!1),window.addEventListener(eMove,onMoveEvent,!1),window.addEventListener(eEnd,onEndEvent,!1),window.addEventListener(eCancel,onEndEvent,!1)):(this.on(eStart,onStartEvent),$win.on(eMove,onMoveEvent),$win.on(eEnd,onEndEvent))},serialize:function(){var list=this,step=function(level,depth){var array=[];return level.children(list.options._listItemClass).each(function(){for(var attribute,li=UI.$(this),item={},sub=li.children(list.options._listClass),i=0;i").addClass(this.options.listClass+" "+this.options.dragClass).append(dragItem.clone()),this.dragEl.css("width",dragItem.width()),this.placeEl.addClass(this.options.placeholderClass),draggingElement=this.dragEl,this.tmpDragOnSiblings=[dragItem[0].previousSibling,dragItem[0].nextSibling],UI.$body.append(this.dragEl),this.dragEl.css({left:offset.left,top:offset.top});var i,depth,items=this.dragEl.find(this.options._listItemClass);for(i=0;ithis.dragDepth&&(this.dragDepth=depth);html.addClass(this.options.movingClass)},dragStop:function(e){var el=UI.$(this.placeEl),root=this.placeEl.parents(this.options._listBaseClass+":first");this.placeEl.removeClass(this.options.placeholderClass),this.dragEl.remove(),this.element[0]!==root[0]?(root.trigger("change.uk.nestable",[root.data("nestable"),el,"added"]),this.element.trigger("change.uk.nestable",[this,el,"removed"])):this.element.trigger("change.uk.nestable",[this,el,"moved"]),this.trigger("stop.uk.nestable",[this,el]),this.reset(),html.removeClass(this.options.movingClass)},dragMove:function(e){var list,parent,prev,opt=this.options,mouse=this.mouse,maxDepth=this.dragRootEl?this.dragRootEl.data("nestable").options.maxDepth:opt.maxDepth;this.dragEl.css({left:e.pageX-mouse.offsetX,top:e.pageY-mouse.offsetY}),mouse.lastX=mouse.nowX,mouse.lastY=mouse.nowY,mouse.nowX=e.pageX,mouse.nowY=e.pageY,mouse.distX=mouse.nowX-mouse.lastX,mouse.distY=mouse.nowY-mouse.lastY,mouse.lastDirX=mouse.dirX,mouse.lastDirY=mouse.dirY,mouse.dirX=0===mouse.distX?0:mouse.distX>0?1:-1,mouse.dirY=0===mouse.distY?0:mouse.distY>0?1:-1;var newAx=Math.abs(mouse.distX)>Math.abs(mouse.distY)?1:0;if(!mouse.moving)return mouse.dirAx=newAx,void(mouse.moving=!0);if(mouse.dirAx!==newAx?(mouse.distAxX=0,mouse.distAxY=0):(mouse.distAxX+=Math.abs(mouse.distX),0!==mouse.dirX&&mouse.dirX!==mouse.lastDirX&&(mouse.distAxX=0),mouse.distAxY+=Math.abs(mouse.distY),0!==mouse.dirY&&mouse.dirY!==mouse.lastDirY&&(mouse.distAxY=0)),mouse.dirAx=newAx,mouse.dirAx&&mouse.distAxX>=opt.threshold&&(mouse.distAxX=0,prev=this.placeEl.prev("li"),mouse.distX>0&&prev.length&&!prev.hasClass(opt.collapsedClass)&&!prev.hasClass(opt.noChildrenClass)&&(list=prev.find(opt._listClass).last(),this.placeEl.parents(opt._listClass+","+opt._listBaseClass).length+this.dragDepth<=maxDepth&&(list.length?(list=prev.children(opt._listClass).last()).append(this.placeEl):((list=UI.$("
            ").addClass(opt.listClass)).append(this.placeEl),prev.append(list),this.setParent(prev)))),mouse.distX<0&&!this.placeEl.next(opt._listItemClass).length)){var parentUl=this.placeEl.closest([opt._listBaseClass,opt._listClass].join(",")),surroundingLi=parentUl.closest(opt._listItemClass);surroundingLi.length&&(surroundingLi.after(this.placeEl),parentUl.children().length||this.unsetParent(surroundingLi))}var isEmpty=!1,pointX=e.pageX-(window.pageXOffset||document.scrollLeft||0),pointY=e.pageY-(window.pageYOffset||document.documentElement.scrollTop);if(this.pointEl=UI.$(document.elementFromPoint(pointX,pointY)),opt.handleClass&&this.pointEl.hasClass(opt.handleClass))this.pointEl=this.pointEl.closest(opt._listItemClass);else{var nestableitem=this.pointEl.closest(opt._listItemClass);nestableitem.length&&(this.pointEl=nestableitem)}if(!this.placeEl.find(this.pointEl).length){if(this.pointEl.data("nestable")&&!this.pointEl.children().length)isEmpty=!0,this.checkEmptyList(this.pointEl);else if(!this.pointEl.length||!this.pointEl.hasClass(opt.listItemClass))return;var pointElRoot=this.element,tmpRoot=this.pointEl.closest(this.options._listBaseClass),isNewRoot=pointElRoot[0]!=tmpRoot[0];if(!mouse.dirAx||isNewRoot||isEmpty){if(isNewRoot&&opt.group!==tmpRoot.data("nestable-group"))return;if(touchedlists.push(pointElRoot),this.dragDepth-1+this.pointEl.parents(opt._listClass+","+opt._listBaseClass).length>maxDepth)return;var before=e.pageY','',"
            ",""].join("")).data("notifyMessage",this),this.content(this.options.message),this.options.status&&(this.element.addClass("uk-notify-message-"+this.options.status),this.currentstatus=this.options.status),this.group=this.options.group,messages[this.uuid]=this,containers[this.options.pos]||(containers[this.options.pos]=UI.$('
            ').appendTo("body").on("click",".uk-notify-message",function(){var message=UI.$(this).data("notifyMessage");message.element.trigger("manualclose.uk.notify",[message]),message.close()}))};return UI.$.extend(Message.prototype,{uuid:!1,element:!1,timout:!1,currentstatus:"",group:!1,show:function(){if(!this.element.is(":visible")){var $this=this;containers[this.options.pos].show().prepend(this.element);var marginbottom=parseInt(this.element.css("margin-bottom"),10);return this.element.css({opacity:0,"margin-top":-1*this.element.outerHeight(),"margin-bottom":0}).animate({opacity:1,"margin-top":0,"margin-bottom":marginbottom},function(){if($this.options.timeout){var closefn=function(){$this.close()};$this.timeout=setTimeout(closefn,$this.options.timeout),$this.element.hover(function(){clearTimeout($this.timeout)},function(){$this.timeout=setTimeout(closefn,$this.options.timeout)})}}),this}},close:function(instantly){var $this=this,finalize=function(){$this.element.remove(),containers[$this.options.pos].children().length||containers[$this.options.pos].hide(),$this.options.onClose.apply($this,[]),$this.element.trigger("close.uk.notify",[$this]),delete messages[$this.uuid]};this.timeout&&clearTimeout(this.timeout),instantly?finalize():this.element.animate({opacity:0,"margin-top":-1*this.element.outerHeight(),"margin-bottom":0},function(){finalize()})},content:function(html){var container=this.element.find(">div");return html?(container.html(html),this):container.html()},status:function(status){return status?(this.element.removeClass("uk-notify-message-"+this.currentstatus).addClass("uk-notify-message-"+status),this.currentstatus=status,this):this.currentstatus}}),Message.defaults={message:"",status:"",timeout:5e3,group:null,pos:"top-center",onClose:function(){}},UI.notify=notify,UI.notify.message=Message,UI.notify.closeAll=function(group,instantly){var id;if(group)for(id in messages)group===messages[id].group&&messages[id].close(instantly);else for(id in messages)messages[id].close(instantly)},notify}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-pagination",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";return UI.component("pagination",{defaults:{items:1,itemsOnPage:1,pages:0,displayedPages:7,edges:1,currentPage:0,lblPrev:!1,lblNext:!1,onSelectPage:function(){}},boot:function(){UI.ready(function(context){UI.$("[data-uk-pagination]",context).each(function(){var ele=UI.$(this);ele.data("pagination")||UI.pagination(ele,UI.Utils.options(ele.attr("data-uk-pagination")))})})},init:function(){var $this=this;this.pages=this.options.pages?this.options.pages:Math.ceil(this.options.items/this.options.itemsOnPage)?Math.ceil(this.options.items/this.options.itemsOnPage):1,this.currentPage=this.options.currentPage,this.halfDisplayed=this.options.displayedPages/2,this.on("click","a[data-page]",function(e){e.preventDefault(),$this.selectPage(UI.$(this).data("page"))}),this._render()},_getInterval:function(){return{start:Math.ceil(this.currentPage>this.halfDisplayed?Math.max(Math.min(this.currentPage-this.halfDisplayed,this.pages-this.options.displayedPages),0):0),end:Math.ceil(this.currentPage>this.halfDisplayed?Math.min(this.currentPage+this.halfDisplayed,this.pages):Math.min(this.options.displayedPages,this.pages))}},render:function(pages){this.pages=pages||this.pages,this._render()},selectPage:function(pageIndex,pages){this.currentPage=pageIndex,this.render(pages),this.options.onSelectPage.apply(this,[pageIndex]),this.trigger("select.uk.pagination",[pageIndex,this])},_render:function(){var i,o=this.options,interval=this._getInterval();if(this.element.empty(),o.lblPrev&&this._append(this.currentPage-1,{text:o.lblPrev}),interval.start>0&&o.edges>0){var end=Math.min(o.edges,interval.start);for(i=0;i..."):interval.start-o.edges==1&&this._append(o.edges)}for(i=interval.start;i0)for(this.pages-o.edges>interval.end&&this.pages-o.edges-interval.end!=1?this.element.append("
          • ...
          • "):this.pages-o.edges-interval.end==1&&this._append(interval.end++),i=Math.max(this.pages-o.edges,interval.end);i'+options.text+"":'
          • '+options.text+"
          • ",this.element.append(item)}}),UI.pagination}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-parallax",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var parallaxes=[],supports3d=!1,scrolltop=0,wh=window.innerHeight,checkParallaxes=function(){scrolltop=UI.$win.scrollTop(),window.requestAnimationFrame(function(){for(var i=0;i0&&"none"!==has3d}(),UI.$doc.on("scrolling.uk.document",checkParallaxes),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){wh=window.innerHeight,checkParallaxes()},50)),UI.ready(function(context){UI.$("[data-uk-parallax]",context).each(function(){var parallax=UI.$(this);parallax.data("parallax")||UI.parallax(parallax,UI.Utils.options(parallax.attr("data-uk-parallax")))})})},init:function(){this.base=this.options.target?UI.$(this.options.target):this.element,this.props={},this.velocity=this.options.velocity||1;var reserved=["target","velocity","viewport","plugins","media"];Object.keys(this.options).forEach(function(prop){if(-1===reserved.indexOf(prop)){var start,end,dir,diff,startend=String(this.options[prop]).split(",");prop.match(/color/i)?(start=startend[1]?startend[0]:this._getStartValue(prop),end=startend[1]?startend[1]:startend[0],start||(start="rgba(255,255,255,0)")):(diff=(start=parseFloat(startend[1]?startend[0]:this._getStartValue(prop)))<(end=parseFloat(startend[1]?startend[1]:startend[0]))?end-start:start-end,dir=startscrolltop+wh?percent=0:top+height1&&(compercent=1),void 0!==this._percent&&this._percent==compercent||(Object.keys(this.props).forEach(function(prop){switch(opts=this.props[prop],0===percent?val=opts.start:1===percent?val=opts.end:void 0!==opts.diff&&(val=opts.start+opts.diff*compercent*opts.dir),"bg"!=prop&&"bgp"!=prop||this._bgcover||(this._bgcover=function(obj,prop,opts){var url,element,size,check,ratio,width,height,img=new Image;return element=obj.element.css({"background-size":"cover","background-repeat":"no-repeat"}),url=element.css("background-image").replace(/^url\(/g,"").replace(/\)$/g,"").replace(/("|')/g,""),check=function(){var w=element.innerWidth(),h=element.innerHeight(),extra="bg"==prop?opts.diff:opts.diff/100*h;if(h+=extra,(w+=Math.ceil(extra*ratio))-extrawindow.innerHeight&&(width*=1.2,height*=1.2)):(width=w,height=Math.ceil(w/ratio)),element.css({"background-size":width+"px "+height+"px"}).data("bgsize",{w:width,h:height})},img.onerror=function(){},img.onload=function(){size={w:img.width,h:img.height},ratio=img.width/img.height,UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){check()},50)),check()},img.src=url,!0}(this,prop,opts)),prop){case"x":css.transform+=supports3d?" translate3d("+val+"px, 0, 0)":" translateX("+val+"px)";break;case"xp":css.transform+=supports3d?" translate3d("+val+"%, 0, 0)":" translateX("+val+"%)";break;case"y":css.transform+=supports3d?" translate3d(0, "+val+"px, 0)":" translateY("+val+"px)";break;case"yp":css.transform+=supports3d?" translate3d(0, "+val+"%, 0)":" translateY("+val+"%)";break;case"rotate":css.transform+=" rotate("+val+"deg)";break;case"scale":css.transform+=" scale("+val+")";break;case"bg":css["background-position"]="50% "+val+"px";break;case"bgp":css["background-position"]="50% "+val+"%";break;case"color":case"background-color":case"border-color":css[prop]=(start=opts.start,end=opts.end,pos=compercent,start=parseColor(start),end=parseColor(end),function(begin,end,pos){var color="rgba("+parseInt(begin[0]+pos*(end[0]-begin[0]),10)+","+parseInt(begin[1]+pos*(end[1]-begin[1]),10)+","+parseInt(begin[2]+pos*(end[2]-begin[2]),10)+","+(begin&&end?parseFloat(begin[3]+pos*(end[3]-begin[3])):1);return color+=")"}(start,end,pos=pos||0));break;default:css[prop]=val}var start,end,pos}.bind(this)),this.element.css(css),this._percent=compercent)},_getStartValue:function(prop){var value=0;switch(prop){case"scale":value=1;break;default:value=this.element.css(prop)}return value||0}});var colors={black:[0,0,0,1],blue:[0,0,255,1],brown:[165,42,42,1],cyan:[0,255,255,1],fuchsia:[255,0,255,1],gold:[255,215,0,1],green:[0,128,0,1],indigo:[75,0,130,1],khaki:[240,230,140,1],lime:[0,255,0,1],magenta:[255,0,255,1],maroon:[128,0,0,1],navy:[0,0,128,1],olive:[128,128,0,1],orange:[255,165,0,1],pink:[255,192,203,1],purple:[128,0,128,1],violet:[128,0,128,1],red:[255,0,0,1],silver:[192,192,192,1],white:[255,255,255,1],yellow:[255,255,0,1],transparent:[255,255,255,0]};function parseColor(color){var match;return(match=/#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})/.exec(color))?[parseInt(match[1],16),parseInt(match[2],16),parseInt(match[3],16),1]:(match=/#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])/.exec(color))?[17*parseInt(match[1],16),17*parseInt(match[2],16),17*parseInt(match[3],16),1]:(match=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))?[parseInt(match[1]),parseInt(match[2]),parseInt(match[3]),1]:(match=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9\.]*)\s*\)/.exec(color))?[parseInt(match[1],10),parseInt(match[2],10),parseInt(match[3],10),parseFloat(match[4])]:colors[color]||[255,255,255,0]}return UI.parallax}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-grid-parallax",["uikit"],function(){return component||addon(UIkit)})}(function(UI){var parallaxes=[],checkParallaxes=function(){requestAnimationFrame(function(){for(var i=0;i=top);column++);return column||1}UI.component("gridparallax",{defaults:{target:!1,smooth:150,translate:150},boot:function(){UI.$doc.on("scrolling.uk.document",checkParallaxes),UI.$win.on("load resize orientationchange",UI.Utils.debounce(function(){checkParallaxes()},50)),UI.ready(function(context){UI.$("[data-uk-grid-parallax]",context).each(function(){var parallax=UI.$(this);parallax.data("gridparallax")||UI.gridparallax(parallax,UI.Utils.options(parallax.attr("data-uk-grid-parallax")))})})},init:function(){var fn,$this=this;this.initItems().process(),parallaxes.push(this),UI.$win.on("load resize orientationchange",(fn=function(){var columns=getcolumns($this.element);$this.element.css("margin-bottom",""),columns>1&&$this.element.css("margin-bottom",$this.options.translate+parseInt($this.element.css("margin-bottom")))},UI.$(function(){fn()}),UI.Utils.debounce(fn,50)))},initItems:function(){var smooth=this.options.smooth;return this.items=(this.options.target?this.element.find(this.options.target):this.element.children()).each(function(){UI.$(this).css({transition:"transform "+smooth+"ms linear",transform:""})}),this},process:function(){var percent=function(element){var distance,percentage,percent,top=element.offset().top,height=element.outerHeight(),scrolltop=UIkit.$win.scrollTop(),wh=window.innerHeight;top>scrolltop+wh?percent=0:top+height1?1:percent}(this.element),columns=getcolumns(this.element),items=this.items,mods=[columns-1];if(1!=columns&&percent){for(;mods.length {{#msgResultsHeader}}
          • {{msgResultsHeader}}
          • {{/msgResultsHeader}} {{#items && items.length}} {{~items}}
          • {{{$item.title}}} {{#$item.text}}
            {{{$item.text}}}
            {{/$item.text}}
          • {{/items}} {{#msgMoreResults}}
          • {{msgMoreResults}}
          • {{/msgMoreResults}} {{/end}} {{^items.length}} {{#msgNoResults}}
          • {{msgNoResults}}
          • {{/msgNoResults}} {{/end}}
          ',renderer:function(data){var opts=this.options;this.dropdown.append(this.template({items:data.results||[],msgResultsHeader:opts.msgResultsHeader,msgMoreResults:opts.msgMoreResults,msgNoResults:opts.msgNoResults})),this.show()}},boot:function(){UI.$html.on("focus.search.uikit","[data-uk-search]",function(e){var ele=UI.$(this);ele.data("search")||UI.search(ele,UI.Utils.options(ele.attr("data-uk-search")))})},init:function(){var $this=this;this.autocomplete=UI.autocomplete(this.element,this.options),this.autocomplete.dropdown.addClass("uk-dropdown-search"),this.autocomplete.input.on("keyup",function(){$this.element[$this.autocomplete.input.val()?"addClass":"removeClass"]("uk-active")}).closest("form").on("reset",function(){$this.value="",$this.element.removeClass("uk-active")}),this.on("selectitem.uk.autocomplete",function(e,data){data.url?location.href=data.url:data.moreresults&&$this.autocomplete.input.closest("form").submit()}),this.element.data("search",this)}})}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-slider",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var dragging,delayIdle,anchor,dragged,store={};return UI.component("slider",{defaults:{center:!1,threshold:10,infinite:!0,autoplay:!1,autoplayInterval:7e3,pauseOnHover:!0,activecls:"uk-active"},boot:function(){UI.ready(function(context){setTimeout(function(){UI.$("[data-uk-slider]",context).each(function(){var ele=UI.$(this);ele.data("slider")||UI.slider(ele,UI.Utils.options(ele.attr("data-uk-slider")))})},0)})},init:function(){var $this=this;this.container=this.element.find(".uk-slider"),this.focus=0,UI.$win.on("resize load",UI.Utils.debounce(function(){$this.resize(!0)},100)),this.on("click.uk.slider","[data-uk-slider-item]",function(e){e.preventDefault();var item=UI.$(this).attr("data-uk-slider-item");if($this.focus!=item)switch($this.stop(),item){case"next":case"previous":$this["next"==item?"next":"previous"]();break;default:$this.updateFocus(parseInt(item,10))}}),this.container.on({"touchstart mousedown":function(evt){evt.originalEvent&&evt.originalEvent.touches&&(evt=evt.originalEvent.touches[0]),evt.button&&2==evt.button||!$this.active||($this.stop(),anchor=UI.$(evt.target).is("a")?UI.$(evt.target):UI.$(evt.target).parents("a:first"),dragged=!1,anchor.length&&anchor.one("click",function(e){dragged&&e.preventDefault()}),(delayIdle=function(e){dragged=!0,dragging=$this,store={touchx:parseInt(e.pageX,10),dir:1,focus:$this.focus,base:$this.options.center?"center":"area"},e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),dragging.element.data({"pointer-start":{x:parseInt(e.pageX,10),y:parseInt(e.pageY,10)},"pointer-pos-start":$this.pos}),$this.container.addClass("uk-drag"),delayIdle=!1}).x=parseInt(evt.pageX,10),delayIdle.threshold=$this.options.threshold)},mouseenter:function(){$this.options.pauseOnHover&&($this.hovering=!0)},mouseleave:function(){$this.hovering=!1}}),this.resize(!0),this.on("display.uk.check",function(){$this.element.is(":visible")&&$this.resize(!0)}),this.element.find("a,img").attr("draggable","false"),this.options.autoplay&&this.start()},resize:function(focus){var item,width,cwidth,size,$this=this,pos=0,maxheight=0;if(this.items=this.container.children().filter(":visible"),this.vp=this.element[0].getBoundingClientRect().width,this.container.css({"min-width":"","min-height":""}),this.items.each(function(idx){item=UI.$(this),size=item.css({left:"",width:""})[0].getBoundingClientRect(),width=size.width,cwidth=item.width(),maxheight=Math.max(maxheight,size.height),item.css({left:pos,width:width}).data({idx:idx,left:pos,width:width,cwidth:cwidth,area:pos+width,center:pos-($this.vp/2-cwidth/2)}),pos+=width}),this.container.css({"min-width":pos,"min-height":maxheight}),this.options.infinite&&(pos<=2*this.vp||this.items.length<5)&&!this.itemsResized)return this.container.children().each(function(idx){$this.container.append($this.items.eq(idx).clone(!0).attr("id",""))}).each(function(idx){$this.container.append($this.items.eq(idx).clone(!0).attr("id",""))}),this.itemsResized=!0,this.resize();this.cw=pos,this.pos=0,this.active=pos>=this.vp,this.container.css({"-ms-transform":"","-webkit-transform":"",transform:""}),focus&&this.updateFocus(this.focus)},updatePos:function(pos){this.pos=pos,this.container.css({"-ms-transform":"translateX("+pos+"px)","-webkit-transform":"translateX("+pos+"px)",transform:"translateX("+pos+"px)"})},updateFocus:function(idx,dir){if(this.active){dir=dir||(idx>this.focus?1:-1);var area,i,item=this.items.eq(idx);if(this.options.infinite&&this.infinite(idx,dir),this.options.center)this.updatePos(-1*item.data("center")),this.items.filter("."+this.options.activecls).removeClass(this.options.activecls),item.addClass(this.options.activecls);else if(this.options.infinite)this.updatePos(-1*item.data("left"));else{for(area=0,i=idx;ithis.vp)this.updatePos(-1*item.data("left"));else if(1==dir){for(area=0,i=this.items.length-1;i>=0;i--){if((area+=this.items.eq(i).data("width"))==this.vp){idx=i;break}if(area>this.vp){idx=ithis.vp?this.updatePos(-1*(this.container.width()-this.vp)):this.updatePos(-1*this.items.eq(idx).data("left"))}}var left=this.items.eq(idx).data("left");this.items.removeClass("uk-slide-before uk-slide-after").each(function(i){i!==idx&&UI.$(this).addClass(UI.$(this).data("left")this.vp));i++)z=z+1==this.items.length?0:z+1;move.length&&move.forEach(function(itm){var left=item.data("area");itm.css({left:left}).data({left:left,area:left+itm.data("width"),center:left-($this.vp/2-itm.data("cwidth")/2)}),item=itm})}else{for(i=this.items.length-1;i>-1&&(area+=this.items.eq(z).data("width"),z!=baseidx&&move.push(this.items.eq(z)),!(area>this.vp));i--)z=z-1==-1?this.items.length-1:z-1;move.length&&move.forEach(function(itm){var left=item.data("left")-itm.data("width");itm.css({left:left}).data({left:left,area:left+itm.data("width"),center:left-($this.vp/2-itm.data("cwidth")/2)}),item=itm})}}}),UI.$doc.on("mousemove.uk.slider touchmove.uk.slider",function(e){if(e.originalEvent&&e.originalEvent.touches&&(e=e.originalEvent.touches[0]),delayIdle&&Math.abs(e.pageX-delayIdle.x)>delayIdle.threshold&&(window.getSelection().toString()?dragging=delayIdle=!1:delayIdle(e)),dragging){var x,xDiff,pos,dir,focus,item,diff,i,z,itm;if(e.clientX||e.clientY?x=e.clientX:(e.pageX||e.pageY)&&(x=e.pageX-document.body.scrollLeft-document.documentElement.scrollLeft),focus=store.focus,xDiff=x-dragging.element.data("pointer-start").x,pos=dragging.element.data("pointer-pos-start")+xDiff,dir=x>dragging.element.data("pointer-start").x?-1:1,item=dragging.items.eq(store.focus),1==dir)for(diff=item.data("left")+Math.abs(xDiff),i=0,z=store.focus;idiff){focus=z;break}z=z+1==dragging.items.length?0:z+1}else for(diff=item.data("left")-Math.abs(xDiff),i=0,z=store.focus;istore.diff){focus=z;break}z=z+1==dragging.items.length?0:z+1}else for(i=0,z=store.focus;i').css({"background-image":"url("+media.attr("src")+")"});media.attr("width")&&media.attr("height")&&(placeholder=UI.$("").attr({width:media.attr("width"),height:media.attr("height")}),media.replaceWith(placeholder),media=placeholder,placeholder=void 0),media.css({width:"100%",height:"auto",opacity:0}),slide.prepend(cover).data("cover",cover);break;case"IFRAME":var src=media[0].src,iframeId="sw-"+ ++playerId;media.attr("src","").on("load",function(){if((index!==$this.current||index==$this.current&&!$this.options.videoautoplay)&&$this.pausemedia(media),$this.options.videomute){$this.mutemedia(media);var inv=setInterval((ic=0,function(){$this.mutemedia(media),++ic>=4&&clearInterval(inv)}),250)}var ic}).data("slideshow",$this).attr("data-player-id",iframeId).attr("src",[src,src.indexOf("?")>-1?"&":"?","enablejsapi=1&api=1&player_id="+iframeId].join("")).addClass("uk-position-absolute"),UI.support.touch||media.css("pointer-events","none"),placeholder=!0,UI.cover&&(UI.cover(media),media.attr("data-uk-cover","{}"));break;case"VIDEO":media.addClass("uk-cover-object uk-position-absolute"),placeholder=!0,$this.options.videomute&&$this.mutemedia(media)}if(placeholder){canvas=UI.$("").attr({width:media[0].width,height:media[0].height});var img=UI.$('').attr("src",canvas[0].toDataURL());slide.prepend(img),slide.data("sizer",img)}}else slide.data("sizer",slide);$this.hasKenBurns(slide)&&slide.data("cover").css({"-webkit-animation-duration":kbanimduration,"animation-duration":kbanimduration})}),this.on("click.uk.slideshow","[data-uk-slideshow-item]",function(e){e.preventDefault();var slide=UI.$(this).attr("data-uk-slideshow-item");if($this.current!=slide){switch(slide){case"next":case"previous":$this["next"==slide?"next":"previous"]();break;default:$this.show(parseInt(slide,10))}$this.stop()}}),this.slides.attr("aria-hidden","true").eq(this.current).addClass("uk-active").attr("aria-hidden","false"),this.triggers.filter('[data-uk-slideshow-item="'+this.current+'"]').addClass("uk-active"),UI.$win.on("resize load",UI.Utils.debounce(function(){$this.resize(),$this.fixFullscreen&&($this.container.css("height",window.innerHeight),$this.slides.css("height",window.innerHeight))},100)),setTimeout(function(){$this.resize()},80),this.options.autoplay&&this.start(),this.options.videoautoplay&&this.slides.eq(this.current).data("media")&&this.playmedia(this.slides.eq(this.current).data("media")),this.options.kenburns&&this.applyKenBurns(this.slides.eq(this.current)),this.container.on({mouseenter:function(){$this.options.pauseOnHover&&($this.hovering=!0)},mouseleave:function(){$this.hovering=!1}}),this.on("swipeRight swipeLeft",function(e){$this["swipeLeft"==e.type?"next":"previous"]()}),this.on("display.uk.check",function(){$this.element.is(":visible")&&($this.resize(),$this.fixFullscreen&&($this.container.css("height",window.innerHeight),$this.slides.css("height",window.innerHeight)))})},resize:function(){if(!this.container.hasClass("uk-slideshow-fullscreen")){var height=this.options.height;"auto"===this.options.height&&(height=0,this.slides.css("height","").each(function(){height=Math.max(height,UI.$(this).height())})),this.container.css("height",height),this.slides.css("height",height)}},show:function(index,direction){if(!this.animating&&this.current!=index){this.animating=!0;var $this=this,current=this.slides.eq(this.current),next=this.slides.eq(index),dir=direction||(this.current-1&&"ready"==data.event&&data.player_id&&(iframe=UI.$('[data-player-id="'+data.player_id+'"]')).length&&iframe.data("slideshow").mutemedia(iframe)},!1)}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-slideshow-fx",["uikit","uikit-slideshow"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var Animations=UI.slideshow.animations;UI.$.extend(UI.slideshow.animations,{slice:function(current,next,dir,fromfx){if(!current.data("cover"))return Animations.fade.apply(this,arguments);for(var bar,d=UI.$.Deferred(),sliceWidth=Math.ceil(this.element.width()/this.options.slices),bgimage=next.data("cover").css("background-image"),ghost=UI.$("
        • ").css({top:0,left:0,width:this.container.width(),height:this.container.height(),opacity:1,zIndex:15}),ghostWidth=ghost.width(),ghostHeight=ghost.height(),i=0;i').css({position:"absolute",top:0,left:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,clip:clipfrom,opacity:0,transition:"all "+this.options.duration+"ms ease-in-out "+60*i+"ms","-webkit-transition":"all "+this.options.duration+"ms ease-in-out "+60*i+"ms"}).data("clip",clipto),ghost.append(bar)}return this.container.append(ghost),ghost.children().last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),ghost.children().each(function(){var bar=UI.$(this);bar.css({clip:bar.data("clip"),opacity:1})}),d.promise()},"slice-up":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-up"])},"slice-down":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-down"])},"slice-up-down":function(current,next,dir){return Animations.slice.apply(this,[current,next,dir,"slice-up-down"])},fold:function(current,next,dir){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var bar,d=UI.$.Deferred(),sliceWidth=Math.ceil(this.element.width()/this.options.slices),bgimage=next.data("cover").css("background-image"),ghost=UI.$("
        • ").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),i=0;i').css({position:"absolute",top:0,left:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,"transform-origin":sliceWidth*i+"px 0 0",clip:"rect(0px, "+sliceWidth*(i+1)+"px, "+ghostHeight+"px, "+sliceWidth*i+"px)",opacity:0,transform:"scaleX(0.000001)",transition:"all "+this.options.duration+"ms ease-in-out "+(100+60*i)+"ms","-webkit-transition":"all "+this.options.duration+"ms ease-in-out "+(100+60*i)+"ms"}),ghost.prepend(bar);return this.container.append(ghost),ghost.width(),ghost.children().first().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}).end().css({transform:"scaleX(1)",opacity:1}),d.promise()},puzzle:function(current,next,dir){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var box,rect,d=UI.$.Deferred(),$this=this,boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data("cover").css("background-image"),ghost=UI.$("
        • ").css({width:this.container.width(),height:this.container.height(),opacity:1,zIndex:15}),ghostWidth=this.container.width(),ghostHeight=this.container.height(),rows=0;rows').css({position:"absolute",top:0,left:0,opacity:0,width:ghostWidth,height:ghostHeight,"background-image":bgimage,clip:"rect("+rect.join(",")+")","-webkit-transform":"translateZ(0)",transform:"translateZ(0)"}),ghost.append(box);this.container.append(ghost);var boxes=shuffle(ghost.children());return boxes.each(function(i){UI.$(this).css({transition:"all "+$this.options.duration+"ms ease-in-out "+(50+25*i)+"ms","-webkit-transition":"all "+$this.options.duration+"ms ease-in-out "+(50+25*i)+"ms"})}).last().on(UI.support.transition.end,function(){ghost.remove(),d.resolve()}),ghost.width(),boxes.css({opacity:1}),d.promise()},boxes:function(current,next,dir,fromfx){if(!next.data("cover"))return Animations.fade.apply(this,arguments);for(var box,rect,cols,d=UI.$.Deferred(),boxCols=Math.round(this.options.slices/2),boxWidth=Math.round(next.width()/boxCols),boxRows=Math.round(next.height()/boxWidth),boxHeight=Math.round(next.height()/boxRows)+1,bgimage=next.data("cover").css("background-image"),ghost=UI.$("
        • ").css({width:next.width(),height:next.height(),opacity:1,zIndex:15}),ghostWidth=next.width(),ghostHeight=next.height(),rows=0;rows').css({position:"absolute",top:0,left:0,opacity:1,width:ghostWidth,height:ghostHeight,"background-image":bgimage,"transform-origin":rect[3]+" "+rect[0]+" 0",clip:"rect("+rect.join(",")+")","-webkit-transform":"scale(0.0000000000000001)",transform:"scale(0.0000000000000001)"}),ghost.append(box);this.container.append(ghost);var prevCol,rowIndex=0,colIndex=0,timeBuff=0,box2Darr=[[]],boxes=ghost.children();for("boxes-reverse"==fromfx&&(boxes=[].reverse.apply(boxes)),boxes.each(function(){box2Darr[rowIndex][colIndex]=UI.$(this),++colIndex==boxCols&&(colIndex=0,box2Darr[++rowIndex]=[])}),cols=0,prevCol=0;cols=0&&prevColdelayIdle.threshold||Math.abs(src.pageY-delayIdle.pos.y)>delayIdle.threshold)&&delayIdle.apply(src)}if(draggingPlaceholder){moving||(moving=!0,draggingPlaceholder.show(),draggingPlaceholder.$current.addClass(draggingPlaceholder.$sortable.options.placeholderClass),draggingPlaceholder.$sortable.element.children().addClass(draggingPlaceholder.$sortable.options.childClass),UI.$html.addClass(draggingPlaceholder.$sortable.options.dragMovingClass));var offset=draggingPlaceholder.data("mouse-offset"),left=parseInt(e.originalEvent.pageX,10)+offset.left,top=parseInt(e.originalEvent.pageY,10)+offset.top;if(draggingPlaceholder.css({left:left,top:top}),top+draggingPlaceholder.height()/3>document.body.offsetHeight)return;topwindow.innerHeight+UI.$win.scrollTop()&&UI.$win.scrollTop(UI.$win.scrollTop()+Math.ceil(draggingPlaceholder.height()/3))}}),UI.$html.on("mouseup touchend",function(e){if(delayIdle=!1,currentlyDraggingElement&&draggingPlaceholder){var sortable=function(ele){ele=UI.$(ele);do{if(ele.data("sortable"))return ele;ele=UI.$(ele).parent()}while(ele.length);return ele}(currentlyDraggingElement),component=draggingPlaceholder.$sortable,ev={type:e.type};sortable[0]&&component.dragDrop(ev,component.element),component.dragEnd(ev,component.element)}else currentlyDraggingElement=draggingPlaceholder=null})},init:function(){var $this=this,element=this.element[0];touchedlists=[],this.checkEmptyList(),this.element.data("sortable-group",this.options.group?this.options.group:UI.Utils.uid("sortable-group"));var handleDragStart=delegate(function(e){if(!e.data||!e.data.sortable){var $target=UI.$(e.target),$link=$target.is("a[href]")?$target:$target.parents("a[href]");if(!$target.is(":input"))return e.preventDefault(),!supportsTouch&&$link.length&&$link.one("click",function(e){e.preventDefault()}).one("mouseup",function(){moved||$link.trigger("click")}),e.data=e.data||{},e.data.sortable=element,$this.dragStart(e,this)}}),handleDragEnter=delegate(UI.Utils.debounce(function(e){return $this.dragEnter(e,this)})),handleDragLeave=delegate(function(e){var previousCounter=$this.dragenterData(this);$this.dragenterData(this,previousCounter-1),$this.dragenterData(this)||(UI.$(this).removeClass($this.options.overClass),$this.dragenterData(this,!1))}),handleTouchMove=delegate(function(e){return!currentlyDraggingElement||currentlyDraggingElement===this||currentlyDraggingTarget===this||($this.element.children().removeClass($this.options.overClass),currentlyDraggingTarget=this,$this.moveElementNextTo(currentlyDraggingElement,this),function(e){e.stopPropagation&&e.stopPropagation();e.preventDefault&&e.preventDefault();e.returnValue=!1}(e))});function delegate(fn){return function(e){var target,context;e&&(target=(supportsTouch&&e.touches&&e.touches[0]||{}).target||e.target,supportsTouch&&document.elementFromPoint&&(target=document.elementFromPoint(e.pageX-document.body.scrollLeft,e.pageY-document.body.scrollTop)),overElement=UI.$(target)),UI.$(target).hasClass($this.options.childClass)?fn.apply(target,[e]):target!==element&&(context=function(parent,child){var cur=child;if(cur==parent)return null;for(;cur;){if(cur.parentNode===parent)return cur;if(!(cur=cur.parentNode)||!cur.ownerDocument||11===cur.nodeType)break}return null}(element,target))&&fn.apply(context,[e])}}this.addDragHandlers=function(){supportsTouch?element.addEventListener("touchmove",handleTouchMove,!1):(element.addEventListener("mouseover",handleDragEnter,!1),element.addEventListener("mouseout",handleDragLeave,!1))},this.removeDragHandlers=function(){supportsTouch?element.removeEventListener("touchmove",handleTouchMove,!1):(element.removeEventListener("mouseover",handleDragEnter,!1),element.removeEventListener("mouseout",handleDragLeave,!1))},window.addEventListener(supportsTouch?"touchmove":"mousemove",function(e){currentlyDraggingElement&&$this.dragMove(e,$this)},!1),element.addEventListener(supportsTouch?"touchstart":"mousedown",handleDragStart,!1)},dragStart:function(e,elem){moved=!1,moving=!1,!1;var $this=this,target=UI.$(e.target);if(supportsTouch||2!=e.button){if($this.options.handleClass)if(!(target.hasClass($this.options.handleClass)?target:target.closest("."+$this.options.handleClass,$this.element)).length)return;if(!target.is("."+$this.options.noDragClass)&&!target.closest("."+$this.options.noDragClass).length&&!target.is(":input")){currentlyDraggingElement=elem,draggingPlaceholder&&draggingPlaceholder.remove();var $current=UI.$(currentlyDraggingElement),offset=$current.offset();delayIdle={pos:{x:e.pageX,y:e.pageY},threshold:$this.options.threshold,apply:function(evt){(draggingPlaceholder=UI.$('
          ').css({display:"none",top:offset.top,left:offset.left,width:$current.width(),height:$current.height(),padding:$current.css("padding")}).data({"mouse-offset":{left:offset.left-parseInt(evt.pageX,10),top:offset.top-parseInt(evt.pageY,10)},origin:$this.element,index:$current.index()}).append($current.html()).appendTo("body")).$current=$current,draggingPlaceholder.$sortable=$this,$current.data({"start-list":$current.parent(),"start-index":$current.index(),"sortable-group":$this.options.group}),$this.addDragHandlers(),$this.options.start(this,currentlyDraggingElement),$this.trigger("start.uk.sortable",[$this,currentlyDraggingElement]),moved=!0,delayIdle=!1}}}}},dragMove:function(e,elem){var overChild,overRoot=(overElement=UI.$(document.elementFromPoint(e.pageX-(document.body.scrollLeft||document.scrollLeft||0),e.pageY-(document.body.scrollTop||document.documentElement.scrollTop||0)))).closest("."+this.options.baseClass),groupOver=overRoot.data("sortable-group"),$current=UI.$(currentlyDraggingElement),currentRoot=$current.parent(),groupCurrent=$current.data("sortable-group");overRoot[0]!==currentRoot[0]&&void 0!==groupCurrent&&groupOver===groupCurrent&&(overRoot.data("sortable").addDragHandlers(),touchedlists.push(overRoot),overRoot.children().addClass(this.options.childClass),overRoot.children().length>0?(overChild=overElement.closest("."+this.options.childClass)).length?overChild.before($current):overRoot.append($current):overElement.append($current),UIkit.$doc.trigger("mouseover")),this.checkEmptyList(),this.checkEmptyList(currentRoot)},dragEnter:function(e,elem){if(!currentlyDraggingElement||currentlyDraggingElement===elem)return!0;var previousCounter=this.dragenterData(elem);if(this.dragenterData(elem,previousCounter+1),0===previousCounter){var currentlist=UI.$(elem).parent(),startlist=UI.$(currentlyDraggingElement).data("start-list");if(currentlist[0]!==startlist[0]){var groupOver=currentlist.data("sortable-group"),groupCurrent=UI.$(currentlyDraggingElement).data("sortable-group");if((groupOver||groupCurrent)&&groupOver!=groupCurrent)return!1}UI.$(elem).addClass(this.options.overClass),this.moveElementNextTo(currentlyDraggingElement,elem)}return!1},dragEnd:function(e,elem){var $this=this;currentlyDraggingElement&&(this.options.stop(elem),this.trigger("stop.uk.sortable",[this])),currentlyDraggingElement=null,currentlyDraggingTarget=null,touchedlists.push(this.element),touchedlists.forEach(function(el,i){UI.$(el).children().each(function(){1===this.nodeType&&(UI.$(this).removeClass($this.options.overClass).removeClass($this.options.placeholderClass).removeClass($this.options.childClass),$this.dragenterData(this,!1))})}),touchedlists=[],UI.$html.removeClass(this.options.dragMovingClass),this.removeDragHandlers(),draggingPlaceholder&&(draggingPlaceholder.remove(),draggingPlaceholder=null)},dragDrop:function(e,elem){"drop"===e.type&&(e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault()),this.triggerChangeEvents()},triggerChangeEvents:function(){if(currentlyDraggingElement){var $current=UI.$(currentlyDraggingElement),oldRoot=draggingPlaceholder.data("origin"),newRoot=$current.closest("."+this.options.baseClass),triggers=[],el=UI.$(currentlyDraggingElement);oldRoot[0]===newRoot[0]&&draggingPlaceholder.data("index")!=$current.index()?triggers.push({sortable:this,mode:"moved"}):oldRoot[0]!=newRoot[0]&&triggers.push({sortable:UI.$(newRoot).data("sortable"),mode:"added"},{sortable:UI.$(oldRoot).data("sortable"),mode:"removed"}),triggers.forEach(function(trigger,i){trigger.sortable&&trigger.sortable.element.trigger("change.uk.sortable",[trigger.sortable,el,trigger.mode])})}},dragenterData:function(element,val){if(element=UI.$(element),1==arguments.length)return parseInt(element.data("child-dragenter"),10)||0;val?element.data("child-dragenter",Math.max(0,val)):element.removeData("child-dragenter")},moveElementNextTo:function(element,elementToMoveNextTo){!0;var $this=this,list=UI.$(element).parent().css("min-height",""),next=function(el1,el2){var parent=el1.parentNode;if(el2.parentNode!=parent)return!1;var cur=el1.previousSibling;for(;cur&&9!==cur.nodeType;){if(cur===el2)return!0;cur=cur.previousSibling}return!1}(element,elementToMoveNextTo)?elementToMoveNextTo:elementToMoveNextTo.nextSibling,children=list.children(),count=children.length;if(!$this.options.animation)return elementToMoveNextTo.parentNode.insertBefore(element,next),void UI.Utils.checkDisplay($this.element.parent());list.css("min-height",list.height()),children.stop().each(function(){var ele=UI.$(this),offset=ele.position();offset.width=ele.width(),ele.data("offset-before",offset)}),elementToMoveNextTo.parentNode.insertBefore(element,next),UI.Utils.checkDisplay($this.element.parent()),(children=list.children().each(function(){var ele=UI.$(this);ele.data("offset-after",ele.position())}).each(function(){var ele=UI.$(this),before=ele.data("offset-before");ele.css({position:"absolute",top:before.top,left:before.left,"min-width":before.width})})).each(function(){var ele=UI.$(this),offset=(ele.data("offset-before"),ele.data("offset-after"));ele.css("pointer-events","none").width(),setTimeout(function(){ele.animate({top:offset.top,left:offset.left},$this.options.animation,function(){ele.css({position:"",top:"",left:"","min-width":"","pointer-events":""}).removeClass($this.options.overClass).removeData("child-dragenter"),--count||(list.css("min-height",""),UI.Utils.checkDisplay($this.element.parent()))})},0)})},serialize:function(){var item,attribute,data=[];return this.element.children().each(function(j,child){item={};for(var i=0;idwh?dwh-scrollTop:0,i=0;idocumentHeight-containerBottom-(sticky.top<0?0:sticky.top)?documentHeight-containerBottom-(scrollTop+stickyHeight):newTop}if(sticky.currentTop!=newTop){if(sticky.element.css({position:"fixed",top:newTop,width:sticky.getWidthFrom.length?sticky.getWidthFrom.width():sticky.element.width()}),!sticky.init&&(sticky.element.addClass(sticky.options.clsinit),location.hash&&scrollTop>0&&sticky.options.target)){var $target=UI.$(location.hash);$target.length&&setTimeout(function($target,sticky){return function(){sticky.element.width();var offset=$target.offset(),maxoffset=offset.top+$target.outerHeight(),stickyOffset=sticky.element.offset(),stickyHeight=sticky.element.outerHeight(),stickyMaxOffset=stickyOffset.top+stickyHeight;stickyOffset.top').parent(),this.computeWrapper(),this.element.css("margin",0),boundary&&(!0===boundary||"!"===boundary[0]?(boundary=!0===boundary?this.wrapper.parent():this.wrapper.closest(boundary.substr(1)),boundtoparent=!0):"string"==typeof boundary&&(boundary=UI.$(boundary))),this.sticky={self:this,options:this.options,element:this.element,currentTop:null,wrapper:this.wrapper,init:!1,getWidthFrom:UI.$(this.options.getWidthFrom||this.wrapper),boundary:boundary,boundtoparent:boundtoparent,top:0,calcTop:function(){var top=this.options.top;if(this.options.top&&"string"==typeof this.options.top)if(this.options.top.match(/^(-|)(\d+)vh$/))top=window.innerHeight*parseInt(this.options.top,10)/100;else{var topElement=UI.$(this.options.top).first();topElement.length&&topElement.is(":visible")&&(top=-1*(topElement.offset().top+topElement.outerHeight()-this.wrapper.offset().top))}this.top=top},reset:function(force){this.calcTop();var finalize=function(){this.element.css({position:"",top:"",width:"",left:"",margin:"0"}),this.element.removeClass([this.options.animation,"uk-animation-reverse",this.options.clsactive].join(" ")),this.element.addClass(this.options.clsinactive),this.element.trigger("inactive.uk.sticky"),this.currentTop=null,this.animate=!1}.bind(this);!force&&this.options.animation&&UI.support.animation&&!UI.Utils.isInView(this.wrapper)?(this.animate=!0,this.element.removeClass(this.options.animation).one(UI.support.animation.end,function(){finalize()}).width(),this.element.addClass(this.options.animation+" uk-animation-reverse")):finalize()},check:function(){if(this.options.disabled)return!1;if(this.options.media)switch(typeof this.options.media){case"number":if(window.innerWidthdwh?dwh-scrollTop:0,active=scrollTop>=this.wrapper.offset().top-this.top-extra;return active&&this.options.showup&&(1==direction&&(active=!1),-1==direction&&!this.element.hasClass(this.options.clsactive)&&UI.Utils.isInView(this.wrapper)&&(active=!1)),active}},this.sticky.calcTop(),sticked.push(this.sticky)},update:function(){checkscrollposition(this.sticky)},enable:function(){this.options.disabled=!1,this.update()},disable:function(force){this.options.disabled=!0,this.sticky.reset(force)},computeWrapper:function(){this.wrapper.css({height:-1==["absolute","fixed"].indexOf(this.element.css("position"))?this.element.outerHeight():"",float:"none"!=this.element.css("float")?this.element.css("float"):"",margin:this.element.css("margin")}),"fixed"==this.element.css("position")&&this.element.css({width:this.sticky.getWidthFrom.length?this.sticky.getWidthFrom.width():this.element.width()})}}),UI.sticky}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-timepicker",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";UI.component("timepicker",{defaults:{format:"24h",delay:0,start:0,end:24},boot:function(){UI.$html.on("focus.timepicker.uikit","[data-uk-timepicker]",function(e){var ele=UI.$(this);if(!ele.data("timepicker")){var obj=UI.timepicker(ele,UI.Utils.options(ele.attr("data-uk-timepicker")));setTimeout(function(){obj.autocomplete.input.focus()},40)}})},init:function(){var container,$this=this,times=function(start,end){start=start||0,end=end||24;var i,h,times={"12h":[],"24h":[]};for(i=start,h="";i0&&i<13&&12!==i&&(times["12h"].push({value:h+":00 AM"}),times["12h"].push({value:h+":30 AM"})),i>=12&&(0===(h-=12)&&(h=12),h<10&&(h="0"+String(h)),times["12h"].push({value:h+":00 PM"}),times["12h"].push({value:h+":30 PM"}));return times}(this.options.start,this.options.end);this.options.minLength=0,this.options.template='',this.options.source=function(release){release(times[$this.options.format]||times["12h"])},this.element.is("input")?(this.element.wrap('
          '),container=this.element.parent()):container=this.element.addClass("uk-autocomplete"),this.autocomplete=UI.autocomplete(container,this.options),this.autocomplete.dropdown.addClass("uk-dropdown-small uk-dropdown-scrollable"),this.autocomplete.on("show.uk.autocomplete",function(){var selected=$this.autocomplete.dropdown.find('[data-value="'+$this.autocomplete.input.val()+'"]');setTimeout(function(){$this.autocomplete.pick(selected,!0)},10)}),this.autocomplete.input.on("focus",function(){$this.autocomplete.value=Math.random(),$this.autocomplete.triggercomplete()}).on("blur",UI.Utils.debounce(function(){$this.checkTime()},100)),this.element.data("timepicker",this)},checkTime:function(){var arr,timeArray,hour,minute,meridian="AM",time=this.autocomplete.input.val();"12h"==this.options.format?(timeArray=(arr=time.split(" "))[0].split(":"),meridian=arr[1]):timeArray=time.split(":"),hour=parseInt(timeArray[0],10),minute=parseInt(timeArray[1],10),isNaN(hour)&&(hour=0),isNaN(minute)&&(minute=0),"12h"==this.options.format?(hour>12?hour=12:hour<0&&(hour=12),"am"===meridian||"a"===meridian?meridian="AM":"pm"!==meridian&&"p"!==meridian||(meridian="PM"),"AM"!==meridian&&"PM"!==meridian&&(meridian="AM")):hour>=24?hour=23:hour<0&&(hour=0),minute<0?minute=0:minute>=60&&(minute=0),this.autocomplete.input.val(this.formatTime(hour,minute,meridian)).trigger("change")},formatTime:function(hour,minute,meridian){return(hour=hour<10?"0"+hour:hour)+":"+(minute=minute<10?"0"+minute:minute)+("12h"==this.options.format?" "+meridian:"")}})}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-tooltip",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";var $tooltip,tooltipdelay,checkdelay;return UI.component("tooltip",{defaults:{offset:5,pos:"top",animation:!1,delay:0,cls:"",activeClass:"uk-active",src:function(ele){var title=ele.attr("title");return void 0!==title&&ele.data("cached-title",title).removeAttr("title"),ele.data("cached-title")}},tip:"",boot:function(){UI.$html.on("mouseenter.tooltip.uikit focus.tooltip.uikit","[data-uk-tooltip]",function(e){var ele=UI.$(this);ele.data("tooltip")||(UI.tooltip(ele,UI.Utils.options(ele.attr("data-uk-tooltip"))),ele.trigger("mouseenter"))})},init:function(){var $this=this;$tooltip||($tooltip=UI.$('
          ').appendTo("body")),this.on({focus:function(e){$this.show()},blur:function(e){$this.hide()},mouseenter:function(e){$this.show()},mouseleave:function(e){$this.hide()}})},show:function(){if(this.tip="function"==typeof this.options.src?this.options.src(this.element):this.options.src,tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),"string"==typeof this.tip&&this.tip.length){$tooltip.stop().css({top:-2e3,visibility:"hidden"}).removeClass(this.options.activeClass).show(),$tooltip.html('
          '+this.tip+"
          ");var $this=this,pos=UI.$.extend({},this.element.offset(),{width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}),width=$tooltip[0].offsetWidth,height=$tooltip[0].offsetHeight,offset="function"==typeof this.options.offset?this.options.offset.call(this.element):this.options.offset,position="function"==typeof this.options.pos?this.options.pos.call(this.element):this.options.pos,tmppos=position.split("-"),tcss={display:"none",visibility:"visible",top:pos.top+pos.height+height,left:pos.left};if("fixed"==UI.$html.css("position")||"fixed"==UI.$body.css("position")){var bodyoffset=UI.$("body").offset(),htmloffset=UI.$("html").offset(),docoffset_top=htmloffset.top+bodyoffset.top,docoffset_left=htmloffset.left+bodyoffset.left;pos.left-=docoffset_left,pos.top-=docoffset_top}"left"!=tmppos[0]&&"right"!=tmppos[0]||"right"!=UI.langdirection||(tmppos[0]="left"==tmppos[0]?"right":"left");var variants={bottom:{top:pos.top+pos.height+offset,left:pos.left+pos.width/2-width/2},top:{top:pos.top-height-offset,left:pos.left+pos.width/2-width/2},left:{top:pos.top+pos.height/2-height/2,left:pos.left-width-offset},right:{top:pos.top+pos.height/2-height/2,left:pos.left+pos.width+offset}};UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left="left"==tmppos[1]?pos.left:pos.left+pos.width-width);var boundary=this.checkBoundary(tcss.left,tcss.top,width,height);if(boundary){switch(boundary){case"x":position=2==tmppos.length?tmppos[0]+"-"+(tcss.left<0?"left":"right"):tcss.left<0?"right":"left";break;case"y":position=2==tmppos.length?(tcss.top<0?"bottom":"top")+"-"+tmppos[1]:tcss.top<0?"bottom":"top";break;case"xy":position=2==tmppos.length?(tcss.top<0?"bottom":"top")+"-"+(tcss.left<0?"left":"right"):tcss.left<0?"right":"left"}tmppos=position.split("-"),UI.$.extend(tcss,variants[tmppos[0]]),2==tmppos.length&&(tcss.left="left"==tmppos[1]?pos.left:pos.left+pos.width-width)}tcss.left-=UI.$body.position().left,tooltipdelay=setTimeout(function(){$tooltip.css(tcss).attr("class",["uk-tooltip","uk-tooltip-"+position,$this.options.cls].join(" ")),$this.options.animation?$tooltip.css({opacity:0,display:"block"}).addClass($this.options.activeClass).animate({opacity:1},parseInt($this.options.animation,10)||400):$tooltip.show().addClass($this.options.activeClass),tooltipdelay=!1,checkdelay=setInterval(function(){$this.element.is(":visible")||$this.hide()},150)},parseInt(this.options.delay,10)||0)}},hide:function(){if(!this.element.is("input")||this.element[0]!==document.activeElement)if(tooltipdelay&&clearTimeout(tooltipdelay),checkdelay&&clearTimeout(checkdelay),$tooltip.stop(),this.options.animation){var $this=this;$tooltip.fadeOut(parseInt(this.options.animation,10)||400,function(){$tooltip.removeClass($this.options.activeClass)})}else $tooltip.hide().removeClass(this.options.activeClass)},content:function(){return this.tip},checkBoundary:function(left,top,width,height){var axis="";return(left<0||left-UI.$win.scrollLeft()+width>window.innerWidth)&&(axis+="x"),(top<0||top-UI.$win.scrollTop()+height>window.innerHeight)&&(axis+="y"),axis}}),UI.tooltip}),function(addon){var component;window.UIkit&&(component=addon(UIkit)),"function"==typeof define&&define.amd&&define("uikit-upload",["uikit"],function(){return component||addon(UIkit)})}(function(UI){"use strict";function xhrupload(files,settings){if(!UI.support.ajaxupload)return this;if(settings=UI.$.extend({},xhrupload.defaults,settings),files.length){if("*.*"!==settings.allow)for(var file,i=0;file=files[i];i++)if(!matchName(settings.allow,file.name))return void("string"==typeof settings.notallowed?alert(settings.notallowed):settings.notallowed(file,settings));var complete=settings.complete;if(settings.single){var count=files.length,uploaded=0,allow=!0;settings.beforeAll(files),settings.complete=function(response,xhr){uploaded+=1,complete(response,xhr),settings.filelimit&&uploaded>=settings.filelimit&&(allow=!1),allow&&uploaded
          ',$body.on("show.uk.modal",".uk-modal-dialog-replace",function(){setTimeout(function(){var dialogReplace=$(".uk-modal-dialog-replace");if(dialogReplace.find(".uk-button-primary").length){var actionBtn=dialogReplace.find(".uk-button-primary").toggleClass("uk-button-primary md-btn-flat-primary");actionBtn.next("button")&&actionBtn.next("button").after(actionBtn)}dialogReplace.find(".uk-button").length&&dialogReplace.find(".uk-button").toggleClass("uk-button md-btn md-btn-flat"),dialogReplace.find(".uk-margin-small-top").length&&dialogReplace.find(".uk-margin-small-top").toggleClass("uk-margin-small-top uk-margin-top"),dialogReplace.find("input.uk-width-1-1").length&&(dialogReplace.find("input.uk-width-1-1").toggleClass("uk-width-1-1 md-input"),altair_md.inputs()),dialogReplace.find(".uk-form").length&&dialogReplace.find(".uk-form").removeClass("uk-form")},50)})}void 0!==UIkit.components.tooltip&&$.extend(UIkit.components.tooltip.prototype.defaults,{animation:280,offset:8}),void 0!==UIkit.components.sortable&&Modernizr.touch&&$("[data-uk-sortable]").children().addClass("needsclick")}); \ No newline at end of file diff --git a/src/views/layout/main.hbs b/src/views/layout/main.hbs index e1f89184d..ff92f73d6 100644 --- a/src/views/layout/main.hbs +++ b/src/views/layout/main.hbs @@ -20,10 +20,9 @@ - - +
          @@ -125,11 +124,12 @@
          {{> topbar }} + {{> nav }}
          - {{> nav }} +
          {{{body}}}
          @@ -152,6 +152,8 @@ document.location = '/mobile'; } + + diff --git a/src/views/partials/nav.hbs b/src/views/partials/nav.hbs index a259642dd..43954b642 100644 --- a/src/views/partials/nav.hbs +++ b/src/views/partials/nav.hbs @@ -1,124 +1,125 @@ \ No newline at end of file diff --git a/webpack.config.dist.js b/webpack.config.dist.js index 3fe0cd055..5accb3805 100644 --- a/webpack.config.dist.js +++ b/webpack.config.dist.js @@ -16,7 +16,7 @@ module.exports = { publicPath: '/js/' }, resolve: { - modules: [path.resolve(__dirname, 'src/public/js/')], + modules: [path.resolve(__dirname, 'src/public/js/'), 'node_modules'], alias: { //server side roles: path.resolve(__dirname, 'src/permissions/roles'), @@ -87,10 +87,14 @@ module.exports = { fallback: 'style-loader', use: [{loader: 'css-loader', options: {minimize: true}}, 'sass-loader'], publicPath: '/public/css' - })} + })}, + { test: /\.jsx$/, exclude: /node_modules/, loader: "babel-loader?cacheDirectory" } ] }, plugins: [ + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify('production') + }), new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', diff --git a/webpack.config.js b/webpack.config.js index 81ad9f099..a8fdc5323 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -16,7 +16,7 @@ module.exports = { publicPath: '/js/' }, resolve: { - modules: [path.resolve(__dirname, 'src/public/js/')], + modules: [path.resolve(__dirname, 'src/public/js/'), 'node_modules'], alias: { //server side roles: path.resolve(__dirname, 'src/permissions/roles'), @@ -87,7 +87,8 @@ module.exports = { fallback: 'style-loader', use: [{loader: 'css-loader', options: {minimize: true}}, 'sass-loader'], publicPath: '/public/css' - })} + })}, + { test: /\.jsx$/, exclude: /node_modules/, loader: "babel-loader?cacheDirectory" } ] }, plugins: [ diff --git a/yarn.lock b/yarn.lock index e63bf29ec..e666ea776 100644 --- a/yarn.lock +++ b/yarn.lock @@ -410,6 +410,532 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" +babel-core@6.26.3, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-builder-react-jsx@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + esutils "^2.0.2" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-loader@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015" + dependencies: + find-cache-dir "^1.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-flow@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + +babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-flow-strip-types@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" + dependencies: + babel-plugin-syntax-flow "^6.18.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-display-name@^6.23.0: + version "6.25.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-self@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx-source@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" + dependencies: + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-react-jsx@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" + dependencies: + babel-helper-builder-react-jsx "^6.24.1" + babel-plugin-syntax-jsx "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^2.1.2" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-flow@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" + dependencies: + babel-plugin-transform-flow-strip-types "^6.22.0" + +babel-preset-react@6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" + dependencies: + babel-plugin-syntax-jsx "^6.3.13" + babel-plugin-transform-react-display-name "^6.23.0" + babel-plugin-transform-react-jsx "^6.24.1" + babel-plugin-transform-react-jsx-self "^6.22.0" + babel-plugin-transform-react-jsx-source "^6.22.0" + babel-preset-flow "^6.23.0" + +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" @@ -715,6 +1241,13 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" +browserslist@^2.1.2: + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + dependencies: + caniuse-lite "^1.0.30000792" + electron-to-chromium "^1.3.30" + bson@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/bson/-/bson-1.0.4.tgz#93c10d39eaa5b58415cbc4052f3e53e562b0b72c" @@ -839,6 +1372,10 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000798" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000798.tgz#92f26f77f89cc2a4d60487f41e0b3d2a6c3fe341" +caniuse-lite@^1.0.30000792: + version "1.0.30000834" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000834.tgz#918f42510915356c327e5fb79e7d856199f8e786" + capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" @@ -1207,6 +1744,10 @@ commander@~2.14.1: version "2.14.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" @@ -1318,6 +1859,10 @@ continuation-local-storage@^3.1.4: async-listener "^0.6.0" emitter-listener "^1.1.1" +convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + cookie-parser@1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.3.tgz#0fe31fa19d000b95f4aadf1f53fdc2b8a203baa5" @@ -1341,6 +1886,14 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1627,7 +2180,7 @@ debug@*, debug@3.1.0, debug@^3, debug@^3.0, debug@^3.1.0: dependencies: ms "2.0.0" -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.3, debug@~2.6.4, debug@~2.6.6, debug@~2.6.9: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.3, debug@^2.6.8, debug@^2.6.9, debug@~2.6.4, debug@~2.6.6, debug@~2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -1745,6 +2298,12 @@ detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -1903,6 +2462,10 @@ electron-to-chromium@^1.2.7: version "1.3.31" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz#00d832cba9fe2358652b0c48a8816c8e3a037e9f" +electron-to-chromium@^1.3.30: + version "1.3.45" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz#458ac1b1c5c760ce8811a16d2bfbd97ec30bafb8" + elliptic@^6.0.0: version "6.4.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" @@ -1951,6 +2514,12 @@ encodeurl@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + end-of-stream@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -2503,6 +3072,18 @@ faye-websocket@~0.10.0: dependencies: websocket-driver ">=0.5.1" +fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + fclone@1.0.11, fclone@^1: version "1.0.11" resolved "https://registry.yarnpkg.com/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640" @@ -2577,6 +3158,14 @@ finalhandler@1.1.0: statuses "~1.3.1" unpipe "~1.0.0" +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -2584,7 +3173,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -2903,6 +3492,10 @@ globals@^11.0.1: version "11.2.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.2.0.tgz#aa2ece052a787563ba70a3dcd9dc2eb8a9a0488c" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -3291,6 +3884,13 @@ hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" @@ -3558,6 +4158,12 @@ interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -3829,7 +4435,7 @@ is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" -is-stream@^1.0.0, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3893,6 +4499,13 @@ isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isstream@0.1.x, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -3946,7 +4559,7 @@ js-stringify@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" -js-tokens@^3.0.2: +js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -3979,6 +4592,10 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -4399,6 +5016,12 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + lorem-ipsum@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/lorem-ipsum/-/lorem-ipsum-1.0.4.tgz#30b72a3b1e191f55062af8c7dfab291ae4fbd912" @@ -4462,6 +5085,12 @@ mailsplit@4.1.2: libmime "3.1.0" libqp "1.1.0" +make-dir@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" + dependencies: + pify "^3.0.0" + make-plural@^3.0.3, make-plural@~3.0.3: version "3.0.6" resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-3.0.6.tgz#2033a03bac290b8f3bb91258f65b9df7e8b01ca7" @@ -4990,6 +5619,13 @@ node-cache@4.1.1: clone "2.x" lodash "4.x" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-gyp@^3.3.1: version "3.6.2" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" @@ -5329,7 +5965,7 @@ os-name@^1.0.3: osx-release "^1.0.0" win-release "^1.0.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5502,7 +6138,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0, path-is-absolute@~1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1, path-is-absolute@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -5584,6 +6220,12 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + pkginfo@0.2.x: version "0.2.3" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.2.3.tgz#7239c42a5ef6c30b8f328439d9b9ff71042490f8" @@ -5964,6 +6606,10 @@ preview-email@^0.0.7: pug "^2.0.0-rc.4" uuid "^3.1.0" +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -5976,7 +6622,7 @@ progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" -"promise@>=3.2 <8", promise@^7.0.1: +"promise@>=3.2 <8", promise@^7.0.1, promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" dependencies: @@ -5999,6 +6645,14 @@ promptly@2.2.0: dependencies: read "^1.0.4" +prop-types@15.6.1, prop-types@^15.6.0: + version "15.6.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -6243,6 +6897,24 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-dom@16.3.2: + version "16.3.2" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.3.2.tgz#cb90f107e09536d683d84ed5d4888e9640e0e4df" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + +react@16.3.2: + version "16.3.2" + resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.0" + read-all-stream@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" @@ -6399,6 +7071,18 @@ regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -6423,6 +7107,14 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + registry-auth-token@^3.0.1: version "3.3.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" @@ -6847,7 +7539,7 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" -"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4: +"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -6909,6 +7601,10 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" @@ -7190,6 +7886,12 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + source-map-support@^0.5: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" @@ -7210,7 +7912,7 @@ source-map@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.0.tgz#0fe96503ac86a5adb5de63f4e412ae4872cdbe86" -source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1: +source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -7620,6 +8322,10 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -7673,6 +8379,10 @@ trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + "true-case-path@^1.0.2": version "1.0.2" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" @@ -7736,6 +8446,10 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +ua-parser-js@^0.7.9: + version "0.7.18" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" + uc.micro@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" @@ -8127,6 +8841,10 @@ websocket-extensions@>=0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" +whatwg-fetch@>=0.10.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" From 12f0da0b5fbf0054b4b76dafc7a7088970f96a7c Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Wed, 16 May 2018 01:13:03 -0400 Subject: [PATCH 02/68] React Sidebar fixes --- src/client/Components/Nav/Sidebar/index.jsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/client/Components/Nav/Sidebar/index.jsx b/src/client/Components/Nav/Sidebar/index.jsx index 44ffd8a8d..a954177e3 100644 --- a/src/client/Components/Nav/Sidebar/index.jsx +++ b/src/client/Components/Nav/Sidebar/index.jsx @@ -40,8 +40,15 @@ class Sidebar extends React.Component { - - + + + + {/**/} + {/**/} + {/**/} + + + From 658947d941d5b31380a64351424f43f2af23dc96 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Thu, 17 May 2018 00:01:28 -0400 Subject: [PATCH 03/68] Enable reports nav items --- src/client/Components/Nav/Sidebar/index.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/Components/Nav/Sidebar/index.jsx b/src/client/Components/Nav/Sidebar/index.jsx index a954177e3..5822f9e1c 100644 --- a/src/client/Components/Nav/Sidebar/index.jsx +++ b/src/client/Components/Nav/Sidebar/index.jsx @@ -43,9 +43,9 @@ class Sidebar extends React.Component { - {/**/} - {/**/} - {/**/} + + + From 6bd49bca0028a138328da6be0646498cf4319421 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Thu, 17 May 2018 00:02:20 -0400 Subject: [PATCH 04/68] Fix for Group/User breakdown --- src/controllers/api/v1/tickets.js | 63 +++++++++++++++++-------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/src/controllers/api/v1/tickets.js b/src/controllers/api/v1/tickets.js index 542d2dde4..f281e76dc 100644 --- a/src/controllers/api/v1/tickets.js +++ b/src/controllers/api/v1/tickets.js @@ -1035,6 +1035,8 @@ api_tickets.getTicketStatsForGroup = function(req, res) { t.push(tag.name); }); + t = _.take(t, 10); + return cb(); }, function() { _.mixin({ @@ -1075,9 +1077,13 @@ api_tickets.getTicketStatsForGroup = function(req, res) { //Get average Response buildAvgResponse(tickets, function(obj) { - r.avgResponse = obj.avgResponse; + if (_.isUndefined(obj)) + return callback(null, r); + else { + r.avgResponse = obj.avgResponse; - return callback(null, r); + return callback(null, r); + } }); }); } @@ -1135,6 +1141,8 @@ api_tickets.getTicketStatsForUser = function(req, res) { t.push(tag.name); }); + t = _.take(t, 10); + return cb(); }, function() { _.mixin({ @@ -1175,9 +1183,13 @@ api_tickets.getTicketStatsForUser = function(req, res) { //Get average Response buildAvgResponse(tickets, function(obj) { - r.avgResponse = obj.avgResponse; + if (_.isUndefined(obj)) + return callback(null, r); + else { + r.avgResponse = obj.avgResponse; - return callback(null, r); + return callback(null, r); + } }); }); } @@ -1203,7 +1215,8 @@ function buildGraphData(arr, days, callback) { for (var i=days;i--;) { timespanArray.push(i); } - async.eachSeries(timespanArray, function(day, next) { + + _.each(timespanArray, function(day) { var obj = {}; var d = today.clone().subtract(day, 'd'); obj.date = d.format('YYYY-MM-DD'); @@ -1215,44 +1228,38 @@ function buildGraphData(arr, days, callback) { $dateCount = _.size($dateCount); obj.value = $dateCount; graphData.push(obj); - - async.setImmediate(function() { - next(); - }); - - }, function() { - callback(graphData); }); + + if (_.isFunction(callback)) + return callback(graphData); + else + return graphData; } function buildAvgResponse(ticketArray, callback) { var cbObj = {}; var $ticketAvg = []; - async.eachSeries(ticketArray, function (ticket, callback) { - if (_.isUndefined(ticket.comments) || _.size(ticket.comments) < 1) return callback(); + _.each(ticketArray, function (ticket) { + if (_.isUndefined(ticket.comments) || _.size(ticket.comments) < 1) return; var ticketDate = moment(ticket.date); var firstCommentDate = moment(ticket.comments[0].date); var diff = firstCommentDate.diff(ticketDate, 'seconds'); $ticketAvg.push(diff); + }); - async.setImmediate(function() { - return callback(); - }); - }, function (err) { - if (err) return callback(err); + var ticketAvgTotal = _($ticketAvg).reduce(function (m, x) { + return m + x; + }, 0); - var ticketAvgTotal = _($ticketAvg).reduce(function (m, x) { - return m + x; - }, 0); - var tvt = moment.duration(Math.round(ticketAvgTotal / _.size($ticketAvg)), 'seconds').asHours(); - cbObj.avgResponse = Math.floor(tvt); + var tvt = moment.duration(Math.round(ticketAvgTotal / _.size($ticketAvg)), 'seconds').asHours(); + cbObj.avgResponse = Math.floor(tvt); - async.setImmediate(function() { - return callback(cbObj); - }); - }); + if (_.isFunction(callback)) + return callback(cbObj); + else + return cbObj; } /** From 2dd85905cb5801f10f2842c7fc1b242012cc71e6 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Fri, 18 May 2018 23:40:43 -0400 Subject: [PATCH 05/68] Updated sidebar for dynamic plugins --- src/client/Components/Nav/Sidebar/index.jsx | 99 +++++++++++++------ .../Nav/{NavButton => SidebarItem}/index.jsx | 0 src/client/Components/Nav/Submenu/index.jsx | 13 ++- src/middleware/index.js | 2 + src/public/js/modules/helpers.js | 30 ++++-- src/routes/index.js | 2 +- 6 files changed, 104 insertions(+), 42 deletions(-) rename src/client/Components/Nav/{NavButton => SidebarItem}/index.jsx (100%) diff --git a/src/client/Components/Nav/Sidebar/index.jsx b/src/client/Components/Nav/Sidebar/index.jsx index 5822f9e1c..d8f418703 100644 --- a/src/client/Components/Nav/Sidebar/index.jsx +++ b/src/client/Components/Nav/Sidebar/index.jsx @@ -1,18 +1,22 @@ import React from 'react'; -import NavButton from "../NavButton/index.jsx"; +import SidebarItem from "../SidebarItem/index.jsx"; import NavSeperator from '../NavSeperator/index.jsx'; import Submenu from '../Submenu/index.jsx'; import SubmenuItem from '../SubmenuItem/index.jsx'; import Permissions from '../../../../permissions/index.js'; +import Helpers from 'modules/helpers' + class Sidebar extends React.Component { constructor(props) { super(props); this.state = { activeItem: '', activeSubItem: '', - sessionUser: null + sessionUser: null, + + plugins: null }; } @@ -22,50 +26,85 @@ class Sidebar extends React.Component { }; } + componentDidMount() { + Helpers.UI.getPlugins((err, result) => { + if (!err && result.plugins) { + this.setState({plugins: result.plugins}); + } + }); + } + + componentDidUpdate() { + Helpers.UI.initSidebar(); + Helpers.UI.bindExpand(); + } + render() { + const { activeItem, activeSubItem, plugins, sessionUser } = this.state; return (
            - - + + - - + + - - - - + + + + - - - - - + + + + + - + - - + + - - - + + {!plugins && + + } + {plugins && + 0} subMenuTarget="plugins" active={(activeItem === 'plugins')}> + {plugins && plugins.length > 0 && + + {plugins.map(function(item) { + return ( + + ) + })} + + } + + } + - + - - + + - - + + - {this.state.sessionUser && Permissions.canThis(this.state.sessionUser.role, 'settings:logs') && - + {sessionUser && Permissions.canThis(sessionUser.role, 'settings:logs') && + } - - + +
          ) } diff --git a/src/client/Components/Nav/NavButton/index.jsx b/src/client/Components/Nav/SidebarItem/index.jsx similarity index 100% rename from src/client/Components/Nav/NavButton/index.jsx rename to src/client/Components/Nav/SidebarItem/index.jsx diff --git a/src/client/Components/Nav/Submenu/index.jsx b/src/client/Components/Nav/Submenu/index.jsx index 0d8119f67..769c06ed0 100644 --- a/src/client/Components/Nav/Submenu/index.jsx +++ b/src/client/Components/Nav/Submenu/index.jsx @@ -61,13 +61,16 @@ class Submenu extends React.Component { render() { return ( -
          -
            - {this.props.children} -
          -
          +
            + {this.props.children} +
          ) } } +Submenu.proptypes = { + id: PropTypes.string.isRequired, + subMenuOpen: PropTypes.bool +} + export default Submenu; \ No newline at end of file diff --git a/src/middleware/index.js b/src/middleware/index.js index f233ce215..4844316d6 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -107,6 +107,7 @@ module.exports = function(app, db, callback) { //Remove to enable plugins //next(null, store); global.plugins = []; + global.pluginsJson = []; var dive = require('dive'); dive(path.join(__dirname, '../../plugins'), {directories: true, files: false, recursive: false}, function(err, dir) { if (err) throw err; @@ -117,6 +118,7 @@ module.exports = function(app, db, callback) { throw new Error('Unable to load plugin with duplicate name: ' + plugin.name); global.plugins.push({name: plugin.name.toLowerCase(), version: plugin.version}); + global.pluginsJson.push(plugin); var pluginPublic = path.join(dir, '/public'); app.use('/plugins/' + plugin.name, express.static(pluginPublic)); winston.debug('Detected Plugin: ' + plugin.name.toLowerCase() + '-' + plugin.version); diff --git a/src/public/js/modules/helpers.js b/src/public/js/modules/helpers.js index cda1eb241..ea53e0a47 100644 --- a/src/public/js/modules/helpers.js +++ b/src/public/js/modules/helpers.js @@ -66,10 +66,10 @@ function($, _, moment, UIkit, CountUp, Waves, Selectize, Snackbar, ROLES, Cookie //self.UI.expandSidebar(); //self.UI.tooltipSidebar(); - self.UI.initSidebar(); - self.UI.bindExpand(); - self.UI.setupSidebarTether(); - self.UI.bindAccordion(); + // self.UI.initSidebar(); + // self.UI.bindExpand(); + // self.UI.setupSidebarTether(); + // self.UI.bindAccordion(); self.UI.fabToolbar(); self.UI.fabSheet(); @@ -114,7 +114,10 @@ function($, _, moment, UIkit, CountUp, Waves, Selectize, Snackbar, ROLES, Cookie $('li[data-nav-accordion]').each(function() { //Remove hasSubMenuOpen from LI and subMenuOpen from submenu UL to prevent menu from staying open after page load var subMenu = $(this).find('#' + $(this).attr('data-nav-accordion-target')); - if (subMenu.length > 0) subMenu.removeClass('subMenuOpen'); + if (subMenu.length > 0) { + if (subMenu.attr('id') !== 'side-nav-accordion-plugins') + subMenu.removeClass('subMenuOpen'); + } if ($(this).hasClass('active') && $(this).parents('.sidebar').hasClass('expand')) { $(this).addClass('hasSubMenuOpen'); if (subMenu.length > 0) subMenu.addClass('subMenuOpen'); @@ -169,7 +172,7 @@ function($, _, moment, UIkit, CountUp, Waves, Selectize, Snackbar, ROLES, Cookie } else { setTimeout(function() { Tether.position(); $('.sidebar').find('.tether-element.tether-enabled').show();}, 500); $sidebar.find('li[data-nav-accordion-target]').removeClass('hasSubMenuOpen'); - $sidebar.find('ul.side-nav-accordion.side-nav-sub').removeClass('subMenuOpen'); + $sidebar.find('ul.side-nav-accordion.side-nav-sub:not(#side-nav-accordion-plugins)').removeClass('subMenuOpen'); } }; @@ -764,6 +767,21 @@ function($, _, moment, UIkit, CountUp, Waves, Selectize, Snackbar, ROLES, Cookie }); }; + helpers.UI.getPlugins = function(callback) { + $.ajax({ + url: '/api/v1/plugins/list/installed', + method: 'GET', + success: function(data) { + if (_.isFunction(callback)) + return callback(null, data); + }, + error: function(error) { + if (_.isFunction(callback)) + return callback(error, null); + } + }); + }; + helpers.closeNotificationsWindow = function() { UIkit.modal('#viewAllNotificationsModal').hide(); }; diff --git a/src/routes/index.js b/src/routes/index.js index bd5c7e74e..dad144dfa 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -204,7 +204,7 @@ function mainRoutes(router, middleware, controllers) { router.put('/api/v1/settings', middleware.api, controllers.api.settings.updateSetting); router.post('/api/v1/settings/testmailer', middleware.api, controllers.api.settings.testMailer); - router.get('/api/v1/plugins/list/installed', middleware.api, function(req, res) { return res.json({success: true, loadedPlugins: global.plugins}); }); + router.get('/api/v1/plugins/list/installed', middleware.api, function(req, res) { return res.json({success: true, loadedPlugins: global.plugins, plugins: global.pluginsJson}); }); router.get('/api/v1/plugins/install/:packageid', middleware.api, middleware.isAdmin, controllers.api.plugins.installPlugin); router.delete('/api/v1/plugins/remove/:packageid', middleware.api, middleware.isAdmin, controllers.api.plugins.removePlugin); From 1b84ef0a3887af44e502b37ce260af67817578f0 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 20 May 2018 13:38:52 -0400 Subject: [PATCH 06/68] Sidebar fixes --- src/client/Components/Nav/Sidebar/index.jsx | 59 ++++++++++++------- .../Components/Nav/SidebarItem/index.jsx | 1 + src/public/js/modules/helpers.js | 4 ++ 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/client/Components/Nav/Sidebar/index.jsx b/src/client/Components/Nav/Sidebar/index.jsx index d8f418703..bf9b87568 100644 --- a/src/client/Components/Nav/Sidebar/index.jsx +++ b/src/client/Components/Nav/Sidebar/index.jsx @@ -39,6 +39,40 @@ class Sidebar extends React.Component { Helpers.UI.bindExpand(); } + renderPlugins() { + const { plugins, sessionUser, activeItem, activeSubItem } = this.state; + return ( + 0} + subMenuTarget="plugins" + active={(activeItem === 'plugins')} + > + {plugins && plugins.length > 0 && + + {plugins.map(function(item) { + const perms = item.permissions.split(' '); + if (perms.indexOf(sessionUser.role) === -1) + return; + return ( + + ) + })} + + } + + ) + } + render() { const { activeItem, activeSubItem, plugins, sessionUser } = this.state; return ( @@ -66,28 +100,9 @@ class Sidebar extends React.Component { - {!plugins && - - } - {plugins && - 0} subMenuTarget="plugins" active={(activeItem === 'plugins')}> - {plugins && plugins.length > 0 && - - {plugins.map(function(item) { - return ( - - ) - })} - - } - - } + + {this.renderPlugins()} + diff --git a/src/client/Components/Nav/SidebarItem/index.jsx b/src/client/Components/Nav/SidebarItem/index.jsx index 042d96bfe..1b4b417ce 100644 --- a/src/client/Components/Nav/SidebarItem/index.jsx +++ b/src/client/Components/Nav/SidebarItem/index.jsx @@ -11,6 +11,7 @@ class NavButton extends React.Component { componentDidUpdate() { Helpers.UI.bindAccordion(); + Helpers.UI.tetherUpdate(); } renderAnchorLink() { diff --git a/src/public/js/modules/helpers.js b/src/public/js/modules/helpers.js index ea53e0a47..1e230869f 100644 --- a/src/public/js/modules/helpers.js +++ b/src/public/js/modules/helpers.js @@ -260,6 +260,10 @@ function($, _, moment, UIkit, CountUp, Waves, Selectize, Snackbar, ROLES, Cookie }); }; + helpers.UI.tetherUpdate = function() { + setTimeout(function() { Tether.position(); }, 500); + }; + helpers.UI.setNavItem = function(id) { var $sidebar = $('.sidebar'); $sidebar.find('li.active').removeClass('active'); From 3f7c352634362530bd3b1783a4211d2e39b7ad4a Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Fri, 25 May 2018 02:04:07 -0400 Subject: [PATCH 07/68] Sidebar styles to components --- .../Components/Nav/NavSeperator/index.jsx | 1 - src/client/Components/Nav/Sidebar/index.jsx | 70 ++-- src/client/Components/Nav/Sidebar/style.sass | 67 ++++ .../Components/Nav/SidebarItem/index.jsx | 7 +- .../Components/Nav/SidebarItem/style.sass | 111 ++++++ src/client/Components/Nav/Submenu/index.jsx | 26 +- src/client/Components/Nav/Submenu/style.sass | 114 ++++++ src/sass/app.sass | 2 +- src/sass/partials/sidebar.sass | 361 +----------------- src/views/partials/nav.hbs | 157 +------- webpack.config.dist.js | 5 +- webpack.config.js | 8 +- 12 files changed, 369 insertions(+), 560 deletions(-) create mode 100644 src/client/Components/Nav/Sidebar/style.sass create mode 100644 src/client/Components/Nav/SidebarItem/style.sass create mode 100644 src/client/Components/Nav/Submenu/style.sass diff --git a/src/client/Components/Nav/NavSeperator/index.jsx b/src/client/Components/Nav/NavSeperator/index.jsx index a5cab7486..72febe6f7 100644 --- a/src/client/Components/Nav/NavSeperator/index.jsx +++ b/src/client/Components/Nav/NavSeperator/index.jsx @@ -1,5 +1,4 @@ import React from 'react'; -import PropTypes from 'prop-types'; class NavSeperator extends React.Component { render() { diff --git a/src/client/Components/Nav/Sidebar/index.jsx b/src/client/Components/Nav/Sidebar/index.jsx index bf9b87568..2a91a880d 100644 --- a/src/client/Components/Nav/Sidebar/index.jsx +++ b/src/client/Components/Nav/Sidebar/index.jsx @@ -1,12 +1,16 @@ import React from 'react'; -import SidebarItem from "../SidebarItem/index.jsx"; -import NavSeperator from '../NavSeperator/index.jsx'; -import Submenu from '../Submenu/index.jsx'; -import SubmenuItem from '../SubmenuItem/index.jsx'; +import SidebarItem from 'Components/Nav/SidebarItem'; +import NavSeperator from 'Components/Nav/NavSeperator'; +import Submenu from 'Components/Nav/Submenu'; +import SubmenuItem from 'Components/Nav/SubmenuItem'; import Permissions from '../../../../permissions/index.js'; -import Helpers from 'modules/helpers' +import Helpers from 'modules/helpers'; + +//Sass +import './style.sass'; +import 'sass/partials/sidebar.sass'; class Sidebar extends React.Component { constructor(props) { @@ -90,35 +94,45 @@ class Sidebar extends React.Component { - - - - - - - - - - + {sessionUser && Permissions.canThis(sessionUser.role, 'accounts:view') && + + } + {sessionUser && Permissions.canThis(sessionUser.role, 'groups:view') && + + } + {sessionUser && Permissions.canThis(sessionUser.role, 'reports:view') && + + + + + + + + + } {this.renderPlugins()} - + {sessionUser && Permissions.canThis(sessionUser.role, 'notices:view') && + + } - - - - - - - + {sessionUser && Permissions.canThis(sessionUser.role, 'settings:edit') && + + + + + + + - {sessionUser && Permissions.canThis(sessionUser.role, 'settings:logs') && - - } + {sessionUser && Permissions.canThis(sessionUser.role, 'settings:logs') && + + } - - + + + } ) diff --git a/src/client/Components/Nav/Sidebar/style.sass b/src/client/Components/Nav/Sidebar/style.sass new file mode 100644 index 000000000..6c841c42d --- /dev/null +++ b/src/client/Components/Nav/Sidebar/style.sass @@ -0,0 +1,67 @@ +@import '../../../../../src/sass/mixins.sass' +@import '../../../../../src/sass/_settings.sass' + +//Hack to not show popout menu on reposition +body > .side-nav-sub.tether-element + display: none !important + visibility: hidden !important + opacity: 0 !important + z-index: -9999 !important + height: 0 !important + width: 0 !important + -webkit-transition: none !important + -moz-transition: none !important + -o-transition: none !important + transition: none !important + +// used when expanding the sidebar on page load +.no-animation + transition: none !important + +#page-content + transition: margin 0.2s ease + &.expanded-sidebar + margin-left: 215px !important + +.sidebar + @media only screen and (min-width: 40.063em) and (max-width: 64em) + position: absolute + top: 75px + left: 0 + width: 57px + max-width: 57px + z-index: 9999 + overflow: hidden + + background: $sidebar_bg + color: $sidebar_text + width: 57px + position: fixed + top: 75px + left: 0 + bottom: 0 + +boxShadow($sidebar_box_shadow) + +boxShadow(inset -1px 0 0 0 rgba(0,0,0,0.1)) + transition: width 0.2s ease + z-index: 10 + //border-right: $sidebar_border_right + #expand-menu + overflow: hidden + &.expand + width: 215px + ul.side-nav + li.hasSubMenu:after + opacity: 1 + .side-nav-bottom-panel + width: 215px + a + width: 215px + padding: 0 0 0 60px !important + font-size: 100% + +ul.side-nav + list-style: none outside none + line-height: 1.6 + display: block + margin: 0 + padding: 0.875rem 0 \ No newline at end of file diff --git a/src/client/Components/Nav/SidebarItem/index.jsx b/src/client/Components/Nav/SidebarItem/index.jsx index 1b4b417ce..b8d84bc91 100644 --- a/src/client/Components/Nav/SidebarItem/index.jsx +++ b/src/client/Components/Nav/SidebarItem/index.jsx @@ -1,10 +1,11 @@ -import isUndefined from 'lodash/isUndefined'; -import React from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; import Helpers from 'modules/helpers' -class NavButton extends React.Component { +import './style.sass' + +class NavButton extends Component { constructor(props) { super(props); } diff --git a/src/client/Components/Nav/SidebarItem/style.sass b/src/client/Components/Nav/SidebarItem/style.sass new file mode 100644 index 000000000..be461b3a6 --- /dev/null +++ b/src/client/Components/Nav/SidebarItem/style.sass @@ -0,0 +1,111 @@ +@import '../../../../../src/sass/mixins.sass' +@import '../../../../../src/sass/_settings.sass' + +ul.side-nav + hr + margin: 5px 0 + background: #ccc + + li + font-size: 14px + font-family: "Roboto", sans-serif + margin: 0 + font-weight: normal + position: relative + + &.hasSubMenu + &.hasSubMenuOpen + &:after + transform: rotate(180deg) + &:after + filter: none + font-size: 18px + top: 10px + right: 5px + display: inline-block + opacity: 0 + transform: rotate(0deg) + zoom: 1 + font-family: "Material Icons" + font-style: normal + vertical-align: baseline + text-align: center + text-transform: none + text-rendering: auto + position: absolute + transition: transform .3s ease, opacity .15s ease + content: 'expand_more' + pointer-events: none + &.active + &:after + color: #fff + + &.active > a + font-family: "Roboto", sans-serif !important + background: $sidebar_item_active !important + color: $sidebar_item_active_text !important + + border-left: 5px solid $accent_color + &:hover + &:after + width: 0 + transform: translateX(0) + + i,svg + color: $sidebar_item_active_text !important + fill: $sidebar_item_active_text !important + margin-left: -3px + + a + padding: 0 0.875rem !important + color: $sidebar_text !important + position: relative + padding-left: 60px !important + line-height: 48px + height: 48px + + &:after + background: $accent_color + bottom: 0 + content: '' + position: absolute + right: 100% + top: 0 + width: 5px + -webkit-transition: -webkit-transform 0.2s ease-in-out + transition: -webkit-transform 0.2s ease-in-out + transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out + + &:hover + &:after + transform: translateX(5px) + + &:not(.button) + display: block + margin: 0 + + span + padding-bottom: 5px + + &:hover + background: $sidebar_item_hover !important + + i,svg + color: $sidebar_text_hover + fill: $sidebar_text_hover + &.icon-accounts + background-position: 0 -24px + &.icon-groups + background-position: 0 -22px + &.icon-invoices + background-position: 0 -20px + + i,svg + line-height: 26px + margin-right: 15px + color: $sidebar_text + margin-top: 5px + position: absolute + top: 5px + left: 15px + fill: $sidebar_text \ No newline at end of file diff --git a/src/client/Components/Nav/Submenu/index.jsx b/src/client/Components/Nav/Submenu/index.jsx index 769c06ed0..7dbf5dba2 100644 --- a/src/client/Components/Nav/Submenu/index.jsx +++ b/src/client/Components/Nav/Submenu/index.jsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; import IsArray from 'lodash/isArray'; @@ -6,7 +6,10 @@ import $ from 'jquery'; import Helpers from 'modules/helpers'; -class Submenu extends React.Component { +//Sass +import './style.sass'; + +class Submenu extends Component { componentDidMount() { this.buildFloatingMenu(this.props.id); } @@ -16,19 +19,15 @@ class Submenu extends React.Component { } shouldComponentUpdate(nextProps) { - if (this.props.children !== nextProps.children) { - return true; - } else { - return false; - } + return this.props.children !== nextProps.children; } buildFloatingMenu(navId) { if (this.props.children) { - var $sideBarToRight = $('.sidebar-to-right'); + let $sideBarToRight = $('.sidebar-to-right'); $sideBarToRight.find('#side-nav-sub-' + navId).remove(); - var ul = $('
            '); - var li = null; + let ul = $('
              '); + let li = null; if (!IsArray(this.props.children)) { if (this.props.children.type.name === 'NavSeperator') return; @@ -36,8 +35,7 @@ class Submenu extends React.Component { li = $('
            • ' + this.props.children.props.text +'
            • '); ul.append(li); } else { - var children = []; - for (var i = 0; i < this.props.children.length; i++) { + for (let i = 0; i < this.props.children.length; i++) { if (!this.props.children[i]) continue; if (this.props.children[i].type.name === 'NavSeperator') @@ -53,7 +51,7 @@ class Submenu extends React.Component { $sideBarToRight.append(ul); - Helpers.UI.setupSidebarTether() + Helpers.UI.setupSidebarTether(); //Ajaxify new floating menu links $('body').ajaxify(); } @@ -71,6 +69,6 @@ class Submenu extends React.Component { Submenu.proptypes = { id: PropTypes.string.isRequired, subMenuOpen: PropTypes.bool -} +}; export default Submenu; \ No newline at end of file diff --git a/src/client/Components/Nav/Submenu/style.sass b/src/client/Components/Nav/Submenu/style.sass new file mode 100644 index 000000000..e5ab5f2fb --- /dev/null +++ b/src/client/Components/Nav/Submenu/style.sass @@ -0,0 +1,114 @@ +@import '../../../../../src/sass/mixins.sass' +@import '../../../../../src/sass/_settings.sass' + +ul.side-nav-sub + line-height: 1.6 + display: block + list-style: none + background: $sidebar_subnav_bg + box-shadow: $sidebar_subnav_box_shadow + +boxShadow(inset -1px 0 0 0 rgba(0,0,0,0.1)) + margin: 0 + overflow: hidden + max-height: 0 + padding: 0 + transition: all .3s cubic-bezier(.215,.61,.355,1) + -webkit-transition: all .3s cubic-bezier(.215,.61,.355,1) + -moz-transition: all .3s cubic-bezier(.215,.61,.355,1) + + &.subMenuOpen + max-height: 500px + + &.side-nav-floating + width: 150px + position: absolute + top: 0 + left: 0 + max-height: none !important + -webkit-transition: all .3s cubic-bezier(.215,.61,.355,1) + -moz-transition: all .3s cubic-bezier(.215,.61,.355,1) + transition: all .3s cubic-bezier(.215,.61,.355,1) + z-index: 9999 + min-width: 145px + border: 1px solid rgba(0,0,0,0.05) + padding-top: 2px + padding-bottom: 2px + +boxShadow(none) + +borderRadius(1px) + opacity: 0 + display: block + visibility: hidden + &.sub-menu-right-open + visibility: visible + opacity: 1 + li.active>a, a + display: block + border-right: none + span + left: 15px + svg,i + display: none + hr + margin: 5px 0 + hr + margin: 15px 20px + border: none + height: 1px + background: $sidebar_subnav_hr + li + margin: 5px 0 + position: relative + + &.active + > a + background: $sidebar_subnav_bg !important + color: $sidebar_subnav_active !important + font-weight: bold + border: none + border-right: 1px solid rgba(0,0,0,0.1) + + &:hover + background: $sidebar_subnav_item_hover !important + &:after + width: 5px + transform: translateX(5px) + i,svg + color: $sidebar_subnav_active !important + fill: $sidebar_subnav_active !important + margin-left: 0 + .fa-sub-icon + line-height: 20px + font-size: 20px + left: 20px + top: 0 + &.material-icons + font-size: 24px + a + border: none + font-weight: 300 + padding-left: 60px !important + line-height: 30px + height: 30px !important + color: $sidebar_subnav_text + span + display: inline-block + position: absolute + top: 1px + left: 62px + i,svg + color: $sidebar_subnav_text !important + fill: $sidebar_subnav_text !important + &:hover + border: none + color: $sidebar_subnav_hover !important + background: $sidebar_subnav_item_hover !important + i,svg + color: $sidebar_subnav_hover !important + fill: $sidebar_subnav_hover !important + .fa-sub-icon,svg + line-height: 20px + font-size: 20px + left: 20px + top: 0 + &.material-icons + font-size: 24px \ No newline at end of file diff --git a/src/sass/app.sass b/src/sass/app.sass index 80fa37fe6..7cd426ad4 100644 --- a/src/sass/app.sass +++ b/src/sass/app.sass @@ -144,7 +144,7 @@ input[type="file"], input[type="checkbox"], input[type="radio"], select @import "partials/common" @import "partials/contextmenu" @import "partials/topnav" -@import "partials/sidebar" +//@import "partials/sidebar" @import "partials/offcanvas" @import "partials/messages" @import "partials/notifications" diff --git a/src/sass/partials/sidebar.sass b/src/sass/partials/sidebar.sass index 4bd7f6ff7..adeae6865 100644 --- a/src/sass/partials/sidebar.sass +++ b/src/sass/partials/sidebar.sass @@ -1,63 +1,10 @@ -//Hack to not show popout menu on reposition -body > .side-nav-sub.tether-element - display: none !important - visibility: hidden !important - opacity: 0 !important - z-index: -9999 !important - height: 0px !important - width: 0px !important - -webkit-transition: none !important - -moz-transition: none !important - -o-transition: none !important - transition: none !important +@import "../mixins" +@import "../_settings" -.no-animation - transition: none !important - -#page-content - transition: margin 0.2s ease - &.expanded-sidebar - margin-left: 215px !important - -.sidebar - @media only screen and (min-width: 40.063em) and (max-width: 64em) - position: absolute - top: 75px - left: 0 - width: 57px - max-width: 57px - z-index: 9999 - overflow: hidden - - background: $sidebar_bg - color: $sidebar_text - width: 57px +.side-nav-bottom-panel position: fixed - top: 75px - left: 0 bottom: 0 - +boxShadow($sidebar_box_shadow) - +boxShadow(inset -1px 0 0 0 rgba(0,0,0,0.1)) - transition: width 0.2s ease - z-index: 10 - //border-right: $sidebar_border_right - #expand-menu - overflow: hidden - &.expand - width: 215px - ul.side-nav - li.hasSubMenu:after - opacity: 1 - .side-nav-bottom-panel - width: 215px - a - width: 215px - padding: 0 0 0 60px !important - font-size: 100% - - -.side-nav-bottom-panel - //width: 100% + left: 0 background: $sidebar_bg display: block margin: 0 @@ -67,136 +14,10 @@ body > .side-nav-sub.tether-element +boxShadow(inset -1px 0 0 0 rgba(0,0,0,0.1)) a transition: all .2s ease - //padding: 0 0.875rem !important padding: 0 !important font-size: 0 color: $sidebar_text !important - //border-left: 2px solid $sidebar_bg - position: relative - //padding-left: 60px !important - line-height: 48px - height: 48px - - &:after - background: $accent_color - bottom: 0 - content: '' - position: absolute - right: 100% - top: 0 - width: 5px - -webkit-transition: -webkit-transform 0.2s ease-in-out - transition: -webkit-transform 0.2s ease-in-out - transition: transform 0.2s ease-in-out - transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out - - &:hover - &:after - transform: translateX(5px) - - &:not(.button) - display: block - margin: 0 - - span - padding-bottom: 5px - - &:hover - //border-left: 2px solid $accent_color - background: $sidebar_item_hover !important - - i,svg - color: $sidebar_text_hover - fill: $sidebar_text_hover - &.icon-accounts - background-position: 0 -24px - &.icon-groups - background-position: 0 -22px - &.icon-invoices - background-position: 0 -20px - - i,svg - line-height: 26px - margin-right: 15px - color: $sidebar_text - margin-top: 5px - position: absolute - top: 5px - left: 15px - fill: $sidebar_text - -ul.side-nav - list-style: none outside none - line-height: 1.6 - display: block - margin: 0 - padding: 0.875rem 0 - - hr - margin: 5px 0 - background: #ccc - - li - font-size: 14px - font-family: "Roboto", sans-serif - margin: 0 - font-weight: normal - position: relative - //&:hover - // & > .side-nav-sub.side-nav-floating - // display: block - // opacity: 1 - // visibility: visible - - &.hasSubMenu - &.hasSubMenuOpen - &:after - transform: rotate(180deg) - &:after - filter: none - font-size: 18px - top: 10px - right: 5px - display: inline-block - opacity: 0 - transform: rotate(0deg) - zoom: 1 - font-family: "Material Icons" - font-style: normal - vertical-align: baseline - text-align: center - text-transform: none - text-rendering: auto - position: absolute - transition: transform .3s ease, opacity .15s ease - content: 'expand_more' - pointer-events: none - &.active - &:after - color: #fff - - &.active > a - font-family: "Roboto", sans-serif !important - background: $sidebar_item_active !important - color: $sidebar_item_active_text !important - - border-left: 5px solid $accent_color - &:hover - &:after - width: 0 - transform: translateX(0) - - i,svg - color: $sidebar_item_active_text !important - fill: $sidebar_item_active_text !important - margin-left: -3px - - a - padding: 0 0.875rem !important - color: $sidebar_text !important - //border-left: 2px solid $sidebar_bg position: relative - padding-left: 60px !important line-height: 48px height: 48px @@ -210,7 +31,6 @@ ul.side-nav width: 5px -webkit-transition: -webkit-transform 0.2s ease-in-out transition: -webkit-transform 0.2s ease-in-out - transition: transform 0.2s ease-in-out transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out &:hover @@ -225,18 +45,11 @@ ul.side-nav padding-bottom: 5px &:hover - //border-left: 2px solid $accent_color background: $sidebar_item_hover !important i,svg color: $sidebar_text_hover fill: $sidebar_text_hover - &.icon-accounts - background-position: 0 -24px - &.icon-groups - background-position: 0 -22px - &.icon-invoices - background-position: 0 -20px i,svg line-height: 26px @@ -246,168 +59,4 @@ ul.side-nav position: absolute top: 5px left: 15px - fill: $sidebar_text - -ul.side-nav-sub - @extend .side-nav - list-style: none - background: $sidebar_subnav_bg - box-shadow: $sidebar_subnav_box_shadow - +boxShadow(inset -1px 0 0 0 rgba(0,0,0,0.1)) - margin: 0 - overflow: hidden - max-height: 0 - padding: 0 - transition: all .3s cubic-bezier(.215,.61,.355,1) - -webkit-transition: all .3s cubic-bezier(.215,.61,.355,1) - -moz-transition: all .3s cubic-bezier(.215,.61,.355,1) - - &.subMenuOpen - max-height: 500px - - &.side-nav-floating - width: 150px - position: absolute - top: 0 - left: 0 - max-height: none !important - -webkit-transition: all .3s cubic-bezier(.215,.61,.355,1) - -moz-transition: all .3s cubic-bezier(.215,.61,.355,1) - transition: all .3s cubic-bezier(.215,.61,.355,1) - z-index: 9999 - min-width: 145px - border: 1px solid rgba(0,0,0,0.05) - padding-top: 2px - padding-bottom: 2px - +boxShadow(none) - +borderRadius(1px) - opacity: 0 - display: block - visibility: hidden - &.sub-menu-right-open - visibility: visible - opacity: 1 - li.active>a, a - border-right: none - span - left: 15px - svg,i - display: none - hr - margin: 5px 0 - hr - margin: 15px 20px - border: none - height: 1px - background: $sidebar_subnav_hr - li - margin: 5px 0 - position: relative - - &.active - > a - background: $sidebar_subnav_bg !important - color: $sidebar_subnav_active !important - font-weight: bold - border: none - border-right: 1px solid rgba(0,0,0,0.1) - - &:hover - background: $sidebar_subnav_item_hover !important - &:after - width: 5px - transform: translateX(5px) - i,svg - color: $sidebar_subnav_active !important - fill: $sidebar_subnav_active !important - margin-left: 0 - .fa-sub-icon - line-height: 20px - font-size: 20px - left: 20px - top: 0 - &.material-icons - font-size: 24px - - .icon-inbox - background-position: 0 -18px - .icon-sent - background-position: -16px -17px - .icon-trash - background-position: -32px -16px - .icon-check - background-position: 0 -16px - a - border: none - font-weight: 300 - padding-left: 60px !important - line-height: 30px - height: 30px !important - color: $sidebar_subnav_text - span - display: inline-block - position: absolute - top: 1px - left: 62px - i,svg - color: $sidebar_subnav_text !important - fill: $sidebar_subnav_text !important - &:hover - border: none - color: $sidebar_subnav_hover !important - //background: inherit !important - background: $sidebar_subnav_item_hover !important - i,svg - color: $sidebar_subnav_hover !important - fill: $sidebar_subnav_hover !important - .icon-inbox - background-position: 0 -18px - .icon-sent - background-position: -16px -17px - .icon-trash - background-position: -32px -16px - .icon-check - background-position: 0 -16px - .fa-sub-icon,svg - line-height: 20px - font-size: 20px - left: 20px - top: 0 - &.material-icons - font-size: 24px - -.icon-inbox, -.icon-sent, -.icon-trash, -.icon-check - width: 16px - height: 16px - background: url(/img/inbox.png) 0 0 no-repeat - position: absolute - top: 3px !important - left: 20px !important - -.icon-check - background-image: url(/img/tickets_submenu.png) - -.icon-sent - background-position: -16px 0 -.icon-trash - background-position: -32px 0 - left: 22px !important - -.icon-accounts - width: 18px - height: 24px - background: url(/img/accounts.png) 0 0 no-repeat - -.icon-groups - width: 22px - height: 22px - background: url(/img/groups.png) 0 0 no-repeat - -.icon-invoices - width: 24px - height: 20px - background: url(/img/invoices.png) 0 0 no-repeat - top: 10px !important \ No newline at end of file + fill: $sidebar_text \ No newline at end of file diff --git a/src/views/partials/nav.hbs b/src/views/partials/nav.hbs index 43954b642..1bda588eb 100644 --- a/src/views/partials/nav.hbs +++ b/src/views/partials/nav.hbs @@ -1,161 +1,10 @@ - ) + ); } } -SubmenuItem.proptypes = { +SubmenuItem.propTypes = { href: PropTypes.string.isRequired, text: PropTypes.string.isRequired, icon: PropTypes.string.isRequired, diff --git a/src/public/js/pages/pageloader.js b/src/public/js/pages/pageloader.js index 53a40f7b7..60cc1d84d 100644 --- a/src/public/js/pages/pageloader.js +++ b/src/public/js/pages/pageloader.js @@ -18,7 +18,7 @@ define('pages/pageloader', ['async', 'jquery'], function(async, $) { var pageLoader = {}; pageLoader.init = function(callback) { - global.react.updateSidebar({activeItem: $('#__sidebar_route').text(), activeSubItem: $('#__sidebar_sub_route').text(), sessionUser: window.trudeskSessionService.getUser()}); + window.react.updateSidebar({activeItem: $('#__sidebar_route').text(), activeSubItem: $('#__sidebar_sub_route').text(), sessionUser: window.trudeskSessionService.getUser()}); require([ 'pages/dashboard', 'pages/messages', diff --git a/yarn.lock b/yarn.lock index d0e541c56..1e429dac9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -299,10 +299,21 @@ array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" +array-find@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -1839,6 +1850,10 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" @@ -2241,6 +2256,12 @@ deepmerge@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768" +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + dependencies: + object-keys "^1.0.12" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -2348,6 +2369,13 @@ dive@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/dive/-/dive-0.5.0.tgz#06d0e07edd25da849598bacab44d51f2809bec47" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + doctrine@^2.0.2, doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -2560,6 +2588,14 @@ enhanced-resolve@^3.4.0: object-assign "^4.0.1" tapable "^0.2.7" +enhanced-resolve@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" @@ -2587,6 +2623,24 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" +es-abstract@^1.7.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.46" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" @@ -2709,6 +2763,35 @@ eslint-config-angular@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/eslint-config-angular/-/eslint-config-angular-0.5.0.tgz#e0aae0132e39e7467df3f7547fec81a44d3685c4" +eslint-import-resolver-node@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" + dependencies: + debug "^2.6.9" + resolve "^1.5.0" + +eslint-import-resolver-webpack@0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.10.1.tgz#4cbceed2c0c43e488a74775c30861e58e00fb290" + dependencies: + array-find "^1.0.0" + debug "^2.6.8" + enhanced-resolve "~0.9.0" + find-root "^1.1.0" + has "^1.0.1" + interpret "^1.0.0" + lodash "^4.17.4" + node-libs-browser "^1.0.0 || ^2.0.0" + resolve "^1.4.0" + semver "^5.3.0" + +eslint-module-utils@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" + eslint-plugin-angular@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-plugin-angular/-/eslint-plugin-angular-3.3.0.tgz#ba841ec018c8bc2d70f901ac41a6e7be5f79882b" @@ -2720,6 +2803,21 @@ eslint-plugin-es@^1.3.1: eslint-utils "^1.3.0" regexpp "^2.0.0" +eslint-plugin-import@2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz#6b17626d2e3e6ad52cfce8807a845d15e22111a8" + dependencies: + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.2.0" + has "^1.0.1" + lodash "^4.17.4" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + resolve "^1.6.0" + eslint-plugin-node@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz#a6e054e50199b2edd85518b89b4e7b323c9f36db" @@ -2731,6 +2829,16 @@ eslint-plugin-node@7.0.1: resolve "^1.8.1" semver "^5.5.0" +eslint-plugin-react@7.11.1: + version "7.11.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz#c01a7af6f17519457d6116aa94fc6d2ccad5443c" + dependencies: + array-includes "^3.0.3" + doctrine "^2.1.0" + has "^1.0.3" + jsx-ast-utils "^2.0.1" + prop-types "^15.6.2" + eslint-scope@^3.7.1: version "3.7.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" @@ -3243,6 +3351,10 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -3404,7 +3516,7 @@ ftp@~0.3.10: readable-stream "1.1.x" xregexp "2.0.0" -function-bind@^1.0.2: +function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -3819,6 +3931,10 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3856,6 +3972,12 @@ has@^1.0.1: dependencies: function-bind "^1.0.2" +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + hasbin@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/hasbin/-/hasbin-1.2.3.tgz#78c5926893c80215c2b568ae1fd3fcab7a2696b0" @@ -4266,6 +4388,10 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -4278,6 +4404,10 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -4426,7 +4556,7 @@ is-promise@^2.0.0, is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-regex@^1.0.3: +is-regex@^1.0.3, is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" dependencies: @@ -4446,6 +4576,12 @@ is-svg@^2.0.0: dependencies: html-comment-regex "^1.1.0" +is-symbol@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + dependencies: + has-symbols "^1.0.0" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -4680,6 +4816,12 @@ jstransformer@1.0.0: is-promise "^2.0.0" promise "^7.0.1" +jsx-ast-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + jszip@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37" @@ -5165,6 +5307,10 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -5303,7 +5449,7 @@ minimatch@0.3: lru-cache "2" sigmund "~1.0.0" -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -5633,7 +5779,7 @@ node-gyp@^3.8.0: tar "^2.0.0" which "1" -node-libs-browser@^2.0.0: +"node-libs-browser@^1.0.0 || ^2.0.0", node-libs-browser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" dependencies: @@ -5851,6 +5997,10 @@ object-hash@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2" +object-keys@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -6205,6 +6355,12 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" @@ -6621,7 +6777,7 @@ prop-types@15.6.1: loose-envify "^1.3.1" object-assign "^4.1.1" -prop-types@^15.6.0: +prop-types@^15.6.0, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" dependencies: @@ -7285,7 +7441,7 @@ resolve@^1.1.6, resolve@^1.4.0: dependencies: path-parse "^1.0.5" -resolve@^1.8.1: +resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: @@ -8293,6 +8449,10 @@ table@^4.0.1, table@^4.0.3: slice-ansi "1.0.0" string-width "^2.1.1" +tapable@^0.1.8: + version "0.1.10" + resolved "http://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + tapable@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" From dec539d732b886a71dc07777f6ab83bcdd807887 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Tue, 15 Jan 2019 20:54:37 -0500 Subject: [PATCH 10/68] chore(package.json): updated --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index e2e363a20..8c89d39d8 100644 --- a/package.json +++ b/package.json @@ -102,10 +102,10 @@ "winston": "2.4.4" }, "devDependencies": { - "@commitlint/cli": "7.1.2", - "@commitlint/config-conventional": "7.1.2", - "@semantic-release/changelog": "3.0.0", - "@semantic-release/git": "7.0.4", + "@commitlint/cli": "7.3.2", + "@commitlint/config-conventional": "7.3.1", + "@semantic-release/changelog": "3.0.2", + "@semantic-release/git": "7.0.8", "babel-core": "6.26.3", "babel-loader": "7.1.4", "babel-preset-env": "1.6.1", @@ -124,7 +124,7 @@ "grunt-express-server": "0.5.4", "grunt-htmlhint": "0.9.13", "grunt-parallel": "0.5.1", - "husky": "1.0.0", + "husky": "1.3.1", "istanbul": "0.4.5", "lorem-ipsum": "1.0.5", "mocha": "5.2.0", From b949a6981e379df25c473ecb11e0ac996c28baa8 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Wed, 16 Jan 2019 01:17:59 -0500 Subject: [PATCH 11/68] chore(react): basic redux store --- gruntfile.js | 3 +- package.json | 14 +- src/client/.eslintrc.json | 3 +- src/client/Components/Nav/Sidebar/index.jsx | 34 +- .../Components/Nav/SidebarItem/style.sass | 1 - src/client/actions/nav.js | 4 + src/client/actions/stateConstants.js | 3 + src/client/actions/types.js | 5 + src/client/app.jsx | 33 +- src/client/reducers/index.js | 12 + src/client/reducers/sidebarReducer.js | 23 ++ src/client/sagas/index.js | 7 + src/public/js/pages/pageloader.js | 11 +- yarn.lock | 363 ++++++++++++++---- 14 files changed, 420 insertions(+), 96 deletions(-) create mode 100644 src/client/actions/nav.js create mode 100644 src/client/actions/stateConstants.js create mode 100644 src/client/actions/types.js create mode 100644 src/client/reducers/index.js create mode 100644 src/client/reducers/sidebarReducer.js create mode 100644 src/client/sagas/index.js diff --git a/gruntfile.js b/gruntfile.js index 65e46cfa4..3ea7a34ec 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -22,7 +22,8 @@ module.exports = function(grunt) { '*.js', 'src/**/*.js', 'plugins/**/*.js', - '!src/public/**/*.js' + '!src/public/**/*.js', + '!src/client/**/*.js' ], tasks: ['express:web'], options: { diff --git a/package.json b/package.json index 8c89d39d8..a7262dc24 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "ansi_up": "3.0.0", "archiver": "3.0.0", "async": "2.6.1", + "axios": "0.18.0", "bcrypt": "3.0.0", "body-parser": "1.18.3", "busboy": "0.2.14", @@ -78,10 +79,16 @@ "passport-totp": "0.0.2", "passport.socketio": "3.7.0", "pm2": "3.0.3", - "prop-types": "15.6.1", - "react": "16.3.2", - "react-dom": "16.3.2", + "prop-types": "15.6.2", + "react": "16.7.0", + "react-dom": "16.7.0", + "react-redux": "6.0.0", "redis": "2.8.0", + "redux": "4.0.1", + "redux-actions": "2.6.4", + "redux-define": "1.1.1", + "redux-form": "8.1.0", + "redux-saga": "0.16.2", "request": "2.88.0", "rimraf": "2.6.2", "sanitize-html": "1.18.4", @@ -107,6 +114,7 @@ "@semantic-release/changelog": "3.0.2", "@semantic-release/git": "7.0.8", "babel-core": "6.26.3", + "babel-eslint": "10.0.1", "babel-loader": "7.1.4", "babel-preset-env": "1.6.1", "babel-preset-react": "6.24.1", diff --git a/src/client/.eslintrc.json b/src/client/.eslintrc.json index afcc81316..ff547bbbc 100644 --- a/src/client/.eslintrc.json +++ b/src/client/.eslintrc.json @@ -3,8 +3,9 @@ "react", "import" ], + "parser": "babel-eslint", "parserOptions": { - "ecmaVersion": 6, + "ecmaVersion": 2017, "sourceType": "module", "ecmaFeatures": { "jsx": true diff --git a/src/client/Components/Nav/Sidebar/index.jsx b/src/client/Components/Nav/Sidebar/index.jsx index 1f7ba41fc..60f04de6f 100644 --- a/src/client/Components/Nav/Sidebar/index.jsx +++ b/src/client/Components/Nav/Sidebar/index.jsx @@ -1,9 +1,13 @@ import React from 'react'; +import { connect } from 'react-redux'; +import PropTypes from 'prop-types'; import SidebarItem from 'Components/Nav/SidebarItem'; import NavSeparator from 'Components/Nav/NavSeperator'; import Submenu from 'Components/Nav/Submenu'; import SubmenuItem from 'Components/Nav/SubmenuItem'; +import { updateNavChange } from '../../../actions/nav'; + import Permissions from '../../../../permissions/index.js'; import Helpers from 'modules/helpers'; @@ -11,17 +15,10 @@ import Helpers from 'modules/helpers'; class Sidebar extends React.Component { constructor(props) { super(props); - this.state = { - activeItem: '', - activeSubItem: '', - sessionUser: null, - - plugins: null - }; - window.react.updateSidebar = (data) => { - this.setState(data); - }; + // window.react.updateSidebar = (data) => { + // this.props.updateNavChange(data); + // }; } componentDidMount() { @@ -72,7 +69,7 @@ class Sidebar extends React.Component { } render() { - const { activeItem, activeSubItem, plugins, sessionUser } = this.state; + const { activeItem, activeSubItem, plugins, sessionUser } = this.props; return (
                @@ -136,4 +133,17 @@ class Sidebar extends React.Component { } } -export default Sidebar; \ No newline at end of file +Sidebar.propTypes = { + updateNavChange: PropTypes.func.isRequired, + activeItem: PropTypes.string.isRequired, + activeSubItem: PropTypes.string.isRequired, + sessionUser: PropTypes.object.isRequired +}; + +const mapStateToProps = (state) => ({ + activeItem: state.sidebar.activeItem, + activeSubItem: state.sidebar.activeSubItem, + sessionUser: state.sidebar.sessionUser +}); + +export default connect(mapStateToProps, { updateNavChange })(Sidebar); \ No newline at end of file diff --git a/src/client/Components/Nav/SidebarItem/style.sass b/src/client/Components/Nav/SidebarItem/style.sass index be461b3a6..8cc31cf2e 100644 --- a/src/client/Components/Nav/SidebarItem/style.sass +++ b/src/client/Components/Nav/SidebarItem/style.sass @@ -4,7 +4,6 @@ ul.side-nav hr margin: 5px 0 - background: #ccc li font-size: 14px diff --git a/src/client/actions/nav.js b/src/client/actions/nav.js new file mode 100644 index 000000000..e350b058f --- /dev/null +++ b/src/client/actions/nav.js @@ -0,0 +1,4 @@ +import { createAction } from 'redux-actions'; +import { NAV_CHANGE } from './types'; + +export const updateNavChange = createAction(NAV_CHANGE.ACTION, values => ({activeItem: values.activeItem, activeSubItem: values.activeSubItem, sessionUser: values.sessionUser })); \ No newline at end of file diff --git a/src/client/actions/stateConstants.js b/src/client/actions/stateConstants.js new file mode 100644 index 000000000..79ae15110 --- /dev/null +++ b/src/client/actions/stateConstants.js @@ -0,0 +1,3 @@ +export const PENDING = 'PENDING'; +export const ERROR = 'ERROR'; +export const SUCCESS = 'SUCCESS'; \ No newline at end of file diff --git a/src/client/actions/types.js b/src/client/actions/types.js new file mode 100644 index 000000000..e8b3bda4a --- /dev/null +++ b/src/client/actions/types.js @@ -0,0 +1,5 @@ +import { defineAction } from 'redux-define'; +import { ERROR, SUCCESS } from './stateConstants'; + +// Common Nav Change +export const NAV_CHANGE = defineAction('NAV_CHANGE'); \ No newline at end of file diff --git a/src/client/app.jsx b/src/client/app.jsx index 4557bbf3c..ba8917ffa 100644 --- a/src/client/app.jsx +++ b/src/client/app.jsx @@ -1,9 +1,40 @@ import React from 'react'; import ReactDOM from 'react-dom'; +import { applyMiddleware, createStore, compose } from 'redux'; +import { Provider } from 'react-redux'; +import createSagaMiddleware from 'redux-saga'; + +import IndexReducer from './reducers'; +import IndexSagas from './sagas'; + +const sagaMiddleware = createSagaMiddleware(); import Sidebar from './Components/Nav/Sidebar/index.jsx'; +/*eslint-disable */ +const composeSetup = process.env.NODE_ENV !== 'production' && typeof window === 'object' && +window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? + window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : compose; +/*eslint-enable */ + +const store = createStore( + IndexReducer, + composeSetup(applyMiddleware(sagaMiddleware)) +); + +// This is need to call an action from angular +// Goal: remove this once angular is fully removed +window.react.redux = { store }; + +sagaMiddleware.run(IndexSagas); + +const sidebarWithProvider = ( + + + +); + ReactDOM.render( - , + sidebarWithProvider, document.getElementById('side-nav') ); \ No newline at end of file diff --git a/src/client/reducers/index.js b/src/client/reducers/index.js new file mode 100644 index 000000000..d982213cd --- /dev/null +++ b/src/client/reducers/index.js @@ -0,0 +1,12 @@ +import { combineReducers } from 'redux'; +import { reducer as form } from 'redux-form'; + +import sidebar from './sidebarReducer'; + +const IndexReducer = combineReducers({ + sidebar, + + form +}); + +export default IndexReducer; \ No newline at end of file diff --git a/src/client/reducers/sidebarReducer.js b/src/client/reducers/sidebarReducer.js new file mode 100644 index 000000000..ae9fc8ae2 --- /dev/null +++ b/src/client/reducers/sidebarReducer.js @@ -0,0 +1,23 @@ +import { handleActions } from 'redux-actions'; +import { NAV_CHANGE } from '../actions/types'; + +const initialState = { + activeItem: '', + activeSubItem: '', + sessionUser: null, + + plugins: null +}; + +const sidebarReducer = handleActions({ + [NAV_CHANGE]: (state, action) => ({ + activeItem: action.payload.activeItem, + activeSubItem: action.payload.activeSubItem, + sessionUser: action.payload.sessionUser, + + plugins: null + }) + +}, initialState); + +export default sidebarReducer; \ No newline at end of file diff --git a/src/client/sagas/index.js b/src/client/sagas/index.js new file mode 100644 index 000000000..a793ea921 --- /dev/null +++ b/src/client/sagas/index.js @@ -0,0 +1,7 @@ +import { all } from 'redux-saga/effects'; + +export default function* IndexSagas () { + yield all([ + + ]); +} \ No newline at end of file diff --git a/src/public/js/pages/pageloader.js b/src/public/js/pages/pageloader.js index 60cc1d84d..156bcd27e 100644 --- a/src/public/js/pages/pageloader.js +++ b/src/public/js/pages/pageloader.js @@ -18,7 +18,16 @@ define('pages/pageloader', ['async', 'jquery'], function(async, $) { var pageLoader = {}; pageLoader.init = function(callback) { - window.react.updateSidebar({activeItem: $('#__sidebar_route').text(), activeSubItem: $('#__sidebar_sub_route').text(), sessionUser: window.trudeskSessionService.getUser()}); + // window.react.updateSidebar({activeItem: $('#__sidebar_route').text(), activeSubItem: $('#__sidebar_sub_route').text(), sessionUser: window.trudeskSessionService.getUser()}); + window.react.redux.store.dispatch({ + type: 'NAV_CHANGE', + payload: { + activeItem: $('#__sidebar_route').text(), + activeSubItem: $('#__sidebar_sub_route').text(), + sessionUser: window.trudeskSessionService.getUser() + } + }); + require([ 'pages/dashboard', 'pages/messages', diff --git a/yarn.lock b/yarn.lock index 13c7d4e9d..3baa88ee7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,101 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/generator@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" + integrity sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg== + dependencies: + "@babel/types" "^7.2.2" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" + integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== + +"@babel/runtime@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" + integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/template@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + +"@babel/traverse@^7.0.0": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" + integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.2.3" + "@babel/types" "^7.2.2" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@^7.0.0", "@babel/types@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" + integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + "@commitlint/cli@7.3.2": version "7.3.2" resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-7.3.2.tgz#61abf30b48861e4fbd521690e6d4a3e1258980bb" @@ -904,6 +999,14 @@ aws4@^1.6.0, aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +axios@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI= + dependencies: + follow-redirects "^1.3.0" + is-buffer "^1.1.5" + axios@^0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d" @@ -946,6 +1049,18 @@ babel-core@6.26.3, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" +babel-eslint@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" + integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" + babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -2906,11 +3021,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - core-js@^2.4.0, core-js@^2.5.0: version "2.6.2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.2.tgz#267988d7268323b349e20b4588211655f0e83944" @@ -3295,7 +3405,7 @@ dateformat@~1.0.12: get-stdin "^4.0.1" meow "^3.3.0" -debug@*, debug@^4.0.0: +debug@*, debug@^4.0.0, debug@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -3942,6 +4052,11 @@ es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: es6-symbol "~3.1.1" next-tick "1" +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" @@ -4152,6 +4267,14 @@ eslint-plugin-react@7.11.1: jsx-ast-utils "^2.0.1" prop-types "^15.6.2" +eslint-scope@3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" + integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug= + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + eslint-scope@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" @@ -4605,19 +4728,6 @@ faye-websocket@~0.10.0: dependencies: websocket-driver ">=0.5.1" -fbjs@^0.8.16: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.18" - fclone@1.0.11, fclone@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640" @@ -4781,7 +4891,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" -follow-redirects@^1.2.3: +follow-redirects@^1.2.3, follow-redirects@^1.3.0: version "1.6.1" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.6.1.tgz#514973c44b5757368bad8bddfe52f81f015c94cb" integrity sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ== @@ -5233,7 +5343,7 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^11.7.0: +globals@^11.1.0, globals@^11.7.0: version "11.10.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" integrity sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ== @@ -5637,6 +5747,13 @@ hoek@6.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.2.tgz#99e6d070561839de74ee427b61aa476bd6bddfd6" integrity sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q== +hoist-non-react-statics@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.2.1.tgz#c09c0555c84b38a7ede6912b61efddafd6e75e1e" + integrity sha512-TFsu3TV3YLY+zFTZDrN8L2DTFanObwmBLpWvJs1qfUuEQ5bTAdFcwfx2T/bsCXfM9QHSLvjfP+nihEl0yvozxw== + dependencies: + react-is "^16.3.2" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -6058,7 +6175,7 @@ into-stream@^4.0.0: from2 "^2.1.1" p-is-promise "^2.0.0" -invariant@^2.2.2: +invariant@^2.2.2, invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -6379,7 +6496,7 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -6474,14 +6591,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - isstream@0.1.x, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -6565,7 +6674,7 @@ js-stringify@^1.0.1: resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -6614,6 +6723,11 @@ jsesc@^1.3.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -6746,6 +6860,11 @@ juice@^4.3.2: slick "^1.12.2" web-resource-inliner "^4.2.1" +just-curry-it@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/just-curry-it/-/just-curry-it-3.1.0.tgz#ab59daed308a58b847ada166edd0a2d40766fbc5" + integrity sha512-mjzgSOFzlrurlURaHVjnQodyPNvrHrf1TbQP2XU9NSqBtHQPuHZ+Eb6TAJP7ASeJN9h9K0KXoRTs8u6ouHBKvg== + kareem@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.2.1.tgz#9950809415aa3cde62ab43b4f7b919d99816e015" @@ -7023,6 +7142,11 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" +lodash-es@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.11.tgz#145ab4a7ac5c5e52a3531fb4f310255a152b4be0" + integrity sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q== + lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -7281,7 +7405,7 @@ longest@^1.0.1: resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -8124,14 +8248,6 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-fetch@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" @@ -9711,7 +9827,7 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" -"promise@>=3.2 <8", promise@^7.0.1, promise@^7.1.1: +"promise@>=3.2 <8", promise@^7.0.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== @@ -9732,16 +9848,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@15.6.1: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" - integrity sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ== - dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -prop-types@^15.6.0, prop-types@^15.6.2: +prop-types@15.6.2, prop-types@^15.6.1, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -10109,25 +10216,47 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dom@16.3.2: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.3.2.tgz#cb90f107e09536d683d84ed5d4888e9640e0e4df" - integrity sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA== +react-dom@16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.7.0.tgz#a17b2a7ca89ee7390bc1ed5eb81783c7461748b8" + integrity sha512-D0Ufv1ExCAmF38P2Uh1lwpminZFRXEINJe53zRAbm4KPwSyd6DY/uDoS0Blj9jvPpn1+wivKpZYc8aAAN/nAkg== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.12.0" + +react-is@^16.3.2, react-is@^16.6.3, react-is@^16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa" + integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react@16.3.2: - version "16.3.2" - resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9" - integrity sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg== +react-redux@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-6.0.0.tgz#09e86eeed5febb98e9442458ad2970c8f1a173ef" + integrity sha512-EmbC3uLl60pw2VqSSkj6HpZ6jTk12RMrwXMBdYtM6niq0MdEaRq9KYCwpJflkOZj349BLGQm1MI/JO1W96kLWQ== + dependencies: + "@babel/runtime" "^7.2.0" + hoist-non-react-statics "^3.2.1" + invariant "^2.2.4" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-is "^16.6.3" + +react@16.7.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381" + integrity sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" + scheduler "^0.12.0" read-cmd-shim@^1.0.1, read-cmd-shim@~1.0.1: version "1.0.1" @@ -10426,6 +10555,56 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" +reduce-reducers@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz#8e052618801cd8fc2714b4915adaa8937eb6d66c" + integrity sha512-+CNMnI8QhgVMtAt54uQs3kUxC3Sybpa7Y63HR14uGLgI9/QR5ggHvpxwhGGe3wmx5V91YwqQIblN9k5lspAmGw== + +redux-actions@2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/redux-actions/-/redux-actions-2.6.4.tgz#e1d9d7d987d274071b0134b707365d3e25ba3b26" + integrity sha512-Gho+gnsvyR5h0pApoMdHLYssVEu4I0DNqyC91u43Xy/BvLrEddEMtukLF8oL3WXUy7DjxqKOKZHKmpKyN6hxlQ== + dependencies: + invariant "^2.2.4" + just-curry-it "^3.1.0" + loose-envify "^1.4.0" + reduce-reducers "^0.4.3" + to-camel-case "^1.0.0" + +redux-define@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/redux-define/-/redux-define-1.1.1.tgz#98f97bfa45219a1d646a76b8512f421a96c289bf" + integrity sha1-mPl7+kUhmh1kana4US9CGpbCib8= + +redux-form@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/redux-form/-/redux-form-8.1.0.tgz#087b39eaa96b6f5cc0764a30eca10e0459884cce" + integrity sha512-d2+0OaJpSq3kwkbPtFlG3W/HENWLxX8NqqTHSOnfgIrID/9faH/rxejLa1X3HChilCTm71zWe/g9zaLPCMCofQ== + dependencies: + "@babel/runtime" "^7.2.0" + es6-error "^4.1.1" + hoist-non-react-statics "^3.2.1" + invariant "^2.2.4" + is-promise "^2.1.0" + lodash "^4.17.11" + lodash-es "^4.17.11" + prop-types "^15.6.1" + react-is "^16.7.0" + react-lifecycles-compat "^3.0.4" + +redux-saga@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-0.16.2.tgz#993662e86bc945d8509ac2b8daba3a8c615cc971" + integrity sha512-iIjKnRThI5sKPEASpUvySemjzwqwI13e3qP7oLub+FycCRDysLSAOwt958niZW6LhxfmS6Qm1BzbU70w/Koc4w== + +redux@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" + integrity sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg== + dependencies: + loose-envify "^1.4.0" + symbol-observable "^1.2.0" + regenerate@^1.2.1: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" @@ -10441,6 +10620,11 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -10882,6 +11066,14 @@ scandirectory@^2.5.0: safefs "^3.1.2" taskgroup "^4.0.5" +scheduler@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.12.0.tgz#8ab17699939c0aedc5a196a657743c496538647b" + integrity sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + schema-utils@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" @@ -11052,7 +11244,7 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" -"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4, setimmediate@^1.0.5: +"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -11567,7 +11759,7 @@ source-map@0.5.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.0.tgz#0fe96503ac86a5adb5de63f4e412ae4872cdbe86" integrity sha1-D+llA6yGpa213mP05BKuSHLNvoY= -source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -12047,6 +12239,11 @@ symbol-observable@1.0.1: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= +symbol-observable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + table@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" @@ -12246,11 +12443,28 @@ to-buffer@^1.1.1: resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== +to-camel-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-camel-case/-/to-camel-case-1.0.0.tgz#1a56054b2f9d696298ce66a60897322b6f423e46" + integrity sha1-GlYFSy+daWKYzmamCJcyK29CPkY= + dependencies: + to-space-case "^1.0.0" + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-no-case@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" + integrity sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo= + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -12276,6 +12490,13 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +to-space-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" + integrity sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc= + dependencies: + to-no-case "^1.0.0" + token-stream@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" @@ -12423,11 +12644,6 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -ua-parser-js@^0.7.18: - version "0.7.19" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" - integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== - uc.micro@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" @@ -12911,11 +13127,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -whatwg-fetch@>=0.10.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== - whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" From 7725d5760685b6283d473d4a360723bedd3c78df Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Wed, 16 Jan 2019 01:27:18 -0500 Subject: [PATCH 12/68] refactor(components): renamed --- src/client/app.jsx | 2 +- src/client/{Components => components}/Button/index.jsx | 0 .../Nav/NavSeperator/index.jsx | 0 .../{Components => components}/Nav/Sidebar/index.jsx | 10 +++++----- .../{Components => components}/Nav/Sidebar/style.sass | 0 .../Nav/SidebarItem/index.jsx | 0 .../Nav/SidebarItem/style.sass | 0 .../{Components => components}/Nav/Submenu/index.jsx | 0 .../{Components => components}/Nav/Submenu/style.sass | 0 .../Nav/SubmenuItem/index.jsx | 0 src/sass/app.sass | 6 +++--- webpack.config.dist.js | 2 +- webpack.config.js | 2 +- 13 files changed, 11 insertions(+), 11 deletions(-) rename src/client/{Components => components}/Button/index.jsx (100%) rename src/client/{Components => components}/Nav/NavSeperator/index.jsx (100%) rename src/client/{Components => components}/Nav/Sidebar/index.jsx (96%) rename src/client/{Components => components}/Nav/Sidebar/style.sass (100%) rename src/client/{Components => components}/Nav/SidebarItem/index.jsx (100%) rename src/client/{Components => components}/Nav/SidebarItem/style.sass (100%) rename src/client/{Components => components}/Nav/Submenu/index.jsx (100%) rename src/client/{Components => components}/Nav/Submenu/style.sass (100%) rename src/client/{Components => components}/Nav/SubmenuItem/index.jsx (100%) diff --git a/src/client/app.jsx b/src/client/app.jsx index ba8917ffa..23440ab4d 100644 --- a/src/client/app.jsx +++ b/src/client/app.jsx @@ -9,7 +9,7 @@ import IndexSagas from './sagas'; const sagaMiddleware = createSagaMiddleware(); -import Sidebar from './Components/Nav/Sidebar/index.jsx'; +import Sidebar from './components/Nav/Sidebar/index.jsx'; /*eslint-disable */ const composeSetup = process.env.NODE_ENV !== 'production' && typeof window === 'object' && diff --git a/src/client/Components/Button/index.jsx b/src/client/components/Button/index.jsx similarity index 100% rename from src/client/Components/Button/index.jsx rename to src/client/components/Button/index.jsx diff --git a/src/client/Components/Nav/NavSeperator/index.jsx b/src/client/components/Nav/NavSeperator/index.jsx similarity index 100% rename from src/client/Components/Nav/NavSeperator/index.jsx rename to src/client/components/Nav/NavSeperator/index.jsx diff --git a/src/client/Components/Nav/Sidebar/index.jsx b/src/client/components/Nav/Sidebar/index.jsx similarity index 96% rename from src/client/Components/Nav/Sidebar/index.jsx rename to src/client/components/Nav/Sidebar/index.jsx index 60f04de6f..d14a0aaa8 100644 --- a/src/client/Components/Nav/Sidebar/index.jsx +++ b/src/client/components/Nav/Sidebar/index.jsx @@ -1,10 +1,10 @@ import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; -import SidebarItem from 'Components/Nav/SidebarItem'; -import NavSeparator from 'Components/Nav/NavSeperator'; -import Submenu from 'Components/Nav/Submenu'; -import SubmenuItem from 'Components/Nav/SubmenuItem'; +import SidebarItem from 'components/Nav/SidebarItem'; +import NavSeparator from 'components/Nav/NavSeperator'; +import Submenu from 'components/Nav/Submenu'; +import SubmenuItem from 'components/Nav/SubmenuItem'; import { updateNavChange } from '../../../actions/nav'; @@ -137,7 +137,7 @@ Sidebar.propTypes = { updateNavChange: PropTypes.func.isRequired, activeItem: PropTypes.string.isRequired, activeSubItem: PropTypes.string.isRequired, - sessionUser: PropTypes.object.isRequired + sessionUser: PropTypes.object }; const mapStateToProps = (state) => ({ diff --git a/src/client/Components/Nav/Sidebar/style.sass b/src/client/components/Nav/Sidebar/style.sass similarity index 100% rename from src/client/Components/Nav/Sidebar/style.sass rename to src/client/components/Nav/Sidebar/style.sass diff --git a/src/client/Components/Nav/SidebarItem/index.jsx b/src/client/components/Nav/SidebarItem/index.jsx similarity index 100% rename from src/client/Components/Nav/SidebarItem/index.jsx rename to src/client/components/Nav/SidebarItem/index.jsx diff --git a/src/client/Components/Nav/SidebarItem/style.sass b/src/client/components/Nav/SidebarItem/style.sass similarity index 100% rename from src/client/Components/Nav/SidebarItem/style.sass rename to src/client/components/Nav/SidebarItem/style.sass diff --git a/src/client/Components/Nav/Submenu/index.jsx b/src/client/components/Nav/Submenu/index.jsx similarity index 100% rename from src/client/Components/Nav/Submenu/index.jsx rename to src/client/components/Nav/Submenu/index.jsx diff --git a/src/client/Components/Nav/Submenu/style.sass b/src/client/components/Nav/Submenu/style.sass similarity index 100% rename from src/client/Components/Nav/Submenu/style.sass rename to src/client/components/Nav/Submenu/style.sass diff --git a/src/client/Components/Nav/SubmenuItem/index.jsx b/src/client/components/Nav/SubmenuItem/index.jsx similarity index 100% rename from src/client/Components/Nav/SubmenuItem/index.jsx rename to src/client/components/Nav/SubmenuItem/index.jsx diff --git a/src/sass/app.sass b/src/sass/app.sass index 8b881d17c..9933b8f2c 100644 --- a/src/sass/app.sass +++ b/src/sass/app.sass @@ -155,9 +155,9 @@ input[type="file"], input[type="checkbox"], input[type="radio"], select @import "partials/topnav" //@import "partials/sidebar" @import "partials/sidebarBottomPanel" -@import "../client/Components/Nav/Sidebar/style" -@import "../client/Components/Nav/SidebarItem/style" -@import "../client/Components/Nav/Submenu/style" +@import "../client/components/Nav/Sidebar/style" +@import "../client/components/Nav/SidebarItem/style" +@import "../client/components/Nav/Submenu/style" @import "partials/offcanvas" @import "partials/messages" @import "partials/settings" diff --git a/webpack.config.dist.js b/webpack.config.dist.js index fb2b900b0..fca0f7303 100644 --- a/webpack.config.dist.js +++ b/webpack.config.dist.js @@ -77,7 +77,7 @@ module.exports = { snackbar: 'plugins/snackbar', sass: path.resolve(__dirname, 'src/sass'), - Components: path.resolve(__dirname, 'src/client/Components') + components: path.resolve(__dirname, 'src/client/components') } }, externals: { diff --git a/webpack.config.js b/webpack.config.js index c14959201..fa0983bb2 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -77,7 +77,7 @@ module.exports = { snackbar: 'plugins/snackbar', sass: path.resolve(__dirname, 'src/sass'), - Components: path.resolve(__dirname, 'src/client/Components') + components: path.resolve(__dirname, 'src/client/components') }, extensions: ['.js', '.jsx'] }, From 8c6bcac52cf539b32125cbed27d8c0ee3d0a9ad1 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Thu, 17 Jan 2019 02:29:05 -0500 Subject: [PATCH 13/68] chore(react): updates --- package.json | 1 + src/client/actions/settings.js | 5 + src/client/actions/types.js | 6 +- src/client/api/index.js | 14 + src/client/app.jsx | 7 +- .../components/Settings/General/index.jsx | 75 +++++ .../Settings/InputWithSave/index.jsx | 61 ++++ .../components/Settings/SettingItem/index.jsx | 54 ++++ .../Settings/SingleSelect/index.jsx | 77 +++++ src/client/reducers/index.js | 2 + .../reducers/settings/generalReducer.js | 15 + src/client/reducers/settings/index.js | 27 ++ src/client/renderer.jsx | 19 ++ src/client/sagas/index.js | 3 +- src/client/sagas/settings/generalSaga.js | 0 src/client/sagas/settings/index.js | 42 +++ src/controllers/api/v1/settings.js | 13 +- src/helpers/hbs/helpers.js | 4 + src/helpers/viewdata/index.js | 1 - .../js/angularjs/controllers/settings.js | 2 +- src/public/js/pages/pageloader.js | 3 +- src/views/layout/main.hbs | 5 + src/views/settings.hbs | 295 +++++++++--------- webpack.config.dist.js | 4 +- webpack.config.js | 4 +- yarn.lock | 5 + 26 files changed, 586 insertions(+), 158 deletions(-) create mode 100644 src/client/actions/settings.js create mode 100644 src/client/api/index.js create mode 100644 src/client/components/Settings/General/index.jsx create mode 100644 src/client/components/Settings/InputWithSave/index.jsx create mode 100644 src/client/components/Settings/SettingItem/index.jsx create mode 100644 src/client/components/Settings/SingleSelect/index.jsx create mode 100644 src/client/reducers/settings/generalReducer.js create mode 100644 src/client/reducers/settings/index.js create mode 100644 src/client/renderer.jsx create mode 100644 src/client/sagas/settings/generalSaga.js create mode 100644 src/client/sagas/settings/index.js diff --git a/package.json b/package.json index a7262dc24..4582b1405 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "grunt-shell": "2.1.0", "handlebars": "4.0.11", "imap": "0.8.19", + "immutable": "4.0.0-rc.12", "imports-loader": "0.8.0", "ip-address": "5.8.9", "js-string-escape": "1.0.1", diff --git a/src/client/actions/settings.js b/src/client/actions/settings.js new file mode 100644 index 000000000..964be1231 --- /dev/null +++ b/src/client/actions/settings.js @@ -0,0 +1,5 @@ +import { createAction } from 'redux-actions'; +import { FETCH_SETTINGS, UPDATE_SETTING } from './types'; + +export const fetchSettings = createAction(FETCH_SETTINGS.ACTION); +export const updateSetting = createAction(UPDATE_SETTING.ACTION, (input) => ({name: input.name, value: input.value, stateName: input.stateName})); \ No newline at end of file diff --git a/src/client/actions/types.js b/src/client/actions/types.js index e8b3bda4a..1fb50b87b 100644 --- a/src/client/actions/types.js +++ b/src/client/actions/types.js @@ -2,4 +2,8 @@ import { defineAction } from 'redux-define'; import { ERROR, SUCCESS } from './stateConstants'; // Common Nav Change -export const NAV_CHANGE = defineAction('NAV_CHANGE'); \ No newline at end of file +export const NAV_CHANGE = defineAction('NAV_CHANGE'); + +// Settings +export const FETCH_SETTINGS = defineAction('FETCH_SETTINGS', [SUCCESS, ERROR]); +export const UPDATE_SETTING = defineAction('UPDATE_SETTING', [SUCCESS, ERROR]); \ No newline at end of file diff --git a/src/client/api/index.js b/src/client/api/index.js new file mode 100644 index 000000000..43fd48ac9 --- /dev/null +++ b/src/client/api/index.js @@ -0,0 +1,14 @@ +import axios from 'axios'; + +let api = {}; + +api.settings = {}; + +api.settings.update = function({name, value}) { + return axios.put('/api/v1/settings', {name, value}) + .then((res) => { + return res.data; + }); +}; + +export default api; \ No newline at end of file diff --git a/src/client/app.jsx b/src/client/app.jsx index 23440ab4d..1d5bdb22c 100644 --- a/src/client/app.jsx +++ b/src/client/app.jsx @@ -10,6 +10,7 @@ import IndexSagas from './sagas'; const sagaMiddleware = createSagaMiddleware(); import Sidebar from './components/Nav/Sidebar/index.jsx'; +import renderer from './renderer'; /*eslint-disable */ const composeSetup = process.env.NODE_ENV !== 'production' && typeof window === 'object' && @@ -37,4 +38,8 @@ const sidebarWithProvider = ( ReactDOM.render( sidebarWithProvider, document.getElementById('side-nav') -); \ No newline at end of file +); + +window.react.renderer = renderer; + +renderer(store); \ No newline at end of file diff --git a/src/client/components/Settings/General/index.jsx b/src/client/components/Settings/General/index.jsx new file mode 100644 index 000000000..fe25848da --- /dev/null +++ b/src/client/components/Settings/General/index.jsx @@ -0,0 +1,75 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import moment from 'moment-timezone'; +import { fetchSettings } from 'actions/settings'; + +import SettingItem from 'components/Settings/SettingItem'; + +import InputWithSave from 'components/Settings/InputWithSave'; +import SingleSelect from 'components/Settings/SingleSelect'; + +class GeneralSettings extends React.Component { + constructor(props) { + super(props); + this.state = { + viewData: window.trudesk.viewdata + }; + } + + componentDidMount() { + this.props.fetchSettings(); + } + + getSettingsValue(name) { + return ((this.props.settings.getIn(['settings', name, 'value'])) ? this.props.settings.getIn(['settings', name, 'value']) : '' ); + } + + getTimezones() { + return moment.tz.names().map(function(name) { + const year = new Date().getUTCFullYear(); + const timezoneAtBeginningOfyear = moment.tz(year + '-01-01', name); + return { + utc: timezoneAtBeginningOfyear.utcOffset(), + label: '(GMT' + timezoneAtBeginningOfyear.format('Z') + ') ' + name, + value: name + }; + }).sort(function(a, b) { return a.utc - b.utc; }); + } + + render() { + const { active } = this.props; + + const SiteTitle = ( + + ); + + const SiteUrl = ( + + ); + + let Timezone = ( + + ); + + return ( +
                + Title of site. Used as page title. default: Trudesk
                } component={SiteTitle} /> + Publicly accessible URL of this site. ex: {this.state.viewData.hosturl}
              } component={SiteUrl} /> + +
              + ); + } +} + +GeneralSettings.propTypes = { + active: PropTypes.bool, + fetchSettings: PropTypes.func.isRequired, + settings: PropTypes.object.isRequired +}; + +const mapStateToProps = (state) => ({ + settings: state.settings.settings +}); + +export default connect(mapStateToProps, { fetchSettings })(GeneralSettings); \ No newline at end of file diff --git a/src/client/components/Settings/InputWithSave/index.jsx b/src/client/components/Settings/InputWithSave/index.jsx new file mode 100644 index 000000000..b10cd1ca9 --- /dev/null +++ b/src/client/components/Settings/InputWithSave/index.jsx @@ -0,0 +1,61 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; + +import helpers from 'lib/helpers'; + +import { updateSetting } from 'actions/settings'; + +class InputWithSave extends React.Component { + constructor(props) { + super(props); + this.state = { + value: '' + }; + } + + componentDidMount() { + helpers.UI.inputs(); + } + + static getDerivedStateFromProps(props, state) { + if (!state.value) { + state.value = (props.value) ? props.value : ''; + return state; + } + + return null; + } + + onSaveClicked() { + this.props.updateSetting({name: this.props.settingName, value: this.state.value, stateName: this.props.stateName}); + } + + updateValue(evt) { + this.setState({ + value: evt.target.value + }); + } + + render() { + return ( +
              +
              + this.updateValue(evt)} /> +
              +
              + +
              +
              + ); + } +} + +InputWithSave.propTypes = { + updateSetting: PropTypes.func.isRequired, + settingName: PropTypes.string.isRequired, + stateName: PropTypes.string.isRequired, + value: PropTypes.string +}; + +export default connect(null, { updateSetting })(InputWithSave); \ No newline at end of file diff --git a/src/client/components/Settings/SettingItem/index.jsx b/src/client/components/Settings/SettingItem/index.jsx new file mode 100644 index 000000000..32da10819 --- /dev/null +++ b/src/client/components/Settings/SettingItem/index.jsx @@ -0,0 +1,54 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +class SettingItem extends React.Component { + constructor(props) { + super(props); + } + + render() { + const { title, subTitle, component, tooltip } = this.props; + return ( +
              +
              +
              +
              + { title } + { tooltip && + error + } +
              +
              + { subTitle } +
              +
              +
              +
              + { component } +
              +
              +
              +
              + ); + } +} + +SettingItem.propTypes = { + title: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.object + ]).isRequired, + subTitle: PropTypes.oneOfType([ + PropTypes.string, + PropTypes.object + ]), + tootip: PropTypes.string +}; + +export default SettingItem; \ No newline at end of file diff --git a/src/client/components/Settings/SingleSelect/index.jsx b/src/client/components/Settings/SingleSelect/index.jsx new file mode 100644 index 000000000..c98f2e68d --- /dev/null +++ b/src/client/components/Settings/SingleSelect/index.jsx @@ -0,0 +1,77 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import $ from 'jquery'; + +import helpers from 'lib/helpers'; + +import { updateSetting } from 'actions/settings'; + +class SingleSelect extends React.Component { + constructor(props) { + super(props); + this.state = { + value: this.props.value + }; + } + + componentDidMount() { + helpers.UI.selectize(); + const $select = $(this.select); + + $select.on('change', (e) => this.updateValue(e)); + } + + componentWillUnmount() { + const selectize = this.select.selectize; + + if (selectize) + selectize.destroy(); + } + + static getDerivedStateFromProps(props, state) { + if (props.value !== state.value) { + return { + value: props.value + }; + } + + return null; + } + + valueChanged(value) { + this.props.updateSetting({name: this.props.settingName, value: value, stateName: this.props.stateName}); + } + + updateValue(evt) { + if (evt.target.value && (evt.target.value !== this.state.value)) + this.valueChanged(evt.target.value); + } + + render() { + const { items } = this.props; + + if (this.select && this.select.selectize) { + this.select.selectize.addItem(this.state.value, true); + } + return ( +
              + +
              + ); + } +} + +SingleSelect.propTypes = { + updateSetting: PropTypes.func.isRequired, + settingName: PropTypes.string.isRequired, + stateName: PropTypes.string.isRequired, + value: PropTypes.string, + items: PropTypes.arrayOf(PropTypes.object).isRequired +}; + +export default connect(null, { updateSetting })(SingleSelect); \ No newline at end of file diff --git a/src/client/reducers/index.js b/src/client/reducers/index.js index d982213cd..845773d78 100644 --- a/src/client/reducers/index.js +++ b/src/client/reducers/index.js @@ -2,9 +2,11 @@ import { combineReducers } from 'redux'; import { reducer as form } from 'redux-form'; import sidebar from './sidebarReducer'; +import settings from './settings'; const IndexReducer = combineReducers({ sidebar, + settings, form }); diff --git a/src/client/reducers/settings/generalReducer.js b/src/client/reducers/settings/generalReducer.js new file mode 100644 index 000000000..637264e18 --- /dev/null +++ b/src/client/reducers/settings/generalReducer.js @@ -0,0 +1,15 @@ +import { handleActions } from 'redux-actions'; +import { NAV_CHANGE } from '../../actions/types'; + +const initialState = { + siteTitle: '' +}; + +const generalReducer = handleActions({ + [NAV_CHANGE]: (state, action) => ({ + + }) + +}, initialState); + +export default generalReducer; \ No newline at end of file diff --git a/src/client/reducers/settings/index.js b/src/client/reducers/settings/index.js new file mode 100644 index 000000000..2976cd924 --- /dev/null +++ b/src/client/reducers/settings/index.js @@ -0,0 +1,27 @@ +import { find } from 'lodash'; +import { fromJS, Map } from 'immutable'; +import { handleActions } from 'redux-actions'; +import {FETCH_SETTINGS, UPDATE_SETTING} from 'actions/types'; + +import helpers from 'lib/helpers'; + +const initialState = { + settings: Map({}) +}; + +const settingsReducer = handleActions({ + [FETCH_SETTINGS.SUCCESS]: (state, action) => ({ + settings: fromJS(action.response.settings.data) + }), + + [UPDATE_SETTING.SUCCESS]: (state, action) => { + helpers.UI.showSnackbar('Setting Saved Successfully', false); + const updatedSetting = find(action.response.updatedSettings, { name: action.payload.name }); + return { + settings: state.settings.setIn(['settings', action.payload.stateName], updatedSetting) + }; + } + +}, initialState); + +export default settingsReducer; \ No newline at end of file diff --git a/src/client/renderer.jsx b/src/client/renderer.jsx new file mode 100644 index 000000000..917a53f5c --- /dev/null +++ b/src/client/renderer.jsx @@ -0,0 +1,19 @@ +import {Provider} from 'react-redux'; +import GeneralSettings from 'components/Settings/General'; +import ReactDOM from 'react-dom'; +import React from 'react'; + +export default function(store) { + if (document.getElementById('settings-general')) { + const generalSettingsWithProvider = ( + + + + ); + + ReactDOM.render( + generalSettingsWithProvider, + document.getElementById('settings-general') + ); + } +} \ No newline at end of file diff --git a/src/client/sagas/index.js b/src/client/sagas/index.js index a793ea921..2eeb311d3 100644 --- a/src/client/sagas/index.js +++ b/src/client/sagas/index.js @@ -1,7 +1,8 @@ import { all } from 'redux-saga/effects'; +import SettingsSaga from './settings'; export default function* IndexSagas () { yield all([ - + SettingsSaga() ]); } \ No newline at end of file diff --git a/src/client/sagas/settings/generalSaga.js b/src/client/sagas/settings/generalSaga.js new file mode 100644 index 000000000..e69de29bb diff --git a/src/client/sagas/settings/index.js b/src/client/sagas/settings/index.js new file mode 100644 index 000000000..216a53df4 --- /dev/null +++ b/src/client/sagas/settings/index.js @@ -0,0 +1,42 @@ +import { call, put, takeLatest } from 'redux-saga/effects'; +import { delay } from 'redux-saga'; +import axios from 'axios'; + +import api from '../../api'; +import { + FETCH_SETTINGS, + UPDATE_SETTING +} from 'actions/types'; + +function fetchSettings() { + return axios.get('/api/v1/settings') + .then(res => { + return res.data; + }).catch((error) => { throw error.response; }); +} + +function* fetchFlow({payload}) { + try { + const response = yield call(fetchSettings, payload); + yield put({ type: FETCH_SETTINGS.SUCCESS, response }); + } catch (error) { + // if (error.status === (401 || 403)) + // yield put({type: LOGOUT}); + yield put({ type: FETCH_SETTINGS.ERROR, error}); + } +} + +function* updateSetting({payload}) { + try { + const response = yield call(api.settings.update, payload); + yield put({ type: UPDATE_SETTING.SUCCESS, response, payload }); + // yield put({ type: FETCH_SETTINGS.ACTION }); + } catch (error) { + yield put({ type: UPDATE_SETTING.ERROR, error }); + } +} + +export default function* settingsWatcher() { + yield takeLatest(FETCH_SETTINGS.ACTION, fetchFlow); + yield takeLatest(UPDATE_SETTING.ACTION, updateSetting); +} \ No newline at end of file diff --git a/src/controllers/api/v1/settings.js b/src/controllers/api/v1/settings.js index 7e1c639a9..30fdff7fb 100644 --- a/src/controllers/api/v1/settings.js +++ b/src/controllers/api/v1/settings.js @@ -71,6 +71,9 @@ apiSettings.updateSetting = function(req, res) { if (!_.isArray(postData)) postData = [postData]; + var updatedSettings = []; + + // async.each(postData, function(item, callback) { SettingsSchema.getSettingByName(item.name, function(err, s) { if (err) return callback(err.message); @@ -87,14 +90,18 @@ apiSettings.updateSetting = function(req, res) { s.value = item.value; - s.save(function(err) { + s.save(function(err, savedSetting) { if (err) return callback(err.message); - callback(); + updatedSettings.push(savedSetting); + + return callback(); }); }); }, function(err) { - return defaultApiResponse(err, res); + if (err) return res.status(400).json({success: false, error: err}); + + return res.json({success: true, updatedSettings: updatedSettings}); }); }; diff --git a/src/helpers/hbs/helpers.js b/src/helpers/hbs/helpers.js index 2fd819279..ddd8dbac6 100644 --- a/src/helpers/hbs/helpers.js +++ b/src/helpers/hbs/helpers.js @@ -37,6 +37,10 @@ var helpers = { return a.toString() + b.toString(); }, + stringify: function(s) { + return JSON.stringify(s); + }, + contains: function (str, pattern, options) { if (str.indexOf(pattern) !== -1) return options.fn(this); diff --git a/src/helpers/viewdata/index.js b/src/helpers/viewdata/index.js index 16c4f3534..5f26001a4 100644 --- a/src/helpers/viewdata/index.js +++ b/src/helpers/viewdata/index.js @@ -309,7 +309,6 @@ viewController.getData = function(request, cb) { ], function(err) { if (err) winston.warn('Error: ' + err); - return cb(viewdata); }); diff --git a/src/public/js/angularjs/controllers/settings.js b/src/public/js/angularjs/controllers/settings.js index 71fea12d6..5985004b3 100644 --- a/src/public/js/angularjs/controllers/settings.js +++ b/src/public/js/angularjs/controllers/settings.js @@ -207,7 +207,7 @@ define([ $timeout(function() { // Call in next cycle - Timezones generated dynamically - helpers.UI.selectize($('select#tz').parent()); + // helpers.UI.selectize($('select#tz').parent()); }); var $privacyPolicy = $('#privacyPolicy'); diff --git a/src/public/js/pages/pageloader.js b/src/public/js/pages/pageloader.js index 156bcd27e..25a95601b 100644 --- a/src/public/js/pages/pageloader.js +++ b/src/public/js/pages/pageloader.js @@ -18,7 +18,8 @@ define('pages/pageloader', ['async', 'jquery'], function(async, $) { var pageLoader = {}; pageLoader.init = function(callback) { - // window.react.updateSidebar({activeItem: $('#__sidebar_route').text(), activeSubItem: $('#__sidebar_sub_route').text(), sessionUser: window.trudeskSessionService.getUser()}); + // Called to render component on ajax page load + window.react.renderer(window.react.redux.store); window.react.redux.store.dispatch({ type: 'NAV_CHANGE', payload: { diff --git a/src/views/layout/main.hbs b/src/views/layout/main.hbs index 695ebe17e..c8e0ea60b 100644 --- a/src/views/layout/main.hbs +++ b/src/views/layout/main.hbs @@ -163,6 +163,11 @@ if (screen.width <= 800) { document.location = '/mobile'; } + + // TODO: Temp. Until we pass render fully on server. + if (!window.trudesk) + window.trudesk = {}; + window.trudesk.viewdata = {{{stringify data.common}}}; diff --git a/src/views/settings.hbs b/src/views/settings.hbs index 3cfd67baa..9f53dd5a7 100644 --- a/src/views/settings.hbs +++ b/src/views/settings.hbs @@ -103,138 +103,160 @@
              -
              -
              -
              -
              -
              Site Title
              -
              - Title of site. Used as page title. default: Trudesk -
              -
              -
              -
              - -
              -
              - -
              -
              -
              -
              +
              + + + + + + + + + + + + + + + + + + + -
              -
              -
              -
              Site Url
              -
              - Publicly accessible URL of this site. ex: {{data.common.hosturl}} -
              -
              -
              -
              - -
              -
              - -
              -
              -
              -
              + + + + + + + + + + + + + + + + + + -
              -
              -
              -
              Time Zone - error -
              -
              - Set the local timezone for date display -
              -
              -
              -
              - -
              -
              -
              -
              + + + + + + + + + + + + + + + + + + + + + + + + -
              -
              -
              -
              Time & Date Fromat
              -
              - Moment.js Format Options -
              -
              -
              -
              -
              -
              -
              -
              -
              -
              -
              Time Format
              -

              Set the format for time.

              -
              -
              -
              - -
              -
              - -
              -
              -
              -
              -
              -
              Sort Date Format
              -

              Set the format for short dates.

              -
              -
              -
              - -
              -
              - -
              -
              -
              -
              -
              -
              Long Date Format
              -

              Set the format for long dates.

              -
              -
              -
              - -
              -
              - -
              -
              -
              -
              -
              -
              -
              -
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + @@ -242,35 +264,14 @@ - + - -
              -
              -
              -
              Allow User Registration
              -
              - Allow users to create accounts on the login screen. -
              -
              -
              - -
              - -
              -
              -
              -
              -
              +
              diff --git a/webpack.config.dist.js b/webpack.config.dist.js index fca0f7303..6ecad6122 100644 --- a/webpack.config.dist.js +++ b/webpack.config.dist.js @@ -77,7 +77,9 @@ module.exports = { snackbar: 'plugins/snackbar', sass: path.resolve(__dirname, 'src/sass'), - components: path.resolve(__dirname, 'src/client/components') + components: path.resolve(__dirname, 'src/client/components'), + actions: path.resolve(__dirname, 'src/client/actions'), + lib: path.resolve(__dirname, 'src/public/js/modules') } }, externals: { diff --git a/webpack.config.js b/webpack.config.js index fa0983bb2..ec48982fa 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -77,7 +77,9 @@ module.exports = { snackbar: 'plugins/snackbar', sass: path.resolve(__dirname, 'src/sass'), - components: path.resolve(__dirname, 'src/client/components') + components: path.resolve(__dirname, 'src/client/components'), + actions: path.resolve(__dirname, 'src/client/actions'), + lib: path.resolve(__dirname, 'src/public/js/modules') }, extensions: ['.js', '.jsx'] }, diff --git a/yarn.lock b/yarn.lock index 3baa88ee7..c1ca46fd4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6026,6 +6026,11 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= +immutable@4.0.0-rc.12: + version "4.0.0-rc.12" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" + integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" From e02ddb8c6655140576d669ccc30755a222654183 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Fri, 18 Jan 2019 13:56:16 -0500 Subject: [PATCH 14/68] chore(webpack): update to webpack4 --- .babelrc | 2 +- package.json | 31 +- webpack.config.dist.js | 140 --- webpack.config.js | 82 +- yarn.lock | 2542 ++++++++++++++++++---------------------- 5 files changed, 1241 insertions(+), 1556 deletions(-) delete mode 100644 webpack.config.dist.js diff --git a/.babelrc b/.babelrc index 68e7f1a6a..43249f435 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,3 @@ { - "presets": ["react", "env"] + "presets": ["@babel/react", "@babel/env"] } \ No newline at end of file diff --git a/package.json b/package.json index 4582b1405..50a63c28c 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,12 @@ "scripts": { "start": "node ./app", "build": "grunt build", - "heroku-postbuild": "npm run build", "test": "mocha --recursive", "coverage": "istanbul cover ./node_modules/mocha/bin/_mocha -- --recursive", "codacy": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- --recursive -R spec && cat ./coverage/lcov.info | cross-env CODACY_PROJECT_TOKEN=65070aca43cc4fba96eaabd4033c9528 codacy-coverage && rm -rf ./coverage", "webpackwatch": "webpack --config webpack.config.js --watch", "webpackdev": "webpack --config webpack.config.js", - "webpackdist": "webpack --config webpack.config.dist.js", + "webpackdist": "cross-env NODE_ENV=production && webpack --env.production -p --config webpack.config.js", "snyk-protect": "snyk protect" }, "dependencies": { @@ -34,16 +33,12 @@ "connect-mongo": "2.0.3", "cookie": "0.3.1", "cookie-parser": "1.4.3", - "css-loader": "0.28.9", "csv": "3.1.0", "dive": "0.5.0", "email-templates": "4.0.3", - "exports-loader": "0.7.0", - "expose-loader": "0.7.5", "express": "4.16.3", "express-hbs": "1.0.4", "express-session": "1.15.6", - "extract-text-webpack-plugin": "3.0.2", "fast-csv": "2.4.1", "file-tail": "0.3.0", "fs-extra": "7.0.1", @@ -63,6 +58,7 @@ "mailparser": "2.3.3", "marked": "0.5.0", "matchdep": "2.0.0", + "memoize-one": "5.0.0", "mkdirp": "0.5.1", "moment": "2.22.2", "moment-duration-format": "2.2.2", @@ -93,34 +89,34 @@ "request": "2.88.0", "rimraf": "2.6.2", "sanitize-html": "1.18.4", - "sass-loader": "7.1.0", "script-loader": "0.7.2", "serve-favicon": "2.5.0", "snyk": "^1.92.6", "socket.io": "2.1.1", "socket.io-client": "2.1.1", - "style-loader": "0.22.1", "svg-captcha": "1.3.11", "tar": "4.4.6", "thirty-two": "1.0.2", - "uglify-js": "3.4.7", + "uglify-js": "3.4.9", "unzip": "0.1.11", "util": "0.11.0", - "webpack": "3.11.0", + "webpack": "4.28.4", "winston": "2.4.4" }, "devDependencies": { + "@babel/core": "7.2.2", + "@babel/preset-env": "7.2.3", + "@babel/preset-react": "7.0.0", "@commitlint/cli": "7.3.2", "@commitlint/config-conventional": "7.3.1", "@semantic-release/changelog": "3.0.2", "@semantic-release/git": "7.0.8", "babel-core": "6.26.3", "babel-eslint": "10.0.1", - "babel-loader": "7.1.4", - "babel-preset-env": "1.6.1", - "babel-preset-react": "6.24.1", + "babel-loader": "8.0.5", "chai": "*", "codacy-coverage": "^3.0.0", + "css-loader": "2.1.0", "cross-env": "^5.2.0", "eslint": "5.4.0", "eslint-config-angular": "0.5.0", @@ -129,6 +125,8 @@ "eslint-plugin-import": "2.14.0", "eslint-plugin-node": "7.0.1", "eslint-plugin-react": "7.11.1", + "exports-loader": "0.7.0", + "expose-loader": "0.7.5", "grunt-contrib-watch": "1.1.0", "grunt-express-server": "0.5.4", "grunt-htmlhint": "0.9.13", @@ -136,11 +134,16 @@ "husky": "1.3.1", "istanbul": "0.4.5", "lorem-ipsum": "1.0.5", + "mini-css-extract-plugin": "0.5.0", "mocha": "5.2.0", "mocha-lcov-reporter": "1.3.0", + "sass-loader": "7.1.0", "semantic-release": "15.9.16", + "style-loader": "0.22.1", "superagent": "3.8.3", - "supertest": "3.1.0" + "supertest": "3.1.0", + "terser-webpack-plugin": "1.2.1", + "webpack-cli": "3.2.1" }, "release": { "prepare": [ diff --git a/webpack.config.dist.js b/webpack.config.dist.js deleted file mode 100644 index 6ecad6122..000000000 --- a/webpack.config.dist.js +++ /dev/null @@ -1,140 +0,0 @@ -var path = require('path'); -var webpack = require('webpack'); -var ExtractTextPlugin = require('extract-text-webpack-plugin'); - -module.exports = { - //context: path.resolve(__dirname, 'public/js'), - target: 'web', - entry : { - vendor: ['jquery', 'jquery_custom', 'angular', 'angularRoute', 'angularCookies', 'angularSanitize', 'datatables', 'dt_responsive', 'dt_grouping', 'dt_ipaddress', 'modernizr', 'underscore'], - truRequire: 'expose-loader?truRequire!' + path.resolve(__dirname, './src/public/js/truRequire'), - 'trudesk.min': path.resolve(__dirname, 'src/public/js/app.js') - }, - output: { - filename: '[name].js', - path: path.resolve(__dirname, 'public/js'), - publicPath: '/js/' - }, - resolve: { - modules: [path.resolve(__dirname, 'src/public/js/'), 'node_modules'], - alias: { - //server side - roles: path.resolve(__dirname, 'src/permissions/roles'), - - //client side - jquery: 'vendor/jquery/jquery', - jquery_scrollTo:'vendor/jquery/jquery.scrollTo.min', - jscookie: 'vendor/jscookie/js.cookie.js', - easing: 'vendor/jquery/jquery.easing', - angular: 'vendor/angular/angular.min', - angularRoute: 'vendor/angular/angular-route.min', - angularCookies: 'vendor/angular/angular-cookies.min', - angularSanitize:'vendor/angular/angular-sanitize.min', - moment: 'vendor/moment/moment', - moment_timezone:'vendor/moment/moment-timezone-with-data', - uikit: 'vendor/uikit/js/uikit_combined.min', - modernizr: 'vendor/modernizr/modernizr', - fastclick: 'vendor/fastclick/fastclick', - placeholder: 'vendor/placeholder/placeholder', - underscore: 'vendor/underscore/underscore', - history: 'vendor/history/jquery.history', - app: 'app', - - async: 'vendor/async/async', - jquery_custom: 'plugins/jquery.custom', - datatables: 'vendor/datatables/jquery.dataTables', - dt_responsive: 'vendor/datatables/dataTables.responsive', - dt_grouping: 'vendor/datatables/dataTables.grouping', - dt_scroller: 'vendor/datatables/dataTables.scroller', - dt_ipaddress: 'vendor/datatables/dataTables.ipaddress', - easypiechart: 'vendor/easypiechart/easypiechart', - chosen: 'vendor/chosen/chosen.jquery.min', - autogrow: 'plugins/autogrow', - pace: 'vendor/pace/pace.min', - tomarkdown: 'vendor/tomarkdown/tomarkdown', - colorpicker: 'vendor/simplecolorpicker/jquery.simplecolorpicker', - datepicker: 'vendor/datepicker/foundation-datepicker', - d3: 'vendor/d3/d3.min', - c3: 'vendor/c3/c3', - metricsgraphics:'vendor/metricsgraphics/metricsgraphics.min', - d3pie: 'vendor/d3pie/d3pie.min', - peity: 'vendor/peity/jquery.peity.min', - countup: 'vendor/countup/countUp.min', - velocity: 'vendor/velocity/velocity.min', - selectize: 'vendor/selectize/selectize', - multiselect: 'vendor/multiselect/js/jquery.multi-select', - waves: 'vendor/waves/waves', - isinview: 'plugins/jquery.isinview', - jquery_docsize: 'plugins/jquery.documentsize', - idletimer: 'plugins/jquery.idletimer.js', - jquery_steps: 'plugins/jquery.steps', - jquery_actual: 'plugins/jquery.actual', - formvalidator: 'vendor/formvalidator/jquery.form-validator', - qrcode: 'vendor/qrcode/jquery.qrcode.min', - tether: 'vendor/tether/tether.min', - shepherd: 'vendor/shepherd/js/shepherd.min', - easymde: 'vendor/easymde/dist/easymde.min', - snackbar: 'plugins/snackbar', - - sass: path.resolve(__dirname, 'src/sass'), - components: path.resolve(__dirname, 'src/client/components'), - actions: path.resolve(__dirname, 'src/client/actions'), - lib: path.resolve(__dirname, 'src/public/js/modules') - } - }, - externals: { - //These are bunbled already - jsdom: 'jsdom', - canvas: 'canvas' - }, - module: { - rules: [ - { test: /angular\.min\.js/, use: 'exports-loader?angular' }, - { test: /uikit_combined\.min\.js/, use: 'exports-loader?UIkit' }, - { test: /\.sass$/, exclude: path.resolve(__dirname, 'node_modules'), use: ExtractTextPlugin.extract({ - fallback: 'style-loader', - use: [{loader: 'css-loader', options: {minimize: true}}, 'sass-loader'], - publicPath: '/public/css' - })}, - { test: /\.jsx$/, exclude: /node_modules/, loader: "babel-loader?cacheDirectory" } - ] - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('production') - }), - new webpack.ProvidePlugin({ - $: 'jquery', - jQuery: 'jquery', - Cookies: 'jscookie', - Tether: 'tether', - 'window.Tether': 'tether', - 'window.jQuery': 'jquery', - 'window.$': 'jquery', - Modernizr: 'modernizr', - 'window.Modernizr': 'modernizr', - moment: 'moment', - 'window.moment': 'moment', - setImmediate: 'async' - }), - new webpack.optimize.CommonsChunkPlugin({ - name: ['vendor'], - minChunks: Infinity - }), - new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), - new webpack.optimize.OccurrenceOrderPlugin(), - new webpack.optimize.UglifyJsPlugin({ - mangle: false, - sourceMap:false - }), - new ExtractTextPlugin({ - filename: '../css/app.min.css', - allChunks: true - }) - ], - performance: { - hints: 'warning', - maxEntrypointSize: 400000, - maxAssetSize: 1000000 - } -}; \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index ec48982fa..25282f177 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,14 +1,15 @@ var path = require('path'); var webpack = require('webpack'); -var ExtractTextPlugin = require('extract-text-webpack-plugin'); +var MiniCssExtractPlugin = require('mini-css-extract-plugin'); +var TerserPlugin = require('terser-webpack-plugin'); module.exports = { - //context: path.resolve(__dirname, 'public/js'), + mode: (process.env.NODE_ENV === 'production' ? 'production' : 'development'), target: 'web', entry : { vendor: ['jquery', 'jquery_custom', 'angular', 'angularRoute', 'angularCookies', 'angularSanitize', 'datatables', 'dt_responsive', 'dt_grouping', 'dt_ipaddress', 'modernizr', 'underscore'], - truRequire: 'expose-loader?truRequire!' + path.resolve(__dirname, './src/public/js/truRequire'), - 'trudesk.min': path.resolve(__dirname, 'src/public/js/app.js') + 'trudesk.min': path.resolve(__dirname, 'src/public/js/app.js'), + truRequire: 'expose-loader?truRequire!' + path.resolve(__dirname, './src/public/js/truRequire') }, output: { filename: '[name].js', @@ -71,7 +72,7 @@ module.exports = { jquery_actual: 'plugins/jquery.actual', formvalidator: 'vendor/formvalidator/jquery.form-validator', qrcode: 'vendor/qrcode/jquery.qrcode.min', - tether: 'vendor/tether/tether', + tether: 'vendor/tether/tether.min', shepherd: 'vendor/shepherd/js/shepherd.min', easymde: 'vendor/easymde/dist/easymde.min', snackbar: 'plugins/snackbar', @@ -92,14 +93,60 @@ module.exports = { rules: [ { test: /angular\.min\.js/, use: 'exports-loader?angular' }, { test: /uikit_combined\.min\.js/, use: 'exports-loader?UIkit' }, - { test: /\.sass$/, exclude: path.resolve(__dirname, 'node_modules'), use: ExtractTextPlugin.extract({ - fallback: 'style-loader', - use: [{loader: 'css-loader', options: {minimize: false}}, 'sass-loader'], - publicPath: '/public/css' - })}, - { test: /\.jsx$/, exclude: /node_modules/, loader: 'babel-loader?cacheDirectory' } + { test: /\.sass$/, exclude: path.resolve(__dirname, 'node_modules'), + use:[ + { + loader: MiniCssExtractPlugin.loader, + options: { + publicPath: '/public/css' + } + }, + { + loader: 'css-loader', + options: { minimize: true } + }, + 'postcss-loader', + 'sass-loader' + ] + }, + { test: /\.jsx$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/react', '@babel/env'] + } + } + } ] }, + optimization: { + minimizer: [ + new TerserPlugin({ + parallel: true, + terserOptions: { + ecma: 6, + mangle: false + } + }) + ], + splitChunks: { + cacheGroups: { + vendor: { + name: 'vendor', + test: 'vendor', + chunks: 'initial', + enforce: true + }, + styles: { + name: 'styles', + test: /\.css$/, + chunks: 'all', + enforce: true + } + } + } + }, plugins: [ new webpack.ProvidePlugin({ $: 'jquery', @@ -115,20 +162,15 @@ module.exports = { 'window.moment': 'moment', setImmediate: 'async' }), - new webpack.optimize.CommonsChunkPlugin({ - name: ['vendor'], - minChunks: Infinity - }), new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), new webpack.optimize.OccurrenceOrderPlugin(), - new ExtractTextPlugin({ - filename: '../css/app.min.css', - allChunks: true + new MiniCssExtractPlugin({ + filename: 'app.min.css' }) ], performance: { hints: 'warning', - maxEntrypointSize: 10000000, - maxAssetSize: 80000000 + maxEntrypointSize: 400000, + maxAssetSize: 1000000 } }; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c1ca46fd4..5102e31ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,26 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/core@7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.2.tgz#07adba6dde27bb5ad8d8672f15fde3e08184a687" + integrity sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.2" + "@babel/template" "^7.2.2" + "@babel/traverse" "^7.2.2" + "@babel/types" "^7.2.2" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.2.tgz#18c816c70962640eab42fe8cae5f3947a5c65ccc" @@ -20,6 +40,55 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" + integrity sha512-ebJ2JM6NAKW0fQEqN8hOLxK84RbRz9OkUhGS/Xd5u56ejMfVbayJ4+LykERZCOUM6faa6Fp3SZNX3fcT16MKHw== + dependencies: + "@babel/types" "^7.0.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" @@ -36,6 +105,87 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" + integrity sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.2.3" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" @@ -43,6 +193,25 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.2.0.tgz#8335f3140f3144270dc63c4732a4f8b0a50b7a21" + integrity sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.2.0" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -57,6 +226,388 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.3.tgz#32f5df65744b70888d17872ec106b02434ba1489" integrity sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA== +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.2.0.tgz#88f5fec3e7ad019014c97f7ee3c992f0adbf7fb8" + integrity sha512-1L5mWLSvR76XYUQJXkd/EEQgjq8HHRP6lQuZTTg0VA4tTGPpGemmCdAfQIz1rzEuWAm+ecP8PyyEm30jC1eQCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" + integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" + integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" + integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" + integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz#e75269b4b7889ec3a332cd0d0c8cff8fed0dc6f3" + integrity sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" + integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" + integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" + integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz#461e21ad9478f1031dd5e276108d027f1b5240ba" + integrity sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.2.0.tgz#ca36b6561c4d3b45524f8efb6f0fbc9a0d1d622f" + integrity sha512-h/fZRel5wAfCqcKgq3OhbmYaReo7KkoJBpt8XnvpS7wqaNMqtw5xhxutzcm35iMUWucfAdT/nvGTsWln0JTg2Q== + dependencies: + "@babel/helper-builder-react-jsx" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/preset-env@7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.3.tgz#948c8df4d4609c99c7e0130169f052ea6a7a8933" + integrity sha512-AuHzW7a9rbv5WXmvGaPX7wADxFkZIqKlbBh1dmZUQp4iwiPpkE/Qnrji6SC4UQCQzvWY/cpHET29eUhXS9cLPw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.2.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.2.0" + "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/preset-react@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" + integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/runtime@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" @@ -64,7 +615,7 @@ dependencies: regenerator-runtime "^0.12.0" -"@babel/template@^7.1.0": +"@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== @@ -73,7 +624,7 @@ "@babel/parser" "^7.2.2" "@babel/types" "^7.2.2" -"@babel/traverse@^7.0.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2", "@babel/traverse@^7.2.3": version "7.2.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== @@ -88,7 +639,7 @@ globals "^11.1.0" lodash "^4.17.10" -"@babel/types@^7.0.0", "@babel/types@^7.2.2": +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.2.tgz#44e10fc24e33af524488b716cdaee5360ea8ed1e" integrity sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg== @@ -475,6 +1026,159 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" + integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== + +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== + +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== + +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" + integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== + dependencies: + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" + integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== + +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" + integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== + +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" + integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== + +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" + integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" + integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" + integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== + dependencies: + "@xtuc/long" "4.2.1" + +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" + integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== + +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" + integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" + integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" + integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" + integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" + integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" + "@xtuc/long" "4.2.1" + +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" + integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + "@xtuc/long" "4.2.1" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== + "@yarnpkg/lockfile@^1.0.2": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -506,12 +1210,12 @@ accepts@~1.3.4, accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - integrity sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ= +acorn-dynamic-import@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== dependencies: - acorn "^4.0.3" + acorn "^5.0.0" acorn-globals@^3.0.0: version "3.1.0" @@ -530,12 +1234,12 @@ acorn@^3.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^4.0.3, acorn@^4.0.4, acorn@~4.0.2: +acorn@^4.0.4, acorn@~4.0.2: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= -acorn@^5.0.0: +acorn@^5.0.0, acorn@^5.6.2: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -585,12 +1289,17 @@ aggregate-error@^2.0.0: clean-stack "^2.0.0" indent-string "^3.0.0" +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= -ajv@^5.0.0, ajv@^5.1.0: +ajv@^5.1.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= @@ -619,11 +1328,6 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - ambi@^2.2.0: version "2.5.0" resolved "https://registry.yarnpkg.com/ambi/-/ambi-2.5.0.tgz#7c8e372be48891157e7cea01cb6f9143d1f74220" @@ -950,563 +1654,143 @@ async@1.5, async@1.x, async@^1.4.0, async@~1.5, async@~1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@2.6.1, async@^2.0.0, async@^2.1.2, async@^2.4.1, async@^2.5.0, async@^2.6, async@^2.6.0, async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== - dependencies: - lodash "^4.17.10" - -async@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" - integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -auto-bind@^1.2.0, auto-bind@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.2.1.tgz#807f7910b0210db9eefe133f3492c28e89698b96" - integrity sha512-/W9yj1yKmBLwpexwAujeD9YHwYmRuWFGV8HWE7smQab797VeHa4/cnE2NFeDhA+E+5e/OGBI8763EhLjfZ/MXA== - -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.6.0, aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - -axios@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" - integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI= - dependencies: - follow-redirects "^1.3.0" - is-buffer "^1.1.5" - -axios@^0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d" - integrity sha1-uk+S8XFn37q0CYN4VFS5rBScPG0= - dependencies: - follow-redirects "^1.2.3" - is-buffer "^1.1.5" - -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@6.26.3, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-eslint@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" - integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - eslint-scope "3.7.1" - eslint-visitor-keys "^1.0.0" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" - integrity sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015" - integrity sha512-/hbyEvPzBJuGpk9o80R0ZyTej6heEOr59GoEUtn8qFKbnx4cJm9FWES6J/iv644sYgrtVw9JJQkjaLW/bqb5gw== - dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0= - -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= +async@2.6.1, async@^2.0.0, async@^2.1.2, async@^2.4.1, async@^2.5.0, async@^2.6, async@^2.6.0, async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" + lodash "^4.17.10" -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" +auto-bind@^1.2.0, auto-bind@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.2.1.tgz#807f7910b0210db9eefe133f3492c28e89698b96" + integrity sha512-/W9yj1yKmBLwpexwAujeD9YHwYmRuWFGV8HWE7smQab797VeHa4/cnE2NFeDhA+E+5e/OGBI8763EhLjfZ/MXA== -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= +aws4@^1.6.0, aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +axios@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" + integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI= dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" + follow-redirects "^1.3.0" + is-buffer "^1.1.5" -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= +axios@^0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d" + integrity sha1-uk+S8XFn37q0CYN4VFS5rBScPG0= dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" + follow-redirects "^1.2.3" + is-buffer "^1.1.5" -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988= +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" -babel-plugin-transform-react-display-name@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" - integrity sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE= +babel-core@6.26.3, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== dependencies: - babel-runtime "^6.22.0" + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" -babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" - integrity sha1-322AqdomEqEh5t3XVYvL7PBuY24= +babel-eslint@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed" + integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ== dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + eslint-scope "3.7.1" + eslint-visitor-keys "^1.0.0" -babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" - integrity sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY= +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" -babel-plugin-transform-react-jsx@^6.24.1: +babel-helpers@^6.24.1: version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - integrity sha1-hAoCjn30YN/DotKfDA2R9jduZqM= + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" babel-runtime "^6.22.0" + babel-template "^6.24.1" -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= +babel-loader@8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.5.tgz#225322d7509c2157655840bba52e46b6c2f2fe33" + integrity sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw== dependencies: - regenerator-transform "^0.10.0" + find-cache-dir "^2.0.0" + loader-utils "^1.0.2" + mkdirp "^0.5.1" + util.promisify "^1.0.0" -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" - babel-types "^6.24.1" babel-polyfill@6.26.0: version "6.26.0" @@ -1517,61 +1801,6 @@ babel-polyfill@6.26.0: core-js "^2.5.0" regenerator-runtime "^0.10.5" -babel-preset-env@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - integrity sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" - integrity sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0= - dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" - -babel-preset-react@6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - integrity sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A= - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -1585,7 +1814,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: +babel-runtime@6.26.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1604,7 +1833,7 @@ babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -1619,7 +1848,7 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -1646,11 +1875,6 @@ backoff@^2.5.0: dependencies: precond "0.2" -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1950,21 +2174,14 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - -browserslist@^2.1.2: - version "2.11.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - integrity sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA== +browserslist@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" + integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A== dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" + caniuse-lite "^1.0.30000929" + electron-to-chromium "^1.3.103" + node-releases "^1.1.3" bson@^1.1.0: version "1.1.0" @@ -2236,25 +2453,10 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000928" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000928.tgz#2e83d2b14276442da239511615eb7c62fed0cfa7" - integrity sha512-nAoeTspAEzLjqGSeibzM09WojORi08faeOOI5GBmFWC3/brydovb9lYJWM+p48rEQsdevfpufK58gPiDtwOWKw== - -caniuse-lite@^1.0.30000792: - version "1.0.30000928" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000928.tgz#805e828dc72b06498e3683a32e61c7507fd67b88" - integrity sha512-aSpMWRXL6ZXNnzm8hgE4QDLibG5pVJ2Ujzsuj3icazlIkxXkPXtL+BWnMx6FBkWmkZgBHGUxPZQvrbRw2ZTxhg== +caniuse-lite@^1.0.30000929: + version "1.0.30000929" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz#7b391b781a9c3097ecc39ea053301aea8ea16317" + integrity sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw== capture-stack-trace@^1.0.0: version "1.0.1" @@ -2321,7 +2523,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1, chalk@~2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2, chalk@~2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2421,6 +2623,13 @@ chownr@~1.0.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= +chrome-trace-event@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + dependencies: + tslib "^1.9.0" + ci-info@^1.5.0, ci-info@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" @@ -2451,13 +2660,6 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== - dependencies: - chalk "^1.1.3" - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -2619,13 +2821,6 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= - dependencies: - q "^1.1.2" - codacy-coverage@^3.0.0: version "3.4.0" resolved "https://registry.yarnpkg.com/codacy-coverage/-/codacy-coverage-3.4.0.tgz#196af70844c4e4179718f7a7f9d96b921b4b3a67" @@ -2659,7 +2854,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.3.0, color-convert@^1.9.0: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2671,36 +2866,6 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= - dependencies: - color-name "^1.0.0" - -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - colors@1.0.3, colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -2751,11 +2916,6 @@ commander@~2.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" integrity sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E= -commander@~2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" - integrity sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew== - commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" @@ -2974,7 +3134,7 @@ conventional-commits-parser@^3.0.0: through2 "^2.0.0" trim-off-newlines "^1.0.0" -convert-source-map@^1.5.1: +convert-source-map@^1.1.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -3192,30 +3352,21 @@ csextends@^1.0.3: resolved "https://registry.yarnpkg.com/csextends/-/csextends-1.2.0.tgz#6374b210984b54d4495f29c99d3dd069b80543e5" integrity sha512-S/8k1bDTJIwuGgQYmsRoE+8P+ohV32WhQ0l4zqrc0XDdxOhjQQD7/wTZwCzoZX53jSX3V/qwjT+OkPTxWQcmjg== -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-loader@0.28.9: - version "0.28.9" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.9.tgz#68064b85f4e271d7ce4c48a58300928e535d1c95" - integrity sha512-r3dgelMm/mkPz5Y7m9SeiGE46i2VsEU/OYbez+1llfxtv8b2y5/b5StaeEvPK3S5tlNQI+tDW/xDIhKJoZgDtw== +css-loader@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.0.tgz#42952ac22bca5d076978638e9813abce49b8f0cc" + integrity sha512-MoOu+CStsGrSt5K2OeZ89q3Snf+IkxRfAIt9aAKg4piioTrhtP1iEFPu+OVn3Ohz24FO6L+rw9UJxBILiSBw5Q== dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - cssnano "^3.10.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.1.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" + icss-utils "^4.0.0" + loader-utils "^1.2.1" + lodash "^4.17.11" + postcss "^7.0.6" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^2.0.3" + postcss-modules-scope "^2.0.0" + postcss-modules-values "^2.0.0" postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" + schema-utils "^1.0.0" css-select@~1.2.0: version "1.2.0" @@ -3253,52 +3404,6 @@ csslint@0.10.0: dependencies: parserlib "~0.2.2" -cssnano@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - csv-generate@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/csv-generate/-/csv-generate-2.2.2.tgz#c37808c5f3ead2deec940794073dd32d492adfd1" @@ -3343,13 +3448,6 @@ cyclist@~0.2.2: resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= - dependencies: - es5-ext "^0.10.9" - dargs@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" @@ -3536,11 +3634,6 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - degenerator@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-1.0.4.tgz#fcf490a37ece266464d9cc431ab98c5819ced095" @@ -3839,7 +3932,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: +electron-to-chromium@^1.3.103: version "1.3.103" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz#a695777efdbc419cad6cbb0e58458251302cd52f" integrity sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ== @@ -3951,15 +4044,14 @@ engine.io@~3.2.0: engine.io-parser "~2.1.0" ws "~3.3.1" -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - integrity sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24= +enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" + tapable "^1.0.0" enhanced-resolve@~0.9.0: version "0.9.1" @@ -4022,7 +4114,7 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" -es-abstract@^1.7.0: +es-abstract@^1.5.1, es-abstract@^1.7.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -4043,41 +4135,11 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.46" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" - integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" - es6-error@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - es6-promise@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4" @@ -4100,35 +4162,6 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4168,16 +4201,6 @@ escodegen@1.x.x: optionalDependencies: source-map "~0.6.1" -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-config-angular@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/eslint-config-angular/-/eslint-config-angular-0.5.0.tgz#e0aae0132e39e7467df3f7547fec81a44d3685c4" @@ -4385,7 +4408,7 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= @@ -4395,14 +4418,6 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - event-loop-inspector@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/event-loop-inspector/-/event-loop-inspector-1.0.1.tgz#ef3632b90e716b2aa14372cb01d1263f51520188" @@ -4644,16 +4659,6 @@ extract-opts@^2.2.0: dependencies: typechecker "~2.0.1" -extract-text-webpack-plugin@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7" - integrity sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ== - dependencies: - async "^2.4.1" - loader-utils "^1.1.0" - schema-utils "^0.3.0" - webpack-sources "^1.0.1" - extsprintf@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.2.0.tgz#5ad946c22f5b32ba7f8cd7426711c6e8a3fc2529" @@ -4802,14 +4807,14 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== dependencies: commondir "^1.0.1" make-dir "^1.0.0" - pkg-dir "^2.0.0" + pkg-dir "^3.0.0" find-npm-prefix@^1.0.2: version "1.0.2" @@ -4878,11 +4883,6 @@ flat-cache@^1.2.1: rimraf "~2.6.2" write "^0.2.1" -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" - integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= - flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -5323,6 +5323,11 @@ global-dirs@^0.1.0: dependencies: ini "^1.3.4" +global-modules-path@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931" + integrity sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg== + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -5784,11 +5789,6 @@ hosted-git-info@^2.1.4, hosted-git-info@^2.6.0, hosted-git-info@^2.7.1: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - html-to-text@4.0.0, html-to-text@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-4.0.0.tgz#c1f4e100d74e9feab5b152d7b6b3be3c1c6412b0" @@ -5961,12 +5961,12 @@ icss-replace-symbols@^1.1.0: resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= -icss-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= +icss-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.0.0.tgz#d52cf4bcdcfa1c45c2dbefb4ffdf6b00ef608098" + integrity sha512-bA/xGiwWM17qjllIs9X/y0EjsB7e0AV08F3OL8UPsoNkNRibIuu8f1eKTnQ8QO1DteKKTxTUAn+IEWUToIwGOA== dependencies: - postcss "^6.0.1" + postcss "^7.0.5" ieee754@^1.1.4: version "1.1.12" @@ -6051,6 +6051,14 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imports-loader@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69" @@ -6081,11 +6089,6 @@ indent-string@^3.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -6167,7 +6170,7 @@ inquirer@^5.2.0: strip-ansi "^4.0.0" through "^2.3.6" -interpret@^1.0.0: +interpret@^1.0.0, interpret@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== @@ -6230,11 +6233,6 @@ ipaddr.js@1.8.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -6511,13 +6509,6 @@ is-subset@^0.1.1: resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= - dependencies: - html-comment-regex "^1.1.0" - is-symbol@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" @@ -6654,7 +6645,7 @@ joi@^13.x: isemail "3.x.x" topo "3.x.x" -js-base64@^2.1.8, js-base64@^2.1.9: +js-base64@^2.1.8: version "2.5.0" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.0.tgz#42255ba183ab67ce59a0dee640afdc00ab5ae93e" integrity sha512-wlEBIZ5LP8usDylWbDNhKPEFVFdI5hCHpnVoT/Ysvoi/PRhJENm/Rlh9TvjYB38HFfKZN7OzEbRjmjvLkFw11g== @@ -6669,6 +6660,11 @@ js-beautify@1.6.8: mkdirp "~0.5.0" nopt "~3.0.1" +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + js-string-escape@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" @@ -6705,14 +6701,6 @@ js-yaml@~3.5.2: argparse "^1.0.2" esprima "^2.6.0" -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - jsbn@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" @@ -6752,11 +6740,6 @@ jshint@2.8.0: shelljs "0.3.x" strip-json-comments "1.0.x" -json-loader@^0.5.4: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== - json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -6799,6 +6782,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -7059,6 +7049,11 @@ lie@~3.1.0: dependencies: immediate "~3.0.5" +lightercollective@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.1.0.tgz#70df102c530dcb8d0ccabfe6175a8d00d5f61300" + integrity sha512-J9tg5uraYoQKaWbmrzDDexbG6hHnMcWS1qLYgJSWE+mpA3U5OCSeMUhb+K55otgZJ34oFdR0ECvdIb3xuO5JOQ== + linkify-it@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" @@ -7107,7 +7102,7 @@ loader-runner@^2.3.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.1: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -7190,11 +7185,6 @@ lodash.bind@^4.1.4: resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - lodash.capitalize@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" @@ -7285,11 +7275,6 @@ lodash.max@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.max/-/lodash.max-4.0.1.tgz#8735566c618b35a9f760520b487ae79658af136a" integrity sha1-hzVWbGGLNan3YFILSHrnllivE2o= -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - lodash.merge@^4.4.0, lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" @@ -7619,11 +7604,6 @@ matchdep@2.0.0: resolve "^1.4.0" stack-trace "0.0.10" -math-expression-evaluator@^1.2.14: - version "1.2.17" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" - integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= - math-interval-parser@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-1.1.0.tgz#dbeda5b06b3249973c6df6170fde2386f0afd893" @@ -7676,6 +7656,11 @@ mem@^4.0.0: mimic-fn "^1.0.0" p-is-promise "^1.1.0" +memoize-one@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.0.0.tgz#d55007dffefb8de7546659a1722a5d42e128286e" + integrity sha512-7g0+ejkOaI9w5x6LvQwmj68kUj6rxROywPSCqmclG/HBacmFnZqhVscQ8kovkn9FBCNJmOz6SY42+jnvZzDWdw== + memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" @@ -7771,7 +7756,7 @@ methods@^1.1.1, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -7835,6 +7820,15 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mini-css-extract-plugin@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0" + integrity sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -8219,11 +8213,6 @@ netmask@1.0.6, netmask@^1.0.6: resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35" integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU= -next-tick@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -8337,6 +8326,13 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.3.tgz#aad9ce0dcb98129c753f772c0aa01360fb90fbd2" + integrity sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ== + dependencies: + semver "^5.3.0" + node-sass@4.9.3: version "4.9.3" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" @@ -8409,12 +8405,7 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@^1.4.0, normalize-url@^1.9.1: +normalize-url@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= @@ -8708,11 +8699,6 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -8773,6 +8759,14 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -9375,13 +9369,6 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -9481,277 +9468,44 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" - integrity sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ== - dependencies: - postcss "^5.0.4" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: +postcss-modules-extract-imports@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-modules-extract-imports@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" - integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== dependencies: - postcss "^6.0.1" + postcss "^7.0.5" -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= +postcss-modules-local-by-default@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.4.tgz#a000bb07e4f57f412ba35c904d035cfd4a7b9446" + integrity sha512-WvuSaTKXUqYJbnT7R3YrsNrHv/C5vRfr5VglS4bFOk0MYT4CLBfc/xgExA+x2RftlYgiBDvWmVs191Xv8S8gZQ== dependencies: css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" + postcss "^7.0.6" + postcss-value-parser "^3.3.1" -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= +postcss-modules-scope@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.0.1.tgz#2c0f2394cde4cd09147db054c68917e38f6d43a4" + integrity sha512-7+6k9c3/AuZ5c596LJx9n923A/j3nF3ormewYBF1RrIQvjvjXe1xE8V8A1KFyFwXbvnshT6FBZFX0k/F1igneg== dependencies: css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" + postcss "^7.0.6" -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= +postcss-modules-values@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64" + integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w== dependencies: icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" + postcss "^7.0.6" -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: +postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.1, postcss@^6.0.14: +postcss@^6.0.14: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -9760,6 +9514,15 @@ postcss@^6.0.1, postcss@^6.0.14: source-map "^0.6.1" supports-color "^5.4.0" +postcss@^7.0.5, postcss@^7.0.6: + version "7.0.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.13.tgz#42bf716413e8f1c786ab71dc6e722b3671b16708" + integrity sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + precond@0.2: version "0.2.3" resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" @@ -10087,7 +9850,7 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -q@^1.1.2, q@^1.5.1: +q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -10544,22 +10307,6 @@ redis@2.8.0: redis-commands "^1.2.0" redis-parser "^2.6.0" -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" - integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk= - dependencies: - balanced-match "^0.4.2" - reduce-reducers@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/reduce-reducers/-/reduce-reducers-0.4.3.tgz#8e052618801cd8fc2714b4915adaa8937eb6d66c" @@ -10610,7 +10357,14 @@ redux@4.0.1: loose-envify "^1.4.0" symbol-observable "^1.2.0" -regenerate@^1.2.1: +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -10630,13 +10384,11 @@ regenerator-runtime@^0.12.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" regex-not@^1.0.0, regex-not@^1.0.2: @@ -10666,14 +10418,17 @@ regexpu-core@^1.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" + integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" registry-auth-token@^3.0.1, registry-auth-token@^3.3.1: version "3.3.2" @@ -10695,6 +10450,11 @@ regjsgen@^0.2.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" @@ -10702,6 +10462,13 @@ regjsparser@^0.1.4: dependencies: jsesc "~0.5.0" +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -10824,6 +10591,13 @@ require_optional@^1.0.1, require_optional@~1.0.0: resolve-from "^2.0.0" semver "^5.1.0" +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + resolve-dir@^1.0.0, resolve-dir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" @@ -10869,7 +10643,7 @@ resolve@1.1.x, resolve@~1.1.0: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1: version "1.9.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== @@ -11057,7 +10831,7 @@ sass-loader@7.1.0: pify "^3.0.0" semver "^5.5.0" -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1: +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -11079,14 +10853,7 @@ scheduler@^0.12.0: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" - integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= - dependencies: - ajv "^5.0.0" - -schema-utils@^0.4.5: +schema-utils@^0.4.4, schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== @@ -11094,6 +10861,15 @@ schema-utils@^0.4.5: ajv "^6.1.0" ajv-keywords "^3.1.0" +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + script-loader@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/script-loader/-/script-loader-0.7.2.tgz#2016db6f86f25f5cf56da38915d83378bb166ba7" @@ -11198,6 +10974,11 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" +serialize-javascript@^1.4.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" + integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== + serve-favicon@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" @@ -11746,7 +11527,7 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.6, source-map-support@^0.5.7, source-map-support@^0.5.9: +source-map-support@^0.5.6, source-map-support@^0.5.7, source-map-support@^0.5.9, source-map-support@~0.5.6: version "0.5.10" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== @@ -11764,7 +11545,7 @@ source-map@0.5.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.0.tgz#0fe96503ac86a5adb5de63f4e412ae4872cdbe86" integrity sha1-D+llA6yGpa213mP05BKuSHLNvoY= -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -12190,27 +11971,27 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.0, supports-color@^3.2.3: +supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" -supports-color@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s= - dependencies: - has-flag "^2.0.0" - -supports-color@^5.0.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.0.0, supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + supports-hyperlinks@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" @@ -12226,19 +12007,6 @@ svg-captcha@1.3.11: dependencies: opentype.js "^0.7.3" -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - symbol-observable@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" @@ -12266,10 +12034,10 @@ tapable@^0.1.8: resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" integrity sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q= -tapable@^0.2.7: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.9.tgz#af2d8bbc9b04f74ee17af2b4d9048f807acd18a8" - integrity sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A== +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== tar-stream@^1.5.0: version "1.6.2" @@ -12347,6 +12115,29 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +terser-webpack-plugin@1.2.1, terser-webpack-plugin@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" + integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.8.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.8.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.14.1.tgz#cc4764014af570bc79c79742358bd46926018a32" + integrity sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + source-map-support "~0.5.6" + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -12580,7 +12371,7 @@ trim-right@^1.0.1: dependencies: glob "^7.1.2" -tslib@1.9.3, tslib@^1, tslib@^1.9.3: +tslib@1.9.3, tslib@^1, tslib@^1.9.0, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== @@ -12654,15 +12445,15 @@ uc.micro@^1.0.1: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== -uglify-js@3.4.7: - version "3.4.7" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.7.tgz#4df6b92e54789aa921a254cb1e33704d6ec12b89" - integrity sha512-J0M2i1mQA+ze3EdN9SBi751DNdAXmeFLfJrd/MDIkRc3G3Gbb9OPVSx7GIQvVwfWxQARcYV2DTxIkMyDAk3o9Q== +uglify-js@3.4.9, uglify-js@^3.1.4, uglify-js@~3.4.0: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: - commander "~2.16.0" + commander "~2.17.1" source-map "~0.6.1" -uglify-js@^2.6, uglify-js@^2.6.1, uglify-js@^2.8.29: +uglify-js@^2.6, uglify-js@^2.6.1: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= @@ -12672,28 +12463,11 @@ uglify-js@^2.6, uglify-js@^2.6.1, uglify-js@^2.8.29: optionalDependencies: uglify-to-browserify "~1.0.0" -uglify-js@^3.1.4, uglify-js@~3.4.0: - version "3.4.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== - dependencies: - commander "~2.17.1" - source-map "~0.6.1" - uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= -uglifyjs-webpack-plugin@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" - integrity sha1-uVH0q7a9YX5m9j64kUmOORdj4wk= - dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" - uid-number@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -12741,6 +12515,29 @@ underscore@~1.7.0: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -12751,16 +12548,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - unique-filename@^1.1.0, unique-filename@^1.1.1, unique-filename@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -12909,6 +12696,14 @@ util-extend@^1.0.1: resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" integrity sha1-p8IW0mdUUWljeztu3GypEZ4v+T8= +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -12940,7 +12735,7 @@ uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -v8-compile-cache@^2.0.0: +v8-compile-cache@^2.0.0, v8-compile-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== @@ -12977,11 +12772,6 @@ vasync@^1.6.4: dependencies: verror "1.6.0" -vendors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" - integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== - verror@1.10.0, verror@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -13039,7 +12829,7 @@ vxx@1.2.2: shimmer "^1.0.0" uuid "^3.0.1" -watchpack@^1.4.0: +watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== @@ -13083,7 +12873,26 @@ web-resource-inliner@^4.2.1: valid-data-url "^0.1.4" xtend "^4.0.0" -webpack-sources@^1.0.1: +webpack-cli@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.1.tgz#779c696c82482491f0803907508db2e276ed3b61" + integrity sha512-jeJveHwz/vwpJ3B8bxEL5a/rVKIpRNJDsKggfKnxuYeohNDW4Y/wB9N/XHJA093qZyS0r6mYL+/crLsIol4WKA== + dependencies: + chalk "^2.4.1" + cross-spawn "^6.0.5" + enhanced-resolve "^4.1.0" + findup-sync "^2.0.0" + global-modules "^1.0.0" + global-modules-path "^2.3.0" + import-local "^2.0.0" + interpret "^1.1.0" + lightercollective "^0.1.0" + loader-utils "^1.1.0" + supports-color "^5.5.0" + v8-compile-cache "^2.0.2" + yargs "^12.0.4" + +webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== @@ -13091,33 +12900,35 @@ webpack-sources@^1.0.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894" - integrity sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg== - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" +webpack@4.28.4: + version "4.28.4" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0" + integrity sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + acorn "^5.6.2" + acorn-dynamic-import "^3.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" + chrome-trace-event "^1.0.0" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.0" + json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" memory-fs "~0.4.1" + micromatch "^3.1.8" mkdirp "~0.5.0" + neo-async "^2.5.0" node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" + schema-utils "^0.4.4" + tapable "^1.1.0" + terser-webpack-plugin "^1.1.0" + watchpack "^1.5.0" + webpack-sources "^1.3.0" websocket-driver@>=0.5.1: version "0.7.0" @@ -13132,11 +12943,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= - which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -13227,7 +13033,7 @@ wordwrap@~0.0.2: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= -worker-farm@^1.6.0: +worker-farm@^1.5.2, worker-farm@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== @@ -13367,13 +13173,6 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= - dependencies: - camelcase "^4.1.0" - yargs-parser@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" @@ -13399,7 +13198,7 @@ yargs@^11.0.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@^12.0.0: +yargs@^12.0.0, yargs@^12.0.4: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== @@ -13449,25 +13248,6 @@ yargs@^7.0.0: y18n "^3.2.1" yargs-parser "^5.0.0" -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" From cc5be05af748e94cbda7ca36436d6abd506c43ca Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Fri, 18 Jan 2019 21:19:45 -0500 Subject: [PATCH 15/68] chore(react): appearance container --- src/client/actions/settings.js | 6 +- src/client/actions/types.js | 4 +- src/client/api/index.js | 4 +- src/client/components/Button/index.jsx | 15 +- .../components/Nav/SidebarItem/index.jsx | 2 +- src/client/components/Nav/Submenu/index.jsx | 2 +- .../components/Settings/Appearance/index.jsx | 248 ++++ .../components/Settings/General/index.jsx | 42 +- .../subcomponents/ColorSelector/index.jsx | 100 ++ .../subcomponents/EnableSwitch/index.jsx | 25 + .../InputWithSave/index.jsx | 9 +- .../Settings/subcomponents/Menu/index.jsx | 25 + .../Settings/subcomponents/MenuItem/index.jsx | 24 + .../{ => subcomponents}/SettingItem/index.jsx | 20 +- .../subcomponents/SettingSubItem/index.jsx | 41 + .../SingleSelect/index.jsx | 15 +- .../subcomponents/UploadButtonWithX/index.jsx | 63 + src/client/containers/SettingsContainer.jsx | 80 ++ src/client/lib/history.js | 3 + src/client/reducers/settings/index.js | 24 +- src/client/renderer.jsx | 12 +- src/client/sagas/settings/index.js | 35 +- .../js/angularjs/controllers/settings.js | 90 +- src/sass/app.sass | 8 +- src/views/settings.hbs | 1079 +---------------- 25 files changed, 810 insertions(+), 1166 deletions(-) create mode 100644 src/client/components/Settings/Appearance/index.jsx create mode 100644 src/client/components/Settings/subcomponents/ColorSelector/index.jsx create mode 100644 src/client/components/Settings/subcomponents/EnableSwitch/index.jsx rename src/client/components/Settings/{ => subcomponents}/InputWithSave/index.jsx (90%) create mode 100644 src/client/components/Settings/subcomponents/Menu/index.jsx create mode 100644 src/client/components/Settings/subcomponents/MenuItem/index.jsx rename src/client/components/Settings/{ => subcomponents}/SettingItem/index.jsx (67%) create mode 100644 src/client/components/Settings/subcomponents/SettingSubItem/index.jsx rename src/client/components/Settings/{ => subcomponents}/SingleSelect/index.jsx (83%) create mode 100644 src/client/components/Settings/subcomponents/UploadButtonWithX/index.jsx create mode 100644 src/client/containers/SettingsContainer.jsx create mode 100644 src/client/lib/history.js diff --git a/src/client/actions/settings.js b/src/client/actions/settings.js index 964be1231..b90ebfdc7 100644 --- a/src/client/actions/settings.js +++ b/src/client/actions/settings.js @@ -1,5 +1,7 @@ import { createAction } from 'redux-actions'; -import { FETCH_SETTINGS, UPDATE_SETTING } from './types'; +import {FETCH_SETTINGS, UPDATE_SETTING, UPDATE_MULTIPLE_SETTINGS, UPDATE_COLORSCHEME} from './types'; export const fetchSettings = createAction(FETCH_SETTINGS.ACTION); -export const updateSetting = createAction(UPDATE_SETTING.ACTION, (input) => ({name: input.name, value: input.value, stateName: input.stateName})); \ No newline at end of file +export const updateSetting = createAction(UPDATE_SETTING.ACTION, (input) => ({name: input.name, value: input.value, stateName: input.stateName})); +export const updateMultipleSettings = createAction(UPDATE_MULTIPLE_SETTINGS.ACTION, (settings) => settings); +export const updateColorScheme = createAction(UPDATE_COLORSCHEME.ACTION, (action) => action); \ No newline at end of file diff --git a/src/client/actions/types.js b/src/client/actions/types.js index 1fb50b87b..312bf1149 100644 --- a/src/client/actions/types.js +++ b/src/client/actions/types.js @@ -6,4 +6,6 @@ export const NAV_CHANGE = defineAction('NAV_CHANGE'); // Settings export const FETCH_SETTINGS = defineAction('FETCH_SETTINGS', [SUCCESS, ERROR]); -export const UPDATE_SETTING = defineAction('UPDATE_SETTING', [SUCCESS, ERROR]); \ No newline at end of file +export const UPDATE_SETTING = defineAction('UPDATE_SETTING', [SUCCESS, ERROR]); +export const UPDATE_MULTIPLE_SETTINGS = defineAction('UPDATE_MULTIPLE_SETTINGS', [SUCCESS, ERROR]); +export const UPDATE_COLORSCHEME = defineAction('UPDATE_COLORSCHEME', [SUCCESS, ERROR]); \ No newline at end of file diff --git a/src/client/api/index.js b/src/client/api/index.js index 43fd48ac9..1a2a5394b 100644 --- a/src/client/api/index.js +++ b/src/client/api/index.js @@ -4,8 +4,8 @@ let api = {}; api.settings = {}; -api.settings.update = function({name, value}) { - return axios.put('/api/v1/settings', {name, value}) +api.settings.update = function(settings) { + return axios.put('/api/v1/settings', settings) .then((res) => { return res.data; }); diff --git a/src/client/components/Button/index.jsx b/src/client/components/Button/index.jsx index 1dedb47c0..72e483c1c 100644 --- a/src/client/components/Button/index.jsx +++ b/src/client/components/Button/index.jsx @@ -1,17 +1,28 @@ import isUndefined from 'lodash/isUndefined'; import React from 'react'; +import PropTypes from 'prop-types'; class Button extends React.Component { constructor(props) { super(props); - this.text = (isUndefined(props.text)) ? 'Button' : props.text; } render() { + const { small, flat, style, text, onClick, extraClass } = this.props; + const classBuild = (small ? ' md-btn-small ' : '') + (flat ? ' md-btn-flat ' : '') + ((style && flat) ? ' md-btn-flat-' + style : (style) ? ' md-btn-' + style : '') + ' ' + extraClass; return ( - + ); } } +Button.propTypes = { + text: PropTypes.string.isRequired, + flat: PropTypes.bool, + style: PropTypes.string, + small: PropTypes.bool, + extraClass: PropTypes.string, + onClick: PropTypes.func +}; + export default Button; \ No newline at end of file diff --git a/src/client/components/Nav/SidebarItem/index.jsx b/src/client/components/Nav/SidebarItem/index.jsx index e2efb8c8b..52b97222d 100644 --- a/src/client/components/Nav/SidebarItem/index.jsx +++ b/src/client/components/Nav/SidebarItem/index.jsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import Helpers from 'modules/helpers'; -import './style.sass'; +// import './style.sass'; class NavButton extends Component { constructor(props) { diff --git a/src/client/components/Nav/Submenu/index.jsx b/src/client/components/Nav/Submenu/index.jsx index 1e09277be..44b8578de 100644 --- a/src/client/components/Nav/Submenu/index.jsx +++ b/src/client/components/Nav/Submenu/index.jsx @@ -7,7 +7,7 @@ import $ from 'jquery'; import Helpers from 'modules/helpers'; //Sass -import './style.sass'; +// import './style.sass'; class Submenu extends Component { componentDidMount() { diff --git a/src/client/components/Settings/Appearance/index.jsx b/src/client/components/Settings/Appearance/index.jsx new file mode 100644 index 000000000..1bfe53177 --- /dev/null +++ b/src/client/components/Settings/Appearance/index.jsx @@ -0,0 +1,248 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; + +import { updateSetting, updateMultipleSettings, updateColorScheme } from 'actions/settings'; +import Button from 'components/Button'; +import SettingItem from 'components/Settings/subcomponents/SettingItem'; +import UploadButtonWithX from 'components/Settings/subcomponents/UploadButtonWithX'; +import SettingSubItem from 'components/Settings/subcomponents/SettingSubItem'; +import SingleSelect from 'components/Settings/subcomponents/SingleSelect'; +import ColorSelector from 'components/Settings/subcomponents/ColorSelector'; + +const colorMap = { + light: { + headerBG: '#42464d', + headerPrimary: '#f6f7f8', + primary: '#606771', + secondary: '#f7f8fa', + tertiary: '#e74c3c', + quaternary: '#e6e7e8' + }, + dark: { + headerBG: '#242a31', + headerPrimary: '#f6f7f8', + primary: '#f6f7f8', + secondary: '#2f3640', + tertiary: '#e74c3c', + quaternary: '#454f5d' + }, + bluejean: { + headerBG: '#112d4e', + headerPrimary: '#f9f7f7', + primary: '#112d4e', + secondary: '#f9f7f7', + tertiary: '#3f72af', + quaternary: '#dbe2ef' + }, + midnight: { + headerBG: '#2c2e3e', + headerPrimary: '#f6f6f6', + primary: '#444a54', + secondary: '#c8c8c8', + tertiary: '#ee2b47', + quaternary: '#2c2e3e' + }, + moonlight: { + headerBG: '#2e3238', + headerPrimary: '#eeeeee', + primary: '#444a54', + secondary: '#c8c8c8', + tertiary: '#7971ea', + quaternary: '#444a54' + }, + purplerain: { + headerBG: '#393041', + headerPrimary: '#f6f6f6', + primary: '#393041', + secondary: '#d2cbd8', + tertiary: '#f67280', + quaternary: '#52455f' + }, + sandstone: { + headerBG: '#625757', + headerPrimary: '#f9f9f9', + primary: '#625757', + secondary: '#dfdfdf', + tertiary: '#ef5a5a', + quaternary: '#6f6363' + }, + winterfire: { + headerBG: '#404969', + headerPrimary: '#ebf0f6', + primary: '#404969', + secondary: '#ebf0f6', + tertiary: '#ff7f50', + quaternary: '#4a5479' + } +}; + +class AppearanceSettings extends React.Component { + constructor(props) { + super(props); + this.state = { + selectedColorScheme: 'light' + }; + } + + componentDidUpdate(prevProp, prevState) { + const colorScheme = this.calcColorScheme(); + if (this.state.selectedColorScheme !== colorScheme) + this.setState({ + selectedColorScheme: colorScheme + }); + } + + getSettingsValue(name) { + return ((this.props.settings.getIn(['settings', name, 'value'])) ? this.props.settings.getIn(['settings', name, 'value']) : '' ); + } + + updateSetting(name, value, stateName) { + this.props.updateSetting({name, value, stateName}); + } + + calcColorScheme() { + let colorScheme = 'light'; + if (this.getSettingsValue('colorSecondary') === '#2f3640') + colorScheme = 'dark'; + else if (this.getSettingsValue('colorHeaderBG') === '#112d4e') + colorScheme = 'bluejean'; + else if (this.getSettingsValue('colorTertiary') === '#ee2b47') + colorScheme = 'midnight'; + else if (this.getSettingsValue('colorHeaderBG') === '#2e3238') + colorScheme = 'moonlight'; + else if (this.getSettingsValue('colorTertiary') === '#f67280') + colorScheme = 'purplerain'; + else if (this.getSettingsValue('colorHeaderBG') === '#625757') + colorScheme = 'sandstone'; + else if (this.getSettingsValue('colorHeaderBG') === '#404969') + colorScheme = 'winterfire'; + + return colorScheme; + } + + onBuiltInColorSelectChange(e) { + this.headerBGColorSelect.setState({selectedColor: colorMap[e.target.value].headerBG}, this.headerBGColorSelect.updateColorButton); + this.headerPrimaryColorSelect.setState({selectedColor: colorMap[e.target.value].headerPrimary}, this.headerPrimaryColorSelect.updateColorButton); + this.primaryColorSelect.setState({selectedColor: colorMap[e.target.value].primary}, this.primaryColorSelect.updateColorButton); + this.secondaryColorSelect.setState({selectedColor: colorMap[e.target.value].secondary}, this.secondaryColorSelect.updateColorButton); + this.tertiaryColorSelect.setState({selectedColor: colorMap[e.target.value].tertiary}, this.tertiaryColorSelect.updateColorButton); + this.quaternaryColorSelect.setState({selectedColor: colorMap[e.target.value].quaternary}, this.quaternaryColorSelect.updateColorButton); + } + + saveColorScheme() { + const colors = [ + { name: 'color:headerbg', value: this.headerBGColorSelect.state.selectedColor}, + { name: 'color:headerprimary', value: this.headerPrimaryColorSelect.state.selectedColor}, + { name: 'color:primary', value: this.primaryColorSelect.state.selectedColor}, + { name: 'color:secondary', value: this.secondaryColorSelect.state.selectedColor}, + { name: 'color:tertiary', value: this.tertiaryColorSelect.state.selectedColor}, + { name: 'color:quaternary', value: this.quaternaryColorSelect.state.selectedColor} + ]; + + this.props.updateColorScheme(colors); + } + + render() { + const { active } = this.props; + + return ( +
              + Upload site logo to display in top navigation. Note: Resize to max width of 140px
              } + component={ { + this.updateSetting('gen:customlogo', false, 'hasCustomLogo'); + setTimeout(() => { window.location.reload(); }, 1000); + }} /> + } + /> + + Upload logo to display within page views. Note: Used on login page (515px x 125px)
              } + component={ { + this.updateSetting('gen:custompagelogo', false, 'hasCustomPageLogo'); + }} /> + } + /> + + { + this.updateSetting('gen:customfavicon', false, 'hasCustomFavicon'); + setTimeout(() => { window.location.reload(); }, 1000); + }} /> + } + /> + {this.saveColorScheme();}} /> + } + > + { this.onBuiltInColorSelectChange(e); }} /> + } /> + {this.headerBGColorSelect = cs;}} defaultColor={this.getSettingsValue('colorHeaderBG')}/> + } /> + {this.headerPrimaryColorSelect = cs;}} defaultColor={this.getSettingsValue('colorHeaderPrimary')}/> + }/> + {this.primaryColorSelect = cs;}} defaultColor={this.getSettingsValue('colorPrimary')}/> + }/> + {this.secondaryColorSelect = cs;}} defaultColor={this.getSettingsValue('colorSecondary')}/> + }/> + {this.tertiaryColorSelect = cs;}} defaultColor={this.getSettingsValue('colorTertiary')}/> + }/> + {this.quaternaryColorSelect = cs;}} defaultColor={this.getSettingsValue('colorQuaternary')}/> + }/> + +
              + ); + } +} + +AppearanceSettings.propTypes = { + active: PropTypes.bool, + settings: PropTypes.object.isRequired, + updateSetting: PropTypes.func.isRequired, + updateMultipleSettings: PropTypes.func.isRequired, + updateColorScheme: PropTypes.func.isRequired +}; + +const mapStateToProps = (state) => ({ + settings: state.settings.settings +}); + +export default connect(mapStateToProps, { updateSetting, updateMultipleSettings, updateColorScheme })(AppearanceSettings); \ No newline at end of file diff --git a/src/client/components/Settings/General/index.jsx b/src/client/components/Settings/General/index.jsx index fe25848da..473523040 100644 --- a/src/client/components/Settings/General/index.jsx +++ b/src/client/components/Settings/General/index.jsx @@ -2,12 +2,14 @@ import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import moment from 'moment-timezone'; -import { fetchSettings } from 'actions/settings'; +import { updateSetting } from 'actions/settings'; -import SettingItem from 'components/Settings/SettingItem'; +import SettingItem from 'components/Settings/subcomponents/SettingItem'; -import InputWithSave from 'components/Settings/InputWithSave'; -import SingleSelect from 'components/Settings/SingleSelect'; +import InputWithSave from 'components/Settings/subcomponents/InputWithSave'; +import SingleSelect from 'components/Settings/subcomponents/SingleSelect'; +import EnableSwitch from 'components/Settings/subcomponents/EnableSwitch'; +import SettingSubItem from 'components/Settings/subcomponents/SettingSubItem'; class GeneralSettings extends React.Component { constructor(props) { @@ -18,13 +20,17 @@ class GeneralSettings extends React.Component { } componentDidMount() { - this.props.fetchSettings(); + } getSettingsValue(name) { return ((this.props.settings.getIn(['settings', name, 'value'])) ? this.props.settings.getIn(['settings', name, 'value']) : '' ); } + updateSetting(stateName, name, value) { + this.props.updateSetting({stateName, name, value}); + } + getTimezones() { return moment.tz.names().map(function(name) { const year = new Date().getUTCFullYear(); @@ -48,15 +54,33 @@ class GeneralSettings extends React.Component { ); - let Timezone = ( + const Timezone = ( ); + const AllowUserRegistration = ( + { + this.updateSetting('allowUserRegistration', 'allowUserRegistration:enable', e.target.checked); + }} /> + ); + return ( -
              +
              Title of site. Used as page title. default: Trudesk
              } component={SiteTitle} /> Publicly accessible URL of this site. ex: {this.state.viewData.hosturl}
              } component={SiteUrl} /> + Moment.js Format Options}> + + } /> + + } /> + + } /> + +
              ); } @@ -64,7 +88,7 @@ class GeneralSettings extends React.Component { GeneralSettings.propTypes = { active: PropTypes.bool, - fetchSettings: PropTypes.func.isRequired, + updateSetting: PropTypes.func.isRequired, settings: PropTypes.object.isRequired }; @@ -72,4 +96,4 @@ const mapStateToProps = (state) => ({ settings: state.settings.settings }); -export default connect(mapStateToProps, { fetchSettings })(GeneralSettings); \ No newline at end of file +export default connect(mapStateToProps, { updateSetting })(GeneralSettings); \ No newline at end of file diff --git a/src/client/components/Settings/subcomponents/ColorSelector/index.jsx b/src/client/components/Settings/subcomponents/ColorSelector/index.jsx new file mode 100644 index 000000000..d337a2352 --- /dev/null +++ b/src/client/components/Settings/subcomponents/ColorSelector/index.jsx @@ -0,0 +1,100 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import $ from 'jquery'; +import helpers from 'lib/helpers'; + +class ColorSelector extends React.Component { + constructor(props) { + super(props); + this.state = { + selectedColor: '' + }; + } + + componentDidMount() { + helpers.UI.inputs(); + } + + componentDidUpdate(prevProps) { + if (this.props.defaultColor !== prevProps.defaultColor) + this.setState({ + selectedColor: this.props.defaultColor + }, this.updateColorButton); + } + + static getRandomColor() { + const letters = '0123456789ABCDEF'; + let color = '#'; + for (let i = 0; i < 6; i++) + color += letters[Math.floor(Math.random() * 16)]; + + return color; + } + + static getContrast(hexcolor){ + hexcolor = hexcolor.replace('#', ''); + if (hexcolor.length === 3) { + const v = hexcolor[0]; + hexcolor = hexcolor + v + v + v; + } + const r = parseInt(hexcolor.substr(0,2),16); + const g = parseInt(hexcolor.substr(2,2),16); + const b = parseInt(hexcolor.substr(4,2),16); + const yiq = ((r*299)+(g*587)+(b*114))/1000; + return (yiq >= 128) ? '#444' : '#f7f8fa'; + } + + generateRandomColor(event) { + event.preventDefault(); + const $currentTarget = $(event.target); + if ($currentTarget.length > 0) { + const color = ColorSelector.getRandomColor(); + this.setState({ + selectedColor: color + }, this.updateColorButton); + } + } + + updateColorButton() { + const fgColor = ColorSelector.getContrast(this.state.selectedColor.substring(1)); + $(this.colorButton).css({background: this.state.selectedColor, color: fgColor}); + } + + onInputValueChange(e) { + const val = e.target.value; + this.setState({ + selectedColor: val + }, this.updateColorButton); + } + + revertColor() { + this.setState({ + selectedColor: this.props.defaultColor + }, this.updateColorButton); + } + + render() { + return ( +
              +
              + +
              +
              + + { this.onInputValueChange(e); }} /> +
              +
              + +
              + ); + } +} + +ColorSelector.propTypes = { + defaultColor: PropTypes.string.isRequired +}; + +export default ColorSelector; \ No newline at end of file diff --git a/src/client/components/Settings/subcomponents/EnableSwitch/index.jsx b/src/client/components/Settings/subcomponents/EnableSwitch/index.jsx new file mode 100644 index 000000000..73ea2b049 --- /dev/null +++ b/src/client/components/Settings/subcomponents/EnableSwitch/index.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +class EnableSwitch extends React.Component { + render() { + return ( +
              + +
              + ); + } +} + +EnableSwitch.propTypes = { + stateName: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + onChange: PropTypes.func, + checked: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]) +}; + +export default EnableSwitch; \ No newline at end of file diff --git a/src/client/components/Settings/InputWithSave/index.jsx b/src/client/components/Settings/subcomponents/InputWithSave/index.jsx similarity index 90% rename from src/client/components/Settings/InputWithSave/index.jsx rename to src/client/components/Settings/subcomponents/InputWithSave/index.jsx index b10cd1ca9..e6bcde49a 100644 --- a/src/client/components/Settings/InputWithSave/index.jsx +++ b/src/client/components/Settings/subcomponents/InputWithSave/index.jsx @@ -10,7 +10,7 @@ class InputWithSave extends React.Component { constructor(props) { super(props); this.state = { - value: '' + value: this.props.value }; } @@ -18,10 +18,11 @@ class InputWithSave extends React.Component { helpers.UI.inputs(); } - static getDerivedStateFromProps(props, state) { + static getDerivedStateFromProps(nextProps, state) { if (!state.value) { - state.value = (props.value) ? props.value : ''; - return state; + return { + value: nextProps.value + }; } return null; diff --git a/src/client/components/Settings/subcomponents/Menu/index.jsx b/src/client/components/Settings/subcomponents/Menu/index.jsx new file mode 100644 index 000000000..a3427f8c6 --- /dev/null +++ b/src/client/components/Settings/subcomponents/Menu/index.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +class Menu extends React.Component { + constructor(props) { + super(props); + } + + render() { + return ( +
                + {this.props.children} +
              + ); + } +} + +Menu.propTypes = { + children: PropTypes.oneOfType([ + PropTypes.arrayOf(PropTypes.node), + PropTypes.node + ]).isRequired +}; + +export default Menu; \ No newline at end of file diff --git a/src/client/components/Settings/subcomponents/MenuItem/index.jsx b/src/client/components/Settings/subcomponents/MenuItem/index.jsx new file mode 100644 index 000000000..f1d5c75b1 --- /dev/null +++ b/src/client/components/Settings/subcomponents/MenuItem/index.jsx @@ -0,0 +1,24 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +class MenuItem extends React.Component { + + render() { + const { title, active, onClick } = this.props; + return ( +
            • +
              +

              {title}

              +
              +
            • + ); + } +} + +MenuItem.propTypes = { + title: PropTypes.string.isRequired, + active: PropTypes.bool, + onClick: PropTypes.func.isRequired +}; + +export default MenuItem; \ No newline at end of file diff --git a/src/client/components/Settings/SettingItem/index.jsx b/src/client/components/Settings/subcomponents/SettingItem/index.jsx similarity index 67% rename from src/client/components/Settings/SettingItem/index.jsx rename to src/client/components/Settings/subcomponents/SettingItem/index.jsx index 32da10819..27a64a36e 100644 --- a/src/client/components/Settings/SettingItem/index.jsx +++ b/src/client/components/Settings/subcomponents/SettingItem/index.jsx @@ -33,6 +33,23 @@ class SettingItem extends React.Component { { component }
              + { (this.props.children) && +
              +
              +
              +
              +
              + {React.Children.map(this.props.children, (child, k) => ( +
              + {child} +
              + )) + } +
              +
              +
              +
              + } ); @@ -48,7 +65,8 @@ SettingItem.propTypes = { PropTypes.string, PropTypes.object ]), - tootip: PropTypes.string + tooltip: PropTypes.string, + component: PropTypes.element }; export default SettingItem; \ No newline at end of file diff --git a/src/client/components/Settings/subcomponents/SettingSubItem/index.jsx b/src/client/components/Settings/subcomponents/SettingSubItem/index.jsx new file mode 100644 index 000000000..6be68cc0e --- /dev/null +++ b/src/client/components/Settings/subcomponents/SettingSubItem/index.jsx @@ -0,0 +1,41 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +class SettingSubItem extends React.Component { + render() { + const { title, subTitle, component, tooltip } = this.props; + return ( +
              +
              +
              {title} + { tooltip && + error + } +
              +

              {subTitle}

              +
              +
              +
              + {component} +
              +
              +
              + ); + } +} + +SettingSubItem.propTypes = { + title: PropTypes.string.isRequired, + subTitle: PropTypes.string, + tooltip: PropTypes.string, + component: PropTypes.element +}; + +export default SettingSubItem; \ No newline at end of file diff --git a/src/client/components/Settings/SingleSelect/index.jsx b/src/client/components/Settings/subcomponents/SingleSelect/index.jsx similarity index 83% rename from src/client/components/Settings/SingleSelect/index.jsx rename to src/client/components/Settings/subcomponents/SingleSelect/index.jsx index c98f2e68d..fba2ef399 100644 --- a/src/client/components/Settings/SingleSelect/index.jsx +++ b/src/client/components/Settings/subcomponents/SingleSelect/index.jsx @@ -19,7 +19,7 @@ class SingleSelect extends React.Component { helpers.UI.selectize(); const $select = $(this.select); - $select.on('change', (e) => this.updateValue(e)); + $select.on('change', this.props.onSelectChange); } componentWillUnmount() { @@ -50,13 +50,18 @@ class SingleSelect extends React.Component { render() { const { items } = this.props; + let width = '75%'; if (this.select && this.select.selectize) { this.select.selectize.addItem(this.state.value, true); } + + if (this.props.width) + width = this.props.width; + return ( -
              - { this.select = select; }} data-md-selectize data-md-selectize-bottom value={this.state.value} onChange={this.props.onSelectChange}> { items.map(function(obj, i) { return ; })} @@ -71,7 +76,9 @@ SingleSelect.propTypes = { settingName: PropTypes.string.isRequired, stateName: PropTypes.string.isRequired, value: PropTypes.string, - items: PropTypes.arrayOf(PropTypes.object).isRequired + width: PropTypes.string, + items: PropTypes.arrayOf(PropTypes.object).isRequired, + onSelectChange: PropTypes.func.isRequired }; export default connect(null, { updateSetting })(SingleSelect); \ No newline at end of file diff --git a/src/client/components/Settings/subcomponents/UploadButtonWithX/index.jsx b/src/client/components/Settings/subcomponents/UploadButtonWithX/index.jsx new file mode 100644 index 000000000..bbc8b2030 --- /dev/null +++ b/src/client/components/Settings/subcomponents/UploadButtonWithX/index.jsx @@ -0,0 +1,63 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import $ from 'jquery'; +import UIkit from 'uikit'; +import helpers from 'lib/helpers'; + +class UploadButtonWithX extends React.Component { + + componentDidMount() { + const $uploadButton = $(this.uploadButton); + const $buttonX = $(this.buttonX); + const $uploadSelect = $(this.uploadSelect); + + const uploadLogoSettings = { + action: this.props.uploadAction, + allow: this.props.extAllowed, + loadstart: function () { + $uploadButton.text('Uploading...'); + $uploadButton.attr('disabled', true); + $uploadButton.addClass('disable'); + }, + allcomplete: function () { + $uploadButton.text('Upload Logo'); + $uploadButton.attr('disabled', false); + $uploadButton.removeClass('disable'); + helpers.UI.showSnackbar('Upload Complete. Reloading...', false); + // remove page refresh once SettingsService merge + // $('img.site-logo').attr('src', '/assets/topLogo.png?refresh=' + new Date().getTime()); + setTimeout(function() { + window.location.reload(); + }, 1000); + $buttonX.removeClass('hide'); + } + }; + + UIkit.uploadSelect($uploadSelect, uploadLogoSettings); + } + + render() { + const { buttonText, showX, onXClick } = this.props; + + return ( +
              + + +
              + ); + } +} + +UploadButtonWithX.propTypes = { + buttonText: PropTypes.string.isRequired, + uploadAction: PropTypes.string.isRequired, + extAllowed: PropTypes.string.isRequired, + showX: PropTypes.oneOfType([ PropTypes.bool, PropTypes.string ]), + onXClick: PropTypes.func +}; + +export default UploadButtonWithX; \ No newline at end of file diff --git a/src/client/containers/SettingsContainer.jsx b/src/client/containers/SettingsContainer.jsx new file mode 100644 index 000000000..8184a0efe --- /dev/null +++ b/src/client/containers/SettingsContainer.jsx @@ -0,0 +1,80 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; + +import { fetchSettings } from 'actions/settings'; + +import Menu from 'components/Settings/subcomponents/Menu'; +import MenuItem from 'components/Settings/subcomponents/MenuItem'; +import GeneralSettings from 'components/Settings/General'; +import AppearanceSettings from 'components/Settings/Appearance'; + +class SettingsContainer extends React.Component { + constructor(props) { + super(props); + this.state = { + title: 'Settings', + activeCategory: 'settings-general' + }; + } + + componentDidMount() { + const location = window.location.pathname.replace(/^(\/settings(\/?))/, ''); + if (location) { + this.setState({ + activeCategory: 'settings-' + location + }); + } + + this.props.fetchSettings(); + } + + onMenuItemClick(e, category) { + if (this.state.activeCategory === 'settings-' + category) + return; + + this.setState({ + activeCategory: 'settings-' + category + }); + } + + render() { + return ( +
              +
              +
              +
              +

              {this.state.title}

              +
              +
              +
              + + { this.onMenuItemClick(e, 'general'); }} /> + { this.onMenuItemClick(e, 'appearance'); }} /> + { this.onMenuItemClick(e, 'tickets'); }} /> + { this.onMenuItemClick(e, 'mailer'); }} /> + { this.onMenuItemClick(e, 'tps'); }} /> + { this.onMenuItemClick(e, 'backuprestore'); }} /> + { this.onMenuItemClick(e, 'legal'); }} /> + +
              +
              +
              +
              +
              +
              + + +
              +
              +
              +
              + ); + } +} + +SettingsContainer.propTypes = { + fetchSettings: PropTypes.func.isRequired +}; + +export default connect(null, {fetchSettings})(SettingsContainer); \ No newline at end of file diff --git a/src/client/lib/history.js b/src/client/lib/history.js new file mode 100644 index 000000000..1008b2abf --- /dev/null +++ b/src/client/lib/history.js @@ -0,0 +1,3 @@ +import createHistory from 'history/createBrowserHistory'; + +export default createHistory(); \ No newline at end of file diff --git a/src/client/reducers/settings/index.js b/src/client/reducers/settings/index.js index 2976cd924..cd39ba7bd 100644 --- a/src/client/reducers/settings/index.js +++ b/src/client/reducers/settings/index.js @@ -1,25 +1,43 @@ import { find } from 'lodash'; import { fromJS, Map } from 'immutable'; import { handleActions } from 'redux-actions'; -import {FETCH_SETTINGS, UPDATE_SETTING} from 'actions/types'; +import {FETCH_SETTINGS, UPDATE_COLORSCHEME, UPDATE_MULTIPLE_SETTINGS, UPDATE_SETTING} from 'actions/types'; import helpers from 'lib/helpers'; const initialState = { - settings: Map({}) + settings: Map({}), + loaded: false }; const settingsReducer = handleActions({ [FETCH_SETTINGS.SUCCESS]: (state, action) => ({ - settings: fromJS(action.response.settings.data) + settings: fromJS(action.response.settings.data), + loaded: true }), [UPDATE_SETTING.SUCCESS]: (state, action) => { helpers.UI.showSnackbar('Setting Saved Successfully', false); const updatedSetting = find(action.response.updatedSettings, { name: action.payload.name }); return { + loaded: state.loaded, settings: state.settings.setIn(['settings', action.payload.stateName], updatedSetting) }; + }, + + [UPDATE_SETTING.ERROR]: (state, action) => { + helpers.UI.showSnackbar('Error: ' + action.error, true); + return { + loaded: state.loaded, + settings: state.settings + }; + }, + + [UPDATE_MULTIPLE_SETTINGS.SUCCESS]: (state) => { + return { + loaded: state.loaded, + settings: state.settings + }; } }, initialState); diff --git a/src/client/renderer.jsx b/src/client/renderer.jsx index 917a53f5c..530831b25 100644 --- a/src/client/renderer.jsx +++ b/src/client/renderer.jsx @@ -1,19 +1,19 @@ import {Provider} from 'react-redux'; -import GeneralSettings from 'components/Settings/General'; import ReactDOM from 'react-dom'; import React from 'react'; +import SettingsContainer from './containers/SettingsContainer'; export default function(store) { - if (document.getElementById('settings-general')) { - const generalSettingsWithProvider = ( + if (document.getElementById('settings-container')) { + const SettingsContainerWithProvider = ( - + ); ReactDOM.render( - generalSettingsWithProvider, - document.getElementById('settings-general') + SettingsContainerWithProvider, + document.getElementById('settings-container') ); } } \ No newline at end of file diff --git a/src/client/sagas/settings/index.js b/src/client/sagas/settings/index.js index 216a53df4..41af2c2b2 100644 --- a/src/client/sagas/settings/index.js +++ b/src/client/sagas/settings/index.js @@ -4,10 +4,12 @@ import axios from 'axios'; import api from '../../api'; import { - FETCH_SETTINGS, + FETCH_SETTINGS, UPDATE_COLORSCHEME, UPDATE_MULTIPLE_SETTINGS, UPDATE_SETTING } from 'actions/types'; +import helpers from 'lib/helpers'; + function fetchSettings() { return axios.get('/api/v1/settings') .then(res => { @@ -28,15 +30,42 @@ function* fetchFlow({payload}) { function* updateSetting({payload}) { try { - const response = yield call(api.settings.update, payload); + const response = yield call(api.settings.update, [payload]); yield put({ type: UPDATE_SETTING.SUCCESS, response, payload }); - // yield put({ type: FETCH_SETTINGS.ACTION }); } catch (error) { yield put({ type: UPDATE_SETTING.ERROR, error }); } } +function* updateMultipleSettings({payload}) { + try { + const response = yield call(api.settings.update, payload); + yield put({ type: UPDATE_MULTIPLE_SETTINGS.SUCCESS, response}); + helpers.UI.showSnackbar('Setting saved successfully.', false); + yield put({ type: FETCH_SETTINGS.ACTION }); + } catch (error) { + helpers.UI.showSnackbar(error, true); + yield put({ type: UPDATE_MULTIPLE_SETTINGS.ERROR, error}); + } +} + +function* updateColorScheme({payload}) { + try { + const response = yield call(api.settings.update, payload); + yield put({ type: UPDATE_COLORSCHEME.SUCCESS, response}); + helpers.UI.showSnackbar('Setting saved successfully. Reloading...', false); + setTimeout(function() { + window.location.reload(); + }, 1000); + } catch (error) { + helpers.UI.showSnackbar(error, true); + yield put({ type: UPDATE_MULTIPLE_SETTINGS.ERROR, error}); + } +} + export default function* settingsWatcher() { yield takeLatest(FETCH_SETTINGS.ACTION, fetchFlow); yield takeLatest(UPDATE_SETTING.ACTION, updateSetting); + yield takeLatest(UPDATE_MULTIPLE_SETTINGS.ACTION, updateMultipleSettings); + yield takeLatest(UPDATE_COLORSCHEME.ACTION, updateColorScheme); } \ No newline at end of file diff --git a/src/public/js/angularjs/controllers/settings.js b/src/public/js/angularjs/controllers/settings.js index 5985004b3..dd2376502 100644 --- a/src/public/js/angularjs/controllers/settings.js +++ b/src/public/js/angularjs/controllers/settings.js @@ -114,51 +114,51 @@ define([ $scope.shortDateFormat = SettingsService.getSettings().shortDateFormat.value; $scope.longDateFormat = SettingsService.getSettings().longDateFormat.value; - var $uploadButton = $('#logo-upload-select').parent(); - var uploadLogoSettings = { - action: '/settings/general/uploadlogo', - allow: '*.(jpg|jpeg|gif|png)', - loadstart: function() { - $uploadButton.text('Uploading...'); - $uploadButton.attr('disabled', true); - $uploadButton.addClass('disable'); - }, - allcomplete: function() { - $uploadButton.text('Upload Logo'); - $uploadButton.attr('disabled', false); - $uploadButton.removeClass('disable'); - helpers.UI.showSnackbar('Upload Complete', false); - // remove page refresh once SettingsService merge - // $('img.site-logo').attr('src', '/assets/topLogo.png?refresh=' + new Date().getTime()); - $window.location.reload(); - $('button#remove-custom-logo-btn').removeClass('hide'); - } - }; - - UIkit.uploadSelect($('#logo-upload-select'), uploadLogoSettings); - - var $pageUploadButton = $('#page-logo-upload-select').parent(); - var pageUploadLogoSettings = { - action: '/settings/general/uploadpagelogo', - allow: '*.(jpg|jpeg|gif|png)', - loadstart: function() { - $uploadButton.text('Uploading...'); - $uploadButton.attr('disabled', true); - $uploadButton.addClass('disable'); - }, - allcomplete: function() { - $pageUploadButton.text('Upload Logo'); - $pageUploadButton.attr('disabled', false); - $pageUploadButton.removeClass('disable'); - helpers.UI.showSnackbar('Upload Complete', false); - // remove page refresh once SettingsService merge - // $('img.site-logo').attr('src', '/assets/topLogo.png?refresh=' + new Date().getTime()); - $window.location.reload(); - $('button#remove-custom-page-logo-btn').removeClass('hide'); - } - }; - - UIkit.uploadSelect($('#page-logo-upload-select'), pageUploadLogoSettings); + // var $uploadButton = $('#logo-upload-select').parent(); + // var uploadLogoSettings = { + // action: '/settings/general/uploadlogo', + // allow: '*.(jpg|jpeg|gif|png)', + // loadstart: function() { + // $uploadButton.text('Uploading...'); + // $uploadButton.attr('disabled', true); + // $uploadButton.addClass('disable'); + // }, + // allcomplete: function() { + // $uploadButton.text('Upload Logo'); + // $uploadButton.attr('disabled', false); + // $uploadButton.removeClass('disable'); + // helpers.UI.showSnackbar('Upload Complete', false); + // // remove page refresh once SettingsService merge + // // $('img.site-logo').attr('src', '/assets/topLogo.png?refresh=' + new Date().getTime()); + // $window.location.reload(); + // $('button#remove-custom-logo-btn').removeClass('hide'); + // } + // }; + // + // UIkit.uploadSelect($('#logo-upload-select'), uploadLogoSettings); + + // var $pageUploadButton = $('#page-logo-upload-select').parent(); + // var pageUploadLogoSettings = { + // action: '/settings/general/uploadpagelogo', + // allow: '*.(jpg|jpeg|gif|png)', + // loadstart: function() { + // $uploadButton.text('Uploading...'); + // $uploadButton.attr('disabled', true); + // $uploadButton.addClass('disable'); + // }, + // allcomplete: function() { + // $pageUploadButton.text('Upload Logo'); + // $pageUploadButton.attr('disabled', false); + // $pageUploadButton.removeClass('disable'); + // helpers.UI.showSnackbar('Upload Complete', false); + // // remove page refresh once SettingsService merge + // // $('img.site-logo').attr('src', '/assets/topLogo.png?refresh=' + new Date().getTime()); + // $window.location.reload(); + // $('button#remove-custom-page-logo-btn').removeClass('hide'); + // } + // }; + // + // UIkit.uploadSelect($('#page-logo-upload-select'), pageUploadLogoSettings); var uploadFaviconSettings = { action: '/settings/general/uploadfavicon', diff --git a/src/sass/app.sass b/src/sass/app.sass index 9933b8f2c..b4708b38b 100644 --- a/src/sass/app.sass +++ b/src/sass/app.sass @@ -153,11 +153,11 @@ input[type="file"], input[type="checkbox"], input[type="radio"], select @import "partials/common" @import "partials/contextmenu" @import "partials/topnav" -//@import "partials/sidebar" +@import "partials/sidebar" @import "partials/sidebarBottomPanel" -@import "../client/components/Nav/Sidebar/style" -@import "../client/components/Nav/SidebarItem/style" -@import "../client/components/Nav/Submenu/style" +//@import "../client/components/Nav/Sidebar/style" +//@import "../client/components/Nav/SidebarItem/style" +//@import "../client/components/Nav/Submenu/style" @import "partials/offcanvas" @import "partials/messages" @import "partials/settings" diff --git a/src/views/settings.hbs b/src/views/settings.hbs index 9f53dd5a7..3a9b1c640 100644 --- a/src/views/settings.hbs +++ b/src/views/settings.hbs @@ -1,1078 +1 @@ -
              -
              -
              -
              -

              Settings

              -
              - -
              - -
              -
                -
              • -
                -

                General

                -
                -
              • -
              • -
                -

                Appearance

                -
                -
              • -
              • -
                -

                Tickets

                -
                -
              • -
              • -
                -

                Mailer

                -
                -
              • - - - - - -
              • -
                -

                Push Service

                -
                -
              • -
              • -
                -

                Backup/Restore

                -
                -
              • -
              • -
                -

                Legal

                -
                -
              • -
              -
              -
              -
              -
              -
              -
              -
              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              -
              -
              -
              -
              Site Logo
              -
              - Upload site logo to display in top navigation. Note: Image will resize to a max width of 140px -
              -
              -
              -
              -
              - - -
              -
              -
              -
              -
              - -
              -
              -
              -
              Page Logo
              -
              - Upload logo to display within page views. Note: Used on login page. (515px x 125px) -
              -
              -
              -
              -
              - - -
              -
              -
              -
              -
              - -
              -
              -
              -
              Favicon
              -
              - Upload a custom favicon -
              -
              -
              -
              -
              - - -
              -
              -
              -
              -
              - -
              -
              -
              -
              Color Scheme
              -
              - Select the colors for your color scheme. -
              -
              -
              -
              - -
              -
              -
              -
              -
              -
              -
              -
              -
              Built-in Color Scheme
              -

              Select a predefined color scheme

              -
              -
              - -
              -
              - -
              -
              -
              Header Background
              -

              Background color of the header

              -
              -
              -
              - -
              - - - -
              - -
              -
              -
              -
              -
              -
              Header Primary
              -

              Text and icon color within the header

              -
              -
              -
              - -
              - - - -
              - -
              -
              -
              -
              -
              -
              Primary
              -

              Most text and icons. Choose a darker color.

              -
              -
              -
              - -
              - - - -
              - -
              -
              -
              -
              -
              -
              Secondary
              -

              The main background color

              -
              -
              -
              - -
              - - - -
              - -
              -
              -
              -
              -
              -
              Tertiary
              -

              Accent color, used for links, some buttons, and notifications

              -
              -
              -
              - -
              - - - -
              - -
              -
              -
              -
              -
              -
              Quaternary
              -

              Sidebar background color

              -
              -
              -
              - -
              - - - -
              - -
              -
              -
              -
              -
              -
              -
              -
              - -
              - -
              -
              -
              -
              -
              - Default Ticket Type -
              -
              - Default ticket type for newly created tickets. -
              -
              -
              -
              - -
              -
              -
              -
              - -
              -
              -
              -
              Allow Public Tickets
              -
              - Allow the creation of tickets by users that are unregistered. ({{data.common.hosturl}}/newissue) -
              -
              -
              - -
              - -
              -
              -
              -
              - -
              -
              -
              -
              Show Overdue Tickets - help -
              -
              - Enable/Disable flashing of tickets based on SLA time of type priority. -
              -
              -
              - -
              - -
              -
              -
              -
              - - -
              -
              -
              -
              Minimum Subject Length
              -
              - Minimum character for ticket subjects -
              -
              -
              -
              - -
              -
              - -
              -
              -
              -
              - - -
              -
              -
              -
              Minimum Issue Length
              -
              - Minimum character for ticket issues -
              -
              -
              -
              - -
              -
              - -
              -
              -
              -
              - - -
              -
              -
              -
              Ticket Types
              -
              - Create / Modify Ticket Types -
              -
              -
              -
              - -
              -
              -
              -
              -
              -
              -
                - {{#forEach data.ticketTypes}} -
              • -
                -

                {{name}}

                -
                -
              • - {{/forEach}} -
              -
              -
              - {{#each data.ticketTypes}} -
              -
              -

              General

              -
              - -
              -
              -
              - - -
              - - - -
              -
              -
              - -
              -

              Priorities - help -

              -
              - -
              -
              -
              - {{#forEach priorities}} -
              -
              -
              {{name}}
              -

              SLA Overdue: {{durationFormat overdueIn 'minutes'}}

              -
              -
              -
              - Edit - Remove -
              -
              -
              - -
              -
              -
              -
              - - -
              -
              - - -
              -
              - -
              - - - -
              -
              -
              -
              - Cancel - -
              -
              -
              -
              -
              - {{/forEach}} -
              -
              - -
              -

              Danger Zone

              -
              -
              -
              -
              Delete this type
              -

              Once you delete a ticket type, there is no going back. Please be certain.

              -
              -
              - -
              -
              -
              -
              -
              - {{> addPriorityToTypeWindow}} - {{> deleteTicketTypeWindow}} - {{/each}} -
              -
              -
              -
              - {{> createTicketTypeWindow}} -
              - - -
              -
              -
              -
              Ticket Priorities
              -
              - Ticket priorities set the level of SLAs for each ticket. -
              -
              -
              -
              - -
              -
              -
              -
              -
              -
              - {{#each data.priorities}} -
              -
              -
              {{name}}
              -

              SLA Overdue: {{durationFormat overdueIn 'minutes'}}

              -
              -
              -
              - Edit - Remove -
              -
              -
              - -
              -
              -
              -
              - - -
              -
              - - -
              -
              - -
              - - - -
              -
              -
              -
              - Cancel - -
              -
              -
              -
              -
              - - {{> deletePriorityWindow}} - {{/each}} -
              -
              -
              -
              - - {{> createPriorityWindow}} -
              - -
              -
              -
              -
              Ticket Tags
              -
              - Create / Modify Ticket Tags -
              -
              -
              -
              - -
              -
              -
              -
              -
              -
              -
              - -
              -
                -
                -
                -
                -
                - {{> createTagWindow page='settings' }} -
                - -
                - -
                -
                -
                -
                -
                Mailer
                -
                - Preferences for trudesk to send email notifications to users. -
                -
                -
                - -
                - -
                -
                -
                -
                -
                -
                -
                -
                - -
                -
                - - - -
                -
                - - -
                -
                - - -
                -
                - - -
                -
                - - -
                - -
                - - -
                -
                -
                -
                -
                - - -
                -
                -
                -
                Mailer Check
                -
                - Trudesk will periodically check a mailbox for emails to convert to tickets. (Over IMAP) - Settings are applied after server restart -
                -
                -
                - -
                - -
                -
                -
                -
                -
                -
                - - -
                -
                - - -
                -
                - - -
                -
                - - -
                -
                -
                -
                Create Account
                -
                - Create a user account if account does not exist. -
                -
                -
                - -
                - -
                -
                -
                -
                -
                -
                -
                Delete Message
                -
                - Delete email message from INBOX once processed? -
                -
                -
                - -
                - -
                -
                -
                -
                -
                - - -
                -
                - - -
                -
                - -
                -
                -
                -
                -
                -
                - -
                - -
                - -
                -
                -
                -
                -
                TPS
                -
                - Trudesk Push Server authentication for push notifications. Get API Key -
                -
                -
                - -
                - -
                -
                -
                -
                -
                -
                - - -
                -
                - - -
                -
                - -
                -
                -
                -
                -
                -
                - - {{> 'settings/backuprestore'}} - -
                -
                -
                -
                Privacy Policy
                -
                - Paste in HTML / Text of your privacy policy. -
                -
                -
                -
                -
                -
                -
                -
                - -
                -
                - -
                -
                -
                -
                -
                -
                -
                -
                -
                - -{{#contentFor 'js-plugins'}} - -{{/contentFor}} \ No newline at end of file +
                \ No newline at end of file From 390091aa2932e308c3098ca25551ad4505a42133 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sat, 19 Jan 2019 02:26:47 -0500 Subject: [PATCH 16/68] chore(react): updates --- src/client/actions/types.js | 3 + src/client/components/Nav/Sidebar/index.jsx | 2 +- .../components/Settings/Appearance/index.jsx | 2 +- .../components/Settings/General/index.jsx | 13 ++- .../components/Settings/Tickets/index.jsx | 86 +++++++++++++++++++ .../subcomponents/InputWithSave/index.jsx | 12 ++- .../subcomponents/NumberWithSave/index.jsx} | 0 .../subcomponents/SettingItem/index.jsx | 4 +- .../subcomponents/SingleSelect/index.jsx | 23 ++--- src/client/containers/SettingsContainer.jsx | 2 + src/client/reducers/index.js | 2 + .../reducers/settings/generalReducer.js | 15 ---- src/client/reducers/shared/index.js | 16 ++++ src/client/reducers/sidebarReducer.js | 2 - src/public/js/pages/pageloader.js | 7 ++ 15 files changed, 143 insertions(+), 46 deletions(-) create mode 100644 src/client/components/Settings/Tickets/index.jsx rename src/client/{sagas/settings/generalSaga.js => components/Settings/subcomponents/NumberWithSave/index.jsx} (100%) delete mode 100644 src/client/reducers/settings/generalReducer.js create mode 100644 src/client/reducers/shared/index.js diff --git a/src/client/actions/types.js b/src/client/actions/types.js index 312bf1149..4fa733f97 100644 --- a/src/client/actions/types.js +++ b/src/client/actions/types.js @@ -1,6 +1,9 @@ import { defineAction } from 'redux-define'; import { ERROR, SUCCESS } from './stateConstants'; +// Shared +export const SET_SESSION_USER = defineAction('SET_SESSION_USER'); + // Common Nav Change export const NAV_CHANGE = defineAction('NAV_CHANGE'); diff --git a/src/client/components/Nav/Sidebar/index.jsx b/src/client/components/Nav/Sidebar/index.jsx index d14a0aaa8..0bd393f7d 100644 --- a/src/client/components/Nav/Sidebar/index.jsx +++ b/src/client/components/Nav/Sidebar/index.jsx @@ -143,7 +143,7 @@ Sidebar.propTypes = { const mapStateToProps = (state) => ({ activeItem: state.sidebar.activeItem, activeSubItem: state.sidebar.activeSubItem, - sessionUser: state.sidebar.sessionUser + sessionUser: state.shared.sessionUser }); export default connect(mapStateToProps, { updateNavChange })(Sidebar); \ No newline at end of file diff --git a/src/client/components/Settings/Appearance/index.jsx b/src/client/components/Settings/Appearance/index.jsx index 1bfe53177..02a7547a0 100644 --- a/src/client/components/Settings/Appearance/index.jsx +++ b/src/client/components/Settings/Appearance/index.jsx @@ -85,7 +85,7 @@ class AppearanceSettings extends React.Component { }; } - componentDidUpdate(prevProp, prevState) { + componentDidUpdate() { const colorScheme = this.calcColorScheme(); if (this.state.selectedColorScheme !== colorScheme) this.setState({ diff --git a/src/client/components/Settings/General/index.jsx b/src/client/components/Settings/General/index.jsx index 473523040..138c69175 100644 --- a/src/client/components/Settings/General/index.jsx +++ b/src/client/components/Settings/General/index.jsx @@ -43,6 +43,11 @@ class GeneralSettings extends React.Component { }).sort(function(a, b) { return a.utc - b.utc; }); } + onTimezoneChange(e) { + if (e.target.value) + this.updateSetting('timezone', 'gen:timezone', e.target.value); + } + render() { const { active } = this.props; @@ -55,7 +60,7 @@ class GeneralSettings extends React.Component { ); const Timezone = ( - + { this.onTimezoneChange(e); }} /> ); const AllowUserRegistration = ( @@ -71,13 +76,13 @@ class GeneralSettings extends React.Component { Moment.js Format Options}> + } /> + } /> + } /> diff --git a/src/client/components/Settings/Tickets/index.jsx b/src/client/components/Settings/Tickets/index.jsx new file mode 100644 index 000000000..e97f385c5 --- /dev/null +++ b/src/client/components/Settings/Tickets/index.jsx @@ -0,0 +1,86 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import {connect} from 'react-redux'; +import SettingItem from 'components/Settings/subcomponents/SettingItem'; +import SingleSelect from 'components/Settings/subcomponents/SingleSelect'; + +import { updateSetting } from 'actions/settings'; +import EnableSwitch from 'components/Settings/subcomponents/EnableSwitch'; +import NumberWithSave from 'components/Settings/subcomponents/NumberWithSave'; + +class TicketsSettings extends React.Component { + constructor(props) { + super(props); + this.state = { + viewData: window.trudesk.viewdata + }; + } + + getSetting(name) { + return ((this.props.settings.getIn(['settings', name, 'value'])) ? this.props.settings.getIn(['settings', name, 'value']) : '' ); + } + + getTicketTypes() { + return ((this.props.settings && this.props.settings.get('ticketTypes')) ? this.props.settings.get('ticketTypes').toArray() : []); + } + + onDefaultTicketTypeChange(e) { + this.props.updateSetting({name: 'ticket:type:default', value: e.target.value, stateName: 'defaultTicketType'}); + } + + onAllowPublicTicketsChange(e) { + this.props.updateSetting({name: 'allowPublicTickets:enable', value: e.target.checked, stateName: 'allowPublicTickets'}); + } + + onShowOverdueChange(e) { + this.props.updateSetting({name: 'showOverdueTickets:enable', value: e.target.checked, stateName: 'showOverdueTickets'}); + } + + render() { + const { active } = this.props; + const { viewData } = this.state; + const mappedTypes = this.getTicketTypes().map(function(type) { + return {text: type.get('name'), value: type.get('_id') }; + }); + + return ( +
                + { this.onDefaultTicketTypeChange(e); }} width={'50%'} /> + }/> + Allow the creation of tickets by users that are unregistered. ({viewData.hosturl + '/newissue'})
                } + component={ + { this.onAllowPublicTicketsChange(e); }} /> + } + /> + { this.onShowOverdueChange(e); }}/> + }/> + + }/> + + }/> +
                + ); + } +} + +TicketsSettings.propTypes = { + active: PropTypes.bool.isRequired, + settings: PropTypes.object.isRequired, + updateSetting: PropTypes.func.isRequired +}; + +const mapStateToProps = (state) => ({ + settings: state.settings.settings +}); + +export default connect(mapStateToProps, { updateSetting })(TicketsSettings); \ No newline at end of file diff --git a/src/client/components/Settings/subcomponents/InputWithSave/index.jsx b/src/client/components/Settings/subcomponents/InputWithSave/index.jsx index e6bcde49a..c3c214ef6 100644 --- a/src/client/components/Settings/subcomponents/InputWithSave/index.jsx +++ b/src/client/components/Settings/subcomponents/InputWithSave/index.jsx @@ -39,13 +39,17 @@ class InputWithSave extends React.Component { } render() { + let width = '100%'; + if (this.props.width) + width = this.props.width; + return ( -
                +
                this.updateValue(evt)} />
                - +
                ); @@ -56,7 +60,9 @@ InputWithSave.propTypes = { updateSetting: PropTypes.func.isRequired, settingName: PropTypes.string.isRequired, stateName: PropTypes.string.isRequired, - value: PropTypes.string + saveLabel: PropTypes.string, + value: PropTypes.string, + width: PropTypes.string }; export default connect(null, { updateSetting })(InputWithSave); \ No newline at end of file diff --git a/src/client/sagas/settings/generalSaga.js b/src/client/components/Settings/subcomponents/NumberWithSave/index.jsx similarity index 100% rename from src/client/sagas/settings/generalSaga.js rename to src/client/components/Settings/subcomponents/NumberWithSave/index.jsx diff --git a/src/client/components/Settings/subcomponents/SettingItem/index.jsx b/src/client/components/Settings/subcomponents/SettingItem/index.jsx index 27a64a36e..76b1885f7 100644 --- a/src/client/components/Settings/subcomponents/SettingItem/index.jsx +++ b/src/client/components/Settings/subcomponents/SettingItem/index.jsx @@ -21,14 +21,14 @@ class SettingItem extends React.Component { cursor: 'pointer', lineHeight: '3px', marginLeft: '4px'}} - data-uk-tooltip title={tooltip}>error + data-uk-tooltip="{cls:'long-text'}" title={tooltip}>error }
                { subTitle }
                -
                +
                { component }
                diff --git a/src/client/components/Settings/subcomponents/SingleSelect/index.jsx b/src/client/components/Settings/subcomponents/SingleSelect/index.jsx index fba2ef399..68606c8a4 100644 --- a/src/client/components/Settings/subcomponents/SingleSelect/index.jsx +++ b/src/client/components/Settings/subcomponents/SingleSelect/index.jsx @@ -1,12 +1,9 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; import $ from 'jquery'; import helpers from 'lib/helpers'; -import { updateSetting } from 'actions/settings'; - class SingleSelect extends React.Component { constructor(props) { super(props); @@ -39,20 +36,13 @@ class SingleSelect extends React.Component { return null; } - valueChanged(value) { - this.props.updateSetting({name: this.props.settingName, value: value, stateName: this.props.stateName}); - } - - updateValue(evt) { - if (evt.target.value && (evt.target.value !== this.state.value)) - this.valueChanged(evt.target.value); - } - render() { const { items } = this.props; - let width = '75%'; + let width = '100%'; if (this.select && this.select.selectize) { + this.select.selectize.addOption(this.props.items); + this.select.selectize.refreshOptions(false); this.select.selectize.addItem(this.state.value, true); } @@ -60,7 +50,7 @@ class SingleSelect extends React.Component { width = this.props.width; return ( -
                +
                this.updateValue(evt)} /> +
                +
                + ); + } +} + +NumberWithSave.propTypes = { + updateSetting: PropTypes.func.isRequired, + settingName: PropTypes.string.isRequired, + stateName: PropTypes.string.isRequired, + value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), + width: PropTypes.string +}; + +export default connect(null, { updateSetting })(NumberWithSave); \ No newline at end of file diff --git a/src/public/js/angularjs/controllers/settings.js b/src/public/js/angularjs/controllers/settings.js index dd2376502..582b622bc 100644 --- a/src/public/js/angularjs/controllers/settings.js +++ b/src/public/js/angularjs/controllers/settings.js @@ -225,97 +225,6 @@ define([ }); } - // Color Scheme Select - var $colorSchemeSelect = $('#colorSchemeSelect'); - if ($scope.colorSecondary === '#2f3640') - $colorSchemeSelect[0].selectize.setValue('dark', true); - else if ($scope.colorTertiary === '#ee2b47') - $colorSchemeSelect[0].selectize.setValue('midnight', true); - else if ($scope.colorHeaderBG === '#2e3238') - $colorSchemeSelect[0].selectize.setValue('moonlight', true); - else if ($scope.colorTertiary === '#f67280') - $colorSchemeSelect[0].selectize.setValue('purplerain', true); - else if ($scope.colorHeaderBG === '#112d4e') - $colorSchemeSelect[0].selectize.setValue('bluejean', true); - else if ($scope.colorHeaderBG === '#625757') - $colorSchemeSelect[0].selectize.setValue('sandstone', true); - else if ($scope.colorHeaderBG === '#404969') - $colorSchemeSelect[0].selectize.setValue('winterfire', true); - - $colorSchemeSelect.on('change', function(e) { - $scope.$apply(function() { - var val = $colorSchemeSelect.val(); - switch (val) { - case 'light': - $scope.revertColor('colorHeaderBG', '#42464d'); - $scope.revertColor('colorHeaderPrimary', '#f6f7f8'); - $scope.revertColor('colorPrimary', '#606771'); - $scope.revertColor('colorSecondary', '#f7f8fa'); - $scope.revertColor('colorTertiary', '#e74c3c'); - $scope.revertColor('colorQuaternary', '#e6e7e8'); - break; - case 'dark': - $scope.revertColor('colorHeaderBG', '#242a31'); - $scope.revertColor('colorHeaderPrimary', '#f6f7f8'); - $scope.revertColor('colorPrimary', '#f6f7f8'); - $scope.revertColor('colorSecondary', '#2f3640'); - $scope.revertColor('colorTertiary', '#e74c3c'); - $scope.revertColor('colorQuaternary', '#454f5d'); - break; - case 'bluejean': - $scope.revertColor('colorHeaderBG', '#112d4e'); - $scope.revertColor('colorHeaderPrimary', '#f9f7f7'); - $scope.revertColor('colorPrimary', '#112d4e'); - $scope.revertColor('colorSecondary', '#f9f7f7'); - $scope.revertColor('colorTertiary', '#3f72af'); - $scope.revertColor('colorQuaternary', '#dbe2ef'); - break; - case 'midnight': - $scope.revertColor('colorHeaderBG', '#2c2e3e'); - $scope.revertColor('colorHeaderPrimary', '#f6f6f6'); - $scope.revertColor('colorPrimary', '#444a54'); - $scope.revertColor('colorSecondary', '#c8c8c8'); - $scope.revertColor('colorTertiary', '#ee2b47'); - $scope.revertColor('colorQuaternary', '#2c2e3e'); - break; - case 'moonlight': - $scope.revertColor('colorHeaderBG', '#2e3238'); - $scope.revertColor('colorHeaderPrimary', '#eeeeee'); - $scope.revertColor('colorPrimary', '#444a54'); - $scope.revertColor('colorSecondary', '#c8c8c8'); - $scope.revertColor('colorTertiary', '#7971ea'); - $scope.revertColor('colorQuaternary', '#444a54'); - break; - case 'purplerain': - $scope.revertColor('colorHeaderBG', '#393041'); - $scope.revertColor('colorHeaderPrimary', '#f6f6f6'); - $scope.revertColor('colorPrimary', '#393041'); - $scope.revertColor('colorSecondary', '#d2cbd8'); - $scope.revertColor('colorTertiary', '#f67280'); - $scope.revertColor('colorQuaternary', '#52455f'); - break; - case 'sandstone': - $scope.revertColor('colorHeaderBG', '#625757'); - $scope.revertColor('colorHeaderPrimary', '#f9f9f9'); - $scope.revertColor('colorPrimary', '#625757'); - $scope.revertColor('colorSecondary', '#dfdfdf'); - $scope.revertColor('colorTertiary', '#ef5a5a'); - $scope.revertColor('colorQuaternary', '#6f6363'); - break; - case 'winterfire': - $scope.revertColor('colorHeaderBG', '#404969'); - $scope.revertColor('colorHeaderPrimary', '#ebf0f6'); - $scope.revertColor('colorPrimary', '#404969'); - $scope.revertColor('colorSecondary', '#ebf0f6'); - $scope.revertColor('colorTertiary', '#ff7f50'); - $scope.revertColor('colorQuaternary', '#4a5479'); - break; - } - - $scope.saveColorScheme(e); - }); - }); - // Load MailCheckTicketType from settings var $mailerCheckTicketTypeSelect = $('#mailerCheckTicketType'); var $selectizeTicketType = $mailerCheckTicketTypeSelect[0].selectize; @@ -563,123 +472,6 @@ define([ }); }; - $scope.saveShortDateFormatClicked = function() { - $http.put('/api/v1/settings', { - name: 'gen:shortDateFormat', - value: $scope.shortDateFormat - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - SettingsService.getSettings().shortDateFormat.value = $scope.shortDateFormat; - helpers.UI.showSnackbar('Setting Saved.', false); - }, function errorCallback(err) { - helpers.showSnackbar('Error: ' + err, true); - $log.error(err); - }); - }; - - $scope.saveLongDateFormatClicked = function() { - $http.put('/api/v1/settings', { - name: 'gen:longDateFormat', - value: $scope.longDateFormat - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - SettingsService.getSettings().longDateFormat.value = $scope.longDateFormat; - helpers.UI.showSnackbar('Setting Saved.', false); - }, function errorCallback(err) { - helpers.showSnackbar('Error: ' + err, true); - $log.error(err); - }); - }; - - $scope.saveSiteTitleClicked = function() { - $http.put('/api/v1/settings', { - name: 'gen:sitetitle', - value: $scope.siteTitle - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - helpers.UI.showSnackbar('Site title saved successfully.', false); - }, function errorCallback(err) { - helpers.UI.showSnackbar('Error: ' + err, true); - $log.error(err); - }); - }; - - $scope.saveSiteUrlClicked = function() { - $http.put('/api/v1/settings', { - name: 'gen:siteurl', - value: $scope.siteUrl - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - helpers.UI.showSnackbar('Site URL saved successfully.', false); - }, function errorCallback(err) { - helpers.UI.showSnackbar('Error: ' + err, true); - $log.error(err); - }); - }; - - $scope.removeCustomLogo = function(event) { - event.preventDefault(); - $http.put('/api/v1/settings', { - name: 'gen:customlogo', - value: false - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - $window.location.reload(); - }, function errorCallback(err) { - helpers.UI.showSnackbar('Error: ' + err, true); - $log.error(err); - }); - }; - - $scope.removeCustomPageLogo = function(event) { - event.preventDefault(); - $http.put('/api/v1/settings', { - name: 'gen:custompagelogo', - value: false - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - $window.location.reload(); - }, function errorCallback(err) { - helpers.UI.showSnackbar('Error: ' + err, true); - $log.error(err); - }); - }; - - $scope.removeCustomFavicon = function(event) { - event.preventDefault(); - $http.put('/api/v1/settings', { - name: 'gen:customfavicon', - value: false - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - $window.location.reload(); - }, function errorCallback(err) { - helpers.UI.showSnackbar('Error: ' + err, true); - $log.error(err); - }); - }; - $scope.mailerEnabledChange = function() { var vm = this; $scope.mailerEnabled = vm.mailerEnabled; @@ -917,83 +709,6 @@ define([ }); }; - $scope.showOverdueTicketsChanged = function() { - var vm = this; - $scope.showOverdueTickets = vm.showOverdueTickets; - - $http.put('/api/v1/settings', { - name: 'showOverdueTickets:enable', - value: $scope.showOverdueTickets - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - - }, function errorCallback(err) { - helpers.UI.showSnackbar(err, true); - }); - }; - - $scope.allowPublicTicketsChanged = function() { - var vm = this; - $scope.allowPublicTickets = vm.allowPublicTickets; - - $http.put('/api/v1/settings', { - name: 'allowPublicTickets:enable', - value: $scope.allowPublicTickets - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - - }, function errorCallback(err) { - helpers.UI.showSnackbar(err, true); - }); - }; - - function saveMinLength(settingName, length) { - $http.put('/api/v1/settings', { - name: settingName, - value: length - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - helpers.UI.showSnackbar('Setting Saved.', false); - }, function errorCallback(err) { - helpers.UI.showSnackbar(err, true); - }); - } - - $scope.saveMinSubjectLengthClick = function() { - saveMinLength('ticket:minlength:subject', $scope.minSubjectLength); - }; - - $scope.saveMinIssueLengthClick = function() { - saveMinLength('ticket:minlength:issue', $scope.minIssueLength); - }; - - $scope.allowUserRegistrationChanged = function() { - var vm = this; - $scope.allowUserRegistration = vm.allowUserRegistration; - - $http.put('/api/v1/settings', { - name: 'allowUserRegistration:enable', - value: $scope.allowUserRegistration - }, { - headers: { - 'Content-Type': 'application/json' - } - }).then(function successCallback() { - - }, function errorCallback(err) { - helpers.UI.showSnackbar(err, true); - }); - }; - $scope.showCreateTicketTypeWindow = function($event) { $event.preventDefault(); var createTicketTypeModal = $('#createTicketTypeModal'); From ace1fae14b8887bbd67ec433d84afabdc1ef52bd Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 20 Jan 2019 02:12:06 -0500 Subject: [PATCH 18/68] chore(api): GET single setting --- src/controllers/api/v1/settings.js | 12 ++++++++++++ src/routes/index.js | 1 + 2 files changed, 13 insertions(+) diff --git a/src/controllers/api/v1/settings.js b/src/controllers/api/v1/settings.js index 30fdff7fb..3a8e6be92 100644 --- a/src/controllers/api/v1/settings.js +++ b/src/controllers/api/v1/settings.js @@ -36,6 +36,18 @@ apiSettings.getSettings = function(req, res) { }); }; +apiSettings.getSingleSetting = function(req, res) { + settingsUtil.getSettings(function(err, settings) { + if (err) return res.status(400).json({success: false, error: err}); + + var setting = settings.data.settings[req.params.name]; + if (!setting) + return res.status(400).json({success: false, error: 'invalid setting'}); + + return res.json({success: true, setting: setting}); + }); +}; + /** * @api {put} /api/v1/settings/:setting Update Setting * @apiName updateSetting diff --git a/src/routes/index.js b/src/routes/index.js index 9030874f8..ff49124bf 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -230,6 +230,7 @@ function mainRoutes(router, middleware, controllers) { router.get('/api/v1/settings', middleware.api, controllers.api.settings.getSettings); router.put('/api/v1/settings', middleware.api, controllers.api.settings.updateSetting); + router.get('/api/v1/settings/:name', middleware.api, controllers.api.settings.getSingleSetting); router.post('/api/v1/settings/testmailer', middleware.api, controllers.api.settings.testMailer); router.get('/api/v1/settings/buildsass', middleware.api, controllers.api.settings.buildsass); From 211d2c14f71d5dbb679861bbb158bd2c990b46dd Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 20 Jan 2019 16:49:05 -0500 Subject: [PATCH 19/68] chore(merge): fixed --- webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index e10cfee5d..d8404f92c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -78,7 +78,7 @@ module.exports = { inlineAttachment: 'vendor/easymde/dist/inline-attachment', inputInlineAttachment: 'vendor/easymde/dist/input.inline-attachment', cm4InlineAttachment: 'vendor/easymde/dist/codemirror-4.inline-attachment', - snackbar: 'plugins/snackbar' + snackbar: 'plugins/snackbar', sass: path.resolve(__dirname, 'src/sass'), components: path.resolve(__dirname, 'src/client/components'), From 957ca0ffd96d2ac716b946aea66c1892c031197d Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 20 Jan 2019 17:09:09 -0500 Subject: [PATCH 20/68] chore(copyright): notice update --- src/backup/backup.js | 22 +++++++------- src/backup/restore.js | 22 +++++++------- src/cache/index.js | 22 +++++++------- src/cache/node-cache.js | 14 +++++++++ src/cache/quickStats.js | 24 +++++++-------- src/cache/rediscache.js | 24 +++++++-------- src/cache/tagStats.js | 24 +++++++-------- src/cache/ticketStats.js | 24 +++++++-------- src/client/actions/nav.js | 14 +++++++++ src/client/actions/settings.js | 14 +++++++++ src/client/actions/stateConstants.js | 14 +++++++++ src/client/actions/types.js | 14 +++++++++ src/client/api/index.js | 14 +++++++++ src/client/app.jsx | 14 +++++++++ src/client/components/Button/index.jsx | 14 +++++++++ .../components/Nav/NavSeperator/index.jsx | 14 +++++++++ src/client/components/Nav/Sidebar/index.jsx | 14 +++++++++ src/client/components/Nav/Sidebar/style.sass | 14 +++++++++ .../components/Nav/SidebarItem/index.jsx | 14 +++++++++ .../components/Nav/SidebarItem/style.sass | 14 +++++++++ src/client/components/Nav/Submenu/index.jsx | 14 +++++++++ src/client/components/Nav/Submenu/style.sass | 14 +++++++++ .../components/Nav/SubmenuItem/index.jsx | 14 +++++++++ .../components/Settings/Appearance/index.jsx | 14 +++++++++ .../components/Settings/General/index.jsx | 14 +++++++++ .../components/Settings/Tickets/index.jsx | 14 +++++++++ .../subcomponents/ColorSelector/index.jsx | 14 +++++++++ .../subcomponents/EnableSwitch/index.jsx | 14 +++++++++ .../subcomponents/InputWithSave/index.jsx | 14 +++++++++ .../Settings/subcomponents/Menu/index.jsx | 14 +++++++++ .../Settings/subcomponents/MenuItem/index.jsx | 14 +++++++++ .../subcomponents/NumberWithSave/index.jsx | 14 +++++++++ .../subcomponents/SettingItem/index.jsx | 14 +++++++++ .../subcomponents/SettingSubItem/index.jsx | 14 +++++++++ .../subcomponents/SingleSelect/index.jsx | 14 +++++++++ .../subcomponents/UploadButtonWithX/index.jsx | 14 +++++++++ src/client/containers/SettingsContainer.jsx | 14 +++++++++ src/client/lib/history.js | 14 +++++++++ src/client/reducers/index.js | 14 +++++++++ src/client/reducers/settings/index.js | 14 +++++++++ src/client/reducers/shared/index.js | 14 +++++++++ src/client/reducers/sidebarReducer.js | 14 +++++++++ src/client/renderer.jsx | 14 +++++++++ src/client/sagas/index.js | 14 +++++++++ src/client/sagas/settings/index.js | 14 +++++++++ src/emitter/events.js | 24 +++++++-------- src/emitter/index.js | 24 +++++++-------- src/helpers/hbs/helpers.js | 22 +++++++------- src/helpers/plugins/index.js | 24 +++++++-------- src/helpers/utils/index.js | 24 +++++++-------- src/helpers/viewdata/index.js | 24 +++++++-------- src/ldap/index.js | 24 +++++++-------- src/mailer/index.js | 24 +++++++-------- src/mailer/mailCheck.js | 24 +++++++-------- src/memory/index.js | 14 +++++++++ src/models/attachment.js | 24 +++++++-------- src/models/chat/conversation.js | 24 +++++++-------- src/models/chat/message.js | 2 +- src/models/comment.js | 24 +++++++-------- src/models/counters.js | 24 +++++++-------- src/models/group.js | 24 +++++++-------- src/models/history.js | 24 +++++++-------- src/models/note.js | 24 +++++++-------- src/models/notification.js | 24 +++++++-------- src/models/setting.js | 24 +++++++-------- src/models/tag.js | 24 +++++++-------- src/models/task.js | 24 +++++++-------- src/models/ticket.js | 24 +++++++-------- src/models/ticketpriority.js | 24 +++++++-------- src/models/tickettype.js | 24 +++++++-------- src/models/user.js | 24 +++++++-------- src/public/js/angularjs/controllers.js | 26 ++++++++--------- .../js/angularjs/controllers/accounts.js | 26 ++++++++--------- src/public/js/angularjs/controllers/common.js | 26 ++++++++--------- src/public/js/angularjs/controllers/groups.js | 26 ++++++++--------- .../js/angularjs/controllers/messages.js | 26 ++++++++--------- .../js/angularjs/controllers/notices.js | 26 ++++++++--------- .../js/angularjs/controllers/plugins.js | 26 ++++++++--------- .../js/angularjs/controllers/profile.js | 26 ++++++++--------- .../js/angularjs/controllers/reports.js | 26 ++++++++--------- .../angularjs/controllers/settings-backup.js | 26 ++++++++--------- .../js/angularjs/controllers/settings.js | 26 ++++++++--------- .../js/angularjs/controllers/singleTicket.js | 26 ++++++++--------- .../js/angularjs/controllers/tickets.js | 26 ++++++++--------- src/public/js/angularjs/main.js | 26 ++++++++--------- src/public/js/angularjs/services.js | 26 ++++++++--------- src/public/js/angularjs/services/session.js | 26 ++++++++--------- .../js/angularjs/services/settingsService.js | 26 ++++++++--------- src/public/js/app.js | 26 ++++++++--------- src/public/js/modules/ajaxify.js | 26 ++++++++--------- src/public/js/modules/ajaximgupload.js | 26 ++++++++--------- src/public/js/modules/attachmentUpload.js | 26 ++++++++--------- src/public/js/modules/chat.js | 26 ++++++++--------- src/public/js/modules/helpers.js | 26 ++++++++--------- src/public/js/modules/navigation.js | 26 ++++++++--------- .../js/modules/socket.io/accountsImporter.js | 26 ++++++++--------- src/public/js/modules/socket.io/logs.io.js | 26 ++++++++--------- src/public/js/modules/socket.io/noticeUI.js | 26 ++++++++--------- src/public/js/modules/socket.io/ticketsUI.js | 26 ++++++++--------- src/public/js/modules/socket.js | 26 ++++++++--------- src/public/js/modules/tour.js | 26 ++++++++--------- src/public/js/modules/ui.js | 26 ++++++++--------- src/public/js/pages/accounts.js | 26 ++++++++--------- src/public/js/pages/accountsImport.js | 26 ++++++++--------- src/public/js/pages/createNotice.js | 26 ++++++++--------- src/public/js/pages/dashboard.js | 26 ++++++++--------- src/public/js/pages/editaccount.js | 26 ++++++++--------- src/public/js/pages/groups.js | 26 ++++++++--------- src/public/js/pages/logs.js | 26 ++++++++--------- src/public/js/pages/messages.js | 26 ++++++++--------- src/public/js/pages/notices.js | 26 ++++++++--------- src/public/js/pages/pageloader.js | 29 +++++++++---------- src/public/js/pages/plugins.js | 26 ++++++++--------- src/public/js/pages/profile.js | 26 ++++++++--------- src/public/js/pages/reports.js | 26 ++++++++--------- src/public/js/pages/reportsBreakdown.js | 26 ++++++++--------- src/public/js/pages/settings.js | 26 ++++++++--------- src/public/js/pages/settingsTicketTypes.js | 26 ++++++++--------- src/public/js/pages/singleTicket.js | 26 ++++++++--------- src/public/js/pages/tags.js | 26 ++++++++--------- src/public/js/pages/tickets.js | 26 ++++++++--------- src/public/js/sessionLoader.js | 26 ++++++++--------- src/public/js/truRequire.js | 14 +++++++++ src/sass/_settings.sass | 14 +++++++++ src/sass/_settings_theme_dark.sass | 14 +++++++++ src/sass/app.sass | 14 +++++++++ src/sass/buildsass.js | 22 +++++++------- src/sass/functions.sass | 14 +++++++++ src/sass/mixins.sass | 14 +++++++++ src/sass/partials/barchart.sass | 14 +++++++++ src/sass/partials/c3.sass | 14 +++++++++ src/sass/partials/calendar.sass | 14 +++++++++ src/sass/partials/chat.sass | 14 +++++++++ src/sass/partials/chosen.sass | 14 +++++++++ src/sass/partials/common.sass | 14 +++++++++ src/sass/partials/contextmenu.sass | 14 +++++++++ src/sass/partials/dashboard.sass | 14 +++++++++ src/sass/partials/datatables.sass | 14 +++++++++ src/sass/partials/donutchart.sass | 14 +++++++++ src/sass/partials/easymde.sass | 14 +++++++++ src/sass/partials/fab.sass | 14 +++++++++ src/sass/partials/flottooltip.sass | 14 +++++++++ src/sass/partials/loader.sass | 14 +++++++++ src/sass/partials/materialize.scss | 14 +++++++++ src/sass/partials/messages.sass | 14 +++++++++ src/sass/partials/mg.sass | 14 +++++++++ src/sass/partials/modal.sass | 14 +++++++++ src/sass/partials/notifications.sass | 14 +++++++++ src/sass/partials/offcanvas.sass | 14 +++++++++ src/sass/partials/onoffswitch.sass | 14 +++++++++ src/sass/partials/pace.sass | 14 +++++++++ src/sass/partials/searchbox.scss | 14 +++++++++ src/sass/partials/selectize.sass | 14 +++++++++ src/sass/partials/servers.sass | 14 +++++++++ src/sass/partials/settings.sass | 14 +++++++++ src/sass/partials/sidebar.sass | 14 +++++++++ src/sass/partials/sidebarBottomPanel.sass | 14 +++++++++ src/sass/partials/svgcheck.sass | 14 +++++++++ src/sass/partials/tLoader.sass | 14 +++++++++ src/sass/partials/tickets.sass | 14 +++++++++ src/sass/partials/topnav.sass | 14 +++++++++ src/sass/partials/trucard.sass | 14 +++++++++ src/sass/partials/trutab.sass | 14 +++++++++ src/sass/partials/typingbubble.sass | 14 +++++++++ src/sass/partials/ui.sass | 14 +++++++++ src/sass/partials/waves.sass | 14 +++++++++ src/sass/partials/wizard.scss | 14 +++++++++ src/socketserver.js | 25 ++++++++-------- src/webserver.js | 22 +++++++------- 169 files changed, 2228 insertions(+), 1070 deletions(-) diff --git a/src/backup/backup.js b/src/backup/backup.js index 42339aa33..cf547a0fd 100644 --- a/src/backup/backup.js +++ b/src/backup/backup.js @@ -1,15 +1,15 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 12/17/2018 - Author: Chris Brame - + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. */ var fs = require('fs-extra'); diff --git a/src/backup/restore.js b/src/backup/restore.js index 4efc8277c..582d414a3 100644 --- a/src/backup/restore.js +++ b/src/backup/restore.js @@ -1,15 +1,15 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 12/17/2018 - Author: Chris Brame - + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. */ var _ = require('lodash'); diff --git a/src/cache/index.js b/src/cache/index.js index 45baa529f..68ff73bbc 100644 --- a/src/cache/index.js +++ b/src/cache/index.js @@ -1,15 +1,15 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/16/2016 - Author: Chris Brame - + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. */ var NodeCache = require('node-cache'), diff --git a/src/cache/node-cache.js b/src/cache/node-cache.js index acabe0627..f3eeb9b33 100644 --- a/src/cache/node-cache.js +++ b/src/cache/node-cache.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + (function() { var EventEmitter, _, clone, bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, diff --git a/src/cache/quickStats.js b/src/cache/quickStats.js index 7d27806f0..61558cd6b 100644 --- a/src/cache/quickStats.js +++ b/src/cache/quickStats.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/24/2016 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var async = require('async'); diff --git a/src/cache/rediscache.js b/src/cache/rediscache.js index 11443024d..675394181 100644 --- a/src/cache/rediscache.js +++ b/src/cache/rediscache.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 05/03/2017 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var redis = require('redis'); diff --git a/src/cache/tagStats.js b/src/cache/tagStats.js index 77e75ddb7..6cb712514 100644 --- a/src/cache/tagStats.js +++ b/src/cache/tagStats.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/15/2016 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var async = require('async'); diff --git a/src/cache/ticketStats.js b/src/cache/ticketStats.js index a4243ec9c..02c5fe7e5 100644 --- a/src/cache/ticketStats.js +++ b/src/cache/ticketStats.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/15/2016 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var async = require('async'); diff --git a/src/client/actions/nav.js b/src/client/actions/nav.js index e350b058f..e09f48c20 100644 --- a/src/client/actions/nav.js +++ b/src/client/actions/nav.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import { createAction } from 'redux-actions'; import { NAV_CHANGE } from './types'; diff --git a/src/client/actions/settings.js b/src/client/actions/settings.js index b90ebfdc7..0c40244b7 100644 --- a/src/client/actions/settings.js +++ b/src/client/actions/settings.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import { createAction } from 'redux-actions'; import {FETCH_SETTINGS, UPDATE_SETTING, UPDATE_MULTIPLE_SETTINGS, UPDATE_COLORSCHEME} from './types'; diff --git a/src/client/actions/stateConstants.js b/src/client/actions/stateConstants.js index 79ae15110..6a2ff2f06 100644 --- a/src/client/actions/stateConstants.js +++ b/src/client/actions/stateConstants.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + export const PENDING = 'PENDING'; export const ERROR = 'ERROR'; export const SUCCESS = 'SUCCESS'; \ No newline at end of file diff --git a/src/client/actions/types.js b/src/client/actions/types.js index 4fa733f97..e792911da 100644 --- a/src/client/actions/types.js +++ b/src/client/actions/types.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import { defineAction } from 'redux-define'; import { ERROR, SUCCESS } from './stateConstants'; diff --git a/src/client/api/index.js b/src/client/api/index.js index 1a2a5394b..e66495166 100644 --- a/src/client/api/index.js +++ b/src/client/api/index.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import axios from 'axios'; let api = {}; diff --git a/src/client/app.jsx b/src/client/app.jsx index 1d5bdb22c..678375f76 100644 --- a/src/client/app.jsx +++ b/src/client/app.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import ReactDOM from 'react-dom'; import { applyMiddleware, createStore, compose } from 'redux'; diff --git a/src/client/components/Button/index.jsx b/src/client/components/Button/index.jsx index 72e483c1c..5749884a4 100644 --- a/src/client/components/Button/index.jsx +++ b/src/client/components/Button/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import isUndefined from 'lodash/isUndefined'; import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Nav/NavSeperator/index.jsx b/src/client/components/Nav/NavSeperator/index.jsx index 436896bb7..4505db982 100644 --- a/src/client/components/Nav/NavSeperator/index.jsx +++ b/src/client/components/Nav/NavSeperator/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; class NavSeperator extends React.Component { diff --git a/src/client/components/Nav/Sidebar/index.jsx b/src/client/components/Nav/Sidebar/index.jsx index 0bd393f7d..55fc284c1 100644 --- a/src/client/components/Nav/Sidebar/index.jsx +++ b/src/client/components/Nav/Sidebar/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Nav/Sidebar/style.sass b/src/client/components/Nav/Sidebar/style.sass index 45f1d4ca6..46e19e2f7 100644 --- a/src/client/components/Nav/Sidebar/style.sass +++ b/src/client/components/Nav/Sidebar/style.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + @import '../../../../../src/sass/mixins.sass' @import '../../../../../src/sass/_settings.sass' diff --git a/src/client/components/Nav/SidebarItem/index.jsx b/src/client/components/Nav/SidebarItem/index.jsx index 52b97222d..26dab9f0c 100644 --- a/src/client/components/Nav/SidebarItem/index.jsx +++ b/src/client/components/Nav/SidebarItem/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React, { Component } from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Nav/SidebarItem/style.sass b/src/client/components/Nav/SidebarItem/style.sass index 8cc31cf2e..855708d76 100644 --- a/src/client/components/Nav/SidebarItem/style.sass +++ b/src/client/components/Nav/SidebarItem/style.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + @import '../../../../../src/sass/mixins.sass' @import '../../../../../src/sass/_settings.sass' diff --git a/src/client/components/Nav/Submenu/index.jsx b/src/client/components/Nav/Submenu/index.jsx index 44b8578de..1f1d4d7b7 100644 --- a/src/client/components/Nav/Submenu/index.jsx +++ b/src/client/components/Nav/Submenu/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React, { Component } from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Nav/Submenu/style.sass b/src/client/components/Nav/Submenu/style.sass index e5ab5f2fb..74ae34313 100644 --- a/src/client/components/Nav/Submenu/style.sass +++ b/src/client/components/Nav/Submenu/style.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + @import '../../../../../src/sass/mixins.sass' @import '../../../../../src/sass/_settings.sass' diff --git a/src/client/components/Nav/SubmenuItem/index.jsx b/src/client/components/Nav/SubmenuItem/index.jsx index 64cf4a473..8a7510281 100644 --- a/src/client/components/Nav/SubmenuItem/index.jsx +++ b/src/client/components/Nav/SubmenuItem/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Settings/Appearance/index.jsx b/src/client/components/Settings/Appearance/index.jsx index 02a7547a0..637081e61 100644 --- a/src/client/components/Settings/Appearance/index.jsx +++ b/src/client/components/Settings/Appearance/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; diff --git a/src/client/components/Settings/General/index.jsx b/src/client/components/Settings/General/index.jsx index 138c69175..3426471ce 100644 --- a/src/client/components/Settings/General/index.jsx +++ b/src/client/components/Settings/General/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; diff --git a/src/client/components/Settings/Tickets/index.jsx b/src/client/components/Settings/Tickets/index.jsx index e97f385c5..e9470f707 100644 --- a/src/client/components/Settings/Tickets/index.jsx +++ b/src/client/components/Settings/Tickets/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; import {connect} from 'react-redux'; diff --git a/src/client/components/Settings/subcomponents/ColorSelector/index.jsx b/src/client/components/Settings/subcomponents/ColorSelector/index.jsx index d337a2352..bb8db76f7 100644 --- a/src/client/components/Settings/subcomponents/ColorSelector/index.jsx +++ b/src/client/components/Settings/subcomponents/ColorSelector/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Settings/subcomponents/EnableSwitch/index.jsx b/src/client/components/Settings/subcomponents/EnableSwitch/index.jsx index 73ea2b049..6f6701073 100644 --- a/src/client/components/Settings/subcomponents/EnableSwitch/index.jsx +++ b/src/client/components/Settings/subcomponents/EnableSwitch/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Settings/subcomponents/InputWithSave/index.jsx b/src/client/components/Settings/subcomponents/InputWithSave/index.jsx index c3c214ef6..0d2ce5b93 100644 --- a/src/client/components/Settings/subcomponents/InputWithSave/index.jsx +++ b/src/client/components/Settings/subcomponents/InputWithSave/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; diff --git a/src/client/components/Settings/subcomponents/Menu/index.jsx b/src/client/components/Settings/subcomponents/Menu/index.jsx index a3427f8c6..b8bf6fbc4 100644 --- a/src/client/components/Settings/subcomponents/Menu/index.jsx +++ b/src/client/components/Settings/subcomponents/Menu/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Settings/subcomponents/MenuItem/index.jsx b/src/client/components/Settings/subcomponents/MenuItem/index.jsx index f1d5c75b1..b63240928 100644 --- a/src/client/components/Settings/subcomponents/MenuItem/index.jsx +++ b/src/client/components/Settings/subcomponents/MenuItem/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Settings/subcomponents/NumberWithSave/index.jsx b/src/client/components/Settings/subcomponents/NumberWithSave/index.jsx index e20d7a046..2384011e9 100644 --- a/src/client/components/Settings/subcomponents/NumberWithSave/index.jsx +++ b/src/client/components/Settings/subcomponents/NumberWithSave/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; diff --git a/src/client/components/Settings/subcomponents/SettingItem/index.jsx b/src/client/components/Settings/subcomponents/SettingItem/index.jsx index 76b1885f7..ef8825576 100644 --- a/src/client/components/Settings/subcomponents/SettingItem/index.jsx +++ b/src/client/components/Settings/subcomponents/SettingItem/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Settings/subcomponents/SettingSubItem/index.jsx b/src/client/components/Settings/subcomponents/SettingSubItem/index.jsx index 6be68cc0e..53b01b66c 100644 --- a/src/client/components/Settings/subcomponents/SettingSubItem/index.jsx +++ b/src/client/components/Settings/subcomponents/SettingSubItem/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/components/Settings/subcomponents/SingleSelect/index.jsx b/src/client/components/Settings/subcomponents/SingleSelect/index.jsx index 68606c8a4..b47d088e7 100644 --- a/src/client/components/Settings/subcomponents/SingleSelect/index.jsx +++ b/src/client/components/Settings/subcomponents/SingleSelect/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; import $ from 'jquery'; diff --git a/src/client/components/Settings/subcomponents/UploadButtonWithX/index.jsx b/src/client/components/Settings/subcomponents/UploadButtonWithX/index.jsx index bbc8b2030..2613db955 100644 --- a/src/client/components/Settings/subcomponents/UploadButtonWithX/index.jsx +++ b/src/client/components/Settings/subcomponents/UploadButtonWithX/index.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; diff --git a/src/client/containers/SettingsContainer.jsx b/src/client/containers/SettingsContainer.jsx index 979abff59..7a52740ae 100644 --- a/src/client/containers/SettingsContainer.jsx +++ b/src/client/containers/SettingsContainer.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import React from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; diff --git a/src/client/lib/history.js b/src/client/lib/history.js index 1008b2abf..7b8504acb 100644 --- a/src/client/lib/history.js +++ b/src/client/lib/history.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import createHistory from 'history/createBrowserHistory'; export default createHistory(); \ No newline at end of file diff --git a/src/client/reducers/index.js b/src/client/reducers/index.js index b922e8bb7..087a355eb 100644 --- a/src/client/reducers/index.js +++ b/src/client/reducers/index.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import { combineReducers } from 'redux'; import { reducer as form } from 'redux-form'; diff --git a/src/client/reducers/settings/index.js b/src/client/reducers/settings/index.js index cd39ba7bd..c740d8382 100644 --- a/src/client/reducers/settings/index.js +++ b/src/client/reducers/settings/index.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import { find } from 'lodash'; import { fromJS, Map } from 'immutable'; import { handleActions } from 'redux-actions'; diff --git a/src/client/reducers/shared/index.js b/src/client/reducers/shared/index.js index 263fcdb9e..8cbe43199 100644 --- a/src/client/reducers/shared/index.js +++ b/src/client/reducers/shared/index.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + const initialState = { sessionUser: null }; diff --git a/src/client/reducers/sidebarReducer.js b/src/client/reducers/sidebarReducer.js index 440c254db..3a4d7aaec 100644 --- a/src/client/reducers/sidebarReducer.js +++ b/src/client/reducers/sidebarReducer.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import { handleActions } from 'redux-actions'; import { NAV_CHANGE } from '../actions/types'; diff --git a/src/client/renderer.jsx b/src/client/renderer.jsx index 530831b25..f2d234a9f 100644 --- a/src/client/renderer.jsx +++ b/src/client/renderer.jsx @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import {Provider} from 'react-redux'; import ReactDOM from 'react-dom'; import React from 'react'; diff --git a/src/client/sagas/index.js b/src/client/sagas/index.js index 2eeb311d3..a0a5da070 100644 --- a/src/client/sagas/index.js +++ b/src/client/sagas/index.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import { all } from 'redux-saga/effects'; import SettingsSaga from './settings'; diff --git a/src/client/sagas/settings/index.js b/src/client/sagas/settings/index.js index 41af2c2b2..d2450ef3e 100644 --- a/src/client/sagas/settings/index.js +++ b/src/client/sagas/settings/index.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + import { call, put, takeLatest } from 'redux-saga/effects'; import { delay } from 'redux-saga'; import axios from 'axios'; diff --git a/src/emitter/events.js b/src/emitter/events.js index 706ae9b2b..63a4cbbb5 100644 --- a/src/emitter/events.js +++ b/src/emitter/events.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var path = require('path'); diff --git a/src/emitter/index.js b/src/emitter/index.js index 916e33124..58d6e1cd9 100644 --- a/src/emitter/index.js +++ b/src/emitter/index.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ 'use strict'; diff --git a/src/helpers/hbs/helpers.js b/src/helpers/hbs/helpers.js index ddd8dbac6..da9c6b8fc 100644 --- a/src/helpers/hbs/helpers.js +++ b/src/helpers/hbs/helpers.js @@ -1,15 +1,15 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. */ /* diff --git a/src/helpers/plugins/index.js b/src/helpers/plugins/index.js index 53c092fc0..8b043c78a 100644 --- a/src/helpers/plugins/index.js +++ b/src/helpers/plugins/index.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/03/2017 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var pluginHelpers = {}; diff --git a/src/helpers/utils/index.js b/src/helpers/utils/index.js index b8e056da1..b2de1e5b8 100644 --- a/src/helpers/utils/index.js +++ b/src/helpers/utils/index.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); diff --git a/src/helpers/viewdata/index.js b/src/helpers/viewdata/index.js index 5f26001a4..9d6269324 100644 --- a/src/helpers/viewdata/index.js +++ b/src/helpers/viewdata/index.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var async = require('async'), _ = require('lodash'), diff --git a/src/ldap/index.js b/src/ldap/index.js index e04f0b44c..d9fd33c82 100644 --- a/src/ldap/index.js +++ b/src/ldap/index.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 04/03/2018 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var ldap = require('ldapjs'); diff --git a/src/mailer/index.js b/src/mailer/index.js index a7419c72f..6d8df126e 100644 --- a/src/mailer/index.js +++ b/src/mailer/index.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var nodeMailer = require('nodemailer'); diff --git a/src/mailer/mailCheck.js b/src/mailer/mailCheck.js index 8a5aa17ef..fbd9f3f85 100644 --- a/src/mailer/mailCheck.js +++ b/src/mailer/mailCheck.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 06/19/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var async = require('async'); diff --git a/src/memory/index.js b/src/memory/index.js index 39a3b873d..cf1a00147 100644 --- a/src/memory/index.js +++ b/src/memory/index.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + // var memwatch = require('memwatch-next'); // var winston = require('winston'); // memwatch.on('leak', function(info) { diff --git a/src/models/attachment.js b/src/models/attachment.js index ef1f376d9..4be7e9dbc 100644 --- a/src/models/attachment.js +++ b/src/models/attachment.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 07/19/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); diff --git a/src/models/chat/conversation.js b/src/models/chat/conversation.js index 05e302bec..200cb2bd5 100644 --- a/src/models/chat/conversation.js +++ b/src/models/chat/conversation.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 11/21/2016 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); var _ = require('lodash'); diff --git a/src/models/chat/message.js b/src/models/chat/message.js index 46c7ec454..7e646dbb4 100644 --- a/src/models/chat/message.js +++ b/src/models/chat/message.js @@ -1 +1 @@ -/* . .o8 oooo .o8 "888 `888 .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o ======================================================================== Created: 11/24/2016 Author: Chris Brame **/ var mongoose = require('mongoose'); var _ = require('lodash'); var COLLECTION = 'messages'; var messageSchema = mongoose.Schema({ conversation: {type: mongoose.Schema.Types.ObjectId, required: true, index: true}, owner: {type: mongoose.Schema.Types.ObjectId, ref: 'accounts', required: true, index: true}, body: {type: String, required: true} }, { timestamps: true }); messageSchema.statics.getFullConversation = function(convoId, callback) { return this.model(COLLECTION).find({ conversation: convoId }) .select('createdAt body owner') .sort('-createdAt') .populate({ path: 'owner', select: '_id username fullname email image lastOnline' }) .exec(callback); }; messageSchema.statics.getConversation = function(convoId, callback) { return this.model(COLLECTION).find({ conversation: convoId }) .select('createdAt body owner') .sort('-createdAt') .limit(25) .populate({ path: 'owner', select: '_id username fullname email image lastOnline' }) .exec(callback); }; messageSchema.statics.getConversationWithObject = function(object, callback) { if (!_.isObject(object)) return callback('Invalid Object (Must by of type Object) - MessageSchema.GetUserWithObject()', null); var self = this; var deletedAt = null; var limit = (object.limit === null ? 25 : object.limit); var page = (object.page === null ? 0 : object.page); if (object.requestingUser) { var userMetaIdx = _.findIndex(object.userMeta, function(item) { return item.userId.toString() === object.requestingUser._id.toString(); }); if (userMetaIdx !== -1 && object.userMeta[userMetaIdx].deletedAt) deletedAt = new Date(object.userMeta[userMetaIdx].deletedAt); } var q = self.model(COLLECTION).find({}) .sort('-createdAt') .skip(page*limit) .populate({ path: 'owner', select: '_id username fullname email image lastOnline' }); if (limit !== -1) q.limit(limit); if (object.cid !== null) q.where({conversation: object.cid}); if (deletedAt) q.where({createdAt: {'$gte': deletedAt}}); return q.exec(callback); }; messageSchema.statics.getMostRecentMessage = function(convoId, callback) { return this.model(COLLECTION).find({ conversation: convoId }) .sort('-createdAt') .limit(1) .populate({ path: 'owner', select: '_id username fullname image lastOnline' }) .exec(callback); }; module.exports = mongoose.model(COLLECTION, messageSchema); \ No newline at end of file +/* * . .o8 oooo * .o8 "888 `888 * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o * ======================================================================== * Author: Chris Brame * Updated: 1/20/19 4:43 PM * Copyright (c) 2014-2019. All rights reserved. */ var mongoose = require('mongoose'); var _ = require('lodash'); var COLLECTION = 'messages'; var messageSchema = mongoose.Schema({ conversation: {type: mongoose.Schema.Types.ObjectId, required: true, index: true}, owner: {type: mongoose.Schema.Types.ObjectId, ref: 'accounts', required: true, index: true}, body: {type: String, required: true} }, { timestamps: true }); messageSchema.statics.getFullConversation = function(convoId, callback) { return this.model(COLLECTION).find({ conversation: convoId }) .select('createdAt body owner') .sort('-createdAt') .populate({ path: 'owner', select: '_id username fullname email image lastOnline' }) .exec(callback); }; messageSchema.statics.getConversation = function(convoId, callback) { return this.model(COLLECTION).find({ conversation: convoId }) .select('createdAt body owner') .sort('-createdAt') .limit(25) .populate({ path: 'owner', select: '_id username fullname email image lastOnline' }) .exec(callback); }; messageSchema.statics.getConversationWithObject = function(object, callback) { if (!_.isObject(object)) return callback('Invalid Object (Must by of type Object) - MessageSchema.GetUserWithObject()', null); var self = this; var deletedAt = null; var limit = (object.limit === null ? 25 : object.limit); var page = (object.page === null ? 0 : object.page); if (object.requestingUser) { var userMetaIdx = _.findIndex(object.userMeta, function(item) { return item.userId.toString() === object.requestingUser._id.toString(); }); if (userMetaIdx !== -1 && object.userMeta[userMetaIdx].deletedAt) deletedAt = new Date(object.userMeta[userMetaIdx].deletedAt); } var q = self.model(COLLECTION).find({}) .sort('-createdAt') .skip(page*limit) .populate({ path: 'owner', select: '_id username fullname email image lastOnline' }); if (limit !== -1) q.limit(limit); if (object.cid !== null) q.where({conversation: object.cid}); if (deletedAt) q.where({createdAt: {'$gte': deletedAt}}); return q.exec(callback); }; messageSchema.statics.getMostRecentMessage = function(convoId, callback) { return this.model(COLLECTION).find({ conversation: convoId }) .sort('-createdAt') .limit(1) .populate({ path: 'owner', select: '_id username fullname image lastOnline' }) .exec(callback); }; module.exports = mongoose.model(COLLECTION, messageSchema); \ No newline at end of file diff --git a/src/models/comment.js b/src/models/comment.js index 9df94842e..bc00474f5 100644 --- a/src/models/comment.js +++ b/src/models/comment.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); diff --git a/src/models/counters.js b/src/models/counters.js index 450ca3d30..f720aa54a 100644 --- a/src/models/counters.js +++ b/src/models/counters.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); diff --git a/src/models/group.js b/src/models/group.js index 4b766e55e..2e0a8106a 100644 --- a/src/models/group.js +++ b/src/models/group.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var mongoose = require('mongoose'); diff --git a/src/models/history.js b/src/models/history.js index 66172d77e..967f85781 100644 --- a/src/models/history.js +++ b/src/models/history.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); diff --git a/src/models/note.js b/src/models/note.js index 1d8474fef..33f23ce26 100644 --- a/src/models/note.js +++ b/src/models/note.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 05/12/2017 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); diff --git a/src/models/notification.js b/src/models/notification.js index c7147b5a9..953dddb6d 100644 --- a/src/models/notification.js +++ b/src/models/notification.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); var _ = require('lodash'); diff --git a/src/models/setting.js b/src/models/setting.js index 61ff64bf9..ef488d4d1 100644 --- a/src/models/setting.js +++ b/src/models/setting.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 06/21/2016 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); diff --git a/src/models/tag.js b/src/models/tag.js index b7a648686..6d8a25410 100644 --- a/src/models/tag.js +++ b/src/models/tag.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 12/28/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); diff --git a/src/models/task.js b/src/models/task.js index d076a139d..64dce4336 100644 --- a/src/models/task.js +++ b/src/models/task.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var mongoose = require('mongoose'); diff --git a/src/models/ticket.js b/src/models/ticket.js index d849bd676..659f740e2 100644 --- a/src/models/ticket.js +++ b/src/models/ticket.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var async = require('async'); var mongoose = require('mongoose'); diff --git a/src/models/ticketpriority.js b/src/models/ticketpriority.js index 3b1493087..eeff1a2f4 100644 --- a/src/models/ticketpriority.js +++ b/src/models/ticketpriority.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 5/28/2018 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ // var _ = require('lodash'); var mongoose = require('mongoose'); diff --git a/src/models/tickettype.js b/src/models/tickettype.js index 22bf1e9a0..100741891 100644 --- a/src/models/tickettype.js +++ b/src/models/tickettype.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var _ = require('lodash'); var mongoose = require('mongoose'); diff --git a/src/models/user.js b/src/models/user.js index de1ea21d2..85beec724 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -1,16 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var async = require('async'); var mongoose = require('mongoose'); diff --git a/src/public/js/angularjs/controllers.js b/src/public/js/angularjs/controllers.js index 016349ce6..fd46d60ce 100644 --- a/src/public/js/angularjs/controllers.js +++ b/src/public/js/angularjs/controllers.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo -.o8 "888 `888 -.o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo -888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' -888 888 888 888 888 888 888ooo888 `"Y88b. 888888. -888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. -"888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o -======================================================================== -Created: 02/10/2015 -Author: Chris Brame - -**/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define([ 'jquery', 'angular', diff --git a/src/public/js/angularjs/controllers/accounts.js b/src/public/js/angularjs/controllers/accounts.js index d52a5d959..466c192ee 100644 --- a/src/public/js/angularjs/controllers/accounts.js +++ b/src/public/js/angularjs/controllers/accounts.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'modules/helpers', 'uikit', 'pages/accounts', 'history', 'selectize', 'formvalidator', 'multiselect'], function(angular, _, $, helpers, UIkit, accountsPage) { return angular.module('trudesk.controllers.accounts', []) diff --git a/src/public/js/angularjs/controllers/common.js b/src/public/js/angularjs/controllers/common.js index 97ed38c82..6b84bf4a3 100644 --- a/src/public/js/angularjs/controllers/common.js +++ b/src/public/js/angularjs/controllers/common.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'modules/socket', 'uikit', 'modules/tour', 'modules/helpers', 'history'], function(angular, _, $, socket, UI, tour, helpers) { return angular.module('trudesk.controllers.common', ['trudesk.controllers.messages']) diff --git a/src/public/js/angularjs/controllers/groups.js b/src/public/js/angularjs/controllers/groups.js index e94ebf6f9..078a9c654 100644 --- a/src/public/js/angularjs/controllers/groups.js +++ b/src/public/js/angularjs/controllers/groups.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'modules/helpers', 'uikit', 'history', 'multiselect'], function(angular, _, $, helpers, UIkit) { return angular.module('trudesk.controllers.groups', []) diff --git a/src/public/js/angularjs/controllers/messages.js b/src/public/js/angularjs/controllers/messages.js index f1a5f0b3e..5e238950c 100644 --- a/src/public/js/angularjs/controllers/messages.js +++ b/src/public/js/angularjs/controllers/messages.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 05/22/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'modules/helpers', 'modules/socket', 'history', 'angularjs/services/session'], function(angular, _, $, helpers, socket) { return angular.module('trudesk.controllers.messages', ['trudesk.services.session']) diff --git a/src/public/js/angularjs/controllers/notices.js b/src/public/js/angularjs/controllers/notices.js index 6cca54c66..895f2e5d2 100644 --- a/src/public/js/angularjs/controllers/notices.js +++ b/src/public/js/angularjs/controllers/notices.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'modules/helpers', 'modules/socket', 'history'], function(angular, _, $, helpers, socketClient) { return angular.module('trudesk.controllers.notices', []) diff --git a/src/public/js/angularjs/controllers/plugins.js b/src/public/js/angularjs/controllers/plugins.js index 5f80d14d4..e74963d23 100644 --- a/src/public/js/angularjs/controllers/plugins.js +++ b/src/public/js/angularjs/controllers/plugins.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'modules/helpers', 'history'], function(angular, _, $, helpers) { return angular.module('trudesk.controllers.plugins', []) diff --git a/src/public/js/angularjs/controllers/profile.js b/src/public/js/angularjs/controllers/profile.js index c0d5afa93..21a6f7c4c 100644 --- a/src/public/js/angularjs/controllers/profile.js +++ b/src/public/js/angularjs/controllers/profile.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'modules/helpers', 'uikit', 'qrcode', 'history', 'angularjs/services/session'], function(angular, _, $, helpers, UIKit) { return angular.module('trudesk.controllers.profile', ['trudesk.services.session']) diff --git a/src/public/js/angularjs/controllers/reports.js b/src/public/js/angularjs/controllers/reports.js index a31c725ba..d49960910 100644 --- a/src/public/js/angularjs/controllers/reports.js +++ b/src/public/js/angularjs/controllers/reports.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 01/24/2016 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'moment', 'modules/helpers', 'formvalidator', 'history'], function(angular, _, $, moment, helpers) { return angular.module('trudesk.controllers.reports', []) diff --git a/src/public/js/angularjs/controllers/settings-backup.js b/src/public/js/angularjs/controllers/settings-backup.js index ee80cacfd..5622bf254 100644 --- a/src/public/js/angularjs/controllers/settings-backup.js +++ b/src/public/js/angularjs/controllers/settings-backup.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 12/19/2018 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define([ 'angular', diff --git a/src/public/js/angularjs/controllers/settings.js b/src/public/js/angularjs/controllers/settings.js index 582b622bc..c51b79d43 100644 --- a/src/public/js/angularjs/controllers/settings.js +++ b/src/public/js/angularjs/controllers/settings.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define([ 'angular', diff --git a/src/public/js/angularjs/controllers/singleTicket.js b/src/public/js/angularjs/controllers/singleTicket.js index b1951e778..6785843b6 100644 --- a/src/public/js/angularjs/controllers/singleTicket.js +++ b/src/public/js/angularjs/controllers/singleTicket.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define([ 'angular', 'underscore', 'jquery', 'uikit', 'modules/socket', 'modules/navigation', diff --git a/src/public/js/angularjs/controllers/tickets.js b/src/public/js/angularjs/controllers/tickets.js index ea52e8287..2474956bc 100644 --- a/src/public/js/angularjs/controllers/tickets.js +++ b/src/public/js/angularjs/controllers/tickets.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'underscore', 'jquery', 'modules/helpers', 'modules/socket', 'uikit', 'history', 'formvalidator'], function(angular, _, $, helpers, socket, UIkit) { return angular.module('trudesk.controllers.tickets', []) diff --git a/src/public/js/angularjs/main.js b/src/public/js/angularjs/main.js index 26d9bc12b..f17ccccce 100644 --- a/src/public/js/angularjs/main.js +++ b/src/public/js/angularjs/main.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ // require.ensure([], function(require) { define(['angular', 'angularjs/services/session', 'angularjs/controllers', 'angularRoute', 'angularCookies', 'angularSanitize'], function(angular) { diff --git a/src/public/js/angularjs/services.js b/src/public/js/angularjs/services.js index d628d39cd..67102ff72 100644 --- a/src/public/js/angularjs/services.js +++ b/src/public/js/angularjs/services.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 05/17/2017 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define([ 'jquery', diff --git a/src/public/js/angularjs/services/session.js b/src/public/js/angularjs/services/session.js index 2e79ce4a3..9a9d9c373 100644 --- a/src/public/js/angularjs/services/session.js +++ b/src/public/js/angularjs/services/session.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 05/17/2017 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular'], function(angular) { angular.module('trudesk.services.session', []) diff --git a/src/public/js/angularjs/services/settingsService.js b/src/public/js/angularjs/services/settingsService.js index 7a5e0c3bf..7922e34f3 100644 --- a/src/public/js/angularjs/services/settingsService.js +++ b/src/public/js/angularjs/services/settingsService.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 10/15/2018 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular'], function(angular) { angular.module('trudesk.services.settings', []) diff --git a/src/public/js/app.js b/src/public/js/app.js index 5a8743d91..cea491cca 100644 --- a/src/public/js/app.js +++ b/src/public/js/app.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ //Load SASS (Webpack) // require('../../sass/app.sass'); diff --git a/src/public/js/modules/ajaxify.js b/src/public/js/modules/ajaxify.js index 8915cda14..4168a350a 100644 --- a/src/public/js/modules/ajaxify.js +++ b/src/public/js/modules/ajaxify.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/ajaxify', [ 'jquery', diff --git a/src/public/js/modules/ajaximgupload.js b/src/public/js/modules/ajaximgupload.js index 27e923549..5a253a226 100644 --- a/src/public/js/modules/ajaximgupload.js +++ b/src/public/js/modules/ajaximgupload.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/ajaximgupload', [ 'jquery', diff --git a/src/public/js/modules/attachmentUpload.js b/src/public/js/modules/attachmentUpload.js index 9d6b5616a..c8e7a74cb 100644 --- a/src/public/js/modules/attachmentUpload.js +++ b/src/public/js/modules/attachmentUpload.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 07/19/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/attachmentUpload', [ 'jquery', diff --git a/src/public/js/modules/chat.js b/src/public/js/modules/chat.js index c89fa1c2f..982bb9666 100644 --- a/src/public/js/modules/chat.js +++ b/src/public/js/modules/chat.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/chat',[ 'jquery', diff --git a/src/public/js/modules/helpers.js b/src/public/js/modules/helpers.js index 59e23bc2f..ece5ec939 100644 --- a/src/public/js/modules/helpers.js +++ b/src/public/js/modules/helpers.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ 'use strict'; diff --git a/src/public/js/modules/navigation.js b/src/public/js/modules/navigation.js index c15a8b184..09ff70793 100644 --- a/src/public/js/modules/navigation.js +++ b/src/public/js/modules/navigation.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['jquery', 'modules/helpers', 'underscore', 'modules/socket'], function($, helpers, _, socket) { var navigation = {}; diff --git a/src/public/js/modules/socket.io/accountsImporter.js b/src/public/js/modules/socket.io/accountsImporter.js index dc7484a04..17ac24b65 100644 --- a/src/public/js/modules/socket.io/accountsImporter.js +++ b/src/public/js/modules/socket.io/accountsImporter.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - . o8 "888 `888 -.o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 04/17/2018 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/socket.io/accountsImporter', [ 'jquery', diff --git a/src/public/js/modules/socket.io/logs.io.js b/src/public/js/modules/socket.io/logs.io.js index e9db028ed..f5ae3f4d4 100644 --- a/src/public/js/modules/socket.io/logs.io.js +++ b/src/public/js/modules/socket.io/logs.io.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - . o8 "888 `888 -.o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 07/22/2016 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/socket.io/logs.io', [ 'jquery', diff --git a/src/public/js/modules/socket.io/noticeUI.js b/src/public/js/modules/socket.io/noticeUI.js index ec0c1c650..7d94d687b 100644 --- a/src/public/js/modules/socket.io/noticeUI.js +++ b/src/public/js/modules/socket.io/noticeUI.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 08/20/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/socket.io/noticeUI', [ 'jquery', diff --git a/src/public/js/modules/socket.io/ticketsUI.js b/src/public/js/modules/socket.io/ticketsUI.js index 5ab98dc30..0eb77f1a7 100644 --- a/src/public/js/modules/socket.io/ticketsUI.js +++ b/src/public/js/modules/socket.io/ticketsUI.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 08/20/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/socket.io/ticketsUI', [ 'jquery', diff --git a/src/public/js/modules/socket.js b/src/public/js/modules/socket.js index 32aa4b9f2..891143899 100644 --- a/src/public/js/modules/socket.js +++ b/src/public/js/modules/socket.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/socket', [ 'modules/chat', diff --git a/src/public/js/modules/tour.js b/src/public/js/modules/tour.js index 33348d0a3..2a13999b4 100644 --- a/src/public/js/modules/tour.js +++ b/src/public/js/modules/tour.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 03/14/2017 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/tour', [ 'jquery', diff --git a/src/public/js/modules/ui.js b/src/public/js/modules/ui.js index a9d9159fc..9d78bef76 100644 --- a/src/public/js/modules/ui.js +++ b/src/public/js/modules/ui.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('modules/ui', [ 'jquery', diff --git a/src/public/js/pages/accounts.js b/src/public/js/pages/accounts.js index b1b17eea4..f9ae9208a 100644 --- a/src/public/js/pages/accounts.js +++ b/src/public/js/pages/accounts.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/accounts', [ 'underscore', diff --git a/src/public/js/pages/accountsImport.js b/src/public/js/pages/accountsImport.js index efe3d21bd..d1f287168 100644 --- a/src/public/js/pages/accountsImport.js +++ b/src/public/js/pages/accountsImport.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 '888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888''8P `888 `888 d88' `888 d88' `88b d88( '8 888 .8P' - 888 888 888 888 888 888 888ooo888 `'Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - '888' d888b `V88V'V8P' `Y8bod88P' `Y8bod8P' 8''888P' o888o o888o - ======================================================================== - Created: 04/07/2016 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/accountsImport', [ 'jquery', diff --git a/src/public/js/pages/createNotice.js b/src/public/js/pages/createNotice.js index 77d4ede7d..09d124214 100644 --- a/src/public/js/pages/createNotice.js +++ b/src/public/js/pages/createNotice.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/createNotice', [ 'jquery', diff --git a/src/public/js/pages/dashboard.js b/src/public/js/pages/dashboard.js index a2005a642..acf95548b 100644 --- a/src/public/js/pages/dashboard.js +++ b/src/public/js/pages/dashboard.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 04/07/2016 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/dashboard', [ 'jquery', diff --git a/src/public/js/pages/editaccount.js b/src/public/js/pages/editaccount.js index e59fcef61..d44bd2f3c 100644 --- a/src/public/js/pages/editaccount.js +++ b/src/public/js/pages/editaccount.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/editaccount', [ 'jquery', diff --git a/src/public/js/pages/groups.js b/src/public/js/pages/groups.js index 83b86eabc..dcaafbcf9 100644 --- a/src/public/js/pages/groups.js +++ b/src/public/js/pages/groups.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/groups', [ 'jquery', diff --git a/src/public/js/pages/logs.js b/src/public/js/pages/logs.js index 61b33472c..230a89f27 100644 --- a/src/public/js/pages/logs.js +++ b/src/public/js/pages/logs.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/logs', [ 'jquery', diff --git a/src/public/js/pages/messages.js b/src/public/js/pages/messages.js index 25ef0e5a3..572de1edd 100644 --- a/src/public/js/pages/messages.js +++ b/src/public/js/pages/messages.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/messages', [ 'jquery', diff --git a/src/public/js/pages/notices.js b/src/public/js/pages/notices.js index 7a1303729..f36a4b777 100644 --- a/src/public/js/pages/notices.js +++ b/src/public/js/pages/notices.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/notices', [ 'jquery', diff --git a/src/public/js/pages/pageloader.js b/src/public/js/pages/pageloader.js index c23b76eec..49a48b745 100644 --- a/src/public/js/pages/pageloader.js +++ b/src/public/js/pages/pageloader.js @@ -1,19 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/07/2017 - Author: Chris Brame - - Desc: Needed to load the page states from the initial load. Ajaxify - handles the load after the initial. - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/pageloader', ['async', 'jquery'], function(async, $) { var pageLoader = {}; diff --git a/src/public/js/pages/plugins.js b/src/public/js/pages/plugins.js index 3f01d840f..2e0aafd24 100644 --- a/src/public/js/pages/plugins.js +++ b/src/public/js/pages/plugins.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/plugins', [ 'jquery', diff --git a/src/public/js/pages/profile.js b/src/public/js/pages/profile.js index 84b95430c..8137254b9 100644 --- a/src/public/js/pages/profile.js +++ b/src/public/js/pages/profile.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/profile', [ 'jquery', diff --git a/src/public/js/pages/reports.js b/src/public/js/pages/reports.js index 6194bae1f..b78e1bfac 100644 --- a/src/public/js/pages/reports.js +++ b/src/public/js/pages/reports.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/reports', [ 'jquery', diff --git a/src/public/js/pages/reportsBreakdown.js b/src/public/js/pages/reportsBreakdown.js index 6c9f90f31..c7d59f1f1 100644 --- a/src/public/js/pages/reportsBreakdown.js +++ b/src/public/js/pages/reportsBreakdown.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 04/11/2016 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/reportsBreakdown', [ 'jquery', diff --git a/src/public/js/pages/settings.js b/src/public/js/pages/settings.js index 8277a880b..ac4b29059 100644 --- a/src/public/js/pages/settings.js +++ b/src/public/js/pages/settings.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 04/07/2016 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/settings', [ 'jquery', diff --git a/src/public/js/pages/settingsTicketTypes.js b/src/public/js/pages/settingsTicketTypes.js index 3e8a77445..a72170618 100644 --- a/src/public/js/pages/settingsTicketTypes.js +++ b/src/public/js/pages/settingsTicketTypes.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 07/24/2016 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/settingsTicketTypes', [ 'jquery', diff --git a/src/public/js/pages/singleTicket.js b/src/public/js/pages/singleTicket.js index 2dd800859..cb1750f8b 100644 --- a/src/public/js/pages/singleTicket.js +++ b/src/public/js/pages/singleTicket.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:46 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/singleTicket', [ 'jquery', diff --git a/src/public/js/pages/tags.js b/src/public/js/pages/tags.js index d165c5400..d38c92193 100644 --- a/src/public/js/pages/tags.js +++ b/src/public/js/pages/tags.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 07/24/2016 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/tags', [ 'jquery', diff --git a/src/public/js/pages/tickets.js b/src/public/js/pages/tickets.js index ffb7882db..1febd6de1 100644 --- a/src/public/js/pages/tickets.js +++ b/src/public/js/pages/tickets.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define('pages/tickets', [ 'jquery', diff --git a/src/public/js/sessionLoader.js b/src/public/js/sessionLoader.js index 0ab72de25..5470520a6 100644 --- a/src/public/js/sessionLoader.js +++ b/src/public/js/sessionLoader.js @@ -1,16 +1,16 @@ -/** - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - - **/ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ define(['angular', 'angularjs/services/session', 'angularRoute', 'angularCookies', 'angularSanitize'], function(angular) { return angular.module('sessionLoader', ['trudesk.services.session', 'ngRoute', 'ngCookies', 'ngSanitize']); diff --git a/src/public/js/truRequire.js b/src/public/js/truRequire.js index eec47320c..ac76bcc6d 100644 --- a/src/public/js/truRequire.js +++ b/src/public/js/truRequire.js @@ -1,3 +1,17 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + /* eslint-disable node/no-missing-require,node/no-unpublished-require,node/no-missing-require,node/no-unpublished-require,node/no-missing-require,node/no-unpublished-require,node/no-missing-require,node/no-unpublished-require,node/no-unpublished-require,node/no-missing-require,node/no-unpublished-require,node/no-missing-require,node/no-unpublished-require,node/no-missing-require,node/no-unpublished-require */ //This gets loaded for accessing require from outside Webpack bundle. var allMods = { diff --git a/src/sass/_settings.sass b/src/sass/_settings.sass index f6e685568..06b6f9011 100644 --- a/src/sass/_settings.sass +++ b/src/sass/_settings.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + @import "mixins" @import "functions" diff --git a/src/sass/_settings_theme_dark.sass b/src/sass/_settings_theme_dark.sass index b5d104e3a..0f8989e31 100644 --- a/src/sass/_settings_theme_dark.sass +++ b/src/sass/_settings_theme_dark.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + $rowWidth: 100% $fontFamily: "Roboto", "Open Sans", sans-serif $accent_color: #E74C3C diff --git a/src/sass/app.sass b/src/sass/app.sass index b4708b38b..c2eebcf72 100644 --- a/src/sass/app.sass +++ b/src/sass/app.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + @import "mixins" @import "functions" @import "_settings" diff --git a/src/sass/buildsass.js b/src/sass/buildsass.js index b50ca776d..bb3df7620 100644 --- a/src/sass/buildsass.js +++ b/src/sass/buildsass.js @@ -1,15 +1,15 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 11/7/2018 - Author: Chris Brame - + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. */ var _ = require('lodash'); diff --git a/src/sass/functions.sass b/src/sass/functions.sass index 7bf382487..8ef90ece3 100644 --- a/src/sass/functions.sass +++ b/src/sass/functions.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + //Functions @function automatic-text-color($bgColor, $component:'') @if (lightness($bgColor) > 50) diff --git a/src/sass/mixins.sass b/src/sass/mixins.sass index d51c07712..7a9db6cf5 100644 --- a/src/sass/mixins.sass +++ b/src/sass/mixins.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + @mixin borderRadius($radius) border-radius: $radius diff --git a/src/sass/partials/barchart.sass b/src/sass/partials/barchart.sass index 01b5c0dbe..de84c75a8 100644 --- a/src/sass/partials/barchart.sass +++ b/src/sass/partials/barchart.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .bar-chart-wrapper position: relative //padding-left: 40px diff --git a/src/sass/partials/c3.sass b/src/sass/partials/c3.sass index 1e74ee466..7e605c56a 100644 --- a/src/sass/partials/c3.sass +++ b/src/sass/partials/c3.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .c3-chart-arc text font-size: 10px !important diff --git a/src/sass/partials/calendar.sass b/src/sass/partials/calendar.sass index 281e143da..21963c9f7 100644 --- a/src/sass/partials/calendar.sass +++ b/src/sass/partials/calendar.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .fc font-family: "open sans", sans-serif padding: 0 15px 0 30px diff --git a/src/sass/partials/chat.sass b/src/sass/partials/chat.sass index 669f72d4a..c814492cf 100644 --- a/src/sass/partials/chat.sass +++ b/src/sass/partials/chat.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .chat-bar position: fixed bottom: 0 diff --git a/src/sass/partials/chosen.sass b/src/sass/partials/chosen.sass index f40be20c1..19027b96f 100644 --- a/src/sass/partials/chosen.sass +++ b/src/sass/partials/chosen.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .search-container max-height: 300px height: auto diff --git a/src/sass/partials/common.sass b/src/sass/partials/common.sass index 6ba1ba372..2ee5bf470 100644 --- a/src/sass/partials/common.sass +++ b/src/sass/partials/common.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .site-logo width: 140px !important .site-logo-login diff --git a/src/sass/partials/contextmenu.sass b/src/sass/partials/contextmenu.sass index 1a4781a18..8eb925dcd 100644 --- a/src/sass/partials/contextmenu.sass +++ b/src/sass/partials/contextmenu.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .context-menu box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23) background: #fff diff --git a/src/sass/partials/dashboard.sass b/src/sass/partials/dashboard.sass index 743110602..5c307f20b 100644 --- a/src/sass/partials/dashboard.sass +++ b/src/sass/partials/dashboard.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .circle-chart-wrapper margin-bottom: 15px diff --git a/src/sass/partials/datatables.sass b/src/sass/partials/datatables.sass index 4fe8a0f3b..bf42b81a5 100644 --- a/src/sass/partials/datatables.sass +++ b/src/sass/partials/datatables.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .dt-borderTop border-top: $datatables_head_border_top .dt-borderBottom diff --git a/src/sass/partials/donutchart.sass b/src/sass/partials/donutchart.sass index 716a5c495..75957f5a5 100644 --- a/src/sass/partials/donutchart.sass +++ b/src/sass/partials/donutchart.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + /* DonutChart */ .donutchart-wrapper position: relative diff --git a/src/sass/partials/easymde.sass b/src/sass/partials/easymde.sass index 971750004..910fe2106 100644 --- a/src/sass/partials/easymde.sass +++ b/src/sass/partials/easymde.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .CodeMirror height: 250px border-radius: 0 diff --git a/src/sass/partials/fab.sass b/src/sass/partials/fab.sass index 1b1f0f8af..6043a6b81 100644 --- a/src/sass/partials/fab.sass +++ b/src/sass/partials/fab.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .md-fab box-sizing: border-box width: 64px diff --git a/src/sass/partials/flottooltip.sass b/src/sass/partials/flottooltip.sass index b0c121fdb..49004b97b 100644 --- a/src/sass/partials/flottooltip.sass +++ b/src/sass/partials/flottooltip.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + #flotTip width: 150px max-width: 150px diff --git a/src/sass/partials/loader.sass b/src/sass/partials/loader.sass index e500331bc..1478e975e 100644 --- a/src/sass/partials/loader.sass +++ b/src/sass/partials/loader.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .showbox position: absolute top: 0 diff --git a/src/sass/partials/materialize.scss b/src/sass/partials/materialize.scss index e809dc1cc..c172d9968 100644 --- a/src/sass/partials/materialize.scss +++ b/src/sass/partials/materialize.scss @@ -1,3 +1,17 @@ +/*! + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 5:31 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + @import "../materialize/components/color"; $primary-color: color("materialize-red", "lighten-2") !default; $primary-color-light: lighten($primary-color, 15%) !default; diff --git a/src/sass/partials/messages.sass b/src/sass/partials/messages.sass index 75f3f43e9..481244492 100644 --- a/src/sass/partials/messages.sass +++ b/src/sass/partials/messages.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .message-list padding: 0 !important @media only screen and (min-width: 40.063em) and (max-width: 64em) diff --git a/src/sass/partials/mg.sass b/src/sass/partials/mg.sass index b28120339..90779ad5f 100644 --- a/src/sass/partials/mg.sass +++ b/src/sass/partials/mg.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .mGraph .mg-histogram .axis text, .mGraph .mg-x-axis text, .mGraph .mg-y-axis text diff --git a/src/sass/partials/modal.sass b/src/sass/partials/modal.sass index b86fbb0ff..02ad8fc65 100644 --- a/src/sass/partials/modal.sass +++ b/src/sass/partials/modal.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + /* dialog modals .uk-modal diff --git a/src/sass/partials/notifications.sass b/src/sass/partials/notifications.sass index 5909e74e8..532c24cd3 100644 --- a/src/sass/partials/notifications.sass +++ b/src/sass/partials/notifications.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + table.notificationsTable table-layout: fixed width: 99% diff --git a/src/sass/partials/offcanvas.sass b/src/sass/partials/offcanvas.sass index 170bd54d0..2f15f2979 100644 --- a/src/sass/partials/offcanvas.sass +++ b/src/sass/partials/offcanvas.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .uk-offcanvas background: rgba(0,0,0,0.3) .uk-offcanvas-bar diff --git a/src/sass/partials/onoffswitch.sass b/src/sass/partials/onoffswitch.sass index 3c9da9956..56c5797e0 100644 --- a/src/sass/partials/onoffswitch.sass +++ b/src/sass/partials/onoffswitch.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .onoffswitch position: relative width: 85px !important diff --git a/src/sass/partials/pace.sass b/src/sass/partials/pace.sass index de0932893..b73630c87 100644 --- a/src/sass/partials/pace.sass +++ b/src/sass/partials/pace.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .pace -webkit-pointer-events: none pointer-events: none diff --git a/src/sass/partials/searchbox.scss b/src/sass/partials/searchbox.scss index 7f0423115..e231d071b 100644 --- a/src/sass/partials/searchbox.scss +++ b/src/sass/partials/searchbox.scss @@ -1,3 +1,17 @@ +/*! + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 5:31 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + $color: $accent_color; diff --git a/src/sass/partials/selectize.sass b/src/sass/partials/selectize.sass index 2e0388597..efcda9129 100644 --- a/src/sass/partials/selectize.sass +++ b/src/sass/partials/selectize.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + @charset "UTF-8" /* selectize /** diff --git a/src/sass/partials/servers.sass b/src/sass/partials/servers.sass index 7c5a874ee..a2cd33bb6 100644 --- a/src/sass/partials/servers.sass +++ b/src/sass/partials/servers.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .server-row margin: 25px 0 0 0 !important diff --git a/src/sass/partials/settings.sass b/src/sass/partials/settings.sass index 0db839cd5..bd635cd35 100644 --- a/src/sass/partials/settings.sass +++ b/src/sass/partials/settings.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .settings-wrap padding: 20px 25px margin-bottom: 25px diff --git a/src/sass/partials/sidebar.sass b/src/sass/partials/sidebar.sass index bec4ca808..6ddca64cd 100644 --- a/src/sass/partials/sidebar.sass +++ b/src/sass/partials/sidebar.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + @import "../_settings.sass" //Hack to not show popout menu on reposition diff --git a/src/sass/partials/sidebarBottomPanel.sass b/src/sass/partials/sidebarBottomPanel.sass index bdcaf4dc3..a9fa57ead 100644 --- a/src/sass/partials/sidebarBottomPanel.sass +++ b/src/sass/partials/sidebarBottomPanel.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + @import "../_settings" .side-nav-bottom-panel diff --git a/src/sass/partials/svgcheck.sass b/src/sass/partials/svgcheck.sass index 0e5ea2ee3..942af4644 100644 --- a/src/sass/partials/svgcheck.sass +++ b/src/sass/partials/svgcheck.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .svgcheck cursor: pointer position: relative diff --git a/src/sass/partials/tLoader.sass b/src/sass/partials/tLoader.sass index 9fffe6fc0..96d9dd3dc 100644 --- a/src/sass/partials/tLoader.sass +++ b/src/sass/partials/tLoader.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + #loader-wrapper, #dot-loader background: $page_content_bg diff --git a/src/sass/partials/tickets.sass b/src/sass/partials/tickets.sass index 0600a5ee4..31d0bc7ed 100644 --- a/src/sass/partials/tickets.sass +++ b/src/sass/partials/tickets.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 4:46 PM + / Copyright (c) 2014-2019. All rights reserved. + / + .ticketContent @media only screen and (min-width: 40.063em) and (max-width: 64em) padding: 0 0 0 55px !important diff --git a/src/sass/partials/topnav.sass b/src/sass/partials/topnav.sass index 21f4cd382..4cb08f30f 100644 --- a/src/sass/partials/topnav.sass +++ b/src/sass/partials/topnav.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .top-nav, .top-bar background: $topbar_bg diff --git a/src/sass/partials/trucard.sass b/src/sass/partials/trucard.sass index 04cbe3914..6a6ecf223 100644 --- a/src/sass/partials/trucard.sass +++ b/src/sass/partials/trucard.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .tru-card background: $trupanel_bg position: relative diff --git a/src/sass/partials/trutab.sass b/src/sass/partials/trutab.sass index b04a02f9c..414017414 100644 --- a/src/sass/partials/trutab.sass +++ b/src/sass/partials/trutab.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + $size: 16px .tru-tabs diff --git a/src/sass/partials/typingbubble.sass b/src/sass/partials/typingbubble.sass index b108323aa..5646c6c51 100644 --- a/src/sass/partials/typingbubble.sass +++ b/src/sass/partials/typingbubble.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + =trf($trf) $value: '' @each $tr in $trf diff --git a/src/sass/partials/ui.sass b/src/sass/partials/ui.sass index 3a6f09946..22e800add 100644 --- a/src/sass/partials/ui.sass +++ b/src/sass/partials/ui.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + .tru-card-intro transform: scale(0) opacity: 0.02 diff --git a/src/sass/partials/waves.sass b/src/sass/partials/waves.sass index 32750d1db..1989837a4 100644 --- a/src/sass/partials/waves.sass +++ b/src/sass/partials/waves.sass @@ -1,3 +1,17 @@ +/*! + / . .o8 oooo + / .o8 "888 `888 + / .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + / 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + / 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + / 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + / "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + / ======================================================================== + / Author: Chris Brame + / Updated: 1/20/19 5:31 AM + / Copyright (c) 2014-2019. All rights reserved. + / + /*! ** Waves v0.7.4 ** http://fian.my.id/Waves diff --git a/src/sass/partials/wizard.scss b/src/sass/partials/wizard.scss index 2e078bc5c..d9a656cb1 100644 --- a/src/sass/partials/wizard.scss +++ b/src/sass/partials/wizard.scss @@ -1,3 +1,17 @@ +/*! + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 5:31 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + .wizard, .tabcontrol { display: block; width: 100%; diff --git a/src/socketserver.js b/src/socketserver.js index f66267f82..21431fdfe 100644 --- a/src/socketserver.js +++ b/src/socketserver.js @@ -1,17 +1,16 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Updated: 01/09/2019 - Author: Chris Brame - - **/ + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. + */ var winston = require('winston'), async = require('async'), diff --git a/src/webserver.js b/src/webserver.js index 116cb36ac..af5cedd3a 100644 --- a/src/webserver.js +++ b/src/webserver.js @@ -1,15 +1,15 @@ /* - . .o8 oooo - .o8 "888 `888 - .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo - 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' - 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. - 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. - "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o - ======================================================================== - Created: 02/10/2015 - Author: Chris Brame - + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 1/20/19 4:43 PM + * Copyright (c) 2014-2019. All rights reserved. */ var async = require('async'), From 23686a20f41afdc4bdeb58762b99cecb5a1b3b67 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Thu, 31 Jan 2019 16:20:16 -0500 Subject: [PATCH 21/68] chore(react): setting fixes --- .../components/Settings/Appearance/index.jsx | 16 ++++++++-------- .../subcomponents/ColorSelector/index.jsx | 1 + .../subcomponents/SingleSelect/index.jsx | 6 +++--- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/client/components/Settings/Appearance/index.jsx b/src/client/components/Settings/Appearance/index.jsx index 57014d876..2b4bf800e 100644 --- a/src/client/components/Settings/Appearance/index.jsx +++ b/src/client/components/Settings/Appearance/index.jsx @@ -258,14 +258,14 @@ class AppearanceSettings extends React.Component { { diff --git a/src/client/components/Settings/subcomponents/ColorSelector/index.jsx b/src/client/components/Settings/subcomponents/ColorSelector/index.jsx index 35b341a36..1247f730d 100644 --- a/src/client/components/Settings/subcomponents/ColorSelector/index.jsx +++ b/src/client/components/Settings/subcomponents/ColorSelector/index.jsx @@ -28,6 +28,7 @@ class ColorSelector extends React.Component { componentDidMount () { helpers.UI.inputs() + this.setState({ selectedColor: this.props.defaultColor }, this.updateColorButton) } componentDidUpdate (prevProps) { diff --git a/src/client/components/Settings/subcomponents/SingleSelect/index.jsx b/src/client/components/Settings/subcomponents/SingleSelect/index.jsx index 70bb600f7..35fe409d4 100644 --- a/src/client/components/Settings/subcomponents/SingleSelect/index.jsx +++ b/src/client/components/Settings/subcomponents/SingleSelect/index.jsx @@ -29,8 +29,8 @@ class SingleSelect extends React.Component { componentDidMount () { helpers.UI.selectize() const $select = $(this.select) - $select.on('change', this.props.onSelectChange) + this.setState({ value: this.props.value }) } componentWillUnmount () { @@ -54,7 +54,7 @@ class SingleSelect extends React.Component { let width = '100%' if (this.select && this.select.selectize) { - this.select.selectize.addOption(this.props.items) + this.select.selectize.addOption(items) this.select.selectize.refreshOptions(false) this.select.selectize.addItem(this.state.value, true) } @@ -76,7 +76,7 @@ class SingleSelect extends React.Component { {items.map(function (obj, i) { return ( ) })} From f4c63d0fb4dd25f26b541294b3490fb5759c9a88 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sat, 2 Feb 2019 04:23:01 -0500 Subject: [PATCH 22/68] chore(settings): fix for timezone --- .gitignore | 1 + public/js/0.js | 1 - public/js/1.js | 94 ------------------- public/js/5.js | 50 ---------- public/js/6.js | 21 ----- public/js/7.js | 15 --- public/js/truRequire.js | 62 ------------ public/js/trudesk.min.js | 1 - public/js/vendor.js | 56 ----------- .../components/Settings/General/index.jsx | 2 +- 10 files changed, 2 insertions(+), 301 deletions(-) delete mode 100644 public/js/0.js delete mode 100644 public/js/1.js delete mode 100644 public/js/5.js delete mode 100644 public/js/6.js delete mode 100644 public/js/7.js delete mode 100644 public/js/truRequire.js delete mode 100644 public/js/trudesk.min.js delete mode 100644 public/js/vendor.js diff --git a/.gitignore b/.gitignore index 5bae0e95c..8641f1b58 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ config.json import.csv /src/mailer/templates/promo/ *.pem +/public/js/ /public/uploads/tickets/ /public/uploads/users/ coverage.html diff --git a/public/js/0.js b/public/js/0.js deleted file mode 100644 index ddb5a819f..000000000 --- a/public/js/0.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{50:function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_ARRAY__,__WEBPACK_AMD_DEFINE_RESULT__;__WEBPACK_AMD_DEFINE_ARRAY__=[__webpack_require__(0),__webpack_require__(1),__webpack_require__(37),__webpack_require__(52),__webpack_require__(8),__webpack_require__(22)],void 0===(__WEBPACK_AMD_DEFINE_RESULT__=function($,_,socketClient,md,helpers){var st={};function onRemoveAttachmentClick(e){var self=$(e.currentTarget);if(_.isUndefined(self))return!0;var ticketId=$("#__ticketId").html(),attachmentId=self.attr("data-attachmentId");attachmentId.length>0&&ticketId.length>0&&$.ajax({url:"/api/v1/tickets/"+ticketId+"/attachments/remove/"+attachmentId,type:"DELETE",success:function(){socketClient.ui.refreshTicketAttachments(ticketId)},error:function(err){var res=err.responseJSON;console.log("[trudesk:singleTicket:onRemoveAttachmentClick] - "+res.error),helpers.UI.showSnackbar(res.err,!0)}})}function onRemoveCommentClick(e){var self=$(e.currentTarget);if(_.isUndefined(self))return!0;var ticketId=$("#__ticketId").html(),commentId=self.attr("data-commentId");commentId.length>0&&ticketId.length>0&&socketClient.ui.removeComment(ticketId,commentId)}function onRemoveNoteClick(e){var self=$(e.currentTarget);if(_.isUndefined(self))return!0;var ticketId=$("#__ticketId").html(),noteId=self.attr("data-noteid");noteId.length>0&&ticketId.length>0&&socketClient.ui.removeNote(ticketId,noteId)}return st.init=function(callback){$(document).ready(function(){function setupImageLink(el){var $this=$(el),src=$this.attr("src");$this.addClass("hasLinked");var a=$("").addClass("no-ajaxy").attr("href",src).attr("target","_blank");$this.wrap(a)}socketClient.chat.updateOnlineBubbles(),helpers.setupTruTabs($(".tru-tab-selectors").find(".tru-tab-selector")),$(".off-canvas-bottom").DivResizer({}),$(".issue-body img:not(.hasLinked)").each(function(){setupImageLink(this)}),$(".comment-body img:not(.hasLinked)").each(function(){setupImageLink(this)}),$(".remove-attachment").each(function(){var self=$(this);self.off("click",onRemoveAttachmentClick),self.on("click",onRemoveAttachmentClick)}),$(".remove-comment").each(function(){var self=$(this);self.off("click",onRemoveCommentClick),self.on("click",onRemoveCommentClick)}),$(".remove-note").each(function(){var self=$(this);self.off("click",onRemoveNoteClick),self.on("click",onRemoveNoteClick)});var issueText=$(".issue-text").find("div.issue-body").html();_.isUndefined(issueText)||(issueText=(issueText=md(issueText)).trim(),$("#issueText").val(issueText));var editCommentForm=$("div.edit-comment-form");editCommentForm.find("form").each(function(idx,f){var form=$(f);form.unbind("submit"),form.submit(function($event){if($event.preventDefault(),!form.isValid(null,null,!1))return!0;var id=$("#__ticketId").html();if(id.length>0){var comment=$($event.currentTarget).find("textarea#commentText").val(),commentId=$($event.currentTarget).attr("data-commentId");socketClient.ui.setCommentText(id,commentId,comment)}})}),editCommentForm.find(".resetForm").each(function(idx,item){var button=$(item);button.off("click"),button.on("click",function($event){$event.preventDefault();var grandParent=button.parents("div.edit-comment-form"),comment=button.parents("div.ticket-comment").find(".comment-body");grandParent.length>0&&(grandParent.addClass("hide"),comment.removeClass("hide"))})});var editNoteForm=$("div.edit-note-form");if(editNoteForm.find("form").each(function(idx,f){var form=$(f);form.off("submit"),form.on("submit",function($event){if($event.preventDefault(),!form.isValid(null,null,!1))return!0;var id=$("#__ticketId").text();if(id.length>0){var note=$($event.currentTarget).find("textarea#noteText").val(),noteId=$($event.currentTarget).attr("data-noteId");socketClient.ui.setNoteText(id,noteId,note)}})}),editNoteForm.find(".resetForm").each(function(idx,item){var button=$(item);button.off("click"),button.on("click",function($event){$event.preventDefault();var grandParent=button.parents("div.edit-note-form"),note=button.parents("div.ticket-note").find(".comment-body");grandParent.length>0&&(grandParent.addClass("hide"),note.removeClass("hide"))})}),"function"==typeof callback)return callback()})},st}.apply(exports,__WEBPACK_AMD_DEFINE_ARRAY__))||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)}}]); \ No newline at end of file diff --git a/public/js/1.js b/public/js/1.js deleted file mode 100644 index 92df185b2..000000000 --- a/public/js/1.js +++ /dev/null @@ -1,94 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[function(module,exports,__webpack_require__){var __WEBPACK_AMD_DEFINE_RESULT__,global,factory; -/*! - * jQuery JavaScript Library v2.2.4 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-05-20T17:23Z - */ -/*! - * jQuery JavaScript Library v2.2.4 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-05-20T17:23Z - */ -global="undefined"!=typeof window?window:this,factory=function(window,noGlobal){var arr=[],document=window.document,slice=arr.slice,concat=arr.concat,push=arr.push,indexOf=arr.indexOf,class2type={},toString=class2type.toString,hasOwn=class2type.hasOwnProperty,support={},jQuery=function(selector,context){return new jQuery.fn.init(selector,context)},rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([\da-z])/gi,fcamelCase=function(all,letter){return letter.toUpperCase()};function isArrayLike(obj){var length=!!obj&&"length"in obj&&obj.length,type=jQuery.type(obj);return"function"!==type&&!jQuery.isWindow(obj)&&("array"===type||0===length||"number"==typeof length&&length>0&&length-1 in obj)}jQuery.fn=jQuery.prototype={jquery:"2.2.4",constructor:jQuery,selector:"",length:0,toArray:function(){return slice.call(this)},get:function(num){return null!=num?num<0?this[num+this.length]:this[num]:slice.call(this)},pushStack:function(elems){var ret=jQuery.merge(this.constructor(),elems);return ret.prevObject=this,ret.context=this.context,ret},each:function(callback){return jQuery.each(this,callback)},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem)}))},slice:function(){return this.pushStack(slice.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(i){var len=this.length,j=+i+(i<0?len:0);return this.pushStack(j>=0&&j=0},isPlainObject:function(obj){var key;if("object"!==jQuery.type(obj)||obj.nodeType||jQuery.isWindow(obj))return!1;if(obj.constructor&&!hasOwn.call(obj,"constructor")&&!hasOwn.call(obj.constructor.prototype||{},"isPrototypeOf"))return!1;for(key in obj);return void 0===key||hasOwn.call(obj,key)},isEmptyObject:function(obj){var name;for(name in obj)return!1;return!0},type:function(obj){return null==obj?obj+"":"object"==typeof obj||"function"==typeof obj?class2type[toString.call(obj)]||"object":typeof obj},globalEval:function(code){var script,indirect=eval;(code=jQuery.trim(code))&&(1===code.indexOf("use strict")?((script=document.createElement("script")).text=code,document.head.appendChild(script).parentNode.removeChild(script)):indirect(code))},camelCase:function(string){return string.replace(rmsPrefix,"ms-").replace(rdashAlpha,fcamelCase)},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase()},each:function(obj,callback){var length,i=0;if(isArrayLike(obj))for(length=obj.length;i+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={ID:new RegExp("^#("+identifier+")"),CLASS:new RegExp("^\\.("+identifier+")"),TAG:new RegExp("^("+identifier+"|[*])"),ATTR:new RegExp("^"+attributes),PSEUDO:new RegExp("^"+pseudos),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),bool:new RegExp("^(?:"+booleans+")$","i"),needsContext:new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,rescape=/'|\\/g,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-65536;return high!=high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+65536):String.fromCharCode(high>>10|55296,1023&high|56320)},unloadHandler=function(){setDocument()};try{push.apply(arr=slice.call(preferredDoc.childNodes),preferredDoc.childNodes),arr[preferredDoc.childNodes.length].nodeType}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els))}:function(target,els){for(var j=target.length,i=0;target[j++]=els[i++];);target.length=j-1}}}function Sizzle(selector,context,results,seed){var m,i,elem,nid,nidselect,match,groups,newSelector,newContext=context&&context.ownerDocument,nodeType=context?context.nodeType:9;if(results=results||[],"string"!=typeof selector||!selector||1!==nodeType&&9!==nodeType&&11!==nodeType)return results;if(!seed&&((context?context.ownerDocument||context:preferredDoc)!==document&&setDocument(context),context=context||document,documentIsHTML)){if(11!==nodeType&&(match=rquickExpr.exec(selector)))if(m=match[1]){if(9===nodeType){if(!(elem=context.getElementById(m)))return results;if(elem.id===m)return results.push(elem),results}else if(newContext&&(elem=newContext.getElementById(m))&&contains(context,elem)&&elem.id===m)return results.push(elem),results}else{if(match[2])return push.apply(results,context.getElementsByTagName(selector)),results;if((m=match[3])&&support.getElementsByClassName&&context.getElementsByClassName)return push.apply(results,context.getElementsByClassName(m)),results}if(support.qsa&&!compilerCache[selector+" "]&&(!rbuggyQSA||!rbuggyQSA.test(selector))){if(1!==nodeType)newContext=context,newSelector=selector;else if("object"!==context.nodeName.toLowerCase()){for((nid=context.getAttribute("id"))?nid=nid.replace(rescape,"\\$&"):context.setAttribute("id",nid=expando),i=(groups=tokenize(selector)).length,nidselect=ridentifier.test(nid)?"#"+nid:"[id='"+nid+"']";i--;)groups[i]=nidselect+" "+toSelector(groups[i]);newSelector=groups.join(","),newContext=rsibling.test(selector)&&testContext(context.parentNode)||context}if(newSelector)try{return push.apply(results,newContext.querySelectorAll(newSelector)),results}catch(qsaError){}finally{nid===expando&&context.removeAttribute("id")}}}return select(selector.replace(rtrim,"$1"),context,results,seed)}function createCache(){var keys=[];return function cache(key,value){return keys.push(key+" ")>Expr.cacheLength&&delete cache[keys.shift()],cache[key+" "]=value}}function markFunction(fn){return fn[expando]=!0,fn}function assert(fn){var div=document.createElement("div");try{return!!fn(div)}catch(e){return!1}finally{div.parentNode&&div.parentNode.removeChild(div),div=null}}function addHandle(attrs,handler){for(var arr=attrs.split("|"),i=arr.length;i--;)Expr.attrHandle[arr[i]]=handler}function siblingCheck(a,b){var cur=b&&a,diff=cur&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||MAX_NEGATIVE)-(~a.sourceIndex||MAX_NEGATIVE);if(diff)return diff;if(cur)for(;cur=cur.nextSibling;)if(cur===b)return-1;return a?1:-1}function createInputPseudo(type){return function(elem){return"input"===elem.nodeName.toLowerCase()&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return("input"===name||"button"===name)&&elem.type===type}}function createPositionalPseudo(fn){return markFunction(function(argument){return argument=+argument,markFunction(function(seed,matches){for(var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;i--;)seed[j=matchIndexes[i]]&&(seed[j]=!(matches[j]=seed[j]))})})}function testContext(context){return context&&void 0!==context.getElementsByTagName&&context}for(i in support=Sizzle.support={},isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return!!documentElement&&"HTML"!==documentElement.nodeName},setDocument=Sizzle.setDocument=function(node){var hasCompare,parent,doc=node?node.ownerDocument||node:preferredDoc;return doc!==document&&9===doc.nodeType&&doc.documentElement?(docElem=(document=doc).documentElement,documentIsHTML=!isXML(document),(parent=document.defaultView)&&parent.top!==parent&&(parent.addEventListener?parent.addEventListener("unload",unloadHandler,!1):parent.attachEvent&&parent.attachEvent("onunload",unloadHandler)),support.attributes=assert(function(div){return div.className="i",!div.getAttribute("className")}),support.getElementsByTagName=assert(function(div){return div.appendChild(document.createComment("")),!div.getElementsByTagName("*").length}),support.getElementsByClassName=rnative.test(document.getElementsByClassName),support.getById=assert(function(div){return docElem.appendChild(div).id=expando,!document.getElementsByName||!document.getElementsByName(expando).length}),support.getById?(Expr.find.ID=function(id,context){if(void 0!==context.getElementById&&documentIsHTML){var m=context.getElementById(id);return m?[m]:[]}},Expr.filter.ID=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId}}):(delete Expr.find.ID,Expr.filter.ID=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node=void 0!==elem.getAttributeNode&&elem.getAttributeNode("id");return node&&node.value===attrId}}),Expr.find.TAG=support.getElementsByTagName?function(tag,context){return void 0!==context.getElementsByTagName?context.getElementsByTagName(tag):support.qsa?context.querySelectorAll(tag):void 0}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if("*"===tag){for(;elem=results[i++];)1===elem.nodeType&&tmp.push(elem);return tmp}return results},Expr.find.CLASS=support.getElementsByClassName&&function(className,context){if(void 0!==context.getElementsByClassName&&documentIsHTML)return context.getElementsByClassName(className)},rbuggyMatches=[],rbuggyQSA=[],(support.qsa=rnative.test(document.querySelectorAll))&&(assert(function(div){docElem.appendChild(div).innerHTML="",div.querySelectorAll("[msallowcapture^='']").length&&rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")"),div.querySelectorAll("[selected]").length||rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")"),div.querySelectorAll("[id~="+expando+"-]").length||rbuggyQSA.push("~="),div.querySelectorAll(":checked").length||rbuggyQSA.push(":checked"),div.querySelectorAll("a#"+expando+"+*").length||rbuggyQSA.push(".#.+[+~]")}),assert(function(div){var input=document.createElement("input");input.setAttribute("type","hidden"),div.appendChild(input).setAttribute("name","D"),div.querySelectorAll("[name=d]").length&&rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?="),div.querySelectorAll(":enabled").length||rbuggyQSA.push(":enabled",":disabled"),div.querySelectorAll("*,:x"),rbuggyQSA.push(",.*:")})),(support.matchesSelector=rnative.test(matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector))&&assert(function(div){support.disconnectedMatch=matches.call(div,"div"),matches.call(div,"[s!='']:x"),rbuggyMatches.push("!=",pseudos)}),rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|")),rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|")),hasCompare=rnative.test(docElem.compareDocumentPosition),contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=9===a.nodeType?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!(!bup||1!==bup.nodeType||!(adown.contains?adown.contains(bup):a.compareDocumentPosition&&16&a.compareDocumentPosition(bup)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},sortOrder=hasCompare?function(a,b){if(a===b)return hasDuplicate=!0,0;var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;return compare||(1&(compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1)||!support.sortDetached&&b.compareDocumentPosition(a)===compare?a===document||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)?-1:b===document||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)?1:sortInput?indexOf(sortInput,a)-indexOf(sortInput,b):0:4&compare?-1:1)}:function(a,b){if(a===b)return hasDuplicate=!0,0;var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup)return a===document?-1:b===document?1:aup?-1:bup?1:sortInput?indexOf(sortInput,a)-indexOf(sortInput,b):0;if(aup===bup)return siblingCheck(a,b);for(cur=a;cur=cur.parentNode;)ap.unshift(cur);for(cur=b;cur=cur.parentNode;)bp.unshift(cur);for(;ap[i]===bp[i];)i++;return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0},document):document},Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)},Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document&&setDocument(elem),expr=expr.replace(rattributeQuotes,"='$1']"),support.matchesSelector&&documentIsHTML&&!compilerCache[expr+" "]&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr)))try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&11!==elem.document.nodeType)return ret}catch(e){}return Sizzle(expr,document,null,[elem]).length>0},Sizzle.contains=function(context,elem){return(context.ownerDocument||context)!==document&&setDocument(context),contains(context,elem)},Sizzle.attr=function(elem,name){(elem.ownerDocument||elem)!==document&&setDocument(elem);var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):void 0;return void 0!==val?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null},Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg)},Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;if(hasDuplicate=!support.detectDuplicates,sortInput=!support.sortStable&&results.slice(0),results.sort(sortOrder),hasDuplicate){for(;elem=results[i++];)elem===results[i]&&(j=duplicates.push(i));for(;j--;)results.splice(duplicates[j],1)}return sortInput=null,results},getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(nodeType){if(1===nodeType||9===nodeType||11===nodeType){if("string"==typeof elem.textContent)return elem.textContent;for(elem=elem.firstChild;elem;elem=elem.nextSibling)ret+=getText(elem)}else if(3===nodeType||4===nodeType)return elem.nodeValue}else for(;node=elem[i++];)ret+=getText(node);return ret},(Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(match){return match[1]=match[1].replace(runescape,funescape),match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape),"~="===match[2]&&(match[3]=" "+match[3]+" "),match.slice(0,4)},CHILD:function(match){return match[1]=match[1].toLowerCase(),"nth"===match[1].slice(0,3)?(match[3]||Sizzle.error(match[0]),match[4]=+(match[4]?match[5]+(match[6]||1):2*("even"===match[3]||"odd"===match[3])),match[5]=+(match[7]+match[8]||"odd"===match[3])):match[3]&&Sizzle.error(match[0]),match},PSEUDO:function(match){var excess,unquoted=!match[6]&&match[2];return matchExpr.CHILD.test(match[0])?null:(match[3]?match[2]=match[4]||match[5]||"":unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,!0))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)&&(match[0]=match[0].slice(0,excess),match[2]=unquoted.slice(0,excess)),match.slice(0,3))}},filter:{TAG:function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return"*"===nodeNameSelector?function(){return!0}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},CLASS:function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test("string"==typeof elem.className&&elem.className||void 0!==elem.getAttribute&&elem.getAttribute("class")||"")})},ATTR:function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);return null==result?"!="===operator:!operator||(result+="","="===operator?result===check:"!="===operator?result!==check:"^="===operator?check&&0===result.indexOf(check):"*="===operator?check&&result.indexOf(check)>-1:"$="===operator?check&&result.slice(-check.length)===check:"~="===operator?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:"|="===operator&&(result===check||result.slice(0,check.length+1)===check+"-"))}},CHILD:function(type,what,argument,first,last){var simple="nth"!==type.slice(0,3),forward="last"!==type.slice(-4),ofType="of-type"===what;return 1===first&&0===last?function(elem){return!!elem.parentNode}:function(elem,context,xml){var cache,uniqueCache,outerCache,node,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType,diff=!1;if(parent){if(simple){for(;dir;){for(node=elem;node=node[dir];)if(ofType?node.nodeName.toLowerCase()===name:1===node.nodeType)return!1;start=dir="only"===type&&!start&&"nextSibling"}return!0}if(start=[forward?parent.firstChild:parent.lastChild],forward&&useCache){for(diff=(nodeIndex=(cache=(uniqueCache=(outerCache=(node=parent)[expando]||(node[expando]={}))[node.uniqueID]||(outerCache[node.uniqueID]={}))[type]||[])[0]===dirruns&&cache[1])&&cache[2],node=nodeIndex&&parent.childNodes[nodeIndex];node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop();)if(1===node.nodeType&&++diff&&node===elem){uniqueCache[type]=[dirruns,nodeIndex,diff];break}}else if(useCache&&(diff=nodeIndex=(cache=(uniqueCache=(outerCache=(node=elem)[expando]||(node[expando]={}))[node.uniqueID]||(outerCache[node.uniqueID]={}))[type]||[])[0]===dirruns&&cache[1]),!1===diff)for(;(node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())&&((ofType?node.nodeName.toLowerCase()!==name:1!==node.nodeType)||!++diff||(useCache&&((uniqueCache=(outerCache=node[expando]||(node[expando]={}))[node.uniqueID]||(outerCache[node.uniqueID]={}))[type]=[dirruns,diff]),node!==elem)););return(diff-=last)===first||diff%first==0&&diff/first>=0}}},PSEUDO:function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);return fn[expando]?fn(argument):fn.length>1?(args=[pseudo,pseudo,"",argument],Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){for(var idx,matched=fn(seed,argument),i=matched.length;i--;)seed[idx=indexOf(seed,matched[i])]=!(matches[idx]=matched[i])}):function(elem){return fn(elem,0,args)}):fn}},pseudos:{not:markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){for(var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;i--;)(elem=unmatched[i])&&(seed[i]=!(matches[i]=elem))}):function(elem,context,xml){return input[0]=elem,matcher(input,null,xml,results),input[0]=null,!results.pop()}}),has:markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),contains:markFunction(function(text){return text=text.replace(runescape,funescape),function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),lang:markFunction(function(lang){return ridentifier.test(lang||"")||Sizzle.error("unsupported lang: "+lang),lang=lang.replace(runescape,funescape).toLowerCase(),function(elem){var elemLang;do{if(elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))return(elemLang=elemLang.toLowerCase())===lang||0===elemLang.indexOf(lang+"-")}while((elem=elem.parentNode)&&1===elem.nodeType);return!1}}),target:function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id},root:function(elem){return elem===docElem},focus:function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},enabled:function(elem){return!1===elem.disabled},disabled:function(elem){return!0===elem.disabled},checked:function(elem){var nodeName=elem.nodeName.toLowerCase();return"input"===nodeName&&!!elem.checked||"option"===nodeName&&!!elem.selected},selected:function(elem){return elem.parentNode&&elem.parentNode.selectedIndex,!0===elem.selected},empty:function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling)if(elem.nodeType<6)return!1;return!0},parent:function(elem){return!Expr.pseudos.empty(elem)},header:function(elem){return rheader.test(elem.nodeName)},input:function(elem){return rinputs.test(elem.nodeName)},button:function(elem){var name=elem.nodeName.toLowerCase();return"input"===name&&"button"===elem.type||"button"===name},text:function(elem){var attr;return"input"===elem.nodeName.toLowerCase()&&"text"===elem.type&&(null==(attr=elem.getAttribute("type"))||"text"===attr.toLowerCase())},first:createPositionalPseudo(function(){return[0]}),last:createPositionalPseudo(function(matchIndexes,length){return[length-1]}),eq:createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),even:createPositionalPseudo(function(matchIndexes,length){for(var i=0;i=0;)matchIndexes.push(i);return matchIndexes}),gt:createPositionalPseudo(function(matchIndexes,length,argument){for(var i=argument<0?argument+length:argument;++i1?function(elem,context,xml){for(var i=matchers.length;i--;)if(!matchers[i](elem,context,xml))return!1;return!0}:matchers[0]}function condense(unmatched,map,filter,context,xml){for(var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=null!=map;i-1&&(seed[temp]=!(results[temp]=elem))}}else matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut),postFinder?postFinder(null,results,matcherOut,xml):push.apply(results,matcherOut)})}function matcherFromTokens(tokens){for(var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,!0),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1},implicitRelative,!0),matchers=[function(elem,context,xml){var ret=!leadingRelative&&(xml||context!==outermostContext)||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));return checkContext=null,ret}];i1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:" "===tokens[i-2].type?"*":""})).replace(rtrim,"$1"),matcher,i0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find.TAG("*",outermost),dirrunsUnique=dirruns+=null==contextBackup?1:Math.random()||.1,len=elems.length;for(outermost&&(outermostContext=context===document||context||outermost);i!==len&&null!=(elem=elems[i]);i++){if(byElement&&elem){for(j=0,context||elem.ownerDocument===document||(setDocument(elem),xml=!documentIsHTML);matcher=elementMatchers[j++];)if(matcher(elem,context||document,xml)){results.push(elem);break}outermost&&(dirruns=dirrunsUnique)}bySet&&((elem=!matcher&&elem)&&matchedCount--,seed&&unmatched.push(elem))}if(matchedCount+=i,bySet&&i!==matchedCount){for(j=0;matcher=setMatchers[j++];)matcher(unmatched,setMatched,context,xml);if(seed){if(matchedCount>0)for(;i--;)unmatched[i]||setMatched[i]||(setMatched[i]=pop.call(results));setMatched=condense(setMatched)}push.apply(results,setMatched),outermost&&!seed&&setMatched.length>0&&matchedCount+setMatchers.length>1&&Sizzle.uniqueSort(results)}return outermost&&(dirruns=dirrunsUnique,outermostContext=contextBackup),unmatched};return bySet?markFunction(superMatcher):superMatcher}(elementMatchers,setMatchers))).selector=selector}return cached},select=Sizzle.select=function(selector,context,results,seed){var i,tokens,token,type,find,compiled="function"==typeof selector&&selector,match=!seed&&tokenize(selector=compiled.selector||selector);if(results=results||[],1===match.length){if((tokens=match[0]=match[0].slice(0)).length>2&&"ID"===(token=tokens[0]).type&&support.getById&&9===context.nodeType&&documentIsHTML&&Expr.relative[tokens[1].type]){if(!(context=(Expr.find.ID(token.matches[0].replace(runescape,funescape),context)||[])[0]))return results;compiled&&(context=context.parentNode),selector=selector.slice(tokens.shift().value.length)}for(i=matchExpr.needsContext.test(selector)?0:tokens.length;i--&&(token=tokens[i],!Expr.relative[type=token.type]);)if((find=Expr.find[type])&&(seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){if(tokens.splice(i,1),!(selector=seed.length&&toSelector(tokens)))return push.apply(results,seed),results;break}}return(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,!context||rsibling.test(selector)&&testContext(context.parentNode)||context),results},support.sortStable=expando.split("").sort(sortOrder).join("")===expando,support.detectDuplicates=!!hasDuplicate,setDocument(),support.sortDetached=assert(function(div1){return 1&div1.compareDocumentPosition(document.createElement("div"))}),assert(function(div){return div.innerHTML="","#"===div.firstChild.getAttribute("href")})||addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML)return elem.getAttribute(name,"type"===name.toLowerCase()?1:2)}),support.attributes&&assert(function(div){return div.innerHTML="",div.firstChild.setAttribute("value",""),""===div.firstChild.getAttribute("value")})||addHandle("value",function(elem,name,isXML){if(!isXML&&"input"===elem.nodeName.toLowerCase())return elem.defaultValue}),assert(function(div){return null==div.getAttribute("disabled")})||addHandle(booleans,function(elem,name,isXML){var val;if(!isXML)return!0===elem[name]?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null}),Sizzle}(window);jQuery.find=Sizzle,jQuery.expr=Sizzle.selectors,jQuery.expr[":"]=jQuery.expr.pseudos,jQuery.uniqueSort=jQuery.unique=Sizzle.uniqueSort,jQuery.text=Sizzle.getText,jQuery.isXMLDoc=Sizzle.isXML,jQuery.contains=Sizzle.contains;var dir=function(elem,dir,until){for(var matched=[],truncate=void 0!==until;(elem=elem[dir])&&9!==elem.nodeType;)if(1===elem.nodeType){if(truncate&&jQuery(elem).is(until))break;matched.push(elem)}return matched},siblings=function(n,elem){for(var matched=[];n;n=n.nextSibling)1===n.nodeType&&n!==elem&&matched.push(n);return matched},rneedsContext=jQuery.expr.match.needsContext,rsingleTag=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,risSimple=/^.[^:#\[\.,]*$/;function winnow(elements,qualifier,not){if(jQuery.isFunction(qualifier))return jQuery.grep(elements,function(elem,i){return!!qualifier.call(elem,i,elem)!==not});if(qualifier.nodeType)return jQuery.grep(elements,function(elem){return elem===qualifier!==not});if("string"==typeof qualifier){if(risSimple.test(qualifier))return jQuery.filter(qualifier,elements,not);qualifier=jQuery.filter(qualifier,elements)}return jQuery.grep(elements,function(elem){return indexOf.call(qualifier,elem)>-1!==not})}jQuery.filter=function(expr,elems,not){var elem=elems[0];return not&&(expr=":not("+expr+")"),1===elems.length&&1===elem.nodeType?jQuery.find.matchesSelector(elem,expr)?[elem]:[]:jQuery.find.matches(expr,jQuery.grep(elems,function(elem){return 1===elem.nodeType}))},jQuery.fn.extend({find:function(selector){var i,len=this.length,ret=[],self=this;if("string"!=typeof selector)return this.pushStack(jQuery(selector).filter(function(){for(i=0;i1?jQuery.unique(ret):ret)).selector=this.selector?this.selector+" "+selector:selector,ret},filter:function(selector){return this.pushStack(winnow(this,selector||[],!1))},not:function(selector){return this.pushStack(winnow(this,selector||[],!0))},is:function(selector){return!!winnow(this,"string"==typeof selector&&rneedsContext.test(selector)?jQuery(selector):selector||[],!1).length}});var rootjQuery,rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;(jQuery.fn.init=function(selector,context,root){var match,elem;if(!selector)return this;if(root=root||rootjQuery,"string"==typeof selector){if(!(match="<"===selector[0]&&">"===selector[selector.length-1]&&selector.length>=3?[null,selector,null]:rquickExpr.exec(selector))||!match[1]&&context)return!context||context.jquery?(context||root).find(selector):this.constructor(context).find(selector);if(match[1]){if(context=context instanceof jQuery?context[0]:context,jQuery.merge(this,jQuery.parseHTML(match[1],context&&context.nodeType?context.ownerDocument||context:document,!0)),rsingleTag.test(match[1])&&jQuery.isPlainObject(context))for(match in context)jQuery.isFunction(this[match])?this[match](context[match]):this.attr(match,context[match]);return this}return(elem=document.getElementById(match[2]))&&elem.parentNode&&(this.length=1,this[0]=elem),this.context=document,this.selector=selector,this}return selector.nodeType?(this.context=this[0]=selector,this.length=1,this):jQuery.isFunction(selector)?void 0!==root.ready?root.ready(selector):selector(jQuery):(void 0!==selector.selector&&(this.selector=selector.selector,this.context=selector.context),jQuery.makeArray(selector,this))}).prototype=jQuery.fn,rootjQuery=jQuery(document);var rparentsprev=/^(?:parents|prev(?:Until|All))/,guaranteedUnique={children:!0,contents:!0,next:!0,prev:!0};function sibling(cur,dir){for(;(cur=cur[dir])&&1!==cur.nodeType;);return cur}jQuery.fn.extend({has:function(target){var targets=jQuery(target,this),l=targets.length;return this.filter(function(){for(var i=0;i-1:1===cur.nodeType&&jQuery.find.matchesSelector(cur,selectors))){matched.push(cur);break}return this.pushStack(matched.length>1?jQuery.uniqueSort(matched):matched)},index:function(elem){return elem?"string"==typeof elem?indexOf.call(jQuery(elem),this[0]):indexOf.call(this,elem.jquery?elem[0]:elem):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(selector,context){return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(),jQuery(selector,context))))},addBack:function(selector){return this.add(null==selector?this.prevObject:this.prevObject.filter(selector))}}),jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&11!==parent.nodeType?parent:null},parents:function(elem){return dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"previousSibling")},nextAll:function(elem){return dir(elem,"nextSibling")},prevAll:function(elem){return dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return dir(elem,"previousSibling",until)},siblings:function(elem){return siblings((elem.parentNode||{}).firstChild,elem)},children:function(elem){return siblings(elem.firstChild)},contents:function(elem){return elem.contentDocument||jQuery.merge([],elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var matched=jQuery.map(this,fn,until);return"Until"!==name.slice(-5)&&(selector=until),selector&&"string"==typeof selector&&(matched=jQuery.filter(selector,matched)),this.length>1&&(guaranteedUnique[name]||jQuery.uniqueSort(matched),rparentsprev.test(name)&&matched.reverse()),this.pushStack(matched)}});var readyList,rnotwhite=/\S+/g;function completed(){document.removeEventListener("DOMContentLoaded",completed),window.removeEventListener("load",completed),jQuery.ready()}jQuery.Callbacks=function(options){options="string"==typeof options?function(options){var object={};return jQuery.each(options.match(rnotwhite)||[],function(_,flag){object[flag]=!0}),object}(options):jQuery.extend({},options);var firing,memory,fired,locked,list=[],queue=[],firingIndex=-1,fire=function(){for(locked=options.once,fired=firing=!0;queue.length;firingIndex=-1)for(memory=queue.shift();++firingIndex-1;)list.splice(index,1),index<=firingIndex&&firingIndex--}),this},has:function(fn){return fn?jQuery.inArray(fn,list)>-1:list.length>0},empty:function(){return list&&(list=[]),this},disable:function(){return locked=queue=[],list=memory="",this},disabled:function(){return!list},lock:function(){return locked=queue=[],memory||(list=memory=""),this},locked:function(){return!!locked},fireWith:function(context,args){return locked||(args=[context,(args=args||[]).slice?args.slice():args],queue.push(args),firing||fire()),this},fire:function(){return self.fireWith(this,arguments),this},fired:function(){return!!fired}};return self},jQuery.extend({Deferred:function(func){var tuples=[["resolve","done",jQuery.Callbacks("once memory"),"resolved"],["reject","fail",jQuery.Callbacks("once memory"),"rejected"],["notify","progress",jQuery.Callbacks("memory")]],state="pending",promise={state:function(){return state},always:function(){return deferred.done(arguments).fail(arguments),this},then:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var fn=jQuery.isFunction(fns[i])&&fns[i];deferred[tuple[1]](function(){var returned=fn&&fn.apply(this,arguments);returned&&jQuery.isFunction(returned.promise)?returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject):newDefer[tuple[0]+"With"](this===promise?newDefer.promise():this,fn?[returned]:arguments)})}),fns=null}).promise()},promise:function(obj){return null!=obj?jQuery.extend(obj,promise):promise}},deferred={};return promise.pipe=promise.then,jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[3];promise[tuple[1]]=list.add,stateString&&list.add(function(){state=stateString},tuples[1^i][2].disable,tuples[2][2].lock),deferred[tuple[0]]=function(){return deferred[tuple[0]+"With"](this===deferred?promise:this,arguments),this},deferred[tuple[0]+"With"]=list.fireWith}),promise.promise(deferred),func&&func.call(deferred,deferred),deferred},when:function(subordinate){var progressValues,progressContexts,resolveContexts,i=0,resolveValues=slice.call(arguments),length=resolveValues.length,remaining=1!==length||subordinate&&jQuery.isFunction(subordinate.promise)?length:0,deferred=1===remaining?subordinate:jQuery.Deferred(),updateFunc=function(i,contexts,values){return function(value){contexts[i]=this,values[i]=arguments.length>1?slice.call(arguments):value,values===progressValues?deferred.notifyWith(contexts,values):--remaining||deferred.resolveWith(contexts,values)}};if(length>1)for(progressValues=new Array(length),progressContexts=new Array(length),resolveContexts=new Array(length);i0||(readyList.resolveWith(document,[jQuery]),jQuery.fn.triggerHandler&&(jQuery(document).triggerHandler("ready"),jQuery(document).off("ready"))))}}),jQuery.ready.promise=function(obj){return readyList||(readyList=jQuery.Deferred(),"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(jQuery.ready):(document.addEventListener("DOMContentLoaded",completed),window.addEventListener("load",completed))),readyList.promise(obj)},jQuery.ready.promise();var access=function(elems,fn,key,value,chainable,emptyGet,raw){var i=0,len=elems.length,bulk=null==key;if("object"===jQuery.type(key))for(i in chainable=!0,key)access(elems,fn,i,key[i],!0,emptyGet,raw);else if(void 0!==value&&(chainable=!0,jQuery.isFunction(value)||(raw=!0),bulk&&(raw?(fn.call(elems,value),fn=null):(bulk=fn,fn=function(elem,key,value){return bulk.call(jQuery(elem),value)})),fn))for(;i-1&&void 0!==data&&dataUser.set(this,key,value)})},null,value,arguments.length>1,null,!0)},removeData:function(key){return this.each(function(){dataUser.remove(this,key)})}}),jQuery.extend({queue:function(elem,type,data){var queue;if(elem)return type=(type||"fx")+"queue",queue=dataPriv.get(elem,type),data&&(!queue||jQuery.isArray(data)?queue=dataPriv.access(elem,type,jQuery.makeArray(data)):queue.push(data)),queue||[]},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type);"inprogress"===fn&&(fn=queue.shift(),startLength--),fn&&("fx"===type&&queue.unshift("inprogress"),delete hooks.stop,fn.call(elem,function(){jQuery.dequeue(elem,type)},hooks)),!startLength&&hooks&&hooks.empty.fire()},_queueHooks:function(elem,type){var key=type+"queueHooks";return dataPriv.get(elem,key)||dataPriv.access(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){dataPriv.remove(elem,[type+"queue",key])})})}}),jQuery.fn.extend({queue:function(type,data){var setter=2;return"string"!=typeof type&&(data=type,type="fx",setter--),arguments.length",""],thead:[1,"","
                "],col:[2,"","
                "],tr:[2,"","
                "],td:[3,"","
                "],_default:[0,"",""]};function getAll(context,tag){var ret=void 0!==context.getElementsByTagName?context.getElementsByTagName(tag||"*"):void 0!==context.querySelectorAll?context.querySelectorAll(tag||"*"):[];return void 0===tag||tag&&jQuery.nodeName(context,tag)?jQuery.merge([context],ret):ret}function setGlobalEval(elems,refElements){for(var i=0,l=elems.length;i-1)ignored&&ignored.push(elem);else if(contains=jQuery.contains(elem.ownerDocument,elem),tmp=getAll(fragment.appendChild(elem),"script"),contains&&setGlobalEval(tmp),scripts)for(j=0;elem=tmp[j++];)rscriptType.test(elem.type||"")&&scripts.push(elem);return fragment}div=document.createDocumentFragment().appendChild(document.createElement("div")),(input=document.createElement("input")).setAttribute("type","radio"),input.setAttribute("checked","checked"),input.setAttribute("name","t"),div.appendChild(input),support.checkClone=div.cloneNode(!0).cloneNode(!0).lastChild.checked,div.innerHTML="",support.noCloneChecked=!!div.cloneNode(!0).lastChild.defaultValue;var rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,rtypenamespace=/^([^.]*)(?:\.(.+)|)/;function returnTrue(){return!0}function returnFalse(){return!1}function safeActiveElement(){try{return document.activeElement}catch(err){}}function on(elem,types,selector,data,fn,one){var origFn,type;if("object"==typeof types){for(type in"string"!=typeof selector&&(data=data||selector,selector=void 0),types)on(elem,type,selector,data,types[type],one);return elem}if(null==data&&null==fn?(fn=selector,data=selector=void 0):null==fn&&("string"==typeof selector?(fn=data,data=void 0):(fn=data,data=selector,selector=void 0)),!1===fn)fn=returnFalse;else if(!fn)return elem;return 1===one&&(origFn=fn,(fn=function(event){return jQuery().off(event),origFn.apply(this,arguments)}).guid=origFn.guid||(origFn.guid=jQuery.guid++)),elem.each(function(){jQuery.event.add(this,types,fn,data,selector)})}jQuery.event={global:{},add:function(elem,types,handler,data,selector){var handleObjIn,eventHandle,tmp,events,t,handleObj,special,handlers,type,namespaces,origType,elemData=dataPriv.get(elem);if(elemData)for(handler.handler&&(handler=(handleObjIn=handler).handler,selector=handleObjIn.selector),handler.guid||(handler.guid=jQuery.guid++),(events=elemData.events)||(events=elemData.events={}),(eventHandle=elemData.handle)||(eventHandle=elemData.handle=function(e){return void 0!==jQuery&&jQuery.event.triggered!==e.type?jQuery.event.dispatch.apply(elem,arguments):void 0}),t=(types=(types||"").match(rnotwhite)||[""]).length;t--;)type=origType=(tmp=rtypenamespace.exec(types[t])||[])[1],namespaces=(tmp[2]||"").split(".").sort(),type&&(special=jQuery.event.special[type]||{},type=(selector?special.delegateType:special.bindType)||type,special=jQuery.event.special[type]||{},handleObj=jQuery.extend({type,origType,data,handler,guid:handler.guid,selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn),(handlers=events[type])||((handlers=events[type]=[]).delegateCount=0,special.setup&&!1!==special.setup.call(elem,data,namespaces,eventHandle)||elem.addEventListener&&elem.addEventListener(type,eventHandle)),special.add&&(special.add.call(elem,handleObj),handleObj.handler.guid||(handleObj.handler.guid=handler.guid)),selector?handlers.splice(handlers.delegateCount++,0,handleObj):handlers.push(handleObj),jQuery.event.global[type]=!0)},remove:function(elem,types,handler,selector,mappedTypes){var j,origCount,tmp,events,t,handleObj,special,handlers,type,namespaces,origType,elemData=dataPriv.hasData(elem)&&dataPriv.get(elem);if(elemData&&(events=elemData.events)){for(t=(types=(types||"").match(rnotwhite)||[""]).length;t--;)if(type=origType=(tmp=rtypenamespace.exec(types[t])||[])[1],namespaces=(tmp[2]||"").split(".").sort(),type){for(special=jQuery.event.special[type]||{},handlers=events[type=(selector?special.delegateType:special.bindType)||type]||[],tmp=tmp[2]&&new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"),origCount=j=handlers.length;j--;)handleObj=handlers[j],!mappedTypes&&origType!==handleObj.origType||handler&&handler.guid!==handleObj.guid||tmp&&!tmp.test(handleObj.namespace)||selector&&selector!==handleObj.selector&&("**"!==selector||!handleObj.selector)||(handlers.splice(j,1),handleObj.selector&&handlers.delegateCount--,special.remove&&special.remove.call(elem,handleObj));origCount&&!handlers.length&&(special.teardown&&!1!==special.teardown.call(elem,namespaces,elemData.handle)||jQuery.removeEvent(elem,type,elemData.handle),delete events[type])}else for(type in events)jQuery.event.remove(elem,type+types[t],handler,selector,!0);jQuery.isEmptyObject(events)&&dataPriv.remove(elem,"handle events")}},dispatch:function(event){event=jQuery.event.fix(event);var i,j,ret,matched,handleObj,handlerQueue,args=slice.call(arguments),handlers=(dataPriv.get(this,"events")||{})[event.type]||[],special=jQuery.event.special[event.type]||{};if(args[0]=event,event.delegateTarget=this,!special.preDispatch||!1!==special.preDispatch.call(this,event)){for(handlerQueue=jQuery.event.handlers.call(this,event,handlers),i=0;(matched=handlerQueue[i++])&&!event.isPropagationStopped();)for(event.currentTarget=matched.elem,j=0;(handleObj=matched.handlers[j++])&&!event.isImmediatePropagationStopped();)event.rnamespace&&!event.rnamespace.test(handleObj.namespace)||(event.handleObj=handleObj,event.data=handleObj.data,void 0!==(ret=((jQuery.event.special[handleObj.origType]||{}).handle||handleObj.handler).apply(matched.elem,args))&&!1===(event.result=ret)&&(event.preventDefault(),event.stopPropagation()));return special.postDispatch&&special.postDispatch.call(this,event),event.result}},handlers:function(event,handlers){var i,matches,sel,handleObj,handlerQueue=[],delegateCount=handlers.delegateCount,cur=event.target;if(delegateCount&&cur.nodeType&&("click"!==event.type||isNaN(event.button)||event.button<1))for(;cur!==this;cur=cur.parentNode||this)if(1===cur.nodeType&&(!0!==cur.disabled||"click"!==event.type)){for(matches=[],i=0;i-1:jQuery.find(sel,this,null,[cur]).length),matches[sel]&&matches.push(handleObj);matches.length&&handlerQueue.push({elem:cur,handlers:matches})}return delegateCount]*)\/>/gi,rnoInnerhtml=/\s*$/g;function manipulationTarget(elem,content){return jQuery.nodeName(elem,"table")&&jQuery.nodeName(11!==content.nodeType?content:content.firstChild,"tr")?elem.getElementsByTagName("tbody")[0]||elem.appendChild(elem.ownerDocument.createElement("tbody")):elem}function disableScript(elem){return elem.type=(null!==elem.getAttribute("type"))+"/"+elem.type,elem}function restoreScript(elem){var match=rscriptTypeMasked.exec(elem.type);return match?elem.type=match[1]:elem.removeAttribute("type"),elem}function cloneCopyEvent(src,dest){var i,l,type,pdataOld,pdataCur,udataOld,udataCur,events;if(1===dest.nodeType){if(dataPriv.hasData(src)&&(pdataOld=dataPriv.access(src),pdataCur=dataPriv.set(dest,pdataOld),events=pdataOld.events))for(type in delete pdataCur.handle,pdataCur.events={},events)for(i=0,l=events[type].length;i1&&"string"==typeof value&&!support.checkClone&&rchecked.test(value))return collection.each(function(index){var self=collection.eq(index);isFunction&&(args[0]=value.call(this,index,self.html())),domManip(self,args,callback,ignored)});if(l&&(first=(fragment=buildFragment(args,collection[0].ownerDocument,!1,collection,ignored)).firstChild,1===fragment.childNodes.length&&(fragment=first),first||ignored)){for(hasScripts=(scripts=jQuery.map(getAll(fragment,"script"),disableScript)).length;i")},clone:function(elem,dataAndEvents,deepDataAndEvents){var i,l,srcElements,destElements,src,dest,nodeName,clone=elem.cloneNode(!0),inPage=jQuery.contains(elem.ownerDocument,elem);if(!(support.noCloneChecked||1!==elem.nodeType&&11!==elem.nodeType||jQuery.isXMLDoc(elem)))for(destElements=getAll(clone),i=0,l=(srcElements=getAll(elem)).length;i0&&setGlobalEval(destElements,!inPage&&getAll(elem,"script")),clone},cleanData:function(elems){for(var data,elem,type,special=jQuery.event.special,i=0;void 0!==(elem=elems[i]);i++)if(acceptData(elem)){if(data=elem[dataPriv.expando]){if(data.events)for(type in data.events)special[type]?jQuery.event.remove(elem,type):jQuery.removeEvent(elem,type,data.handle);elem[dataPriv.expando]=void 0}elem[dataUser.expando]&&(elem[dataUser.expando]=void 0)}}}),jQuery.fn.extend({domManip,detach:function(selector){return remove(this,selector,!0)},remove:function(selector){return remove(this,selector)},text:function(value){return access(this,function(value){return void 0===value?jQuery.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=value)})},null,value,arguments.length)},append:function(){return domManip(this,arguments,function(elem){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||manipulationTarget(this,elem).appendChild(elem)})},prepend:function(){return domManip(this,arguments,function(elem){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var target=manipulationTarget(this,elem);target.insertBefore(elem,target.firstChild)}})},before:function(){return domManip(this,arguments,function(elem){this.parentNode&&this.parentNode.insertBefore(elem,this)})},after:function(){return domManip(this,arguments,function(elem){this.parentNode&&this.parentNode.insertBefore(elem,this.nextSibling)})},empty:function(){for(var elem,i=0;null!=(elem=this[i]);i++)1===elem.nodeType&&(jQuery.cleanData(getAll(elem,!1)),elem.textContent="");return this},clone:function(dataAndEvents,deepDataAndEvents){return dataAndEvents=null!=dataAndEvents&&dataAndEvents,deepDataAndEvents=null==deepDataAndEvents?dataAndEvents:deepDataAndEvents,this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){return access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(void 0===value&&1===elem.nodeType)return elem.innerHTML;if("string"==typeof value&&!rnoInnerhtml.test(value)&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=jQuery.htmlPrefilter(value);try{for(;i")).appendTo(doc.documentElement))[0].contentDocument).write(),doc.close(),display=actualDisplay(nodeName,doc),iframe.detach()),elemdisplay[nodeName]=display),display}var rmargin=/^margin/,rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i"),getStyles=function(elem){var view=elem.ownerDocument.defaultView;return view&&view.opener||(view=window),view.getComputedStyle(elem)},swap=function(elem,options,callback,args){var ret,name,old={};for(name in options)old[name]=elem.style[name],elem.style[name]=options[name];for(name in ret=callback.apply(elem,args||[]),options)elem.style[name]=old[name];return ret},documentElement=document.documentElement;function curCSS(elem,name,computed){var width,minWidth,maxWidth,ret,style=elem.style;return""!==(ret=(computed=computed||getStyles(elem))?computed.getPropertyValue(name)||computed[name]:void 0)&&void 0!==ret||jQuery.contains(elem.ownerDocument,elem)||(ret=jQuery.style(elem,name)),computed&&!support.pixelMarginRight()&&rnumnonpx.test(ret)&&rmargin.test(name)&&(width=style.width,minWidth=style.minWidth,maxWidth=style.maxWidth,style.minWidth=style.maxWidth=style.width=ret,ret=computed.width,style.width=width,style.minWidth=minWidth,style.maxWidth=maxWidth),void 0!==ret?ret+"":ret}function addGetHookIf(conditionFn,hookFn){return{get:function(){if(!conditionFn())return(this.get=hookFn).apply(this,arguments);delete this.get}}}!function(){var pixelPositionVal,boxSizingReliableVal,pixelMarginRightVal,reliableMarginLeftVal,container=document.createElement("div"),div=document.createElement("div");function computeStyleTests(){div.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",div.innerHTML="",documentElement.appendChild(container);var divStyle=window.getComputedStyle(div);pixelPositionVal="1%"!==divStyle.top,reliableMarginLeftVal="2px"===divStyle.marginLeft,boxSizingReliableVal="4px"===divStyle.width,div.style.marginRight="50%",pixelMarginRightVal="4px"===divStyle.marginRight,documentElement.removeChild(container)}div.style&&(div.style.backgroundClip="content-box",div.cloneNode(!0).style.backgroundClip="",support.clearCloneStyle="content-box"===div.style.backgroundClip,container.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",container.appendChild(div),jQuery.extend(support,{pixelPosition:function(){return computeStyleTests(),pixelPositionVal},boxSizingReliable:function(){return null==boxSizingReliableVal&&computeStyleTests(),boxSizingReliableVal},pixelMarginRight:function(){return null==boxSizingReliableVal&&computeStyleTests(),pixelMarginRightVal},reliableMarginLeft:function(){return null==boxSizingReliableVal&&computeStyleTests(),reliableMarginLeftVal},reliableMarginRight:function(){var ret,marginDiv=div.appendChild(document.createElement("div"));return marginDiv.style.cssText=div.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",marginDiv.style.marginRight=marginDiv.style.width="0",div.style.width="1px",documentElement.appendChild(container),ret=!parseFloat(window.getComputedStyle(marginDiv).marginRight),documentElement.removeChild(container),div.removeChild(marginDiv),ret}}))}();var rdisplayswap=/^(none|table(?!-c[ea]).+)/,cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:"0",fontWeight:"400"},cssPrefixes=["Webkit","O","Moz","ms"],emptyStyle=document.createElement("div").style;function vendorPropName(name){if(name in emptyStyle)return name;for(var capName=name[0].toUpperCase()+name.slice(1),i=cssPrefixes.length;i--;)if((name=cssPrefixes[i]+capName)in emptyStyle)return name}function setPositiveNumber(elem,value,subtract){var matches=rcssNum.exec(value);return matches?Math.max(0,matches[2]-(subtract||0))+(matches[3]||"px"):value}function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){for(var i=extra===(isBorderBox?"border":"content")?4:"width"===name?1:0,val=0;i<4;i+=2)"margin"===extra&&(val+=jQuery.css(elem,extra+cssExpand[i],!0,styles)),isBorderBox?("content"===extra&&(val-=jQuery.css(elem,"padding"+cssExpand[i],!0,styles)),"margin"!==extra&&(val-=jQuery.css(elem,"border"+cssExpand[i]+"Width",!0,styles))):(val+=jQuery.css(elem,"padding"+cssExpand[i],!0,styles),"padding"!==extra&&(val+=jQuery.css(elem,"border"+cssExpand[i]+"Width",!0,styles)));return val}function getWidthOrHeight(elem,name,extra){var valueIsBorderBox=!0,val="width"===name?elem.offsetWidth:elem.offsetHeight,styles=getStyles(elem),isBorderBox="border-box"===jQuery.css(elem,"boxSizing",!1,styles);if(val<=0||null==val){if(((val=curCSS(elem,name,styles))<0||null==val)&&(val=elem.style[name]),rnumnonpx.test(val))return val;valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]),val=parseFloat(val)||0}return val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles)+"px"}function showHide(elements,show){for(var display,elem,hidden,values=[],index=0,length=elements.length;index1)},show:function(){return showHide(this,!0)},hide:function(){return showHide(this)},toggle:function(state){return"boolean"==typeof state?state?this.show():this.hide():this.each(function(){isHidden(this)?jQuery(this).show():jQuery(this).hide()})}}),jQuery.Tween=Tween,Tween.prototype={constructor:Tween,init:function(elem,options,prop,end,easing,unit){this.elem=elem,this.prop=prop,this.easing=easing||jQuery.easing._default,this.options=options,this.start=this.now=this.cur(),this.end=end,this.unit=unit||(jQuery.cssNumber[prop]?"":"px")},cur:function(){var hooks=Tween.propHooks[this.prop];return hooks&&hooks.get?hooks.get(this):Tween.propHooks._default.get(this)},run:function(percent){var eased,hooks=Tween.propHooks[this.prop];return this.options.duration?this.pos=eased=jQuery.easing[this.easing](percent,this.options.duration*percent,0,1,this.options.duration):this.pos=eased=percent,this.now=(this.end-this.start)*eased+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),hooks&&hooks.set?hooks.set(this):Tween.propHooks._default.set(this),this}},Tween.prototype.init.prototype=Tween.prototype,Tween.propHooks={_default:{get:function(tween){var result;return 1!==tween.elem.nodeType||null!=tween.elem[tween.prop]&&null==tween.elem.style[tween.prop]?tween.elem[tween.prop]:(result=jQuery.css(tween.elem,tween.prop,""))&&"auto"!==result?result:0},set:function(tween){jQuery.fx.step[tween.prop]?jQuery.fx.step[tween.prop](tween):1!==tween.elem.nodeType||null==tween.elem.style[jQuery.cssProps[tween.prop]]&&!jQuery.cssHooks[tween.prop]?tween.elem[tween.prop]=tween.now:jQuery.style(tween.elem,tween.prop,tween.now+tween.unit)}}},Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){tween.elem.nodeType&&tween.elem.parentNode&&(tween.elem[tween.prop]=tween.now)}},jQuery.easing={linear:function(p){return p},swing:function(p){return.5-Math.cos(p*Math.PI)/2},_default:"swing"},jQuery.fx=Tween.prototype.init,jQuery.fx.step={};var fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rrun=/queueHooks$/;function createFxNow(){return window.setTimeout(function(){fxNow=void 0}),fxNow=jQuery.now()}function genFx(type,includeWidth){var which,i=0,attrs={height:type};for(includeWidth=includeWidth?1:0;i<4;i+=2-includeWidth)attrs["margin"+(which=cssExpand[i])]=attrs["padding"+which]=type;return includeWidth&&(attrs.opacity=attrs.width=type),attrs}function createTween(value,prop,animation){for(var tween,collection=(Animation.tweeners[prop]||[]).concat(Animation.tweeners["*"]),index=0,length=collection.length;index1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})}}),jQuery.extend({attr:function(elem,name,value){var ret,hooks,nType=elem.nodeType;if(3!==nType&&8!==nType&&2!==nType)return void 0===elem.getAttribute?jQuery.prop(elem,name,value):(1===nType&&jQuery.isXMLDoc(elem)||(name=name.toLowerCase(),hooks=jQuery.attrHooks[name]||(jQuery.expr.match.bool.test(name)?boolHook:void 0)),void 0!==value?null===value?void jQuery.removeAttr(elem,name):hooks&&"set"in hooks&&void 0!==(ret=hooks.set(elem,value,name))?ret:(elem.setAttribute(name,value+""),value):hooks&&"get"in hooks&&null!==(ret=hooks.get(elem,name))?ret:null==(ret=jQuery.find.attr(elem,name))?void 0:ret)},attrHooks:{type:{set:function(elem,value){if(!support.radioValue&&"radio"===value&&jQuery.nodeName(elem,"input")){var val=elem.value;return elem.setAttribute("type",value),val&&(elem.value=val),value}}}},removeAttr:function(elem,value){var name,propName,i=0,attrNames=value&&value.match(rnotwhite);if(attrNames&&1===elem.nodeType)for(;name=attrNames[i++];)propName=jQuery.propFix[name]||name,jQuery.expr.match.bool.test(name)&&(elem[propName]=!1),elem.removeAttribute(name)}}),boolHook={set:function(elem,value,name){return!1===value?jQuery.removeAttr(elem,name):elem.setAttribute(name,name),name}},jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g),function(i,name){var getter=attrHandle[name]||jQuery.find.attr;attrHandle[name]=function(elem,name,isXML){var ret,handle;return isXML||(handle=attrHandle[name],attrHandle[name]=ret,ret=null!=getter(elem,name,isXML)?name.toLowerCase():null,attrHandle[name]=handle),ret}});var rfocusable=/^(?:input|select|textarea|button)$/i,rclickable=/^(?:a|area)$/i;jQuery.fn.extend({prop:function(name,value){return access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){return this.each(function(){delete this[jQuery.propFix[name]||name]})}}),jQuery.extend({prop:function(elem,name,value){var ret,hooks,nType=elem.nodeType;if(3!==nType&&8!==nType&&2!==nType)return 1===nType&&jQuery.isXMLDoc(elem)||(name=jQuery.propFix[name]||name,hooks=jQuery.propHooks[name]),void 0!==value?hooks&&"set"in hooks&&void 0!==(ret=hooks.set(elem,value,name))?ret:elem[name]=value:hooks&&"get"in hooks&&null!==(ret=hooks.get(elem,name))?ret:elem[name]},propHooks:{tabIndex:{get:function(elem){var tabindex=jQuery.find.attr(elem,"tabindex");return tabindex?parseInt(tabindex,10):rfocusable.test(elem.nodeName)||rclickable.test(elem.nodeName)&&elem.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),support.optSelected||(jQuery.propHooks.selected={get:function(elem){var parent=elem.parentNode;return parent&&parent.parentNode&&parent.parentNode.selectedIndex,null},set:function(elem){var parent=elem.parentNode;parent&&(parent.selectedIndex,parent.parentNode&&parent.parentNode.selectedIndex)}}),jQuery.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){jQuery.propFix[this.toLowerCase()]=this});var rclass=/[\t\r\n\f]/g;function getClass(elem){return elem.getAttribute&&elem.getAttribute("class")||""}jQuery.fn.extend({addClass:function(value){var classes,elem,cur,curValue,clazz,j,finalValue,i=0;if(jQuery.isFunction(value))return this.each(function(j){jQuery(this).addClass(value.call(this,j,getClass(this)))});if("string"==typeof value&&value)for(classes=value.match(rnotwhite)||[];elem=this[i++];)if(curValue=getClass(elem),cur=1===elem.nodeType&&(" "+curValue+" ").replace(rclass," ")){for(j=0;clazz=classes[j++];)cur.indexOf(" "+clazz+" ")<0&&(cur+=clazz+" ");curValue!==(finalValue=jQuery.trim(cur))&&elem.setAttribute("class",finalValue)}return this},removeClass:function(value){var classes,elem,cur,curValue,clazz,j,finalValue,i=0;if(jQuery.isFunction(value))return this.each(function(j){jQuery(this).removeClass(value.call(this,j,getClass(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof value&&value)for(classes=value.match(rnotwhite)||[];elem=this[i++];)if(curValue=getClass(elem),cur=1===elem.nodeType&&(" "+curValue+" ").replace(rclass," ")){for(j=0;clazz=classes[j++];)for(;cur.indexOf(" "+clazz+" ")>-1;)cur=cur.replace(" "+clazz+" "," ");curValue!==(finalValue=jQuery.trim(cur))&&elem.setAttribute("class",finalValue)}return this},toggleClass:function(value,stateVal){var type=typeof value;return"boolean"==typeof stateVal&&"string"===type?stateVal?this.addClass(value):this.removeClass(value):jQuery.isFunction(value)?this.each(function(i){jQuery(this).toggleClass(value.call(this,i,getClass(this),stateVal),stateVal)}):this.each(function(){var className,i,self,classNames;if("string"===type)for(i=0,self=jQuery(this),classNames=value.match(rnotwhite)||[];className=classNames[i++];)self.hasClass(className)?self.removeClass(className):self.addClass(className);else void 0!==value&&"boolean"!==type||((className=getClass(this))&&dataPriv.set(this,"__className__",className),this.setAttribute&&this.setAttribute("class",className||!1===value?"":dataPriv.get(this,"__className__")||""))})},hasClass:function(selector){var className,elem,i=0;for(className=" "+selector+" ";elem=this[i++];)if(1===elem.nodeType&&(" "+getClass(elem)+" ").replace(rclass," ").indexOf(className)>-1)return!0;return!1}});var rreturn=/\r/g,rspaces=/[\x20\t\r\n\f]+/g;jQuery.fn.extend({val:function(value){var hooks,ret,isFunction,elem=this[0];return arguments.length?(isFunction=jQuery.isFunction(value),this.each(function(i){var val;1===this.nodeType&&(null==(val=isFunction?value.call(this,i,jQuery(this).val()):value)?val="":"number"==typeof val?val+="":jQuery.isArray(val)&&(val=jQuery.map(val,function(value){return null==value?"":value+""})),(hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()])&&"set"in hooks&&void 0!==hooks.set(this,val,"value")||(this.value=val))})):elem?(hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()])&&"get"in hooks&&void 0!==(ret=hooks.get(elem,"value"))?ret:"string"==typeof(ret=elem.value)?ret.replace(rreturn,""):null==ret?"":ret:void 0}}),jQuery.extend({valHooks:{option:{get:function(elem){var val=jQuery.find.attr(elem,"value");return null!=val?val:jQuery.trim(jQuery.text(elem)).replace(rspaces," ")}},select:{get:function(elem){for(var value,option,options=elem.options,index=elem.selectedIndex,one="select-one"===elem.type||index<0,values=one?null:[],max=one?index+1:options.length,i=index<0?max:one?index:0;i-1)&&(optionSet=!0);return optionSet||(elem.selectedIndex=-1),values}}}}),jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={set:function(elem,value){if(jQuery.isArray(value))return elem.checked=jQuery.inArray(jQuery(elem).val(),value)>-1}},support.checkOn||(jQuery.valHooks[this].get=function(elem){return null===elem.getAttribute("value")?"on":elem.value})});var rfocusMorph=/^(?:focusinfocus|focusoutblur)$/;jQuery.extend(jQuery.event,{trigger:function(event,data,elem,onlyHandlers){var i,cur,tmp,bubbleType,ontype,handle,special,eventPath=[elem||document],type=hasOwn.call(event,"type")?event.type:event,namespaces=hasOwn.call(event,"namespace")?event.namespace.split("."):[];if(cur=tmp=elem=elem||document,3!==elem.nodeType&&8!==elem.nodeType&&!rfocusMorph.test(type+jQuery.event.triggered)&&(type.indexOf(".")>-1&&(namespaces=type.split("."),type=namespaces.shift(),namespaces.sort()),ontype=type.indexOf(":")<0&&"on"+type,(event=event[jQuery.expando]?event:new jQuery.Event(type,"object"==typeof event&&event)).isTrigger=onlyHandlers?2:3,event.namespace=namespaces.join("."),event.rnamespace=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,event.result=void 0,event.target||(event.target=elem),data=null==data?[event]:jQuery.makeArray(data,[event]),special=jQuery.event.special[type]||{},onlyHandlers||!special.trigger||!1!==special.trigger.apply(elem,data))){if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){for(bubbleType=special.delegateType||type,rfocusMorph.test(bubbleType+type)||(cur=cur.parentNode);cur;cur=cur.parentNode)eventPath.push(cur),tmp=cur;tmp===(elem.ownerDocument||document)&&eventPath.push(tmp.defaultView||tmp.parentWindow||window)}for(i=0;(cur=eventPath[i++])&&!event.isPropagationStopped();)event.type=i>1?bubbleType:special.bindType||type,(handle=(dataPriv.get(cur,"events")||{})[event.type]&&dataPriv.get(cur,"handle"))&&handle.apply(cur,data),(handle=ontype&&cur[ontype])&&handle.apply&&acceptData(cur)&&(event.result=handle.apply(cur,data),!1===event.result&&event.preventDefault());return event.type=type,onlyHandlers||event.isDefaultPrevented()||special._default&&!1!==special._default.apply(eventPath.pop(),data)||!acceptData(elem)||ontype&&jQuery.isFunction(elem[type])&&!jQuery.isWindow(elem)&&((tmp=elem[ontype])&&(elem[ontype]=null),jQuery.event.triggered=type,elem[type](),jQuery.event.triggered=void 0,tmp&&(elem[ontype]=tmp)),event.result}},simulate:function(type,elem,event){var e=jQuery.extend(new jQuery.Event,event,{type,isSimulated:!0});jQuery.event.trigger(e,null,elem)}}),jQuery.fn.extend({trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this)})},triggerHandler:function(type,data){var elem=this[0];if(elem)return jQuery.event.trigger(type,data,elem,!0)}}),jQuery.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(i,name){jQuery.fn[name]=function(data,fn){return arguments.length>0?this.on(name,null,data,fn):this.trigger(name)}}),jQuery.fn.extend({hover:function(fnOver,fnOut){return this.mouseenter(fnOver).mouseleave(fnOut||fnOver)}}),support.focusin="onfocusin"in window,support.focusin||jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event))};jQuery.event.special[fix]={setup:function(){var doc=this.ownerDocument||this,attaches=dataPriv.access(doc,fix);attaches||doc.addEventListener(orig,handler,!0),dataPriv.access(doc,fix,(attaches||0)+1)},teardown:function(){var doc=this.ownerDocument||this,attaches=dataPriv.access(doc,fix)-1;attaches?dataPriv.access(doc,fix,attaches):(doc.removeEventListener(orig,handler,!0),dataPriv.remove(doc,fix))}}});var location=window.location,nonce=jQuery.now(),rquery=/\?/;jQuery.parseJSON=function(data){return JSON.parse(data+"")},jQuery.parseXML=function(data){var xml;if(!data||"string"!=typeof data)return null;try{xml=(new window.DOMParser).parseFromString(data,"text/xml")}catch(e){xml=void 0}return xml&&!xml.getElementsByTagName("parsererror").length||jQuery.error("Invalid XML: "+data),xml};var rhash=/#.*$/,rts=/([?&])_=[^&]*/,rheaders=/^(.*?):[ \t]*([^\r\n]*)$/gm,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,prefilters={},transports={},allTypes="*/".concat("*"),originAnchor=document.createElement("a");function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){"string"!=typeof dataTypeExpression&&(func=dataTypeExpression,dataTypeExpression="*");var dataType,i=0,dataTypes=dataTypeExpression.toLowerCase().match(rnotwhite)||[];if(jQuery.isFunction(func))for(;dataType=dataTypes[i++];)"+"===dataType[0]?(dataType=dataType.slice(1)||"*",(structure[dataType]=structure[dataType]||[]).unshift(func)):(structure[dataType]=structure[dataType]||[]).push(func)}}function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR){var inspected={},seekingTransport=structure===transports;function inspect(dataType){var selected;return inspected[dataType]=!0,jQuery.each(structure[dataType]||[],function(_,prefilterOrFactory){var dataTypeOrTransport=prefilterOrFactory(options,originalOptions,jqXHR);return"string"!=typeof dataTypeOrTransport||seekingTransport||inspected[dataTypeOrTransport]?seekingTransport?!(selected=dataTypeOrTransport):void 0:(options.dataTypes.unshift(dataTypeOrTransport),inspect(dataTypeOrTransport),!1)}),selected}return inspect(options.dataTypes[0])||!inspected["*"]&&inspect("*")}function ajaxExtend(target,src){var key,deep,flatOptions=jQuery.ajaxSettings.flatOptions||{};for(key in src)void 0!==src[key]&&((flatOptions[key]?target:deep||(deep={}))[key]=src[key]);return deep&&jQuery.extend(!0,target,deep),target}originAnchor.href=location.href,jQuery.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:location.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(location.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":jQuery.parseJSON,"text xml":jQuery.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(target,settings){return settings?ajaxExtend(ajaxExtend(target,jQuery.ajaxSettings),settings):ajaxExtend(jQuery.ajaxSettings,target)},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){"object"==typeof url&&(options=url,url=void 0),options=options||{};var transport,cacheURL,responseHeadersString,responseHeaders,timeoutTimer,urlAnchor,fireGlobals,i,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=s.context&&(callbackContext.nodeType||callbackContext.jquery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},state=0,strAbort="canceled",jqXHR={readyState:0,getResponseHeader:function(key){var match;if(2===state){if(!responseHeaders)for(responseHeaders={};match=rheaders.exec(responseHeadersString);)responseHeaders[match[1].toLowerCase()]=match[2];match=responseHeaders[key.toLowerCase()]}return null==match?null:match},getAllResponseHeaders:function(){return 2===state?responseHeadersString:null},setRequestHeader:function(name,value){var lname=name.toLowerCase();return state||(name=requestHeadersNames[lname]=requestHeadersNames[lname]||name,requestHeaders[name]=value),this},overrideMimeType:function(type){return state||(s.mimeType=type),this},statusCode:function(map){var code;if(map)if(state<2)for(code in map)statusCode[code]=[statusCode[code],map[code]];else jqXHR.always(map[jqXHR.status]);return this},abort:function(statusText){var finalText=statusText||strAbort;return transport&&transport.abort(finalText),done(0,finalText),this}};if(deferred.promise(jqXHR).complete=completeDeferred.add,jqXHR.success=jqXHR.done,jqXHR.error=jqXHR.fail,s.url=((url||s.url||location.href)+"").replace(rhash,"").replace(rprotocol,location.protocol+"//"),s.type=options.method||options.type||s.method||s.type,s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().match(rnotwhite)||[""],null==s.crossDomain){urlAnchor=document.createElement("a");try{urlAnchor.href=s.url,urlAnchor.href=urlAnchor.href,s.crossDomain=originAnchor.protocol+"//"+originAnchor.host!=urlAnchor.protocol+"//"+urlAnchor.host}catch(e){s.crossDomain=!0}}if(s.data&&s.processData&&"string"!=typeof s.data&&(s.data=jQuery.param(s.data,s.traditional)),inspectPrefiltersOrTransports(prefilters,s,options,jqXHR),2===state)return jqXHR;for(i in(fireGlobals=jQuery.event&&s.global)&&0==jQuery.active++&&jQuery.event.trigger("ajaxStart"),s.type=s.type.toUpperCase(),s.hasContent=!rnoContent.test(s.type),cacheURL=s.url,s.hasContent||(s.data&&(cacheURL=s.url+=(rquery.test(cacheURL)?"&":"?")+s.data,delete s.data),!1===s.cache&&(s.url=rts.test(cacheURL)?cacheURL.replace(rts,"$1_="+nonce++):cacheURL+(rquery.test(cacheURL)?"&":"?")+"_="+nonce++)),s.ifModified&&(jQuery.lastModified[cacheURL]&&jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[cacheURL]),jQuery.etag[cacheURL]&&jqXHR.setRequestHeader("If-None-Match",jQuery.etag[cacheURL])),(s.data&&s.hasContent&&!1!==s.contentType||options.contentType)&&jqXHR.setRequestHeader("Content-Type",s.contentType),jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+("*"!==s.dataTypes[0]?", "+allTypes+"; q=0.01":""):s.accepts["*"]),s.headers)jqXHR.setRequestHeader(i,s.headers[i]);if(s.beforeSend&&(!1===s.beforeSend.call(callbackContext,jqXHR,s)||2===state))return jqXHR.abort();for(i in strAbort="abort",{success:1,error:1,complete:1})jqXHR[i](s[i]);if(transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR)){if(jqXHR.readyState=1,fireGlobals&&globalEventContext.trigger("ajaxSend",[jqXHR,s]),2===state)return jqXHR;s.async&&s.timeout>0&&(timeoutTimer=window.setTimeout(function(){jqXHR.abort("timeout")},s.timeout));try{state=1,transport.send(requestHeaders,done)}catch(e){if(!(state<2))throw e;done(-1,e)}}else done(-1,"No Transport");function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;2!==state&&(state=2,timeoutTimer&&window.clearTimeout(timeoutTimer),transport=void 0,responseHeadersString=headers||"",jqXHR.readyState=status>0?4:0,isSuccess=status>=200&&status<300||304===status,responses&&(response=function(s,jqXHR,responses){for(var ct,type,finalDataType,firstDataType,contents=s.contents,dataTypes=s.dataTypes;"*"===dataTypes[0];)dataTypes.shift(),void 0===ct&&(ct=s.mimeType||jqXHR.getResponseHeader("Content-Type"));if(ct)for(type in contents)if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}if(dataTypes[0]in responses)finalDataType=dataTypes[0];else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}firstDataType||(firstDataType=type)}finalDataType=finalDataType||firstDataType}if(finalDataType)return finalDataType!==dataTypes[0]&&dataTypes.unshift(finalDataType),responses[finalDataType]}(s,jqXHR,responses)),response=function(s,response,jqXHR,isSuccess){var conv2,current,conv,tmp,prev,converters={},dataTypes=s.dataTypes.slice();if(dataTypes[1])for(conv in s.converters)converters[conv.toLowerCase()]=s.converters[conv];for(current=dataTypes.shift();current;)if(s.responseFields[current]&&(jqXHR[s.responseFields[current]]=response),!prev&&isSuccess&&s.dataFilter&&(response=s.dataFilter(response,s.dataType)),prev=current,current=dataTypes.shift())if("*"===current)current=prev;else if("*"!==prev&&prev!==current){if(!(conv=converters[prev+" "+current]||converters["* "+current]))for(conv2 in converters)if((tmp=conv2.split(" "))[1]===current&&(conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]])){!0===conv?conv=converters[conv2]:!0!==converters[conv2]&&(current=tmp[0],dataTypes.unshift(tmp[1]));break}if(!0!==conv)if(conv&&s.throws)response=conv(response);else try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}return{state:"success",data:response}}(s,response,jqXHR,isSuccess),isSuccess?(s.ifModified&&((modified=jqXHR.getResponseHeader("Last-Modified"))&&(jQuery.lastModified[cacheURL]=modified),(modified=jqXHR.getResponseHeader("etag"))&&(jQuery.etag[cacheURL]=modified)),204===status||"HEAD"===s.type?statusText="nocontent":304===status?statusText="notmodified":(statusText=response.state,success=response.data,isSuccess=!(error=response.error))):(error=statusText,!status&&statusText||(statusText="error",status<0&&(status=0))),jqXHR.status=status,jqXHR.statusText=(nativeStatusText||statusText)+"",isSuccess?deferred.resolveWith(callbackContext,[success,statusText,jqXHR]):deferred.rejectWith(callbackContext,[jqXHR,statusText,error]),jqXHR.statusCode(statusCode),statusCode=void 0,fireGlobals&&globalEventContext.trigger(isSuccess?"ajaxSuccess":"ajaxError",[jqXHR,s,isSuccess?success:error]),completeDeferred.fireWith(callbackContext,[jqXHR,statusText]),fireGlobals&&(globalEventContext.trigger("ajaxComplete",[jqXHR,s]),--jQuery.active||jQuery.event.trigger("ajaxStop")))}return jqXHR},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json")},getScript:function(url,callback){return jQuery.get(url,void 0,callback,"script")}}),jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){return jQuery.isFunction(data)&&(type=type||callback,callback=data,data=void 0),jQuery.ajax(jQuery.extend({url,type:method,dataType:type,data,success:callback},jQuery.isPlainObject(url)&&url))}}),jQuery._evalUrl=function(url){return jQuery.ajax({url,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},jQuery.fn.extend({wrapAll:function(html){var wrap;return jQuery.isFunction(html)?this.each(function(i){jQuery(this).wrapAll(html.call(this,i))}):(this[0]&&(wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&wrap.insertBefore(this[0]),wrap.map(function(){for(var elem=this;elem.firstElementChild;)elem=elem.firstElementChild;return elem}).append(this)),this)},wrapInner:function(html){return jQuery.isFunction(html)?this.each(function(i){jQuery(this).wrapInner(html.call(this,i))}):this.each(function(){var self=jQuery(this),contents=self.contents();contents.length?contents.wrapAll(html):self.append(html)})},wrap:function(html){var isFunction=jQuery.isFunction(html);return this.each(function(i){jQuery(this).wrapAll(isFunction?html.call(this,i):html)})},unwrap:function(){return this.parent().each(function(){jQuery.nodeName(this,"body")||jQuery(this).replaceWith(this.childNodes)}).end()}}),jQuery.expr.filters.hidden=function(elem){return!jQuery.expr.filters.visible(elem)},jQuery.expr.filters.visible=function(elem){return elem.offsetWidth>0||elem.offsetHeight>0||elem.getClientRects().length>0};var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,rsubmittable=/^(?:input|select|textarea|keygen)/i;function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj))jQuery.each(obj,function(i,v){traditional||rbracket.test(prefix)?add(prefix,v):buildParams(prefix+"["+("object"==typeof v&&null!=v?i:"")+"]",v,traditional,add)});else if(traditional||"object"!==jQuery.type(obj))add(prefix,obj);else for(name in obj)buildParams(prefix+"["+name+"]",obj[name],traditional,add)}jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,value){value=jQuery.isFunction(value)?value():null==value?"":value,s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(value)};if(void 0===traditional&&(traditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional),jQuery.isArray(a)||a.jquery&&!jQuery.isPlainObject(a))jQuery.each(a,function(){add(this.name,this.value)});else for(prefix in a)buildParams(prefix,a[prefix],traditional,add);return s.join("&").replace(r20,"+")},jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var elements=jQuery.prop(this,"elements");return elements?jQuery.makeArray(elements):this}).filter(function(){var type=this.type;return this.name&&!jQuery(this).is(":disabled")&&rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type)&&(this.checked||!rcheckableType.test(type))}).map(function(i,elem){var val=jQuery(this).val();return null==val?null:jQuery.isArray(val)?jQuery.map(val,function(val){return{name:elem.name,value:val.replace(rCRLF,"\r\n")}}):{name:elem.name,value:val.replace(rCRLF,"\r\n")}}).get()}}),jQuery.ajaxSettings.xhr=function(){try{return new window.XMLHttpRequest}catch(e){}};var xhrSuccessStatus={0:200,1223:204},xhrSupported=jQuery.ajaxSettings.xhr();support.cors=!!xhrSupported&&"withCredentials"in xhrSupported,support.ajax=xhrSupported=!!xhrSupported,jQuery.ajaxTransport(function(options){var callback,errorCallback;if(support.cors||xhrSupported&&!options.crossDomain)return{send:function(headers,complete){var i,xhr=options.xhr();if(xhr.open(options.type,options.url,options.async,options.username,options.password),options.xhrFields)for(i in options.xhrFields)xhr[i]=options.xhrFields[i];for(i in options.mimeType&&xhr.overrideMimeType&&xhr.overrideMimeType(options.mimeType),options.crossDomain||headers["X-Requested-With"]||(headers["X-Requested-With"]="XMLHttpRequest"),headers)xhr.setRequestHeader(i,headers[i]);callback=function(type){return function(){callback&&(callback=errorCallback=xhr.onload=xhr.onerror=xhr.onabort=xhr.onreadystatechange=null,"abort"===type?xhr.abort():"error"===type?"number"!=typeof xhr.status?complete(0,"error"):complete(xhr.status,xhr.statusText):complete(xhrSuccessStatus[xhr.status]||xhr.status,xhr.statusText,"text"!==(xhr.responseType||"text")||"string"!=typeof xhr.responseText?{binary:xhr.response}:{text:xhr.responseText},xhr.getAllResponseHeaders()))}},xhr.onload=callback(),errorCallback=xhr.onerror=callback("error"),void 0!==xhr.onabort?xhr.onabort=errorCallback:xhr.onreadystatechange=function(){4===xhr.readyState&&window.setTimeout(function(){callback&&errorCallback()})},callback=callback("abort");try{xhr.send(options.hasContent&&options.data||null)}catch(e){if(callback)throw e}},abort:function(){callback&&callback()}}}),jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(text){return jQuery.globalEval(text),text}}}),jQuery.ajaxPrefilter("script",function(s){void 0===s.cache&&(s.cache=!1),s.crossDomain&&(s.type="GET")}),jQuery.ajaxTransport("script",function(s){var script,callback;if(s.crossDomain)return{send:function(_,complete){script=jQuery(" +
                -
                + diff --git a/package.json b/package.json index 217f2f68c..6514a6771 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,8 @@ "matchdep": "2.0.0", "memoize-one": "5.0.0", "mkdirp": "0.5.1", + "mobx": "5.9.0", + "mobx-react": "5.4.3", "moment": "2.23.0", "moment-duration-format": "2.2.2", "moment-timezone": "0.5.23", @@ -106,13 +108,14 @@ }, "devDependencies": { "@babel/core": "7.2.2", - "@babel/preset-env": "7.2.3", + "@babel/plugin-proposal-class-properties": "7.3.0", + "@babel/plugin-proposal-decorators": "7.3.0", + "@babel/preset-env": "7.3.1", "@babel/preset-react": "7.0.0", "@commitlint/cli": "7.3.2", "@commitlint/config-conventional": "7.3.1", "@semantic-release/changelog": "3.0.2", "@semantic-release/git": "7.0.8", - "babel-core": "6.26.3", "babel-eslint": "10.0.1", "babel-loader": "8.0.5", "chai": "*", diff --git a/src/client/actions/tickets.js b/src/client/actions/tickets.js index a766584f9..8df431c9d 100644 --- a/src/client/actions/tickets.js +++ b/src/client/actions/tickets.js @@ -22,9 +22,11 @@ import { UPDATE_PRIORITY, CREATE_TAG, GET_TAGS_WITH_PAGE, - TAGS_UPDATE_CURRENT_PAGE + TAGS_UPDATE_CURRENT_PAGE, + CREATE_TICKET } from 'actions/types' +export const createTicket = createAction(CREATE_TICKET.ACTION) export const createTicketType = createAction(CREATE_TICKET_TYPE.ACTION, input => ({ name: input.name })) export const renameTicketType = createAction(RENAME_TICKET_TYPE.ACTION, input => ({ name: input.name })) export const deleteTicketType = createAction(DELETE_TICKET_TYPE.ACTION, (id, newTypeId) => ({ id, newTypeId })) diff --git a/src/client/actions/types.js b/src/client/actions/types.js index 7a027ae46..17344f834 100644 --- a/src/client/actions/types.js +++ b/src/client/actions/types.js @@ -25,6 +25,7 @@ export const SET_SESSION_USER = defineAction('SET_SESSION_USER') export const NAV_CHANGE = defineAction('NAV_CHANGE') // Tickets +export const CREATE_TICKET = defineAction('CREATE_TICKET', [PENDING, SUCCESS, ERROR]) export const CREATE_TICKET_TYPE = defineAction('CREATE_TICKET_TYPE', [SUCCESS, ERROR]) export const RENAME_TICKET_TYPE = defineAction('RENAME_TICKET_TYPE', [SUCCESS, ERROR]) export const DELETE_TICKET_TYPE = defineAction('DELETE_TICKET_TYPE', [SUCCESS, ERROR]) diff --git a/src/client/api/index.js b/src/client/api/index.js index b81089b7d..bf784941d 100644 --- a/src/client/api/index.js +++ b/src/client/api/index.js @@ -19,6 +19,12 @@ axios.defaults.headers.post['Content-Type'] = 'application/json' let api = {} api.tickets = {} +api.tickets.create = payload => { + return axios.post('/api/v1/tickets/create', payload).then(res => { + return res.data + }) +} + api.tickets.renameTicketType = (id, name) => { return axios.put('/api/v1/tickets/types/' + id, { name }).then(res => { return res.data diff --git a/src/client/app.jsx b/src/client/app.jsx index 64d77e386..a56f9d51d 100644 --- a/src/client/app.jsx +++ b/src/client/app.jsx @@ -20,9 +20,13 @@ import createSagaMiddleware from 'redux-saga' import { middleware as thunkMiddleware } from 'redux-saga-thunk' import IndexReducer from './reducers' import IndexSagas from './sagas' +import TopbarContainer from './containers/Topbar/TopbarContainer' import Sidebar from './components/Nav/Sidebar/index.jsx' +import ModalRoot from './containers/Modals' import renderer from './renderer' +import $ from 'jquery' + const sagaMiddleware = createSagaMiddleware() /*eslint-disable */ @@ -36,7 +40,11 @@ const composeSetup = localStorage.setItem('debug', 'trudesk:*') // Enable logger // } -const store = createStore(IndexReducer, composeSetup(applyMiddleware(thunkMiddleware, sagaMiddleware))) +const preloadedState = { common: window.trudesk.__PRELOADED_STATE__ } +delete window.trudesk +$('script#preloader').remove() + +const store = createStore(IndexReducer, preloadedState, composeSetup(applyMiddleware(thunkMiddleware, sagaMiddleware))) // This is need to call an action from angular // Goal: remove this once angular is fully removed @@ -52,6 +60,25 @@ const sidebarWithProvider = ( ReactDOM.render(sidebarWithProvider, document.getElementById('side-nav')) +if (document.getElementById('modal-wrapper')) { + const RootModal = ( + + + + ) + ReactDOM.render(RootModal, document.getElementById('modal-wrapper')) +} + +if (document.getElementById('topbar')) { + const TopbarRoot = ( + + + + ) + + ReactDOM.render(TopbarRoot, document.getElementById('topbar')) +} + window.react.renderer = renderer window.react.dom = ReactDOM diff --git a/src/client/components/Drowdown/DropdownHeader.jsx b/src/client/components/Drowdown/DropdownHeader.jsx new file mode 100644 index 000000000..143039650 --- /dev/null +++ b/src/client/components/Drowdown/DropdownHeader.jsx @@ -0,0 +1,28 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 2/10/19 2:52 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + +import React from 'react' +import PropTypes from 'prop-types' + +class DropdownHeader extends React.Component { + render () { + return
              • {this.props.text}
              • + } +} + +DropdownHeader.propTypes = { + text: PropTypes.string.isRequired +} + +export default DropdownHeader diff --git a/src/client/components/Drowdown/DropdownItem.jsx b/src/client/components/Drowdown/DropdownItem.jsx new file mode 100644 index 000000000..dbe2d158e --- /dev/null +++ b/src/client/components/Drowdown/DropdownItem.jsx @@ -0,0 +1,41 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 2/10/19 2:43 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + +import React from 'react' +import PropTypes from 'prop-types' + +class DropdownItem extends React.Component { + render () { + const { closeOnClick, text, href } = this.props + return ( +
              • + + {text} + +
              • + ) + } +} + +DropdownItem.propTypes = { + href: PropTypes.string, + text: PropTypes.string.isRequired, + closeOnClick: PropTypes.bool +} + +DropdownItem.defaultProps = { + closeOnClick: true +} + +export default DropdownItem diff --git a/src/client/components/Drowdown/DropdownSeperator.jsx b/src/client/components/Drowdown/DropdownSeperator.jsx new file mode 100644 index 000000000..a60acc9e7 --- /dev/null +++ b/src/client/components/Drowdown/DropdownSeperator.jsx @@ -0,0 +1,30 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 2/10/19 2:48 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + +import React from 'react' +import PropTypes from 'prop-types' + +class DropdownSeparator extends React.Component { + render () { + return ( +
              • +
                +
              • + ) + } +} + +DropdownSeparator.propTypes = {} + +export default DropdownSeparator diff --git a/src/client/components/Drowdown/DropdownTrigger.jsx b/src/client/components/Drowdown/DropdownTrigger.jsx new file mode 100644 index 000000000..807978e96 --- /dev/null +++ b/src/client/components/Drowdown/DropdownTrigger.jsx @@ -0,0 +1,57 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 2/10/19 2:57 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + +import React from 'react' +import PropTypes from 'prop-types' + +import UIkit from 'uikit' + +class DropdownTrigger extends React.Component { + constructor (props) { + super(props) + } + + componentDidMount () { + if (this.drop) { + UIkit.dropdown(this.drop, { + mode: this.props.mode, + pos: this.props.pos + }) + } + } + + componentWillUnmount () { + if (this.drop) this.drop = null + } + + render () { + return ( +
                (this.drop = i)} className={'uk-position-relative'} aria-haspopup={true} aria-expanded={false}> + {this.props.children} +
                + ) + } +} + +DropdownTrigger.propTypes = { + mode: PropTypes.string, + pos: PropTypes.string +} + +DropdownTrigger.defaultProps = { + mode: 'click', + pos: 'bottom-left' +} + +export default DropdownTrigger diff --git a/src/client/components/Drowdown/index.jsx b/src/client/components/Drowdown/index.jsx new file mode 100644 index 000000000..064e34742 --- /dev/null +++ b/src/client/components/Drowdown/index.jsx @@ -0,0 +1,35 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 2/10/19 2:41 AM + * Copyright (c) 2014-2019. All rights reserved. + */ + +import React from 'react' +import PropTypes from 'prop-types' + +class Dropdown extends React.Component { + render () { + const { small, children, extraClass } = this.props + const className = (small ? ' uk-dropdown-small ' : ' ') + (extraClass || '') + return ( +
                +
                  {children}
                +
                + ) + } +} + +Dropdown.propTypes = { + small: PropTypes.bool, + extraClass: PropTypes.string +} + +export default Dropdown diff --git a/src/client/components/EasyMDE/index.jsx b/src/client/components/EasyMDE/index.jsx index f7b695b75..0995b46e5 100644 --- a/src/client/components/EasyMDE/index.jsx +++ b/src/client/components/EasyMDE/index.jsx @@ -15,7 +15,12 @@ import React from 'react' import PropTypes from 'prop-types' +import Log from '../../logger' + +import $ from 'jquery' import Easymde from 'easymde' +import 'inlineAttachment' +import 'inputInlineAttachment' class EasyMDE extends React.Component { constructor (props) { @@ -28,16 +33,61 @@ class EasyMDE extends React.Component { componentDidMount () { this.easymde = new Easymde({ - element: this.element[0], + element: this.element, forceSync: true, - minHeight: '220px', + minHeight: this.props.height, toolbar: EasyMDE.getMdeToolbarItems(), - autoDownloadFontAwesome: false + autoDownloadFontAwesome: false, + status: false, + spellChecker: false }) this.easymde.codemirror.on('change', () => { this.onTextareaChanged(this.easymde.value()) }) + + if (this.easymde && this.props.allowImageUpload) { + if (!this.props.inlineImageUploadUrl) return Log.error('Invalid inlineImageUploadUrl Prop.') + + const $el = $(this.element) + const self = this + if (!$el.hasClass('hasInlineUpload')) { + $el.addClass('hasInlineUpload') + window.inlineAttachment.editors.codemirror4.attach(this.easymde.codemirror, { + onFileUploadResponse: function (xhr) { + const result = JSON.parse(xhr.responseText) + + const filename = result[this.settings.jsonFieldName] + + if (result && filename) { + let newValue + if (typeof this.settings.urlText === 'function') { + newValue = this.settings.urlText.call(this, filename, result) + } else { + newValue = this.settings.urlText.replace(this.filenameTag, filename) + } + + const text = this.editor.getValue().replace(this.lastValue, newValue) + this.editor.setValue(text) + this.settings.onFileUploaded.call(this, filename) + } + return false + }, + onFileUploadError: function (xhr) { + const result = xhr.responseText + const text = this.editor.getValue() + ' ' + result + this.editor.setValue(text) + }, + extraHeaders: self.props.inlineImageUploadHeaders, + errorText: 'Error uploading file: ', + uploadUrl: self.props.inlineImageUploadUrl, + jsonFieldName: 'filename', + urlText: '![Image]({filename})' + }) + + EasyMDE.attachFileDesc(self.element) + } + } } componentDidUpdate () { @@ -57,15 +107,24 @@ class EasyMDE extends React.Component { if (typeof nextProps.defaultValue !== 'undefined') { if (!state.loaded && nextProps.defaultValue !== state.value) return { value: nextProps.defaultValue, loaded: true } - } else { - return { - loaded: true - } } return null } + static attachFileDesc (textarea) { + const $el = $(textarea) + const attachFileDiv = $('
                ') + attachFileDiv + .addClass('attachFileDesc') + .html('

                Attach images by dragging & dropping or pasting from clipboard.

                ') + $el.siblings('.CodeMirror').addClass('hasFileDesc') + $el + .siblings('.editor-statusbar') + .addClass('hasFileDesc') + .prepend(attachFileDiv) + } + onTextareaChanged (value) { this.setState({ value @@ -139,15 +198,29 @@ class EasyMDE extends React.Component { render () { setTimeout(() => { this.easymde.codemirror.refresh() - }, 1) - return -
                -
                -
                - + {{#canUser data.common.loggedInAccount 'comments:create'}} +
                +
                + +
                + +
                -
                - -
                +
                +
                + +
                +
                + +
                + {{/canUser}} - {{#canUser data.common.loggedInAccount 'note:create'}} -
                From 7b44537ce3a8835447830548fd2e1bfee488567d Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 17 Feb 2019 18:11:01 -0500 Subject: [PATCH 55/68] perf(restore): flushRoles on successful restore --- src/controllers/backuprestore.js | 3 +++ src/permissions/index.js | 1 + 2 files changed, 4 insertions(+) diff --git a/src/controllers/backuprestore.js b/src/controllers/backuprestore.js index 990bc8526..32c1ae5b1 100644 --- a/src/controllers/backuprestore.js +++ b/src/controllers/backuprestore.js @@ -161,10 +161,13 @@ backupRestore.restoreBackup = function (req, res) { var cache = _.find(global.forks, function (f) { return f.name === 'cache' }) + if (cache && cache.fork) { cache.fork.send({ name: 'cache:refresh:force' }) } + require('../permissions').flustRoles() + result = { success: true } } else { result = { success: false, error: data.error } diff --git a/src/permissions/index.js b/src/permissions/index.js index 7d0c8834f..8e37dc91f 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -179,6 +179,7 @@ function buildGrants (obj) { module.exports = { register: register, + flustRoles: register, canThis: canThis, hasHierarchyEnabled: hasHierarchyEnabled, parseRoleHierarchy: parseRoleHierarchy, From 2752ec3cd4e3c47f31b36d9588213f5f67f4389c Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 17 Feb 2019 20:35:59 -0500 Subject: [PATCH 56/68] chore(migration): runs based on semver --- package.json | 1 + src/controllers/backuprestore.js | 2 +- src/migration/index.js | 179 ++++++++++++++++++++----------- src/settings/defaults.js | 38 ------- src/views/accounts.hbs | 24 ++--- 5 files changed, 133 insertions(+), 111 deletions(-) diff --git a/package.json b/package.json index 6514a6771..899a4b541 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "rimraf": "2.6.3", "sanitize-html": "1.18.4", "script-loader": "0.7.2", + "semver": "5.6.0", "serve-favicon": "2.5.0", "snyk": "^1.92.6", "socket.io": "2.1.1", diff --git a/src/controllers/backuprestore.js b/src/controllers/backuprestore.js index 32c1ae5b1..8a8a5c227 100644 --- a/src/controllers/backuprestore.js +++ b/src/controllers/backuprestore.js @@ -166,7 +166,7 @@ backupRestore.restoreBackup = function (req, res) { cache.fork.send({ name: 'cache:refresh:force' }) } - require('../permissions').flustRoles() + require('../permissions').flustRoles(function () {}) result = { success: true } } else { diff --git a/src/migration/index.js b/src/migration/index.js index 83355512a..1fcd0359e 100644 --- a/src/migration/index.js +++ b/src/migration/index.js @@ -12,67 +12,126 @@ **/ -var _ = require('lodash'); -var async = require('async'); -var winston = require('winston'); -var moment = require('moment-timezone'); - -var SettingsSchema = require('../models/setting'); -var userSchema = require('../models/user'); -var roleSchema = require('../models/role'); - -var migrations = {}; - -function migrateUserRoles(callback) { - async.waterfall([ - function(next) { - roleSchema.getRoles(next); - }, - function(roles, next) { - var adminRole = _.find(roles, {normalized: 'admin'}); - userSchema.collection.updateMany({role: 'admin'}, { $set: { role: adminRole._id }}).then(function(res) { - if (res && res.result) { - if (res.result.ok === 1) - return next(null, roles); - - winston.warn(res.message); - return next(res.message); - } - }); - }, - function(roles, next) { - var supportRole = _.find(roles, {normalized: 'support'}); - userSchema.collection.updateMany({$or: [{role: 'support'}, {role:'mod'}]}, { $set: { role: supportRole._id }}).then(function(res) { - if (res && res.result) { - if (res.result.ok === 1) - return next(null, roles); - - winston.warn(res.message); - return next(res.message); - } - }); - }, - function(roles, next) { - var userRole = _.find(roles, {normalized: 'user'}); - userSchema.collection.updateMany({role: 'user'}, { $set: { role: userRole._id }}).then(function(res) { - if (res && res.result) { - if (res.result.ok === 1) - return next(null, roles); - - winston.warn(res.message); - return next(res.message); - } - }); +var _ = require('lodash') +var async = require('async') +var winston = require('winston') +var semver = require('semver') +var moment = require('moment-timezone') + +var SettingsSchema = require('../models/setting') +var userSchema = require('../models/user') +var roleSchema = require('../models/role') + +var migrations = {} + +function saveVersion (callback) { + SettingsSchema.getSettingByName('gen:version', function (err, setting) { + if (err) { + winston.warn(err) + if (_.isFunction(callback)) return callback(err) + return false + } + + if (!setting) { + var s = new SettingsSchema({ + name: 'gen:version', + value: require('../../package.json').version + }) + s.save(function (err) { + if (err) { + if (_.isFunction(callback)) return callback(err) + return false } - ], callback); -} -migrations.run = function(callback) { - async.series([ - function(next) { - migrateUserRoles(next); + if (_.isFunction(callback)) return callback() + }) + } else { + if (setting.value) setting.value = require('../../package').version + setting.save(function (err) { + if (err) { + if (_.isFunction(callback)) return callback(err) + return false } - ], callback); -}; -module.exports = migrations; \ No newline at end of file + if (_.isFunction(callback)) return callback() + }) + } + }) +} + +function getDatabaseVersion (callback) { + SettingsSchema.getSettingByName('gen:version', function (err, setting) { + if (err) return callback(err) + // TODO: Throw error after 1.0.7 if missing ver num + if (!setting) return callback(null, '1.0.6') + return callback(null, setting.value) + }) +} + +function migrateUserRoles (callback) { + winston.verbose('Migrating Roles...') + async.waterfall( + [ + function (next) { + roleSchema.getRoles(next) + }, + function (roles, next) { + var adminRole = _.find(roles, { normalized: 'admin' }) + userSchema.collection.updateMany({ role: 'admin' }, { $set: { role: adminRole._id } }).then(function (res) { + if (res && res.result) { + if (res.result.ok === 1) return next(null, roles) + + winston.warn(res.message) + return next(res.message) + } + }) + }, + function (roles, next) { + var supportRole = _.find(roles, { normalized: 'support' }) + userSchema.collection + .updateMany({ $or: [{ role: 'support' }, { role: 'mod' }] }, { $set: { role: supportRole._id } }) + .then(function (res) { + if (res && res.result) { + if (res.result.ok === 1) return next(null, roles) + + winston.warn(res.message) + return next(res.message) + } + }) + }, + function (roles, next) { + var userRole = _.find(roles, { normalized: 'user' }) + userSchema.collection.updateMany({ role: 'user' }, { $set: { role: userRole._id } }).then(function (res) { + if (res && res.result) { + if (res.result.ok === 1) return next(null, roles) + + winston.warn(res.message) + return next(res.message) + } + }) + } + ], + callback + ) +} + +migrations.run = function (callback) { + async.series( + [ + function (next) { + getDatabaseVersion(function (err, dbVer) { + if (err) return next(err) + if (semver.satisfies(dbVer, '1.0.6')) migrateUserRoles(next) + }) + } + ], + function (err) { + if (err) return callback(err) + + // Update DB Version Num + saveVersion(callback) + } + ) +} + +module.exports = migrations diff --git a/src/settings/defaults.js b/src/settings/defaults.js index e2ccfa218..cea4e5446 100644 --- a/src/settings/defaults.js +++ b/src/settings/defaults.js @@ -166,41 +166,6 @@ function rolesDefault (callback) { ) } -function saveVersion (callback) { - SettingsSchema.getSettingByName('gen:version', function (err, setting) { - if (err) { - winston.warn(err) - if (_.isFunction(callback)) return callback(err) - return false - } - - if (!setting) { - var s = new SettingsSchema({ - name: 'gen:version', - value: require('../../package.json').version - }) - s.save(function (err) { - if (err) { - if (_.isFunction(callback)) return callback(err) - return false - } - - if (_.isFunction(callback)) return callback() - }) - } else { - setting.value = require('../../package').version - setting.save(function (err) { - if (err) { - if (_.isFunction(callback)) return callback(err) - return false - } - - if (_.isFunction(callback)) return callback() - }) - } - }) -} - function createDirectories (callback) { async.parallel( [ @@ -620,9 +585,6 @@ settingsDefaults.init = function (callback) { winston.debug('Checking Default Settings...') async.series( [ - function (done) { - return saveVersion(done) - }, function (done) { return createDirectories(done) }, diff --git a/src/views/accounts.hbs b/src/views/accounts.hbs index 858d9869c..4e9af6d49 100644 --- a/src/views/accounts.hbs +++ b/src/views/accounts.hbs @@ -49,18 +49,18 @@
                - + + + + + + + + + + + +
                From 7a0479d900d3c9ea324fa113a7343a8e603f75e8 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 17 Feb 2019 20:41:16 -0500 Subject: [PATCH 57/68] fix(test): updates for role permissions --- src/controllers/api/v1/users.js | 2 +- test/source/permissions.js | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/controllers/api/v1/users.js b/src/controllers/api/v1/users.js index 74c66b736..9763aba67 100644 --- a/src/controllers/api/v1/users.js +++ b/src/controllers/api/v1/users.js @@ -549,7 +549,7 @@ apiUsers.deleteUser = function (req, res) { return cb({ message: 'Cannot remove yourself!' }) } - if (!permissions.canThis(req.user.role, 'account:delete')) return cb({ message: 'Access Denied' }) + if (!permissions.canThis(req.user.role, 'accounts:delete')) return cb({ message: 'Access Denied' }) // TODO: FIX THIS FOR HIERARCHY!! // if (req.user.role.toLowerCase() === 'support' || req.user.role.toLowerCase() === 'user') { diff --git a/test/source/permissions.js b/test/source/permissions.js index 511301e64..ddd542317 100644 --- a/test/source/permissions.js +++ b/test/source/permissions.js @@ -13,16 +13,16 @@ describe('premissions.js', function () { done() }) - it('should allow comment creation', function(done) { - var result = permissions.canThis(global.supportRoleId, 'comment:create'); + it('should allow comment creation', function (done) { + var result = permissions.canThis(global.supportRoleId, 'comments:create') expect(result).to.be.true done() }) - it('show allow note creation', function(done) { - var result = permissions.canThis(global.supportRoleId, 'note:create'); + it('show allow note creation', function (done) { + var result = permissions.canThis(global.supportRoleId, 'tickets:notes') expect(result).to.be.true @@ -30,9 +30,9 @@ describe('premissions.js', function () { }) it('should get roles with action', function (done) { - var results = permissions.getRoles('ticket:create') + var results = permissions.getRoles('tickets:create') - expect(results).to.have.length(3); + expect(results).to.have.length(3) done() }) From 44ffe8b4f0e83e9f64fa733b7753202b76338f2e Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 17 Feb 2019 20:44:08 -0500 Subject: [PATCH 58/68] chore(semver): beta tag --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 899a4b541..790bc1541 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "trudesk", - "version": "1.0.6", + "version": "1.0.7-beta", "private": true, "engines": { "node": ">=9.10.0" From 19a105347166fcd4e550c6cafd6dd6198506a529 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 17 Feb 2019 22:25:07 -0500 Subject: [PATCH 59/68] chore(database): universal database config --- Dockerfile | 19 ++++++++++++++++ public/img/defaultProfile.jpg | Bin 0 -> 7817 bytes src/database/index.js | 41 +++++++++++++++++++++------------- startup.sh | 13 +++++++++++ 4 files changed, 58 insertions(+), 15 deletions(-) create mode 100644 Dockerfile create mode 100644 public/img/defaultProfile.jpg create mode 100644 startup.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..95e21b1bb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM node:10.10-alpine + +RUN mkdir -p /usr/src/trudesk +WORKDIR /usr/src/trudesk + +COPY . /usr/src/trudesk + +RUN apk add --no-cache --update bash make gcc g++ python mongodb-tools + +RUN npm install -g yarn && \ + yarn install --production=false --prefer-offline && \ + npm rebuild bcrypt node-sass --build-from-source && \ + yarn run build && \ + yarn install --production --prefer-offline && \ + apk del make gcc g++ python + +EXPOSE 8118 + +CMD [ "/bin/bash", "/usr/src/trudesk/startup.sh" ] \ No newline at end of file diff --git a/public/img/defaultProfile.jpg b/public/img/defaultProfile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4960c3b9aba0d41d29085c143afc3d1d8037df52 GIT binary patch literal 7817 zcmd5>cT`hZw-1V_gW^yGQKW<>QUaleHqt{Ckd82r1PCDsEi^$!1VIpx7Nv=_(2)*8 z0Hq^MTIebwpaf8)NHs4yf-~QndF%W0?UmfUPuaiy+vn`F?z;C<#was@a~i%#M*si{ zy$m=3_$ibn0HZn%hVlc@0BEV*Z~%ZZa}?z4<>dwefiRw8_He8NLJWpQgM97XKoVl& zAb_HZubVv#h4A8bKsX^WO2CixO+aoWTnT6{tuLHm?fpqgiVlmv` z5bYhXI4>n2mFb@;pxq8(|8cGUGErau|DK9Qe_Md>u%2GVh@X7_5!myZpBn;XjPS(b zJYWdwblz{yZV)vOguNHm;~Ez0da#ODov~h6PiL$fx0>4bRpY*7j>N#RKAu9~ef0Gq zP>iRSJqCt=sw)AhC}Kz?93lr6my(f`(bSX_mynRqkXF^yl#r8?l~vb}mzM&|fDe4t zu`nDOf$=)#sQ)Y84`2Ada*@&a zS6>j74CveD{$;Zdx~LWO%{(k!YU8l@5g2O4dr(W8vI1cEUa$c8GwKndp-cio05t!- z9Qi3n59NpZ5gHomDD{6h@ZTDgX8^_%G}L2#l!g&-gpuYbBMqe$kU%9y?fLdQkY7%m zq(4r3jPB_75$ffq9Hl*Wgof@{0Dz9lf%XUuHTJP@qclgTBXq|ZPcZQ?vz(OpGVM`1D(0VHR0l>{9*HYVM)m{lw_?k{%o)#TfV`5Qj6GB- z6M$3Hc}EzJG6GZp1HbREUj517|GRbc<%W08cuIvt@#xNj<6SZg2p31U_Yx5uON1Mj zjG5LyxFA(Ht4joHHTRwhyGVI)#YgiiXLVauMw1QhZvxQ}E%vLqmQA*<&70CUH72GB zug+XtuiTw@ZMsK4l|dk>qoS~BRuaN&`Kev8IohFgbD@l%lV}movf=|7TR2b)%8^o& z{R-VUNc>{t;|W}N)2DskR!?CWrWpS^^;_)aD#lQ* zynJ*YYOS)>&&|-rf;^CF(N{mZWi8s#Qfi~X9Nooa31e?ZUa~|At?O93l$^T89cLE| z6r+_yKJo;w0D0rr&CcTRt0PRLx?`!Pv2n8&>M=5qyBf`R^}5icVI5FE|Dxi%jfh>f zj6lh$*zB@W|Ixgqce?yJyUD3KO}};x>+Y@M?eiXY-G|@IX)S-#AGaaNG%8~iDD!|h z8o%)C;74Z_+afTDKU!=u4{KJx~rpi*=B+k+>{AoiL=(*A~nuN ze0_RaaJU%uTFs>s~+-7C$|jxMN%yb-By^!sBl&kKe~A(c~x`kCBbU^xEBV zt+Sv2_)VAQuEmP*4=G7hN?x{Aadp;cR8ZPX(J=+muf7ID+0q{`K4=iM(rYDFp_~T? ziujqAnLoUy0D7fZr*Dz1R?1I#HL ziwq;5DDcPoZSC9$9G!a9lWu3IGGZde`Fh$e=dr!J#Xqbd%^C{jG-dHDuOLjIeURj8 zH8HV;7TxyD?F+0eooTZ#H;IA9^9*O4fU@W706|yh+WnNgM0WNTrP=iSheBOCSM8t3 zl}7ZLSA$^j7-zECK0|=%WA{8<3v)*9#|hY$1G{5++`e(?Mc7cyhe>sf>{8v$Rje-16gG zGIS|`n1qkCx=E*Jfjm#c1gG2B$fFZ|UAEo5{^IL8_x|_F&{P=`^f}s>K0d1OA7m1Q zO#~n7Tc|^{GNlNei)pzXuJ9s!V1Z4Am>+bTSDHVOF(}`B`gO&rt$x}u)O7p{xsp8? z=#K+fe(Oz{5fP0Skm>rFc2F!%>*3sw>fD!#{n{k6Af}+cl+L-Z=nt&1GpG*!d^L}!c&E$3TtIc=8 zf=*aEVf;ewWz3VK?eNOm8w(+qXPmYu0ML#jwyC^qZo35Cn6#PaY-D-pk6inxDT&?p zU%(U%>V%~)Zi~dOzDPAQJ>QuCT~b5)o#@e6XOF*7w8`7+D6v1=pma7i9Q__uevq6Q&T0_lE2n}G|b zvx^O+7Oi_;>*E1yL19Y?Rzhtqv2aTnhzIs%RW3`TmQmQ2C{$&XSnNo8CGD$|0hsZ0voDqhZl~ zd_{xl-u2v>kvzw{*hS0VbndIy3c#ctRVFy#QSSX^eWe)5-wpu}4YphBGh+p5YlEke zI^L%hlAOmxkW+P))4cHv0%FY;&mH4+W`=ITZYS{Z41tb8qj)NlQZCPO;h+TMqxiOr zJJVyc?Q${%Vg5rz7nPN)GHHlfc2Ya{-DT+%Y#XoH+mY6pfCtEVc}~Y?6(+~Nz9rkg zMc1G1pbx1LXqRB804y2DCycSlf;qlBJpGs{e_Vpt>Ci*Sp9USmE2!>%;}Uhn;yq7rAf{ zeJg%Jt?;%?U$ffPH|FZ`5U-k%H$4{a>^677oOWB4Eu#54DsRG%D`1v=*x)|a-Ztn{ zi{|ZF!TDavuNlHo8U}2kHS%A`ENK6ta_fTW48<=y5Ws}zEO0C!P zpgp-L`89{7TyjJ5Tz#^)W2INp=-Yud%#z#K@3*-BL_BIo0XR?QoEOe)xb-3l|F9;B zlXJ7Y{RCdW%bSd-d&Qaim^~?I?Xu7^|5)y}j(xsHKL^LIzt4P;*Qi~vV)b$dcwtN? z>DixXf4}~6VTXAIBcH#?U^h~H*JDJ9ZvJU;Cob{c!eAR5{kT=##IVB-*TyWO)AwOk z)de_=-*OU`R$f|ITx_{&6frG^k$*OmmWCeEw1_t=Zh-gg^CPx zJs;Wjj~KcKI+a5NZEVf{PWwkINHYx=W*r#Dfta^ZDr_}+bc-s|Jm$pNNf@%QlS%)W?tyhFJkA(8qZeoQ* zto;R4V`W2od#BKjO-*b=Gw*96Wtyt@_O1nA68Ym>a6#T>g%xn&b@k32@-Pvv)YuUS z&X=K^$+=%K5Z$9j^nwu#)?Ui@hDTexs*#-A7roj1#gXC6)D%msRd7{>b}3 zmGzmI^RLGh>~fP717jZA%<^U0 z7MyM)RL+o$q@)vm`%m5nZPwy-`X|fo3{hhUR`u-mi5uy1-S6X^r5J}yNHEB@L2P>A zo%$ZIyXV#npWXAMcOTKrDTXKZ&8t@lDy}vDmj$Un&Xb$8Eg~KU_h+|Rn54Bv>-&G{ zEYWQpP8hL>g(oO_jh=K?Vq2;MfCV*oT*KCD&sluR=Qu{$dW0xry6r7iFWeT&*;% zW1Dt@V-FYzXK!O=6u)6v6*rXQ2`4B4kFA z%tldH%fy=fe^(WJl`tc(OtK-%55l|SX8V@1)X7aGpT69 zD;y2f#QgBHLv^!3WSgw3%S1G>#?H~`O?#*F#dM_k8nY#e?sFBXC|`gy(Hwi^Rk`Aw zRQpZRgY$+@IAS++C-9Nxp&4_9tWly}Qh|hhe^B9tvKNrB3VOciAuQCOU=rI}(r8z8 z-X^rIy_(P!pw>4ucKWc-(ZC>?XHKR z5m{*S?72eQk~QW_{rHia`d$w#+&O2ZMTR;2PN#>Ai*gC3Ke!>;!h+yeRgrNnJFhKOni_}BsB!AOmC zydpYZe8S|3+>|yN@)p=?{|oNRgSS22S93XxuO?n1R%Mn=BL_KK_4;CabeER{d*iPle;M_;EzFTk+UiZ{(G$X zHRPb+_$qt>X#)0Z$upeh>3gUtNM6hgY%E7z$N#e*@`?&X2Us22U-{6PUmL%Z7SG>j zMvk;hjt(tG_2Y6a|J*dLrtgRDAUVIUy(5rO&$p~{tYgp1qC&&0Vgq`Dg!97OZLvJU zy3AQX6O;|TwqwOLKUblAiPRaiTxjg2y5eFesX_uI0366(4H^F;yFmd+2}~+{Fw@Lc z4BU=(?!ASv)l@gWzGcDCQikJmSr~Uz6uE`?icvuC7e{W@G)M-()?y5Ut2XzMpY&~? zk6O;>b(e^XJ_v`)i8=kYtyR-r9+B_0`4XQUf3LQ-;yenI=yo!|R?DW%$E2Zf)W)ZivkqK7Cn&irf2Z<$(b2}M| zd7l??Z5JXVh=ew#NfVH+tYuLMVVb}3>1h@%)cn-Y83vzE8~QP4pL8UeS&uwQ#(l|^ zLpoULo`^KM40n!#Z@1M{ph_i?jK8WU`Dq&DEosNSCZce)Mg!-|g`;cTv%tDWoMw78 z-H=y-(`-UIgHnY;>X>JL;YT&k)lAqXZ|v6Ax|Cg<4$-KMXOe1nzc*1hUfBOBiJ7sP z;4lt>H2^O|*E1G)wAGWlFjB9(?(JMnNO<`9H47QK?(T24niHG*y1(%B%%ITVXHwvD zRt8@WvYpii zgz7uN(Tx{1MERx8RVAK1YdSD_*Ur-1`Xqtp*^}F6v!%L4c}`bPK!t!nAUm_9WYL=4 zyIqMl2fPmTPIrM-K-{At&Q2E;HV-6BxOUyx=6RHp5!MuTu@iq5pIBjalVfLl;JURT zc#(CoIBzf$EXlK^*GlGSRoEv620j0PpD*f`P75GZa?Y4W-Qi)h1Dg170kZz#+)^?s_$2c1H0iV&9z_{cR^NOf=pb-0xFX=Qlr_?n)SJ^`Tz|^o{^NmscnNDnWqK|z zvwQpsBE@U&G>7SOwwBq=6aVyFFMeiep}1%BHbEhXF3ieIo*;_bA`0<4Z{x?7hcMYKl{PS-MZI!1h^GBUUsniszJ z)_$9Xm1GxeWf*g%{tgA;c@|5uPl;=&dAR1_7W;$dky}BwN;-aqj@9k263>f7OzRh( z&%9G(G$+7dUQrUuS>k2Nm8r5Cp!r!LY+I^xcC}xshBU-s-hNY8!Iw0IJz?S2ZSyyF z2Mw*5CHZ_q)+JKzN_XY^g=hjAvvaW{g(--_;Ne|i&*sv<&%$T19<4_Vs-YZiz9(8Ss7f2S~CrzxQ zMtJ6YW8;3G>u%Cv?uzwG`g#oxuBjdsG0)cO-wT~4BJ~3hjaT%4Kj8LPO_R|yCTUtI zw#dm`!A+_V=rBUR2orHNeXe93=7f{6m@Z&9znetxwuzuER*dDk#WlyLI{#tXbaZ@DJEK%zVHNPz=DfwMo;#=B5Tn9hDIVJPPGgPbDC!rsiY=YD z+Ua~7GFtdy)$qiUYs4^{YEoPK+YYrL(rh_))uK0!es_;(__DQDbTYYOVeQQ(t$HFcVjQDqI$!-FpPJmXFP@NDy=%jj@kz0v z9wqZB>bjZq!x(n2_DEL6b7dLoNXEA<(LEMDGI6@D9nlk32*RN4T{ZOM@W?G7m-0}+ zABVjEYH)F0vslaQ3Kh-PjszbNLnF?OeyL-na)1E(hw}`H( z#MyLlfgLNxo>n&{iVSLR8@o*<_jBCTiU?%>Sa0R>rhz_oouvln@JgZ(JdoYvtJ@b= K@*9AQGX6g(O58I5 literal 0 HcmV?d00001 diff --git a/src/database/index.js b/src/database/index.js index 3ce483c96..bdee3692f 100644 --- a/src/database/index.js +++ b/src/database/index.js @@ -13,25 +13,37 @@ */ var _ = require('lodash') -var mongoose = require('mongoose') var nconf = require('nconf') +var mongoose = require('mongoose') var winston = require('winston') var db = {} +var mongoConnectionUri = { + server: process.env.MONGODB_SERVER || nconf.get('mongo:host'), + port: process.env.MONGODB_PORT || nconf.get('mongo:port') || '27017', + username: process.env.MONGODB_USERNAME || nconf.get('mongo:username'), + password: process.env.MONGODB_PASSWORD || nconf.get('mongo:password'), + database: process.env.MONGODB_DATABASE ? 'trudesk_' + process.env.MONGODB_DATABASE : nconf.get('mongo:database') +} -var dbPassword = encodeURIComponent(nconf.get('mongo:password')) - -var CONNECTION_URI = - 'mongodb://' + - nconf.get('mongo:username') + - ':' + - dbPassword + - '@' + - nconf.get('mongo:host') + - ':' + - nconf.get('mongo:port') + - '/' + - nconf.get('mongo:database') +var CONNECTION_URI = '' +if (!mongoConnectionUri.username) + CONNECTION_URI = + 'mongodb://' + mongoConnectionUri.server + ':' + mongoConnectionUri.port + '/' + mongoConnectionUri.database +else { + mongoConnectionUri.password = encodeURIComponent(mongoConnectionUri.password) + CONNECTION_URI = + 'mongodb://' + + mongoConnectionUri.username + + ':' + + mongoConnectionUri.password + + '@' + + mongoConnectionUri.server + + ':' + + mongoConnectionUri.port + + '/' + + mongoConnectionUri.database +} var options = { keepAlive: 1, @@ -43,7 +55,6 @@ var options = { module.exports.init = function (callback, connectionString, opts) { if (connectionString) CONNECTION_URI = connectionString if (opts) options = opts - if (!_.isUndefined(process.env.MONGOHQ_URL)) CONNECTION_URI = process.env.MONGOHQ_URL.trim() if (db.connection) { return callback(null, db) diff --git a/startup.sh b/startup.sh new file mode 100644 index 000000000..e28a10e6f --- /dev/null +++ b/startup.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if [ ! -d /usr/src/trudesk/public/uploads/users ]; then + echo "Creating Directory..." + mkdir /usr/src/trudesk/public/uploads/users +fi + +if [ ! -f /usr/src/trudesk/public/uploads/users/defaultProfile.jpg ]; then + echo "Coping defaultProfile.jpg" + cp /usr/src/trudesk/public/img/defaultProfile.jpg /usr/src/trudesk/public/uploads/users/defaultProfile.jpg +fi + +node /usr/src/trudesk/runner.js \ No newline at end of file From a31854581d996be232ce5651c5540d1467afd173 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Sun, 17 Feb 2019 23:21:43 -0500 Subject: [PATCH 60/68] fix(app): app.js for universal config --- app.js | 59 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/app.js b/app.js index c8201cf41..1ba30c2e7 100644 --- a/app.js +++ b/app.js @@ -19,6 +19,8 @@ var pkg = require('./package.json') var ws = require('./src/webserver') // `var memory = require('./src/memory'); +var isDocker = process.env.TRUDESK_DOCKER || false + global.forks = [] nconf.argv().env() @@ -84,7 +86,6 @@ if (!process.env.FORK) { } var configFile = path.join(__dirname, '/config.json') - var configExists if (nconf.get('config')) { @@ -93,33 +94,14 @@ if (nconf.get('config')) { configExists = fs.existsSync(configFile) -if (process.env.HEROKU) { - // Build Config for Heroku - var configHeroku = { - url: 'http://localhost:8118', - port: '8118' - } - - winston.info('Creating heroku config file...') - var config = JSON.stringify(configHeroku, null, 4) - - if (configExists) { - fs.unlinkSync(configFile) - } - - fs.writeFileSync(configFile, config) - - start() -} - -if (nconf.get('install') || (!configExists && !process.env.HEROKU)) { +function launchInstallServer () { ws.installServer(function () { return winston.info('Trudesk Install Server Running...') }) } -if (!nconf.get('setup') && !nconf.get('install') && !nconf.get('upgrade') && !nconf.get('reset') && configExists) { - start() +if (nconf.get('install') || (!configExists && !isDocker)) { + launchInstallServer() } function loadConfig () { @@ -133,7 +115,7 @@ function loadConfig () { } function start () { - loadConfig() + if (!isDocker) loadConfig() var _db = require('./src/database') @@ -150,11 +132,7 @@ function start () { }) } -function dbCallback (err, db) { - if (err) { - return start() - } - +function launchServer (db) { ws.init(db, function (err) { if (err) { winston.error(err) @@ -271,3 +249,26 @@ function dbCallback (err, db) { ) }) } + +function dbCallback (err, db) { + if (err) { + return start() + } + + if (isDocker) { + var s = require('./src/models/setting') + s.getSettingByName('installed', function (err, installed) { + if (err) return start() + + if (!installed) { + return launchInstallServer() + } else { + return launchServer(db) + } + }) + } else { + return launchServer(db) + } +} + +if (configExists || isDocker) start() From 35acf04a2f6af5c2d9fe0a0c8d4fdd65aa9f1cca Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Mon, 18 Feb 2019 00:19:24 -0500 Subject: [PATCH 61/68] fix(docker): universal config --- app.js | 23 +++++++++++--- src/controllers/install.js | 19 +++++++++++ src/database/index.js | 10 +++--- src/helpers/hbs/helpers.js | 6 ++++ src/migration/index.js | 2 ++ src/views/install.hbs | 64 ++++++++++++++++++++------------------ 6 files changed, 84 insertions(+), 40 deletions(-) diff --git a/app.js b/app.js index 1ba30c2e7..aa1cfc396 100644 --- a/app.js +++ b/app.js @@ -10,6 +10,7 @@ ======================================================================== **/ +var _ = require('lodash') var async = require('async') var path = require('path') var fs = require('fs') @@ -168,9 +169,9 @@ function launchServer (db) { winston.debug('Starting MailCheck...') mailCheck.init(settings) }) + } else { + return next() } - - return next() }) }, function (next) { @@ -221,9 +222,23 @@ function launchServer (db) { if (process.env.MEMORYLIMIT) { memLimit = process.env.MEMORYLIMIT } + + var env = { FORK: 1, NODE_ENV: global.env } + if (isDocker) { + var envDocker = { + TD_MONGODB_SERVER: process.env.TD_MONGODB_SERVER, + TD_MONGODB_PORT: process.env.TD_MONGODB_PORT, + TD_MONGODB_USERNAME: process.env.TD_MONGODB_USERNAME, + TD_MONGODB_PASSWORD: process.env.TD_MONGODB_PASSWORD, + TD_MONGODB_DATABASE: process.env.TD_MONGODB_DATABASE + } + + env = _.merge(env, envDocker) + } + var n = fork(path.join(__dirname, '/src/cache/index.js'), { execArgv: ['--max-old-space-size=' + memLimit], - env: { FORK: 1, NODE_ENV: global.env } + env: env }) global.forks.push({ name: 'cache', fork: n }) @@ -271,4 +286,4 @@ function dbCallback (err, db) { } } -if (configExists || isDocker) start() +if (!nconf.get('install') && (configExists || isDocker)) start() diff --git a/src/controllers/install.js b/src/controllers/install.js index 7707964a8..677d3d309 100644 --- a/src/controllers/install.js +++ b/src/controllers/install.js @@ -29,6 +29,7 @@ installController.index = function (req, res) { content.layout = false content.bottom = 'Trudesk v' + pkg.version + content.isDocker = process.env.TRUDESK_DOCKER || false res.render('install', content) } @@ -298,6 +299,24 @@ installController.install = function (req, res) { }) }, function (next) { + if (!process.env.TRUDESK_DOCKER) return next() + var S = require('../models/setting') + var installed = new S({ + name: 'installed', + value: true + }) + + installed.save(function (err) { + if (err) { + winston.error('DB Error: ' + err.message) + return next('DB Error: ' + err.message) + } + + return next() + }) + }, + function (next) { + if (process.env.TRUDESK_DOCKER) return next() // Write Configfile var fs = require('fs') var configFile = path.join(__dirname, '../../config.json') diff --git a/src/database/index.js b/src/database/index.js index bdee3692f..d8872f969 100644 --- a/src/database/index.js +++ b/src/database/index.js @@ -19,11 +19,11 @@ var winston = require('winston') var db = {} var mongoConnectionUri = { - server: process.env.MONGODB_SERVER || nconf.get('mongo:host'), - port: process.env.MONGODB_PORT || nconf.get('mongo:port') || '27017', - username: process.env.MONGODB_USERNAME || nconf.get('mongo:username'), - password: process.env.MONGODB_PASSWORD || nconf.get('mongo:password'), - database: process.env.MONGODB_DATABASE ? 'trudesk_' + process.env.MONGODB_DATABASE : nconf.get('mongo:database') + server: process.env.TD_MONGODB_SERVER || nconf.get('mongo:host'), + port: process.env.TD_MONGODB_PORT || nconf.get('mongo:port') || '27017', + username: process.env.TD_MONGODB_USERNAME || nconf.get('mongo:username'), + password: process.env.TD_MONGODB_PASSWORD || nconf.get('mongo:password'), + database: process.env.TD_MONGODB_DATABASE ? 'trudesk_' + process.env.MONGODB_DATABASE : nconf.get('mongo:database') } var CONNECTION_URI = '' diff --git a/src/helpers/hbs/helpers.js b/src/helpers/hbs/helpers.js index 6522bcce5..bf51476cc 100644 --- a/src/helpers/hbs/helpers.js +++ b/src/helpers/hbs/helpers.js @@ -617,6 +617,12 @@ var helpers = { return options.inverse(this) }, + isNot: function (obj, options) { + if (!(_.isUndefined(obj) || _.isNull(obj) || obj === true)) return options.fn(this) + + return options.inverse(this) + }, + split: function (arr, sep) { var str = '' _.each(arr, function (obj) { diff --git a/src/migration/index.js b/src/migration/index.js index 1fcd0359e..8dfbf4128 100644 --- a/src/migration/index.js +++ b/src/migration/index.js @@ -122,6 +122,8 @@ migrations.run = function (callback) { getDatabaseVersion(function (err, dbVer) { if (err) return next(err) if (semver.satisfies(dbVer, '1.0.6')) migrateUserRoles(next) + + return next() }) } ], diff --git a/src/views/install.hbs b/src/views/install.hbs index faf804177..7343e97a8 100644 --- a/src/views/install.hbs +++ b/src/views/install.hbs @@ -276,38 +276,40 @@
                -
                -

                MongoDB Connection

                -

                - We've got to store the data somewhere. We've chosen MongoDB as our backend storage. - Just enter your connection information below and lets get connected. -

                - -
                - - -
                -
                - - -
                -
                - - -
                -
                - - -
                -
                - - -
                - - + {{#isNot isDocker}} +
                +

                MongoDB Connection

                +

                + We've got to store the data somewhere. We've chosen MongoDB as our backend storage. + Just enter your connection information below and lets get connected. +

                +
                +
                + + +
                +
                + + +
                +
                + + +
                +
                + + +
                +
                + + +
                + +
                + What is MongoDB? +
                + {{/isNot}} - What is MongoDB? -

                Existing Database?

                From a338f3a318e14172093f1a87e26c4944f03c230d Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Mon, 18 Feb 2019 01:04:25 -0500 Subject: [PATCH 62/68] fix(docker): universal config --- src/database/index.js | 2 +- src/helpers/hbs/helpers.js | 4 ++-- src/views/install.hbs | 23 ++++++++++++----------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/database/index.js b/src/database/index.js index d8872f969..c530202be 100644 --- a/src/database/index.js +++ b/src/database/index.js @@ -23,7 +23,7 @@ var mongoConnectionUri = { port: process.env.TD_MONGODB_PORT || nconf.get('mongo:port') || '27017', username: process.env.TD_MONGODB_USERNAME || nconf.get('mongo:username'), password: process.env.TD_MONGODB_PASSWORD || nconf.get('mongo:password'), - database: process.env.TD_MONGODB_DATABASE ? 'trudesk_' + process.env.MONGODB_DATABASE : nconf.get('mongo:database') + database: process.env.TD_MONGODB_DATABASE || nconf.get('mongo:database') } var CONNECTION_URI = '' diff --git a/src/helpers/hbs/helpers.js b/src/helpers/hbs/helpers.js index bf51476cc..2f81811f3 100644 --- a/src/helpers/hbs/helpers.js +++ b/src/helpers/hbs/helpers.js @@ -617,8 +617,8 @@ var helpers = { return options.inverse(this) }, - isNot: function (obj, options) { - if (!(_.isUndefined(obj) || _.isNull(obj) || obj === true)) return options.fn(this) + isNotTrue: function (obj, options) { + if (!(_.isUndefined(obj) || _.isNull(obj) || obj === true || obj === 'true')) return options.fn(this) return options.inverse(this) }, diff --git a/src/views/install.hbs b/src/views/install.hbs index 7343e97a8..8ea400906 100644 --- a/src/views/install.hbs +++ b/src/views/install.hbs @@ -276,7 +276,7 @@

                - {{#isNot isDocker}} + {{#isNotTrue isDocker}}

                MongoDB Connection

                @@ -308,16 +308,17 @@ What is MongoDB?

                - {{/isNot}} - -
                -

                Existing Database?

                -

                - Is this mongodb connection an existing database or a new database? -

                - - -
                + {{/isNotTrue}} + {{#isNotTrue isDocker}} +
                +

                Existing Database?

                +

                + Is this mongodb connection an existing database or a new database? +

                + + +
                + {{/isNotTrue}}

                Setup Account

                From 2bc5ca61560e2eddf0c6ce6ae5b4fb3da342a2b7 Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Mon, 18 Feb 2019 19:06:37 -0500 Subject: [PATCH 63/68] fix(debug): populate db with new role permissions --- src/controllers/debug.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/controllers/debug.js b/src/controllers/debug.js index 125df4c67..e1a93674c 100644 --- a/src/controllers/debug.js +++ b/src/controllers/debug.js @@ -316,15 +316,9 @@ debugController.populatedatabase = function (req, res) { async.series( [ function (done) { - groupSchema.remove({}, done) - }, - function (done) { - tagSchema.remove({}, done) - }, - function (done) { - ticketSchema.remove({}, done) - }, - function (done) { + var roles = global.roles + var userRole = _.find(roles, { normalized: 'user' }) + users = [] for (var i = 0; i < 11; i++) { var random = Math.floor(Math.random() * (10000 - 1 + 1)) + 1 @@ -336,7 +330,7 @@ debugController.populatedatabase = function (req, res) { email: first + '.' + last + random + '@' + chance.domain(), title: chance.profession(), password: 'password', - role: 'user' + role: userRole._id } users.push(user) @@ -344,6 +338,15 @@ debugController.populatedatabase = function (req, res) { userSchema.collection.insert(users, done) }, + function (done) { + groupSchema.remove({}, done) + }, + function (done) { + tagSchema.remove({}, done) + }, + function (done) { + ticketSchema.remove({}, done) + }, function (done) { var groups = [] for (var i = 0; i < 11; i++) { From 9b4c93504ca699db430dc8ea8a3b3ac69ce5f58e Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Mon, 18 Feb 2019 19:07:07 -0500 Subject: [PATCH 64/68] style(routes): refactor for readability --- src/controllers/api/v1/routes.js | 167 +++++++++++++++++++++++ src/routes/index.js | 221 ++----------------------------- 2 files changed, 181 insertions(+), 207 deletions(-) create mode 100644 src/controllers/api/v1/routes.js diff --git a/src/controllers/api/v1/routes.js b/src/controllers/api/v1/routes.js new file mode 100644 index 000000000..248616d02 --- /dev/null +++ b/src/controllers/api/v1/routes.js @@ -0,0 +1,167 @@ +/* + * . .o8 oooo + * .o8 "888 `888 + * .o888oo oooo d8b oooo oooo .oooo888 .ooooo. .oooo.o 888 oooo + * 888 `888""8P `888 `888 d88' `888 d88' `88b d88( "8 888 .8P' + * 888 888 888 888 888 888 888ooo888 `"Y88b. 888888. + * 888 . 888 888 888 888 888 888 .o o. )88b 888 `88b. + * "888" d888b `V88V"V8P' `Y8bod88P" `Y8bod8P' 8""888P' o888o o888o + * ======================================================================== + * Author: Chris Brame + * Updated: 2/18/19 5:59 PM + * Copyright (c) 2014-2019. All rights reserved. + */ + +var packagejson = require('../../../../package') + +module.exports = function (middleware, router, controllers) { + // ShortenVars + var apiv1 = middleware.api + var canUser = middleware.canUser + var apiCtrl = controllers.api + + // Common + router.get('/api', controllers.api.index) + router.get('/api/v1/version', function (req, res) { + return res.json({ version: packagejson.version }) + }) + router.post('/api/v1/login', apiCtrl.login) + router.get('/api/v1/login', apiv1, apiCtrl.getLoggedInUser) + router.get('/api/v1/logout', apiv1, apiCtrl.logout) + + // Roles + router.get('/api/v1/roles', apiv1, apiCtrl.roles.get) + router.post('/api/v1/roles', apiv1, middleware.isAdmin, apiCtrl.roles.create) + router.put('/api/v1/roles/:id', apiv1, middleware.isAdmin, apiCtrl.roles.update) + router.delete('/api/v1/roles/:id', apiv1, middleware.isAdmin, apiCtrl.roles.delete) + + // Tickets + router.get('/api/v1/tickets', apiv1, canUser('tickets:view'), apiCtrl.tickets.get) + router.get('/api/v1/tickets/search', apiv1, canUser('tickets:view'), apiCtrl.tickets.search) + router.post('/api/v1/tickets/create', apiv1, canUser('tickets:create'), apiCtrl.tickets.create) + router.get('/api/v1/tickets/type/:id', apiv1, apiCtrl.tickets.getType) + router.post('/api/v1/tickets/type/:id/removepriority', apiv1, apiCtrl.tickets.typeRemovePriority) + router.post('/api/v1/tickets/type/:id/addpriority', apiv1, apiCtrl.tickets.typeAddPriority) + router.get('/api/v1/tickets/types', apiv1, apiCtrl.tickets.getTypes) + router.post('/api/v1/tickets/types/create', apiv1, apiCtrl.tickets.createType) + router.put('/api/v1/tickets/types/:id', apiv1, apiCtrl.tickets.updateType) + router.delete('/api/v1/tickets/types/:id', apiv1, apiCtrl.tickets.deleteType) + router.post('/api/v1/tickets/priority/create', apiv1, apiCtrl.tickets.createPriority) + router.post('/api/v1/tickets/priority/:id/delete', apiv1, apiCtrl.tickets.deletePriority) + router.get('/api/v1/tickets/priorities', apiv1, apiCtrl.tickets.getPriorities) + router.put('/api/v1/tickets/priority/:id', apiv1, apiCtrl.tickets.updatePriority) + + router.get('/api/v1/tickets/overdue', apiv1, canUser('tickets:view'), apiCtrl.tickets.getOverdue) + router.post('/api/v1/tickets/addcomment', apiv1, canUser('comments:create'), apiCtrl.tickets.postComment) + router.post('/api/v1/tickets/addnote', apiv1, canUser('tickets:notes'), apiCtrl.tickets.postInternalNote) + router.get('/api/v1/tickets/tags', apiv1, apiCtrl.tickets.getTags) + router.get('/api/v1/tickets/count/tags', apiv1, apiCtrl.tickets.getTagCount) + router.get('/api/v1/tickets/count/tags/:timespan', apiv1, apiCtrl.tickets.getTagCount) + router.get('/api/v1/tickets/count/days', apiv1, apiCtrl.tickets.getTicketStats) + router.get('/api/v1/tickets/count/days/:timespan', apiv1, apiCtrl.tickets.getTicketStats) + router.get('/api/v1/tickets/count/topgroups', apiv1, apiCtrl.tickets.getTopTicketGroups) + router.get('/api/v1/tickets/count/topgroups/:top', apiv1, apiCtrl.tickets.getTopTicketGroups) + router.get('/api/v1/tickets/count/topgroups/:timespan/:top', apiv1, apiCtrl.tickets.getTopTicketGroups) + router.get('/api/v1/tickets/stats', apiv1, apiCtrl.tickets.getTicketStats) + router.get('/api/v1/tickets/stats/group/:group', apiv1, apiCtrl.tickets.getTicketStatsForGroup) + router.get('/api/v1/tickets/stats/user/:user', apiv1, apiCtrl.tickets.getTicketStatsForUser) + router.get('/api/v1/tickets/stats/:timespan', apiv1, apiCtrl.tickets.getTicketStats) + router.get('/api/v1/tickets/deleted', apiv1, middleware.isAdmin, apiCtrl.tickets.getDeletedTickets) + router.post('/api/v1/tickets/deleted/restore', apiv1, middleware.isAdmin, apiCtrl.tickets.restoreDeleted) + router.get('/api/v1/tickets/:uid', apiv1, canUser('tickets:view'), apiCtrl.tickets.single) + router.put('/api/v1/tickets/:id', apiv1, canUser('tickets:update'), apiCtrl.tickets.update) + router.delete('/api/v1/tickets/:id', apiv1, canUser('tickets:delete'), apiCtrl.tickets.delete) + router.put('/api/v1/tickets/:id/subscribe', apiv1, apiCtrl.tickets.subscribe) + router.delete( + '/api/v1/tickets/:tid/attachments/remove/:aid', + canUser('tickets:update'), + apiv1, + apiCtrl.tickets.removeAttachment + ) + + // Tags + router.get('/api/v1/count/tags', middleware.api, function (req, res) { + var tagSchema = require('../models/tag') + tagSchema.countDocuments({}, function (err, count) { + if (err) return res.status(500).json({ success: false, error: err }) + + return res.json({ success: true, count: count }) + }) + }) + + router.post('/api/v1/tags/create', apiv1, apiCtrl.tags.createTag) + router.get('/api/v1/tags/limit', apiv1, apiCtrl.tags.getTagsWithLimit) + router.put('/api/v1/tags/:id', apiv1, apiCtrl.tags.updateTag) + router.delete('/api/v1/tags/:id', apiv1, apiCtrl.tags.deleteTag) + + // Public Tickets + var checkCaptcha = middleware.checkCaptcha + var checkOrigin = middleware.checkOrigin + + router.post('/api/v1/public/users/checkemail', checkCaptcha, checkOrigin, apiCtrl.users.checkEmail) + router.post('/api/v1/public/tickets/create', checkCaptcha, checkOrigin, apiCtrl.tickets.createPublicTicket) + router.post('/api/v1/public/account/create', checkCaptcha, checkOrigin, apiCtrl.users.createPublicAccount) + + // Groups + router.get('/api/v1/groups', apiv1, apiCtrl.groups.get) + router.get('/api/v1/groups/all', apiv1, apiCtrl.groups.getAll) + router.post('/api/v1/groups/create', apiv1, apiCtrl.groups.create) + router.get('/api/v1/groups/:id', apiv1, apiCtrl.groups.getSingleGroup) + router.delete('/api/v1/groups/:id', apiv1, apiCtrl.groups.deleteGroup) + router.put('/api/v1/groups/:id', apiv1, apiCtrl.groups.updateGroup) + + // Users + router.get('/api/v1/users', apiv1, apiCtrl.users.getWithLimit) + router.post('/api/v1/users/create', apiv1, apiCtrl.users.create) + router.get('/api/v1/users/notificationCount', apiv1, apiCtrl.users.notificationCount) + router.get('/api/v1/users/getassignees', apiv1, apiCtrl.users.getAssingees) + router.get('/api/v1/users/:username', apiv1, apiCtrl.users.single) + router.put('/api/v1/users/:username', apiv1, apiCtrl.users.update) + router.post('/api/v1/users/:username/uploadprofilepic', apiCtrl.users.uploadProfilePic) + router.put('/api/v1/users/:username/updatepreferences', apiv1, apiCtrl.users.updatePreferences) + router.get('/api/v1/users/:username/enable', apiv1, apiCtrl.users.enableUser) + router.delete('/api/v1/users/:username', apiv1, apiCtrl.users.deleteUser) + router.post('/api/v1/users/:id/generateapikey', apiv1, apiCtrl.users.generateApiKey) + router.post('/api/v1/users/:id/removeapikey', apiv1, apiCtrl.users.removeApiKey) + router.post('/api/v1/users/:id/generatel2auth', apiv1, apiCtrl.users.generateL2Auth) + router.post('/api/v1/users/:id/removel2auth', apiv1, apiCtrl.users.removeL2Auth) + + // Messages + router.get('/api/v1/messages', apiv1, apiCtrl.messages.get) + router.post('/api/v1/messages/conversation/start', apiv1, apiCtrl.messages.startConversation) + router.get('/api/v1/messages/conversation/:id', apiv1, apiCtrl.messages.getMessagesForConversation) + router.delete('/api/v1/messages/conversation/:id', apiv1, apiCtrl.messages.deleteConversation) + router.get('/api/v1/messages/conversations', apiv1, apiCtrl.messages.getConversations) + router.get('/api/v1/messages/conversations/recent', apiv1, apiCtrl.messages.getRecentConversations) + router.post('/api/v1/messages/send', apiv1, apiCtrl.messages.send) + + // Notices + router.post('/api/v1/notices/create', apiv1, apiCtrl.notices.create) + router.get('/api/v1/notices/clearactive', apiv1, apiCtrl.notices.clearActive) + router.put('/api/v1/notices/:id', apiv1, apiCtrl.notices.updateNotice) + router.delete('/api/v1/notices/:id', apiv1, apiCtrl.notices.deleteNotice) + + // Reports Generator + router.post('/api/v1/reports/generate/tickets_by_group', apiv1, apiCtrl.reports.generate.ticketsByGroup) + router.post('/api/v1/reports/generate/tickets_by_status', apiv1, apiCtrl.reports.generate.ticketsByStatus) + router.post('/api/v1/reports/generate/tickets_by_priority', apiv1, apiCtrl.reports.generate.ticketsByPriority) + router.post('/api/v1/reports/generate/tickets_by_tags', apiv1, apiCtrl.reports.generate.ticketsByTags) + router.post('/api/v1/reports/generate/tickets_by_type', apiv1, apiCtrl.reports.generate.ticketsByType) + router.post('/api/v1/reports/generate/tickets_by_user', apiv1, apiCtrl.reports.generate.ticketsByUser) + + // Settings + router.get('/api/v1/settings', apiv1, apiCtrl.settings.getSettings) + router.put('/api/v1/settings', apiv1, apiCtrl.settings.updateSetting) + router.post('/api/v1/settings/testmailer', apiv1, apiCtrl.settings.testMailer) + router.put('/api/v1/settings/mailer/template/:id', apiv1, apiCtrl.settings.updateTemplateSubject) + router.get('/api/v1/settings/buildsass', apiv1, apiCtrl.settings.buildsass) + router.put('/api/v1/settings/updateroleorder', apiv1, apiCtrl.settings.updateRoleOrder) + + // Backups + router.get('/api/v1/backups', apiv1, middleware.isAdmin, controllers.backuprestore.getBackups) + router.post('/api/v1/backup', apiv1, middleware.isAdmin, controllers.backuprestore.runBackup) + router.delete('/api/v1/backup/:backup', apiv1, middleware.isAdmin, controllers.backuprestore.deleteBackup) + router.post('/api/v1/backup/restore', apiv1, middleware.isAdmin, controllers.backuprestore.restoreBackup) + router.post('/api/v1/backup/upload', apiv1, middleware.isAdmin, controllers.backuprestore.uploadBackup) + router.get('/api/v1/backup/hastools', apiv1, middleware.isAdmin, controllers.backuprestore.hasBackupTools) +} diff --git a/src/routes/index.js b/src/routes/index.js index 578276fd2..1deafc312 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -316,171 +316,8 @@ function mainRoutes (router, middleware, controllers) { router.get('/plugins', middleware.redirectToLogin, middleware.loadCommonData, controllers.plugins.get) // API - router.get('/api', controllers.api.index) - router.get('/api/v1/version', function (req, res) { - return res.json({ version: packagejson.version }) - }) - router.post('/api/v1/login', controllers.api.login) - router.get('/api/v1/login', middleware.api, controllers.api.getLoggedInUser) - router.get('/api/v1/logout', middleware.api, controllers.api.logout) - router.get('/api/v1/roles', middleware.api, controllers.api.roles.get) - router.post('/api/v1/roles', middleware.api, controllers.api.roles.create) - router.put('/api/v1/roles/:id', middleware.api, controllers.api.roles.update) - router.delete('/api/v1/roles/:id', middleware.api, controllers.api.roles.delete) - router.get('/api/v1/roles/test', function (req, res) { - var p = require('../permissions') - p.buildGrants() - res.send() - }) - - router.get('/api/v1/count/tags', middleware.api, function (req, res) { - var tagSchema = require('../models/tag') - tagSchema.countDocuments({}, function (err, count) { - if (err) return res.status(500).json({ success: false, error: err }) - - return res.json({ success: true, count: count }) - }) - }) - - router.get('/api/v1/tickets', middleware.api, middleware.canUser('tickets:view'), controllers.api.tickets.get) - router.get( - '/api/v1/tickets/search', - middleware.api, - middleware.canUser('tickets:view'), - controllers.api.tickets.search - ) - router.post( - '/api/v1/tickets/create', - middleware.api, - middleware.canUser('tickets:create'), - controllers.api.tickets.create - ) - router.get('/api/v1/tickets/type/:id', middleware.api, controllers.api.tickets.getType) - router.post('/api/v1/tickets/type/:id/removepriority', middleware.api, controllers.api.tickets.typeRemovePriority) - router.post('/api/v1/tickets/type/:id/addpriority', middleware.api, controllers.api.tickets.typeAddPriority) - router.get('/api/v1/tickets/types', middleware.api, controllers.api.tickets.getTypes) - router.post('/api/v1/tickets/types/create', middleware.api, controllers.api.tickets.createType) - router.put('/api/v1/tickets/types/:id', middleware.api, controllers.api.tickets.updateType) - router.delete('/api/v1/tickets/types/:id', middleware.api, controllers.api.tickets.deleteType) - router.post('/api/v1/tickets/priority/create', middleware.api, controllers.api.tickets.createPriority) - router.post('/api/v1/tickets/priority/:id/delete', middleware.api, controllers.api.tickets.deletePriority) - router.get('/api/v1/tickets/priorities', middleware.api, controllers.api.tickets.getPriorities) - router.put('/api/v1/tickets/priority/:id', middleware.api, controllers.api.tickets.updatePriority) - router.put('/api/v1/settings/updateroleorder', middleware.api, controllers.api.settings.updateRoleOrder) - - router.get('/api/v1/tickets/overdue', middleware.api, controllers.api.tickets.getOverdue) - router.post('/api/v1/tickets/addcomment', middleware.api, controllers.api.tickets.postComment) - router.post('/api/v1/tickets/addnote', middleware.api, controllers.api.tickets.postInternalNote) - router.get('/api/v1/tickets/tags', middleware.api, controllers.api.tickets.getTags) - router.get('/api/v1/tickets/count/tags', middleware.api, controllers.api.tickets.getTagCount) - router.get('/api/v1/tickets/count/tags/:timespan', middleware.api, controllers.api.tickets.getTagCount) - router.get('/api/v1/tickets/count/days', middleware.api, controllers.api.tickets.getTicketStats) - router.get('/api/v1/tickets/count/days/:timespan', middleware.api, controllers.api.tickets.getTicketStats) - router.get('/api/v1/tickets/count/topgroups', middleware.api, controllers.api.tickets.getTopTicketGroups) - router.get('/api/v1/tickets/count/topgroups/:top', middleware.api, controllers.api.tickets.getTopTicketGroups) - router.get( - '/api/v1/tickets/count/topgroups/:timespan/:top', - middleware.api, - controllers.api.tickets.getTopTicketGroups - ) - router.get('/api/v1/tickets/stats', middleware.api, controllers.api.tickets.getTicketStats) - router.get('/api/v1/tickets/stats/group/:group', middleware.api, controllers.api.tickets.getTicketStatsForGroup) - router.get('/api/v1/tickets/stats/user/:user', middleware.api, controllers.api.tickets.getTicketStatsForUser) - router.get('/api/v1/tickets/stats/:timespan', middleware.api, controllers.api.tickets.getTicketStats) - router.get('/api/v1/tickets/deleted', middleware.api, middleware.isAdmin, controllers.api.tickets.getDeletedTickets) - router.post( - '/api/v1/tickets/deleted/restore', - middleware.api, - middleware.isAdmin, - controllers.api.tickets.restoreDeleted - ) - router.get('/api/v1/tickets/:uid', middleware.api, controllers.api.tickets.single) - router.put('/api/v1/tickets/:id', middleware.api, controllers.api.tickets.update) - router.delete('/api/v1/tickets/:id', middleware.api, controllers.api.tickets.delete) - router.put('/api/v1/tickets/:id/subscribe', middleware.api, controllers.api.tickets.subscribe) - router.delete( - '/api/v1/tickets/:tid/attachments/remove/:aid', - middleware.api, - controllers.api.tickets.removeAttachment - ) - - router.post('/api/v1/tags/create', middleware.api, controllers.api.tags.createTag) - router.get('/api/v1/tags/limit', middleware.api, controllers.api.tags.getTagsWithLimit) - router.put('/api/v1/tags/:id', middleware.api, controllers.api.tags.updateTag) - router.delete('/api/v1/tags/:id', middleware.api, controllers.api.tags.deleteTag) - - router.get('/api/v1/groups', middleware.api, controllers.api.groups.get) - router.get('/api/v1/groups/all', middleware.api, controllers.api.groups.getAll) - router.post('/api/v1/groups/create', middleware.api, controllers.api.groups.create) - router.get('/api/v1/groups/:id', middleware.api, controllers.api.groups.getSingleGroup) - router.delete('/api/v1/groups/:id', middleware.api, controllers.api.groups.deleteGroup) - router.put('/api/v1/groups/:id', middleware.api, controllers.api.groups.updateGroup) - - router.get('/api/v1/users', middleware.api, controllers.api.users.getWithLimit) - router.post('/api/v1/users/create', middleware.api, controllers.api.users.create) - router.get('/api/v1/users/notificationCount', middleware.api, controllers.api.users.notificationCount) - router.get('/api/v1/users/getassignees', middleware.api, controllers.api.users.getAssingees) - router.get('/api/v1/users/:username', middleware.api, controllers.api.users.single) - router.put('/api/v1/users/:username', middleware.api, controllers.api.users.update) - router.post('/api/v1/users/:username/uploadprofilepic', controllers.api.users.uploadProfilePic) - router.put('/api/v1/users/:username/updatepreferences', middleware.api, controllers.api.users.updatePreferences) - router.get('/api/v1/users/:username/enable', middleware.api, controllers.api.users.enableUser) - router.delete('/api/v1/users/:username', middleware.api, controllers.api.users.deleteUser) - router.post('/api/v1/users/:id/generateapikey', middleware.api, controllers.api.users.generateApiKey) - router.post('/api/v1/users/:id/removeapikey', middleware.api, controllers.api.users.removeApiKey) - router.post('/api/v1/users/:id/generatel2auth', middleware.api, controllers.api.users.generateL2Auth) - router.post('/api/v1/users/:id/removel2auth', middleware.api, controllers.api.users.removeL2Auth) - - router.get('/api/v1/messages', middleware.api, controllers.api.messages.get) - router.post('/api/v1/messages/conversation/start', middleware.api, controllers.api.messages.startConversation) - router.get('/api/v1/messages/conversation/:id', middleware.api, controllers.api.messages.getMessagesForConversation) - router.delete('/api/v1/messages/conversation/:id', middleware.api, controllers.api.messages.deleteConversation) - router.get('/api/v1/messages/conversations', middleware.api, controllers.api.messages.getConversations) - router.get('/api/v1/messages/conversations/recent', middleware.api, controllers.api.messages.getRecentConversations) - router.post('/api/v1/messages/send', middleware.api, controllers.api.messages.send) - - router.post('/api/v1/notices/create', middleware.api, controllers.api.notices.create) - router.get('/api/v1/notices/clearactive', middleware.api, controllers.api.notices.clearActive) - router.put('/api/v1/notices/:id', middleware.api, controllers.api.notices.updateNotice) - router.delete('/api/v1/notices/:id', middleware.api, controllers.api.notices.deleteNotice) - - // Reports Generator - router.post( - '/api/v1/reports/generate/tickets_by_group', - middleware.api, - controllers.api.reports.generate.ticketsByGroup - ) - router.post( - '/api/v1/reports/generate/tickets_by_status', - middleware.api, - controllers.api.reports.generate.ticketsByStatus - ) - router.post( - '/api/v1/reports/generate/tickets_by_priority', - middleware.api, - controllers.api.reports.generate.ticketsByPriority - ) - router.post( - '/api/v1/reports/generate/tickets_by_tags', - middleware.api, - controllers.api.reports.generate.ticketsByTags - ) - router.post( - '/api/v1/reports/generate/tickets_by_type', - middleware.api, - controllers.api.reports.generate.ticketsByType - ) - router.post( - '/api/v1/reports/generate/tickets_by_user', - middleware.api, - controllers.api.reports.generate.ticketsByUser - ) - - router.get('/api/v1/settings', middleware.api, controllers.api.settings.getSettings) - router.put('/api/v1/settings', middleware.api, controllers.api.settings.updateSetting) - router.post('/api/v1/settings/testmailer', middleware.api, controllers.api.settings.testMailer) - router.put('/api/v1/settings/mailer/template/:id', middleware.api, controllers.api.settings.updateTemplateSubject) - router.get('/api/v1/settings/buildsass', middleware.api, controllers.api.settings.buildsass) + // v1 + require('../controllers/api/v1/routes')(middleware, router, controllers) router.get('/api/v1/plugins/list/installed', middleware.api, function (req, res) { return res.json({ success: true, loadedPlugins: global.plugins }) @@ -498,54 +335,24 @@ function mainRoutes (router, middleware, controllers) { controllers.api.plugins.removePlugin ) - router.post( - '/api/v1/public/users/checkemail', - middleware.checkCaptcha, - middleware.checkOrigin, - controllers.api.users.checkEmail - ) - router.post( - '/api/v1/public/tickets/create', - middleware.checkCaptcha, - middleware.checkOrigin, - controllers.api.tickets.createPublicTicket - ) - router.post( - '/api/v1/public/account/create', - middleware.checkCaptcha, - middleware.checkOrigin, - controllers.api.users.createPublicAccount - ) - - router.get('/api/v1/backups', middleware.api, middleware.isAdmin, controllers.backuprestore.getBackups) - router.post('/api/v1/backup', middleware.api, middleware.isAdmin, controllers.backuprestore.runBackup) - router.delete('/api/v1/backup/:backup', middleware.api, middleware.isAdmin, controllers.backuprestore.deleteBackup) - router.post('/api/v1/backup/restore', middleware.api, middleware.isAdmin, controllers.backuprestore.restoreBackup) - router.post('/api/v1/backup/upload', middleware.api, middleware.isAdmin, controllers.backuprestore.uploadBackup) - router.get('/api/v1/backup/hastools', middleware.api, middleware.isAdmin, controllers.backuprestore.hasBackupTools) - router.get('/api/v1/admin/restart', middleware.api, middleware.isAdmin, function (req, res) { - if (req.user.role === 'admin') { - var pm2 = require('pm2') - pm2.connect(function (err) { + var pm2 = require('pm2') + pm2.connect(function (err) { + if (err) { + winston.error(err) + res.status(400).send(err) + return + } + pm2.restart('trudesk', function (err) { if (err) { - winston.error(err) res.status(400).send(err) - return + return winston.error(err) } - pm2.restart('trudesk', function (err) { - if (err) { - res.status(400).send(err) - return winston.error(err) - } - pm2.disconnect() - res.json({ success: true }) - }) + pm2.disconnect() + res.json({ success: true }) }) - } else { - return res.status(401).json({ success: false, error: 'Unauthorized!' }) - } + }) }) if (global.env === 'development') { From 41d6780d95671eb1b9ccbc89237b4225fccc662b Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Mon, 18 Feb 2019 20:44:52 -0500 Subject: [PATCH 65/68] chore(permissions): set perms on apiv1 --- .../Settings/Permissions/permissionBody.jsx | 5 + src/controllers/api/v1/routes.js | 105 +++++++++--------- src/controllers/api/v1/users.js | 4 + src/middleware/middleware.js | 8 ++ .../js/angularjs/controllers/notices.js | 5 + src/views/tickets.hbs | 15 +-- 6 files changed, 82 insertions(+), 60 deletions(-) diff --git a/src/client/containers/Settings/Permissions/permissionBody.jsx b/src/client/containers/Settings/Permissions/permissionBody.jsx index 0b4e4c85c..6f1f773f4 100644 --- a/src/client/containers/Settings/Permissions/permissionBody.jsx +++ b/src/client/containers/Settings/Permissions/permissionBody.jsx @@ -105,6 +105,10 @@ class PermissionBody extends React.Component { return [{ title: 'Import', perm: 'import' }] } + static mapNoticeSpecials () { + return [{ title: 'Activate', perm: 'activate' }, { title: 'Deactivate', perm: 'deactivate' }] + } + onSubmit (e) { e.preventDefault() let obj = {} @@ -229,6 +233,7 @@ class PermissionBody extends React.Component { title={'Notices'} role={this.props.role} grants={this.noticeGrants} + roleSpecials={PermissionBody.mapNoticeSpecials()} subtitle={'Notice Permissions'} />

                diff --git a/src/controllers/api/v1/routes.js b/src/controllers/api/v1/routes.js index 248616d02..681b3de57 100644 --- a/src/controllers/api/v1/routes.js +++ b/src/controllers/api/v1/routes.js @@ -17,6 +17,9 @@ var packagejson = require('../../../../package') module.exports = function (middleware, router, controllers) { // ShortenVars var apiv1 = middleware.api + var isAdmin = middleware.isAdmin + var isAgent = middleware.isAgent + var isAgentOrAdmin = middleware.isAgentOrAdmin var canUser = middleware.canUser var apiCtrl = controllers.api @@ -31,25 +34,25 @@ module.exports = function (middleware, router, controllers) { // Roles router.get('/api/v1/roles', apiv1, apiCtrl.roles.get) - router.post('/api/v1/roles', apiv1, middleware.isAdmin, apiCtrl.roles.create) - router.put('/api/v1/roles/:id', apiv1, middleware.isAdmin, apiCtrl.roles.update) - router.delete('/api/v1/roles/:id', apiv1, middleware.isAdmin, apiCtrl.roles.delete) + router.post('/api/v1/roles', apiv1, isAdmin, apiCtrl.roles.create) + router.put('/api/v1/roles/:id', apiv1, isAdmin, apiCtrl.roles.update) + router.delete('/api/v1/roles/:id', apiv1, isAdmin, apiCtrl.roles.delete) // Tickets router.get('/api/v1/tickets', apiv1, canUser('tickets:view'), apiCtrl.tickets.get) router.get('/api/v1/tickets/search', apiv1, canUser('tickets:view'), apiCtrl.tickets.search) router.post('/api/v1/tickets/create', apiv1, canUser('tickets:create'), apiCtrl.tickets.create) router.get('/api/v1/tickets/type/:id', apiv1, apiCtrl.tickets.getType) - router.post('/api/v1/tickets/type/:id/removepriority', apiv1, apiCtrl.tickets.typeRemovePriority) - router.post('/api/v1/tickets/type/:id/addpriority', apiv1, apiCtrl.tickets.typeAddPriority) + router.post('/api/v1/tickets/type/:id/removepriority', apiv1, isAdmin, apiCtrl.tickets.typeRemovePriority) + router.post('/api/v1/tickets/type/:id/addpriority', apiv1, isAdmin, apiCtrl.tickets.typeAddPriority) router.get('/api/v1/tickets/types', apiv1, apiCtrl.tickets.getTypes) - router.post('/api/v1/tickets/types/create', apiv1, apiCtrl.tickets.createType) - router.put('/api/v1/tickets/types/:id', apiv1, apiCtrl.tickets.updateType) - router.delete('/api/v1/tickets/types/:id', apiv1, apiCtrl.tickets.deleteType) - router.post('/api/v1/tickets/priority/create', apiv1, apiCtrl.tickets.createPriority) - router.post('/api/v1/tickets/priority/:id/delete', apiv1, apiCtrl.tickets.deletePriority) + router.post('/api/v1/tickets/types/create', apiv1, isAdmin, apiCtrl.tickets.createType) + router.put('/api/v1/tickets/types/:id', apiv1, isAdmin, apiCtrl.tickets.updateType) + router.delete('/api/v1/tickets/types/:id', apiv1, isAdmin, apiCtrl.tickets.deleteType) + router.post('/api/v1/tickets/priority/create', apiv1, isAdmin, apiCtrl.tickets.createPriority) + router.post('/api/v1/tickets/priority/:id/delete', apiv1, isAdmin, apiCtrl.tickets.deletePriority) router.get('/api/v1/tickets/priorities', apiv1, apiCtrl.tickets.getPriorities) - router.put('/api/v1/tickets/priority/:id', apiv1, apiCtrl.tickets.updatePriority) + router.put('/api/v1/tickets/priority/:id', apiv1, isAdmin, apiCtrl.tickets.updatePriority) router.get('/api/v1/tickets/overdue', apiv1, canUser('tickets:view'), apiCtrl.tickets.getOverdue) router.post('/api/v1/tickets/addcomment', apiv1, canUser('comments:create'), apiCtrl.tickets.postComment) @@ -66,8 +69,8 @@ module.exports = function (middleware, router, controllers) { router.get('/api/v1/tickets/stats/group/:group', apiv1, apiCtrl.tickets.getTicketStatsForGroup) router.get('/api/v1/tickets/stats/user/:user', apiv1, apiCtrl.tickets.getTicketStatsForUser) router.get('/api/v1/tickets/stats/:timespan', apiv1, apiCtrl.tickets.getTicketStats) - router.get('/api/v1/tickets/deleted', apiv1, middleware.isAdmin, apiCtrl.tickets.getDeletedTickets) - router.post('/api/v1/tickets/deleted/restore', apiv1, middleware.isAdmin, apiCtrl.tickets.restoreDeleted) + router.get('/api/v1/tickets/deleted', apiv1, isAdmin, apiCtrl.tickets.getDeletedTickets) + router.post('/api/v1/tickets/deleted/restore', apiv1, isAdmin, apiCtrl.tickets.restoreDeleted) router.get('/api/v1/tickets/:uid', apiv1, canUser('tickets:view'), apiCtrl.tickets.single) router.put('/api/v1/tickets/:id', apiv1, canUser('tickets:update'), apiCtrl.tickets.update) router.delete('/api/v1/tickets/:id', apiv1, canUser('tickets:delete'), apiCtrl.tickets.delete) @@ -91,8 +94,8 @@ module.exports = function (middleware, router, controllers) { router.post('/api/v1/tags/create', apiv1, apiCtrl.tags.createTag) router.get('/api/v1/tags/limit', apiv1, apiCtrl.tags.getTagsWithLimit) - router.put('/api/v1/tags/:id', apiv1, apiCtrl.tags.updateTag) - router.delete('/api/v1/tags/:id', apiv1, apiCtrl.tags.deleteTag) + router.put('/api/v1/tags/:id', apiv1, isAgentOrAdmin, apiCtrl.tags.updateTag) + router.delete('/api/v1/tags/:id', apiv1, isAgentOrAdmin, apiCtrl.tags.deleteTag) // Public Tickets var checkCaptcha = middleware.checkCaptcha @@ -103,24 +106,24 @@ module.exports = function (middleware, router, controllers) { router.post('/api/v1/public/account/create', checkCaptcha, checkOrigin, apiCtrl.users.createPublicAccount) // Groups - router.get('/api/v1/groups', apiv1, apiCtrl.groups.get) - router.get('/api/v1/groups/all', apiv1, apiCtrl.groups.getAll) - router.post('/api/v1/groups/create', apiv1, apiCtrl.groups.create) - router.get('/api/v1/groups/:id', apiv1, apiCtrl.groups.getSingleGroup) - router.delete('/api/v1/groups/:id', apiv1, apiCtrl.groups.deleteGroup) - router.put('/api/v1/groups/:id', apiv1, apiCtrl.groups.updateGroup) + router.get('/api/v1/groups', apiv1, canUser('groups:view'), apiCtrl.groups.get) + router.get('/api/v1/groups/all', apiv1, canUser('groups:view'), apiCtrl.groups.getAll) + router.post('/api/v1/groups/create', apiv1, canUser('groups:create'), apiCtrl.groups.create) + router.get('/api/v1/groups/:id', apiv1, canUser('groups:view'), apiCtrl.groups.getSingleGroup) + router.put('/api/v1/groups/:id', apiv1, canUser('groups:update'), apiCtrl.groups.updateGroup) + router.delete('/api/v1/groups/:id', apiv1, canUser('groups:delete'), apiCtrl.groups.deleteGroup) // Users - router.get('/api/v1/users', apiv1, apiCtrl.users.getWithLimit) - router.post('/api/v1/users/create', apiv1, apiCtrl.users.create) + router.get('/api/v1/users', apiv1, canUser('accounts:view'), apiCtrl.users.getWithLimit) + router.post('/api/v1/users/create', apiv1, canUser('accounts:create'), apiCtrl.users.create) router.get('/api/v1/users/notificationCount', apiv1, apiCtrl.users.notificationCount) - router.get('/api/v1/users/getassignees', apiv1, apiCtrl.users.getAssingees) - router.get('/api/v1/users/:username', apiv1, apiCtrl.users.single) - router.put('/api/v1/users/:username', apiv1, apiCtrl.users.update) + router.get('/api/v1/users/getassignees', apiv1, isAgent, apiCtrl.users.getAssingees) + router.get('/api/v1/users/:username', apiv1, canUser('accounts:view'), apiCtrl.users.single) + router.put('/api/v1/users/:username', apiv1, canUser('accounts:update'), apiCtrl.users.update) router.post('/api/v1/users/:username/uploadprofilepic', apiCtrl.users.uploadProfilePic) router.put('/api/v1/users/:username/updatepreferences', apiv1, apiCtrl.users.updatePreferences) - router.get('/api/v1/users/:username/enable', apiv1, apiCtrl.users.enableUser) - router.delete('/api/v1/users/:username', apiv1, apiCtrl.users.deleteUser) + router.get('/api/v1/users/:username/enable', apiv1, canUser('accounts:update'), apiCtrl.users.enableUser) + router.delete('/api/v1/users/:username', apiv1, canUser('accounts:delete'), apiCtrl.users.deleteUser) router.post('/api/v1/users/:id/generateapikey', apiv1, apiCtrl.users.generateApiKey) router.post('/api/v1/users/:id/removeapikey', apiv1, apiCtrl.users.removeApiKey) router.post('/api/v1/users/:id/generatel2auth', apiv1, apiCtrl.users.generateL2Auth) @@ -136,32 +139,34 @@ module.exports = function (middleware, router, controllers) { router.post('/api/v1/messages/send', apiv1, apiCtrl.messages.send) // Notices - router.post('/api/v1/notices/create', apiv1, apiCtrl.notices.create) - router.get('/api/v1/notices/clearactive', apiv1, apiCtrl.notices.clearActive) - router.put('/api/v1/notices/:id', apiv1, apiCtrl.notices.updateNotice) - router.delete('/api/v1/notices/:id', apiv1, apiCtrl.notices.deleteNotice) + router.post('/api/v1/notices/create', apiv1, canUser('notices:create'), apiCtrl.notices.create) + router.get('/api/v1/notices/clearactive', apiv1, canUser('notices:deactivate'), apiCtrl.notices.clearActive) + router.put('/api/v1/notices/:id', apiv1, canUser('notices:update'), apiCtrl.notices.updateNotice) + router.delete('/api/v1/notices/:id', apiv1, canUser('notices:delete'), apiCtrl.notices.deleteNotice) // Reports Generator - router.post('/api/v1/reports/generate/tickets_by_group', apiv1, apiCtrl.reports.generate.ticketsByGroup) - router.post('/api/v1/reports/generate/tickets_by_status', apiv1, apiCtrl.reports.generate.ticketsByStatus) - router.post('/api/v1/reports/generate/tickets_by_priority', apiv1, apiCtrl.reports.generate.ticketsByPriority) - router.post('/api/v1/reports/generate/tickets_by_tags', apiv1, apiCtrl.reports.generate.ticketsByTags) - router.post('/api/v1/reports/generate/tickets_by_type', apiv1, apiCtrl.reports.generate.ticketsByType) - router.post('/api/v1/reports/generate/tickets_by_user', apiv1, apiCtrl.reports.generate.ticketsByUser) + var reportsGenCtrl = apiCtrl.reports.generate + var genBaseUrl = '/api/v1/reports/generate/' + router.post(genBaseUrl + 'tickets_by_group', apiv1, canUser('reports:create'), reportsGenCtrl.ticketsByGroup) + router.post(genBaseUrl + 'tickets_by_status', apiv1, canUser('reports:create'), reportsGenCtrl.ticketsByStatus) + router.post(genBaseUrl + 'tickets_by_priority', apiv1, canUser('reports:create'), reportsGenCtrl.ticketsByPriority) + router.post(genBaseUrl + 'tickets_by_tags', apiv1, canUser('reports:create'), reportsGenCtrl.ticketsByTags) + router.post(genBaseUrl + 'tickets_by_type', apiv1, canUser('reports:create'), reportsGenCtrl.ticketsByType) + router.post(genBaseUrl + 'tickets_by_user', apiv1, canUser('reports:create'), reportsGenCtrl.ticketsByUser) // Settings - router.get('/api/v1/settings', apiv1, apiCtrl.settings.getSettings) - router.put('/api/v1/settings', apiv1, apiCtrl.settings.updateSetting) - router.post('/api/v1/settings/testmailer', apiv1, apiCtrl.settings.testMailer) - router.put('/api/v1/settings/mailer/template/:id', apiv1, apiCtrl.settings.updateTemplateSubject) - router.get('/api/v1/settings/buildsass', apiv1, apiCtrl.settings.buildsass) - router.put('/api/v1/settings/updateroleorder', apiv1, apiCtrl.settings.updateRoleOrder) + router.get('/api/v1/settings', apiv1, isAdmin, apiCtrl.settings.getSettings) + router.put('/api/v1/settings', apiv1, isAdmin, apiCtrl.settings.updateSetting) + router.post('/api/v1/settings/testmailer', apiv1, isAdmin, apiCtrl.settings.testMailer) + router.put('/api/v1/settings/mailer/template/:id', apiv1, isAdmin, apiCtrl.settings.updateTemplateSubject) + router.get('/api/v1/settings/buildsass', apiv1, isAdmin, apiCtrl.settings.buildsass) + router.put('/api/v1/settings/updateroleorder', isAdmin, apiv1, apiCtrl.settings.updateRoleOrder) // Backups - router.get('/api/v1/backups', apiv1, middleware.isAdmin, controllers.backuprestore.getBackups) - router.post('/api/v1/backup', apiv1, middleware.isAdmin, controllers.backuprestore.runBackup) - router.delete('/api/v1/backup/:backup', apiv1, middleware.isAdmin, controllers.backuprestore.deleteBackup) - router.post('/api/v1/backup/restore', apiv1, middleware.isAdmin, controllers.backuprestore.restoreBackup) - router.post('/api/v1/backup/upload', apiv1, middleware.isAdmin, controllers.backuprestore.uploadBackup) - router.get('/api/v1/backup/hastools', apiv1, middleware.isAdmin, controllers.backuprestore.hasBackupTools) + router.get('/api/v1/backups', apiv1, isAdmin, controllers.backuprestore.getBackups) + router.post('/api/v1/backup', apiv1, isAdmin, controllers.backuprestore.runBackup) + router.delete('/api/v1/backup/:backup', apiv1, isAdmin, controllers.backuprestore.deleteBackup) + router.post('/api/v1/backup/restore', apiv1, isAdmin, controllers.backuprestore.restoreBackup) + router.post('/api/v1/backup/upload', apiv1, isAdmin, controllers.backuprestore.uploadBackup) + router.get('/api/v1/backup/hastools', apiv1, isAdmin, controllers.backuprestore.hasBackupTools) } diff --git a/src/controllers/api/v1/users.js b/src/controllers/api/v1/users.js index 9763aba67..9540896f5 100644 --- a/src/controllers/api/v1/users.js +++ b/src/controllers/api/v1/users.js @@ -775,6 +775,8 @@ apiUsers.generateApiKey = function (req, res) { var id = req.params.id if (_.isUndefined(id) || _.isNull(id)) return res.status(400).json({ error: 'Invalid Request' }) + if (!req.user.isAdmin && req.user._id.toString() !== id) return res.status(401).json({ success: 'Unauthorized' }) + UserSchema.getUser(id, function (err, user) { if (err) return res.status(400).json({ error: 'Invalid Request' }) @@ -809,6 +811,8 @@ apiUsers.removeApiKey = function (req, res) { var id = req.params.id if (_.isUndefined(id) || _.isNull(id)) return res.status(400).json({ error: 'Invalid Request' }) + if (!req.user.isAdmin && req.user._id.toString() !== id) return res.status(401).json({ success: 'Unauthorized' }) + UserSchema.getUser(id, function (err, user) { if (err) return res.status(400).json({ error: 'Invalid Request', fullError: err }) diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index 3cfc2d1a2..848ce1172 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -211,6 +211,14 @@ middleware.isAdmin = function (req, res, next) { return res.status(401).json({ success: false, error: 'Not Authorized for this API call.' }) } +middleware.isAgentOrAdmin = function (req, res, next) { + var roles = global.roles + var userRole = _.find(roles, { _id: req.user.role._id }) + if (userRole.role.isAgent || userRole.role.isAdmin) return next() + + return res.status(401).json({ success: false, error: 'Not Authorized for this API call.' }) +} + middleware.isAgent = function (req, res, next) { var role = _.find(global.roles, { _id: req.user.role._id }) if (role.isAgent) return next() diff --git a/src/public/js/angularjs/controllers/notices.js b/src/public/js/angularjs/controllers/notices.js index 468ee3ef1..469195730 100644 --- a/src/public/js/angularjs/controllers/notices.js +++ b/src/public/js/angularjs/controllers/notices.js @@ -101,6 +101,11 @@ define(['angular', 'underscore', 'jquery', 'modules/helpers', 'modules/socket', id = id[0] var $data = { active: true } + if (!helpers.canUser('notices:activate', true)) { + helpers.UI.showSnackbar('Unauthorized', true) + return false + } + $http .get('/api/v1/notices/clearactive') .success(function () { diff --git a/src/views/tickets.hbs b/src/views/tickets.hbs index be4ceba86..f2e4a691d 100644 --- a/src/views/tickets.hbs +++ b/src/views/tickets.hbs @@ -63,24 +63,19 @@
                • Create
                • -

                • - {{#canUser data.user "ticket:Edit"}} + {{#canUserOrAdmin data.user "agent:*"}} +

                • Set Open
                • Set Pending
                • Set Closed
                • {{else}} - {{#canUser data.user "ticket:editSelf"}} -
                • Set Open
                • - -
                • Set Closed
                • - {{/canUser}} - {{/canUser}} - {{#canUser data.user "ticket:delete"}} + {{/canUserOrAdmin}} + {{#canUserOrAdmin data.user "tickets:delete"}}

                • Delete
                • - {{/canUser}} + {{/canUserOrAdmin}}
                From 53e62d7bc133345a51665131eeb5ebc98460feae Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Mon, 18 Feb 2019 20:55:50 -0500 Subject: [PATCH 66/68] fix(ticket): editing subject disappearing --- src/public/js/angularjs/controllers/singleTicket.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/public/js/angularjs/controllers/singleTicket.js b/src/public/js/angularjs/controllers/singleTicket.js index 207974a8b..aea951581 100644 --- a/src/public/js/angularjs/controllers/singleTicket.js +++ b/src/public/js/angularjs/controllers/singleTicket.js @@ -159,8 +159,8 @@ define([ $scope.showEditWindow = function (type, showSubject, commentNoteId) { var $editWindow = $('#edit-ticket-window') if ($editWindow.length < 1) return false - var text = '' var ticketId = $('#__ticketId').text() + var text = '' $editWindow.attr('data-ticket-id', ticketId) if (type.toLowerCase() === 'issue') { @@ -193,6 +193,7 @@ define([ $subjectWrap.attr('data-active', false) } else { var subjectText = '' + $subjectWrap.show() if (type.toLowerCase() === 'issue') { subjectText = $('.initial-issue > .issue-text > .subject-text').text() } From c828ed5c51387ae847170fe196d2b592c85c571b Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Tue, 19 Feb 2019 00:41:53 -0500 Subject: [PATCH 67/68] chore(mobile): update for role permissions --- mobile/index.html | 3 +- mobile/js/app.js | 270 - mobile/js/controllers.js | 14 - mobile/js/controllers/accounts.js | 106 - mobile/js/controllers/conversation.js | 323 -- mobile/js/controllers/dashboard.js | 47 - mobile/js/controllers/graph.js | 64 - mobile/js/controllers/imgCrop.js | 61 - mobile/js/controllers/login.js | 124 - mobile/js/controllers/messages.js | 193 - mobile/js/controllers/ticketDetails.js | 310 - mobile/js/controllers/tickets.js | 414 -- mobile/js/directives.js | 116 - mobile/js/dist/td.app.js | 5015 +++++++++-------- mobile/js/dist/td.app.min.js | 2186 ++++++- mobile/js/infiniteScrollReverse.js | 113 - mobile/js/infiniteScrollReverseController.js | 153 - mobile/js/services.js | 447 -- .../popover/popover-ticket-details.html | 8 +- src/controllers/notices.js | 2 +- src/views/subviews/singleticket.hbs | 16 +- 21 files changed, 4871 insertions(+), 5114 deletions(-) delete mode 100644 mobile/js/app.js delete mode 100644 mobile/js/controllers.js delete mode 100644 mobile/js/controllers/accounts.js delete mode 100644 mobile/js/controllers/conversation.js delete mode 100644 mobile/js/controllers/dashboard.js delete mode 100644 mobile/js/controllers/graph.js delete mode 100644 mobile/js/controllers/imgCrop.js delete mode 100644 mobile/js/controllers/login.js delete mode 100644 mobile/js/controllers/messages.js delete mode 100644 mobile/js/controllers/ticketDetails.js delete mode 100644 mobile/js/controllers/tickets.js delete mode 100644 mobile/js/directives.js delete mode 100644 mobile/js/infiniteScrollReverse.js delete mode 100644 mobile/js/infiniteScrollReverseController.js delete mode 100644 mobile/js/services.js diff --git a/mobile/index.html b/mobile/index.html index 2bc24a6be..5ae6f191f 100644 --- a/mobile/index.html +++ b/mobile/index.html @@ -46,13 +46,12 @@ -
                - +
                diff --git a/mobile/js/app.js b/mobile/js/app.js deleted file mode 100644 index 3755ee5cb..000000000 --- a/mobile/js/app.js +++ /dev/null @@ -1,270 +0,0 @@ -// Ionic trudesk App - -// angular.module is a global place for creating, registering and retrieving Angular modules -// 'trudesk' is the name of this angular module example (also set in a attribute in index.html) -// the 2nd parameter is an array of 'requires' -// 'trudesk.services' is found in services.js -// 'trudesk.controllers' is found in controllers.js -angular.module('underscore', []) -.factory('_', ['$window', function($window) { - return $window._; -}]); - -angular.module('snackbar', []) -.factory('Snackbar', ['$window', function($window) { - return $window.Snackbar; -}]); - -angular.module('trudesk', [ - 'ionic', - 'ngCordova', - 'ngStorage', - 'underscore', - 'trudesk.controllers', - 'trudesk.services', - 'fileOnChange', - 'angular-peity', - 'snackbar', - 'ngCropper', - 'monospaced.elastic', - 'angularMoment', - 'jett.ionic.filter.bar', - 'angular.img' - ]) - -.run(function($ionicPlatform, $rootScope, $location, $localStorage, $state, $http) { - if ($localStorage.accessToken) { - $http.defaults.headers.common.accesstoken = $localStorage.accessToken; - } else { - $http.defaults.headers.common.accesstoken = ''; - } - - $ionicPlatform.ready(function() { - // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard - // for form inputs) - if (window.cordova && window.cordova.plugins && window.cordova.plugins.Keyboard) { - cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); - cordova.plugins.Keyboard.disableScroll(true); - } - - // Lock screen in Portrait if on anything but iPad - if (!ionic.Platform.isIPad()) { - if (window.screen) { - window.screen.orientation.lock('portrait'); - } - } else { - if (window.screen) { - window.screen.orientation.unlock(); - } - } - - if (window.StatusBar) { - // org.apache.cordova.statusbar required - window.StatusBar.styleLightContent(); - } - - var notificationOpenedCallback = function(jsonData) { - if (jsonData.notification.payload && jsonData.notification.payload.additionalData) { - var ticketUid = jsonData.notification.payload.additionalData.ticketUid; - if (ticketUid) { -// console.log('Moving to ticket: ' + ticketUid); - $state.go('tab.tickets') - setTimeout(function() { - return $state.go('tab.tickets-details', { ticketuid: ticketUid}) - }, 850); - } - } - }; - - if (window.plugins && window.plugins.OneSignal) { - window.plugins.OneSignal - .startInit("f8e19190-b53b-4b72-bac8-210e7f31bebb") - .handleNotificationOpened(notificationOpenedCallback) - .endInit(); - } - - $rootScope.$on('$stateChangeStart', function(event, next, current) { - if ($location.url() !== '/login' && ($localStorage.accessToken == undefined || $localStorage.server == undefined)) { - return $location.path('/login'); - } - }); - - setTimeout(function() { - angular.element(document.querySelector('#loader')).addClass('hide'); - }, 900); - }); -}) - -.filter('htmlToPlaintext', function() -{ - return function(text) - { - text = text ? String(text).replace(/<[^>]+>/gm, '') : ''; - text = text ? String(text).replace(/&/gm, '&') : ''; - text = text ? String(text).replace(/"/gm, '"') : ''; - text = text ? String(text).replace(/'/gm, '\'') : ''; - return text; - }; -}) - -.filter('removeHTMLTags', function() { - return function(text) { - return text ? String(text).replace(/<[^>]+>/gm, ' ') : ''; - }; -}) - -.filter('nl2br', ['$filter', - function($filter) { - return function(data) { - if (!data) return data; - return data.replace(/\n\r?/g, '
                '); - } - } -]) - -.filter('sanitize', ['$sce', function($sce) { - return function(htmlCode) { - return $sce.trustAsHtml(htmlCode); - } -}]) - -.filter('currentdate',['$filter', function($filter) { - return function() { - return $filter('date')(new Date(), 'M/dd/yy h:mm a'); - }; -}]) - -.filter('statusMap', function() { - return function(s) { - var status; - switch (s) { - case 0: - status = 'New'; - break; - case 1: - status = 'Open'; - break; - case 2: - status = 'Pending'; - break; - case 3: - status = 'Closed'; - break; - } - - return status; - } -}) - -.filter('assigneeMap', function() { - return function(a) { - if (a === undefined || a === null) { - return 'No Assignee'; - } else { - return a; - } - } -}) - -//Conversation Stuff -.filter('conversationFrom', function() { - return function(p, loggedInUser) { - var final; - for(var i = 0; i < p.length; i++) { - if (p[i].username != loggedInUser.username) - final = p[i]; - } - - return final; - } -}) - -.config(function($stateProvider, $urlRouterProvider) { - ionic.Platform.setPlatform('ios'); - // Ionic uses AngularUI Router which uses the concept of states - // Learn more here: https://github.com/angular-ui/ui-router - // Set up the various states which the app can be in. - // Each state's controller can be found in controllers.js - $stateProvider - - //Login - .state('login', { - url: '/login', - templateUrl: 'templates/login.html', - controller: 'LoginCtrl' - }) - - // setup an abstract state for the tabs directive - .state('tab', { - url: '/tab', - abstract: true, - templateUrl: 'templates/tabs.html' - }) - - // Each tab has its own nav history stack: - - .state('tab.dash', { - url: '/dash', - views: { - 'tab-dash': { - templateUrl: 'templates/tab-dash.html', - controller: 'DashCtrl' - } - } - }) - - .state('tab.tickets', { - url: '/tickets', - views: { - 'tab-tickets': { - templateUrl: 'templates/tab-tickets.html', - controller: 'TicketsCtrl' - } - } - }) - - .state('tab.tickets-details', { - url: '/tickets/:ticketuid', - views: { - 'tab-tickets': { - templateUrl: 'templates/ticket-detail.html', - controller: 'TicketsDetailCtrl' - } - } - }) - - .state('tab.messages', { - url: '/messages', - views: { - 'tab-messages': { - templateUrl: 'templates/tab-messages.html', - controller: 'MessagesCtrl' - } - } - }) - - .state('tab.messages-conversation', { - url: '/messages/:conversationid', - views: { - 'tab-messages': { - templateUrl: 'templates/conversation.html', - controller: 'ConversationCtrl', - controllerAs: 'ConversationCtrl' - } - } - }) - - .state('tab.account', { - url: '/account', - views: { - 'tab-account': { - templateUrl: 'templates/tab-account.html', - controller: 'AccountCtrl' - } - } - }); - - // if none of the above states are matched, use this as the fallback - $urlRouterProvider.otherwise('/login'); - -}); diff --git a/mobile/js/controllers.js b/mobile/js/controllers.js deleted file mode 100644 index ab7fca8aa..000000000 --- a/mobile/js/controllers.js +++ /dev/null @@ -1,14 +0,0 @@ -(function() { - return angular.module('trudesk.controllers', [ - 'trudesk.controllers.login', - 'trudesk.controllers.dashboard', - 'trudesk.controllers.tickets', - 'trudesk.controllers.ticketDetails', - 'trudesk.controllers.accounts', - 'trudesk.controllers.messages', - 'trudesk.controllers.messages.conversation', - - 'trudesk.controllers.imgCrop', - 'trudesk.controllers.graphs' - ]); -})() diff --git a/mobile/js/controllers/accounts.js b/mobile/js/controllers/accounts.js deleted file mode 100644 index bbe37e343..000000000 --- a/mobile/js/controllers/accounts.js +++ /dev/null @@ -1,106 +0,0 @@ -angular.module('trudesk.controllers.accounts', []) -.controller('AccountCtrl', function($q, $scope, $state, $http, $timeout, $localStorage, $ionicHistory, $ionicActionSheet, $ionicModal, $cordovaCamera, Camera, Users, Upload) { - - $scope.server = $localStorage.server; - - $ionicModal.fromTemplateUrl('templates/modals/modal-imgcrop.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.imgcropModal = modal; - }); - - ionic.on('$trudesk.showCropper', function() { - $scope.imgcropModal.show(); - }); - - ionic.on('$trudesk.hideCropper', function() { - $scope.imgcropModal.hide(); - }); - - $scope.showActionSheet = function(event) { - if (!ionic.Platform.isWebView()) return; - var sheet = $ionicActionSheet.show({ - buttons: [ - { text: 'Take Photo' }, - { text: 'Open Photo Library' } - ], - titleText: 'Account Picture', - cancelText: 'Cancel', - cancel: function() { - - }, - buttonClicked: function(index) { - switch (index) { - case 0: - $scope.openCamera(); - return true; - case 1: - $scope.openPhotoLibrary(); - return true - default: - return true; - } - } - }); - }; - - $scope.openCamera = function() { - Camera.open().then(function(fileURL) { - ionic.trigger('$trudesk.imgcrop.setImage', {image: window.Ionic.WebView.convertFileSrc(fileURL)}); - ionic.trigger('$trudesk.imgcrop.showCropper', {}); - $scope.imgcropModal.show(); - }); - }; - - $scope.openPhotoLibrary = function() { - Camera.library().then(function(fileURL) { - ionic.trigger('$trudesk.imgcrop.setImage', {image: window.Ionic.WebView.convertFileSrc(fileURL)}); - ionic.trigger('$trudesk.imgcrop.showCropper', {}); - $scope.imgcropModal.show(); - }); - - ionic.on('$trudesk.account.updateImage', function(data) { - $scope.updateAccountImage(); - }); - }; - - $scope.logout = function($event) { - $event.preventDefault(); - $http.get('/logout/', { - timeout: 2000 - }).then(function successCallback(response) { - - }, function errorCallback(response) { - - }).finally(function() { - ionic.trigger('$trudesk.clearLoginForm', {}); - $localStorage.server = undefined; - $localStorage.accessToken = undefined; - $http.defaults.headers.common.accesstoken = $localStorage.accessToken; - if (window.plugins && window.plugins.OneSignal) - window.plugins.OneSignal.setSubscription(false); - $ionicHistory.clearCache(); - return $state.go('login'); - }); - }; - - $scope.updateAccountImage = function() { - $localStorage.loggedInUser = null; - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - if (user.image) - $scope.accountProfile = '/uploads/users/' + $scope.loggedInUser.image + '?time=' + new Date().getTime(); - else - $scope.accountProfile = '/uploads/users/defaultProfile.jpg'; - }, function(err) { - console.log(err); - }); - }; - - $scope.$on('$ionicView.beforeEnter', function() { - if (!$scope.accountProfile) - $scope.accountProfile = '/uploads/users/defaultProfile.jpg'; - $scope.updateAccountImage(); - }); -}); diff --git a/mobile/js/controllers/conversation.js b/mobile/js/controllers/conversation.js deleted file mode 100644 index dabe485c7..000000000 --- a/mobile/js/controllers/conversation.js +++ /dev/null @@ -1,323 +0,0 @@ -angular.module('trudesk.controllers.messages.conversation', []).controller('ConversationCtrl', function ( - $rootScope, $scope, $state, $stateParams, $localStorage, $ionicListDelegate, $ionicNavBarDelegate, $ionicModal, - $ionicPopup, $ionicPopover, $ionicActionSheet, $ionicLoading, $ionicScrollDelegate, $ionicHistory, $interval, $timeout, $q, moment, WebSocket, Messages, Users) { - - $ionicNavBarDelegate.showBackButton(true); - - var viewScroll = $ionicScrollDelegate.$getByHandle('userMessageScroll'); - - //Vars - $scope.server = $localStorage.server; - $scope.isUserOnline = Users.isUserOnline; - $scope.onlineUsers = {}; - $scope.message = { - body: '' - }; - $scope.messages = []; - $scope.partnerTyping = false; - - $ionicPopover.fromTemplateUrl('templates/popover/popover-messages-conversation.html', { - scope: $scope - }).then(function (popover) { - $scope.popover = popover; - }); - - //Private - var txtInput; // gets set in $ionicView.enter - var typingTimer = null; - var partnerTypingTimer = null; - var isTyping = false; - - //EVENTS - $scope.$on('$ionicView.beforeEnter', function () { - ensureLogin($localStorage, $state); - $scope.server = $localStorage.server; - Users.getLoggedInUser().then(function (user) { - $scope.loggedInUser = user; - $scope.getConversation(); - }, function (err) { - console.log(err); - }).then(function () { - window.addEventListener('native.keyboardshow', onKeyboardShow); - window.addEventListener('native.keyboardhide', onKeyboardHide); - window.addEventListener('$trudesk.converstation.chatmessage', onChatMessage); - window.addEventListener('$trudesk.conversation.updateusers', onUpdateUsers); - // ionic.on('$trudesk.conversation.chatmessage', onChatMessage, window); - ionic.on('$trudesk.conversation.usertyping', onPartnerTyping, window); - ionic.on('$trudesk.conversation.userstoptyping', onPartnerStopTyping, window); - // ionic.on('$trudesk.conversation.updateusers', onUpdateUsers, window); - }).then(function() { - $timeout(function() { - WebSocket.updateUsers(); - }, 0); - }); - }); - - $scope.$on('$ionicView.enter', function () { - txtInput = angular.element(document.body.querySelector('#message-textarea')); - }); - - $scope.$on('$stateChangeStart', function (e) { - window.removeEventListener('native.keyboardshow', onKeyboardShow); - window.removeEventListener('native.keyboardhide', onKeyboardHide); - window.removeEventListener('$trudesk.conversation.chatmessage', onChatMessage); - - ionic.off('$trudesk.conversation.usertyping', onPartnerTyping, window); - ionic.off('$trudesk.conversation.userstoptyping', onPartnerStopTyping, window); - window.removeEventListener('$trudesk.conversation.updateusers', onUpdateUsers); - - stopTyping(); - typingTimer = undefined; - partnerTypingTimer = undefined; - }); - - function scrollBottom() { - $timeout(function () { - viewScroll.scrollBottom(); - }, 10); - } - - function onKeyboardShow(e) { - scrollBottom(); - } - - function onKeyboardHide(e) { - scrollBottom(); - } - - function onPartnerTyping(data) { - if ($scope.partnerTyping) { - clearTimeout(partnerTypingTimer); - partnerTypingTimer = setTimeout(cancelPartnerTyping, 15000); - return; - } - - $scope.partnerTyping = true; - scrollBottom(); - - if (partnerTypingTimer == undefined) - partnerTypingTimer = setTimeout(cancelPartnerTyping, 15000); - } - - function onPartnerStopTyping(data) { - $timeout(function () { - $scope.partnerTyping = false; - }, 0); - } - - function cancelPartnerTyping() { - $timeout(function () { - $scope.partnerTyping = false; - partnerTypingTimer = undefined; - }, 0); - }; - - function onChatMessage(data) { - var m = { - _id: data.detail.messageId, - createdAt: new Date().toISOString(), - owner: data.detail.fromUser, - body: data.detail.message - }; - - $timeout(function () { - $scope.messages.push(m); - - if (viewScroll != undefined) - scrollBottom(); - }, 0); - } - - function onUpdateUsers(data) { - $timeout(function () { - $scope.onlineUsers = data.detail; - }, 0); - } - - - //IF CACHE-VIEW="FALSE" THIS IS NEEDED TO REMOVE THE LISTENER - // var TIMER = $interval(function() { - // if ($ionicHistory.currentView().stateName != 'tab.messages-conversation') { - // console.log('OFF CONVERSATION'); - // ionic.off('$trudesk.conversation.chatmessage', onChatMessage, window); - // $interval.cancel(TIMER); - // return; - // } - // }); - - $scope.getConversation = function () { - if ($scope.page == undefined) - $scope.page = 0; - - return Messages.getConversation($stateParams.conversationid, $scope.page).then(function (response) { - $scope.conversation = response.data.conversation; - - //Set partner ID - for (var i = 0; i < $scope.conversation.participants.length; i++) { - if ($scope.conversation.participants[i].username != $scope.loggedInUser.username) - $scope.conversation.partner = $scope.conversation.participants[i]; - } - - if (_.size(response.data.messages) < 1) { - $scope.hasMore = false; - return; - } - - if ($scope.page == 0) - $scope.messages = response.data.messages.reverse(); - else { - var a = $scope.messages; - if (_.size(a) > 0) - $scope.messages = _.uniq(_.union(a, response.data.messages), false, function(i, k, a){ return i._id }); - $scope.messages = _.sortBy($scope.messages, function(message){ - return message.createdAt; - }); - } - - if (_.size(response.data.messages) < 10) { - $scope.hasMore = false; - } - }, function (err) { - console.log(err); - }).then(function () { - $timeout(function () { - if ($scope.page == 0) - scrollBottom(); - else - $timeout(function () { - viewScroll.scrollBy(0, 150, true); - }); - - $scope.page++; - $scope.$broadcast('scroll.infiniteScrollComplete'); - }, 0); - }); - }; - - $scope.$on('elastic:resize', function (event, element, oldHeight, newHeight) { - $('.message-textbox').css('max-height', newHeight + 'px').css('height', newHeight + 'px'); - element.css('max-height', newHeight - 1 + 'px'); - if (newHeight >= 100) { - element.css('max-height', '99px'); - element.css({ - 'bottom': '5px' - }); - $('.message-textbox').css('max-height', '105px').css('height', '105px'); - } else { - element.css({ - bottom: '0' - }); - } - }); - - $scope.chatTyping = function (event) { - if ((event.shiftKey & event.keyCode === 13) || (event.keyCode === 13 && ionic.Platform.isWebView())) { - return; - } - if (event.keyCode === 13 && !ionic.Platform.isWebView()) { - //Send - event.preventDefault(); - return $scope.sendChatMessage(); - } - - if (isTyping) { - clearTimeout(typingTimer); - typingTimer = setTimeout(stopTyping, 5000); - return; - } - - isTyping = true; - - if (typingTimer == undefined) - typingTimer = setTimeout(stopTyping, 5000); - WebSocket.startTyping($scope.conversation._id, $scope.conversation.partner._id, $localStorage.loggedInUser._id); - }; - - function partnerTyping(data) { - $timeout(function () { - partnerTyping = true; - }, 0); - }; - - // Functions - function stopTyping() { - typingTimer = undefined; - isTyping = false; - if ($scope.conversation === undefined) return; - WebSocket.stopTyping($scope.conversation._id, $scope.conversation.partner._id); - } - // this keeps the keyboard open on a device only after sending a message, it is non obtrusive - function keepKeyboardOpen() { - txtInput.one('blur', function () { - txtInput[0].focus(); - }); - } - - $scope.shouldShowDate = function (date) { - var now = moment(); - var dMoment = moment(date); - var timeDiff = now.diff(dMoment, 'minutes'); - if (timeDiff > 60) - return true; - else - return false; - }; - - - //Loading more messages on Scrolling - $scope.canFetchMoreMessages = function() { - if ($scope.hasMore === undefined) - $scope.hasMore = true; - - return $scope.hasMore; - }; - - $scope.loadMore = function () { - console.log('loading more'); - i++; - if (i > 10) - $scope.hasMore = false; - - if ($scope.conversation !== undefined) { - for (var j = 0; j < 11; j++) { - var message = { - createdAt: new Date(), - body: 'here', - owner: $localStorage.loggedInUser, - _id: Math.random() - }; - $scope.conversation.messages.unshift(message); - } - } - - $timeout(function () { - viewScroll.scrollBy(0, 150, true); - }); - $timeout(function () { - $scope.$broadcast('scroll.infiniteScrollComplete'); - }, 3000); - }; - - - $scope.sendChatMessage = function () { - if (_.isEmpty($scope.message.body)) return false; - $scope.message.ownerId = $scope.loggedInUser._id; - var scopeMessageClone = _.clone($scope.message); - $scope.message.body = ''; - Messages.sendMessage($scope.conversation._id, scopeMessageClone).then(function (response) { - - var message = response.data.message; - WebSocket.send($scope.conversation._id, $scope.conversation.partner._id, $scope.loggedInUser._id, message._id, message.body); - stopTyping(); - keepKeyboardOpen(); - scrollBottom(); - }, function (err) { - console.log(err); - }); - }; -}); - -function ensureLogin($localStorage, $state) { - if ($localStorage.server === undefined || $localStorage.accessToken === undefined) - return $state.go('login'); -} diff --git a/mobile/js/controllers/dashboard.js b/mobile/js/controllers/dashboard.js deleted file mode 100644 index 7138c006f..000000000 --- a/mobile/js/controllers/dashboard.js +++ /dev/null @@ -1,47 +0,0 @@ -angular.module('trudesk.controllers.dashboard', []).controller('DashCtrl', function($http, $scope, $state, $location, $ionicNavBarDelegate, $localStorage, Tickets) { - var path = $location.path(); - if (path.indexOf('dashboard') === -1) - $ionicNavBarDelegate.showBackButton(false); - else - $ionicNavBarDelegate.showBackButton(true); - - $scope.totalTickets = 0; - $scope.timespans = [ - {label: '30 Days', value: 30}, - {label: '60 Days', value: 60}, - {label: '90 Days', value: 90}, - {label: '180 Days', value: 180}, - {label: '365 Days', value: 365} - ]; - - $scope.selectedTimespan = 30; - - $scope.barChart = [5,3,9,6,5,9,7]; - $scope.lineChart = [5,3,9,6,5,9,7,3,5,2]; - - function getStats(timespan) { - Tickets.ticketStats(timespan).then(function successCallback(response) { - $scope.totalTickets = response.data.ticketCount ? response.data.ticketCount : 0; - var closedCount = Number(response.data.closedCount); - $scope.closedPercent = Math.round((closedCount / $scope.totalTickets) * 100); - $scope.closedPercent = isNaN($scope.closedPercent) ? '--' : $scope.closedPercent; - $scope.closedPercentPie = $scope.closedPercent + '/100'; - $scope.ticketAvg = response.data.ticketAvg ? response.data.ticketAvg : 0; - }); - } - - getStats(30); - $scope.timespanChange = function($event) { - $scope.selectedTimespan = this.selectedTimespan; - getStats($scope.selectedTimespan); - }; - - $scope.$on('$ionicView.enter', function() { - if (window.StatusBar) - window.StatusBar.styleLightContent(); - }); - - $scope.$on('$ionicView.beforeEnter', function() { - ensureLogin($localStorage, $state); - }); -}) diff --git a/mobile/js/controllers/graph.js b/mobile/js/controllers/graph.js deleted file mode 100644 index e37bee61a..000000000 --- a/mobile/js/controllers/graph.js +++ /dev/null @@ -1,64 +0,0 @@ -angular.module('trudesk.controllers.graphs', []).controller('GraphCtrl', function($scope, $http, _, Graphs) { - $scope.renderGraphs = function() { - Graphs.topGroups().then(function successCallback(response) { - var arr = []; - if (_.size(response.data.items) < 1) { - response.data.items = [{name: 'No Data', count: 1}]; - } - - arr = _.map(response.data.items, function(v, k) { - return [v.name, v.count]; - }); - - var colors = [ - '#e74c3c', - '#3498db', - '#9b59b6', - '#34495e', - '#1abc9c', - '#2ecc71', - '#03A9F4', - '#00BCD4', - '#009688', - '#4CAF50', - '#FF5722', - '#CDDC39', - '#FFC107', - '#00E5FF', - '#E040FB', - '#607D8B' - ]; - - colors = _.shuffle(colors); - - var c = _.object(_.map(arr, function(v,i) { - return v[0]; - }), colors); - - c3.generate({ - bindto: '#topGroupsChart', - size: { - height: 150, - width: 315 - }, - data: { - columns: arr, - type: 'pie', - colors: c - }, - tooltip: { - show: false - }, - pie: { - label: { - format: function(v, r, id) { - return ''; - } - } - } - }) - }, function errorCallback(err) { - console.error(err); - }); - }; -}); diff --git a/mobile/js/controllers/imgCrop.js b/mobile/js/controllers/imgCrop.js deleted file mode 100644 index f086daa0f..000000000 --- a/mobile/js/controllers/imgCrop.js +++ /dev/null @@ -1,61 +0,0 @@ -angular.module('trudesk.controllers.imgCrop', []) -.controller('imgCrop', function($scope, $state, $timeout, $localStorage, $cordovaCamera, Cropper, Camera, Upload, Users) { - $scope.options = { - maximize: true, - aspectRatio: 1 / 1, - checkImageOrigin: true, - rotatable: true, - //zoomable: false, - viewMode: 1, - dragMode: 'move', - checkOrientation: true - }; - - $scope.cropper = {}; - $scope.cropperProxy = 'cropper.first'; - - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - }, function(error) { - console.log(error); - }); - - $scope.showEvent = 'showCropper'; - $scope.hideEvent = 'hideCropper'; - - function showCropper() { $scope.$broadcast($scope.showEvent); } - function hideCropper() { $scope.$broadcast($scope.hideEvent); } - - $scope.close = function() { - ionic.trigger('$trudesk.hideCropper', {}); - }; - - $scope.save = function() { - if (!$scope.cropper.first) return; - var canvas = $scope.cropper.first('getCroppedCanvas', {width: 256, height: 256}); - - var image = canvas.toDataURL(); - Upload.profilePicture(image).then(function(response) { - ionic.trigger('$trudesk.account.updateImage', {image: response.user.image}); - }, function(err) { - console.log(err); - }).finally(function() { - $scope.close(); - }); - - }; - - ionic.on('$trudesk.imgcrop.showCropper', function() { - $timeout(function() { - hideCropper(); - showCropper(); - }, 0); - }); - - ionic.on('$trudesk.imgcrop.setImage', function(data) { - if (data.detail === undefined || data.detail.image === undefined) return console.log('Invalid data.detail.image'); - // hideCropper(); - $scope.o = data.detail.image; - // showCropper(); - }); -}); diff --git a/mobile/js/controllers/login.js b/mobile/js/controllers/login.js deleted file mode 100644 index 52a805753..000000000 --- a/mobile/js/controllers/login.js +++ /dev/null @@ -1,124 +0,0 @@ -angular.module('trudesk.controllers.login', []).controller('LoginCtrl', function($http, $scope, $state, $localStorage, $ionicLoading, $ionicPopup) { - // if (window.StatusBar) { - // // org.apache.cordova.statusbar required - // window.StatusBar.styleDefault(); - // } - - $ionicLoading.show({ - templateUrl: 'templates/modals/modal-loading.html', - noBackdrop: true, - duration: 1200 - }); - - $scope.auth = { - server: '', - username: '', - password: '' - }; - - $scope.invalid = { - server: false, - username: false, - password: false - }; - - function showError(err) { - var alertPopup = $ionicPopup.alert({ - title: 'Error', - template: err, - okType: 'button-assertive' - }); - - alertPopup.then(function() { - - }); - } - - $scope.login = function(loginForm) { - if (loginForm.$valid) { - $scope.invalid.server = false; - $scope.invalid.username = false; - $scope.invalid.password = false; - $ionicLoading.show({ - templateUrl: 'templates/modals/modal-loading.html', - noBackdrop: true - }); - $scope.auth.server = $scope.auth.server.replace(/^https?:\/\//,''); - $http.post('/api/v1/login', { - 'username': $scope.auth.username, - 'password': $scope.auth.password - }).then(function successCallback(response) { - if (response.data.success === false) { - showError(response.data.error); - } else if (response.data.accessToken !== undefined) { - $localStorage.server = ''; - $localStorage.username = $scope.auth.username; - $localStorage.accessToken = response.data.accessToken; - $localStorage.loggedInUser = response.data.user; - - $http.defaults.headers.common.accesstoken = $localStorage.accessToken; - - //OneSignal - if (window.plugins && window.plugins.OneSignal) { - window.plugins.OneSignal.setSubscription(true); - window.plugins.OneSignal.sendTags({host: $localStorage.server, user: $localStorage.loggedInUser._id}); - } - - $http.get('/api/v1/roles', { - headers: { - 'accesstoken': $localStorage.accessToken - } - }).then(function successCallback(response) { - $localStorage.roles = response.data; - }, function errorCallback(response) { - console.log('Error', response); - }).then(function() { - $state.go('tab.dash'); - }); - } - }, function errorCallback(response) { - console.error(response); - switch (response.status) { - case -1: - showError('Could not connect. Please check server and try again.'); - break; - case 401: - showError('Invalid Username / Password'); - break; - default: - showError('Could not connect. Please check server and try again.'); - - } - }).then(function finalCallback() { - setTimeout(function(){ - $ionicLoading.hide(); - }, 500); - }); - } else { - $scope.invalid.server = loginForm.server.$invalid; - $scope.invalid.username = loginForm.username.$invalid; - $scope.invalid.password = loginForm.password.$invalid - } - }; - - ionic.on('$trudesk.clearLoginForm', function() { - $scope.auth.server = ''; - $scope.auth.username = ''; - $scope.auth.password = ''; - }); - - $scope.$on('$ionicView.enter', function() { - setTimeout(function() { - if ($localStorage.server !== undefined && $localStorage.accessToken !== undefined) { - return $state.go('tab.dash'); // Change this for default page to load when logged in. - } - - if (window.StatusBar) - window.StatusBar.styleDefault(); - - angular.element(document).find('ion-view').removeClass('hide'); - if (window.plugins && window.plugins.OneSignal) - window.plugins.OneSignal.setSubscription(false); - }, 600); - }); -}); diff --git a/mobile/js/controllers/messages.js b/mobile/js/controllers/messages.js deleted file mode 100644 index c0082d8b2..000000000 --- a/mobile/js/controllers/messages.js +++ /dev/null @@ -1,193 +0,0 @@ -angular.module('trudesk.controllers.messages', []).controller('MessagesCtrl', function ( - $scope, $state, $stateParams, $localStorage, $ionicListDelegate, $ionicNavBarDelegate, $ionicModal, - $ionicPopup, $ionicActionSheet, $ionicLoading, $ionicScrollDelegate, $ionicFilterBarConfig, $ionicFilterBar, $timeout, $q, WebSocket, Messages, Users) { - - $ionicNavBarDelegate.showBackButton(true); - $ionicFilterBarConfig.theme = 'dark'; - - //Modals - $ionicModal.fromTemplateUrl('templates/modals/modal-messages-newconversation.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function (modal) { - $scope.newConversation = modal; - }); - - $scope.server = $localStorage.server; - - //Socket.io - $scope.socket = WebSocket; - $scope.recentConversations = []; - $scope.isUserOnline = Users.isUserOnline; - $scope.onlineUsers = []; - $scope.userList = []; - - //EVENTS - $scope.$on('$ionicView.beforeEnter', function () { - ensureLogin($localStorage, $state); - $scope.server = $localStorage.server; - Users.getLoggedInUser().then(function (user) { - $scope.loggedInUser = user; - }, function (err) { - console.log(err); - }).then(function () { - ionic.on('$trudesk.conversation.updateusers', onUpdateUsers, window); - $timeout(function () { - $scope.loadRecentConversations(); - }, 0); - }); - }); - - $scope.$on("$ionicView.enter", function (scopes, states) { - - }); - - $scope.$on('$stateChangeStart', function (e) { - ionic.off('$trudesk.conversation.updateusers', onUpdateUsers, window); - }); - - // Functions - $scope.loadRecentConversations = function () { - Messages.getRecent().then(function (response) { - //Success - $scope.recentConversations = response.data.conversations; - $scope.showRecentConversations = _.size($scope.recentConversations) >= 1; - }, function (err) { - console.log(err); - $scope.showRecentConversations = false; - }); - }; - - $scope.showNewConversation = function () { - $scope.getUserList().then(function () { - $scope.newConversation.show(); - }); - }; - - $scope.hideNewConversation = function () { - if (filterBarInstance) { - filterBarInstance(); - filterBarInstance = null; - } - - $scope.newConversation.hide(); - }; - - $scope.startConversation = function (userId) { - Messages.startConversation(userId).then(function (response) { - var convoId = response.data.conversation._id; - if (convoId === undefined) { - $scope.showSnackbar('Invalid Conversation Id', true); - } else { - if ($scope.newConversation !== undefined) - $scope.hideNewConversation(); - return $state.go('tab.messages-conversation', { - conversationid: convoId - }); - } - }, function (error) { - $scope.showSnackbar(error, true); - console.log(error); - }); - }; - - $scope.deleteConversation = function(convoId) { - Messages.deleteConversation(convoId).then(function (response) { - if (response.data.success) { - var convo = _.find($scope.recentConversations, function(obj) { return obj._id.toString() === convoId.toString()}); - var idx = $scope.recentConversations.indexOf(convo); - if (idx !== -1) - $scope.recentConversations.splice(idx, 1); - } - }, function (error) { - $scope.showSnackbar(error, true); - console.log(error); - }).finally(function() { - //check for 0 recent Convo, and load the last; - $timeout(function () { - $scope.loadRecentConversations(); - }, 0); - }); - }; - - $scope.getUserList = function () { - return Users.getUsers().then(function (res) { - var list = res.data.users; - for (var i = 0; i < list.length; i++) { - if (list[i].username === $localStorage.loggedInUser.username) - list.splice(i, 1); - else { - delete list[i].__v; - delete list[i].accessToken; - delete list[i].deleted; - delete list[i].groups; - delete list[i].iOSDeviceTokens; - delete list[i].lastOnline; - delete list[i].preferences; - delete list[i].role; - delete list[i].title; - } - - } - - $scope.userList = list; - }, function (err) { - $scope.showSnackbar(err, true); - console.log(err); - }); - }; - - var filterBarInstance; - $scope.showFilterBar = function () { - filterBarInstance = $ionicFilterBar.show({ - items: $scope.userList, - container: '.modal', - debounce: true, - delay: 100, - update: function (filteredItems, filterText) { - $scope.userList = filteredItems; - } - }); - }; - - $scope.showSnackbar = function (text, error) { - if (_.isUndefined(error)) error = false; - - var textColor = '#FFFFFF'; - - if (error) - textColor = '#ef473a'; - - Snackbar.show({ - text: text, - showAction: false, - duration: 3000, - textColor: textColor - }); - }; - - function onUpdateUsers(data) { - $timeout(function () { - $scope.onlineUsers = data.detail; - delete $scope.onlineUsers[$scope.loggedInUser.username]; - $ionicScrollDelegate.$getByHandle('activeUsersScroll').resize(); - }, 0); - } - - $scope.isEmpty = function (items) { - var bar; - for (bar in items) { - if (items.hasOwnProperty(bar)) { - return false; - } - } - - return true; - } - -}); - -function ensureLogin($localStorage, $state) { - if ($localStorage.server === undefined || $localStorage.accessToken === undefined) - return $state.go('login'); -} diff --git a/mobile/js/controllers/ticketDetails.js b/mobile/js/controllers/ticketDetails.js deleted file mode 100644 index 9ebe652d3..000000000 --- a/mobile/js/controllers/ticketDetails.js +++ /dev/null @@ -1,310 +0,0 @@ -angular.module('trudesk.controllers.ticketDetails', []).controller('TicketsDetailCtrl', function( - $scope, $state, $stateParams, $ionicHistory, $ionicNavBarDelegate, $localStorage, $ionicModal, $ionicPopover, $ionicActionSheet, Tickets, Users) { - - $ionicNavBarDelegate.showBackButton(true); - - $scope.showSnackbar = function(text, error) { - if (_.isUndefined(error)) error = false; - - var textColor = '#FFFFFF'; - - if (error) - textColor = '#ef473a'; - - Snackbar.show({ - text: text, - showAction: false, - duration: 3000, - textColor: textColor - }); - }; - - $scope.server = $localStorage.server; - $scope.loggedInUser = undefined; - $scope.commentModalForm = { - comment: '' - }; - $scope.noteModalForm = { - note: '' - }; - - $scope.isSupport = ($localStorage.loggedInUser.role === 'admin' || $localStorage.loggedInUser.role === 'mod' || $localStorage.loggedInUser.role === 'support'); - - $ionicModal.fromTemplateUrl('templates/modals/modal-ticket-details.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.ticketDetailModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-addComment.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.addCommentModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-addNote.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.addNoteModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-ticket-setAssignee.html', { - scope: $scope, - animation: 'slide-in-up', - focusFirstInput: true - }).then(function(modal) { - $scope.setAssigneeModal = modal; - }); - - Tickets.get($stateParams.ticketuid).then(function successCallback(response) { - $scope.ticket = response.data.ticket; - if ($scope.ticket.assignee) $scope.selectedAssignee = $scope.ticket.assignee._id; - if ($scope.ticket.owner.image === undefined) $scope.ticket.owner.image = 'defaultProfile.jpg'; - $scope.hasAssignee = 'hide'; - if ($scope.ticket.assignee !== undefined) $scope.hasAssignee = 'show'; - if ($scope.ticket.assignee !== undefined && $scope.ticket.assignee.image === undefined) $scope.ticket.assignee.image = 'defaultProfile.jpg'; - - if ($scope.isSupport) - $scope.ticket.commentsMerged = _.sortBy(_.union($scope.ticket.comments, $scope.ticket.notes), 'date'); - else - $scope.ticket.commentsMerged = $scope.ticket.comments; - }); - - Users.getAssignees().then(function successCallback(response) { - $scope.assignees = response.data.users; - }, function errorCallback(response) { - console.log(response); - }); - - //Right Nav Popover - $scope.popover = $ionicPopover.fromTemplateUrl('templates/popover/popover-ticket-details.html', { - scope: $scope - }).then(function(popover) { - $scope.popover = popover; - }); - - $scope.showStatusActionSheet = function() { - $scope.popover.hide(); - $ionicActionSheet.show({ - buttons: [ - { text: 'Open' }, - { text: 'Pending' }, - { text: 'Closed' } - ], - titleText: 'Set Ticket Status', - cancelText: 'Cancel', - cancel: function() { - return true; - }, - buttonClicked: function(index) { - switch (index) { - case 0: - var reqTicket = {_id: $scope.ticket._id}; - reqTicket.status = 1; - Tickets.update(reqTicket).then(function successCallback(response) { - $scope.ticket.status = 1; - $scope.showSnackbar('Ticket status set to Open'); - }, function errorCallback(response) { - console.log(response); - }); - return true; - case 1: - var reqTicket = {_id: $scope.ticket._id}; - reqTicket.status = 2; - Tickets.update(reqTicket).then(function successCallback(response) { - $scope.ticket.status = 2; - $scope.showSnackbar('Ticket status set to Pending'); - }, function errorCallback(response) { - console.log(response); - }); - return true; - case 2: - var reqTicket = {_id: $scope.ticket._id}; - reqTicket.status = 3; - $scope.ticket.status = 3; - Tickets.update(reqTicket).then(function successCallback(response) { - ionic.trigger('$trudesk.refreshTickets', {}); - $scope.popover.hide(); - $ionicHistory.goBack(); - }, function errorCallback(response) { - console.log(response); - }); - return true; - default: - return true; - } - } - }); - }; - - $scope.setAssigneeChanged = function() { - $scope.selectedAssignee = this.selectedAssignee; - }; - - $scope.showAddComment = function($event) { - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - }).then(function() { - $scope.popover.hide(); - $scope.addCommentModal.show(); - }); - }; - - $scope.closeAddComment = function() { - $scope.commentModalForm.comment = ''; - $scope.addCommentModal.hide(); - }; - - $scope.showAddNote = function($event) { - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - }).then(function() { - $scope.addNoteModal.show(); - $scope.popover.hide(); - }); - }; - - $scope.closeAddNote = function() { - $scope.noteModalForm.note = ''; - $scope.addNoteModal.hide(); - }; - - $scope.openSetAssigneeModal = function() { - $scope.setAssigneeModal.show(); - $scope.popover.hide(); - }; - - $scope.closeSetAssigneeModal = function() { - if ($scope.setAssigneeModal !== undefined) - $scope.setAssigneeModal.hide(); - }; - - $scope.showTicketDetails = function() { - $scope.ticketDetailModal.show(); - $scope.popover.hide(); - }; - - $scope.closeTicketDetailsModal = function() { - $scope.ticketDetailModal.hide(); - }; - - $scope.closeTicket = function() { - $scope.ticket.status = 3; - Tickets.update($scope.ticket).then(function successCallback(response) { - ionic.trigger('$trudesk.refreshTickets', {}); - $scope.popover.hide(); - $ionicHistory.goBack(); - }, function errorCallback(response) { - console.log(response); - }); - }; - - //Form Submits - $scope.addCommentFormSubmit = function() { - var comment = { - ownerId: $scope.loggedInUser._id, - comment: this.commentModalForm.comment - }; - - Tickets.addComment($scope.ticket, comment).then(function successCallback(response) { - //Comment Added - }, function errorCallback(err) { - console.log(err); - $scope.showSnackbar(err, true); - }).then(function() { - Tickets.get($stateParams.ticketuid).then(function successCallback(response) { - $scope.ticket = response.data.ticket; - //Merge Arrays for Note Displaying - if ($scope.isSupport) - $scope.ticket.commentsMerged = _.sortBy(_.union($scope.ticket.comments, $scope.ticket.notes), 'date'); - else - $scope.ticket.commentsMerged = $scope.ticket.comments; - - if ($scope.ticket.owner.image === undefined) $scope.ticket.owner.image = 'defaultProfile.jpg'; - }).then(function() { - $scope.commentModalForm.comment = ''; - $scope.closeAddComment(); - }); - }); - }; - - $scope.addNoteFormSubmit = function() { - var note = { - ownerId: $scope.loggedInUser._id, - note: this.noteModalForm.note - }; - - Tickets.addNote($scope.ticket, note).then(function successCallback(response) { - //Note Added - }, function errorCallback(err) { - console.log(err); - $scope.showSnackbar(err, true); - }).then(function() { - Tickets.get($stateParams.ticketuid).then(function successCallback(response) { - $scope.ticket = response.data.ticket; - - if ($scope.isSupport) - $scope.ticket.commentsMerged = _.sortBy(_.union($scope.ticket.comments, $scope.ticket.notes), 'date'); - else - $scope.ticket.commentsMerged = $scope.tickets.comments; - - if ($scope.ticket.owner.image === undefined) $scope.ticket.owner.image = 'defaultProfile.jpg'; - }).then(function() { - $scope.noteModalForm.note = ''; - $scope.closeAddNote(); - }); - }); - }; - - $scope.setAssigneeFormSubmit = function() { - if (!$scope.ticket) { - $scope.showSnackbar('Invalid Ticket Object', true); - return; - } - - if ($scope.ticket.assignee && $scope.ticket.assignee._id === $scope.selectedAssignee) { - $scope.setAssigneeModal.hide(); - return; - } - - $scope.ticket.assignee = $scope.selectedAssignee; - - Tickets.update($scope.ticket).then(function successCallback(response) { - $scope.ticket = response.data.ticket; - - $scope.hasAssignee = 'hide'; - if ($scope.ticket.assignee !== undefined) $scope.hasAssignee = 'show'; - if ($scope.ticket.assignee !== undefined && $scope.ticket.assignee.image === undefined) $scope.ticket.assignee.image = 'defaultProfile.jpg'; - - if ($scope.isSupport) - $scope.ticket.commentsMerged = _.sortBy(_.union($scope.ticket.comments, $scope.ticket.notes), 'date'); - else - $scope.ticket.commentsMerged = $scope.ticket.comments; - - $scope.setAssigneeModal.hide(); - }, function errorCallback(response) { - console.log(response.data); - $scope.showSnackbar('Error: ' + response.data, true); - }); - }; - - $scope.$on('$ionicView.beforeEnter', function() { - ensureLogin($localStorage, $state); - }); - - $scope.$on('$destroy', function() { - $scope.popover.remove(); - $scope.addCommentModal.remove(); - $scope.addNoteModal.remove(); - $scope.ticketDetailModal.remove(); - $scope.setAssigneeModal.remove(); - }); -}); - -function ensureLogin($localStorage, $state) { - if ($localStorage.server === undefined || $localStorage.accessToken === undefined) - return $state.go('login'); -} diff --git a/mobile/js/controllers/tickets.js b/mobile/js/controllers/tickets.js deleted file mode 100644 index d6291e7b5..000000000 --- a/mobile/js/controllers/tickets.js +++ /dev/null @@ -1,414 +0,0 @@ -angular.module('trudesk.controllers.tickets', []).controller('TicketsCtrl', function( - $scope, $state, $timeout, $stateParams, $localStorage, $ionicListDelegate, $ionicNavBarDelegate, $ionicModal, - $ionicPopup, $ionicActionSheet, $ionicLoading, $q, Tickets, Users, Groups, TicketTypes) { - - $ionicNavBarDelegate.showBackButton(true); - - $ionicModal.fromTemplateUrl('templates/modals/modal-newticket.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.newTicketModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-ticket-filter.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.filterTicketModal = modal; - }); - - $ionicModal.fromTemplateUrl('templates/modals/modal-addComment.html', { - scope: $scope, - animation: 'slide-in-up' - }).then(function(modal) { - $scope.addCommentModal = modal; - }); - - - //SETUP VARS - // $scope.server = $localStorage.server; - $scope.showLoadingTickets = true; - $scope.search = { - term: '' - }; - $scope.filter = {}; - $scope.filter.showClosedTickets = $localStorage.showClosedTickets; - $scope.filter.showOnlyAssigned = $localStorage.showOnlyAssigned; - $scope.commentModalForm = { - comment: '', - ticket: '' - }; - - $scope.isSupport = ($localStorage.loggedInUser.role == 'admin' || $localStorage.loggedInUser.role == 'mod' || $localStorage.loggedInUser.role == 'support'); - - $scope.showSnackbar = function(text, error) { - if (_.isUndefined(error)) error = false; - - var textColor = '#FFFFFF'; - - if (error) - textColor = '#ef473a'; - - Snackbar.show({ - text: text, - showAction: true, - actionText: 'X', - actionTextColor: '#ccc', - duration: 3000, - textColor: textColor - }); - }; - - $scope.showActionSheet = function($event, $ticket) { - $ionicListDelegate.closeOptionButtons(); - var buttons = [ - { text: 'Add Comment' } - ]; - - if ($scope.isSupport) { - buttons.push({ text: 'Open' }); - buttons.push({ text: 'Pending' }); - buttons.push({ text: 'Closed' }); - } - var sheet = $ionicActionSheet.show({ - buttons: buttons, - titleText: 'Ticket Options', - cancelText: 'Cancel', - cancel: function() { - - }, - buttonClicked: function(index) { - switch (index) { - case 0: - var t = _.find($scope.tickets, function(obj){ return obj._id == $ticket._id; }); - $scope.commentModalForm.ticket = t; - $scope.addCommentModal.show(); - return true; - break; - case 1: - var t = _.find($scope.tickets, function(obj){ return obj._id == $ticket._id; }); - var reqTicket = {_id: t._id}; - reqTicket.status = 1; - Tickets.update(reqTicket).then(function successCallback(response) { - t.status = 1; - $scope.showSnackbar('Ticket status set to Open'); - }, function errorCallback(response) { - console.log(response); - }); - return true; - case 2: - var t = _.find($scope.tickets, function(obj){ return obj._id == $ticket._id; }); - var reqTicket = {_id: t._id}; - reqTicket.status = 2; - Tickets.update(reqTicket).then(function successCallback(response) { - t.status = 2; - $scope.showSnackbar('Ticket status set to Pending'); - }, function errorCallback(response) { - console.log(response); - }); - return true; - case 3: - var t = _.find($scope.tickets, function(obj){ return obj._id == $ticket._id; }); - var reqTicket = {_id: t._id}; - reqTicket.status = 3; - Tickets.update(reqTicket).then(function successCallback(response) { - var idx = $scope.tickets.indexOf(t); - if (idx != -1) - $scope.tickets.splice(idx, 1); - $scope.showSnackbar('Ticket status set to Closed'); - }, function errorCallback(response) { - console.log(response); - }).finally(function() { - if (_.size($scope.tickets) < 1) - $scope.showNoTickets = true; - else - $scope.showNoTickets = false; - }); - return true; - default: - return true; - } - } - }); - }; - - $scope.doRefresh = function() { - $scope.search.term = ''; - $scope.shouldRefresh = true; - $scope.fetchTickets().finally(function() { - $scope.$broadcast('scroll.refreshComplete'); - }); - }; - - $scope.getUserImage = function(imageFile) { - var url = 'http://' + $localStorage.server + '/uploads/users/' + imageFile; - - return Users.getImage(url).then(function(image) { - console.log(image); - }); - } - - $scope.fetchTickets = function() { - angular.element(document).find('ion-item').removeClass('item-remove-animate'); - if ($scope.page == undefined) - $scope.page = 0; - - if ($scope.shouldRefresh) { - $scope.page = 0; - $scope.hasMoreTickets = true; - $scope.shouldRefresh = false; - } - - return Tickets.all($scope.page).then(function successCallback(response) { - if (_.size(response.data) < 1) { - $scope.hasMoreTickets = false; - return; - } - - if ($scope.page == 0) { - $scope.tickets = response.data; - } else { - var a = $scope.tickets; - if (_.size(a) > 0) - $scope.tickets = _.uniq(_.union(a, response.data), false, function(i, k, a){ return i._id; }); - } - - }, function errorCallback(error) { - $scope.$broadcast('scroll.infiniteScrollComplete'); - $scope.hasMoreTickets = false; - if (error.status === -1) - return $scope.showAlert('Error', 'Connection Refused.'); - if (error.status === 401) { - ionic.trigger('$trudesk.clearLoginForm', {}); - $localStorage.server = undefined; - $localStorage.accessToken = undefined; - $state.go('login'); - return $scope.showAlert('Error', 'You have been logged out.'); - } - $scope.showAlert('Error', 'Error Status: ' + error.status); - - }).finally(function() { - $scope.showLoadingTickets = false; - if (_.size($scope.tickets) > 0) - $scope.showNoTickets = false; - else - $scope.showNoTickets = true; - - $scope.page++; - $scope.$broadcast('scroll.infiniteScrollComplete'); - }); - }; - - $scope.canFetchMoreTickets = function() { - if ($scope.hasMoreTickets === undefined) - $scope.hasMoreTickets = true; - - return $scope.hasMoreTickets; - }; - - $scope.selected = { - group: '', - ticketType: '', - priority: '' - }; - - $scope.$watch('selected.ticketType', function(newValue, oldValue, scope) { - if (newValue && newValue.priorities) - $scope.selected.priority = newValue.priorities[0]; - }, true); - - $scope.openNewTicket = function() { - var groups = Groups.all(), - types = TicketTypes.all(); - - $q.all([groups, types]).then(function successCallback(results) { - $scope.groups = results[0].data.groups; - $scope.ticketTypes = results[1].data; - if ($scope.ticketTypes[0] && $scope.ticketTypes[0]._id) - $scope.selected.ticketType = $scope.ticketTypes[0]; - $scope.modalNewTicketForm = { - subject: '', - issue: '' - }; - $scope.selected.group = ''; - - }, function errorCallback(error) { - console.error('Error - ' + error); - }).then(function() { - $scope.newTicketModal.show(); - }); - }; - - $scope.closeNewTicket = function() { - $scope.newTicketModal.hide(); - }; - - $scope.openFilterTicket = function() { - $scope.filterTicketModal.show(); - }; - - $scope.applyTicketFilter = function() { - $scope.closeTicketFilter(); - }; - - $scope.closeTicketFilter = function() { - if ($scope.search.term !== '') { - $scope.tickets = []; - $scope.filterTicketModal.hide(); - Snackbar.show({ - text: 'Loading...', - showAction: false, - duration: 2147483647, // Max duration..24days - textColor: '#FFFFFF' - }); - - return Tickets.search($scope.search.term).then(function successCallback(response) { - $scope.tickets = response.data.tickets; - - $timeout(function() { - if (_.size($scope.tickets) < 1) - $scope.showNoTickets = true; - else - $scope.showNoTickets = false; - }, 0); - - $scope.hasMoreTickets = false; - Snackbar.close(); - }, function errorCallback(response) { - console.log(response); - }); - } - - $scope.filterTicketModal.hide(); - if ($scope.shouldRefresh) - $scope.fetchTickets(); - }; - - $scope.clearTicketFilter = function() { - $scope.search.term = ''; - $scope.tickets = null; - $scope.filter.showClosedTickets = false; - $scope.filter.showOnlyAssigned = false; - $localStorage.showClosedTickets = false; - $localStorage.showOnlyAssigned = false; - - ionic.trigger('$trudesk.refreshTickets', {}); - $scope.filterTicketModal.hide(); - }; - - $scope.searchTermChanged = function() { - $scope.shouldRefresh = true; - } - - $scope.showClosedTicketsChanged = function() { - $scope.filter.showClosedTickets = this.filter.showClosedTickets; - $localStorage.showClosedTickets = $scope.filter.showClosedTickets; - $scope.shouldRefresh = true; - }; - - $scope.showOnlyAssigneedChanged = function() { - $scope.filtershowOnlyAssigneed = this.filter.showOnlyAssigned; - $localStorage.showOnlyAssigned = $scope.filter.showOnlyAssigned; - $scope.shouldRefresh = true; - }; - - $scope.closeAddComment = function() { - $scope.addCommentModal.hide(); - }; - - $scope.modalNewTicketForm = { - subject: '', - issue: '' - }; - - $scope.addCommentFormSubmit = function() { - var comment = { - ownerId: $scope.loggedInUser._id, - comment: this.commentModalForm.comment - }; - - Tickets.addComment($scope.commentModalForm.ticket, comment).then(function successCallback(response) { - //Comment Added - }, function errorCallback(err) { - console.log(err); - $scope.showSnackbar(err, true); - }).then(function() { - $scope.commentModalForm.comment = ''; - $scope.commentModalForm.ticket = ''; - $scope.closeAddComment(); - }); - }; - - $scope.submitNewTicket = function($event) { - $event.preventDefault(); - var ticket = { - type: $scope.selected.ticketType, - subject: this.modalNewTicketForm.subject, - issue: this.modalNewTicketForm.issue, - group: $scope.selected.group, - priority: $scope.selected.priority - }; - - if (!ticket.type || !ticket.subject || !ticket.issue || !ticket.group || !ticket.priority) { - // Show Error - - return; - } - - Tickets.create(ticket).then(function successCallback(response) { - ionic.trigger('$trudesk.refreshTickets', {}); - $scope.modalNewTicketForm = { - subject: '', - issue: '' - }; - $scope.closeNewTicket(); - - }, function errorCallback(response) { - console.log('Error----'); - console.log(response); - $scope.showAlert('Error: ' + response.statusText, response.data.error.message); - }).then(function() { - - }); - }; - - $scope.showAlert = function(title, text, button) { - if (button === undefined) button = 'button-assertive'; - return $ionicPopup.alert({ - title: title, - template: text, - okType: button - }); - }; - - ionic.on('$trudesk.refreshTickets', function() { - $scope.doRefresh(); - }); - - $scope.$on('$ionicView.beforeEnter', function() { - ensureLogin($localStorage, $state); - $scope.server = $localStorage.server; - Users.getLoggedInUser().then(function(user) { - $scope.loggedInUser = user; - }, function(err) { - console.log(err); - }); - }); - - $scope.$on('$ionicView.enter', function() { - if (_.size($scope.tickets) < 1) - $scope.doRefresh(); - }); - - $scope.$on('$destroy', function() { - $scope.newTicketModal.remove(); - $scope.filterTicketModal.remove(); - $scope.addCommentModal.remove(); - }); -}); - -function ensureLogin($localStorage, $state) { - if ($localStorage.server === undefined || $localStorage.accessToken === undefined) - return $state.go('login'); -} diff --git a/mobile/js/directives.js b/mobile/js/directives.js deleted file mode 100644 index 610a25c70..000000000 --- a/mobile/js/directives.js +++ /dev/null @@ -1,116 +0,0 @@ -var angularPeity = angular.module('angular-peity', [] ); - -var peityDirective = function(type) { - 'user strict'; - - return { - restrict: 'E', - require: 'ngModel', - scope: { - options: '=' - }, - link: function(scope, element, attrs, ngModel) { - var options = {}; - - if (scope.options) - options = scope.options; - - element[0].innerText = ngModel.$viewValue; - attrs.val = ngModel.$viewValue; - - ngModel.$render = function() { - element[0].innerText = ngModel.$viewValue; - jQuery(element[0]).peity(type, options); - } - } - } -}; - -angularPeity.directive('pieChart', function() { - return peityDirective('donut'); -}); - -angularPeity.directive('barChart', function() { - return peityDirective('bar'); -}); - -angularPeity.directive('lineChart', function() { - return peityDirective('line'); -}); - -var fileOnChange = angular.module('fileOnChange', []); - -fileOnChange.directive('fileOnChange', function() { - return { - restrict: 'A', - link: function(scope, element, attrs) { - var onChangeHandler = scope.$eval(attrs.fileOnChange); - element.bind('change', onChangeHandler); - } - }; -}); - -var autoLinker = angular.module('autolinker', []); -autoLinker.directive('autolinker', ['$timeout', function($timeout) { - return { - restrict: 'A', - link: function(scope, element, attrs) { - $timeout(function() { - var eleHtml = element.html(); - if (eleHtml === '') { - return false; - } - - var text = AutoLinker.link(eleHtml, { - className: 'autolinker', - newWindow: false - }); - - element.html(text); - - var autolinks = element[0].getElementsByClassName('autolinker'); - - for(var i = 0; i < autolinks.length; i++) { - angular.element(autolinks[i].bind('click', function(e) { - var href = e.target.href; - - if (href) { - window.open(href, '_blank'); - } - - e.preventDefault(); - - return false; - })); - } - }, 0); - } - } -}]); - -var hideTabBar = angular.module('hideTabBar', []); - -hideTabBar.directive('hideTabBar', function($timeout) { - var style = angular.element('