');\r\n if (this.tooltipOptions && this.tooltipOptions.cssClass) {\r\n $tip = $('.' + this.tooltipOptions.cssClass);\r\n\r\n if( $tip.length === 0 ){\r\n $tip = $('
').addClass(this.tooltipOptions.cssClass);\r\n $tip.appendTo('body').hide().css({position: 'absolute'});\r\n\r\n if(this.tooltipOptions.defaultTheme) {\r\n $tip.css({\r\n 'background': '#fff',\r\n 'z-index': '1040',\r\n 'padding': '0.4em 0.6em',\r\n 'border-radius': '0.5em',\r\n 'font-size': '0.8em',\r\n 'border': '1px solid #111',\r\n 'display': 'none',\r\n 'white-space': 'nowrap'\r\n });\r\n }\r\n }\r\n }\r\n\r\n return $tip;\r\n };\r\n\r\n /**\r\n * core function, create tooltip content\r\n * @param {string} content - template with tooltip content\r\n * @param {object} item - Flot item\r\n * @return {string} real tooltip content for current item\r\n */\r\n FlotTooltip.prototype.stringFormat = function (content, item) {\r\n var percentPattern = /%p\\.{0,1}(\\d{0,})/;\r\n var seriesPattern = /%s/;\r\n var colorPattern = /%c/;\r\n var xLabelPattern = /%lx/; // requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels, will be ignored if plugin isn't loaded\r\n var yLabelPattern = /%ly/; // requires flot-axislabels plugin https://github.com/markrcote/flot-axislabels, will be ignored if plugin isn't loaded\r\n var xPattern = /%x\\.{0,1}(\\d{0,})/;\r\n var yPattern = /%y\\.{0,1}(\\d{0,})/;\r\n var xPatternWithoutPrecision = \"%x\";\r\n var yPatternWithoutPrecision = \"%y\";\r\n var customTextPattern = \"%ct\";\r\n\tvar nPiePattern = \"%n\";\r\n\r\n var x, y, customText, p, n;\r\n\r\n // for threshold plugin we need to read data from different place\r\n if (typeof item.series.threshold !== \"undefined\") {\r\n x = item.datapoint[0];\r\n y = item.datapoint[1];\r\n customText = item.datapoint[2];\r\n\t}\r\n\r\n\t// for CurvedLines plugin we need to read data from different place\r\n\t else if (typeof item.series.curvedLines !== \"undefined\") {\r\n\t\tx = item.datapoint[0];\r\n\t\ty = item.datapoint[1];\r\n\t }\r\n\r\n else if (typeof item.series.lines !== \"undefined\" && item.series.lines.steps) {\r\n x = item.series.datapoints.points[item.dataIndex * 2];\r\n y = item.series.datapoints.points[item.dataIndex * 2 + 1];\r\n // TODO: where to find custom text in this variant?\r\n customText = \"\";\r\n } else {\r\n x = item.series.data[item.dataIndex][0];\r\n y = item.series.data[item.dataIndex][1];\r\n customText = item.series.data[item.dataIndex][2];\r\n }\r\n\r\n // I think this is only in case of threshold plugin\r\n if (item.series.label === null && item.series.originSeries) {\r\n item.series.label = item.series.originSeries.label;\r\n }\r\n\r\n // if it is a function callback get the content string\r\n if (typeof(content) === 'function') {\r\n content = content(item.series.label, x, y, item);\r\n }\r\n\r\n // the case where the passed content is equal to false\r\n if (typeof(content) === 'boolean' && !content) {\r\n return '';\r\n }\r\n\r\n /* replacement of %ct and other multi-character templates must\r\n precede the replacement of single-character templates\r\n to avoid conflict between '%c' and '%ct' and similar substrings\r\n */\r\n if (customText) {\r\n content = content.replace(customTextPattern, customText);\r\n }\r\n\r\n // percent match for pie charts and stacked percent\r\n if (typeof (item.series.percent) !== 'undefined') {\r\n p = item.series.percent;\r\n } else if (typeof (item.series.percents) !== 'undefined') {\r\n p = item.series.percents[item.dataIndex];\r\n }\r\n if (typeof p === 'number') {\r\n content = this.adjustValPrecision(percentPattern, content, p);\r\n }\r\n\r\n // replace %n with number of items represented by slice in pie charts\r\n if (item.series.hasOwnProperty('pie')) {\r\n if (typeof item.series.data[0][1] !== 'undefined') {\r\n n = item.series.data[0][1];\r\n }\r\n }\r\n if (typeof n === 'number') {\r\n content = content.replace(nPiePattern, n);\r\n }\r\n\r\n // series match\r\n if (typeof(item.series.label) !== 'undefined') {\r\n content = content.replace(seriesPattern, item.series.label);\r\n } else {\r\n //remove %s if label is undefined\r\n content = content.replace(seriesPattern, \"\");\r\n }\r\n\r\n // color match\r\n if (typeof(item.series.color) !== 'undefined') {\r\n content = content.replace(colorPattern, item.series.color);\r\n } else {\r\n //remove %s if color is undefined\r\n content = content.replace(colorPattern, \"\");\r\n }\r\n\r\n // x axis label match\r\n if (this.hasAxisLabel('xaxis', item)) {\r\n content = content.replace(xLabelPattern, item.series.xaxis.options.axisLabel);\r\n } else {\r\n //remove %lx if axis label is undefined or axislabels plugin not present\r\n content = content.replace(xLabelPattern, \"\");\r\n }\r\n\r\n // y axis label match\r\n if (this.hasAxisLabel('yaxis', item)) {\r\n content = content.replace(yLabelPattern, item.series.yaxis.options.axisLabel);\r\n } else {\r\n //remove %ly if axis label is undefined or axislabels plugin not present\r\n content = content.replace(yLabelPattern, \"\");\r\n }\r\n\r\n // time mode axes with custom dateFormat\r\n if (this.isTimeMode('xaxis', item) && this.isXDateFormat(item)) {\r\n content = content.replace(xPattern, this.timestampToDate(x, this.tooltipOptions.xDateFormat, item.series.xaxis.options));\r\n }\r\n if (this.isTimeMode('yaxis', item) && this.isYDateFormat(item)) {\r\n content = content.replace(yPattern, this.timestampToDate(y, this.tooltipOptions.yDateFormat, item.series.yaxis.options));\r\n }\r\n\r\n // set precision if defined\r\n if (typeof x === 'number') {\r\n content = this.adjustValPrecision(xPattern, content, x);\r\n }\r\n if (typeof y === 'number') {\r\n content = this.adjustValPrecision(yPattern, content, y);\r\n }\r\n\r\n // change x from number to given label, if given\r\n if (typeof item.series.xaxis.ticks !== 'undefined') {\r\n\r\n var ticks;\r\n if (this.hasRotatedXAxisTicks(item)) {\r\n // xaxis.ticks will be an empty array if tickRotor is being used, but the values are available in rotatedTicks\r\n ticks = 'rotatedTicks';\r\n } else {\r\n ticks = 'ticks';\r\n }\r\n\r\n // see https://github.com/krzysu/flot.tooltip/issues/65\r\n var tickIndex = item.dataIndex + item.seriesIndex;\r\n\r\n for (var xIndex in item.series.xaxis[ticks]) {\r\n if (item.series.xaxis[ticks].hasOwnProperty(tickIndex) && !this.isTimeMode('xaxis', item)) {\r\n var valueX = (this.isCategoriesMode('xaxis', item)) ? item.series.xaxis[ticks][tickIndex].label : item.series.xaxis[ticks][tickIndex].v;\r\n if (valueX === x) {\r\n content = content.replace(xPattern, item.series.xaxis[ticks][tickIndex].label.replace(/\\$/g, '$$$$'));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // change y from number to given label, if given\r\n if (typeof item.series.yaxis.ticks !== 'undefined') {\r\n for (var yIndex in item.series.yaxis.ticks) {\r\n if (item.series.yaxis.ticks.hasOwnProperty(yIndex)) {\r\n var valueY = (this.isCategoriesMode('yaxis', item)) ? item.series.yaxis.ticks[yIndex].label : item.series.yaxis.ticks[yIndex].v;\r\n if (valueY === y) {\r\n content = content.replace(yPattern, item.series.yaxis.ticks[yIndex].label.replace(/\\$/g, '$$$$'));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // if no value customization, use tickFormatter by default\r\n if (typeof item.series.xaxis.tickFormatter !== 'undefined') {\r\n //escape dollar\r\n content = content.replace(xPatternWithoutPrecision, item.series.xaxis.tickFormatter(x, item.series.xaxis).replace(/\\$/g, '$$'));\r\n }\r\n if (typeof item.series.yaxis.tickFormatter !== 'undefined') {\r\n //escape dollar\r\n content = content.replace(yPatternWithoutPrecision, item.series.yaxis.tickFormatter(y, item.series.yaxis).replace(/\\$/g, '$$'));\r\n }\r\n\r\n return content;\r\n };\r\n\r\n // helpers just for readability\r\n FlotTooltip.prototype.isTimeMode = function (axisName, item) {\r\n return (typeof item.series[axisName].options.mode !== 'undefined' && item.series[axisName].options.mode === 'time');\r\n };\r\n\r\n FlotTooltip.prototype.isXDateFormat = function (item) {\r\n return (typeof this.tooltipOptions.xDateFormat !== 'undefined' && this.tooltipOptions.xDateFormat !== null);\r\n };\r\n\r\n FlotTooltip.prototype.isYDateFormat = function (item) {\r\n return (typeof this.tooltipOptions.yDateFormat !== 'undefined' && this.tooltipOptions.yDateFormat !== null);\r\n };\r\n\r\n FlotTooltip.prototype.isCategoriesMode = function (axisName, item) {\r\n return (typeof item.series[axisName].options.mode !== 'undefined' && item.series[axisName].options.mode === 'categories');\r\n };\r\n\r\n //\r\n FlotTooltip.prototype.timestampToDate = function (tmst, dateFormat, options) {\r\n var theDate = $.plot.dateGenerator(tmst, options);\r\n return $.plot.formatDate(theDate, dateFormat, this.tooltipOptions.monthNames, this.tooltipOptions.dayNames);\r\n };\r\n\r\n //\r\n FlotTooltip.prototype.adjustValPrecision = function (pattern, content, value) {\r\n\r\n var precision;\r\n var matchResult = content.match(pattern);\r\n if( matchResult !== null ) {\r\n if(RegExp.$1 !== '') {\r\n precision = RegExp.$1;\r\n value = value.toFixed(precision);\r\n\r\n // only replace content if precision exists, in other case use thickformater\r\n content = content.replace(pattern, value);\r\n }\r\n }\r\n return content;\r\n };\r\n\r\n // other plugins detection below\r\n\r\n // check if flot-axislabels plugin (https://github.com/markrcote/flot-axislabels) is used and that an axis label is given\r\n FlotTooltip.prototype.hasAxisLabel = function (axisName, item) {\r\n return ($.inArray('axisLabels', this.plotPlugins) !== -1 && typeof item.series[axisName].options.axisLabel !== 'undefined' && item.series[axisName].options.axisLabel.length > 0);\r\n };\r\n\r\n // check whether flot-tickRotor, a plugin which allows rotation of X-axis ticks, is being used\r\n FlotTooltip.prototype.hasRotatedXAxisTicks = function (item) {\r\n return ($.inArray('tickRotor',this.plotPlugins) !== -1 && typeof item.series.xaxis.rotatedTicks !== 'undefined');\r\n };\r\n\r\n //\r\n var init = function (plot) {\r\n new FlotTooltip(plot);\r\n };\r\n\r\n // define Flot plugin\r\n $.plot.plugins.push({\r\n init: init,\r\n options: defaultOptions,\r\n name: 'tooltip',\r\n version: '0.8.5'\r\n });\r\n\r\n})(jQuery);\r\n","/* Flot plugin for plotting textual data or categories.\r\n\r\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\r\nLicensed under the MIT license.\r\n\r\nConsider a dataset like [[\"February\", 34], [\"March\", 20], ...]. This plugin\r\nallows you to plot such a dataset directly.\r\n\r\nTo enable it, you must specify mode: \"categories\" on the axis with the textual\r\nlabels, e.g.\r\n\r\n\t$.plot(\"#placeholder\", data, { xaxis: { mode: \"categories\" } });\r\n\r\nBy default, the labels are ordered as they are met in the data series. If you\r\nneed a different ordering, you can specify \"categories\" on the axis options\r\nand list the categories there:\r\n\r\n\txaxis: {\r\n\t\tmode: \"categories\",\r\n\t\tcategories: [\"February\", \"March\", \"April\"]\r\n\t}\r\n\r\nIf you need to customize the distances between the categories, you can specify\r\n\"categories\" as an object mapping labels to values\r\n\r\n\txaxis: {\r\n\t\tmode: \"categories\",\r\n\t\tcategories: { \"February\": 1, \"March\": 3, \"April\": 4 }\r\n\t}\r\n\r\nIf you don't specify all categories, the remaining categories will be numbered\r\nfrom the max value plus 1 (with a spacing of 1 between each).\r\n\r\nInternally, the plugin works by transforming the input data through an auto-\r\ngenerated mapping where the first category becomes 0, the second 1, etc.\r\nHence, a point like [\"February\", 34] becomes [0, 34] internally in Flot (this\r\nis visible in hover and click events that return numbers rather than the\r\ncategory labels). The plugin also overrides the tick generator to spit out the\r\ncategories as ticks instead of the values.\r\n\r\nIf you need to map a value back to its label, the mapping is always accessible\r\nas \"categories\" on the axis object, e.g. plot.getAxes().xaxis.categories.\r\n\r\n*/\r\n\r\n(function ($) {\r\n var options = {\r\n xaxis: {\r\n categories: null\r\n },\r\n yaxis: {\r\n categories: null\r\n }\r\n };\r\n \r\n function processRawData(plot, series, data, datapoints) {\r\n // if categories are enabled, we need to disable\r\n // auto-transformation to numbers so the strings are intact\r\n // for later processing\r\n\r\n var xCategories = series.xaxis.options.mode == \"categories\",\r\n yCategories = series.yaxis.options.mode == \"categories\";\r\n \r\n if (!(xCategories || yCategories))\r\n return;\r\n\r\n var format = datapoints.format;\r\n\r\n if (!format) {\r\n // FIXME: auto-detection should really not be defined here\r\n var s = series;\r\n format = [];\r\n format.push({ x: true, number: true, required: true });\r\n format.push({ y: true, number: true, required: true });\r\n\r\n if (s.bars.show || (s.lines.show && s.lines.fill)) {\r\n var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));\r\n format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });\r\n if (s.bars.horizontal) {\r\n delete format[format.length - 1].y;\r\n format[format.length - 1].x = true;\r\n }\r\n }\r\n \r\n datapoints.format = format;\r\n }\r\n\r\n for (var m = 0; m < format.length; ++m) {\r\n if (format[m].x && xCategories)\r\n format[m].number = false;\r\n \r\n if (format[m].y && yCategories)\r\n format[m].number = false;\r\n }\r\n }\r\n\r\n function getNextIndex(categories) {\r\n var index = -1;\r\n \r\n for (var v in categories)\r\n if (categories[v] > index)\r\n index = categories[v];\r\n\r\n return index + 1;\r\n }\r\n\r\n function categoriesTickGenerator(axis) {\r\n var res = [];\r\n for (var label in axis.categories) {\r\n var v = axis.categories[label];\r\n if (v >= axis.min && v <= axis.max)\r\n res.push([v, label]);\r\n }\r\n\r\n res.sort(function (a, b) { return a[0] - b[0]; });\r\n\r\n return res;\r\n }\r\n \r\n function setupCategoriesForAxis(series, axis, datapoints) {\r\n if (series[axis].options.mode != \"categories\")\r\n return;\r\n \r\n if (!series[axis].categories) {\r\n // parse options\r\n var c = {}, o = series[axis].options.categories || {};\r\n if ($.isArray(o)) {\r\n for (var i = 0; i < o.length; ++i)\r\n c[o[i]] = i;\r\n }\r\n else {\r\n for (var v in o)\r\n c[v] = o[v];\r\n }\r\n \r\n series[axis].categories = c;\r\n }\r\n\r\n // fix ticks\r\n if (!series[axis].options.ticks)\r\n series[axis].options.ticks = categoriesTickGenerator;\r\n\r\n transformPointsOnAxis(datapoints, axis, series[axis].categories);\r\n }\r\n \r\n function transformPointsOnAxis(datapoints, axis, categories) {\r\n // go through the points, transforming them\r\n var points = datapoints.points,\r\n ps = datapoints.pointsize,\r\n format = datapoints.format,\r\n formatColumn = axis.charAt(0),\r\n index = getNextIndex(categories);\r\n\r\n for (var i = 0; i < points.length; i += ps) {\r\n if (points[i] == null)\r\n continue;\r\n \r\n for (var m = 0; m < ps; ++m) {\r\n var val = points[i + m];\r\n\r\n if (val == null || !format[m][formatColumn])\r\n continue;\r\n\r\n if (!(val in categories)) {\r\n categories[val] = index;\r\n ++index;\r\n }\r\n \r\n points[i + m] = categories[val];\r\n }\r\n }\r\n }\r\n\r\n function processDatapoints(plot, series, datapoints) {\r\n setupCategoriesForAxis(series, \"xaxis\", datapoints);\r\n setupCategoriesForAxis(series, \"yaxis\", datapoints);\r\n }\r\n\r\n function init(plot) {\r\n plot.hooks.processRawData.push(processRawData);\r\n plot.hooks.processDatapoints.push(processDatapoints);\r\n }\r\n \r\n $.plot.plugins.push({\r\n init: init,\r\n options: options,\r\n name: 'categories',\r\n version: '1.0'\r\n });\r\n})(jQuery);\r\n","/* Javascript plotting library for jQuery, version 0.8.3.\r\n\r\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\r\nLicensed under the MIT license.\r\n\r\n*/\r\n\r\n// first an inline dependency, jquery.colorhelpers.js, we inline it here\r\n// for convenience\r\n\r\n/* Plugin for jQuery for working with colors.\r\n *\r\n * Version 1.1.\r\n *\r\n * Inspiration from jQuery color animation plugin by John Resig.\r\n *\r\n * Released under the MIT license by Ole Laursen, October 2009.\r\n *\r\n * Examples:\r\n *\r\n * $.color.parse(\"#fff\").scale('rgb', 0.25).add('a', -0.5).toString()\r\n * var c = $.color.extract($(\"#mydiv\"), 'background-color');\r\n * console.log(c.r, c.g, c.b, c.a);\r\n * $.color.make(100, 50, 25, 0.4).toString() // returns \"rgba(100,50,25,0.4)\"\r\n *\r\n * Note that .scale() and .add() return the same modified object\r\n * instead of making a new one.\r\n *\r\n * V. 1.1: Fix error handling so e.g. parsing an empty string does\r\n * produce a color rather than just crashing.\r\n */\r\n//let jQuery = window.jQuery;\r\n\r\n(function($){\r\n $.color={};\r\n $.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i
=1){return\"rgb(\"+[o.r,o.g,o.b].join(\",\")+\")\"}else{return\"rgba(\"+[o.r,o.g,o.b,o.a].join(\",\")+\")\"}};o.normalize=function(){function clamp(min,value,max){return valuemax?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=\"\"&&c!=\"transparent\")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),\"body\"));if(c==\"rgba(0, 0, 0, 0)\")c=\"transparent\";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name==\"transparent\")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}\r\n})(jQuery);\r\n\r\n\r\n\r\n// the actual Flot code\r\n(function($) {\r\n\r\n\t// Cache the prototype hasOwnProperty for faster access\r\n\r\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\r\n\r\n // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM\r\n // operation produces the same effect as detach, i.e. removing the element\r\n // without touching its jQuery data.\r\n\r\n // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.\r\n\r\n if (!$.fn.detach) {\r\n $.fn.detach = function() {\r\n return this.each(function() {\r\n if (this.parentNode) {\r\n this.parentNode.removeChild( this );\r\n }\r\n });\r\n };\r\n }\r\n\r\n\t///////////////////////////////////////////////////////////////////////////\r\n\t// The Canvas object is a wrapper around an HTML5 tag.\r\n\t//\r\n\t// @constructor\r\n\t// @param {string} cls List of classes to apply to the canvas.\r\n\t// @param {element} container Element onto which to append the canvas.\r\n\t//\r\n\t// Requiring a container is a little iffy, but unfortunately canvas\r\n\t// operations don't work unless the canvas is attached to the DOM.\r\n\r\n\tfunction Canvas(cls, container) {\r\n\r\n\t\tvar element = container.children(\".\" + cls)[0];\r\n\r\n\t\tif (element == null) {\r\n\r\n\t\t\telement = document.createElement(\"canvas\");\r\n\t\t\telement.className = cls;\r\n\r\n\t\t\t$(element).css({ direction: \"ltr\", position: \"absolute\", left: 0, top: 0 })\r\n\t\t\t\t.appendTo(container);\r\n\r\n\t\t\t// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas\r\n\r\n\t\t\tif (!element.getContext) {\r\n\t\t\t\tif (window.G_vmlCanvasManager) {\r\n\t\t\t\t\telement = window.G_vmlCanvasManager.initElement(element);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrow new Error(\"Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.element = element;\r\n\r\n\t\tvar context = this.context = element.getContext(\"2d\");\r\n\r\n\t\t// Determine the screen's ratio of physical to device-independent\r\n\t\t// pixels. This is the ratio between the canvas width that the browser\r\n\t\t// advertises and the number of pixels actually present in that space.\r\n\r\n\t\t// The iPhone 4, for example, has a device-independent width of 320px,\r\n\t\t// but its screen is actually 640px wide. It therefore has a pixel\r\n\t\t// ratio of 2, while most normal devices have a ratio of 1.\r\n\r\n\t\tvar devicePixelRatio = window.devicePixelRatio || 1,\r\n\t\t\tbackingStoreRatio =\r\n\t\t\t\tcontext.webkitBackingStorePixelRatio ||\r\n\t\t\t\tcontext.mozBackingStorePixelRatio ||\r\n\t\t\t\tcontext.msBackingStorePixelRatio ||\r\n\t\t\t\tcontext.oBackingStorePixelRatio ||\r\n\t\t\t\tcontext.backingStorePixelRatio || 1;\r\n\r\n\t\tthis.pixelRatio = devicePixelRatio / backingStoreRatio;\r\n\r\n\t\t// Size the canvas to match the internal dimensions of its container\r\n\r\n\t\tthis.resize(container.width(), container.height());\r\n\r\n\t\t// Collection of HTML div layers for text overlaid onto the canvas\r\n\r\n\t\tthis.textContainer = null;\r\n\t\tthis.text = {};\r\n\r\n\t\t// Cache of text fragments and metrics, so we can avoid expensively\r\n\t\t// re-calculating them when the plot is re-rendered in a loop.\r\n\r\n\t\tthis._textCache = {};\r\n\t}\r\n\r\n\t// Resizes the canvas to the given dimensions.\r\n\t//\r\n\t// @param {number} width New width of the canvas, in pixels.\r\n\t// @param {number} width New height of the canvas, in pixels.\r\n\r\n\tCanvas.prototype.resize = function(width, height) {\r\n\r\n\t\tif (width <= 0 || height <= 0) {\r\n\t\t\tthrow new Error(\"Invalid dimensions for plot, width = \" + width + \", height = \" + height);\r\n\t\t}\r\n\r\n\t\tvar element = this.element,\r\n\t\t\tcontext = this.context,\r\n\t\t\tpixelRatio = this.pixelRatio;\r\n\r\n\t\t// Resize the canvas, increasing its density based on the display's\r\n\t\t// pixel ratio; basically giving it more pixels without increasing the\r\n\t\t// size of its element, to take advantage of the fact that retina\r\n\t\t// displays have that many more pixels in the same advertised space.\r\n\r\n\t\t// Resizing should reset the state (excanvas seems to be buggy though)\r\n\r\n\t\tif (this.width != width) {\r\n\t\t\telement.width = width * pixelRatio;\r\n\t\t\telement.style.width = width + \"px\";\r\n\t\t\tthis.width = width;\r\n\t\t}\r\n\r\n\t\tif (this.height != height) {\r\n\t\t\telement.height = height * pixelRatio;\r\n\t\t\telement.style.height = height + \"px\";\r\n\t\t\tthis.height = height;\r\n\t\t}\r\n\r\n\t\t// Save the context, so we can reset in case we get replotted. The\r\n\t\t// restore ensure that we're really back at the initial state, and\r\n\t\t// should be safe even if we haven't saved the initial state yet.\r\n\r\n\t\tcontext.restore();\r\n\t\tcontext.save();\r\n\r\n\t\t// Scale the coordinate space to match the display density; so even though we\r\n\t\t// may have twice as many pixels, we still want lines and other drawing to\r\n\t\t// appear at the same size; the extra pixels will just make them crisper.\r\n\r\n\t\tcontext.scale(pixelRatio, pixelRatio);\r\n\t};\r\n\r\n\t// Clears the entire canvas area, not including any overlaid HTML text\r\n\r\n\tCanvas.prototype.clear = function() {\r\n\t\tthis.context.clearRect(0, 0, this.width, this.height);\r\n\t};\r\n\r\n\t// Finishes rendering the canvas, including managing the text overlay.\r\n\r\n\tCanvas.prototype.render = function() {\r\n\r\n\t\tvar cache = this._textCache;\r\n\r\n\t\t// For each text layer, add elements marked as active that haven't\r\n\t\t// already been rendered, and remove those that are no longer active.\r\n\r\n\t\tfor (var layerKey in cache) {\r\n\t\t\tif (hasOwnProperty.call(cache, layerKey)) {\r\n\r\n\t\t\t\tvar layer = this.getTextLayer(layerKey),\r\n\t\t\t\t\tlayerCache = cache[layerKey];\r\n\r\n\t\t\t\tlayer.hide();\r\n\r\n\t\t\t\tfor (var styleKey in layerCache) {\r\n\t\t\t\t\tif (hasOwnProperty.call(layerCache, styleKey)) {\r\n\t\t\t\t\t\tvar styleCache = layerCache[styleKey];\r\n\t\t\t\t\t\tfor (var key in styleCache) {\r\n\t\t\t\t\t\t\tif (hasOwnProperty.call(styleCache, key)) {\r\n\r\n\t\t\t\t\t\t\t\tvar positions = styleCache[key].positions;\r\n\r\n\t\t\t\t\t\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\r\n\t\t\t\t\t\t\t\t\tif (position.active) {\r\n\t\t\t\t\t\t\t\t\t\tif (!position.rendered) {\r\n\t\t\t\t\t\t\t\t\t\t\tlayer.append(position.element);\r\n\t\t\t\t\t\t\t\t\t\t\tposition.rendered = true;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tpositions.splice(i--, 1);\r\n\t\t\t\t\t\t\t\t\t\tif (position.rendered) {\r\n\t\t\t\t\t\t\t\t\t\t\tposition.element.detach();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tif (positions.length == 0) {\r\n\t\t\t\t\t\t\t\t\tdelete styleCache[key];\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlayer.show();\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Creates (if necessary) and returns the text overlay container.\r\n\t//\r\n\t// @param {string} classes String of space-separated CSS classes used to\r\n\t// uniquely identify the text layer.\r\n\t// @return {object} The jQuery-wrapped text-layer div.\r\n\r\n\tCanvas.prototype.getTextLayer = function(classes) {\r\n\r\n\t\tvar layer = this.text[classes];\r\n\r\n\t\t// Create the text layer if it doesn't exist\r\n\r\n\t\tif (layer == null) {\r\n\r\n\t\t\t// Create the text layer container, if it doesn't exist\r\n\r\n\t\t\tif (this.textContainer == null) {\r\n\t\t\t\tthis.textContainer = $(\"
\")\r\n\t\t\t\t\t.css({\r\n\t\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\t\ttop: 0,\r\n\t\t\t\t\t\tleft: 0,\r\n\t\t\t\t\t\tbottom: 0,\r\n\t\t\t\t\t\tright: 0,\r\n\t\t\t\t\t\t'font-size': \"smaller\",\r\n\t\t\t\t\t\tcolor: \"#545454\"\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.insertAfter(this.element);\r\n\t\t\t}\r\n\r\n\t\t\tlayer = this.text[classes] = $(\"
\")\r\n\t\t\t\t.addClass(classes)\r\n\t\t\t\t.css({\r\n\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\ttop: 0,\r\n\t\t\t\t\tleft: 0,\r\n\t\t\t\t\tbottom: 0,\r\n\t\t\t\t\tright: 0\r\n\t\t\t\t})\r\n\t\t\t\t.appendTo(this.textContainer);\r\n\t\t}\r\n\r\n\t\treturn layer;\r\n\t};\r\n\r\n\t// Creates (if necessary) and returns a text info object.\r\n\t//\r\n\t// The object looks like this:\r\n\t//\r\n\t// {\r\n\t// width: Width of the text's wrapper div.\r\n\t// height: Height of the text's wrapper div.\r\n\t// element: The jQuery-wrapped HTML div containing the text.\r\n\t// positions: Array of positions at which this text is drawn.\r\n\t// }\r\n\t//\r\n\t// The positions array contains objects that look like this:\r\n\t//\r\n\t// {\r\n\t// active: Flag indicating whether the text should be visible.\r\n\t// rendered: Flag indicating whether the text is currently visible.\r\n\t// element: The jQuery-wrapped HTML div containing the text.\r\n\t// x: X coordinate at which to draw the text.\r\n\t// y: Y coordinate at which to draw the text.\r\n\t// }\r\n\t//\r\n\t// Each position after the first receives a clone of the original element.\r\n\t//\r\n\t// The idea is that that the width, height, and general 'identity' of the\r\n\t// text is constant no matter where it is placed; the placements are a\r\n\t// secondary property.\r\n\t//\r\n\t// Canvas maintains a cache of recently-used text info objects; getTextInfo\r\n\t// either returns the cached element or creates a new entry.\r\n\t//\r\n\t// @param {string} layer A string of space-separated CSS classes uniquely\r\n\t// identifying the layer containing this text.\r\n\t// @param {string} text Text string to retrieve info for.\r\n\t// @param {(string|object)=} font Either a string of space-separated CSS\r\n\t// classes or a font-spec object, defining the text's font and style.\r\n\t// @param {number=} angle Angle at which to rotate the text, in degrees.\r\n\t// Angle is currently unused, it will be implemented in the future.\r\n\t// @param {number=} width Maximum width of the text before it wraps.\r\n\t// @return {object} a text info object.\r\n\r\n\tCanvas.prototype.getTextInfo = function(layer, text, font, angle, width) {\r\n\r\n\t\tvar textStyle, layerCache, styleCache, info;\r\n\r\n\t\t// Cast the value to a string, in case we were given a number or such\r\n\r\n\t\ttext = \"\" + text;\r\n\r\n\t\t// If the font is a font-spec object, generate a CSS font definition\r\n\r\n\t\tif (typeof font === \"object\") {\r\n\t\t\ttextStyle = font.style + \" \" + font.variant + \" \" + font.weight + \" \" + font.size + \"px/\" + font.lineHeight + \"px \" + font.family;\r\n\t\t} else {\r\n\t\t\ttextStyle = font;\r\n\t\t}\r\n\r\n\t\t// Retrieve (or create) the cache for the text's layer and styles\r\n\r\n\t\tlayerCache = this._textCache[layer];\r\n\r\n\t\tif (layerCache == null) {\r\n\t\t\tlayerCache = this._textCache[layer] = {};\r\n\t\t}\r\n\r\n\t\tstyleCache = layerCache[textStyle];\r\n\r\n\t\tif (styleCache == null) {\r\n\t\t\tstyleCache = layerCache[textStyle] = {};\r\n\t\t}\r\n\r\n\t\tinfo = styleCache[text];\r\n\r\n\t\t// If we can't find a matching element in our cache, create a new one\r\n\r\n\t\tif (info == null) {\r\n\r\n\t\t\tvar element = $(\"
\").html(text)\r\n\t\t\t\t.css({\r\n\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\t'max-width': width,\r\n\t\t\t\t\ttop: -9999\r\n\t\t\t\t})\r\n\t\t\t\t.appendTo(this.getTextLayer(layer));\r\n\r\n\t\t\tif (typeof font === \"object\") {\r\n\t\t\t\telement.css({\r\n\t\t\t\t\tfont: textStyle,\r\n\t\t\t\t\tcolor: font.color\r\n\t\t\t\t});\r\n\t\t\t} else if (typeof font === \"string\") {\r\n\t\t\t\telement.addClass(font);\r\n\t\t\t}\r\n\r\n\t\t\tinfo = styleCache[text] = {\r\n\t\t\t\twidth: element.outerWidth(true),\r\n\t\t\t\theight: element.outerHeight(true),\r\n\t\t\t\telement: element,\r\n\t\t\t\tpositions: []\r\n\t\t\t};\r\n\r\n\t\t\telement.detach();\r\n\t\t}\r\n\r\n\t\treturn info;\r\n\t};\r\n\r\n\t// Adds a text string to the canvas text overlay.\r\n\t//\r\n\t// The text isn't drawn immediately; it is marked as rendering, which will\r\n\t// result in its addition to the canvas on the next render pass.\r\n\t//\r\n\t// @param {string} layer A string of space-separated CSS classes uniquely\r\n\t// identifying the layer containing this text.\r\n\t// @param {number} x X coordinate at which to draw the text.\r\n\t// @param {number} y Y coordinate at which to draw the text.\r\n\t// @param {string} text Text string to draw.\r\n\t// @param {(string|object)=} font Either a string of space-separated CSS\r\n\t// classes or a font-spec object, defining the text's font and style.\r\n\t// @param {number=} angle Angle at which to rotate the text, in degrees.\r\n\t// Angle is currently unused, it will be implemented in the future.\r\n\t// @param {number=} width Maximum width of the text before it wraps.\r\n\t// @param {string=} halign Horizontal alignment of the text; either \"left\",\r\n\t// \"center\" or \"right\".\r\n\t// @param {string=} valign Vertical alignment of the text; either \"top\",\r\n\t// \"middle\" or \"bottom\".\r\n\r\n\tCanvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {\r\n\r\n\t\tvar info = this.getTextInfo(layer, text, font, angle, width),\r\n\t\t\tpositions = info.positions;\r\n\r\n\t\t// Tweak the div's position to match the text's alignment\r\n\r\n\t\tif (halign == \"center\") {\r\n\t\t\tx -= info.width / 2;\r\n\t\t} else if (halign == \"right\") {\r\n\t\t\tx -= info.width;\r\n\t\t}\r\n\r\n\t\tif (valign == \"middle\") {\r\n\t\t\ty -= info.height / 2;\r\n\t\t} else if (valign == \"bottom\") {\r\n\t\t\ty -= info.height;\r\n\t\t}\r\n\r\n\t\t// Determine whether this text already exists at this position.\r\n\t\t// If so, mark it for inclusion in the next render pass.\r\n\r\n\t\tfor (var i = 0, position; position = positions[i]; i++) {\r\n\t\t\tif (position.x == x && position.y == y) {\r\n\t\t\t\tposition.active = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// If the text doesn't exist at this position, create a new entry\r\n\r\n\t\t// For the very first position we'll re-use the original element,\r\n\t\t// while for subsequent ones we'll clone it.\r\n\r\n\t\tposition = {\r\n\t\t\tactive: true,\r\n\t\t\trendered: false,\r\n\t\t\telement: positions.length ? info.element.clone() : info.element,\r\n\t\t\tx: x,\r\n\t\t\ty: y\r\n\t\t};\r\n\r\n\t\tpositions.push(position);\r\n\r\n\t\t// Move the element to its final position within the container\r\n\r\n\t\tposition.element.css({\r\n\t\t\ttop: Math.round(y),\r\n\t\t\tleft: Math.round(x),\r\n\t\t\t'text-align': halign\t// In case the text wraps\r\n\t\t});\r\n\t};\r\n\r\n\t// Removes one or more text strings from the canvas text overlay.\r\n\t//\r\n\t// If no parameters are given, all text within the layer is removed.\r\n\t//\r\n\t// Note that the text is not immediately removed; it is simply marked as\r\n\t// inactive, which will result in its removal on the next render pass.\r\n\t// This avoids the performance penalty for 'clear and redraw' behavior,\r\n\t// where we potentially get rid of all text on a layer, but will likely\r\n\t// add back most or all of it later, as when redrawing axes, for example.\r\n\t//\r\n\t// @param {string} layer A string of space-separated CSS classes uniquely\r\n\t// identifying the layer containing this text.\r\n\t// @param {number=} x X coordinate of the text.\r\n\t// @param {number=} y Y coordinate of the text.\r\n\t// @param {string=} text Text string to remove.\r\n\t// @param {(string|object)=} font Either a string of space-separated CSS\r\n\t// classes or a font-spec object, defining the text's font and style.\r\n\t// @param {number=} angle Angle at which the text is rotated, in degrees.\r\n\t// Angle is currently unused, it will be implemented in the future.\r\n\r\n\tCanvas.prototype.removeText = function(layer, x, y, text, font, angle) {\r\n\t\tif (text == null) {\r\n\t\t\tvar layerCache = this._textCache[layer];\r\n\t\t\tif (layerCache != null) {\r\n\t\t\t\tfor (var styleKey in layerCache) {\r\n\t\t\t\t\tif (hasOwnProperty.call(layerCache, styleKey)) {\r\n\t\t\t\t\t\tvar styleCache = layerCache[styleKey];\r\n\t\t\t\t\t\tfor (var key in styleCache) {\r\n\t\t\t\t\t\t\tif (hasOwnProperty.call(styleCache, key)) {\r\n\t\t\t\t\t\t\t\tvar positions = styleCache[key].positions;\r\n\t\t\t\t\t\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\r\n\t\t\t\t\t\t\t\t\tposition.active = false;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvar positions = this.getTextInfo(layer, text, font, angle).positions;\r\n\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\r\n\t\t\t\tif (position.x == x && position.y == y) {\r\n\t\t\t\t\tposition.active = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t///////////////////////////////////////////////////////////////////////////\r\n\t// The top-level container for the entire plot.\r\n\r\n function Plot(placeholder, data_, options_, plugins) {\r\n // data is on the form:\r\n // [ series1, series2 ... ]\r\n // where series is either just the data as [ [x1, y1], [x2, y2], ... ]\r\n // or { data: [ [x1, y1], [x2, y2], ... ], label: \"some label\", ... }\r\n\r\n var series = [],\r\n options = {\r\n // the color theme used for graphs\r\n colors: [\"#edc240\", \"#afd8f8\", \"#cb4b4b\", \"#4da74d\", \"#9440ed\"],\r\n legend: {\r\n show: true,\r\n noColumns: 1, // number of colums in legend table\r\n labelFormatter: null, // fn: string -> string\r\n labelBoxBorderColor: \"#ccc\", // border color for the little label boxes\r\n container: null, // container (as jQuery object) to put legend in, null means default on top of graph\r\n position: \"ne\", // position of default legend container within plot\r\n margin: 5, // distance from grid edge to default legend container within plot\r\n backgroundColor: null, // null means auto-detect\r\n backgroundOpacity: 0.85, // set to 0 to avoid background\r\n sorted: null // default to no legend sorting\r\n },\r\n xaxis: {\r\n show: null, // null = auto-detect, true = always, false = never\r\n position: \"bottom\", // or \"top\"\r\n mode: null, // null or \"time\"\r\n font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: \"italic\", weight: \"bold\", family: \"sans-serif\", variant: \"small-caps\" }\r\n color: null, // base color, labels, ticks\r\n tickColor: null, // possibly different color of ticks, e.g. \"rgba(0,0,0,0.15)\"\r\n transform: null, // null or f: number -> number to transform axis\r\n inverseTransform: null, // if transform is set, this should be the inverse function\r\n min: null, // min. value to show, null means set automatically\r\n max: null, // max. value to show, null means set automatically\r\n autoscaleMargin: null, // margin in % to add if auto-setting min/max\r\n ticks: null, // either [1, 3] or [[1, \"a\"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks\r\n tickFormatter: null, // fn: number -> string\r\n labelWidth: null, // size of tick labels in pixels\r\n labelHeight: null,\r\n reserveSpace: null, // whether to reserve space even if axis isn't shown\r\n tickLength: null, // size in pixels of ticks, or \"full\" for whole line\r\n alignTicksWithAxis: null, // axis number or null for no sync\r\n tickDecimals: null, // no. of decimals, null means auto\r\n tickSize: null, // number or [number, \"unit\"]\r\n minTickSize: null // number or [number, \"unit\"]\r\n },\r\n yaxis: {\r\n autoscaleMargin: 0.02,\r\n position: \"left\" // or \"right\"\r\n },\r\n xaxes: [],\r\n yaxes: [],\r\n series: {\r\n points: {\r\n show: false,\r\n radius: 3,\r\n lineWidth: 2, // in pixels\r\n fill: true,\r\n fillColor: \"#ffffff\",\r\n symbol: \"circle\" // or callback\r\n },\r\n lines: {\r\n // we don't put in show: false so we can see\r\n // whether lines were actively disabled\r\n lineWidth: 2, // in pixels\r\n fill: false,\r\n fillColor: null,\r\n steps: false\r\n // Omit 'zero', so we can later default its value to\r\n // match that of the 'fill' option.\r\n },\r\n bars: {\r\n show: false,\r\n lineWidth: 2, // in pixels\r\n barWidth: 1, // in units of the x axis\r\n fill: true,\r\n fillColor: null,\r\n align: \"left\", // \"left\", \"right\", or \"center\"\r\n horizontal: false,\r\n zero: true\r\n },\r\n shadowSize: 3,\r\n highlightColor: null\r\n },\r\n grid: {\r\n show: true,\r\n aboveData: false,\r\n color: \"#545454\", // primary color used for outline and labels\r\n backgroundColor: null, // null for transparent, else color\r\n borderColor: null, // set if different from the grid color\r\n tickColor: null, // color for the ticks, e.g. \"rgba(0,0,0,0.15)\"\r\n margin: 0, // distance from the canvas edge to the grid\r\n labelMargin: 5, // in pixels\r\n axisMargin: 8, // in pixels\r\n borderWidth: 2, // in pixels\r\n minBorderMargin: null, // in pixels, null means taken from points radius\r\n markings: null, // array of ranges or fn: axes -> array of ranges\r\n markingsColor: \"#f4f4f4\",\r\n markingsLineWidth: 2,\r\n // interactive stuff\r\n clickable: false,\r\n hoverable: false,\r\n autoHighlight: true, // highlight in case mouse is near\r\n mouseActiveRadius: 10 // how far the mouse can be away to activate an item\r\n },\r\n interaction: {\r\n redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow\r\n },\r\n hooks: {}\r\n },\r\n surface = null, // the canvas for the plot itself\r\n overlay = null, // canvas for interactive stuff on top of plot\r\n eventHolder = null, // jQuery object that events should be bound to\r\n ctx = null, octx = null,\r\n xaxes = [], yaxes = [],\r\n plotOffset = { left: 0, right: 0, top: 0, bottom: 0},\r\n plotWidth = 0, plotHeight = 0,\r\n hooks = {\r\n processOptions: [],\r\n processRawData: [],\r\n processDatapoints: [],\r\n processOffset: [],\r\n drawBackground: [],\r\n drawSeries: [],\r\n draw: [],\r\n bindEvents: [],\r\n drawOverlay: [],\r\n shutdown: []\r\n },\r\n plot = this;\r\n\r\n // public functions\r\n plot.setData = setData;\r\n plot.setupGrid = setupGrid;\r\n plot.draw = draw;\r\n plot.getPlaceholder = function() { return placeholder; };\r\n plot.getCanvas = function() { return surface.element; };\r\n plot.getPlotOffset = function() { return plotOffset; };\r\n plot.width = function () { return plotWidth; };\r\n plot.height = function () { return plotHeight; };\r\n plot.offset = function () {\r\n var o = eventHolder.offset();\r\n o.left += plotOffset.left;\r\n o.top += plotOffset.top;\r\n return o;\r\n };\r\n plot.getData = function () { return series; };\r\n plot.getAxes = function () {\r\n var res = {}, i;\r\n $.each(xaxes.concat(yaxes), function (_, axis) {\r\n if (axis)\r\n res[axis.direction + (axis.n != 1 ? axis.n : \"\") + \"axis\"] = axis;\r\n });\r\n return res;\r\n };\r\n plot.getXAxes = function () { return xaxes; };\r\n plot.getYAxes = function () { return yaxes; };\r\n plot.c2p = canvasToAxisCoords;\r\n plot.p2c = axisToCanvasCoords;\r\n plot.getOptions = function () { return options; };\r\n plot.highlight = highlight;\r\n plot.unhighlight = unhighlight;\r\n plot.triggerRedrawOverlay = triggerRedrawOverlay;\r\n plot.pointOffset = function(point) {\r\n return {\r\n left: parseInt(xaxes[axisNumber(point, \"x\") - 1].p2c(+point.x) + plotOffset.left, 10),\r\n top: parseInt(yaxes[axisNumber(point, \"y\") - 1].p2c(+point.y) + plotOffset.top, 10)\r\n };\r\n };\r\n plot.shutdown = shutdown;\r\n plot.destroy = function () {\r\n shutdown();\r\n placeholder.removeData(\"plot\").empty();\r\n\r\n series = [];\r\n options = null;\r\n surface = null;\r\n overlay = null;\r\n eventHolder = null;\r\n ctx = null;\r\n octx = null;\r\n xaxes = [];\r\n yaxes = [];\r\n hooks = null;\r\n highlights = [];\r\n plot = null;\r\n };\r\n plot.resize = function () {\r\n \tvar width = placeholder.width(),\r\n \t\theight = placeholder.height();\r\n surface.resize(width, height);\r\n overlay.resize(width, height);\r\n };\r\n\r\n // public attributes\r\n plot.hooks = hooks;\r\n\r\n // initialize\r\n initPlugins(plot);\r\n parseOptions(options_);\r\n setupCanvases();\r\n setData(data_);\r\n setupGrid();\r\n draw();\r\n bindEvents();\r\n\r\n\r\n function executeHooks(hook, args) {\r\n args = [plot].concat(args);\r\n for (var i = 0; i < hook.length; ++i)\r\n hook[i].apply(this, args);\r\n }\r\n\r\n function initPlugins() {\r\n\r\n // References to key classes, allowing plugins to modify them\r\n\r\n var classes = {\r\n Canvas: Canvas\r\n };\r\n\r\n for (var i = 0; i < plugins.length; ++i) {\r\n var p = plugins[i];\r\n p.init(plot, classes);\r\n if (p.options)\r\n $.extend(true, options, p.options);\r\n }\r\n }\r\n\r\n function parseOptions(opts) {\r\n\r\n $.extend(true, options, opts);\r\n\r\n // $.extend merges arrays, rather than replacing them. When less\r\n // colors are provided than the size of the default palette, we\r\n // end up with those colors plus the remaining defaults, which is\r\n // not expected behavior; avoid it by replacing them here.\r\n\r\n if (opts && opts.colors) {\r\n \toptions.colors = opts.colors;\r\n }\r\n\r\n if (options.xaxis.color == null)\r\n options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\r\n if (options.yaxis.color == null)\r\n options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\r\n\r\n if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility\r\n options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;\r\n if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility\r\n options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;\r\n\r\n if (options.grid.borderColor == null)\r\n options.grid.borderColor = options.grid.color;\r\n if (options.grid.tickColor == null)\r\n options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();\r\n\r\n // Fill in defaults for axis options, including any unspecified\r\n // font-spec fields, if a font-spec was provided.\r\n\r\n // If no x/y axis options were provided, create one of each anyway,\r\n // since the rest of the code assumes that they exist.\r\n\r\n var i, axisOptions, axisCount,\r\n fontSize = placeholder.css(\"font-size\"),\r\n fontSizeDefault = fontSize ? +fontSize.replace(\"px\", \"\") : 13,\r\n fontDefaults = {\r\n style: placeholder.css(\"font-style\"),\r\n size: Math.round(0.8 * fontSizeDefault),\r\n variant: placeholder.css(\"font-variant\"),\r\n weight: placeholder.css(\"font-weight\"),\r\n family: placeholder.css(\"font-family\")\r\n };\r\n\r\n axisCount = options.xaxes.length || 1;\r\n for (i = 0; i < axisCount; ++i) {\r\n\r\n axisOptions = options.xaxes[i];\r\n if (axisOptions && !axisOptions.tickColor) {\r\n axisOptions.tickColor = axisOptions.color;\r\n }\r\n\r\n axisOptions = $.extend(true, {}, options.xaxis, axisOptions);\r\n options.xaxes[i] = axisOptions;\r\n\r\n if (axisOptions.font) {\r\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\r\n if (!axisOptions.font.color) {\r\n axisOptions.font.color = axisOptions.color;\r\n }\r\n if (!axisOptions.font.lineHeight) {\r\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\r\n }\r\n }\r\n }\r\n\r\n axisCount = options.yaxes.length || 1;\r\n for (i = 0; i < axisCount; ++i) {\r\n\r\n axisOptions = options.yaxes[i];\r\n if (axisOptions && !axisOptions.tickColor) {\r\n axisOptions.tickColor = axisOptions.color;\r\n }\r\n\r\n axisOptions = $.extend(true, {}, options.yaxis, axisOptions);\r\n options.yaxes[i] = axisOptions;\r\n\r\n if (axisOptions.font) {\r\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\r\n if (!axisOptions.font.color) {\r\n axisOptions.font.color = axisOptions.color;\r\n }\r\n if (!axisOptions.font.lineHeight) {\r\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\r\n }\r\n }\r\n }\r\n\r\n // backwards compatibility, to be removed in future\r\n if (options.xaxis.noTicks && options.xaxis.ticks == null)\r\n options.xaxis.ticks = options.xaxis.noTicks;\r\n if (options.yaxis.noTicks && options.yaxis.ticks == null)\r\n options.yaxis.ticks = options.yaxis.noTicks;\r\n if (options.x2axis) {\r\n options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);\r\n options.xaxes[1].position = \"top\";\r\n // Override the inherit to allow the axis to auto-scale\r\n if (options.x2axis.min == null) {\r\n options.xaxes[1].min = null;\r\n }\r\n if (options.x2axis.max == null) {\r\n options.xaxes[1].max = null;\r\n }\r\n }\r\n if (options.y2axis) {\r\n options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);\r\n options.yaxes[1].position = \"right\";\r\n // Override the inherit to allow the axis to auto-scale\r\n if (options.y2axis.min == null) {\r\n options.yaxes[1].min = null;\r\n }\r\n if (options.y2axis.max == null) {\r\n options.yaxes[1].max = null;\r\n }\r\n }\r\n if (options.grid.coloredAreas)\r\n options.grid.markings = options.grid.coloredAreas;\r\n if (options.grid.coloredAreasColor)\r\n options.grid.markingsColor = options.grid.coloredAreasColor;\r\n if (options.lines)\r\n $.extend(true, options.series.lines, options.lines);\r\n if (options.points)\r\n $.extend(true, options.series.points, options.points);\r\n if (options.bars)\r\n $.extend(true, options.series.bars, options.bars);\r\n if (options.shadowSize != null)\r\n options.series.shadowSize = options.shadowSize;\r\n if (options.highlightColor != null)\r\n options.series.highlightColor = options.highlightColor;\r\n\r\n // save options on axes for future reference\r\n for (i = 0; i < options.xaxes.length; ++i)\r\n getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];\r\n for (i = 0; i < options.yaxes.length; ++i)\r\n getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];\r\n\r\n // add hooks from options\r\n for (var n in hooks)\r\n if (options.hooks[n] && options.hooks[n].length)\r\n hooks[n] = hooks[n].concat(options.hooks[n]);\r\n\r\n executeHooks(hooks.processOptions, [options]);\r\n }\r\n\r\n function setData(d) {\r\n series = parseData(d);\r\n fillInSeriesOptions();\r\n processData();\r\n }\r\n\r\n function parseData(d) {\r\n var res = [];\r\n for (var i = 0; i < d.length; ++i) {\r\n var s = $.extend(true, {}, options.series);\r\n\r\n if (d[i].data != null) {\r\n s.data = d[i].data; // move the data instead of deep-copy\r\n delete d[i].data;\r\n\r\n $.extend(true, s, d[i]);\r\n\r\n d[i].data = s.data;\r\n }\r\n else\r\n s.data = d[i];\r\n res.push(s);\r\n }\r\n\r\n return res;\r\n }\r\n\r\n function axisNumber(obj, coord) {\r\n var a = obj[coord + \"axis\"];\r\n if (typeof a == \"object\") // if we got a real axis, extract number\r\n a = a.n;\r\n if (typeof a != \"number\")\r\n a = 1; // default to first axis\r\n return a;\r\n }\r\n\r\n function allAxes() {\r\n // return flat array without annoying null entries\r\n return $.grep(xaxes.concat(yaxes), function (a) { return a; });\r\n }\r\n\r\n function canvasToAxisCoords(pos) {\r\n // return an object with x/y corresponding to all used axes\r\n var res = {}, i, axis;\r\n for (i = 0; i < xaxes.length; ++i) {\r\n axis = xaxes[i];\r\n if (axis && axis.used)\r\n res[\"x\" + axis.n] = axis.c2p(pos.left);\r\n }\r\n\r\n for (i = 0; i < yaxes.length; ++i) {\r\n axis = yaxes[i];\r\n if (axis && axis.used)\r\n res[\"y\" + axis.n] = axis.c2p(pos.top);\r\n }\r\n\r\n if (res.x1 !== undefined)\r\n res.x = res.x1;\r\n if (res.y1 !== undefined)\r\n res.y = res.y1;\r\n\r\n return res;\r\n }\r\n\r\n function axisToCanvasCoords(pos) {\r\n // get canvas coords from the first pair of x/y found in pos\r\n var res = {}, i, axis, key;\r\n\r\n for (i = 0; i < xaxes.length; ++i) {\r\n axis = xaxes[i];\r\n if (axis && axis.used) {\r\n key = \"x\" + axis.n;\r\n if (pos[key] == null && axis.n == 1)\r\n key = \"x\";\r\n\r\n if (pos[key] != null) {\r\n res.left = axis.p2c(pos[key]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n for (i = 0; i < yaxes.length; ++i) {\r\n axis = yaxes[i];\r\n if (axis && axis.used) {\r\n key = \"y\" + axis.n;\r\n if (pos[key] == null && axis.n == 1)\r\n key = \"y\";\r\n\r\n if (pos[key] != null) {\r\n res.top = axis.p2c(pos[key]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return res;\r\n }\r\n\r\n function getOrCreateAxis(axes, number) {\r\n if (!axes[number - 1])\r\n axes[number - 1] = {\r\n n: number, // save the number for future reference\r\n direction: axes == xaxes ? \"x\" : \"y\",\r\n options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)\r\n };\r\n\r\n return axes[number - 1];\r\n }\r\n\r\n function fillInSeriesOptions() {\r\n\r\n var neededColors = series.length, maxIndex = -1, i;\r\n\r\n // Subtract the number of series that already have fixed colors or\r\n // color indexes from the number that we still need to generate.\r\n\r\n for (i = 0; i < series.length; ++i) {\r\n var sc = series[i].color;\r\n if (sc != null) {\r\n neededColors--;\r\n if (typeof sc == \"number\" && sc > maxIndex) {\r\n maxIndex = sc;\r\n }\r\n }\r\n }\r\n\r\n // If any of the series have fixed color indexes, then we need to\r\n // generate at least as many colors as the highest index.\r\n\r\n if (neededColors <= maxIndex) {\r\n neededColors = maxIndex + 1;\r\n }\r\n\r\n // Generate all the colors, using first the option colors and then\r\n // variations on those colors once they're exhausted.\r\n\r\n var c, colors = [], colorPool = options.colors,\r\n colorPoolSize = colorPool.length, variation = 0;\r\n\r\n for (i = 0; i < neededColors; i++) {\r\n\r\n c = $.color.parse(colorPool[i % colorPoolSize] || \"#666\");\r\n\r\n // Each time we exhaust the colors in the pool we adjust\r\n // a scaling factor used to produce more variations on\r\n // those colors. The factor alternates negative/positive\r\n // to produce lighter/darker colors.\r\n\r\n // Reset the variation after every few cycles, or else\r\n // it will end up producing only white or black colors.\r\n\r\n if (i % colorPoolSize == 0 && i) {\r\n if (variation >= 0) {\r\n if (variation < 0.5) {\r\n variation = -variation - 0.2;\r\n } else variation = 0;\r\n } else variation = -variation;\r\n }\r\n\r\n colors[i] = c.scale('rgb', 1 + variation);\r\n }\r\n\r\n // Finalize the series options, filling in their colors\r\n\r\n var colori = 0, s;\r\n for (i = 0; i < series.length; ++i) {\r\n s = series[i];\r\n\r\n // assign colors\r\n if (s.color == null) {\r\n s.color = colors[colori].toString();\r\n ++colori;\r\n }\r\n else if (typeof s.color == \"number\")\r\n s.color = colors[s.color].toString();\r\n\r\n // turn on lines automatically in case nothing is set\r\n if (s.lines.show == null) {\r\n var v, show = true;\r\n for (v in s)\r\n if (s[v] && s[v].show) {\r\n show = false;\r\n break;\r\n }\r\n if (show)\r\n s.lines.show = true;\r\n }\r\n\r\n // If nothing was provided for lines.zero, default it to match\r\n // lines.fill, since areas by default should extend to zero.\r\n\r\n if (s.lines.zero == null) {\r\n s.lines.zero = !!s.lines.fill;\r\n }\r\n\r\n // setup axes\r\n s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, \"x\"));\r\n s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, \"y\"));\r\n }\r\n }\r\n\r\n function processData() {\r\n var topSentry = Number.POSITIVE_INFINITY,\r\n bottomSentry = Number.NEGATIVE_INFINITY,\r\n fakeInfinity = Number.MAX_VALUE,\r\n i, j, k, m, length,\r\n s, points, ps, x, y, axis, val, f, p,\r\n data, format;\r\n\r\n function updateAxis(axis, min, max) {\r\n if (min < axis.datamin && min != -fakeInfinity)\r\n axis.datamin = min;\r\n if (max > axis.datamax && max != fakeInfinity)\r\n axis.datamax = max;\r\n }\r\n\r\n $.each(allAxes(), function (_, axis) {\r\n // init axis\r\n axis.datamin = topSentry;\r\n axis.datamax = bottomSentry;\r\n axis.used = false;\r\n });\r\n\r\n for (i = 0; i < series.length; ++i) {\r\n s = series[i];\r\n s.datapoints = { points: [] };\r\n\r\n executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);\r\n }\r\n\r\n // first pass: clean and copy data\r\n for (i = 0; i < series.length; ++i) {\r\n s = series[i];\r\n\r\n data = s.data;\r\n format = s.datapoints.format;\r\n\r\n if (!format) {\r\n format = [];\r\n // find out how to copy\r\n format.push({ x: true, number: true, required: true });\r\n format.push({ y: true, number: true, required: true });\r\n\r\n if (s.bars.show || (s.lines.show && s.lines.fill)) {\r\n var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));\r\n format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });\r\n if (s.bars.horizontal) {\r\n delete format[format.length - 1].y;\r\n format[format.length - 1].x = true;\r\n }\r\n }\r\n\r\n s.datapoints.format = format;\r\n }\r\n\r\n if (s.datapoints.pointsize != null)\r\n continue; // already filled in\r\n\r\n s.datapoints.pointsize = format.length;\r\n\r\n ps = s.datapoints.pointsize;\r\n points = s.datapoints.points;\r\n\r\n var insertSteps = s.lines.show && s.lines.steps;\r\n s.xaxis.used = s.yaxis.used = true;\r\n\r\n for (j = k = 0; j < data.length; ++j, k += ps) {\r\n p = data[j];\r\n\r\n var nullify = p == null;\r\n if (!nullify) {\r\n for (m = 0; m < ps; ++m) {\r\n val = p[m];\r\n f = format[m];\r\n\r\n if (f) {\r\n if (f.number && val != null) {\r\n val = +val; // convert to number\r\n if (isNaN(val))\r\n val = null;\r\n else if (val == Infinity)\r\n val = fakeInfinity;\r\n else if (val == -Infinity)\r\n val = -fakeInfinity;\r\n }\r\n\r\n if (val == null) {\r\n if (f.required)\r\n nullify = true;\r\n\r\n if (f.defaultValue != null)\r\n val = f.defaultValue;\r\n }\r\n }\r\n\r\n points[k + m] = val;\r\n }\r\n }\r\n\r\n if (nullify) {\r\n for (m = 0; m < ps; ++m) {\r\n val = points[k + m];\r\n if (val != null) {\r\n f = format[m];\r\n // extract min/max info\r\n if (f.autoscale !== false) {\r\n if (f.x) {\r\n updateAxis(s.xaxis, val, val);\r\n }\r\n if (f.y) {\r\n updateAxis(s.yaxis, val, val);\r\n }\r\n }\r\n }\r\n points[k + m] = null;\r\n }\r\n }\r\n else {\r\n // a little bit of line specific stuff that\r\n // perhaps shouldn't be here, but lacking\r\n // better means...\r\n if (insertSteps && k > 0\r\n && points[k - ps] != null\r\n && points[k - ps] != points[k]\r\n && points[k - ps + 1] != points[k + 1]) {\r\n // copy the point to make room for a middle point\r\n for (m = 0; m < ps; ++m)\r\n points[k + ps + m] = points[k + m];\r\n\r\n // middle point has same y\r\n points[k + 1] = points[k - ps + 1];\r\n\r\n // we've added a point, better reflect that\r\n k += ps;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // give the hooks a chance to run\r\n for (i = 0; i < series.length; ++i) {\r\n s = series[i];\r\n\r\n executeHooks(hooks.processDatapoints, [ s, s.datapoints]);\r\n }\r\n\r\n // second pass: find datamax/datamin for auto-scaling\r\n for (i = 0; i < series.length; ++i) {\r\n s = series[i];\r\n points = s.datapoints.points;\r\n ps = s.datapoints.pointsize;\r\n format = s.datapoints.format;\r\n\r\n var xmin = topSentry, ymin = topSentry,\r\n xmax = bottomSentry, ymax = bottomSentry;\r\n\r\n for (j = 0; j < points.length; j += ps) {\r\n if (points[j] == null)\r\n continue;\r\n\r\n for (m = 0; m < ps; ++m) {\r\n val = points[j + m];\r\n f = format[m];\r\n if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)\r\n continue;\r\n\r\n if (f.x) {\r\n if (val < xmin)\r\n xmin = val;\r\n if (val > xmax)\r\n xmax = val;\r\n }\r\n if (f.y) {\r\n if (val < ymin)\r\n ymin = val;\r\n if (val > ymax)\r\n ymax = val;\r\n }\r\n }\r\n }\r\n\r\n if (s.bars.show) {\r\n // make sure we got room for the bar on the dancing floor\r\n var delta;\r\n\r\n switch (s.bars.align) {\r\n case \"left\":\r\n delta = 0;\r\n break;\r\n case \"right\":\r\n delta = -s.bars.barWidth;\r\n break;\r\n default:\r\n delta = -s.bars.barWidth / 2;\r\n }\r\n\r\n if (s.bars.horizontal) {\r\n ymin += delta;\r\n ymax += delta + s.bars.barWidth;\r\n }\r\n else {\r\n xmin += delta;\r\n xmax += delta + s.bars.barWidth;\r\n }\r\n }\r\n\r\n updateAxis(s.xaxis, xmin, xmax);\r\n updateAxis(s.yaxis, ymin, ymax);\r\n }\r\n\r\n $.each(allAxes(), function (_, axis) {\r\n if (axis.datamin == topSentry)\r\n axis.datamin = null;\r\n if (axis.datamax == bottomSentry)\r\n axis.datamax = null;\r\n });\r\n }\r\n\r\n function setupCanvases() {\r\n\r\n // Make sure the placeholder is clear of everything except canvases\r\n // from a previous plot in this container that we'll try to re-use.\r\n\r\n placeholder.css(\"padding\", 0) // padding messes up the positioning\r\n .children().filter(function(){\r\n return !$(this).hasClass(\"flot-overlay\") && !$(this).hasClass('flot-base');\r\n }).remove();\r\n\r\n if (placeholder.css(\"position\") == 'static')\r\n placeholder.css(\"position\", \"relative\"); // for positioning labels and overlay\r\n\r\n surface = new Canvas(\"flot-base\", placeholder);\r\n overlay = new Canvas(\"flot-overlay\", placeholder); // overlay canvas for interactive features\r\n\r\n ctx = surface.context;\r\n octx = overlay.context;\r\n\r\n // define which element we're listening for events on\r\n eventHolder = $(overlay.element).unbind();\r\n\r\n // If we're re-using a plot object, shut down the old one\r\n\r\n var existing = placeholder.data(\"plot\");\r\n\r\n if (existing) {\r\n existing.shutdown();\r\n overlay.clear();\r\n }\r\n\r\n // save in case we get replotted\r\n placeholder.data(\"plot\", plot);\r\n }\r\n\r\n function bindEvents() {\r\n // bind events\r\n if (options.grid.hoverable) {\r\n eventHolder.mousemove(onMouseMove);\r\n\r\n // Use bind, rather than .mouseleave, because we officially\r\n // still support jQuery 1.2.6, which doesn't define a shortcut\r\n // for mouseenter or mouseleave. This was a bug/oversight that\r\n // was fixed somewhere around 1.3.x. We can return to using\r\n // .mouseleave when we drop support for 1.2.6.\r\n\r\n eventHolder.bind(\"mouseleave\", onMouseLeave);\r\n }\r\n\r\n if (options.grid.clickable)\r\n eventHolder.click(onClick);\r\n\r\n executeHooks(hooks.bindEvents, [eventHolder]);\r\n }\r\n\r\n function shutdown() {\r\n if (redrawTimeout)\r\n clearTimeout(redrawTimeout);\r\n\r\n eventHolder.unbind(\"mousemove\", onMouseMove);\r\n eventHolder.unbind(\"mouseleave\", onMouseLeave);\r\n eventHolder.unbind(\"click\", onClick);\r\n\r\n executeHooks(hooks.shutdown, [eventHolder]);\r\n }\r\n\r\n function setTransformationHelpers(axis) {\r\n // set helper functions on the axis, assumes plot area\r\n // has been computed already\r\n\r\n function identity(x) { return x; }\r\n\r\n var s, m, t = axis.options.transform || identity,\r\n it = axis.options.inverseTransform;\r\n\r\n // precompute how much the axis is scaling a point\r\n // in canvas space\r\n if (axis.direction == \"x\") {\r\n s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));\r\n m = Math.min(t(axis.max), t(axis.min));\r\n }\r\n else {\r\n s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));\r\n s = -s;\r\n m = Math.max(t(axis.max), t(axis.min));\r\n }\r\n\r\n // data point to canvas coordinate\r\n if (t == identity) // slight optimization\r\n axis.p2c = function (p) { return (p - m) * s; };\r\n else\r\n axis.p2c = function (p) { return (t(p) - m) * s; };\r\n // canvas coordinate to data point\r\n if (!it)\r\n axis.c2p = function (c) { return m + c / s; };\r\n else\r\n axis.c2p = function (c) { return it(m + c / s); };\r\n }\r\n\r\n function measureTickLabels(axis) {\r\n\r\n var opts = axis.options,\r\n ticks = axis.ticks || [],\r\n labelWidth = opts.labelWidth || 0,\r\n labelHeight = opts.labelHeight || 0,\r\n maxWidth = labelWidth || (axis.direction == \"x\" ? Math.floor(surface.width / (ticks.length || 1)) : null),\r\n legacyStyles = axis.direction + \"Axis \" + axis.direction + axis.n + \"Axis\",\r\n layer = \"flot-\" + axis.direction + \"-axis flot-\" + axis.direction + axis.n + \"-axis \" + legacyStyles,\r\n font = opts.font || \"flot-tick-label tickLabel\";\r\n\r\n for (var i = 0; i < ticks.length; ++i) {\r\n\r\n var t = ticks[i];\r\n\r\n if (!t.label)\r\n continue;\r\n\r\n var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);\r\n\r\n labelWidth = Math.max(labelWidth, info.width);\r\n labelHeight = Math.max(labelHeight, info.height);\r\n }\r\n\r\n axis.labelWidth = opts.labelWidth || labelWidth;\r\n axis.labelHeight = opts.labelHeight || labelHeight;\r\n }\r\n\r\n function allocateAxisBoxFirstPhase(axis) {\r\n // find the bounding box of the axis by looking at label\r\n // widths/heights and ticks, make room by diminishing the\r\n // plotOffset; this first phase only looks at one\r\n // dimension per axis, the other dimension depends on the\r\n // other axes so will have to wait\r\n\r\n var lw = axis.labelWidth,\r\n lh = axis.labelHeight,\r\n pos = axis.options.position,\r\n isXAxis = axis.direction === \"x\",\r\n tickLength = axis.options.tickLength,\r\n axisMargin = options.grid.axisMargin,\r\n padding = options.grid.labelMargin,\r\n innermost = true,\r\n outermost = true,\r\n first = true,\r\n found = false;\r\n\r\n // Determine the axis's position in its direction and on its side\r\n\r\n $.each(isXAxis ? xaxes : yaxes, function(i, a) {\r\n if (a && (a.show || a.reserveSpace)) {\r\n if (a === axis) {\r\n found = true;\r\n } else if (a.options.position === pos) {\r\n if (found) {\r\n outermost = false;\r\n } else {\r\n innermost = false;\r\n }\r\n }\r\n if (!found) {\r\n first = false;\r\n }\r\n }\r\n });\r\n\r\n // The outermost axis on each side has no margin\r\n\r\n if (outermost) {\r\n axisMargin = 0;\r\n }\r\n\r\n // The ticks for the first axis in each direction stretch across\r\n\r\n if (tickLength == null) {\r\n tickLength = first ? \"full\" : 5;\r\n }\r\n\r\n if (!isNaN(+tickLength))\r\n padding += +tickLength;\r\n\r\n if (isXAxis) {\r\n lh += padding;\r\n\r\n if (pos == \"bottom\") {\r\n plotOffset.bottom += lh + axisMargin;\r\n axis.box = { top: surface.height - plotOffset.bottom, height: lh };\r\n }\r\n else {\r\n axis.box = { top: plotOffset.top + axisMargin, height: lh };\r\n plotOffset.top += lh + axisMargin;\r\n }\r\n }\r\n else {\r\n lw += padding;\r\n\r\n if (pos == \"left\") {\r\n axis.box = { left: plotOffset.left + axisMargin, width: lw };\r\n plotOffset.left += lw + axisMargin;\r\n }\r\n else {\r\n plotOffset.right += lw + axisMargin;\r\n axis.box = { left: surface.width - plotOffset.right, width: lw };\r\n }\r\n }\r\n\r\n // save for future reference\r\n axis.position = pos;\r\n axis.tickLength = tickLength;\r\n axis.box.padding = padding;\r\n axis.innermost = innermost;\r\n }\r\n\r\n function allocateAxisBoxSecondPhase(axis) {\r\n // now that all axis boxes have been placed in one\r\n // dimension, we can set the remaining dimension coordinates\r\n if (axis.direction == \"x\") {\r\n axis.box.left = plotOffset.left - axis.labelWidth / 2;\r\n axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;\r\n }\r\n else {\r\n axis.box.top = plotOffset.top - axis.labelHeight / 2;\r\n axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;\r\n }\r\n }\r\n\r\n function adjustLayoutForThingsStickingOut() {\r\n // possibly adjust plot offset to ensure everything stays\r\n // inside the canvas and isn't clipped off\r\n\r\n var minMargin = options.grid.minBorderMargin,\r\n axis, i;\r\n\r\n // check stuff from the plot (FIXME: this should just read\r\n // a value from the series, otherwise it's impossible to\r\n // customize)\r\n if (minMargin == null) {\r\n minMargin = 0;\r\n for (i = 0; i < series.length; ++i)\r\n minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));\r\n }\r\n\r\n var margins = {\r\n left: minMargin,\r\n right: minMargin,\r\n top: minMargin,\r\n bottom: minMargin\r\n };\r\n\r\n // check axis labels, note we don't check the actual\r\n // labels but instead use the overall width/height to not\r\n // jump as much around with replots\r\n $.each(allAxes(), function (_, axis) {\r\n if (axis.reserveSpace && axis.ticks && axis.ticks.length) {\r\n if (axis.direction === \"x\") {\r\n margins.left = Math.max(margins.left, axis.labelWidth / 2);\r\n margins.right = Math.max(margins.right, axis.labelWidth / 2);\r\n } else {\r\n margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);\r\n margins.top = Math.max(margins.top, axis.labelHeight / 2);\r\n }\r\n }\r\n });\r\n\r\n plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));\r\n plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));\r\n plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));\r\n plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));\r\n }\r\n\r\n function setupGrid() {\r\n var i, axes = allAxes(), showGrid = options.grid.show;\r\n\r\n // Initialize the plot's offset from the edge of the canvas\r\n\r\n for (var a in plotOffset) {\r\n var margin = options.grid.margin || 0;\r\n plotOffset[a] = typeof margin == \"number\" ? margin : margin[a] || 0;\r\n }\r\n\r\n executeHooks(hooks.processOffset, [plotOffset]);\r\n\r\n // If the grid is visible, add its border width to the offset\r\n\r\n for (var a in plotOffset) {\r\n if(typeof(options.grid.borderWidth) == \"object\") {\r\n plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;\r\n }\r\n else {\r\n plotOffset[a] += showGrid ? options.grid.borderWidth : 0;\r\n }\r\n }\r\n\r\n $.each(axes, function (_, axis) {\r\n var axisOpts = axis.options;\r\n axis.show = axisOpts.show == null ? axis.used : axisOpts.show;\r\n axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;\r\n setRange(axis);\r\n });\r\n\r\n if (showGrid) {\r\n\r\n var allocatedAxes = $.grep(axes, function (axis) {\r\n return axis.show || axis.reserveSpace;\r\n });\r\n\r\n $.each(allocatedAxes, function (_, axis) {\r\n // make the ticks\r\n setupTickGeneration(axis);\r\n setTicks(axis);\r\n snapRangeToTicks(axis, axis.ticks);\r\n // find labelWidth/Height for axis\r\n measureTickLabels(axis);\r\n });\r\n\r\n // with all dimensions calculated, we can compute the\r\n // axis bounding boxes, start from the outside\r\n // (reverse order)\r\n for (i = allocatedAxes.length - 1; i >= 0; --i)\r\n allocateAxisBoxFirstPhase(allocatedAxes[i]);\r\n\r\n // make sure we've got enough space for things that\r\n // might stick out\r\n adjustLayoutForThingsStickingOut();\r\n\r\n $.each(allocatedAxes, function (_, axis) {\r\n allocateAxisBoxSecondPhase(axis);\r\n });\r\n }\r\n\r\n plotWidth = surface.width - plotOffset.left - plotOffset.right;\r\n plotHeight = surface.height - plotOffset.bottom - plotOffset.top;\r\n\r\n // now we got the proper plot dimensions, we can compute the scaling\r\n $.each(axes, function (_, axis) {\r\n setTransformationHelpers(axis);\r\n });\r\n\r\n if (showGrid) {\r\n drawAxisLabels();\r\n }\r\n\r\n insertLegend();\r\n }\r\n\r\n function setRange(axis) {\r\n var opts = axis.options,\r\n min = +(opts.min != null ? opts.min : axis.datamin),\r\n max = +(opts.max != null ? opts.max : axis.datamax),\r\n delta = max - min;\r\n\r\n if (delta == 0.0) {\r\n // degenerate case\r\n var widen = max == 0 ? 1 : 0.01;\r\n\r\n if (opts.min == null)\r\n min -= widen;\r\n // always widen max if we couldn't widen min to ensure we\r\n // don't fall into min == max which doesn't work\r\n if (opts.max == null || opts.min != null)\r\n max += widen;\r\n }\r\n else {\r\n // consider autoscaling\r\n var margin = opts.autoscaleMargin;\r\n if (margin != null) {\r\n if (opts.min == null) {\r\n min -= delta * margin;\r\n // make sure we don't go below zero if all values\r\n // are positive\r\n if (min < 0 && axis.datamin != null && axis.datamin >= 0)\r\n min = 0;\r\n }\r\n if (opts.max == null) {\r\n max += delta * margin;\r\n if (max > 0 && axis.datamax != null && axis.datamax <= 0)\r\n max = 0;\r\n }\r\n }\r\n }\r\n axis.min = min;\r\n axis.max = max;\r\n }\r\n\r\n function setupTickGeneration(axis) {\r\n var opts = axis.options;\r\n\r\n // estimate number of ticks\r\n var noTicks;\r\n if (typeof opts.ticks == \"number\" && opts.ticks > 0)\r\n noTicks = opts.ticks;\r\n else\r\n // heuristic based on the model a*sqrt(x) fitted to\r\n // some data points that seemed reasonable\r\n noTicks = 0.3 * Math.sqrt(axis.direction == \"x\" ? surface.width : surface.height);\r\n\r\n var delta = (axis.max - axis.min) / noTicks,\r\n dec = -Math.floor(Math.log(delta) / Math.LN10),\r\n maxDec = opts.tickDecimals;\r\n\r\n if (maxDec != null && dec > maxDec) {\r\n dec = maxDec;\r\n }\r\n\r\n var magn = Math.pow(10, -dec),\r\n norm = delta / magn, // norm is between 1.0 and 10.0\r\n size;\r\n\r\n if (norm < 1.5) {\r\n size = 1;\r\n } else if (norm < 3) {\r\n size = 2;\r\n // special case for 2.5, requires an extra decimal\r\n if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\r\n size = 2.5;\r\n ++dec;\r\n }\r\n } else if (norm < 7.5) {\r\n size = 5;\r\n } else {\r\n size = 10;\r\n }\r\n\r\n size *= magn;\r\n\r\n if (opts.minTickSize != null && size < opts.minTickSize) {\r\n size = opts.minTickSize;\r\n }\r\n\r\n axis.delta = delta;\r\n axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);\r\n axis.tickSize = opts.tickSize || size;\r\n\r\n // Time mode was moved to a plug-in in 0.8, and since so many people use it\r\n // we'll add an especially friendly reminder to make sure they included it.\r\n\r\n if (opts.mode == \"time\" && !axis.tickGenerator) {\r\n throw new Error(\"Time mode requires the flot.time plugin.\");\r\n }\r\n\r\n // Flot supports base-10 axes; any other mode else is handled by a plug-in,\r\n // like flot.time.js.\r\n\r\n if (!axis.tickGenerator) {\r\n\r\n axis.tickGenerator = function (axis) {\r\n\r\n var ticks = [],\r\n start = floorInBase(axis.min, axis.tickSize),\r\n i = 0,\r\n v = Number.NaN,\r\n prev;\r\n\r\n do {\r\n prev = v;\r\n v = start + i * axis.tickSize;\r\n ticks.push(v);\r\n ++i;\r\n } while (v < axis.max && v != prev);\r\n return ticks;\r\n };\r\n\r\n\t\t\t\taxis.tickFormatter = function (value, axis) {\r\n\r\n\t\t\t\t\tvar factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;\r\n\t\t\t\t\tvar formatted = \"\" + Math.round(value * factor) / factor;\r\n\r\n\t\t\t\t\t// If tickDecimals was specified, ensure that we have exactly that\r\n\t\t\t\t\t// much precision; otherwise default to the value's own precision.\r\n\r\n\t\t\t\t\tif (axis.tickDecimals != null) {\r\n\t\t\t\t\t\tvar decimal = formatted.indexOf(\".\");\r\n\t\t\t\t\t\tvar precision = decimal == -1 ? 0 : formatted.length - decimal - 1;\r\n\t\t\t\t\t\tif (precision < axis.tickDecimals) {\r\n\t\t\t\t\t\t\treturn (precision ? formatted : formatted + \".\") + (\"\" + factor).substr(1, axis.tickDecimals - precision);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n return formatted;\r\n };\r\n }\r\n\r\n if ($.isFunction(opts.tickFormatter))\r\n axis.tickFormatter = function (v, axis) { return \"\" + opts.tickFormatter(v, axis); };\r\n\r\n if (opts.alignTicksWithAxis != null) {\r\n var otherAxis = (axis.direction == \"x\" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];\r\n if (otherAxis && otherAxis.used && otherAxis != axis) {\r\n // consider snapping min/max to outermost nice ticks\r\n var niceTicks = axis.tickGenerator(axis);\r\n if (niceTicks.length > 0) {\r\n if (opts.min == null)\r\n axis.min = Math.min(axis.min, niceTicks[0]);\r\n if (opts.max == null && niceTicks.length > 1)\r\n axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);\r\n }\r\n\r\n axis.tickGenerator = function (axis) {\r\n // copy ticks, scaled to this axis\r\n var ticks = [], v, i;\r\n for (i = 0; i < otherAxis.ticks.length; ++i) {\r\n v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);\r\n v = axis.min + v * (axis.max - axis.min);\r\n ticks.push(v);\r\n }\r\n return ticks;\r\n };\r\n\r\n // we might need an extra decimal since forced\r\n // ticks don't necessarily fit naturally\r\n if (!axis.mode && opts.tickDecimals == null) {\r\n var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),\r\n ts = axis.tickGenerator(axis);\r\n\r\n // only proceed if the tick interval rounded\r\n // with an extra decimal doesn't give us a\r\n // zero at end\r\n if (!(ts.length > 1 && /\\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))\r\n axis.tickDecimals = extraDec;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function setTicks(axis) {\r\n var oticks = axis.options.ticks, ticks = [];\r\n if (oticks == null || (typeof oticks == \"number\" && oticks > 0))\r\n ticks = axis.tickGenerator(axis);\r\n else if (oticks) {\r\n if ($.isFunction(oticks))\r\n // generate the ticks\r\n ticks = oticks(axis);\r\n else\r\n ticks = oticks;\r\n }\r\n\r\n // clean up/labelify the supplied ticks, copy them over\r\n var i, v;\r\n axis.ticks = [];\r\n for (i = 0; i < ticks.length; ++i) {\r\n var label = null;\r\n var t = ticks[i];\r\n if (typeof t == \"object\") {\r\n v = +t[0];\r\n if (t.length > 1)\r\n label = t[1];\r\n }\r\n else\r\n v = +t;\r\n if (label == null)\r\n label = axis.tickFormatter(v, axis);\r\n if (!isNaN(v))\r\n axis.ticks.push({ v: v, label: label });\r\n }\r\n }\r\n\r\n function snapRangeToTicks(axis, ticks) {\r\n if (axis.options.autoscaleMargin && ticks.length > 0) {\r\n // snap to ticks\r\n if (axis.options.min == null)\r\n axis.min = Math.min(axis.min, ticks[0].v);\r\n if (axis.options.max == null && ticks.length > 1)\r\n axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);\r\n }\r\n }\r\n\r\n function draw() {\r\n\r\n surface.clear();\r\n\r\n executeHooks(hooks.drawBackground, [ctx]);\r\n\r\n var grid = options.grid;\r\n\r\n // draw background, if any\r\n if (grid.show && grid.backgroundColor)\r\n drawBackground();\r\n\r\n if (grid.show && !grid.aboveData) {\r\n drawGrid();\r\n }\r\n\r\n for (var i = 0; i < series.length; ++i) {\r\n executeHooks(hooks.drawSeries, [ctx, series[i]]);\r\n drawSeries(series[i]);\r\n }\r\n\r\n executeHooks(hooks.draw, [ctx]);\r\n\r\n if (grid.show && grid.aboveData) {\r\n drawGrid();\r\n }\r\n\r\n surface.render();\r\n\r\n // A draw implies that either the axes or data have changed, so we\r\n // should probably update the overlay highlights as well.\r\n\r\n triggerRedrawOverlay();\r\n }\r\n\r\n function extractRange(ranges, coord) {\r\n var axis, from, to, key, axes = allAxes();\r\n\r\n for (var i = 0; i < axes.length; ++i) {\r\n axis = axes[i];\r\n if (axis.direction == coord) {\r\n key = coord + axis.n + \"axis\";\r\n if (!ranges[key] && axis.n == 1)\r\n key = coord + \"axis\"; // support x1axis as xaxis\r\n if (ranges[key]) {\r\n from = ranges[key].from;\r\n to = ranges[key].to;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // backwards-compat stuff - to be removed in future\r\n if (!ranges[key]) {\r\n axis = coord == \"x\" ? xaxes[0] : yaxes[0];\r\n from = ranges[coord + \"1\"];\r\n to = ranges[coord + \"2\"];\r\n }\r\n\r\n // auto-reverse as an added bonus\r\n if (from != null && to != null && from > to) {\r\n var tmp = from;\r\n from = to;\r\n to = tmp;\r\n }\r\n\r\n return { from: from, to: to, axis: axis };\r\n }\r\n\r\n function drawBackground() {\r\n ctx.save();\r\n ctx.translate(plotOffset.left, plotOffset.top);\r\n\r\n ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, \"rgba(255, 255, 255, 0)\");\r\n ctx.fillRect(0, 0, plotWidth, plotHeight);\r\n ctx.restore();\r\n }\r\n\r\n function drawGrid() {\r\n var i, axes, bw, bc;\r\n\r\n ctx.save();\r\n ctx.translate(plotOffset.left, plotOffset.top);\r\n\r\n // draw markings\r\n var markings = options.grid.markings;\r\n if (markings) {\r\n if ($.isFunction(markings)) {\r\n axes = plot.getAxes();\r\n // xmin etc. is backwards compatibility, to be\r\n // removed in the future\r\n axes.xmin = axes.xaxis.min;\r\n axes.xmax = axes.xaxis.max;\r\n axes.ymin = axes.yaxis.min;\r\n axes.ymax = axes.yaxis.max;\r\n\r\n markings = markings(axes);\r\n }\r\n\r\n for (i = 0; i < markings.length; ++i) {\r\n var m = markings[i],\r\n xrange = extractRange(m, \"x\"),\r\n yrange = extractRange(m, \"y\");\r\n\r\n // fill in missing\r\n if (xrange.from == null)\r\n xrange.from = xrange.axis.min;\r\n if (xrange.to == null)\r\n xrange.to = xrange.axis.max;\r\n if (yrange.from == null)\r\n yrange.from = yrange.axis.min;\r\n if (yrange.to == null)\r\n yrange.to = yrange.axis.max;\r\n\r\n // clip\r\n if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||\r\n yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)\r\n continue;\r\n\r\n xrange.from = Math.max(xrange.from, xrange.axis.min);\r\n xrange.to = Math.min(xrange.to, xrange.axis.max);\r\n yrange.from = Math.max(yrange.from, yrange.axis.min);\r\n yrange.to = Math.min(yrange.to, yrange.axis.max);\r\n\r\n var xequal = xrange.from === xrange.to,\r\n yequal = yrange.from === yrange.to;\r\n\r\n if (xequal && yequal) {\r\n continue;\r\n }\r\n\r\n // then draw\r\n xrange.from = Math.floor(xrange.axis.p2c(xrange.from));\r\n xrange.to = Math.floor(xrange.axis.p2c(xrange.to));\r\n yrange.from = Math.floor(yrange.axis.p2c(yrange.from));\r\n yrange.to = Math.floor(yrange.axis.p2c(yrange.to));\r\n\r\n if (xequal || yequal) {\r\n var lineWidth = m.lineWidth || options.grid.markingsLineWidth,\r\n subPixel = lineWidth % 2 ? 0.5 : 0;\r\n ctx.beginPath();\r\n ctx.strokeStyle = m.color || options.grid.markingsColor;\r\n ctx.lineWidth = lineWidth;\r\n if (xequal) {\r\n ctx.moveTo(xrange.to + subPixel, yrange.from);\r\n ctx.lineTo(xrange.to + subPixel, yrange.to);\r\n } else {\r\n ctx.moveTo(xrange.from, yrange.to + subPixel);\r\n ctx.lineTo(xrange.to, yrange.to + subPixel); \r\n }\r\n ctx.stroke();\r\n } else {\r\n ctx.fillStyle = m.color || options.grid.markingsColor;\r\n ctx.fillRect(xrange.from, yrange.to,\r\n xrange.to - xrange.from,\r\n yrange.from - yrange.to);\r\n }\r\n }\r\n }\r\n\r\n // draw the ticks\r\n axes = allAxes();\r\n bw = options.grid.borderWidth;\r\n\r\n for (var j = 0; j < axes.length; ++j) {\r\n var axis = axes[j], box = axis.box,\r\n t = axis.tickLength, x, y, xoff, yoff;\r\n if (!axis.show || axis.ticks.length == 0)\r\n continue;\r\n\r\n ctx.lineWidth = 1;\r\n\r\n // find the edges\r\n if (axis.direction == \"x\") {\r\n x = 0;\r\n if (t == \"full\")\r\n y = (axis.position == \"top\" ? 0 : plotHeight);\r\n else\r\n y = box.top - plotOffset.top + (axis.position == \"top\" ? box.height : 0);\r\n }\r\n else {\r\n y = 0;\r\n if (t == \"full\")\r\n x = (axis.position == \"left\" ? 0 : plotWidth);\r\n else\r\n x = box.left - plotOffset.left + (axis.position == \"left\" ? box.width : 0);\r\n }\r\n\r\n // draw tick bar\r\n if (!axis.innermost) {\r\n ctx.strokeStyle = axis.options.color;\r\n ctx.beginPath();\r\n xoff = yoff = 0;\r\n if (axis.direction == \"x\")\r\n xoff = plotWidth + 1;\r\n else\r\n yoff = plotHeight + 1;\r\n\r\n if (ctx.lineWidth == 1) {\r\n if (axis.direction == \"x\") {\r\n y = Math.floor(y) + 0.5;\r\n } else {\r\n x = Math.floor(x) + 0.5;\r\n }\r\n }\r\n\r\n ctx.moveTo(x, y);\r\n ctx.lineTo(x + xoff, y + yoff);\r\n ctx.stroke();\r\n }\r\n\r\n // draw ticks\r\n\r\n ctx.strokeStyle = axis.options.tickColor;\r\n\r\n ctx.beginPath();\r\n for (i = 0; i < axis.ticks.length; ++i) {\r\n var v = axis.ticks[i].v;\r\n\r\n xoff = yoff = 0;\r\n\r\n if (isNaN(v) || v < axis.min || v > axis.max\r\n // skip those lying on the axes if we got a border\r\n || (t == \"full\"\r\n && ((typeof bw == \"object\" && bw[axis.position] > 0) || bw > 0)\r\n && (v == axis.min || v == axis.max)))\r\n continue;\r\n\r\n if (axis.direction == \"x\") {\r\n x = axis.p2c(v);\r\n yoff = t == \"full\" ? -plotHeight : t;\r\n\r\n if (axis.position == \"top\")\r\n yoff = -yoff;\r\n }\r\n else {\r\n y = axis.p2c(v);\r\n xoff = t == \"full\" ? -plotWidth : t;\r\n\r\n if (axis.position == \"left\")\r\n xoff = -xoff;\r\n }\r\n\r\n if (ctx.lineWidth == 1) {\r\n if (axis.direction == \"x\")\r\n x = Math.floor(x) + 0.5;\r\n else\r\n y = Math.floor(y) + 0.5;\r\n }\r\n\r\n ctx.moveTo(x, y);\r\n ctx.lineTo(x + xoff, y + yoff);\r\n }\r\n\r\n ctx.stroke();\r\n }\r\n\r\n\r\n // draw border\r\n if (bw) {\r\n // If either borderWidth or borderColor is an object, then draw the border\r\n // line by line instead of as one rectangle\r\n bc = options.grid.borderColor;\r\n if(typeof bw == \"object\" || typeof bc == \"object\") {\r\n if (typeof bw !== \"object\") {\r\n bw = {top: bw, right: bw, bottom: bw, left: bw};\r\n }\r\n if (typeof bc !== \"object\") {\r\n bc = {top: bc, right: bc, bottom: bc, left: bc};\r\n }\r\n\r\n if (bw.top > 0) {\r\n ctx.strokeStyle = bc.top;\r\n ctx.lineWidth = bw.top;\r\n ctx.beginPath();\r\n ctx.moveTo(0 - bw.left, 0 - bw.top/2);\r\n ctx.lineTo(plotWidth, 0 - bw.top/2);\r\n ctx.stroke();\r\n }\r\n\r\n if (bw.right > 0) {\r\n ctx.strokeStyle = bc.right;\r\n ctx.lineWidth = bw.right;\r\n ctx.beginPath();\r\n ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);\r\n ctx.lineTo(plotWidth + bw.right / 2, plotHeight);\r\n ctx.stroke();\r\n }\r\n\r\n if (bw.bottom > 0) {\r\n ctx.strokeStyle = bc.bottom;\r\n ctx.lineWidth = bw.bottom;\r\n ctx.beginPath();\r\n ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);\r\n ctx.lineTo(0, plotHeight + bw.bottom / 2);\r\n ctx.stroke();\r\n }\r\n\r\n if (bw.left > 0) {\r\n ctx.strokeStyle = bc.left;\r\n ctx.lineWidth = bw.left;\r\n ctx.beginPath();\r\n ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);\r\n ctx.lineTo(0- bw.left/2, 0);\r\n ctx.stroke();\r\n }\r\n }\r\n else {\r\n ctx.lineWidth = bw;\r\n ctx.strokeStyle = options.grid.borderColor;\r\n ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);\r\n }\r\n }\r\n\r\n ctx.restore();\r\n }\r\n\r\n function drawAxisLabels() {\r\n\r\n $.each(allAxes(), function (_, axis) {\r\n var box = axis.box,\r\n legacyStyles = axis.direction + \"Axis \" + axis.direction + axis.n + \"Axis\",\r\n layer = \"flot-\" + axis.direction + \"-axis flot-\" + axis.direction + axis.n + \"-axis \" + legacyStyles,\r\n font = axis.options.font || \"flot-tick-label tickLabel\",\r\n tick, x, y, halign, valign;\r\n\r\n // Remove text before checking for axis.show and ticks.length;\r\n // otherwise plugins, like flot-tickrotor, that draw their own\r\n // tick labels will end up with both theirs and the defaults.\r\n\r\n surface.removeText(layer);\r\n\r\n if (!axis.show || axis.ticks.length == 0)\r\n return;\r\n\r\n for (var i = 0; i < axis.ticks.length; ++i) {\r\n\r\n tick = axis.ticks[i];\r\n if (!tick.label || tick.v < axis.min || tick.v > axis.max)\r\n continue;\r\n\r\n if (axis.direction == \"x\") {\r\n halign = \"center\";\r\n x = plotOffset.left + axis.p2c(tick.v);\r\n if (axis.position == \"bottom\") {\r\n y = box.top + box.padding;\r\n } else {\r\n y = box.top + box.height - box.padding;\r\n valign = \"bottom\";\r\n }\r\n } else {\r\n valign = \"middle\";\r\n y = plotOffset.top + axis.p2c(tick.v);\r\n if (axis.position == \"left\") {\r\n x = box.left + box.width - box.padding;\r\n halign = \"right\";\r\n } else {\r\n x = box.left + box.padding;\r\n }\r\n }\r\n\r\n surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);\r\n }\r\n });\r\n }\r\n\r\n function drawSeries(series) {\r\n if (series.lines.show)\r\n drawSeriesLines(series);\r\n if (series.bars.show)\r\n drawSeriesBars(series);\r\n if (series.points.show)\r\n drawSeriesPoints(series);\r\n }\r\n\r\n function drawSeriesLines(series) {\r\n function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {\r\n var points = datapoints.points,\r\n ps = datapoints.pointsize,\r\n prevx = null, prevy = null;\r\n\r\n ctx.beginPath();\r\n for (var i = ps; i < points.length; i += ps) {\r\n var x1 = points[i - ps], y1 = points[i - ps + 1],\r\n x2 = points[i], y2 = points[i + 1];\r\n\r\n if (x1 == null || x2 == null)\r\n continue;\r\n\r\n // clip with ymin\r\n if (y1 <= y2 && y1 < axisy.min) {\r\n if (y2 < axisy.min)\r\n continue; // line segment is outside\r\n // compute new intersection point\r\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\r\n y1 = axisy.min;\r\n }\r\n else if (y2 <= y1 && y2 < axisy.min) {\r\n if (y1 < axisy.min)\r\n continue;\r\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\r\n y2 = axisy.min;\r\n }\r\n\r\n // clip with ymax\r\n if (y1 >= y2 && y1 > axisy.max) {\r\n if (y2 > axisy.max)\r\n continue;\r\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\r\n y1 = axisy.max;\r\n }\r\n else if (y2 >= y1 && y2 > axisy.max) {\r\n if (y1 > axisy.max)\r\n continue;\r\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\r\n y2 = axisy.max;\r\n }\r\n\r\n // clip with xmin\r\n if (x1 <= x2 && x1 < axisx.min) {\r\n if (x2 < axisx.min)\r\n continue;\r\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\r\n x1 = axisx.min;\r\n }\r\n else if (x2 <= x1 && x2 < axisx.min) {\r\n if (x1 < axisx.min)\r\n continue;\r\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\r\n x2 = axisx.min;\r\n }\r\n\r\n // clip with xmax\r\n if (x1 >= x2 && x1 > axisx.max) {\r\n if (x2 > axisx.max)\r\n continue;\r\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\r\n x1 = axisx.max;\r\n }\r\n else if (x2 >= x1 && x2 > axisx.max) {\r\n if (x1 > axisx.max)\r\n continue;\r\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\r\n x2 = axisx.max;\r\n }\r\n\r\n if (x1 != prevx || y1 != prevy)\r\n ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\r\n\r\n prevx = x2;\r\n prevy = y2;\r\n ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);\r\n }\r\n ctx.stroke();\r\n }\r\n\r\n function plotLineArea(datapoints, axisx, axisy) {\r\n var points = datapoints.points,\r\n ps = datapoints.pointsize,\r\n bottom = Math.min(Math.max(0, axisy.min), axisy.max),\r\n i = 0, top, areaOpen = false,\r\n ypos = 1, segmentStart = 0, segmentEnd = 0;\r\n\r\n // we process each segment in two turns, first forward\r\n // direction to sketch out top, then once we hit the\r\n // end we go backwards to sketch the bottom\r\n while (true) {\r\n if (ps > 0 && i > points.length + ps)\r\n break;\r\n\r\n i += ps; // ps is negative if going backwards\r\n\r\n var x1 = points[i - ps],\r\n y1 = points[i - ps + ypos],\r\n x2 = points[i], y2 = points[i + ypos];\r\n\r\n if (areaOpen) {\r\n if (ps > 0 && x1 != null && x2 == null) {\r\n // at turning point\r\n segmentEnd = i;\r\n ps = -ps;\r\n ypos = 2;\r\n continue;\r\n }\r\n\r\n if (ps < 0 && i == segmentStart + ps) {\r\n // done with the reverse sweep\r\n ctx.fill();\r\n areaOpen = false;\r\n ps = -ps;\r\n ypos = 1;\r\n i = segmentStart = segmentEnd + ps;\r\n continue;\r\n }\r\n }\r\n\r\n if (x1 == null || x2 == null)\r\n continue;\r\n\r\n // clip x values\r\n\r\n // clip with xmin\r\n if (x1 <= x2 && x1 < axisx.min) {\r\n if (x2 < axisx.min)\r\n continue;\r\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\r\n x1 = axisx.min;\r\n }\r\n else if (x2 <= x1 && x2 < axisx.min) {\r\n if (x1 < axisx.min)\r\n continue;\r\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\r\n x2 = axisx.min;\r\n }\r\n\r\n // clip with xmax\r\n if (x1 >= x2 && x1 > axisx.max) {\r\n if (x2 > axisx.max)\r\n continue;\r\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\r\n x1 = axisx.max;\r\n }\r\n else if (x2 >= x1 && x2 > axisx.max) {\r\n if (x1 > axisx.max)\r\n continue;\r\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\r\n x2 = axisx.max;\r\n }\r\n\r\n if (!areaOpen) {\r\n // open area\r\n ctx.beginPath();\r\n ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));\r\n areaOpen = true;\r\n }\r\n\r\n // now first check the case where both is outside\r\n if (y1 >= axisy.max && y2 >= axisy.max) {\r\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));\r\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));\r\n continue;\r\n }\r\n else if (y1 <= axisy.min && y2 <= axisy.min) {\r\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));\r\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));\r\n continue;\r\n }\r\n\r\n // else it's a bit more complicated, there might\r\n // be a flat maxed out rectangle first, then a\r\n // triangular cutout or reverse; to find these\r\n // keep track of the current x values\r\n var x1old = x1, x2old = x2;\r\n\r\n // clip the y values, without shortcutting, we\r\n // go through all cases in turn\r\n\r\n // clip with ymin\r\n if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {\r\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\r\n y1 = axisy.min;\r\n }\r\n else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {\r\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\r\n y2 = axisy.min;\r\n }\r\n\r\n // clip with ymax\r\n if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {\r\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\r\n y1 = axisy.max;\r\n }\r\n else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {\r\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\r\n y2 = axisy.max;\r\n }\r\n\r\n // if the x value was changed we got a rectangle\r\n // to fill\r\n if (x1 != x1old) {\r\n ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));\r\n // it goes to (x1, y1), but we fill that below\r\n }\r\n\r\n // fill triangular section, this sometimes result\r\n // in redundant points if (x1, y1) hasn't changed\r\n // from previous line to, but we just ignore that\r\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));\r\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\r\n\r\n // fill the other rectangle if it's there\r\n if (x2 != x2old) {\r\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\r\n ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));\r\n }\r\n }\r\n }\r\n\r\n ctx.save();\r\n ctx.translate(plotOffset.left, plotOffset.top);\r\n ctx.lineJoin = \"round\";\r\n\r\n var lw = series.lines.lineWidth,\r\n sw = series.shadowSize;\r\n // FIXME: consider another form of shadow when filling is turned on\r\n if (lw > 0 && sw > 0) {\r\n // draw shadow as a thick and thin line with transparency\r\n ctx.lineWidth = sw;\r\n ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\r\n // position shadow at angle from the mid of line\r\n var angle = Math.PI/18;\r\n plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);\r\n ctx.lineWidth = sw/2;\r\n plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);\r\n }\r\n\r\n ctx.lineWidth = lw;\r\n ctx.strokeStyle = series.color;\r\n var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);\r\n if (fillStyle) {\r\n ctx.fillStyle = fillStyle;\r\n plotLineArea(series.datapoints, series.xaxis, series.yaxis);\r\n }\r\n\r\n if (lw > 0)\r\n plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);\r\n ctx.restore();\r\n }\r\n\r\n function drawSeriesPoints(series) {\r\n function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {\r\n var points = datapoints.points, ps = datapoints.pointsize;\r\n\r\n for (var i = 0; i < points.length; i += ps) {\r\n var x = points[i], y = points[i + 1];\r\n if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\r\n continue;\r\n\r\n ctx.beginPath();\r\n x = axisx.p2c(x);\r\n y = axisy.p2c(y) + offset;\r\n if (symbol == \"circle\")\r\n ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);\r\n else\r\n symbol(ctx, x, y, radius, shadow);\r\n ctx.closePath();\r\n\r\n if (fillStyle) {\r\n ctx.fillStyle = fillStyle;\r\n ctx.fill();\r\n }\r\n ctx.stroke();\r\n }\r\n }\r\n\r\n ctx.save();\r\n ctx.translate(plotOffset.left, plotOffset.top);\r\n\r\n var lw = series.points.lineWidth,\r\n sw = series.shadowSize,\r\n radius = series.points.radius,\r\n symbol = series.points.symbol;\r\n\r\n // If the user sets the line width to 0, we change it to a very \r\n // small value. A line width of 0 seems to force the default of 1.\r\n // Doing the conditional here allows the shadow setting to still be \r\n // optional even with a lineWidth of 0.\r\n\r\n if( lw == 0 )\r\n lw = 0.0001;\r\n\r\n if (lw > 0 && sw > 0) {\r\n // draw shadow in two steps\r\n var w = sw / 2;\r\n ctx.lineWidth = w;\r\n ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\r\n plotPoints(series.datapoints, radius, null, w + w/2, true,\r\n series.xaxis, series.yaxis, symbol);\r\n\r\n ctx.strokeStyle = \"rgba(0,0,0,0.2)\";\r\n plotPoints(series.datapoints, radius, null, w/2, true,\r\n series.xaxis, series.yaxis, symbol);\r\n }\r\n\r\n ctx.lineWidth = lw;\r\n ctx.strokeStyle = series.color;\r\n plotPoints(series.datapoints, radius,\r\n getFillStyle(series.points, series.color), 0, false,\r\n series.xaxis, series.yaxis, symbol);\r\n ctx.restore();\r\n }\r\n\r\n function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {\r\n var left, right, bottom, top,\r\n drawLeft, drawRight, drawTop, drawBottom,\r\n tmp;\r\n\r\n // in horizontal mode, we start the bar from the left\r\n // instead of from the bottom so it appears to be\r\n // horizontal rather than vertical\r\n if (horizontal) {\r\n drawBottom = drawRight = drawTop = true;\r\n drawLeft = false;\r\n left = b;\r\n right = x;\r\n top = y + barLeft;\r\n bottom = y + barRight;\r\n\r\n // account for negative bars\r\n if (right < left) {\r\n tmp = right;\r\n right = left;\r\n left = tmp;\r\n drawLeft = true;\r\n drawRight = false;\r\n }\r\n }\r\n else {\r\n drawLeft = drawRight = drawTop = true;\r\n drawBottom = false;\r\n left = x + barLeft;\r\n right = x + barRight;\r\n bottom = b;\r\n top = y;\r\n\r\n // account for negative bars\r\n if (top < bottom) {\r\n tmp = top;\r\n top = bottom;\r\n bottom = tmp;\r\n drawBottom = true;\r\n drawTop = false;\r\n }\r\n }\r\n\r\n // clip\r\n if (right < axisx.min || left > axisx.max ||\r\n top < axisy.min || bottom > axisy.max)\r\n return;\r\n\r\n if (left < axisx.min) {\r\n left = axisx.min;\r\n drawLeft = false;\r\n }\r\n\r\n if (right > axisx.max) {\r\n right = axisx.max;\r\n drawRight = false;\r\n }\r\n\r\n if (bottom < axisy.min) {\r\n bottom = axisy.min;\r\n drawBottom = false;\r\n }\r\n\r\n if (top > axisy.max) {\r\n top = axisy.max;\r\n drawTop = false;\r\n }\r\n\r\n left = axisx.p2c(left);\r\n bottom = axisy.p2c(bottom);\r\n right = axisx.p2c(right);\r\n top = axisy.p2c(top);\r\n\r\n // fill the bar\r\n if (fillStyleCallback) {\r\n c.fillStyle = fillStyleCallback(bottom, top);\r\n c.fillRect(left, top, right - left, bottom - top)\r\n }\r\n\r\n // draw outline\r\n if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {\r\n c.beginPath();\r\n\r\n // FIXME: inline moveTo is buggy with excanvas\r\n c.moveTo(left, bottom);\r\n if (drawLeft)\r\n c.lineTo(left, top);\r\n else\r\n c.moveTo(left, top);\r\n if (drawTop)\r\n c.lineTo(right, top);\r\n else\r\n c.moveTo(right, top);\r\n if (drawRight)\r\n c.lineTo(right, bottom);\r\n else\r\n c.moveTo(right, bottom);\r\n if (drawBottom)\r\n c.lineTo(left, bottom);\r\n else\r\n c.moveTo(left, bottom);\r\n c.stroke();\r\n }\r\n }\r\n\r\n function drawSeriesBars(series) {\r\n function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {\r\n var points = datapoints.points, ps = datapoints.pointsize;\r\n\r\n for (var i = 0; i < points.length; i += ps) {\r\n if (points[i] == null)\r\n continue;\r\n drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);\r\n }\r\n }\r\n\r\n ctx.save();\r\n ctx.translate(plotOffset.left, plotOffset.top);\r\n\r\n // FIXME: figure out a way to add shadows (for instance along the right edge)\r\n ctx.lineWidth = series.bars.lineWidth;\r\n ctx.strokeStyle = series.color;\r\n\r\n var barLeft;\r\n\r\n switch (series.bars.align) {\r\n case \"left\":\r\n barLeft = 0;\r\n break;\r\n case \"right\":\r\n barLeft = -series.bars.barWidth;\r\n break;\r\n default:\r\n barLeft = -series.bars.barWidth / 2;\r\n }\r\n\r\n var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;\r\n plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);\r\n ctx.restore();\r\n }\r\n\r\n function getFillStyle(filloptions, seriesColor, bottom, top) {\r\n var fill = filloptions.fill;\r\n if (!fill)\r\n return null;\r\n\r\n if (filloptions.fillColor)\r\n return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);\r\n\r\n var c = $.color.parse(seriesColor);\r\n c.a = typeof fill == \"number\" ? fill : 0.4;\r\n c.normalize();\r\n return c.toString();\r\n }\r\n\r\n function insertLegend() {\r\n\r\n if (options.legend.container != null) {\r\n $(options.legend.container).html(\"\");\r\n } else {\r\n placeholder.find(\".legend\").remove();\r\n }\r\n\r\n if (!options.legend.show) {\r\n return;\r\n }\r\n\r\n var fragments = [], entries = [], rowStarted = false,\r\n lf = options.legend.labelFormatter, s, label;\r\n\r\n // Build a list of legend entries, with each having a label and a color\r\n\r\n for (var i = 0; i < series.length; ++i) {\r\n s = series[i];\r\n if (s.label) {\r\n label = lf ? lf(s.label, s) : s.label;\r\n if (label) {\r\n entries.push({\r\n label: label,\r\n color: s.color\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Sort the legend using either the default or a custom comparator\r\n\r\n if (options.legend.sorted) {\r\n if ($.isFunction(options.legend.sorted)) {\r\n entries.sort(options.legend.sorted);\r\n } else if (options.legend.sorted == \"reverse\") {\r\n \tentries.reverse();\r\n } else {\r\n var ascending = options.legend.sorted != \"descending\";\r\n entries.sort(function(a, b) {\r\n return a.label == b.label ? 0 : (\r\n (a.label < b.label) != ascending ? 1 : -1 // Logical XOR\r\n );\r\n });\r\n }\r\n }\r\n\r\n // Generate markup for the list of entries, in their final order\r\n\r\n for (var i = 0; i < entries.length; ++i) {\r\n\r\n var entry = entries[i];\r\n\r\n if (i % options.legend.noColumns == 0) {\r\n if (rowStarted)\r\n fragments.push('');\r\n fragments.push('');\r\n rowStarted = true;\r\n }\r\n\r\n fragments.push(\r\n ' ' +\r\n '' + entry.label + ' '\r\n );\r\n }\r\n\r\n if (rowStarted)\r\n fragments.push(' ');\r\n\r\n if (fragments.length == 0)\r\n return;\r\n\r\n var table = '' + fragments.join(\"\") + '
';\r\n if (options.legend.container != null)\r\n $(options.legend.container).html(table);\r\n else {\r\n var pos = \"\",\r\n p = options.legend.position,\r\n m = options.legend.margin;\r\n if (m[0] == null)\r\n m = [m, m];\r\n if (p.charAt(0) == \"n\")\r\n pos += 'top:' + (m[1] + plotOffset.top) + 'px;';\r\n else if (p.charAt(0) == \"s\")\r\n pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';\r\n if (p.charAt(1) == \"e\")\r\n pos += 'right:' + (m[0] + plotOffset.right) + 'px;';\r\n else if (p.charAt(1) == \"w\")\r\n pos += 'left:' + (m[0] + plotOffset.left) + 'px;';\r\n var legend = $('' + table.replace('style=\"', 'style=\"position:absolute;' + pos +';') + '
').appendTo(placeholder);\r\n if (options.legend.backgroundOpacity != 0.0) {\r\n // put in the transparent background\r\n // separately to avoid blended labels and\r\n // label boxes\r\n var c = options.legend.backgroundColor;\r\n if (c == null) {\r\n c = options.grid.backgroundColor;\r\n if (c && typeof c == \"string\")\r\n c = $.color.parse(c);\r\n else\r\n c = $.color.extract(legend, 'background-color');\r\n c.a = 1;\r\n c = c.toString();\r\n }\r\n var div = legend.children();\r\n $('
').prependTo(legend).css('opacity', options.legend.backgroundOpacity);\r\n }\r\n }\r\n }\r\n\r\n\r\n // interactive features\r\n\r\n var highlights = [],\r\n redrawTimeout = null;\r\n\r\n // returns the data item the mouse is over, or null if none is found\r\n function findNearbyItem(mouseX, mouseY, seriesFilter) {\r\n var maxDistance = options.grid.mouseActiveRadius,\r\n smallestDistance = maxDistance * maxDistance + 1,\r\n item = null, foundPoint = false, i, j, ps;\r\n\r\n for (i = series.length - 1; i >= 0; --i) {\r\n if (!seriesFilter(series[i]))\r\n continue;\r\n\r\n var s = series[i],\r\n axisx = s.xaxis,\r\n axisy = s.yaxis,\r\n points = s.datapoints.points,\r\n mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster\r\n my = axisy.c2p(mouseY),\r\n maxx = maxDistance / axisx.scale,\r\n maxy = maxDistance / axisy.scale;\r\n\r\n ps = s.datapoints.pointsize;\r\n // with inverse transforms, we can't use the maxx/maxy\r\n // optimization, sadly\r\n if (axisx.options.inverseTransform)\r\n maxx = Number.MAX_VALUE;\r\n if (axisy.options.inverseTransform)\r\n maxy = Number.MAX_VALUE;\r\n\r\n if (s.lines.show || s.points.show) {\r\n for (j = 0; j < points.length; j += ps) {\r\n var x = points[j], y = points[j + 1];\r\n if (x == null)\r\n continue;\r\n\r\n // For points and lines, the cursor must be within a\r\n // certain distance to the data point\r\n if (x - mx > maxx || x - mx < -maxx ||\r\n y - my > maxy || y - my < -maxy)\r\n continue;\r\n\r\n // We have to calculate distances in pixels, not in\r\n // data units, because the scales of the axes may be different\r\n var dx = Math.abs(axisx.p2c(x) - mouseX),\r\n dy = Math.abs(axisy.p2c(y) - mouseY),\r\n dist = dx * dx + dy * dy; // we save the sqrt\r\n\r\n // use <= to ensure last point takes precedence\r\n // (last generally means on top of)\r\n if (dist < smallestDistance) {\r\n smallestDistance = dist;\r\n item = [i, j / ps];\r\n }\r\n }\r\n }\r\n\r\n if (s.bars.show && !item) { // no other point can be nearby\r\n\r\n var barLeft, barRight;\r\n\r\n switch (s.bars.align) {\r\n case \"left\":\r\n barLeft = 0;\r\n break;\r\n case \"right\":\r\n barLeft = -s.bars.barWidth;\r\n break;\r\n default:\r\n barLeft = -s.bars.barWidth / 2;\r\n }\r\n\r\n barRight = barLeft + s.bars.barWidth;\r\n\r\n for (j = 0; j < points.length; j += ps) {\r\n var x = points[j], y = points[j + 1], b = points[j + 2];\r\n if (x == null)\r\n continue;\r\n\r\n // for a bar graph, the cursor must be inside the bar\r\n if (series[i].bars.horizontal ?\r\n (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&\r\n my >= y + barLeft && my <= y + barRight) :\r\n (mx >= x + barLeft && mx <= x + barRight &&\r\n my >= Math.min(b, y) && my <= Math.max(b, y)))\r\n item = [i, j / ps];\r\n }\r\n }\r\n }\r\n\r\n if (item) {\r\n i = item[0];\r\n j = item[1];\r\n ps = series[i].datapoints.pointsize;\r\n\r\n return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),\r\n dataIndex: j,\r\n series: series[i],\r\n seriesIndex: i };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function onMouseMove(e) {\r\n if (options.grid.hoverable)\r\n triggerClickHoverEvent(\"plothover\", e,\r\n function (s) { return s[\"hoverable\"] != false; });\r\n }\r\n\r\n function onMouseLeave(e) {\r\n if (options.grid.hoverable)\r\n triggerClickHoverEvent(\"plothover\", e,\r\n function (s) { return false; });\r\n }\r\n\r\n function onClick(e) {\r\n triggerClickHoverEvent(\"plotclick\", e,\r\n function (s) { return s[\"clickable\"] != false; });\r\n }\r\n\r\n // trigger click or hover event (they send the same parameters\r\n // so we share their code)\r\n function triggerClickHoverEvent(eventname, event, seriesFilter) {\r\n var offset = eventHolder.offset(),\r\n canvasX = event.pageX - offset.left - plotOffset.left,\r\n canvasY = event.pageY - offset.top - plotOffset.top,\r\n pos = canvasToAxisCoords({ left: canvasX, top: canvasY });\r\n\r\n pos.pageX = event.pageX;\r\n pos.pageY = event.pageY;\r\n\r\n var item = findNearbyItem(canvasX, canvasY, seriesFilter);\r\n\r\n if (item) {\r\n // fill in mouse pos for any listeners out there\r\n item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);\r\n item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);\r\n }\r\n\r\n if (options.grid.autoHighlight) {\r\n // clear auto-highlights\r\n for (var i = 0; i < highlights.length; ++i) {\r\n var h = highlights[i];\r\n if (h.auto == eventname &&\r\n !(item && h.series == item.series &&\r\n h.point[0] == item.datapoint[0] &&\r\n h.point[1] == item.datapoint[1]))\r\n unhighlight(h.series, h.point);\r\n }\r\n\r\n if (item)\r\n highlight(item.series, item.datapoint, eventname);\r\n }\r\n\r\n placeholder.trigger(eventname, [ pos, item ]);\r\n }\r\n\r\n function triggerRedrawOverlay() {\r\n var t = options.interaction.redrawOverlayInterval;\r\n if (t == -1) { // skip event queue\r\n drawOverlay();\r\n return;\r\n }\r\n\r\n if (!redrawTimeout)\r\n redrawTimeout = setTimeout(drawOverlay, t);\r\n }\r\n\r\n function drawOverlay() {\r\n redrawTimeout = null;\r\n\r\n // draw highlights\r\n octx.save();\r\n overlay.clear();\r\n octx.translate(plotOffset.left, plotOffset.top);\r\n\r\n var i, hi;\r\n for (i = 0; i < highlights.length; ++i) {\r\n hi = highlights[i];\r\n\r\n if (hi.series.bars.show)\r\n drawBarHighlight(hi.series, hi.point);\r\n else\r\n drawPointHighlight(hi.series, hi.point);\r\n }\r\n octx.restore();\r\n\r\n executeHooks(hooks.drawOverlay, [octx]);\r\n }\r\n\r\n function highlight(s, point, auto) {\r\n if (typeof s == \"number\")\r\n s = series[s];\r\n\r\n if (typeof point == \"number\") {\r\n var ps = s.datapoints.pointsize;\r\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\r\n }\r\n\r\n var i = indexOfHighlight(s, point);\r\n if (i == -1) {\r\n highlights.push({ series: s, point: point, auto: auto });\r\n\r\n triggerRedrawOverlay();\r\n }\r\n else if (!auto)\r\n highlights[i].auto = false;\r\n }\r\n\r\n function unhighlight(s, point) {\r\n if (s == null && point == null) {\r\n highlights = [];\r\n triggerRedrawOverlay();\r\n return;\r\n }\r\n\r\n if (typeof s == \"number\")\r\n s = series[s];\r\n\r\n if (typeof point == \"number\") {\r\n var ps = s.datapoints.pointsize;\r\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\r\n }\r\n\r\n var i = indexOfHighlight(s, point);\r\n if (i != -1) {\r\n highlights.splice(i, 1);\r\n\r\n triggerRedrawOverlay();\r\n }\r\n }\r\n\r\n function indexOfHighlight(s, p) {\r\n for (var i = 0; i < highlights.length; ++i) {\r\n var h = highlights[i];\r\n if (h.series == s && h.point[0] == p[0]\r\n && h.point[1] == p[1])\r\n return i;\r\n }\r\n return -1;\r\n }\r\n\r\n function drawPointHighlight(series, point) {\r\n var x = point[0], y = point[1],\r\n axisx = series.xaxis, axisy = series.yaxis,\r\n highlightColor = (typeof series.highlightColor === \"string\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();\r\n\r\n if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\r\n return;\r\n\r\n var pointRadius = series.points.radius + series.points.lineWidth / 2;\r\n octx.lineWidth = pointRadius;\r\n octx.strokeStyle = highlightColor;\r\n var radius = 1.5 * pointRadius;\r\n x = axisx.p2c(x);\r\n y = axisy.p2c(y);\r\n\r\n octx.beginPath();\r\n if (series.points.symbol == \"circle\")\r\n octx.arc(x, y, radius, 0, 2 * Math.PI, false);\r\n else\r\n series.points.symbol(octx, x, y, radius, false);\r\n octx.closePath();\r\n octx.stroke();\r\n }\r\n\r\n function drawBarHighlight(series, point) {\r\n var highlightColor = (typeof series.highlightColor === \"string\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),\r\n fillStyle = highlightColor,\r\n barLeft;\r\n\r\n switch (series.bars.align) {\r\n case \"left\":\r\n barLeft = 0;\r\n break;\r\n case \"right\":\r\n barLeft = -series.bars.barWidth;\r\n break;\r\n default:\r\n barLeft = -series.bars.barWidth / 2;\r\n }\r\n\r\n octx.lineWidth = series.bars.lineWidth;\r\n octx.strokeStyle = highlightColor;\r\n\r\n drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,\r\n function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);\r\n }\r\n\r\n function getColorOrGradient(spec, bottom, top, defaultColor) {\r\n if (typeof spec == \"string\")\r\n return spec;\r\n else {\r\n // assume this is a gradient spec; IE currently only\r\n // supports a simple vertical gradient properly, so that's\r\n // what we support too\r\n var gradient = ctx.createLinearGradient(0, top, 0, bottom);\r\n\r\n for (var i = 0, l = spec.colors.length; i < l; ++i) {\r\n var c = spec.colors[i];\r\n if (typeof c != \"string\") {\r\n var co = $.color.parse(defaultColor);\r\n if (c.brightness != null)\r\n co = co.scale('rgb', c.brightness);\r\n if (c.opacity != null)\r\n co.a *= c.opacity;\r\n c = co.toString();\r\n }\r\n gradient.addColorStop(i / (l - 1), c);\r\n }\r\n\r\n return gradient;\r\n }\r\n }\r\n }\r\n\r\n // Add the plot function to the top level of the jQuery object\r\n\r\n $.plot = function(placeholder, data, options) {\r\n //var t0 = new Date();\r\n var plot = new Plot($(placeholder), data, options, $.plot.plugins);\r\n //(window.console ? console.log : alert)(\"time used (msecs): \" + ((new Date()).getTime() - t0.getTime()));\r\n return plot;\r\n };\r\n\r\n $.plot.version = \"0.8.3\";\r\n\r\n $.plot.plugins = [];\r\n\r\n // Also add the plot function as a chainable property\r\n\r\n $.fn.plot = function(data, options) {\r\n return this.each(function() {\r\n $.plot(this, data, options);\r\n });\r\n };\r\n\r\n // round to nearby lower multiple of base\r\n function floorInBase(n, base) {\r\n return base * Math.floor(n / base);\r\n }\r\n\r\n})(jQuery);\r\n","/* Pretty handling of time axes.\r\n\r\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\r\nLicensed under the MIT license.\r\n\r\nSet axis.mode to \"time\" to enable. See the section \"Time series data\" in\r\nAPI.txt for details.\r\n\r\n*/\r\n\r\n(function($) {\r\n\r\n\tvar options = {\r\n\t\txaxis: {\r\n\t\t\ttimezone: null,\t\t// \"browser\" for local to the client or timezone for timezone-js\r\n\t\t\ttimeformat: null,\t// format string to use\r\n\t\t\ttwelveHourClock: false,\t// 12 or 24 time in time mode\r\n\t\t\tmonthNames: null\t// list of names of months\r\n\t\t}\r\n\t};\r\n\r\n\t// round to nearby lower multiple of base\r\n\r\n\tfunction floorInBase(n, base) {\r\n\t\treturn base * Math.floor(n / base);\r\n\t}\r\n\r\n\t// Returns a string with the date d formatted according to fmt.\r\n\t// A subset of the Open Group's strftime format is supported.\r\n\r\n\tfunction formatDate(d, fmt, monthNames, dayNames) {\r\n\r\n\t\tif (typeof d.strftime == \"function\") {\r\n\t\t\treturn d.strftime(fmt);\r\n\t\t}\r\n\r\n\t\tvar leftPad = function(n, pad) {\r\n\t\t\tn = \"\" + n;\r\n\t\t\tpad = \"\" + (pad == null ? \"0\" : pad);\r\n\t\t\treturn n.length == 1 ? pad + n : n;\r\n\t\t};\r\n\r\n\t\tvar r = [];\r\n\t\tvar escape = false;\r\n\t\tvar hours = d.getHours();\r\n\t\tvar isAM = hours < 12;\r\n\r\n\t\tif (monthNames == null) {\r\n\t\t\tmonthNames = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\r\n\t\t}\r\n\r\n\t\tif (dayNames == null) {\r\n\t\t\tdayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\r\n\t\t}\r\n\r\n\t\tvar hours12;\r\n\r\n\t\tif (hours > 12) {\r\n\t\t\thours12 = hours - 12;\r\n\t\t} else if (hours == 0) {\r\n\t\t\thours12 = 12;\r\n\t\t} else {\r\n\t\t\thours12 = hours;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0; i < fmt.length; ++i) {\r\n\r\n\t\t\tvar c = fmt.charAt(i);\r\n\r\n\t\t\tif (escape) {\r\n\t\t\t\tswitch (c) {\r\n\t\t\t\t\tcase 'a': c = \"\" + dayNames[d.getDay()]; break;\r\n\t\t\t\t\tcase 'b': c = \"\" + monthNames[d.getMonth()]; break;\r\n\t\t\t\t\tcase 'd': c = leftPad(d.getDate()); break;\r\n\t\t\t\t\tcase 'e': c = leftPad(d.getDate(), \" \"); break;\r\n\t\t\t\t\tcase 'h':\t// For back-compat with 0.7; remove in 1.0\r\n\t\t\t\t\tcase 'H': c = leftPad(hours); break;\r\n\t\t\t\t\tcase 'I': c = leftPad(hours12); break;\r\n\t\t\t\t\tcase 'l': c = leftPad(hours12, \" \"); break;\r\n\t\t\t\t\tcase 'm': c = leftPad(d.getMonth() + 1); break;\r\n\t\t\t\t\tcase 'M': c = leftPad(d.getMinutes()); break;\r\n\t\t\t\t\t// quarters not in Open Group's strftime specification\r\n\t\t\t\t\tcase 'q':\r\n\t\t\t\t\t\tc = \"\" + (Math.floor(d.getMonth() / 3) + 1); break;\r\n\t\t\t\t\tcase 'S': c = leftPad(d.getSeconds()); break;\r\n\t\t\t\t\tcase 'y': c = leftPad(d.getFullYear() % 100); break;\r\n\t\t\t\t\tcase 'Y': c = \"\" + d.getFullYear(); break;\r\n\t\t\t\t\tcase 'p': c = (isAM) ? (\"\" + \"am\") : (\"\" + \"pm\"); break;\r\n\t\t\t\t\tcase 'P': c = (isAM) ? (\"\" + \"AM\") : (\"\" + \"PM\"); break;\r\n\t\t\t\t\tcase 'w': c = \"\" + d.getDay(); break;\r\n\t\t\t\t}\r\n\t\t\t\tr.push(c);\r\n\t\t\t\tescape = false;\r\n\t\t\t} else {\r\n\t\t\t\tif (c == \"%\") {\r\n\t\t\t\t\tescape = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tr.push(c);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn r.join(\"\");\r\n\t}\r\n\r\n\t// To have a consistent view of time-based data independent of which time\r\n\t// zone the client happens to be in we need a date-like object independent\r\n\t// of time zones. This is done through a wrapper that only calls the UTC\r\n\t// versions of the accessor methods.\r\n\r\n\tfunction makeUtcWrapper(d) {\r\n\r\n\t\tfunction addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {\r\n\t\t\tsourceObj[sourceMethod] = function() {\r\n\t\t\t\treturn targetObj[targetMethod].apply(targetObj, arguments);\r\n\t\t\t};\r\n\t\t};\r\n\r\n\t\tvar utc = {\r\n\t\t\tdate: d\r\n\t\t};\r\n\r\n\t\t// support strftime, if found\r\n\r\n\t\tif (d.strftime != undefined) {\r\n\t\t\taddProxyMethod(utc, \"strftime\", d, \"strftime\");\r\n\t\t}\r\n\r\n\t\taddProxyMethod(utc, \"getTime\", d, \"getTime\");\r\n\t\taddProxyMethod(utc, \"setTime\", d, \"setTime\");\r\n\r\n\t\tvar props = [\"Date\", \"Day\", \"FullYear\", \"Hours\", \"Milliseconds\", \"Minutes\", \"Month\", \"Seconds\"];\r\n\r\n\t\tfor (var p = 0; p < props.length; p++) {\r\n\t\t\taddProxyMethod(utc, \"get\" + props[p], d, \"getUTC\" + props[p]);\r\n\t\t\taddProxyMethod(utc, \"set\" + props[p], d, \"setUTC\" + props[p]);\r\n\t\t}\r\n\r\n\t\treturn utc;\r\n\t};\r\n\r\n\t// select time zone strategy. This returns a date-like object tied to the\r\n\t// desired timezone\r\n\r\n\tfunction dateGenerator(ts, opts) {\r\n\t\tif (opts.timezone == \"browser\") {\r\n\t\t\treturn new Date(ts);\r\n\t\t} else if (!opts.timezone || opts.timezone == \"utc\") {\r\n\t\t\treturn makeUtcWrapper(new Date(ts));\r\n\t\t} \r\n\t\t// eslint-disable-next-line no-undef\r\n\t\telse if (typeof timezoneJS != \"undefined\" && typeof timezoneJS.Date != \"undefined\") {\r\n\t\t\t// eslint-disable-next-line no-undef\r\n\t\t\tvar d = new timezoneJS.Date();\r\n\t\t\t// timezone-js is fickle, so be sure to set the time zone before\r\n\t\t\t// setting the time.\r\n\t\t\td.setTimezone(opts.timezone);\r\n\t\t\td.setTime(ts);\r\n\t\t\treturn d;\r\n\t\t} else {\r\n\t\t\treturn makeUtcWrapper(new Date(ts));\r\n\t\t}\r\n\t}\r\n\t\r\n\t// map of app. size of time units in milliseconds\r\n\r\n\tvar timeUnitSize = {\r\n\t\t\"second\": 1000,\r\n\t\t\"minute\": 60 * 1000,\r\n\t\t\"hour\": 60 * 60 * 1000,\r\n\t\t\"day\": 24 * 60 * 60 * 1000,\r\n\t\t\"month\": 30 * 24 * 60 * 60 * 1000,\r\n\t\t\"quarter\": 3 * 30 * 24 * 60 * 60 * 1000,\r\n\t\t\"year\": 365.2425 * 24 * 60 * 60 * 1000\r\n\t};\r\n\r\n\t// the allowed tick sizes, after 1 year we use\r\n\t// an integer algorithm\r\n\r\n\tvar baseSpec = [\r\n\t\t[1, \"second\"], [2, \"second\"], [5, \"second\"], [10, \"second\"],\r\n\t\t[30, \"second\"], \r\n\t\t[1, \"minute\"], [2, \"minute\"], [5, \"minute\"], [10, \"minute\"],\r\n\t\t[30, \"minute\"], \r\n\t\t[1, \"hour\"], [2, \"hour\"], [4, \"hour\"],\r\n\t\t[8, \"hour\"], [12, \"hour\"],\r\n\t\t[1, \"day\"], [2, \"day\"], [3, \"day\"],\r\n\t\t[0.25, \"month\"], [0.5, \"month\"], [1, \"month\"],\r\n\t\t[2, \"month\"]\r\n\t];\r\n\r\n\t// we don't know which variant(s) we'll need yet, but generating both is\r\n\t// cheap\r\n\r\n\tvar specMonths = baseSpec.concat([[3, \"month\"], [6, \"month\"],\r\n\t\t[1, \"year\"]]);\r\n\tvar specQuarters = baseSpec.concat([[1, \"quarter\"], [2, \"quarter\"],\r\n\t\t[1, \"year\"]]);\r\n\r\n\tfunction init(plot) {\r\n\t\tplot.hooks.processOptions.push(function (plot, options) {\r\n\t\t\t$.each(plot.getAxes(), function(axisName, axis) {\r\n\r\n\t\t\t\tvar opts = axis.options;\r\n\r\n\t\t\t\tif (opts.mode == \"time\") {\r\n\t\t\t\t\taxis.tickGenerator = function(axis) {\r\n\r\n\t\t\t\t\t\tvar ticks = [];\r\n\t\t\t\t\t\tvar d = dateGenerator(axis.min, opts);\r\n\t\t\t\t\t\tvar minSize = 0;\r\n\r\n\t\t\t\t\t\t// make quarter use a possibility if quarters are\r\n\t\t\t\t\t\t// mentioned in either of these options\r\n\r\n\t\t\t\t\t\tvar spec = (opts.tickSize && opts.tickSize[1] ===\r\n\t\t\t\t\t\t\t\"quarter\") ||\r\n\t\t\t\t\t\t\t(opts.minTickSize && opts.minTickSize[1] ===\r\n\t\t\t\t\t\t\t\"quarter\") ? specQuarters : specMonths;\r\n\r\n\t\t\t\t\t\tif (opts.minTickSize != null) {\r\n\t\t\t\t\t\t\tif (typeof opts.tickSize == \"number\") {\r\n\t\t\t\t\t\t\t\tminSize = opts.tickSize;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tminSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor (var i = 0; i < spec.length - 1; ++i) {\r\n\t\t\t\t\t\t\tif (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]\r\n\t\t\t\t\t\t\t\t\t\t\t + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2\r\n\t\t\t\t\t\t\t\t&& spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar size = spec[i][0];\r\n\t\t\t\t\t\tvar unit = spec[i][1];\r\n\r\n\t\t\t\t\t\t// special-case the possibility of several years\r\n\r\n\t\t\t\t\t\tif (unit == \"year\") {\r\n\r\n\t\t\t\t\t\t\t// if given a minTickSize in years, just use it,\r\n\t\t\t\t\t\t\t// ensuring that it's an integer\r\n\r\n\t\t\t\t\t\t\tif (opts.minTickSize != null && opts.minTickSize[1] == \"year\") {\r\n\t\t\t\t\t\t\t\tsize = Math.floor(opts.minTickSize[0]);\r\n\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t\tvar magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));\r\n\t\t\t\t\t\t\t\tvar norm = (axis.delta / timeUnitSize.year) / magn;\r\n\r\n\t\t\t\t\t\t\t\tif (norm < 1.5) {\r\n\t\t\t\t\t\t\t\t\tsize = 1;\r\n\t\t\t\t\t\t\t\t} else if (norm < 3) {\r\n\t\t\t\t\t\t\t\t\tsize = 2;\r\n\t\t\t\t\t\t\t\t} else if (norm < 7.5) {\r\n\t\t\t\t\t\t\t\t\tsize = 5;\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tsize = 10;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tsize *= magn;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// minimum size for years is 1\r\n\r\n\t\t\t\t\t\t\tif (size < 1) {\r\n\t\t\t\t\t\t\t\tsize = 1;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\taxis.tickSize = opts.tickSize || [size, unit];\r\n\t\t\t\t\t\tvar tickSize = axis.tickSize[0];\r\n\t\t\t\t\t\tunit = axis.tickSize[1];\r\n\r\n\t\t\t\t\t\tvar step = tickSize * timeUnitSize[unit];\r\n\r\n\t\t\t\t\t\tif (unit == \"second\") {\r\n\t\t\t\t\t\t\td.setSeconds(floorInBase(d.getSeconds(), tickSize));\r\n\t\t\t\t\t\t} else if (unit == \"minute\") {\r\n\t\t\t\t\t\t\td.setMinutes(floorInBase(d.getMinutes(), tickSize));\r\n\t\t\t\t\t\t} else if (unit == \"hour\") {\r\n\t\t\t\t\t\t\td.setHours(floorInBase(d.getHours(), tickSize));\r\n\t\t\t\t\t\t} else if (unit == \"month\") {\r\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), tickSize));\r\n\t\t\t\t\t\t} else if (unit == \"quarter\") {\r\n\t\t\t\t\t\t\td.setMonth(3 * floorInBase(d.getMonth() / 3,\r\n\t\t\t\t\t\t\t\ttickSize));\r\n\t\t\t\t\t\t} else if (unit == \"year\") {\r\n\t\t\t\t\t\t\td.setFullYear(floorInBase(d.getFullYear(), tickSize));\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// reset smaller components\r\n\r\n\t\t\t\t\t\td.setMilliseconds(0);\r\n\r\n\t\t\t\t\t\tif (step >= timeUnitSize.minute) {\r\n\t\t\t\t\t\t\td.setSeconds(0);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (step >= timeUnitSize.hour) {\r\n\t\t\t\t\t\t\td.setMinutes(0);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (step >= timeUnitSize.day) {\r\n\t\t\t\t\t\t\td.setHours(0);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (step >= timeUnitSize.day * 4) {\r\n\t\t\t\t\t\t\td.setDate(1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (step >= timeUnitSize.month * 2) {\r\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), 3));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (step >= timeUnitSize.quarter * 2) {\r\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), 6));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (step >= timeUnitSize.year) {\r\n\t\t\t\t\t\t\td.setMonth(0);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar carry = 0;\r\n\t\t\t\t\t\tvar v = Number.NaN;\r\n\t\t\t\t\t\tvar prev;\r\n\r\n\t\t\t\t\t\tdo {\r\n\r\n\t\t\t\t\t\t\tprev = v;\r\n\t\t\t\t\t\t\tv = d.getTime();\r\n\t\t\t\t\t\t\tticks.push(v);\r\n\r\n\t\t\t\t\t\t\tif (unit == \"month\" || unit == \"quarter\") {\r\n\t\t\t\t\t\t\t\tif (tickSize < 1) {\r\n\r\n\t\t\t\t\t\t\t\t\t// a bit complicated - we'll divide the\r\n\t\t\t\t\t\t\t\t\t// month/quarter up but we need to take\r\n\t\t\t\t\t\t\t\t\t// care of fractions so we don't end up in\r\n\t\t\t\t\t\t\t\t\t// the middle of a day\r\n\r\n\t\t\t\t\t\t\t\t\td.setDate(1);\r\n\t\t\t\t\t\t\t\t\tvar start = d.getTime();\r\n\t\t\t\t\t\t\t\t\td.setMonth(d.getMonth() +\r\n\t\t\t\t\t\t\t\t\t\t(unit == \"quarter\" ? 3 : 1));\r\n\t\t\t\t\t\t\t\t\tvar end = d.getTime();\r\n\t\t\t\t\t\t\t\t\td.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);\r\n\t\t\t\t\t\t\t\t\tcarry = d.getHours();\r\n\t\t\t\t\t\t\t\t\td.setHours(0);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\td.setMonth(d.getMonth() +\r\n\t\t\t\t\t\t\t\t\t\ttickSize * (unit == \"quarter\" ? 3 : 1));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else if (unit == \"year\") {\r\n\t\t\t\t\t\t\t\td.setFullYear(d.getFullYear() + tickSize);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\td.setTime(v + step);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} while (v < axis.max && v != prev);\r\n\r\n\t\t\t\t\t\treturn ticks;\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\taxis.tickFormatter = function (v, axis) {\r\n\r\n\t\t\t\t\t\tvar d = dateGenerator(v, axis.options);\r\n\r\n\t\t\t\t\t\t// first check global format\r\n\r\n\t\t\t\t\t\tif (opts.timeformat != null) {\r\n\t\t\t\t\t\t\treturn formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// possibly use quarters if quarters are mentioned in\r\n\t\t\t\t\t\t// any of these places\r\n\r\n\t\t\t\t\t\tvar useQuarters = (axis.options.tickSize &&\r\n\t\t\t\t\t\t\t\taxis.options.tickSize[1] == \"quarter\") ||\r\n\t\t\t\t\t\t\t(axis.options.minTickSize &&\r\n\t\t\t\t\t\t\t\taxis.options.minTickSize[1] == \"quarter\");\r\n\r\n\t\t\t\t\t\tvar t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];\r\n\t\t\t\t\t\tvar span = axis.max - axis.min;\r\n\t\t\t\t\t\tvar suffix = (opts.twelveHourClock) ? \" %p\" : \"\";\r\n\t\t\t\t\t\tvar hourCode = (opts.twelveHourClock) ? \"%I\" : \"%H\";\r\n\t\t\t\t\t\tvar fmt;\r\n\r\n\t\t\t\t\t\tif (t < timeUnitSize.minute) {\r\n\t\t\t\t\t\t\tfmt = hourCode + \":%M:%S\" + suffix;\r\n\t\t\t\t\t\t} else if (t < timeUnitSize.day) {\r\n\t\t\t\t\t\t\tif (span < 2 * timeUnitSize.day) {\r\n\t\t\t\t\t\t\t\tfmt = hourCode + \":%M\" + suffix;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tfmt = \"%b %d \" + hourCode + \":%M\" + suffix;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else if (t < timeUnitSize.month) {\r\n\t\t\t\t\t\t\tfmt = \"%b %d\";\r\n\t\t\t\t\t\t} else if ((useQuarters && t < timeUnitSize.quarter) ||\r\n\t\t\t\t\t\t\t(!useQuarters && t < timeUnitSize.year)) {\r\n\t\t\t\t\t\t\tif (span < timeUnitSize.year) {\r\n\t\t\t\t\t\t\t\tfmt = \"%b\";\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tfmt = \"%b %Y\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else if (useQuarters && t < timeUnitSize.year) {\r\n\t\t\t\t\t\t\tif (span < timeUnitSize.year) {\r\n\t\t\t\t\t\t\t\tfmt = \"Q%q\";\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tfmt = \"Q%q %Y\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tfmt = \"%Y\";\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);\r\n\r\n\t\t\t\t\t\treturn rt;\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t$.plot.plugins.push({\r\n\t\tinit: init,\r\n\t\toptions: options,\r\n\t\tname: 'time',\r\n\t\tversion: '1.0'\r\n\t});\r\n\r\n\t// Time-axis support used to be in Flot core, which exposed the\r\n\t// formatDate function on the plot object. Various plugins depend\r\n\t// on the function, so we need to re-expose it here.\r\n\r\n\t$.plot.formatDate = formatDate;\r\n\t$.plot.dateGenerator = dateGenerator;\r\n\r\n})(jQuery);\r\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"layout-container\",class:{'hidden': _vm.sidebar_hidden}},[(!_vm.is_team_setup)?_c('aside',{staticClass:\"sidebar-container\"},[_c('div',{staticClass:\"p-3 c-pointer text-muted\",staticStyle:{\"position\":\"absolute\"},attrs:{\"title\":\"Close sidebar\"},on:{\"click\":function($event){_vm.sidebar_hidden = true}}},[_c('em',{staticClass:\"ion-chevron-left\"})]),_c('div',{staticClass:\"brand-header d-flex align-items-center justify-content-center\"},[_c('router-link',{attrs:{\"to\":\"/files\"},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[(_vm.show_team_logo)?_c('img',{staticStyle:{\"max-height\":\"50px\",\"max-width\":\"200px\"},attrs:{\"src\":_vm.user.team_settings.logo_url}}):_c('img',{attrs:{\"src\":require(\"@/assets/img/skyflok_logo.png\"),\"width\":\"130\"}})])],1),_c('div',{staticClass:\"sidebar-content\"},[_c('div',{staticClass:\"sidebar-toolbar\"},[_c('div',{staticClass:\"sidebar-toolbar-background\"}),_c('div',{staticClass:\"sidebar-toolbar-content text-center\"},[_c('router-link',{staticStyle:{\"text-decoration\":\"none\",\"color\":\"white\"},attrs:{\"to\":\"/settings\",\"title\":\"Click to edit your settings\"},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[(_vm.user)?_c('img',{staticClass:\"rounded-circle thumb64 fit-cover\",staticStyle:{\"box-shadow\":\"0 0 5px 0 #888\"},attrs:{\"src\":_vm.user.avatar_url,\"alt\":\"Profile\"}}):_vm._e(),_c('div',{staticClass:\"mt-3\"},[_c('div',{staticClass:\"lead text-bolder\"},[_vm._v(_vm._s(_vm.user ? _vm.user.name : ''))]),_c('div',{},[_vm._v(_vm._s(_vm.user ? _vm.user.company_name : ''))])])])],1)]),_c('nav',{staticClass:\"sidebar-nav\"},[_c('ul',[_c('li',{class:{'active': _vm.path === '/files', 'disabled': _vm.no_buckets},on:{\"!click\":function($event){return _vm.menu_click($event, 'files')}}},[_c('router-link',{attrs:{\"to\":\"/files\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-document-text\"})]),_c('span',[_vm._v(\"Team Files\")])])],1),_c('li',{staticClass:\"recycle_bin\",class:{'active': _vm.path === '/recycle_bin', 'disabled': _vm.no_buckets, 'dragover': _vm.dragover_recycle_bin},on:{\"drop\":function($event){$event.preventDefault();return _vm.drop_to_bin($event)},\"dragover\":function($event){$event.preventDefault();return _vm.dragover_bin($event)},\"dragleave\":function($event){$event.preventDefault();_vm.dragover_recycle_bin = false},\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/recycle_bin\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-trash-a\"})]),_c('span',[_vm._v(\"Recycle Bin\")])])],1),(_vm.share_enabled)?_c('li',{class:{'active': _vm.path === '/shares', 'disabled': _vm.no_buckets},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/shares\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-link\"})]),_c('span',[_vm._v(\"Shares\")])])],1):_vm._e(),(_vm.client_spaces_enabled)?_c('li',{class:{'active': _vm.path === '/client_spaces', 'disabled': _vm.no_buckets},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/client_spaces\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-filing\"})]),_c('span',[_vm._v(\"Client Spaces\")])])],1):_vm._e(),(_vm.client_spaces_enabled && _vm.is_admin)?_c('li',{class:{'active': _vm.path === '/admin_folder', 'disabled': _vm.no_buckets},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/admin_folder\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-lock-combination\"})]),_c('span',[_vm._v(\"Admin Folder\")])])],1):_vm._e(),_c('li',{class:{'active': _vm.path === '/team', 'disabled': _vm.no_buckets},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/team\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-person-stalker\"})]),_c('span',[_vm._v(\"Team Members\")])])],1),_c('li',{class:{'active': _vm.path === '/settings', 'disabled': _vm.no_buckets},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/settings\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-wrench\"})]),_c('span',[_vm._v(\"My Settings\")]),(_vm.user && _vm.user.menu_warning && _vm.user.menu_warning.indexOf('settings') >= 0)?_c('span',{staticClass:\"float-right nav-label pr-3\"},[_c('span',{staticClass:\"badge-rounded badge-warning\"},[_vm._v(\"!\")])]):_vm._e()])],1),(_vm.is_admin)?_c('li',[_c('div',{staticClass:\"sidebar-nav-heading text-muted pb-1\"},[_vm._v(\"TEAM MANAGEMENT\")])]):_vm._e(),(_vm.is_admin && _vm.user.team_settings && _vm.user.team_settings.is_free_trial)?_c('li',{class:{'active': _vm.path === '/upgrade-team', 'bg-gradient-warning text-bold text-gray-dark': _vm.path !== '/upgrade-team'},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/upgrade-team\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-star\",class:{'text-gray-dark': _vm.path !== '/upgrade-team'}})]),_c('span',[_vm._v(\"Upgrade Account\")])])],1):_vm._e(),(_vm.is_admin)?_c('li',{class:{'active': _vm.path === '/team-settings', 'disabled': _vm.no_buckets},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/team-settings\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-gear-a\"})]),_c('span',[_vm._v(\"Team Settings\")])])],1):_vm._e(),(_vm.is_admin)?_c('li',{class:{'active': _vm.path === '/user-management', 'disabled': _vm.no_buckets},on:{\"!click\":function($event){return _vm.menu_click.apply(null, arguments)}}},[_c('router-link',{attrs:{\"to\":\"/user-management\"}},[_c('span',{staticClass:\"nav-icon\"},[_c('em',{staticClass:\"ion-person-add\"})]),_c('span',[_vm._v(\"User Management\")])])],1):_vm._e()])]),_c('div',{staticClass:\"nav-footer\"},[(false && _vm.data_locations && _vm.data_locations.length > 0)?_c('div',{staticClass:\"mb-3\",attrs:{\"id\":\"data-locations\"}},[_c('location-flags',{attrs:{\"locations\":_vm.data_locations,\"disable_popover\":_vm.is_mobile}})],1):_vm._e(),(_vm.user && _vm.user.team_settings)?_c('div',[(_vm.user.team_settings.max_storage !== null)?_c('div',{staticClass:\"usage_container mb-5\"},[_c('div',{staticClass:\"storage_used bg-gradient-primary\",style:({'width': Math.max(0, Math.round((_vm.user.team_storage_used / _vm.user.team_settings.max_storage) * 100)) + '%' })}),_vm._v(\" \"+_vm._s(_vm._f(\"format_bytes\")(_vm.user.team_storage_used))+\" of \"+_vm._s(_vm._f(\"format_bytes\")(_vm.user.team_settings.max_storage))+\" used \")]):_c('div',[_vm._v(\" \"+_vm._s(_vm._f(\"format_bytes\")(_vm.user.team_storage_used))+\" storage used \")])]):_vm._e(),_c('div',{staticClass:\"d-flex align-items-center justify-content-center\"},[_c('div',{staticClass:\"mr-1\"},[_c('button',{staticClass:\"btn btn-sm text-sm\",on:{\"click\":function($event){return _vm.set_theme('theme-default')}}},[_vm._v(\"Bright\"),(!_vm.theme || _vm.theme=='theme-default')?_c('i',{staticClass:\"ion-checkmark ml-1\"}):_vm._e()])]),_c('div',{staticClass:\"ml-1\"},[_c('button',{staticClass:\"btn btn-sm btn-outline-secondary text-sm\",on:{\"click\":function($event){return _vm.set_theme('theme-dark')}}},[_vm._v(\"Dark\"),(_vm.theme=='theme-dark')?_c('i',{staticClass:\"ion-checkmark ml-1\"}):_vm._e()])])]),(_vm.show_team_logo)?_c('div',{staticClass:\"text-center mt-4\"},[_c('img',{attrs:{\"src\":require(\"@/assets/img/skyflok_logo.png\"),\"height\":\"30\"}})]):_vm._e()])])]):_vm._e(),_c('div',{staticClass:\"sidebar-layout-obfuscator\"}),_c('main',{staticClass:\"main-container\"},[(!_vm.is_team_setup)?_c('header',{staticClass:\"header-container\",class:{'hidden': _vm.file_dragged}},[_c('global-alert',{attrs:{\"alert\":_vm.alert}}),_c('nav',[(_vm.sidebar_hidden)?_c('ul',[_c('li',{attrs:{\"title\":\"Open sidebar\"},on:{\"click\":function($event){_vm.sidebar_hidden = false}}},[_vm._m(0)])]):_vm._e(),_vm._m(1),_vm._m(2),(!_vm.is_mobile && !_vm.hide_route_name)?_c('h2',{staticClass:\"header-title mr-auto\"},[_vm._v(\" \"+_vm._s(_vm.$route.name)+\" \"),(false)?_c('span',{staticClass:\"d-inline-block badge badge-sm badge-secondary\"},[_c('span',{staticClass:\"d-block d-sm-none\"},[_vm._v(\"XS\")]),_c('span',{staticClass:\"d-none d-sm-block d-md-none\"},[_vm._v(\"SM\")]),_c('span',{staticClass:\"d-none d-md-block d-lg-none\"},[_vm._v(\"MD\")]),_c('span',{staticClass:\"d-none d-lg-block d-xl-none\"},[_vm._v(\"LG\")]),_c('span',{staticClass:\"d-none d-xl-block\"},[_vm._v(\"XL\")])]):_vm._e(),(_vm.header_info_icon)?_c('i',{staticClass:\"ml-1 ion-information-circled p-0 c-help\",staticStyle:{\"font-size\":\".7em\"},attrs:{\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"bottom\",\"data-html\":true,\"data-trigger\":_vm.is_mobile ? 'click' : 'hover',\"data-content\":_vm.header_info_icon}}):_vm._e()]):_vm._e(),_c('div',{staticClass:\"float-right mr-2\"},[_c('search-box'),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.user),expression:\"user\"}],staticClass:\"dropdown d-inline-block ml-2\"},[_c('a',{staticClass:\"dropdown-toggle text-gray\",attrs:{\"href\":\"#\",\"data-toggle\":\"dropdown\"}},[(_vm.user)?_c('img',{staticClass:\"header-user-image fit-cover initial32\",attrs:{\"src\":_vm.user.avatar_url}}):_vm._e()]),_c('div',{staticClass:\"dropdown-menu dropdown-menu-right dropdown-scale mt-4\"},[_c('router-link',{staticClass:\"dropdown-item\",attrs:{\"to\":\"/settings\"}},[_c('i',{staticClass:\"ion-gear-a icon-lg text-primary mr-3\"}),_vm._v(\"My Settings \")]),_c('router-link',{staticClass:\"dropdown-item\",attrs:{\"to\":\"/bugreport\"}},[_c('i',{staticClass:\"ion-bug icon-lg text-primary mr-3\"}),_vm._v(\"Feedback, Bug Report \")]),_vm._m(3),_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"presentation\"}}),_c('a',{staticClass:\"dropdown-item c-pointer text-danger\",on:{\"click\":function($event){return _vm.logout()}}},[_c('i',{staticClass:\"ion-log-out icon-lg mr-3\"}),_vm._v(\"Log out \")])],1)])],1)])],1):_vm._e(),(_vm.plan_expires_days >= 0 && _vm.plan_expires_days <= 14)?_c('div',{staticClass:\"bottom-container bg-gradient-warning text-white py-3\"},[_c('div',{staticClass:\"text-center text-bold\"},[_vm._v(\" Your \"+_vm._s(_vm.user.team_settings.plan_key == 'skyflok-trial' ? \"free trial\" : 'team subscription')+\" will end \"+_vm._s(_vm._f(\"days_rel\")(_vm.plan_expires_days))+\"! \"),_vm._m(4)])]):_vm._e(),_c('router-view',{attrs:{\"user\":_vm.user,\"route\":_vm.$route,\"features\":_vm.features}})],1)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('a',{attrs:{\"href\":\"#\"}},[_c('span',[_c('em',{staticClass:\"ion-chevron-right\"})])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('ul',{staticClass:\"d-inline-block d-lg-none text-left\"},[_c('li',[_c('a',{staticClass:\"sidebar-toggler menu-link menu-link-close\",attrs:{\"href\":\"#\"}},[_c('span',[_c('em')])])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('ul',{staticClass:\"d-none d-xs-block text-left\"},[_c('li',[_c('a',{staticClass:\"covermode-toggler menu-link menu-link-close\",attrs:{\"href\":\"#\"}},[_c('span',[_c('em')])])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"dropdown-item c-pointer\",attrs:{\"href\":\"https://www.skyflok.com/legal\",\"target\":\"_BLANK\",\"rel\":\"noopener\"}},[_c('i',{staticClass:\"ion-quote icon-lg text-primary mr-3\"}),_vm._v(\"Terms & Privacy\"),_c('i',{staticClass:\"ion-share ml-1\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('a',{staticClass:\"ml-2 text-gray-darker\",attrs:{\"href\":\"https://www.skyflok.com/#Pricing\",\"target\":\"_BLANK\",\"rel\":\"noopener\"}},[_vm._v(\"Upgrade \"),_c('i',{staticClass:\"ion-share ml-1\"})])\n}]\n\nexport { render, staticRenderFns }","\n// Private variables that we don't want to export\nconst token_key = \"token\"\n\n// Use the window.localStorage API to permanently store the token\nconst TokenCache = {\n\n storage: localStorage,\n\n get(){\n return TokenCache.storage.getItem(token_key, null)\n },\n\n is_stored(){\n return TokenCache.storage.getItem(token_key, null) !== null\n },\n\n store(token){\n TokenCache.storage.setItem(token_key, token)\n return true\n },\n\n clear(){\n TokenCache.storage.removeItem(token_key)\n return true\n }\n}\n\nexport { TokenCache }","import { TokenCache } from './token-cache.js'\nimport Vue from 'vue'\n\n\n\nlet bus = new Vue({\n computed: {\n auth_header: function(){\n return TokenCache.is_stored() ? { \"Authorization\": \"Bearer \" + TokenCache.get() } : null\n }\n }\n})\n\n\n// Has to be strings to work properly :(\nconst events = {\n LOGIN_SUCCESSFUL: \"LOGIN_SUCCESSFUL\",\n LOGIN_FAILED: \"LOGIN_FAILED\",\n LOGOUT: \"LOGOUT\",\n\n USED_STORAGE_CHANGED: \"USED_STORAGE_CHANGED\",\n USER_PROFILE_CHANGED: \"USER_PROFILE_CHANGED\",\n TEAM_MEMBER_PROFILE_CHANGED: \"TEAM_MEMBER_PROFILE_CHANGED\",\n RELOAD_TEAM: \"RELOAD_TEAM\",\n RELOAD_TEAM_SETTINGS: \"RELOAD_TEAM_SETTINGS\",\n RELOAD_BUCKETS: \"RELOAD_BUCKETS\",\n TEAM_LOADED: \"TEAM_LOADED\",\n SPACES_LOADED: \"SPACES_LOADED\",\n\n SHOW_ALERT: \"SHOW_ALERT\",\n ERROR: \"ERROR\",\n SUCCESS: \"SUCCESS\",\n WARNING: \"WARNING\",\n\n HIGHLIGHT_FILE: \"HIGHLIGHT_FILE\",\n REMOVE_FROM_FILELIST: \"REMOVE_FROM_FILELIST\",\n FILE_FOLDER_DRAG_START: \"FILE_FOLDER_DRAG_START\",\n FILE_FOLDER_DRAG_END: \"FILE_FOLDER_DRAG_END\",\n FILELIST_CHANGE_FOLDER_TO: \"FILELIST_CHANGE_FOLDER_TO\",\n FILELIST_CHANGE_FOLDER_TO_ID: \"FILELIST_CHANGE_FOLDER_TO_ID\",\n NAVIGATE_TO: \"NAVIGATE_TO\",\n RELOAD_2FA_STATUS: \"RELOAD_2FA_STATUS\",\n\n SHARE_ARCHIVED: \"SHARE_ARCHIVED\",\n}\n\nexport { bus, events }","import { bus } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\n\n// This is not exported\nconst base_url = process.env.VUE_APP_fileversion_service_url\n\nconst FileVersionService = {\n\n DETAILS_FULL: \"full\",\n DETAILS_BASIC: \"basic\",\n\n create_version: function(file_id, file_size, file_hash, ancestor_id, generations_arr){\n \n const payload = {\n\t\t\tfile_id: file_id,\n\t\t\tsize: file_size,\n hash: file_hash,\n ancestor_id: ancestor_id,\n generations: generations_arr\n }\n\n return bus.$http.post(base_url + \"/file_version\", payload, { headers: Utils.get_auth_header() })\n },\n\n download_version: function(file_version_id){\n const url_params = {\n id: file_version_id\n }\n return bus.$http.get(base_url + \"/download_version\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n download_latest(file_id){\n const url_params = {\n file_id: file_id\n }\n return bus.$http.get(base_url + \"/download_latest\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n get_latest_info_with_count(file_ids_arr){\n if(!Array.isArray(file_ids_arr)){\n // Make it an array if a single ID is added\n file_ids_arr = [ file_ids_arr ]\n }\n \n const payload = {\n file_ids: file_ids_arr,\n with_count: true\n }\n return bus.$http.post(base_url + \"/latest\", payload, { headers: Utils.get_auth_header() })\n },\n\n // Returns every FileVersion in order of timestamp for the given file(s)\n // You can pass either a single File ID or an array of IDs\n // Response type can be FileVersionService.DETAILS_BASIC (default) or FileVersionService.DETAILS_FULL\n get_file_history: function(file_id){\n const url_params = {\n file_id: file_id\n }\n return bus.$http.get(base_url + \"/history\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n // Reverts the file to the given FileVersion ID\n revert_file: function(file_id, previous_version_id){\n\n const payload = {\n file_id: file_id,\n version_id: previous_version_id\n }\n\n return bus.$http.put(base_url + \"/revert_file\", payload, { headers: Utils.get_auth_header() })\n },\n\n // Returns the total number of bytes used by the current company \n // (latest and previous versions of live and deleted files) \n get_company_storage_use: function(){\n return bus.$http.get(base_url + \"/info/total_storage\", { headers: Utils.get_auth_header() })\n },\n\n get_storage_history(from, to){\n let url_params = {}\n if(from){ url_params[\"from\"] = from }\n if(to){ url_params[\"to\"] = to }\n return bus.$http.get(base_url + \"/info/storage_history\", { params: url_params, headers: Utils.get_auth_header() })\n }\n \n}\n\nexport { FileVersionService }","import { bus } from '../helpers/event_bus.js'\n\n\nconst MobileDownload = {\n BASE_URL: \"https://www.sky-flok.com\",\n _ENDPOINT_URL: \"/get_url.php\",\n\n get_url(fileData, filename){\n var payload = new FormData()\n payload.append(\"userFile\", fileData, filename)\n\n return bus.$http.post(MobileDownload.BASE_URL + MobileDownload._ENDPOINT_URL, payload)\n }\n}\n\nexport { MobileDownload }","import { bus } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\n\n// This is not exported\nconst base_url = process.env.VUE_APP_storage_backend_monitor_service_url\n\nconst StorageBackendMonitorService = {\n\n report_packet_transfers(data_arr){\n return bus.$http.post(base_url + \"/measurement/batch\", data_arr, { headers: Utils.get_auth_header() })\n },\n\n report_failed_transfer(error_report){\n return bus.$http.post(base_url + \"/failure\", error_report, { headers: Utils.get_auth_header() })\n }\n\n}\n\nexport { StorageBackendMonitorService }","import { FileVersionService } from '@/services/fileversion-service.js'\nimport { MobileDownload } from '@/services/external.js'\nimport { StorageBackendMonitorService } from '@/services/storagebackendmonitor-service.js'\nimport { Utils } from '@/helpers/utils.js'\nimport AES from \"@/assets/js/aes.js\"\n\n// Define the worker location as a relative path, this will be used only in runtime\nconst worker_path = 'assets/js/workers/download_generation_worker.js'\n\nconst FILESTREAM_MIN_SIZE_MB = 500\n\n// Downloads a single file\nfunction FileDownloader() {\n\n this.ns_file = null\n this.version = null\n this.config = null\n\n this.download_worker = null\n this.download_file_reject = null\n this.cancelled = false\n\n // Returns a Promise that resolves when the file finished downloading\n this.downloadFile = (ns_file, version_id, version_obj) => {\n if(this.ns_file){ throw \"This FileDownloader instance is already downloading a file!\" }\n\n // Start the loading bar\n ns_file.loading = 0.5\n\n // Hook up the cancel function\n ns_file.cancel = () => { this.cancelDownload() }\n\n // Cache file and version\n this.ns_file = ns_file\n this.version = version_obj // TODO make sure the given version object includes the download links!\n this.mime_type = Utils.get_mime_type(Utils.get_file_extension(this.ns_file.name))\n\n return new Promise(async (resolve, reject) => {\n try{\n const before = performance.now()\n // Cache reject function so we can reject the promise when the user wants to cancel download\n this.download_file_reject = reject\n\n\n // Try to acquire a FileSystemWritableFileStream and iteratively append to a local file,\n // if the downloading file size is over the limit and the user is not trying to view it in the browser\n let filestream = null\n // TODO: When a non-current file version is being downloaded, the size-based decision is made with the current version's size\n if(this.ns_file.size > FILESTREAM_MIN_SIZE_MB*1024*1024 && !this.ns_file.preview){\n try{\n // Trigger the file save dialog, point it to the Downloads folder and pass the file name\n // https://developer.mozilla.org/en-US/docs/Web/API/FileSystemWritableFileStream\n const newHandle = await window.showSaveFilePicker({\n startIn: \"downloads\", \n suggestedName: this.ns_file.name\n });\n // create a FileSystemWritableFileStream to write to\n filestream = await newHandle.createWritable();\n\n } catch (error) {\n if(error.name == \"AbortError\"){\n this.cancelDownload()\n reject(\"cancelled\")\n return\n }\n // Else: FileSystemWritableFileStream not supported by the browser, continue and use the locally constructed blob\n }\n }\n\n if(!this.version) {\n // Load the latest or requested version if its not given\n this.version = await (version_id ? this.get_version(version_id) : await this.get_latest_version(ns_file.id))\n }\n\n // Download generations after each other\n let generations = []\n let downloaded_length = 0\n for(var i=0 ; i this.version.size){\n // Cut padding off the last generation\n const useful_length = generation_data.byteLength - (downloaded_length - this.version.size)\n generation_data = generation_data.slice(0, useful_length)\n }\n\n if(filestream){\n // Write the generation to the local file\n await filestream.write(generation_data)\n //console.log(`[filestream] wrote ${generation_data.byteLength} bytes`)\n }\n else {\n // Add the generation to the list for blob creation\n // Might run out of memory!\n generations.push(generation_data)\n }\n }\n // All generations are downloaded\n const after = performance.now()\n const time_ms = Math.round(after-before)\n const speed_kbps = Math.round((this.version.size*8) / time_ms) // kilobit per sec\n console.info(`${this.ns_file.name} downloaded in ${(time_ms/1000).toFixed(2)} sec, end-to-end speed: ${speed_kbps} kbps`)\n\n if(filestream){\n // Finish the local file\n filestream.close()\n\n resolve({\n mime_type: this.mime_type,\n size: this.version.size,\n ns_file: ns_file,\n saved_to_disk: true\n })\n }\n else {\n // Construct a single blob from the separate generations and serve it locally\n var blob = new Blob(generations, {type: this.mime_type})\n \n if(Utils.is_mobile()){\n // Ugly hack for mobile\n const file_url = await MobileDownload.get_url(blob, ns_file.name)\n .then(res => `${MobileDownload.BASE_URL}/${res.body}`)\n .catch(err => {\n console.error(\"Error getting file url: \", err)\n throw \"Error getting download URL for mobile download: \" + err\n })\n \n resolve({\n mime_type: this.mime_type,\n size: this.version.size,\n download_url: file_url,\n ns_file: ns_file\n })\n }\n else{\n // Desktop browser download, return blob url\n resolve({\n mime_type: this.mime_type,\n size: this.version.size,\n blob_url: window.URL.createObjectURL(blob),\n ns_file: ns_file\n })\n }\n }\n } catch(err){\n console.error(err)\n reject(err)\n }\n })\n },\n\n this.cancelDownload = function(){\n this.cancelled = true\n\n if(this.download_worker){\n this.download_worker.terminate()\n }\n if(this.download_file_reject){\n this.ns_file.loading = false\n delete this.ns_file.cancel\n this.download_file_reject({cancelled: true})\n }\n }\n\n this._download_generation = async (generation, file_version) => {\n return new Promise((resolve, reject) => {\n try{\n // Create worker to download, decode and decrypt generation\n this.download_worker = new Worker(worker_path)\n if(!this.download_worker){\n console.error(\"Download worker could not be loaded from path: \", worker_path)\n reject()\n }\n\n this.download_worker.onmessage = (msg) => {\n const message = msg.data\n\n switch(message.event){\n\n case \"bytes_downloaded\":\n {\n // Progress report, newly downloaded bytes: message.bytes\n const progress_increase_percent = (message.bytes / this.version.size) * 100 * 0.8\n this.ns_file.loading += (this.ns_file.loading + progress_increase_percent) > 100 ? 0 : progress_increase_percent\n }\n break;\n\n case \"please_decrypt_this_thx\":\n // The worker cannot use WebCrypto, try to decrypt here on the main thread\n AES.decrypt(message.data, message.iv, message.key).then(decrypt_result => {\n // Encryption successful\n const decrypted_data = decrypt_result\n try{\n this.download_worker.postMessage({\n command: 'decrypt_ready',\n data: decrypted_data,\n }, [decrypted_data])\n } catch(e){\n // Cannot transfer data, try copying\n this.download_worker.postMessage({\n command: 'decrypt_ready',\n data: decrypted_data\n })\n }\n }).catch(err => {\n console.error(\"Error decrypting data on main thread\")\n reject(err)\n })\n\n break;\n\n case \"ready\":\n this.download_worker.terminate()\n resolve(message.data)\n // Report packet transfer times asynchronously\n StorageBackendMonitorService.report_packet_transfers(message.packet_transfers)\n break;\n\n case \"failed\":\n // Download failed\n this.download_worker.terminate()\n reject();\n break;\n \n case \"report_error\":\n this.report_error(message.error)\n break;\n\n default:\n console.warn(\"Unknown event received from worker: \" + message.event)\n break;\n }\n }\n\n this.download_worker.postMessage({\n command: 'download',\n generation: generation,\n file_version: file_version\n })\n\n\n } catch(err){\n console.error(\"Error using download_gen_worker\")\n reject(err)\n }\n\n })\n }\n\n this.get_latest_version = async (file_id) => {\n return new Promise((resolve, reject) => {\n try{\n FileVersionService.download_latest(file_id).then(res => {\n if(this.cancelled){ reject({cancelled: true}) }\n resolve(res.body)\n }).catch(err => {\n console.error(\"Error downloading latest FileVersion of file #\" + file_id)\n reject(err)\n })\n } catch(err){\n console.error(\"Error calling FileVersion Service\")\n reject(err)\n }\n })\n }\n\n this.get_version = async (version_id) => {\n return new Promise((resolve, reject) => {\n try{\n FileVersionService.download_version(version_id).then(res => {\n if(this.cancelled){ reject({cancelled: true}) }\n resolve(res.body)\n }).catch(err => {\n console.error(\"Error downloading latest FileVersion #\" + version_id)\n reject(err)\n })\n } catch(err){\n console.error(\"Error calling FileVersion Service\")\n reject(err)\n }\n })\n }\n\n this.report_error = (error) => {\n StorageBackendMonitorService.report_failed_transfer(error)\n }\n\n}\n\nexport { FileDownloader }","import { bus, events } from './event_bus.js'\nimport { TokenCache } from './token-cache.js'\nimport { FileDownloader } from './file-downloader.js'\n\nimport md5 from 'md5'\nimport mimeTypes from 'mime-types'\n//import platform from \"platform\"\n\nconst Utils = {\n _cached_images: [],\n\n device_id_key: \"device_id\",\n\n flag_images: require.context('../assets/img/flags', false, /\\.png$/),\n cloud_provider_images: require.context('../assets/img/cloud_logos/350X150', false),\n client_space_images: require.context('../assets/img/client_space_logos', false, /\\.png$/),\n asset_videos: require.context('../assets/videos', false),\n\n material_colors: [\n \"red\", \"pink\", \"purple\", \"deep-purple\", \"indigo\", \"blue\", \"cyan\",\n \"teal\", \"green\", \"deep-orange\", \"brown\", \"blue-grey\"\n ],\n\n APP_COLORS: {\n 'gray-darker': '#263238',\n 'gray-dark': '#455A64',\n 'gray': '#607D8B',\n 'gray-light': '#90A4AE',\n 'gray-lighter': '#ECEFF1',\n\n 'primary': '#448AFF',\n 'success': '#4CAF50',\n 'info': '#03A9F4',\n 'warning': '#FFB300',\n 'danger': '#F44336'\n },\n\n all_colors: [\n \"red\", \"pink\", \"purple\", \"deep-purple\", \"indigo\", \"blue\", \"light-blue\", \"cyan\",\n \"teal\", \"green\", \"light-green\", \"lime\", \"yellow\", \"amber\", \"orange\", \"deep-orange\",\n \"brown\", \"blue-grey\", \"grey\"\n ],\n\n client_space_logo_base_path: \"client_space_logos/\",\n client_space_logos: [\n \"Accounting.png\",\"Insurance.png\",\n \"Notary.png\",\"Startup.png\",\n \"Architecture.png\",\"Journalist.png\",\n \"Photographer.png\",\"University.png\",\n \"Doctor.png\",\"Law_firm.png\",\n \"Researcher.png\",\"Writer.png\",\n \"Film_Producer.png\",\"Media_Designer.png\",\n \"SaaS.png\"\n ],\n \n GOOGLE_PLATFORM_JS: \"https://apis.google.com/js/platform.js\",\n \n\n show_error(html, sticky){ bus.$emit(events.ERROR, html, sticky) },\n show_warning(html, sticky){ bus.$emit(events.WARNING, html, sticky) },\n show_success(html, sticky){ bus.$emit(events.SUCCESS, html, sticky) },\n\n make_error_message(message, err){\n\n if(err && err.status && err.body && err.body.message){\n message += \": \"+err.body.message+\" \"\n }\n else{\n message += \".\"\n }\n return message\n },\n\n random_between: function(min, max){\n return Math.floor(Math.random() * max) + min\n },\n\n random_string: function(len) {\n var text = \"\";\n var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n for (var i = 0; i < len; i++){\n text += possible.charAt(Utils.random_between(0, possible.length));\n }\n return text;\n },\n\n unique_array(array_with_duplicates){\n return [...new Set(array_with_duplicates)]\n },\n\n avatar_url: function(user){\n if(!user || !user.email_address){ return '' }\n return user.avatar_url ? user.avatar_url : 'https://www.gravatar.com/avatar/' + md5(user.email_address) + '?s=200&d=identicon'\n },\n\n is_valid_email(str){\n var re = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return str ? re.test(String(str).toLowerCase()) : false;\n\n },\n\n capitalize: function(string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n },\n\n string_to_color: function(string, colors_arr){\n if(colors_arr === undefined){ colors_arr = Utils.material_colors }\n\n // Hash the string, convert hash to int, return color at int%colors_arr.length\n const hash = md5(string)\n let intval = 0;\n for (var i = 0; i < hash.length; i++) {\n intval += hash.charCodeAt(i);\n }\n return colors_arr[intval % colors_arr.length]\n },\n\n app_color_by_name(name) {\n return Utils.APP_COLORS[name]\n },\n\n path: function(orig_path_string){\n let path_segments = orig_path_string.split(\"/\")\n // Add 'Home' to the beginning\n path_segments.unshift('Home')\n //path_segments.unshift(' ')\n // Remove last item (which is the file/folder name itself)\n path_segments.pop()\n\n return path_segments.join(\" > \")\n },\n\n timestamp_ms: function(){\n //if(performance.now !== undefined) { return performance.now() }\n return new Date().getTime();\n },\n\n timestamp_sec: function() {\n return Math.round(Utils.timestamp_ms() / 1000)\n },\n\n timestamp_rel: function(timestamp){\n\n if(!Number.isInteger(timestamp)){ return timestamp }\n\n const current = Utils.timestamp_sec();\n\n var msPerMinute = 60 ;\n var msPerHour = msPerMinute * 60;\n var msPerDay = msPerHour * 24;\n var msPerMonth = msPerDay * 30;\n var msPerYear = msPerDay * 365;\n\n var elapsed = current - timestamp;\n const is_future = elapsed < 0\n elapsed = Math.abs(elapsed)\n\n let time_str = \"\"\n if (elapsed < msPerMinute) {\n return 'just now';\n }\n else if (elapsed < msPerHour) {\n const val = Math.floor(elapsed/msPerMinute)\n time_str = val + ' minute'+(val > 1 ? 's' : '')\n }\n\n else if (elapsed < msPerDay ) {\n const val = Math.floor(elapsed/msPerHour)\n time_str = val + ' hour'+(val > 1 ? 's' : '')\n }\n\n else if (elapsed < msPerMonth) {\n const val = Math.floor(elapsed/msPerDay)\n time_str = val + ' day'+(val > 1 ? 's' : '')\n }\n\n else if (elapsed < msPerYear) {\n const val = Math.floor(elapsed/msPerMonth)\n time_str = val + ' month'+(val > 1 ? 's' : '')\n }\n else {\n const val = Math.floor(elapsed/msPerYear)\n time_str = val + ' year'+(val > 1 ? 's' : '')\n }\n\n if(time_str === \"1 day\"){\n return is_future ? 'Tomorrow' : 'Yesterday'\n }\n\n return is_future ? 'In ' + time_str : time_str + ' ago'\n\n },\n\n monthNames: [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ],\n\n monthNamesShort: [\n \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"June\",\n \"July\", \"Aug\", \"Sept\", \"Oct\", \"Nov\", \"Dec\"\n ],\n\n timestamp_date: function(time){\n time = (time - 0)*1000\n var d = new Date(time)\n if(!d){ return time }\n return Utils.monthNamesShort[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear()\n },\n\n timestamp_time(time){\n time = (time - 0)*1000\n var d = new Date(time)\n let hours = d.getHours()\n hours = hours < 10 ? ('0'+hours) : hours\n let minutes = d.getMinutes()\n minutes = minutes < 10 ? ('0'+minutes) : minutes\n return hours+':'+minutes\n },\n\n to_clipboard: function(str){\n let area = document.createElement(\"textarea\")\n area.style.position = \"absolute\"\n area.style.top = \"-999px\"\n area.innerHTML = str\n\n document.body.appendChild(area)\n area.select()\n let success = false\n if(document.execCommand && document.execCommand(\"copy\")){\n Utils.show_success(\"Copied to clipboard.\")\n success = true\n }\n document.body.removeChild(area)\n\n return success\n },\n\n timestamp: function(time){\n time = (time - 0)*1000\n var d = new Date(time)\n if(!d){ return time }\n return d.toLocaleTimeString() + \", \" + d.toLocaleDateString()\n },\n\n format_bytes: function (bytes, do_round) {\n if(bytes === undefined || bytes === null || Number.isNaN(bytes)){ return bytes }\n if (do_round === undefined){ do_round = false }\n\n const kB = 1024, MB = kB*kB, GB = kB*MB, TB = kB*GB\n let result = 0.0;\n let unit = \"\";\n let frac_digits = 0;\n\n if(bytes >= TB){ result = bytes / TB; unit = \"TB\"; frac_digits = 1 }\n else if(bytes >= GB) { result = bytes / GB; unit = \"GB\"; frac_digits = 0 }\n else if(bytes >= MB) { result = bytes / MB; unit = \"MB\"; frac_digits = 0 }\n else if(bytes >= kB){ result = bytes / kB; unit = \"kB\" }\n else { result = bytes; unit = \"bytes\" }\n\n return (do_round ? Math.round(result) : ( (bytes < kB) ? result : result.toFixed(frac_digits))) + \" \" + unit\n },\n\n get_file_viewer: function(file, is_mobile_browser, browser_name){\n if(!file.extension){return null}\n\n //if(!file.mime_type){\n file.mime_type = Utils.get_mime_type(file.extension)\n //}\n\n let viewer = { 'name': false, 'label': false, 'icon_class': false }\n const type = file.mime_type && file.mime_type.split(\"/\")[0]\n // Extensions of script types which are texts but has 'application/...' mime type\n const script_extensions = [\"sh\", \"bat\", \"json\", \"js\", \"token\"]\n if(type == \"image\"){\n viewer.label = \"Image Viewer\"; viewer.name = \"image\"; viewer.icon_class = \"ion-image\"; viewer.verb = \"View\"; viewer.btn_class=\"btn-success\";\n }\n else if(type == \"video\"){\n viewer.label = \"Video Player\"; viewer.name = \"video\"; viewer.icon_class = \"ion-play\"; viewer.verb = \"Play\"; viewer.btn_class=\"btn-info\";\n }\n else if(type == \"audio\"){\n viewer.label = \"Audio Player\"; viewer.name = \"audio\"; viewer.icon_class = \"ion-headphone\"; viewer.verb = \"Play\"; viewer.btn_class=\"btn-info\";\n }\n else if(type == \"text\" || script_extensions.indexOf(file.extension.toLowerCase()) >= 0){\n viewer.label = \"Text Viewer\"; viewer.name = \"text\"; viewer.icon_class = \"ion-document-text\"; viewer.verb = \"Read\"; viewer.btn_class=\"btn-secondary\";\n }\n else if(file.mime_type == \"application/pdf\"){\n if(!is_mobile_browser || (is_mobile_browser && browser_name === 'safari')){\n // Desktop browsers and mobile Safari can open PDFs\n viewer.label = \"PDF Viewer\";\n viewer.name = \"pdf\";\n viewer.icon_class = \"ion-document-text\";\n viewer.verb = \"View PDF\";\n viewer.btn_class=\"btn-danger\";\n }\n else{\n // Other mobile browsers cannot\n return null\n }\n }\n else{\n return null\n }\n\n return viewer\n },\n\n get_mime_type: function(extension){\n return mimeTypes.lookup(extension) || \"application/octet-stream\"\n },\n\n get_device_id: function(){\n let device_id = localStorage.getItem(Utils.device_id_key, null)\n if(device_id === null){\n // First time, generate and save\n device_id = md5(Utils.random_string(10))\n localStorage.setItem(Utils.device_id_key, device_id)\n }\n return device_id\n },\n\n get_file_extension(filename){\n const last_dot_idx = filename.lastIndexOf(\".\")\n return last_dot_idx < 0 ? \"\" : filename.substr(last_dot_idx+1, filename.length)\n },\n\n filetype_img_src(extension){\n const base_url = \"assets/img/filetype_icons/Colorful/\"\n const default_img = `${base_url}file_unknown.png`\n if(!extension){\n return default_img\n }\n const supported_extensions = [\"3gp\",\"7u\",\"ae\",\"ai\",\"apk\",\"asf\",\"avi\",\"bak\",\"bmp\",\"cdr\",\"css\",\"csv\",\"divx\",\"dll\",\"doc\",\"docx\",\"dw\",\"dwg\",\"eps\",\"exe\",\"flv\",\"fw\",\"gif\",\"gz\",\"html\",\"ico\",\"iso\",\"jar\",\"jpg\",\"js\",\"mov\",\"mp3\",\"mp4\",\"mpeg\",\"pdf\",\"php\",\"png\",\"ppt\",\"pptx\",\"ps\",\"psd\",\"rar\",\"svg\",\"swf\",\"sys\",\"tar\",\"tiff\",\"txt\",\"wav\",\"zip\"]\n if(supported_extensions.indexOf(extension.toLowerCase()) >= 0){\n return `${base_url}file_${extension.toLowerCase()}.png`\n }\n const jpeg_additional_extensions = [\"jpeg\",\"jpe\",\"jif\",\"jfif\",\"jfi\"]\n if(jpeg_additional_extensions.indexOf(extension.toLowerCase()) >= 0){\n return `${base_url}file_jpg.png`\n }\n return default_img\n },\n\n cloud_provider_logo_src(filename) {\n return Utils.cloud_provider_images('./' + filename)\n },\n\n flag_img_src (countrycode) {\n return Utils.flag_images('./' + countrycode + \".png\")\n },\n\n client_space_logo_src(client_logo) {\n // client_logo is the relative file path like 'assets/img/client_space_logos/Writer.png'\n // Cut off everything before 'client_space_logos/'\n \n const start = client_logo.search(Utils.client_space_logo_base_path)\n if(start < 0) return\n \n return Utils.client_space_images('./' + (client_logo.substr(start + Utils.client_space_logo_base_path.length)) )\n },\n\n asset_video_url(video_filename) {\n return Utils.asset_videos('./' + video_filename)\n },\n\n force_download_file(file, file_url, callback, set_download, set_blank){\n // Construct a new link and click it\n var a = document.createElement(\"a\");\n a.href = file_url\n if(set_download !== false){\n a.download = file.name\n }\n if(set_blank){\n //a.target = '_BLANK'\n }\n a.style.display = \"none\"\n\n // Add it to the DOM (Chrome is okay without it, but Firefox is not)\n document.body.appendChild(a)\n\n a.click()\n setTimeout(function(){ document.body.removeChild(a) }, 1000)\n if(callback){\n callback(file)\n }\n },\n\n download_or_open_file: function(file, version_id, view_file_ready_callback, download_complete_callback, cancelled, error_callback){\n\n if(file.loading){\n console.error(\"File already loading\")\n return false\n }\n\n (new FileDownloader()).downloadFile(file, version_id).then(res => {\n file.loading = false\n if('cancel' in file){\n delete file.cancel\n }\n if(res.download_url === undefined && file.open_when_ready){\n // This callback is called only if the file was set to be opened, not downloaded\n view_file_ready_callback({\n name: file.name,\n viewer: file.viewer,\n mime_type: res.mime_type,\n blob_url: res.blob_url\n })\n file.open_when_ready = false\n }\n else{\n \n if(!res.saved_to_disk){\n // Save blob locally\n Utils.force_download_file(file, res.download_url || res.blob_url, download_complete_callback, true, true)\n }\n }\n })\n .catch(err => {\n // Catch errors\n file.loading = false\n if('cancel' in file){\n delete file.cancel\n cancelled()\n }\n\n if(!err || !('cancelled' in err)){\n Utils.show_error(\"Error downloading \"+file.name + \", please try again later!\" )\n console.error(\"Download error: \", err)\n // TODO report error\n if(error_callback){\n error_callback(err)\n }\n }\n })\n },\n\n\n /**\n * Sorts an array of objects by an attribute or sub-attribute.\n * Usage: Utils.sort(locations, 'distance', true) or Utils.sort(locations, 'provider.id', false)\n * @param {Array} array The array of objects to sort\n * @param {String} sort_attr Which object attribute (e.g. 'id' or 'provider.id') to sort by\n * @param {Boolean} is_asc Sort order, default ascending\n * @returns {Array} A sorted copy of the array\n */\n sort_objects(array, sort_attr, is_asc){\n is_asc = (is_asc === undefined) ? true : is_asc\n if(!array){return array}\n return array.sort( (_a, _b) => {\n let a = _a[sort_attr];\n let b = _b[sort_attr];\n \n\n if(sort_attr.length >= 3 && sort_attr.indexOf('.') >= 0){\n // If listed by a sub-attribute\n const dot_idx = sort_attr.indexOf('.')\n const outer_key = sort_attr.slice(0, dot_idx)\n const inner_key = sort_attr.slice(dot_idx+1)\n\n if(outer_key.length && inner_key.length && outer_key in _a && _a[outer_key] && outer_key in _b && _b[outer_key] && inner_key in _a[outer_key] && inner_key in _b[outer_key]){\n const tmp = _a[outer_key]\n a = tmp[inner_key]\n\n const tmp2 = _b[outer_key]\n b = tmp2[inner_key]\n }\n }\n \n if(typeof a == \"string\"){ a = a.toLowerCase(); b = b.toLowerCase(); }\n const lg = is_asc ? -1 : 1;\n if(a < b){ return lg; }\n if(a > b){ return -1*lg }\n return 0;\n })\n },\n\n sort_by_name(_a, _b){\n let a = _a.name;\n let b = _b.name;\n if(typeof a == \"string\"){ a = a.toLowerCase(); b = b.toLowerCase(); }\n if(a < b){ return -1; }\n if(a > b){ return 1 }\n return 0;\n },\n\n\n parse_url_param(param_name, default_value, urldecode){\n if(urldecode === undefined){ urldecode = true }\n if(default_value === undefined){ default_value = false }\n const url = new URL(window.location);\n const params_arr = (url.search.substring(1)).split('&')\n for(var i=0 ; i 0 && pair[0] === param_name){\n if(pair.length > 1){ return urldecode ? decodeURIComponent(pair[1]) : pair[1] }\n return true\n }\n }\n return default_value;\n },\n\n get_auth_header(){ return TokenCache.is_stored() ? { \"Authorization\": \"Bearer \" + TokenCache.get() } : {} },\n\n // Return array of string values, or NULL if CSV string not well formed.\n csv_to_array(text) {\n try{\n let p = '', row = [''], ret = [row], i = 0, r = 0, s = !0, l;\n for (l of text) {\n if ('\"' === l) {\n if (s && l === p) row[i] += l;\n s = !s;\n } else if ((',' === l || ';' === l) && s) l = row[++i] = '';\n else if ('\\n' === l && s) {\n if ('\\r' === p) row[i] = row[i].slice(0, -1);\n row = ret[++r] = [l = '']; i = 0;\n } else row[i] += l;\n p = l;\n }\n return ret;\n } catch (e){\n console.error(\"Error parsing CSV: \", e)\n }\n },\n\n is_mobile(){\n return screen.width < 768; \n //return platform.os.family && ['android', 'ios', 'windows phone'].indexOf(platform.os.family.toLowerCase()) >= 0\n },\n\n partially_redact_email(email_address){\n \n /*\n Hides most of the email address, leaving enough characters readable that the owner can identify it.\n For example:\n marcell@chocolate-cloud.cc -> ma*****@ch*************.cc\n mac@one.com -> m**@o**.com\n */\n\n if(!Utils.is_valid_email(email_address)){\n return false\n }\n\n const email_parts = email_address.split('@')\n if(email_parts.length != 2){\n return false\n }\n\n let front = email_parts[0]\n let domain = email_parts[1]\n\n let domain_parts = domain.split('.')\n if(domain_parts.length < 2){\n return false\n }\n\n // Keep the logarithm of the front length (but at least 1)\n let characters_to_keep = Math.max(1, Math.round(Math.log2(front.length)))\n // Keep this many characters of the front and replace the rest with stars\n //front = front[:characters_to_keep] + len(front[characters_to_keep:])*'*'\n front = _redact_after_idx(front, characters_to_keep)\n \n \n // Keep the TLD intact, redact the part of the domain before it\n const tld = domain_parts.pop()\n domain_parts = domain_parts.join('')\n characters_to_keep = Math.max(1, Math.round(Math.log2(domain_parts.length)))\n //domain_to_redact = domain_to_redact[:characters_to_keep] + len(domain_to_redact[characters_to_keep:])*'*'\n domain_parts = _redact_after_idx(domain_parts, characters_to_keep)\n domain = domain_parts + '.' + tld\n\n return front + '@' + domain\n },\n\n scroll_top(){\n window.scroll({\n top: 0, \n left: 0, \n behavior: 'smooth'\n });\n },\n\n round_up_100(num){\n return Math.round(num/100) * 100\n },\n\n loadScript(src){\n return new Promise(function (resolve, reject) {\n let shouldAppend = false;\n let el = document.querySelector('script[src=\"' + src + '\"]');\n if (!el) {\n el = document.createElement('script');\n el.type = 'text/javascript';\n el.async = true;\n el.src = src;\n shouldAppend = true;\n }\n else if (el.hasAttribute('data-loaded')) {\n resolve(el);\n return;\n }\n \n el.addEventListener('error', reject);\n el.addEventListener('abort', reject);\n el.addEventListener('load', function loadScriptHandler() {\n el.setAttribute('data-loaded', true);\n resolve(el);\n });\n \n if (shouldAppend) document.head.appendChild(el);\n });\n },\n\n unloadScript(src){ // eslint-disable-line no-param-reassign\n return new Promise(function (resolve, reject) {\n const el = document.querySelector('script[src=\"' + src + '\"]');\n \n if (!el) {\n reject();\n return;\n }\n document.head.removeChild(el);\n resolve();\n });\n },\n\n avg(arr) {\n return arr && arr.length ? arr.reduce((a, b) => a + b, 0) / arr.length : 0\n },\n\n add_gps_noise(coords){\n const noise_max = 0.5\n return {\n lat: coords.lat + (Math.random() * (2*noise_max)) - noise_max,\n lng: coords.lng + (Math.random() * (2*noise_max)) - noise_max,\n }\n },\n\n highlight_search(string, search_str){\n if(!search_str){\n return string\n }\n return string.replace(new RegExp(search_str, \"gi\"), match => {\n return '' + match + ' ';\n });\n },\n}\n\n//Utils.cache_space_logos()\n\nfunction _redact_after_idx(str, idx){ \n let i = 0;\n return str.split('').map(ch => {\n ++i;\n return i > idx ? '*' : ch\n }).join('') } \n\nexport { Utils }","import { bus } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\n\n\n// This is not exported\nconst base_url = process.env.VUE_APP_auth_service_url\n\n\nconst AuthService = {\n\n ROLE_TEAM_ADMIN: \"OA\",\n ROLE_TEAM_MEMBER: \"EM\",\n ROLE_OPERATOR: \"OP\",\n\n MFA_MODE_APP: 1,\n MFA_MODE_SMS: 2,\n\n\n login(credentials, device_id, os, client_name, client_version){\n\n const payload = new FormData()\n if(credentials.email){\n payload.append(\"email_address\", credentials.email)\n }\n if(credentials.password){\n payload.append(\"password\", credentials.password)\n }\n if(credentials.google_id_token){\n payload.append(\"google_id_token\", credentials.google_id_token)\n }\n if(credentials.mfa_backup_code){\n payload.append(\"mfa_backup_code\", credentials.mfa_backup_code)\n }\n if(credentials.mfa_code){\n payload.append(\"mfa_code\", credentials.mfa_code)\n }\n \n payload.append(\"device_id\", device_id)\n payload.append(\"client_os\", os)\n payload.append(\"client_name\", client_name)\n payload.append(\"client_version\", client_version)\n\n return bus.$http.post(base_url + \"/login\", payload)\n },\n\n authenticate_token: function(token){\n const headers = {\n \"Authorization\": \"Bearer \" + token\n }\n return bus.$http.get(base_url + \"/authenticate\", { headers: headers })\n },\n\n logout: function(){\n return bus.$http.get(base_url + \"/logout\", { headers: Utils.get_auth_header() })\n\t},\n\n get_pending_registration(challenge){\n const url_params = {\n challenge: challenge\n }\n return bus.$http.get(base_url + \"/get_pending_registration\", { params: url_params })\n },\n\n\tconfirm_primary_email: function(confirm_key){\n\t\tconst url_params = {\n\t\t\tchallenge: confirm_key\n\t\t}\n\t\treturn bus.$http.get(base_url + \"/confirm_registration\", { params: url_params })\n },\n \n confirm_invited_registration(payload){\n \n return bus.$http.post(base_url + \"/confirm_invited_registration\", payload)\n },\n\n change_password: function(current_password, new_password){\n let payload = new FormData()\n payload.append(\"current_password\", current_password)\n payload.append(\"new_password\", new_password)\n\n\n return bus.$http.post(base_url + \"/change_password\", payload, { headers: Utils.get_auth_header() })\n },\n\n change_password_admin: function(user_id, password){\n // OA is allowed to change the password of any user under the company account\n let payload = new FormData()\n payload.append(\"user_id\", user_id)\n payload.append(\"new_password\", password)\n\n return bus.$http.post(base_url + \"/change_password/admin\", payload, { headers: Utils.get_auth_header() })\n },\n\n resend_confirmation_email(user_id, user_name=null){\n let payload = new FormData()\n payload.append(\"user_id\", user_id)\n if(user_name){ payload.append(\"user_name\", user_name) }\n\n return bus.$http.post(base_url + \"/resend_confirmation_email\", payload, { headers: Utils.get_auth_header() })\n },\n\n get_active_sessions: function(){\n return bus.$http.get(base_url + \"/session/list\", { headers: Utils.get_auth_header() })\n },\n\n kill_session: function(session_id){\n let payload = new FormData()\n payload.append(\"session_id\", session_id)\n\n return bus.$http.put(base_url + \"/session/invalidate\", payload, { headers: Utils.get_auth_header() })\n },\n\n get_user_roles_batch: function(user_ids){\n return bus.$http.get(base_url + \"/roles_of_users?ids=\"+user_ids.join(\",\"), { headers: Utils.get_auth_header() })\n },\n\n suspend_user: function(user_id, new_value){\n let payload = new FormData()\n payload.append(\"user_id\", user_id)\n payload.append(\"new_value\", new_value)\n return bus.$http.post(base_url + \"/user/is_suspended\", payload, { headers: Utils.get_auth_header() })\n },\n\n grant_role: function(user_id, role_code){\n let payload = new FormData()\n payload.append(\"user_id\", user_id)\n payload.append(\"role\", role_code)\n return bus.$http.post(base_url + \"/grant_role\", payload, { headers: Utils.get_auth_header() })\n },\n\n revoke_role: function(user_id, role_code){\n let url_params = {\n user_id: user_id,\n role: role_code\n }\n return bus.$http.delete(base_url + \"/revoke_role\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n delete_user: function(user_id){\n return bus.$http.delete(base_url + \"/user?user_id=\"+user_id, { headers: Utils.get_auth_header() })\n },\n\n get_2fa_status(){\n return bus.$http.get(base_url + \"/2fa/status\", { headers: Utils.get_auth_header() })\n },\n\n setup_2fa(config){\n return bus.$http.post(base_url + \"/2fa/setup\", config, { headers: Utils.get_auth_header() })\n },\n\n verify_2fa_code(code){\n const payload = {\n code: code\n }\n return bus.$http.post(base_url + \"/2fa/verify_code\", payload, { headers: Utils.get_auth_header() })\n },\n\n get_2fa_url(){\n return bus.$http.get(base_url + \"/2fa/get_app_url\", { headers: Utils.get_auth_header() })\n },\n\n get_2fa_recovery_codes(){\n return bus.$http.get(base_url + \"/2fa/get_recovery_codes\", { headers: Utils.get_auth_header() })\n },\n \n generate_2fa_recovery_codes(){\n return bus.$http.get(base_url + \"/2fa/generate_recovery_codes\", { headers: Utils.get_auth_header() })\n },\n\n disable_2fa(password){\n const payload = {\n password: password,\n chaos: Utils.random_string(Utils.random_between(10, 30))\n }\n\n return bus.$http.post(base_url + \"/2fa/delete\", payload, { headers: Utils.get_auth_header() })\n },\n\n\n \n}\n\n\nexport { AuthService }","import { bus } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\n\n// This is not exported\nconst base_url = process.env.VUE_APP_namespace_service_url\n\nconst NamespaceService = {\n\n ENTITY_TYPE_FOLDER: \"FOLDER\",\n ENTITY_TYPE_FILE: \"FILE\",\n\n NS_TYPE_ADMIN_FOLDER: 'admin_folder',\n NS_TYPE_DEFAULT: 'default',\n NS_TYPE_CLIENT_SPACE: 'client-space',\n\n NS_KEY_HEADER: 'X-NS-Key',\n NS_KEY_OLD_HEADER: 'ns_key',\n\n ns_type: null,\n ns_key: null,\n\n // Lists contents of a folder\n list(folderId) {\n let url_params = {}\n let headers = Utils.get_auth_header()\n\n if(folderId && folderId > 0){ url_params[\"folder_id\"] = folderId }\n if(this.ns_type !== NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n\n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n return bus.$http.get(base_url + \"/list\", { params: url_params, headers: headers })\n },\n\n // Lists deleted files of a given folder\n\tlist_deleted(folder_id){\n\t\tlet url_params = {\n deleted: '1',\n all: '1',\n with_path: '1'\n };\n let headers = Utils.get_auth_header()\n\n if(folder_id){ url_params.folder_id = folder_id}\n if(this.ns_type !== NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type\n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n\t\treturn bus.$http.get(base_url + \"/list\", { params: url_params, headers: headers })\n\t},\n\n /**\n * Lists the complete contents of a namespace. By default it's listing\n * the current namespace, but you can override the ns type and key for\n * just this one request.\n * \n * @param {boolean} folders_only When set to True, only folders of the ns are returned\n * @param {string} ns_type_override Set a custom namespace type\n * @param {string} ns_key_override Set a custom namespace key\n * @returns {array} The requested contents, or error if the caller doesn't have access to the requested ns\n */\n get_all_namespace(folders_only, ns_type_override, ns_key_override){\n if(folders_only === undefined){\n folders_only = false\n }\n\n let url_params = {\n all: '1',\n deleted: '0',\n folders_only: folders_only ? '1' : '0'\n }\n let headers = Utils.get_auth_header()\n\n if(ns_type_override || this.ns_type != NamespaceService.NS_TYPE_DEFAULT){\n const ns_type = ns_type_override ? ns_type_override : this.ns_type\n url_params[\"ns_type\"] = ns_type\n }\n if(ns_key_override || this.ns_key){\n const ns_key = ns_key_override ? ns_key_override : this.ns_key\n headers[NamespaceService.NS_KEY_HEADER] = ns_key\n headers[NamespaceService.NS_KEY_OLD_HEADER] = ns_key\n }\n\n return bus.$http.get(base_url + \"/list\", { params: url_params, headers: headers })\n },\n\n // List files by ID.\n get_files_by_id(file_ids, with_path){\n let url_params = {\n with_path: with_path === true ? '1' : '0'\n }\n // Send file IDs in the POST payload\n const payload = {\n id: file_ids\n }\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n\n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n \n return bus.$http.post(base_url + \"/details\", payload, { params: url_params, headers: headers })\n },\n\n resolve_path: function(path_string){\n let url_params = {\n path: path_string\n }\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n return bus.$http.get(base_url + \"/parse_path\", { params: url_params, headers: headers })\n },\n\n // Creates a new file\n create_file: function(filename, parent_id, mime_type){\n let payload = {\n \"name\": filename,\n \"mime_type\": mime_type\n }\n if(parent_id && parent_id >= 0){\n payload[\"parent_id\"] = parent_id\n }\n let url_params = {}\n let headers = Utils.get_auth_header()\n\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n return bus.$http.post(base_url + \"/file\", payload, { params: url_params, headers: headers })\n },\n\n delete_entity(id){\n const payload = {\n \"id\": id\n }\n let url_params = {}\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\t\treturn bus.$http.put(base_url + \"/delete\", payload, { params: url_params, headers: headers })\n },\n\n\tdelete_file(file_id){\n\t\treturn NamespaceService.delete_entity(file_id)\n },\n delete_folder(folder_id){\n return NamespaceService.delete_entity(folder_id)\n },\n\n undelete_entity(id, target_id){\n let payload = { \"id\": id }\n if(target_id){ payload[\"target_id\"] = target_id }\n\n let url_params = {}\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n return bus.$http.put(base_url + \"/undelete\", payload, { params: url_params, headers: headers })\n },\n undelete_file: function(file_id){\n return NamespaceService.undelete_entity(file_id)\n },\n undelete_folder: function(folder_id){\n return NamespaceService.undelete_entity(folder_id)\n },\n\n create_folder(foldername, parent_id){\n let payload = {\n \"name\": foldername\n }\n if(parent_id){\n payload[\"parent_id\"] = parent_id\n }\n\n let url_params = {}\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n return bus.$http.post(base_url + \"/folder\", payload, { params: url_params, headers: headers })\n },\n\n create_folders(folder_paths, parent_id){\n let payload = {\n \"paths\": folder_paths\n }\n if(parent_id){\n payload[\"parent_id\"] = parent_id\n }\n let url_params = {}\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n return bus.$http.post(base_url + \"/folder/batch\", payload, { params: url_params, headers: headers })\n },\n\n rename_file(file_id, new_name){\n const payload = {\n \"id\": file_id,\n \"name\": new_name\n }\n\n let url_params = {}\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n\t\treturn bus.$http.put(base_url + \"/rename\", payload, { params: url_params, headers: headers })\n },\n\n move_entity(id, target_folder_id, target_ns_type, target_ns_key){\n let payload = {\n \"id\": id,\n \"target_id\": target_folder_id\n }\n if(target_ns_type !== undefined){\n payload[\"target_ns_type\"] = target_ns_type\n }\n if(target_ns_key !== undefined){\n payload[\"target_ns_key\"] = target_ns_key\n }\n\n let url_params = {}\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n return bus.$http.put(base_url + \"/move\", payload, { params: url_params, headers: headers })\n },\n move_file(file_id, target_folder_id, target_ns_type, target_ns_key){\n return NamespaceService.move_entity(file_id, target_folder_id, target_ns_type, target_ns_key)\n },\n\n move_folder(folder_id, target_folder_id, target_ns_type, target_ns_key){\n return NamespaceService.move_entity(folder_id, target_folder_id, target_ns_type, target_ns_key)\n },\n\n copy_file: function(file_id, new_parent_id){\n\n let payload = {\n \"id\": file_id,\n \"target_id\": new_parent_id\n }\n\n let url_params = {}\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n\n\t\treturn bus.$http.put(base_url + \"/copy\", payload, { params: url_params, headers: headers })\n },\n\n search: function(search_string){\n const url_params = {\n query: search_string\n }\n\n let headers = Utils.get_auth_header()\n if(this.ns_type && this.ns_type != NamespaceService.NS_TYPE_DEFAULT){ \n url_params[\"ns_type\"] = this.ns_type \n if(this.ns_key){ \n headers[NamespaceService.NS_KEY_HEADER] = this.ns_key \n headers[NamespaceService.NS_KEY_OLD_HEADER] = this.ns_key \n }\n }\n return bus.$http.get(base_url + \"/search\", { params: url_params, headers: headers })\n }\n\n}\n\nexport { NamespaceService }","import { bus, events } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\n\n\n// This is not exported\nconst base_url = process.env.VUE_APP_share_service_url\n\nconst ShareService = {\n\n SHARE_TYPE_FILE: 0,\n SHARE_TYPE_FOLDER: 1,\n\n SHARE_APP_PATH: \"share\",\n\n get_active_shares: function(){\n return bus.$http.get(base_url + \"/shares\", { headers: Utils.get_auth_header() })\n },\n\n create_file_share: function(file_ids, share_name, message, expire_days, is_psw_protected, download_limit){\n if(!Array.isArray(file_ids)){ file_ids = [ file_ids ] }\n\n const payload = {\n files: file_ids,\n type: ShareService.SHARE_TYPE_FILE,\n name: share_name,\n message: message,\n expire_days: expire_days,\n password_protected: is_psw_protected,\n download_limit: download_limit\n }\n\n return bus.$http.post(base_url + \"/share\", payload, { headers: Utils.get_auth_header() })\n },\n\n create_folder_share: function(folder_id, share_name, message, expire_days, is_psw_protected, download_limit){\n const payload = {\n folder: folder_id,\n type: ShareService.SHARE_TYPE_FOLDER,\n name: share_name,\n message: message,\n expire_days: expire_days,\n password_protected: is_psw_protected\n }\n\n return bus.$http.post(base_url + \"/share\", payload, { headers: Utils.get_auth_header() })\n },\n\n get_shares_num: function(ids){\n if(!Array.isArray(ids)){ ids = [ ids ] }\n const url_params = {\n fileids: ids.join(',')\n }\n return bus.$http.get(base_url + \"/share/active_for_files\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n get_shares_of_file: function(file_id){\n const url_params = {\n file_id: file_id\n }\n return bus.$http.get(base_url + \"/share/list_active_shares_for_file\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n add_file_to_share: function(share_id, ids){\n if(!Array.isArray(ids)){ ids = [ ids ] }\n\n const payload = {\n files: ids\n }\n\n return bus.$http.post(base_url + \"share/file?shareid=\"+share_id, payload, { headers: Utils.get_auth_header() })\n },\n\n revoke_share: function(share_id){\n const url_params = {\n share_id: share_id\n }\n return bus.$http.get(base_url + \"/share/revoke\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n activate_revoked_share: function(share_id){\n const url_params = {\n share_id: share_id\n }\n return bus.$http.get(base_url + \"/share/activate_revoked\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n\n delete_share: function(share_id){\n return bus.$http.delete(base_url + \"/share?shareid=\"+share_id, { headers: Utils.get_auth_header() })\n },\n\n get_share_by_key: function(share_key, password, with_locations){\n let url_params = {\n key: share_key,\n now: new Date().getTime(),\n\n }\n const headers = {\n \"Authorization\": \"Password \" + password\n }\n if(with_locations != undefined){\n url_params.with_locations = with_locations ? 1 : 0\n }\n return bus.$http.get(base_url + \"/share/by_key\", { params: url_params, headers: headers })\n },\n\n download_file_by_key: function(file_id, share_key, password){\n let url_params = {\n key: share_key,\n file_id: file_id,\n now: new Date().getTime()\n }\n const headers = {\n \"Authorization\": \"Password \" + password\n }\n return bus.$http.get(base_url + \"/share/by_key\", { params: url_params, headers: headers })\n },\n\n get_subfolder_by_key(share_key, password, subfolder_id){\n let url_params = {\n key: share_key,\n folder_id: subfolder_id,\n now: new Date().getTime()\n }\n const headers = {\n \"Authorization\": \"Password \" + password\n }\n return bus.$http.get(base_url + \"/share/by_key\", { params: url_params, headers: headers })\n }\n\n}\n\n\nexport { ShareService }\n\n\n/* **************************************************************************************** */\n// Install HTTP interceptor for requests going to FileVersion to get the latest version with\n// packet links. The file IDs received by Share App are obfuscated by Share Service,\n// and only Share Service knows what was the original ID, and proxy the request to FileVersion.\n/* **************************************************************************************** */\n\nimport Vue from 'vue'\nimport VueResource from 'vue-resource';\nVue.use(VueResource)\n\nconst share_key = Utils.parse_url_param('key')\n\nconst BASE_PATH = process.env.VUE_APP_BASE_PATH + '/'\nconst full_path = window.location.pathname\nconst relative_path = full_path.slice(BASE_PATH.length, full_path.length)\n\nif(relative_path === ShareService.SHARE_APP_PATH && share_key && share_key.length > 0){\n // Share App\n\n const requests_to_redirect = [\n\n {\n /* Get download links to the latest version of the file */\n base_url: process.env.VUE_APP_fileversion_service_url,\n method: \"GET\",\n service: \"file_version\",\n path: \"download_latest\"\n },\n ]\n\n Vue.http.interceptors.push( (request, next) => {\n const request_url = new URL(request.url)\n // Check if the request is one of the ones we want to redirect\n requests_to_redirect.forEach(rule => {\n const is_same_service = rule.base_url.toUpperCase() === request_url.origin.toUpperCase()\n const is_same_method = rule.method.toUpperCase() === request.method.toUpperCase()\n const is_same_endpoint = '/' + rule.path.toUpperCase() === request_url.pathname.toUpperCase()\n\n if(is_same_service && is_same_endpoint && is_same_method){\n if(rule.block){\n request.url = false\n }\n else{\n if(rule.service === 'file_version' && rule.path === 'download_latest'){\n // Use ShareService endpoint instead\n request.url = base_url + \"/share/by_key?key=\"+share_key\n // Add password\n const share_psw = localStorage.getItem(\"share-\" + share_key)\n if(share_psw){\n request.headers.set('Authorization', 'Password ' + localStorage[\"share-\" + share_key])\n }\n }\n }\n }\n })\n if(!request.url){ return false }\n // return response callback\n next(response =>{\n if(response.status === 410){\n bus.$emit(events.SHARE_ARCHIVED, share_key)\n }\n });\n\n\n })\n}","import { bus } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\n\n// This is not exported\nconst base_url = process.env.VUE_APP_storage_backend_service_url\n\n\nconst CloudProviderService = {\n list(){\n return bus.$http.get(base_url + \"/providers\", { headers: Utils.get_auth_header() })\n }\n}\n\nconst StorageLocationService = {\n list(){\n return bus.$http.get(base_url + \"/backends\", { headers: Utils.get_auth_header() })\n },\n\n list_my_team_locations(){\n return bus.$http.get(base_url + \"/backends/my_team\", { headers: Utils.get_auth_header() })\n }\n}\n\nconst StorageBackendService = {\n\n get_buckets(){\n return bus.$http.get(base_url + \"/buckets\", { headers: Utils.get_auth_header() })\n },\n\n get_suggested_locations(invite_code){\n return bus.$http.get(base_url + \"/suggest_locations/invite/\"+(invite_code || ''))\n },\n\n get_all_locations_with_distance(include_markers){\n include_markers = (include_markers === undefined) ? false : include_markers\n let url_params = {}\n if(include_markers){\n url_params['include_markers'] = 1\n }\n return bus.$http.get(base_url + \"/all_locations_with_distance\", url_params)\n },\n\n\n\tteam_backend_setup(backend_ids){\n\n\t\tlet payload = {\n\t\t\tbackends: []\n\t\t};\n\t\tbackend_ids.forEach( id => {\n\t\t\tpayload.backends.push({ id: id })\n\t\t}, this);\n\n\t\treturn bus.$http.post(base_url + \"/customer_setup\", payload, { headers: Utils.get_auth_header() })\n },\n\n send_bugreport(text, reply_requested){\n const payload = {\n text: text,\n reply_requested: reply_requested\n }\n return bus.$http.post(base_url + \"/bugreport\", payload, { headers: Utils.get_auth_header() })\n },\n\n get_upload_links(object_name_base, generations_num){\n const payload = {\n object_name_base: object_name_base,\n generations_num: generations_num\n }\n return bus.$http.post(base_url + \"/get_upload_links\", payload, { headers: Utils.get_auth_header() })\n },\n\n}\n\nexport { CloudProviderService, StorageLocationService, StorageBackendService }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert top-alert\",class:_vm.get_class()},[_c('div',{domProps:{\"innerHTML\":_vm._s(_vm.html)}}),_c('i',{staticClass:\"ion-close-round\",attrs:{\"title\":\"close\"},on:{\"click\":function($event){_vm.visible = false}}})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./global-alert.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./global-alert.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./global-alert.vue?vue&type=template&id=f0e2570e&scoped=true\"\nimport script from \"./global-alert.vue?vue&type=script&lang=js\"\nexport * from \"./global-alert.vue?vue&type=script&lang=js\"\nimport style0 from \"./global-alert.vue?vue&type=style&index=0&id=f0e2570e&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f0e2570e\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"nowrap d-inline-block\"},[(!_vm.is_narrow_screen)?_c('section',[(_vm.loading)?_c('i',{staticClass:\"ion-load-c spin text-muted mr-2\"}):_vm._e(),_c('span',{on:{\"mouseover\":function($event){_vm.search_focused = true},\"mouseout\":function($event){_vm.search_focused = false},\"focus\":function($event){_vm.search_focused = true},\"blur\":function($event){_vm.search_focused = false}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.search_term),expression:\"search_term\"}],staticClass:\"form-control\",class:{'wide': _vm.wide_search, 'hidden': _vm.hideinput},attrs:{\"type\":\"text\",\"name\":\"skyflok-search\",\"id\":\"skyflok-search-input\",\"placeholder\":_vm.placeholder || 'Search Team Files'},domProps:{\"value\":(_vm.search_term)},on:{\"input\":function($event){if($event.target.composing)return;_vm.search_term=$event.target.value}}}),(_vm.search_term != '')?_c('i',{staticClass:\"ion-close-round c-pointer\",staticStyle:{\"margin-left\":\"-20px\"},on:{\"click\":function($event){_vm.search_term = ''; _vm.search_focused = false}}}):_vm._e(),_c('button',{staticClass:\"ml-2 btn btn-secondary btn-gradient ion-search\",attrs:{\"id\":\"searchbutton\"},on:{\"click\":($evt) => $evt.target.parentNode.children[0].focus()}})]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.search_term != '' && _vm.results),expression:\"search_term != '' && results\"}],staticClass:\"list-group mb-4 search_results shadow-z5\"},_vm._l((_vm.results),function(result){return _c('a',{key:result.id,staticClass:\"list-group-item\",attrs:{\"href\":\"#\",\"title\":(result.entity_type == _vm.FOLDER_TYPE ? ('Navigate to ' + result.path) : ('Show '+result.name))},on:{\"click\":function($event){$event.preventDefault();return _vm.search_result_clicked(result)}}},[_c('div',{staticClass:\"text-center\",staticStyle:{\"width\":\"40px\"}},[(result.entity_type == _vm.FOLDER_TYPE)?_c('i',{staticClass:\"ion-folder\"}):_vm._e(),(result.entity_type == _vm.FILE_TYPE)?_c('img',{staticClass:\"file-icon\",attrs:{\"src\":_vm._f(\"filetype_img_src\")(result.extension)}}):_vm._e()]),_c('div',{staticClass:\"ml-2 text-left\"},[_c('div',{staticClass:\"badge mr-2 bg-primary\"},[_vm._v(_vm._s(_vm._f(\"path\")(result.path)))]),_c('div',{},[_c('strong',[_vm._v(_vm._s(result.name))])])])])}),0)]):_c('section',[_c('button',{staticClass:\"btn btn-secondary btn-gradient\",on:{\"click\":function($event){return _vm.open_search_dialog()}}},[_c('i',{staticClass:\"ion-search\"})]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"search-modal\"}},[_c('div',{staticClass:\"modal-dialog modal-lg cardbox mt-5\",staticStyle:{\"overflow\":\"auto\",\"box-shadow\":\"none\"}},[_c('div',{staticClass:\"pb-1 bg-gradient-info\"}),_c('div',{staticClass:\"modal-content\",staticStyle:{\"border\":\"none\"}},[_c('div',{staticClass:\"modal-body\"},[_vm._m(0),_c('div',[_c('div',{staticClass:\"d-flex align-items-center\"},[_c('b',{staticClass:\"text-12\"},[_vm._v(_vm._s(_vm.placeholder || 'Search Team Files'))]),(_vm.loading)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):(_vm.search_term != '')?_c('span',{staticClass:\"badge badge-info ml-2\"},[_vm._v(_vm._s(_vm.results.length)+\" result\"+_vm._s(_vm.results.length === 1 ? '' : 's'))]):_vm._e()]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.search_term),expression:\"search_term\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"name\":\"skyflok-search\",\"id\":\"skyflok-search-input\",\"placeholder\":\"Search for file or folder name\"},domProps:{\"value\":(_vm.search_term)},on:{\"input\":function($event){if($event.target.composing)return;_vm.search_term=$event.target.value}}})]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.search_term != '' && _vm.results),expression:\"search_term != '' && results\"}],staticClass:\"list-group search_results\",staticStyle:{\"position\":\"relative\"}},_vm._l((_vm.results),function(result){return _c('a',{key:result.id,staticClass:\"list-group-item\",attrs:{\"href\":\"#\",\"title\":(result.entity_type == _vm.FOLDER_TYPE ? ('Navigate to ' + result.path) : ('Show '+result.name))},on:{\"click\":function($event){$event.preventDefault();return _vm.search_result_clicked(result)}}},[_c('div',{staticClass:\"text-center\",staticStyle:{\"width\":\"40px\"}},[(result.entity_type == _vm.FOLDER_TYPE)?_c('i',{staticClass:\"ion-folder\"}):_vm._e(),(result.entity_type == _vm.FILE_TYPE)?_c('img',{staticClass:\"file-icon\",attrs:{\"src\":_vm._f(\"filetype_img_src\")(result.extension)}}):_vm._e()]),_c('div',{staticClass:\"ml-2 text-left\"},[_c('div',{staticClass:\"badge mr-2 bg-primary\"},[_vm._v(_vm._s(_vm._f(\"path\")(result.path)))]),_c('div',{},[_c('strong',[_vm._v(_vm._s(result.name))])])])])}),0)])])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\",\"data-dismiss\":\"modal\"}},[_c('span',[_vm._v(\"×\")])])\n}]\n\nexport { render, staticRenderFns }","\n \n
\n
\n \n\n \n \n
\n
\n
\n
\n
× \n
\n
\n {{ placeholder || 'Search Team Files' }} \n \n {{ results.length }} result{{ results.length === 1 ? '' : 's' }} \n
\n
\n
\n
\n
\n
\n
\n
\n \n\n\n\n
\n\n\n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./search-box.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./search-box.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./search-box.vue?vue&type=template&id=3be428ac&scoped=true\"\nimport script from \"./search-box.vue?vue&type=script&lang=js\"\nexport * from \"./search-box.vue?vue&type=script&lang=js\"\nimport style0 from \"./search-box.vue?vue&type=style&index=0&id=3be428ac&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3be428ac\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.locations && _vm.locations.length > 0)?_c('section',[(!_vm.disable_popover)?_c('div',{staticClass:\"d-inline-block text-center fw c-help\",attrs:{\"data-toggle\":\"popover\",\"data-html\":\"true\",\"data-title\":\"Data Location\",\"data-trigger\":\"hover\",\"data-placement\":_vm.placement || 'right',\"data-content\":_vm.popover_content}},_vm._l((_vm.locations_sorted),function(location){return _c('img',{key:location.id,staticClass:\"mx-1\",class:{'thumb32 rounded-circle rounded-circle img-thumbnail': _vm.circles},attrs:{\"src\":_vm.Utils.flag_img_src(location.countrycode)}})}),0):_c('div',{staticClass:\"fw text-center c-pointer\",on:{\"click\":function($event){return _vm.open_modal()}}},[_vm._l((_vm.locations_sorted),function(location){return _c('img',{key:location.id,staticClass:\"mx-1\",class:{'thumb32 rounded-circle rounded-circle img-thumbnail': _vm.circles},attrs:{\"src\":_vm.Utils.flag_img_src(location.countrycode)}})}),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"data-locations-modal\"}},[_c('div',{staticClass:\"modal-dialog\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title text-bold\"},[_vm._v(\"Data location\")]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('data-locations-modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('locations-content',{attrs:{\"teamName\":_vm.teamName,\"textStart\":_vm.textStart,\"locations\":_vm.locations}})],1)])])])],2)]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{attrs:{\"id\":\"data-location-flags-container\"}},[(_vm.textStart)?_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.textStart)}}):_vm._e(),_c('div',[(_vm.teamName)?_c('span',[_vm._v(\" Every file in this shared folder is encrypted and distributed in the following locations, selected by the administrators of \"+_vm._s(_vm.teamName)+\" \")]):_c('b',[_vm._v(\" Your files are distributed in \"+_vm._s(_vm.locations.length)+\" different locations \")])]),_c('ul',_vm._l((_vm.locations),function(loc){return _c('li',{key:loc.id},[_c('img',{staticClass:\"mr-1\",attrs:{\"src\":_vm.Utils.flag_img_src(loc.countrycode)}}),_vm._v(_vm._s(loc.name)+\", \"+_vm._s(loc.country)+\" \")])}),0),(_vm.teamName)?_c('div',[_vm._v(\" SkyFlok's unique patented technology allows you to choose where your data is stored. Keep it close to you or spread it across the globe, it is s up to you.\"),_c('br'),_c('br'),_vm._v(\" Visit \"),_c('a',{staticClass:\"text-bold\",attrs:{\"href\":\"https://skyflok.com\",\"target\":\"_BLANK\"}},[_vm._v(\"skyflok.com\")]),_vm._v(\" to learn more and try SkyFlok for free! \")]):_c('div',[_c('i',{staticClass:\"text-sm\"},[_vm._v(\"These locations were selected by your Team's Administrators\")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n
\n
\n \n Every file in this shared folder is encrypted and distributed in the following locations,\n selected by the administrators of {{ teamName }}\n \n \n Your files are distributed in {{ locations.length }} different locations\n \n
\n\n
\n \n {{ loc.name }}, {{ loc.country }}\n \n \n\n
\n SkyFlok's unique patented technology allows you to choose where your data is stored.\n Keep it close to you or spread it across the globe, it is s up to you.
\n Visit
skyflok.com to learn more and try SkyFlok for free!\n
\n
\n These locations were selected by your Team's Administrators \n
\n
\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./locations_popover_content.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./locations_popover_content.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./locations_popover_content.vue?vue&type=template&id=93748bb6&scoped=true\"\nimport script from \"./locations_popover_content.vue?vue&type=script&lang=js\"\nexport * from \"./locations_popover_content.vue?vue&type=script&lang=js\"\nimport style0 from \"./locations_popover_content.vue?vue&type=style&index=0&id=93748bb6&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"93748bb6\",\n null\n \n)\n\nexport default component.exports","\n 0\">\n \n\n
\n\n
\n\n \n
\n\n
\n
\n\n\n \n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./data-location-flags.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./data-location-flags.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./data-location-flags.vue?vue&type=template&id=1d2f86b7&scoped=true\"\nimport script from \"./data-location-flags.vue?vue&type=script&lang=js\"\nexport * from \"./data-location-flags.vue?vue&type=script&lang=js\"\nimport style0 from \"./data-location-flags.vue?vue&type=style&index=0&id=1d2f86b7&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1d2f86b7\",\n null\n \n)\n\nexport default component.exports","\n \n\n \n \n \n\n \n
\n \n \n\n \n = 0 && plan_expires_days <= 14\" class=\"bottom-container bg-gradient-warning text-white py-3\">\n
\n Your {{ user.team_settings.plan_key == 'skyflok-trial' ? \"free trial\" : 'team subscription'}} will end {{ plan_expires_days | days_rel }}!\n
Upgrade \n
\n
\n\n \n \n\n
\n \n\n\n\n\n","import mod from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=895eb924\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\nimport style0 from \"./App.vue?vue&type=style&index=0&id=895eb924&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"layout-container\"},[_c('div',{staticClass:\"page-container bg-blue-grey-900\"},[_c('div',{staticClass:\"d-flex align-items-center align-items-center-ie bg-gradient-primary\"},[_c('div',{staticClass:\"fw container container-xs text-center\"},[(_vm.google_user)?_c('div',[_c('div',{staticClass:\"d-flex align-items-center justify-content-center mt-5\"},[(_vm.google_user.image_url)?_c('img',{staticClass:\"initial64 rounded-circle shadow-z2\",attrs:{\"src\":_vm.google_user.image_url}}):_vm._e(),_c('div',{staticClass:\"ml-3\"},[_c('h4',[_vm._v(_vm._s(_vm.google_user.name))]),_c('div',[_vm._v(_vm._s(_vm.google_user.email))])])]),_vm._m(0)]):_c('section',[_vm._m(1),_c('div',{staticClass:\"cardbox-heading mb-5\"},[_c('div',{staticClass:\"cardbox-title text-center\"},[_c('h4',[_vm._v(_vm._s(_vm.show_mfa ? \"Two-Factor Authentication\" : \"Sign in to your SkyFlok Team\"))])])]),_c('section',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.show_mfa && !_vm.email_prefilled),expression:\"!show_mfa && !email_prefilled\"}]},[_c('div',{staticClass:\"c-pointer\",on:{\"click\":function($event){$event.preventDefault();return _vm.google_sign_in()}}},[_c('img',{staticStyle:{\"max-height\":\"3em\"},attrs:{\"src\":require(\"@/assets/img/federated_login/google/btn_google_signin_light_normal_web@2x.png\")}})]),_vm._m(2)]),_c('div',{staticClass:\"cardbox-body\"},[(_vm.confirm_result)?_c('div',{staticClass:\"alert\",class:{'alert-success': _vm.confirm_result.ok, 'alert-danger': !_vm.confirm_result.ok}},[_vm._v(\" \"+_vm._s(_vm.confirm_result.msg)+\" \")]):_vm._e(),(_vm.error_msg)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(\" \"+_vm._s(_vm.error_msg)+\" \")]):_vm._e(),_c('form',{staticClass:\"cardbox cardbox-flat text-white form-validate text-color\",attrs:{\"id\":\"user-login\",\"action\":\"\",\"name\":\"loginForm\",\"novalidate\":\"\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.login.apply(null, arguments)}}},[(!_vm.show_mfa)?_c('div',{staticClass:\"px-5\"},[_c('div',{staticClass:\"form-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.email),expression:\"form.email\"}],staticClass:\"form-control form-control-inverse\",attrs:{\"id\":\"email\",\"type\":\"email\",\"required\":\"\",\"placeholder\":\"Email address\",\"autocomplete\":\"email\"},domProps:{\"value\":(_vm.form.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"email\", $event.target.value)}}})]),_c('div',{staticClass:\"form-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.pass),expression:\"form.pass\"}],staticClass:\"form-control form-control-inverse\",attrs:{\"id\":\"password\",\"type\":\"password\",\"required\":\"\",\"placeholder\":\"Password\",\"autocomplete\":\"current-password\"},domProps:{\"value\":(_vm.form.pass)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"pass\", $event.target.value)}}})])]):_c('section',{staticClass:\"pb-4\"},[_c('mfa-login',{attrs:{\"mfa_mode\":_vm.mfa_mode,\"user_email\":_vm.form.email,\"sms_phone_number\":_vm.mfa_sms_phone_number,\"mfa_cooldown_seconds\":_vm.mfa_cooldown},on:{\"code_changed\":(code) => { _vm.mfa_mode == 'backup' ? _vm.form.mfa_backup_code = code : _vm.form.mfa_code = code },\"change_mfa_mode\":(new_mode) => { _vm.mfa_mode = new_mode }}})],1),_c('div',{staticClass:\"text-center my-4\"},[(!_vm.login_loading)?_c('button',{staticClass:\"btn btn-lg px-5 text-bold\",attrs:{\"disabled\":_vm.login_btn_disabled,\"type\":\"submit\"}},[_vm._v(\" Login to my Team \")]):_c('div',[_c('i',{staticClass:\"ion-load-c icon-lg spin\"})])])])]),_c('section',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.show_mfa && !_vm.email_prefilled),expression:\"!show_mfa && !email_prefilled\"}]},[_vm._m(3),_c('div',{staticClass:\"cardbox-footer text-center b0 mt-5\"},[_c('span',{staticClass:\"mr-1\"},[_vm._v(\"No account yet?\")]),_c('router-link',{staticClass:\"text-inherit text-bold\",attrs:{\"to\":\"/register_trial\"}},[_vm._v(\"Create your SkyFlok team now!\")])],1)])])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('h4',{staticClass:\"mt-5\"},[_vm._v(\"Logging you in... \"),_c('i',{staticClass:\"ion-load-c spin\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"mb-3\"},[_c('img',{staticStyle:{\"max-height\":\"40px\"},attrs:{\"src\":require(\"@/assets/img/skyflok_logo_lg.png\")}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"d-flex align-items-center my-3\"},[_c('hr',{staticClass:\"fw ml-5 mr-3 my-0\"}),_c('span',[_vm._v(\" OR \")]),_c('hr',{staticClass:\"fw mr-5 ml-3 my-0\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('h5',{staticClass:\"cardbox-footer text-center b0 px-5 mt-5\"},[_c('p',[_vm._v(\"Are you a Client of a SkyFlok Team?\")]),_c('a',{staticClass:\"btn btn-info px-4 btn-oval text-bold\",attrs:{\"href\":\"https://spaces.skyflok.com\"}},[_vm._v(\"Client Space Login \"),_c('i',{staticClass:\"ion-arrow-right-c ml-1\"})])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"text-center\"},[(_vm.mfa_cooldown_seconds && _vm.mfa_cooldown_seconds > 0)?_c('div',[_vm._v(\" \"+_vm._s(_vm.mfa_cooldown_seconds)+\" seconds to go \")]):_vm._e(),(_vm.mfa_mode == _vm.MFA_MODE_APP)?_c('section',[_c('div',{staticClass:\"my-3 text-center d-flex align-items-center justify-content-center\"},[_c('i',{staticClass:\"ion-iphone mr-2 text-md\"}),_c('div',{staticClass:\"mr-2\"},[_vm._v(\"Authentication Code:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.code),expression:\"code\"}],staticClass:\"form-control form-control-inverse\",staticStyle:{\"width\":\"160px\"},attrs:{\"id\":\"mfa_code\",\"type\":\"number\",\"min\":\"0\",\"max\":\"999999\",\"maxlength\":\"6\",\"required\":\"\",\"placeholder\":\"123456\"},domProps:{\"value\":(_vm.code)},on:{\"input\":function($event){if($event.target.composing)return;_vm.code=$event.target.value}}})]),_c('div',{staticClass:\"mt-2\"},[_c('i',{staticClass:\"ion-information-circled mr-1\"}),_vm._v(\" Copy the 6-digit code from your Authenticator mobile app for \\\"\"+_vm._s(_vm.user_email ? 'SkyFlok, '+_vm.user_email : \"SkyFlok\")+\"\\\" \")])]):(_vm.mfa_mode == _vm.MFA_MODE_SMS)?_c('section',[_c('div',{staticClass:\"m-2 text-12\"},[_vm._v(\" Copy the code that you received in SMS to \"),_c('span',{staticClass:\"nowrap\"},[_vm._v(_vm._s(_vm.sms_phone_number))])]),_c('div',{staticClass:\"my-3 text-center d-flex align-items-center justify-content-center\"},[_c('i',{staticClass:\"ion-chatbox-working mr-2 text-md\"}),_c('div',{staticClass:\"mr-2\"},[_vm._v(\"SMS Code:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.code),expression:\"code\"}],staticClass:\"form-control form-control-inverse\",staticStyle:{\"width\":\"160px\"},attrs:{\"id\":\"mfa_code\",\"type\":\"number\",\"maxlength\":\"6\",\"required\":\"\",\"placeholder\":\"123456\",\"autocomplete\":\"one-time-code\"},domProps:{\"value\":(_vm.code)},on:{\"input\":function($event){if($event.target.composing)return;_vm.code=$event.target.value}}})])]):(_vm.mfa_mode == 'backup')?_c('section',[_c('div',{staticClass:\"my-3 text-center d-flex align-items-center justify-content-center\"},[_c('div',{staticClass:\"mr-2\"},[_vm._v(\"Backup Code:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.code),expression:\"code\"}],staticClass:\"form-control form-control-inverse\",staticStyle:{\"width\":\"160px\"},attrs:{\"id\":\"mfa_code\",\"type\":\"text\",\"required\":\"\",\"placeholder\":\"aa11bb22\"},domProps:{\"value\":(_vm.code)},on:{\"input\":function($event){if($event.target.composing)return;_vm.code=$event.target.value}}})]),_c('div',{staticClass:\"fw text-center mt-3\"},[_c('a',{staticClass:\"text-white\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.$emit('change_mfa_mode', _vm.original_mfa_mode) }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-arrow-left-c mr-2\"}),_vm._v(\" Back to \"),(_vm.original_mfa_mode==_vm.MFA_MODE_APP)?_c('span',[_vm._v(\"authentication code\")]):(_vm.original_mfa_mode==_vm.MFA_MODE_SMS)?_c('span',[_vm._v(\"SMS code\")]):_vm._e()])])]):_vm._e(),(_vm.mfa_mode != 'backup')?_c('div',{staticClass:\"mt-4\"},[_c('a',{staticClass:\"text-white text-underline\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.$emit('change_mfa_mode', 'backup')}}},[_vm._v(\"Use a backup code instead\")])]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n 0\">\n {{ mfa_cooldown_seconds }} seconds to go\n
\n \n \n
\n
Authentication Code:
\n
\n
\n \n \n Copy the 6-digit code from your Authenticator mobile app for \"{{ user_email ? 'SkyFlok, '+user_email : \"SkyFlok\" }}\"\n
\n \n \n \n Copy the code that you received in SMS to {{ sms_phone_number }} \n
\n \n \n \n\n \n \n \n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./login.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./login.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./login.vue?vue&type=template&id=d84fa2e0\"\nimport script from \"./login.vue?vue&type=script&lang=js\"\nexport * from \"./login.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n
\n
\n
\n\n
\n
\n
\n
\n
{{ google_user.name }} \n
{{ google_user.email }}
\n
\n
\n
Logging you in... \n
\n\n
\n \n \n
\n
\n\n \n
\n
{{ show_mfa ? \"Two-Factor Authentication\" : \"Sign in to your SkyFlok Team\" }} \n \n
\n\n \n \n
\n
\n\n \n
\n OR \n \n \n \n \n \n\n
\n \n {{ confirm_result.msg }}\n
\n\n
\n \n {{ error_msg }}\n
\n\n
\n \n
\n\n \n\n \n
\n
\n
\n
\n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./login.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./login.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./login.vue?vue&type=template&id=2b39f1b4&scoped=true\"\nimport script from \"./login.vue?vue&type=script&lang=js\"\nexport * from \"./login.vue?vue&type=script&lang=js\"\nimport style0 from \"./login.vue?vue&type=style&index=0&id=2b39f1b4&prod&lang=css&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2b39f1b4\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[_vm._m(0),(!_vm.hide_form)?_c('div',{staticClass:\"cardbord-body text-center\"},[_c('div',{staticClass:\"text-14\"},[_vm._v(\"Try SkyFlok free for \"+_vm._s(_vm.team_config ? _vm.team_config.time_limit_days : '30')+\" days!\")]),_vm._m(1)]):_vm._e(),(_vm.error)?_c('div',{staticClass:\"alert alert-danger mt-2\",domProps:{\"innerHTML\":_vm._s(_vm.error)}}):(_vm.success)?_c('div',{staticClass:\"fw text-center my-3\"},[_vm._m(2),_vm._m(3)]):_vm._e(),(!_vm.hide_form)?_c('div',{staticClass:\"cardbox-body row pb-0\"},[_c('div',{staticClass:\"col-12 col-md-6\"},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit()}}},[_c('label',{staticStyle:{\"padding-top\":\"0px\"},attrs:{\"for\":\"register_name pt-0 mt-0\"}},[_vm._v(\"Name\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.name),expression:\"form.name\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"register_name\",\"name\":\"name\",\"maxlength\":\"255\",\"placeholder\":\"Your name (optional)\"},domProps:{\"value\":(_vm.form.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"name\", $event.target.value)}}}),_c('label',{staticClass:\"mt-3\",attrs:{\"for\":\"register_email\"}},[_vm._v(\"Email Address\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.email),expression:\"form.email\"}],staticClass:\"form-control\",attrs:{\"type\":\"email\",\"id\":\"register_email\",\"name\":\"email\",\"placeholder\":\"Your email address\"},domProps:{\"value\":(_vm.form.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"email\", $event.target.value)}}}),(_vm.email_suggested)?_c('small',{staticClass:\"d-block\"},[_vm._v(\"Did you mean \"),_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){_vm.form.email=_vm.email_suggested}}},[_vm._v(_vm._s(_vm.email_suggested))]),_vm._v(\"?\")]):_vm._e(),_c('div',{staticClass:\"mt-5\"},[_c('button',{staticClass:\"btn btn-block btn-lg text-bold bg-skyflok text-white text-12\",attrs:{\"type\":\"submit\",\"disabled\":!_vm.form_ok || _vm.loading}},[_vm._v(\" Sign Up \"),(_vm.loading)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):_vm._e()])])])]),_c('div',{staticClass:\"col-12 col-md-6\"},[_c('div',{staticClass:\"d-block d-md-none pt-3\"},[_vm._v(\"Â \")]),_c('div',{staticClass:\"mt-4\",class:{'mx-3': !_vm.Utils.is_mobile()}},[_c('invite-config-box',{attrs:{\"invite\":_vm.invite}})],1)])]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox-heading\"},[_c('div',{staticClass:\"cardbox-title text-center\"},[_c('a',{attrs:{\"href\":\"https://skyflok.com\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"mr-2\",staticStyle:{\"max-height\":\"60px\"},attrs:{\"src\":require(\"@/assets/img/skyflok_logo_green.png\")}})])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"text-sm\"},[_c('span',[_vm._v(\"No credit card required\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"text-success text-14\"},[_vm._v(\" Success!\"),_c('br'),_vm._v(\"Check your email for the invite! \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"mt-5\"},[_c('img',{attrs:{\"src\":require(\"@/assets/img/illustrations/mail_sent-success.svg\"),\"height\":\"150\"}})])\n}]\n\nexport { render, staticRenderFns }","import { bus } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\n\n// This is not exported\nconst base_url = process.env.VUE_APP_user_service_url\n\nconst UserService = {\n\n get_user: function(user_id){\n return bus.$http.get(base_url + \"/users/\" + user_id , { headers: Utils.get_auth_header() })\n },\n\n get_me: function(){\n return bus.$http.get(base_url + \"/users/me\", { headers: Utils.get_auth_header() })\n },\n\n edit_user: function(user_id, name, job_title, avatar_url){\n if(!user_id){ return false }\n\n let payload = { }\n if(name != null){ payload.name = name }\n if(job_title != null){ payload.job_title = job_title }\n if(avatar_url != null){ payload.avatar_url = avatar_url }\n\n return bus.$http.put(base_url + \"/users/\"+user_id, payload, { headers: Utils.get_auth_header() })\n },\n\n edit_me: function(name, job_title, avatar_url){\n let payload = { }\n if(name != null){ payload.name = name }\n if(job_title != null){ payload.job_title = job_title }\n if(avatar_url != null){ payload.avatar_url = avatar_url }\n\n return bus.$http.put(base_url + \"/users/me\", payload, { headers: Utils.get_auth_header() })\n },\n\n get_my_team: function(mark_admins){\n if(mark_admins === undefined){\n mark_admins = false\n }\n const url_params = {\n mark_admins: mark_admins ? 1 : 0\n }\n return bus.$http.get(base_url + \"/users\", { params: url_params, headers: Utils.get_auth_header() })\n },\n\n get_company_settings: function(){\n return bus.$http.get(base_url + \"/companies/me\", { headers: Utils.get_auth_header() })\n },\n\n add_user_email: function(email){\n const payload = {\n user_email: email\n }\n return bus.$http.post(base_url + \"/companies/user_email\", payload, { headers: Utils.get_auth_header() })\n },\n\n delete_user_email: function(email){\n const url_params = {\n user_email: email\n }\n return bus.$http.delete(base_url + \"/companies/user_email\", { params: url_params, headers: Utils.get_auth_header() } )\n },\n\n update_team_settings: function(payload){\n return bus.$http.put(base_url + \"/companies/me\", payload, { headers: Utils.get_auth_header() })\n },\n\n get_team_info(join_key){\n return bus.$http.get(base_url + \"/company_info?key=\" + join_key)\n },\n\n trial_invite_signup(payload){\n return bus.$http.post(base_url + \"/invite/new\", payload)\n },\n\n get_invite_by_key(invite_key){\n\t\treturn bus.$http.get(base_url + \"/invite/\"+invite_key)\n },\n\n team_invite_signup(formData){\n // This is a special endpoint call, because we want the browser to trigger the \n // password save dialog. Returns the result Promise of a fetch() call \n // Source: https://developers.google.com/web/fundamentals/security/credential-management/save-forms\n \n return fetch(base_url+'/invite/team_signup', {\n method: 'POST',\n body: formData,\n credentials: 'include'\n })\n },\n\n /* Deprecated, use team_invite_signup instead */\n\tregister_company(invite_key, form){\n if(invite_key){\n form['invite_key'] = invite_key\n }\n\t\treturn bus.$http.post(base_url + \"/register_team\", form)\n },\n\n register_to_team: function(join_key, reg_form){\n const payload = {\n \"join_key\": join_key,\n \"name\": reg_form.name,\n \"password\": reg_form.password,\n \"email_address\": reg_form.email,\n \"terms_accepted\": reg_form.terms_accepted,\n \"newsletter\": reg_form.newsletter\n }\n\n\t\treturn bus.$http.post(base_url + \"/register_to_team\", payload)\n }\n\n}\n\nexport { UserService }","import { bus } from '../helpers/event_bus.js'\n\n// This is not exported\nconst base_url = process.env.VUE_APP_config_service_url\n\nconst ConfigService = {\n\n get_config(plan_key){\n return bus.$http.get(base_url + \"/plans/\"+plan_key)\n }\n\n}\n\nexport { ConfigService }","const email_domain_typos = [\n {\n correct: \"gmail.com\",\n typos: [\"gmail.cm\", \"gmail.con\", \"gmail.co\", \"gmal.com\", \"g-mail.com\", \"gmaill.com\", \"gmai.com\",\n \"gmail.co.uk\", \"googlemail.co.uk\", \"gmail.com.au\", \"gmail.ca\", \"googlemaile.com\",\n \"googlmail.com\", \"gmail.fr\", \"gmail.com.mx\", \"gmail.nl\", \"googlmail.com\", \"gmail.cpm\",\n \"gamil.com\", \"gmail.cim\", \"gmaul.com\", \"gnail.com\", \"gmaik.com\", \"gmail.be\"]\n },\n {\n correct: \"hotmail.com\",\n typos: [\"hotmail.cm\", \"hoymail.com\", \"homail.com\", \"hotmai.com\",\n \"hotmail.co\", \"hotmal.com\", \"hotmil.com\", \"hotmain.com\", \"hatmail.com\",\n \"hotmial.co.uk\", \"hotmall.co.uk\", \"hotmaiil.co.uk\", \"hotmaik.com\",\n \"hptmail.com\"]\n },\n {\n correct: \"yahoo.com\",\n typos: [\"yahoo.cm\", \"yahoo.co\", \"yaho.com\", \"yaoo.com\", \"yahooo.com\",\n \"yhaoo.com\", \"ayhoo.com\", \"dyahoo.com\", \"ahoo.com\", \"yhoo.com\", \"yahool.com\", \"yhoo.com\",\n \"yahoomail.com\", \"tyahoo.com\", \"yahool.com\", \"yahoo.net\", \"yshoo.com\", \"myshoo.com\",\n \"yahho.com\", \"yaqhoo.com\", \"ayahoo.com\", \"yah00.com\", \"yahho.com\", \"yohoo.com\",\n \"olyahoo.com\", \"yahaoo.com\", \"yahioo.com\", \"yahooc.com\", \"yahopo.com\", \"yajoo.com\",\n \"yhool.com\", \"yyahoo.com\", \"yayoo.com\", \"ysahoo.com\", \"ywhoo.com\", \"yaghoo.com\",\n \"hahoo.com\", \"qyahoo.com\", \"yahoo0.com\", \"yanoo.com\", \"yaho0o.com\", \"yahoom.com\",\n \"youhoo.com\", \"ytahoo.com\", \"69yahoo.com\", \"yahoo.org\", \"yahoop.com\", \"yhahoo.com\",\n \"yzhoo.com\", \"iyahoo.com\", \"y7ahoo.com\", \"yaboo.com\", \"yajhoo.com\", \"yaool.com\",\n \"ydhoo.com\", \"51yahoo.com\", \"yafoo.com\", \"yahgoo.com\", \"yahoord.com\", \"yhaooo.com\",\n \"yhoo.net\", \"yuhoo.com\"]\n },\n {\n correct: \"aol.com\",\n typos: [\"aol.cm\", \"a0l.com\", \"aol.co\"]\n }\n]\n\nexport { email_domain_typos }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox b\",staticStyle:{\"box-shadow\":\"none\"}},[(_vm.invite)?_c('div',{staticClass:\"cardbox-body\"},[_c('div',{staticClass:\"fw pb-3 text-center text-bold text-14 color-skyflok\"},[(_vm.is_free_trial)?_c('strong',[_vm._v(\"Free Trial\")]):(_vm.invite.invited_team_name)?_c('strong',[_vm._v(_vm._s(_vm.invite.invited_team_name))]):_c('strong',[_vm._v(\"Your SkyFlok Team\")])]),(_vm.invite.config.time_limit_days)?_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(_vm._s(_vm.invite.config.time_limit_days)+\" Days\")])]):_vm._e(),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(_vm._s(_vm.invite.config.initial_storage_gb || 'Unlimited')+\" GB Storage\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(_vm._s(_vm.invite.config.initial_users || 'Unlimited')+\" Team Members\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(_vm._s(_vm.invite.config.active_spaces_limit || 'Unlimited')+\" Client Space\"+_vm._s(_vm.invite.config.active_spaces_limit==1 ?'':'s'))]),_vm._v(\" \"),_c('info-icon',{attrs:{\"content\":\"A secure folder where you and your clients can share files with each other. GDPR-compatible alternative to sending files in email.\"}})],1),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Data Location Selection \"),_c('info-icon',{attrs:{\"content\":\"You can select where your files are stored physically\"}})],1)])]):_c('div',{staticClass:\"cardbox-body text-center\"},[_c('i',{staticClass:\"ion-load-c spin color-skyflok text-md\"})])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('i',{staticClass:\"ion-information-circled ml-1 info-icon c-help\",class:_vm.custom_class,attrs:{\"data-toggle\":\"popover\",\"data-html\":\"true\",\"data-content\":_vm.content,\"data-placement\":_vm.placement || 'top',\"data-trigger\":_vm.trigger || (_vm.is_mobile ? 'click' : 'hover')}})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./info-icon.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./info-icon.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./info-icon.vue?vue&type=template&id=19917e24\"\nimport script from \"./info-icon.vue?vue&type=script&lang=js\"\nexport * from \"./info-icon.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n
\n
\n Free Trial \n {{ invite.invited_team_name }} \n Your SkyFlok Team \n
\n
{{invite.config.time_limit_days}} Days
\n
{{invite.config.initial_storage_gb || 'Unlimited'}} GB Storage
\n
{{invite.config.initial_users || 'Unlimited'}} Team Members
\n
{{invite.config.active_spaces_limit || 'Unlimited'}} Client Space{{invite.config.active_spaces_limit==1 ?'':'s'}}
\n
Data Location Selection
\n
\n
\n \n
\n
\n \n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./invite-config-box.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./invite-config-box.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./invite-config-box.vue?vue&type=template&id=b0c1393a\"\nimport script from \"./invite-config-box.vue?vue&type=script&lang=js\"\nexport * from \"./invite-config-box.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n \n\n \n
Try SkyFlok free for {{ team_config ? team_config.time_limit_days : '30' }} days!
\n
No credit card required
\n
\n\n
\n\n \n
\n Success! Check your email for the invite!\n
\n
\n
\n
\n
\n\n \n \n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./register.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./register.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./register.vue?vue&type=template&id=5e71aaf0&scoped=true\"\nimport script from \"./register.vue?vue&type=script&lang=js\"\nexport * from \"./register.vue?vue&type=script&lang=js\"\nimport style0 from \"./register.vue?vue&type=style&index=0&id=5e71aaf0&prod&lang=css&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5e71aaf0\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"layout-container\"},[_c('div',{staticClass:\"page-container\"},[_c('div',{staticClass:\"d-flex align-items-center align-items-center-ie\"},[_c('div',{staticClass:\"fw container container-sm\"},[_c('div',{staticClass:\"cardbox text-bold\"},[_c('div',{staticClass:\"pb-1 bg-gradient-info\"}),_c('div',{staticClass:\"p-4\"},[_vm._m(0),(!_vm.is_success)?_c('div',{staticClass:\"cardbox-body\"},[(_vm.error)?_c('div',{staticClass:\"alert alert-danger mt-4\",domProps:{\"innerHTML\":_vm._s(_vm.error)}}):_vm._e(),(_vm.team_info)?_c('div',[_c('h2',{staticClass:\"text-center mb-4\"},[_vm._v(\" \"+_vm._s(_vm.is_pending_registration ? 'Welcome to' : 'Join')+\" \"),_c('b',[_vm._v(_vm._s(_vm.team_info.name))]),(_vm.team_info.logo_url)?_c('img',{staticClass:\"ml-1\",staticStyle:{\"max-height\":\"50px\"},attrs:{\"src\":_vm.team_info.logo_url,\"alt\":_vm.team_info.name}}):_vm._e()]),(_vm.form)?_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_form.apply(null, arguments)}}},[_c('label',{attrs:{\"for\":\"u_name\"}},[_vm._v(\"Your Name\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.name),expression:\"form.name\"}],staticClass:\"form-control\",attrs:{\"id\":\"u_name\",\"type\":\"text\",\"autocomplete\":\"name\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.form.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"name\", $event.target.value)}}}),_c('label',{attrs:{\"for\":\"u_email\"}},[_vm._v(\"Email Address\")]),(_vm.form.email_readonly)?_c('div',[_c('i',{staticClass:\"ion-email mr-2\"}),_c('span',{staticClass:\"text-bold\"},[_vm._v(_vm._s(_vm.form.email))]),_vm._v(\" \"),_vm._m(1)]):_c('span',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.email),expression:\"form.email\"}],staticClass:\"form-control\",attrs:{\"id\":\"u_email\",\"type\":\"email\",\"disabled\":_vm.form.email_readonly,\"autocomplete\":\"username email\"},domProps:{\"value\":(_vm.form.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"email\", $event.target.value)}}}),(_vm.email_suggested)?_c('small',[_vm._v(\"Did you mean \"),_c('a',{staticClass:\"text-underline text-bold\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.form.email = _vm.email_suggested}}},[_vm._v(_vm._s(_vm.email_suggested))]),_vm._v(\"?\")]):_vm._e()]),(_vm.is_pending_registration && _vm.form.has_password && !_vm.show_password_section)?_c('div',{staticClass:\"mt-4\"},[_c('div',[_vm._v(\"You already have a password, but you can change it now, if you want.\")]),_c('div',{staticClass:\"fw text-center mt-2\"},[_c('button',{staticClass:\"btn btn-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.show_password_section=true}}},[_vm._v(\"Change my password\")])])]):_vm._e(),(!_vm.form.has_password || _vm.show_password_section)?_c('section',[_c('label',{attrs:{\"for\":\"u_password\"}},[_vm._v(\"Password\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.password),expression:\"form.password\"}],staticClass:\"form-control\",attrs:{\"id\":\"u_password\",\"type\":\"password\",\"autocomplete\":\"new-password\",\"placeholder\":\"At least 8 characters\"},domProps:{\"value\":(_vm.form.password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"password\", $event.target.value)}}})]):_vm._e(),_c('div',{staticClass:\"form-check d-flex align-items-start justify-content-center flex-column gap-4\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.terms_accepted),expression:\"form.terms_accepted\"}],staticClass:\"form-check-input\",attrs:{\"type\":\"checkbox\",\"id\":\"checkbox-terms-accepted\"},domProps:{\"checked\":Array.isArray(_vm.form.terms_accepted)?_vm._i(_vm.form.terms_accepted,null)>-1:(_vm.form.terms_accepted)},on:{\"change\":function($event){var $$a=_vm.form.terms_accepted,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.form, \"terms_accepted\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.form, \"terms_accepted\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.form, \"terms_accepted\", $$c)}}}}),_c('label',{staticClass:\"form-check-label pl-2\",attrs:{\"for\":\"checkbox-terms-accepted\"}},[_vm._v(\"I understand that \"),_c('b',[_vm._v(_vm._s(_vm.team_info.name))]),_vm._v(\" accepted the \"),_c('a',{attrs:{\"href\":\"https://www.skyflok.com/legal\",\"target\":\"_BLANK\",\"rel\":\"noopener\"}},[_vm._v(\"Terms of Service and Privacy Policy\")]),_vm._v(\" of SkyFlok, which applies to how my personal data is handled. \")])]),_c('div',{staticClass:\"text-center mt-4\"},[_c('button',{staticClass:\"btn btn-lg text-bold bg-skyflok text-white text-12\",staticStyle:{\"width\":\"50%\"},attrs:{\"type\":\"submit\",\"disabled\":_vm.form_loading}},[(_vm.is_pending_registration)?_c('span',[_vm._v(\"Activate your account\")]):_c('span',[_vm._v(\"Join \"+_vm._s(_vm.team_info.name))]),(_vm.form_loading)?_c('i',{staticClass:\"ion-load-c ml-2 spin\"}):_vm._e()])])]):_vm._e()]):(!_vm.error)?_c('div',{staticClass:\"text-center\"},[_c('i',{staticClass:\"ion-load-c spin mr-2\"}),_vm._v(\"Loading, hang on.. \")]):_vm._e()]):_c('div',{staticClass:\"cardbox-body pt-0 text-center\"},[(!_vm.redirect_to_login)?_c('section',[_c('img',{staticClass:\"width-25p my-4\",class:{'fw': _vm.Utils.is_mobile()},attrs:{\"src\":require(\"@/assets/img/illustrations/mail_sent-success.svg\")}}),_vm._m(2)]):_c('div',{staticClass:\"text-14 text-success\"},[_vm._v(\"Success!\"),_c('br'),_vm._v(\"Redirecting to login...\")])])]),_c('reg-footer'),_c('div',{staticClass:\"pb-1 bg-gradient-info\"})],1)])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox-heading\"},[_c('div',{staticClass:\"cardbox-title text-center\"},[_c('a',{attrs:{\"href\":\"https://skyflok.com\",\"target\":\"_blank\"}},[_c('img',{staticClass:\"mr-2\",staticStyle:{\"max-height\":\"40px\"},attrs:{\"src\":require(\"@/assets/img/skyflok_logo_black.png\")}})])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('span',{staticClass:\"badge text-success ml-2\",staticStyle:{\"background\":\"white\"}},[_vm._v(\"Confirmed \"),_c('i',{staticClass:\"ion-checkmark-circled text-success ml-1\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"text-14 px-5\"},[_c('div',{staticClass:\"text-success mb-2\"},[_vm._v(\"Success!\")]),_vm._v(\" Please activate your new SkyFlok account with the link we have sent in email. \")])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _vm._m(0)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('small',{staticClass:\"d-block fw text-center mb-2 text-gray\"},[_vm._v(\"Made in Denmark \"),_c('img',{staticClass:\"ml-1\",staticStyle:{\"vertical-align\":\"center\"},attrs:{\"src\":require(\"@/assets/img/flags/DK.png\"),\"height\":\"20\",\"alt\":\"Danish flag\"}})])\n}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./reg_wizard_footer.vue?vue&type=template&id=3bc601e4\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\t
\n
\n
\n
\n
\n
\n\n
\n\n
\n\n
\n\n
\n
\n {{ is_pending_registration ? 'Welcome to' : 'Join'}} {{ team_info.name }} \n \n \n\n
\n \n
\n
\n Loading, hang on..\n
\n
\n\n \n
\n
\n \n \n
Success!
\n Please activate your new SkyFlok account with the link we have sent in email.\n
\n \n
Success! Redirecting to login...
\n
\n\n
\n
\n
\n
\n
\n
\n\t
\n
\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./join-team.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./join-team.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./join-team.vue?vue&type=template&id=5168b5ca&scoped=true\"\nimport script from \"./join-team.vue?vue&type=script&lang=js\"\nexport * from \"./join-team.vue?vue&type=script&lang=js\"\nimport style0 from \"./join-team.vue?vue&type=style&index=0&id=5168b5ca&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5168b5ca\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[(_vm.admin_folder_disabled)?_c('div',{staticClass:\"container pt-5\"},[_c('upgrade-warning-box',{attrs:{\"feature\":'Admin Folder'}})],1):(_vm.user && _vm.user.is_admin)?_c('file-list-view',{attrs:{\"user\":_vm.user,\"share-allowed\":false,\"is_admin_folder\":true}}):_c('div',{staticClass:\"container pt-5\"},[_c('admin-warning-box')],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\",class:{'drag_valid': _vm.dropzone_active},attrs:{\"id\":\"files\"},on:{\"click\":function($event){return _vm.remove_file_highlight()}}},[(!_vm.disable_upload)?_c('div',{attrs:{\"id\":\"dropzone\"},on:{\"dragenter\":function($event){$event.preventDefault();$event.stopPropagation();},\"dragover\":function($event){$event.preventDefault();$event.stopPropagation();},\"dragleave\":function($event){$event.preventDefault();$event.stopPropagation();_vm.dropzone_active = false},\"drop\":function($event){$event.preventDefault();return _vm.something_dropped.apply(null, arguments)}}},[_vm._v(\" Drop your file to upload \")]):_vm._e(),(_vm.user && !_vm.user.is_client_space_client && _vm.buckets && _vm.buckets.length == 0)?_c('div',{staticClass:\"container mt-3\",staticStyle:{\"top\":\"15px\"}},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2 d-none d-md-table-cell\"}),_c('div',{staticClass:\"col-12 col-lg-8\"},[_c('div',{staticClass:\"jumbotron text-white\",class:{'bg-gradient-info': _vm.user.is_admin, 'bg-gradient-warning': !_vm.user.is_admin}},[_c('div',{staticClass:\"container\"},[(_vm.user.is_admin)?_c('section',[_c('h1',[_vm._v(\"Hello and welcome to SkyFlok!\")]),_c('h4',{staticClass:\"mt-3\"},[_vm._v(\"To get started, first you need to set where your data will be stored.\")]),_c('h4',{staticClass:\"mt-3\"},[_vm._v(\"Please go to \"),_c('u',[_c('router-link',{staticClass:\"text-white\",attrs:{\"to\":\"/team-setup\"}},[_vm._v(\"Team Setup\")])],1),_vm._v(\" and set up your account now!\")])]):_c('section',[_c('h4',[_vm._v(\"This Team account is not ready to upload files, please ask one of the Team Administrators to complete the initial setup!\")])])])])])])]):_c('div',{staticClass:\"container-fluid\",attrs:{\"id\":\"file_list\"}},[(_vm.show_clouds_ready_box)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_vm._m(0)]):_vm._e(),(false && _vm.is_admin_folder)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_vm._m(1)]):_vm._e(),(_vm.nav_stack.length > 1)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12 breadcrumb\"},[_vm._l((_vm.nav_stack.slice(0, _vm.nav_stack.length - 1)),function(folder,index){return _c('div',{key:index,staticClass:\"d-inline-block nowrap\",on:{\"dragover\":function($event){$event.preventDefault();folder.dragover=true},\"dragleave\":function($event){$event.preventDefault();folder.dragover=false},\"drop\":function($event){$event.preventDefault();return _vm.drop($event, folder)}}},[_c('button',{staticClass:\"btn btn-flat btn-info btn-sm\",class:{'bg-success': folder.dragover},attrs:{\"type\":\"button\",\"title\":'Go back to ' + (folder.id == -1 ? 'the root folder' : folder.name + ' directory')},on:{\"click\":function($event){return _vm.change_folder_to(folder)}}},[(folder.id == -1)?_c('i',{staticClass:\"icon ion-home\"}):_c('span',{staticClass:\"d-flex align-items-center\"},[_c('i',{staticClass:\"ion-folder mr-2\"}),_vm._v(\" \"+_vm._s(folder.name)+\" \")])]),(index < _vm.nav_stack.length-1)?_c('i',{staticClass:\"ion-chevron-right v-middle\"}):_vm._e()])}),_c('div',{staticClass:\"d-inline-block nowrap\"},[_c('div',{staticClass:\"btn btn-flat btn-sm btn-secondary c-default text-bold\",attrs:{\"title\":'You are in ' + _vm.nav_stack[_vm.nav_stack.length-1].name + ' directory',\"disabled\":true}},[_c('span',{staticClass:\"d-flex align-items-center\"},[_c('i',{staticClass:\"ion-folder mr-2\"}),_vm._v(_vm._s(_vm.nav_stack[_vm.nav_stack.length-1].name)+\" \")])])])],2)]):_vm._e(),_c('div',{staticClass:\"row\",attrs:{\"id\":\"folders\"}},[_vm._l((_vm.folders),function(folder){return _c('div',{key:folder.id,staticClass:\"folder-box col-12 col-sm-6 col-md-6 col-lg-4 col-xl-3\",class:{'dragover': folder.dragover},attrs:{\"id\":`skyflok-folder-${folder.id}`},on:{\"click\":function($event){folder.rename ? false : _vm.change_folder_to(folder)}}},[_c('div',{class:['cardbox', _vm.get_folderbox_class(folder)],staticStyle:{\"border-left\":\"4px solid\"}},[_c('div',{staticClass:\"cardbox-body\",attrs:{\"title\":folder.name}},[(!folder.rename)?_c('div',{staticClass:\"d-flex justify-content-start align-items-center\"},[_c('i',{staticClass:\"ion-folder mr-2\"}),_c('span',{staticClass:\"mb-0 foldername\"},[_vm._v(_vm._s(folder.name))]),(!_vm.disable_share || !_vm.disable_namespace_ops)?_c('div',{staticClass:\"ml-auto\",attrs:{\"title\":\"Show folder options\"},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.folderbox_dropdown('folder_'+folder.id+'_dropdown')}}},[_c('div',{staticClass:\"dropdown btn-group\"},[_c('button',{staticClass:\"btn btn-sm btn-secondary btn-flat mb-0 mt-0 folder-overflow-btn\",attrs:{\"id\":'folder_'+folder.id+'_dropdown',\"type\":\"button\",\"data-toggle\":\"dropdown\",\"aria-expanded\":\"false\"}},[_c('i',{staticClass:\"ion-more text-gray-light\"})]),_c('div',{staticClass:\"dropdown-menu dropdown-menu-right mt-2\",attrs:{\"role\":\"menu\"}},[(!_vm.disable_share && _vm.folder_shares_enabled)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.open_share_form(folder)}}},[_c('i',{staticClass:\"ion-share icon-lg mr-3\"}),_vm._v(\"Share Folder\")]):_vm._e(),(!_vm.disable_namespace_ops)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.rename_file(folder)}}},[_c('i',{staticClass:\"ion-edit icon-lg mr-3\"}),_vm._v(\"Rename\")]):_vm._e(),(!_vm.disable_namespace_ops)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.copy_move_file(folder, 'move_folder')}}},[_c('i',{staticClass:\"ion-forward icon-lg mr-3\"}),_vm._v(\"Move\")]):_vm._e(),(!_vm.disable_namespace_ops)?_c('div',{staticClass:\"dropdown-divider\"}):_vm._e(),(!_vm.disable_namespace_ops)?_c('a',{staticClass:\"dropdown-item text-danger\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.delete_file(folder)}}},[(_vm.deleteAction)?_c('i',{class:[_vm.deleteAction.icon, 'icon-lg mr-3']}):_c('i',{staticClass:\"ion-trash-a icon-lg mr-3\"}),_vm._v(_vm._s(_vm.deleteAction ? _vm.deleteAction.label : 'Delete')+\" \")]):_vm._e()])])]):_vm._e()]):_c('div',{staticClass:\"nowrap\"},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.rename_submit(folder)}}},[_c('div',{staticClass:\"input-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(folder.rename.name),expression:\"folder.rename.name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"id\":'file-rename-'+folder.id,\"type\":\"text\"},domProps:{\"value\":(folder.rename.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(folder.rename, \"name\", $event.target.value)}}}),(!folder.rename.loading)?_c('span',[_vm._m(2,true),_c('button',{staticClass:\"btn btn-sm btn-warning btn-gradient fh\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();folder.rename = false}}},[_c('i',{staticClass:\"ion-close-round\"})])]):_c('i',{staticClass:\"ion-load-c spin\"})])]),(folder.rename.error)?_c('div',{staticClass:\"text-sm text-danger\"},[_vm._v(_vm._s(folder.rename.error))]):_vm._e()])])])])}),(!_vm.disable_namespace_ops)?_c('div',{staticClass:\"folder-box add_folder col-12 col-sm-6 col-md-6 col-lg-4 col-xl-3\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-secondary\"},[_c('div',{staticClass:\"cardbox-body\"},[(_vm.new_folder_mode)?[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.create_folder(_vm.new_folder_name)}}},[_c('div',{staticClass:\"input-group\",staticStyle:{\"padding\":\"4px 0px\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.new_folder_name),expression:\"new_folder_name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"id\":\"new_folder_name_input\",\"placeholder\":\"Folder Name\"},domProps:{\"value\":(_vm.new_folder_name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.new_folder_name=$event.target.value}}}),_c('button',{staticClass:\"btn btn-sm btn-success btn-gradient ml-1\",attrs:{\"type\":\"submit\",\"disabled\":_vm.new_folder_loading}},[_c('i',{class:{'ion-checkmark-round': !_vm.new_folder_loading, 'ion-load-c spin': _vm.new_folder_loading}})]),_c('button',{staticClass:\"btn btn-sm btn-warning btn-gradient ml-1\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.new_folder_form(false)}}},[_c('i',{staticClass:\"ion-close-round\"})])])])]:[_c('div',{staticClass:\"d-flex justify-content-start align-items-center nowrap gap-1\",on:{\"click\":function($event){return _vm.new_folder_form(true)}}},[_c('i',{staticClass:\"ion-plus mr-2\"}),_c('p',{staticClass:\"mb-0\"},[_vm._v(\"Create Folder\")])])]],2)])]):_vm._e()],2),_c('div',{staticClass:\"row\",attrs:{\"id\":\"files\"}},[(_vm.files.length > 0)?_c('div',{staticClass:\"col-12\"},[_c('div',{staticClass:\"cardbox\"},[_c('div',{staticClass:\"cardbox-heading\"},[_c('div',{staticClass:\"float-left filters\"},[(_vm.list_filters.types.length > 0)?_c('span',{staticClass:\"btn btn-oval bg-blue-500 mx-1 my-1\"},[_vm._v(\"Type: \"+_vm._s(_vm._f(\"join\")(_vm.list_filters.types))+\" \"),_c('i',{staticClass:\"ion-close-round ml-2\",on:{\"click\":function($event){_vm.list_filters.types = []}}})]):_vm._e()]),_c('div',{staticClass:\"float-right text-right action-buttons\"},[(false)?_c('button',{staticClass:\"btn btn-secondary btn-gradient mx-1 my-1 d-none d-xl-inline-block\",attrs:{\"data-toggle\":\"modal\",\"data-target\":\"#filter-modal\",\"data-backdrop\":\"\"}},[_c('i',{staticClass:\"ion-funnel mr-1 icon-lg\"}),_vm._v(\" Filters \")]):_vm._e(),(!(_vm.disable_download || _vm.is_mobile))?_c('span',[(_vm.files_multiselect_on)?_c('a',{staticClass:\"mr-2 text-sm\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.files_multiselect_on=false}}},[_vm._v(\"Cancel\")]):_vm._e(),(!_vm.files_multiselect_on)?_c('button',{staticClass:\"btn btn-success btn-gradient mx-1 my-1\",on:{\"click\":function($event){_vm.files_multiselect_on = true}}},[_c('i',{staticClass:\"ion-arrow-down-a mr-1 icon-lg\"}),_vm._v(\" Files \")]):(!_vm.files_multidownload_in_progress)?_c('button',{staticClass:\"btn btn-skyflok mx-1 my-1\",on:{\"click\":function($event){return _vm.download_all_selected()}}},[_c('i',{staticClass:\"ion-arrow-down-a mr-1 icon-lg\"}),_vm._v(\" Download \"+_vm._s(_vm.selected_files.length)+\" files \")]):_c('button',{staticClass:\"btn btn-danger mx-1 my-1\",on:{\"click\":function($event){return _vm.download_all_cancel()}}},[_c('i',{staticClass:\"ion-close mr-1 icon-lg\"}),_vm._v(\" Cancel \")])]):_vm._e(),(!_vm.disable_upload)?_c('button',{staticClass:\"btn btn-primary btn-gradient mx-1 my-1\",on:{\"click\":function($event){return _vm.file_upload_el.click()}}},[_c('i',{staticClass:\"ion-arrow-up-a mr-1 icon-lg\"}),_vm._v(\" \"+_vm._s(_vm.is_mobile ? 'Upload' : 'Files'))]):_vm._e(),(!_vm.disable_upload && !_vm.is_mobile)?_c('button',{staticClass:\"btn btn-info btn-gradient mx-1 my-1\",on:{\"click\":function($event){return _vm.folder_upload_el.click()}}},[_c('i',{staticClass:\"ion-arrow-up-a mr-1 icon-lg\"}),_vm._v(\" Folder\")]):_vm._e()])]),_c('div',{staticClass:\"file-list\"},[_c('table',{staticClass:\"table table-hover\"},[_c('thead',[_c('tr',[(_vm.files_multiselect_on)?_c('th',{staticClass:\"width-0\"},[_c('checkbox',{staticClass:\"mr-0\",attrs:{\"value\":_vm.files_select_all},on:{\"changed\":(newval) => _vm.files_select_all=newval}})],1):_vm._e(),_c('th',{staticClass:\"width-0\"}),_c('th',{staticClass:\"text-left nowrap\"},[_c('span',{staticClass:\"sort_header\",on:{\"click\":function($event){return _vm.sort_by('name')}}},[_vm._v(\"Filename \"),(_vm.list_sort.attr==='name')?_c('i',{staticClass:\"text-gray-light ml-1\",class:{'ion-arrow-up-c': _vm.list_sort.asc, 'ion-arrow-down-c': !_vm.list_sort.asc}}):_vm._e()])]),_c('th',{staticClass:\"d-none d-md-table-cell nowrap\"},[_c('span',{staticClass:\"sort_header\",on:{\"click\":function($event){return _vm.sort_by('extension')}}},[_vm._v(\"Type \"),(_vm.list_sort.attr==='extension')?_c('i',{staticClass:\"text-gray-light ml-1\",class:{'ion-arrow-up-c': _vm.list_sort.asc, 'ion-arrow-down-c': !_vm.list_sort.asc}}):_vm._e()])]),_c('th',{staticClass:\"d-none d-xl-table-cell nowrap\"},[_c('span',{staticClass:\"sort_header\",on:{\"click\":function($event){return _vm.sort_by('size')}}},[_vm._v(\"Size \"),(_vm.list_sort.attr==='size')?_c('i',{staticClass:\"text-gray-light ml-1\",class:{'ion-arrow-up-c': _vm.list_sort.asc, 'ion-arrow-down-c': !_vm.list_sort.asc}}):_vm._e()])]),_c('th',{staticClass:\"d-none d-md-table-cell nowrap\"},[_c('span',{staticClass:\"sort_header\",on:{\"click\":function($event){return _vm.sort_by('last_modified')}}},[_vm._v(\"Uploaded \"),(_vm.list_sort.attr==='last_modified')?_c('i',{staticClass:\"text-gray-light ml-1\",class:{'ion-arrow-up-c': _vm.list_sort.asc, 'ion-arrow-down-c': !_vm.list_sort.asc}}):_vm._e()])]),(_vm.are_files_with_multiple_versions)?_c('th',{staticClass:\"d-none d-xl-table-cell nowrap\"},[_c('span',{staticClass:\"sort_header\",attrs:{\"title\":\"Number of previous versions\"},on:{\"click\":function($event){return _vm.sort_by('versions_num')}}},[_vm._v(\"Versions \"),(_vm.list_sort.attr==='versions_num')?_c('i',{staticClass:\"text-gray-light ml-1\",class:{'ion-arrow-up-c': _vm.list_sort.asc, 'ion-arrow-down-c': !_vm.list_sort.asc}}):_vm._e()])]):_vm._e(),(!_vm.disable_share)?_c('th',{staticClass:\"d-none d-xl-table-cell nowrap\"},[_c('span',{staticClass:\"sort_header\",on:{\"click\":function($event){return _vm.sort_by('shares_num')}}},[_vm._v(\"Shares \"),(_vm.list_sort.attr==='shares_num')?_c('i',{staticClass:\"text-gray-light ml-1\",class:{'ion-arrow-up-c': _vm.list_sort.asc, 'ion-arrow-down-c': !_vm.list_sort.asc}}):_vm._e()])]):_vm._e(),(!_vm.disable_download)?_c('th',{staticClass:\"d-none d-md-table-cell width-0\"}):_vm._e(),_c('th',{staticClass:\"width-0\"})])]),_vm._l((_vm.files),function(file){return _c('tbody',{key:file.id,class:{ open: file.show_details },attrs:{\"id\":`skyflok-file-${file.id}`}},[_c('tr',{staticClass:\"file-row\",class:{'text-gray-light': file.loading, 'highlighted': file.highlighted, 'bg-cyan-50': file.selected},attrs:{\"id\":'file-row-'+file.id},on:{\"click\":(evt) => { if(_vm.files_multiselect_on){file.selected=!file.selected; evt.stopPropagation()} }}},[(_vm.files_multiselect_on)?_c('td',{staticClass:\"width-0\"},[_c('checkbox',{staticClass:\"mr-0\",attrs:{\"value\":file.selected},on:{\"changed\":newval => file.selected=newval}})],1):_vm._e(),_c('td',[_c('img',{staticClass:\"file-icon\",attrs:{\"src\":_vm._f(\"filetype_img_src\")(file.extension)}})]),_c('td',{staticClass:\"text-left\"},[(!_vm.disable_download)?_c('span',[(!file.rename)?_c('span',{staticClass:\"text-bold filename\",attrs:{\"title\":'Click to download ' + file.name}},[_c('span',{staticClass:\"file_download_link\",on:{\"click\":function($event){return _vm.download_file(file)}}},[_vm._v(_vm._s(file.name)),(!file.loading)?_c('i',{staticClass:\"file-download-icon icon ion-arrow-down-a\"}):_vm._e(),(file.loading)?_c('span',{staticClass:\"ml-2\"},[_vm._v(\"(\"+_vm._s(Math.round(file.loading))+\"%)\")]):_vm._e()])]):_c('div',{staticClass:\"nowrap\"},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.rename_submit(file)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(file.rename.name),expression:\"file.rename.name\"}],staticClass:\"form-control form-control-sm d-inline-block\",staticStyle:{\"width\":\"calc(100% - 60px)\"},attrs:{\"type\":\"text\",\"id\":'file-rename-'+file.id},domProps:{\"value\":(file.rename.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(file.rename, \"name\", $event.target.value)}}}),(!file.rename.loading)?_c('span',[_vm._m(3,true),_c('button',{staticClass:\"btn btn-sm btn-warning btn-gradient\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){file.rename = false}}},[_c('i',{staticClass:\"ion-close-round\"})])]):_c('i',{staticClass:\"ion-load-c spin\"})]),(file.rename.error)?_c('div',{staticClass:\"text-sm text-danger\"},[_vm._v(_vm._s(file.rename.error))]):_vm._e()])]):_c('span',{staticClass:\"text-muted text-bold\",staticStyle:{\"cursor\":\"not-allowed\"},attrs:{\"title\":file.name}},[_vm._v(\" \"+_vm._s(file.name)+\" \")])]),_c('td',{staticClass:\"d-none d-md-table-cell\"},[(file.extension)?_c('span',{staticClass:\"text-sm text-upper\"},[_vm._v(_vm._s(file.extension))]):_c('span',{staticClass:\"text-muted\"},[_vm._v(\"-\")])]),_c('td',{staticClass:\"d-none d-xl-table-cell\"},[(!file.size)?_c('div',[_c('i',{staticClass:\"ion-load-c spin text-muted\"})]):_c('span',{staticClass:\"text-muted text-sm\"},[_vm._v(_vm._s(_vm._f(\"format_bytes\")(file.size)))])]),_c('td',{staticClass:\"d-none d-md-table-cell width-0\"},[(file.last_modified_by === undefined)?_c('div',[_c('i',{staticClass:\"ion-load-c spin text-muted\"})]):_c('span',{staticClass:\"text-sm\"},[(_vm.user && _vm.user.team)?_c('modified-box',{attrs:{\"user-id\":file.last_modified_by,\"team\":_vm.user.team,\"timestamp\":file.last_modified,\"pullRight\":true,\"external-actor\":_vm.modifiedBoxExternal}}):_vm._e()],1)]),(_vm.are_files_with_multiple_versions)?_c('td',{staticClass:\"d-none d-xl-table-cell\"},[(file.versions_num === undefined)?_c('div',[_c('i',{staticClass:\"ion-load-c spin text-muted\"})]):_c('a',{staticStyle:{\"color\":\"inherit\"},attrs:{\"href\":\"#\",\"title\":\"List all versions\"},on:{\"click\":function($event){$event.preventDefault();file.show_details == 'versions' ? file.show_details = false : file.show_details = 'versions'}}},[(file.versions_num > 1)?_c('span',{attrs:{\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-content\":'There '+(file.versions_num > 2 ? 'are' : 'is')+' ' + (file.versions_num-1)+' previous version'+(file.versions_num > 2 ? 's' : '')+' of ' + file.name + ' Click to see details. ',\"data-html\":\"true\",\"data-trigger\":\"hover\"}},[_c('i',{staticClass:\"ion-ios-copy-outline icon-lg mr-2\"}),_vm._v(_vm._s(file.versions_num-1))]):_c('span',{staticClass:\"text-muted\"},[_vm._v(\"-\")])])]):_vm._e(),(!_vm.disable_share)?_c('td',{staticClass:\"d-none d-xl-table-cell\"},[(file.shares_num === undefined)?_c('div',[_c('i',{staticClass:\"ion-load-c spin text-muted\"})]):(file.shares_num > 0)?_c('a',{staticStyle:{\"color\":\"inherit\"},attrs:{\"href\":\"#\",\"title\":\"List shares of this file\"},on:{\"click\":function($event){$event.preventDefault();file.show_details == 'shares' ? file.show_details = false : file.show_details = 'shares'}}},[(file.shares_num > 0)?_c('span',{attrs:{\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-content\":file.shares_num + ' active share'+(file.shares_num == 1 ? '' : 's')+' (click to see details)',\"data-html\":\"true\",\"data-trigger\":\"hover\"}},[_c('i',{staticClass:\"ion-link icon-lg mr-2\"}),_vm._v(_vm._s(file.shares_num))]):_vm._e()]):_c('a',{staticClass:\"c-pointer text-muted\",attrs:{\"title\":\"Share this file\"},on:{\"click\":function($event){return _vm.open_share_form(file)}}},[_c('i',{staticClass:\"ion-plus-round\"})])]):_vm._e(),(!_vm.disable_download)?_c('td',{staticClass:\"d-none d-md-table-cell\"},[(file.cancel)?_c('button',{staticClass:\"btn text-sm btn-danger btn-flat\",on:{\"click\":function($event){return file.cancel()}}},[_vm._v(\" CANCEL \"),_c('i',{staticClass:\"ion-close-round ml-1\"})]):_c('section',[(file.viewer && file.id > 0)?_c('button',{staticClass:\"btn text-sm btn-flat\",class:[file.viewer.btn_class],attrs:{\"title\":'Open with ' + file.viewer.label},on:{\"click\":function($event){$event.preventDefault();return _vm.open_file(file)}}},[_vm._v(_vm._s(file.viewer.verb)+\" \"),_c('i',{staticClass:\"icon-lg ml-2\",class:file.viewer.icon_class})]):_c('button',{staticClass:\"btn btn-secondary btn-flat disabled\",attrs:{\"disabled\":\"\",\"title\":'Cannot preview ' + (file.extension ? file.extension.toUpperCase() : 'these types of ') + ' files yet :('}},[_vm._v(\"-\")])])]):_vm._e(),_c('td',[(!_vm.files_multiselect_on && file.id > 0)?_c('div',{staticClass:\"dropdown btn-group\"},[_vm._m(4,true),_c('div',{staticClass:\"dropdown-menu dropdown-menu-right\",attrs:{\"role\":\"menu\"}},[(!_vm.disable_share)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.open_share_form(file)}}},[_c('i',{staticClass:\"ion-share icon-lg mr-3\"}),_vm._v(\"Share\")]):_vm._e(),(!_vm.disable_download)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.download_file(file)}}},[_c('i',{staticClass:\"ion-arrow-down-a icon-lg mr-3\"}),_vm._v(\"Download\")]):_vm._e(),(!_vm.disable_namespace_ops)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.rename_file(file)}}},[_c('i',{staticClass:\"ion-edit icon-lg mr-3\"}),_vm._v(\"Rename\")]):_vm._e(),(!_vm.disable_namespace_ops)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.copy_move_file(file, 'move_file')}}},[_c('i',{staticClass:\"ion-forward icon-lg mr-3\"}),_vm._v(\"Move\")]):_vm._e(),(!_vm.disable_namespace_ops)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.copy_move_file(file, 'copy_file')}}},[_c('i',{staticClass:\"ion-plus-circled icon-lg mr-3\"}),_vm._v(\"Duplicate\")]):_vm._e(),_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.is_mobile ? _vm.open_file_info_modal(file) : file.show_details = 'info'}}},[_c('i',{staticClass:\"ion-information-circled icon-lg mr-3\"}),_vm._v(\"File info\")]),(!_vm.disable_namespace_ops)?_c('div',{staticClass:\"dropdown-divider\"}):_vm._e(),(!_vm.disable_namespace_ops)?_c('a',{staticClass:\"dropdown-item text-danger\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.delete_file(file)}}},[(_vm.deleteAction && _vm.deleteAction.icon)?_c('i',{class:[_vm.deleteAction.icon, 'icon-lg mr-3']}):_c('i',{staticClass:\"ion-trash-a icon-lg mr-3\"}),_vm._v(_vm._s(_vm.deleteAction ? _vm.deleteAction.label : 'Delete')+\" \")]):_vm._e()])]):_vm._e()])]),(file.loading)?_c('tr',{staticClass:\"file-loading\"},[_c('td',{attrs:{\"colspan\":\"9\"}},[_c('div',{staticClass:\"progress\"},[_c('div',{staticClass:\"progress-bar progress-bar-striped progress-bar-animated\",style:({'width': Math.round(file.loading)+'%'}),attrs:{\"role\":\"progressbar\",\"aria-valuenow\":file.loading,\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"}})])])]):_vm._e(),_c('tr',{staticClass:\"file-details-row\",class:{ open: file.show_details }},[_c('td',{staticClass:\"file-details-cell\",attrs:{\"colspan\":\"9\"}},[_c('div',{staticClass:\"float-right\"},[_c('a',{staticClass:\"btn btn-secondary btn-flat btn-sm text-sm\",attrs:{\"title\":\"Close info panel\"},on:{\"click\":function($event){file.show_details = false}}},[_vm._v(\" Close \"),_c('i',{staticClass:\"ion-close-round ml-2\"})])]),_c('ul',{staticClass:\"nav nav-pills mb-4 justify-content-center\",attrs:{\"role\":\"tablist\"}},[_c('li',{staticClass:\"nav-item btn\"},[_c('a',{staticClass:\"nav-link\",class:{'active': file.show_details == 'versions'},attrs:{\"data-toggle\":\"tab\",\"href\":'#file_' + file.id + '_versions',\"role\":\"tab\"},on:{\"click\":function($event){file.show_details = 'versions'}}},[_vm._v(\"Version History\")])]),(!_vm.disable_share)?_c('li',{staticClass:\"nav-item btn\"},[_c('a',{staticClass:\"nav-link\",class:{'active': file.show_details == 'shares'},attrs:{\"data-toggle\":\"tab\",\"href\":'#file_' + file.id + '_shares',\"role\":\"tab\",\"aria-expanded\":\"true\"},on:{\"click\":function($event){file.show_details = 'shares'}}},[_vm._v(\"Sharing Status\")])]):_vm._e(),_c('li',{staticClass:\"nav-item btn\"},[_c('a',{staticClass:\"nav-link\",class:{'active': file.show_details == 'info'},attrs:{\"data-toggle\":\"tab\",\"href\":'#file_' + file.id + '_info',\"role\":\"tab\"},on:{\"click\":function($event){file.show_details = 'info'}}},[_vm._v(\"File Information\")])])]),_c('div',{staticClass:\"tab-content\"},[(!_vm.disable_share)?_c('div',{staticClass:\"tab-pane\",class:{'show active': file.show_details == 'shares'},attrs:{\"id\":'file_' + file.id + '_shares',\"role\":\"tabpanel\"}},[_c('div',{staticClass:\"text-center\"},[(file.show_details == 'shares')?_c('file-sharing-status',{attrs:{\"user\":_vm.user,\"file\":file,\"shares_updated\":(shares) => { file.shares = shares }}}):_vm._e()],1)]):_vm._e(),_c('div',{staticClass:\"tab-pane\",class:{'show active': file.show_details == 'versions'},attrs:{\"id\":'file_' + file.id + '_versions',\"role\":\"tabpanel\"}},[_c('div',{staticClass:\"fw text-center\"},[(file.show_details == 'versions')?_c('file-versions-table',{attrs:{\"file\":file,\"user\":_vm.user,\"modifiedBoxExternal\":_vm.modifiedBoxExternal,\"open_file_fn\":_vm.disable_download ? null : _vm.open_file,\"download_file_fn\":_vm.disable_download ? null : _vm.download_file,\"versions_num_changed\":(num) => { file.versions_num = num }}}):_vm._e()],1)]),_c('div',{staticClass:\"tab-pane\",class:{'show active': file.show_details == 'info'},attrs:{\"id\":'file_' + file.id + '_info',\"role\":\"tabpanel\"}},[_c('table',{staticClass:\"table file-details-table\",staticStyle:{\"width\":\"auto\",\"margin\":\"0px auto\"}},[_c('tbody',[_c('tr',[_c('td',{staticClass:\"text-bold\"},[_vm._v(\"Name\")]),_c('td',[_vm._v(_vm._s(file.name))])]),_c('tr',[_c('td',{staticClass:\"text-bold\"},[_vm._v(\"Size\")]),_c('td',[_vm._v(_vm._s(_vm._f(\"format_bytes\")(file.size))+\" \"),_c('small',[_vm._v(\"(\"+_vm._s(Number(file.size).toLocaleString())+\" bytes)\")])])]),_c('tr',[_c('td',{staticClass:\"text-bold\"},[_vm._v(\"Type\")]),_c('td',[_vm._v(_vm._s(file.mime_type))])])])])])])])])])})],2)])])]):_vm._e()]),(_vm.files && _vm.files.length == 0 && !_vm.loading_filelist)?_c('section',[(_vm.disable_upload)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-4\"}),_c('div',{staticClass:\"col-12 col-lg-4\"},[_c('hero-box',{attrs:{\"bg-class\":'bg-gradient-secondary',\"icon\":'ion-qr-scanner',\"text\":'Empty directory'}})],1)]):_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-1\"}),_c('div',{staticClass:\"col-12 col-lg-5\"},[_c('hero-box',{attrs:{\"bg-class\":'bg-gradient-primary',\"icon\":'ion-ios-copy-outline',\"text\":'Upload files',\"clicked\":()=>{ _vm.file_upload_el.click() }}})],1),_c('div',{staticClass:\"col-12 col-lg-5\"},[_c('hero-box',{attrs:{\"bg-class\":'bg-gradient-info',\"icon\":'ion-ios-folder-outline',\"text\":'Upload a complete folder',\"clicked\":()=>{ _vm.folder_upload_el.click() }}})],1)])]):_vm._e(),(_vm.namespace && _vm.namespace.length == 0 && _vm.loading_filelist)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"}),_c('div',{staticClass:\"col-12 col-lg-6\"},[_c('hero-box',{attrs:{\"bg-class\":'bg-gradient-primary',\"icon\":'loader d-block'}})],1)]):_vm._e()]),_c('div',{staticClass:\"modal share-modal\",attrs:{\"id\":\"share-modal\"}},[(!_vm.disable_share && _vm.entities_to_share && _vm.entities_to_share.length > 0)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\"Create Share\")]),_c('button',{staticClass:\"close text-white\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('share-modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('share-form',{attrs:{\"entities\":_vm.entities_to_share,\"teamSettings\":_vm.user && _vm.user.team_settings,\"share-created\":_vm.share_created,\"close\":_vm.create_share_ready}})],1)])]):_vm._e()]),_c('div',{staticClass:\"modal modal-right fade\",attrs:{\"id\":\"filter-modal\"}},[_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_vm._m(5),_c('div',{staticClass:\"modal-body\"},[_c('p',[_vm._v(\"File types\")]),_c('div',{staticClass:\"setting-color\"},_vm._l((_vm.file_types),function(ext,idx){return _c('span',{key:idx,staticClass:\"btn btn-sm multi_select_btn rounded d-inline-block\",class:{ 'bg-blue-500': _vm.list_filters.types.indexOf(ext) >= 0 },on:{\"click\":function($event){return _vm.toggle_filter('types', ext)}}},[_vm._v(_vm._s(ext))])}),0)])])])]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"viewer-modal\"}},[(_vm.view_file)?_c('div',{staticClass:\"modal-dialog modal-lg\",staticStyle:{\"max-width\":\"80%\"}},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-primary text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_c('b',[_vm._v(_vm._s(_vm.view_file.file.name))])]),_c('button',{staticClass:\"close text-white\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":()=>{ if(_vm.view_file.file && _vm.view_file.file.cancel){_vm.view_file.file.cancel()} _vm.view_file.file.loading = false; _vm.view_file = null; _vm.close_modal('viewer-modal') }}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('file-preview',{attrs:{\"file\":_vm.view_file.file,\"version_id\":_vm.view_file.version_id,\"file_list\":_vm.view_file.file_list},on:{\"close\":()=>{ if(_vm.view_file.file && _vm.view_file.file.cancel){_vm.view_file.file.cancel()}; _vm.view_file.file.loading = false; _vm.view_file = null; _vm.close_modal('viewer-modal') }}})],1)])]):_vm._e()]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"move-copy-modal\"}},[(_vm.show_folder_tree)?_c('div',{staticClass:\"modal-dialog modal-lg\",staticStyle:{\"max-height\":\"90%\",\"overflow\":\"auto\"}},[_c('div',{staticClass:\"modal-content\",staticStyle:{\"border\":\"none\"}},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(_vm._s(_vm.show_folder_tree.action.startsWith('copy') ? \"Copy\" : \"Move\")+\" \"),_c('b',[_vm._v(_vm._s(_vm.show_folder_tree.file.name))])]),_c('button',{staticClass:\"close text-white\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){_vm.show_folder_tree = null; _vm.close_modal('move-copy-modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('namespace-tree',{attrs:{\"action\":_vm.show_folder_tree.action,\"target-file\":_vm.show_folder_tree.file,\"is_user_admin\":_vm.user.is_admin,\"is_client_space_client\":_vm.user.is_client_space_client},on:{\"ready\":(operation) => { _vm.copy_move_ready(_vm.show_folder_tree.file, operation) },\"close\":function($event){_vm.close_modal('move-copy-modal'); _vm.show_folder_tree = null}}})],1)])]):_vm._e()]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"file-info-modal\"}},[(_vm.info_modal_file)?_c('div',{staticClass:\"modal-dialog modal-lg\",staticStyle:{\"max-height\":\"90%\",\"overflow\":\"auto\"}},[_c('div',{staticClass:\"modal-content\",staticStyle:{\"border\":\"none\"}},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_c('img',{staticClass:\"file-icon mr-1\",attrs:{\"src\":_vm._f(\"filetype_img_src\")(_vm.info_modal_file.extension)}}),_c('b',[_vm._v(_vm._s(_vm.info_modal_file.name))])]),_c('button',{staticClass:\"close text-white\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('file-info-modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('file-info-modal',{attrs:{\"file\":_vm.info_modal_file,\"hide_shares\":_vm.disable_share,\"modifiedBoxExternal\":_vm.modifiedBoxExternal,\"download_file_fn\":_vm.disable_download ? null : _vm.download_file,\"user\":_vm.user}})],1)])]):_vm._e()]),_c('input',{staticStyle:{\"display\":\"none\"},attrs:{\"type\":\"file\",\"id\":\"file_upload\",\"multiple\":\"\"},on:{\"change\":_vm.files_selected}}),_c('input',{staticStyle:{\"display\":\"none\"},attrs:{\"type\":\"file\",\"id\":\"folder_upload\",\"webkitdirectory\":\"\"},on:{\"change\":_vm.folder_selected}})])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-lg-8\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-success b0\"},[_c('div',{staticClass:\"cardbox-body text-center text-bold text-12\"},[_vm._v(\" Congratulations, your SkyFlok account is fully set up! \"),_c('br'),_vm._v(\"Upload some files by clicking on the large blue button below, \"),_c('br'),_vm._v(\"or drag and drop them into the window! \")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-lg-8\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-warning b0\"},[_c('div',{staticClass:\"cardbox-body text-center text-bold text-12\"},[_vm._v(\" This is a safe folder that is only visible and accessible for Team Administrators. \"),_c('br'),_vm._v(\" It's an ideal place for things you don't want to share with the whole team, like passwords, invoices, contracts, Non-Disclosure Agreements and similar files. \")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('button',{staticClass:\"btn btn-sm btn-success btn-gradient ml-1 fh\",attrs:{\"type\":\"submit\"}},[_c('i',{staticClass:\"ion-checkmark-round\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('button',{staticClass:\"btn btn-sm btn-success btn-gradient\",attrs:{\"type\":\"submit\"}},[_c('i',{staticClass:\"ion-checkmark-round\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('button',{staticClass:\"btn btn-secondary btn-flat\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"type\":\"button\",\"data-toggle\":\"dropdown\",\"aria-expanded\":\"false\"}},[_c('i',{staticClass:\"ion-more icon-lg text-muted\",staticStyle:{\"vertical-align\":\"initial\"}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"modal-header\"},[_c('h4',{staticClass:\"mt-0 modal-title\"},[_c('span',[_vm._v(\"Filter file list\")])]),_c('div',{staticClass:\"float-right clickable\",attrs:{\"data-dismiss\":\"modal\"}},[_c('em',{staticClass:\"ion-close-round text-soft\"})])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.user)?_c('div',{staticClass:\"d-flex justify-content-center align-items-center\",class:{'pull-right': _vm.pullRight === true}},[_c('div',{staticClass:\"text-center text-nowrap\"},[_c('div',{},[_vm._v(_vm._s(_vm._f(\"timestamp_rel\")(_vm.timestamp))+\" \"),_c('i',{staticClass:\"ion-calendar ml-1 text-muted\",staticStyle:{\"cursor\":\"help\"},attrs:{\"title\":_vm._f(\"timestamp\")(_vm.timestamp)}})]),_c('div',{class:{'deleted text-muted text-nowrap': _vm.user.deleted }},[_vm._v(\"by \"+_vm._s(_vm.user.name))])]),(_vm.user.avatar_url)?_c('div',{staticClass:\"ml-2\"},[_c('img',{staticClass:\"fit-cover thumb32 rounded-circle shadow-z2\",attrs:{\"src\":_vm.is_client_space_logo ? _vm.Utils.client_space_logo_src(_vm.user.avatar_url) : _vm.user.avatar_url}})]):_vm._e()]):_c('div',[_c('i',{staticClass:\"ion-load-c spin\"})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n
\n
{{ timestamp | timestamp_rel }}
\n
by {{ user.name }}
\n
\n
\n
\n
\n
\n \n \n
\n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./modified-box.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./modified-box.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./modified-box.vue?vue&type=template&id=6710e6f4&scoped=true\"\nimport script from \"./modified-box.vue?vue&type=script&lang=js\"\nexport * from \"./modified-box.vue?vue&type=script&lang=js\"\nimport style0 from \"./modified-box.vue?vue&type=style&index=0&id=6710e6f4&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6710e6f4\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.file_to_preview)?_c('div',{staticClass:\"fw\"},[(_vm.file)?_c('table',{attrs:{\"id\":\"container-table\"}},[_c('tr',[(_vm.prev_file)?_c('td',{staticClass:\"pager fh text-center c-pointer mr-3 no-text-select d-none d-md-table-cell\",attrs:{\"title\":_vm.prev_file.name},on:{\"click\":function($event){_vm.file_to_preview = _vm.prev_file}}},[_c('i',{staticClass:\"ion-chevron-left\"}),_c('br'),_c('small',[_vm._v(_vm._s(_vm.prev_file.name.substr(0,11))+\"...\")])]):_vm._e(),_c('td',{staticClass:\"fw text-center\",staticStyle:{\"min-height\":\"500px\"}},[(_vm.file_to_preview.loading)?_c('div',[_vm._v(\" Downloading \"),_c('b',[_vm._v(_vm._s(_vm.file_to_preview ? _vm.file_to_preview.name : '-'))]),_vm._v(\": \"+_vm._s(Math.round(_vm.file_to_preview.loading))+\"% \"),_c('div',{staticClass:\"progress mt-2 mx-5\"},[_c('div',{staticClass:\"progress-bar progress-bar-info progress-bar-striped progress-bar-animated\",style:({'width': Math.round(_vm.file_to_preview.loading)+'%'}),attrs:{\"role\":\"progressbar\",\"aria-valuenow\":_vm.file_to_preview.loading,\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"}},[_c('span',{staticClass:\"sr-only\"},[_vm._v(_vm._s(Math.round(_vm.file_to_preview.loading))+\"% complete\")])])])]):(_vm.file_to_preview.blob_url)?[_c('p',[_c('a',{staticClass:\"btn btn-gradient btn-secondary ml-2\",attrs:{\"href\":_vm.file_to_preview.blob_url,\"download\":_vm.file_to_preview.name}},[_c('i',{staticClass:\"ion-arrow-down-a mr-2\"}),_vm._v(\" Save \"),_c('b',[_vm._v(_vm._s(_vm.file_to_preview.name))])])]),_c('file-preview',{attrs:{\"blob_url\":_vm.file_to_preview.blob_url,\"file_name\":_vm.file_to_preview.name,\"mime_type\":_vm.file_to_preview.mime_type,\"viewer_name\":_vm.file_to_preview.viewer.name}})]:_vm._e()],2),(_vm.next_file)?_c('td',{staticClass:\"pager fh text-center c-pointer ml-3 no-text-select d-none d-md-table-cell\",attrs:{\"title\":_vm.next_file.name},on:{\"click\":function($event){_vm.file_to_preview = _vm.next_file}}},[_c('i',{staticClass:\"ion-chevron-right\"}),_c('br'),_c('small',[_vm._v(_vm._s(_vm.next_file.name.substr(0, 11))+\"...\")])]):_vm._e()])]):_vm._e()]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.viewer_name == 'image')?_c('div',[_c('img',{staticClass:\"preview d-inline-block\",attrs:{\"src\":_vm.blob_url}})]):(_vm.viewer_name == 'video')?_c('div',[_c('video',{staticClass:\"fw d-block\",attrs:{\"src\":_vm.blob_url,\"controls\":\"true\",\"autoplay\":\"true\"}})]):(_vm.viewer_name == 'audio')?_c('div',[_c('audio',{staticClass:\"fw d-block\",attrs:{\"src\":_vm.blob_url,\"controls\":\"true\",\"autoplay\":\"true\"}})]):(_vm.viewer_name == 'text')?_c('div',[_c('pre',[_vm._v(_vm._s(_vm.text_file_contents))])]):_c('div',{staticClass:\"d-block embedded-object\"},[_c('object',{staticClass:\"fw d-block embedded-object\",attrs:{\"data\":_vm.blob_url,\"type\":_vm.mime_type,\"title\":_vm.file_name,\"name\":_vm.file_name,\"height\":\"800\"}},[_c('p',[_vm._v(\"Your browser cannot preview \"+_vm._s(_vm.file_name)+\". Please try downloading.\")])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n
\n
\n
\n
\n \n
\n
\n
\n
{{ text_file_contents }} \n
\n
\n
\n Your browser cannot preview {{ file_name }}. Please try downloading.
\n \n
\n
\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-preview.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-preview.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./file-preview.vue?vue&type=template&id=0ca6c986&scoped=true\"\nimport script from \"./file-preview.vue?vue&type=script&lang=js\"\nexport * from \"./file-preview.vue?vue&type=script&lang=js\"\nimport style0 from \"./file-preview.vue?vue&type=style&index=0&id=0ca6c986&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0ca6c986\",\n null\n \n)\n\nexport default component.exports","\n\n
\n \n \n\n \n \n Downloading
{{ file_to_preview ? file_to_preview.name : '-' }} : {{ Math.round(file_to_preview.loading) }}%\n
\n
\n {{Math.round(file_to_preview.loading)}}% complete
\n
\n
\n\n \n \n \n Save {{ file_to_preview.name }} \n \n
\n\n \n \n \n\n \n\n \n \n
\n
\n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-viewer.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-viewer.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./file-viewer.vue?vue&type=template&id=1eaf0cb1&scoped=true\"\nimport script from \"./file-viewer.vue?vue&type=script&lang=js\"\nexport * from \"./file-viewer.vue?vue&type=script&lang=js\"\nimport style0 from \"./file-viewer.vue?vue&type=style&index=0&id=1eaf0cb1&prod&lang=css&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1eaf0cb1\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{attrs:{\"id\":\"namespace-tree\"}},[(_vm.error)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.error))]):_vm._e(),_c('div',{staticClass:\"text-right\"},[(!_vm.submit_loading)?_c('div',[_c('button',{staticClass:\"btn btn-secondary mr-1\",class:{'btn-sm text-sm': _vm.is_mobile},on:{\"click\":function($event){return _vm.$emit('close')}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-info text-bold\",class:{'btn-sm text-sm': _vm.is_mobile},attrs:{\"disabled\":!_vm.selected_folder},on:{\"click\":function($event){return _vm.submit()}}},[_vm._v(_vm._s(_vm.action.startsWith('copy') ? 'Copy' : 'Move')+\" to \"+_vm._s(_vm.selected_folder ? _vm.selected_folder.name : '...'))])]):_c('i',{staticClass:\"ion-load-c spin\"})]),_c('div',{staticClass:\"dd mt-2 mb-2\"},[(_vm.namespace_loading)?_c('div',{staticClass:\"d-flex align-items-center justify-content-center gap-1\"},[_c('span',[_vm._v(\"Loading\")]),_c('i',{staticClass:\"ion-load-c spin\"})]):(_vm.namespace)?_c('namespace-tree-row',{attrs:{\"children\":_vm.namespace,\"clicked\":_vm.tree_folder_selected}}):_vm._e()],1),_c('div',{staticClass:\"text-right\"},[(!_vm.submit_loading)?_c('div',[_c('button',{staticClass:\"btn btn-secondary mr-1\",class:{'btn-sm text-sm': _vm.is_mobile},on:{\"click\":function($event){return _vm.$emit('close')}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-info text-bold\",class:{'btn-sm text-sm': _vm.is_mobile},attrs:{\"disabled\":!_vm.selected_folder},on:{\"click\":function($event){return _vm.submit()}}},[_vm._v(_vm._s(_vm.action.startsWith('copy') ? 'Copy' : 'Move')+\" to \"+_vm._s(_vm.selected_folder ? 'to '+_vm.selected_folder.name : '...'))])]):_c('i',{staticClass:\"ion-load-c spin\"})]),(_vm.error)?_c('div',{staticClass:\"alert alert-danger mt-2\"},[_vm._v(_vm._s(_vm.error))]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { bus, events } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\nimport { TokenCache } from '../helpers/token-cache.js';\n\nimport platform from 'platform'\n\n\n// This is not exported\nconst base_url = process.env.VUE_APP_client_spaces_service_url\nconst ClientSpacesService = {\n\n AUTH_TYPE_SKYFLOK_USER: 1,\n AUTH_TYPE_CLIENT: 2,\n\n CLIENT_SPACE_APP_PATH: \"client_space\",\n\n SPACE_EVENT_FILE_UPLOADED: 1,\n SPACE_EVENT_FILE_DELETED: 2,\n SPACE_EVENT_FOLDER_DELETED: 3,\n\n ACTOR_SPACE_MANAGER: 1,\n ACTOR_CLIENT: 2,\n\n is_skyflok_logo(space){\n // Returns True if the logo is a built-in image\n return space && space.client_logo && space.client_logo.search(\"client_space_logos/\") >= 0\n },\n\n /* Client Space Management (by logged in team member) */\n list(with_mfa_status){\n const url = '/spaces' + (with_mfa_status ? '?with_mfa=1' : '')\n return bus.$http.get(base_url + url, { headers: Utils.get_auth_header() })\n },\n\n create: function(space){\n if(space.id && space.id !== null){\n console.error(\"Space.create must be called without ID!\")\n return;\n }\n return bus.$http.post(base_url + '/spaces', space, { headers: Utils.get_auth_header() })\n },\n\n create_batch(form, clients){\n const payload = {\n common: form,\n clients: clients\n }\n\n return bus.$http.post(base_url + '/spaces_batch', payload, { headers: Utils.get_auth_header() })\n },\n\n update: function(space){\n if(space.id == undefined || space.id == null){\n console.error(\"Space.update must be called with ID!\")\n return;\n }\n return bus.$http.put(base_url + '/spaces', space, { headers: Utils.get_auth_header() })\n },\n\n archive(space_id, new_value, schedule_delete){\n if(schedule_delete === undefined){ schedule_delete = false }\n const payload = {\n id: space_id,\n is_archived: new_value,\n schedule_delete: schedule_delete\n }\n return bus.$http.put(base_url + \"/space/archive\", payload, { headers: Utils.get_auth_header() })\n },\n\n add_space_manager(space_id, manager_user_id){\n const payload = {\n id: space_id,\n user_id: manager_user_id\n }\n\n return bus.$http.post(base_url + \"/space/add_manager\", payload, { headers: Utils.get_auth_header() })\n },\n\n remove_space_manager(space_id, manager_user_id){\n const payload = {\n id: space_id,\n user_id: manager_user_id\n }\n\n return bus.$http.post(base_url + \"/space/remove_manager\", payload, { headers: Utils.get_auth_header() })\n },\n\n CHANGE_WATCH_ALL_SPACES: -1,\n watch_managers(space_id, new_watch_value){\n let payload = {\n watch: new_watch_value ? 1 : 0\n }\n if(space_id === ClientSpacesService.CHANGE_WATCH_ALL_SPACES){\n payload[\"all\"] = 1\n }\n else{\n payload[\"id\"] = space_id\n }\n return bus.$http.put(base_url + \"/space/watch_managers\", payload, { headers: Utils.get_auth_header() })\n },\n\n get_files_count(){\n return bus.$http.get(base_url + \"/files_count\", { headers: Utils.get_auth_header() })\n },\n\n get_space_size(space_id){\n return bus.$http.get(base_url + \"/space/\"+space_id+\"/total_size\", { headers: Utils.get_auth_header() })\n },\n\n\n /* Endpoints called from the Client Space App (either by a logged in member or the client) */\n\n /**\n * Logs in a Client Space client\n * You have to pass the hashed password and either the space key or the client email.\n * Device ID and browser information are added to the request automatically.\n *\n * @param {String} password The client's hashed password\n * @param {String} key (opt) Space key\n * @param {String} email (opt) The client's email\n * @param {String} mfa_code (opt) Two-factor authentication code\n * @param {String} mfa_backup_code (opt) Two-factor authentication backup code\n * @return The token in the response body JSON object\n */\n login_client(password, key, email, mfa_code, mfa_backup_code){\n let payload = {\n password: password,\n device_id: Utils.get_device_id(),\n client_os: platform.os ? platform.os.family : 'unknown',\n client_name: platform.name,\n client_version: platform.version\n }\n\n if(key){\n payload.key = key\n }\n else if(email){\n payload.email = email\n }\n\n if(mfa_code){\n payload['mfa_code'] = mfa_code\n }\n else if(mfa_backup_code){\n payload['mfa_backup_code'] = mfa_backup_code\n }\n\n return bus.$http.post(base_url + \"/client/login\", payload)\n },\n\n\n /**\n * Invalidate the client's session\n *\n * @param {Object} auth The client auth object (including the token)\n * @return Nothing besides the HTTP status code\n */\n logout_client(auth){\n if(auth.type != ClientSpacesService.AUTH_TYPE_CLIENT){\n throw \"Auth type must be Client!\"\n }\n\n const headers = {\n \"Authorization\": \"ClientToken \" + auth.token\n }\n\n return bus.$http.get(base_url + \"/client/logout\", { headers: headers } )\n },\n\n get_space(auth, key, with_team_info, with_locations){\n const url_params = {\n key: key,\n with_team_info: (with_team_info ? 1 : 0),\n with_locations: (with_locations ? 1 : 0)\n }\n let headers = {}, endpoint;\n\n if(auth.type === this.AUTH_TYPE_SKYFLOK_USER){\n headers = Utils.get_auth_header()\n endpoint = \"/space\"\n }\n if(auth.type === this.AUTH_TYPE_CLIENT){\n headers = {\n \"Authorization\": \"ClientToken \" + auth.token\n }\n endpoint = \"/client/space\"\n }\n\n return bus.$http.get(base_url + endpoint, { params: url_params, headers: headers })\n },\n\n get_team_info(space_key){\n return bus.$http.get(base_url + \"/space/\"+space_key+\"/team_info\")\n },\n\n client_info_edit(space_key, auth, client_info){\n const url_params = {\n key: space_key\n }\n const headers = {\n \"Authorization\": \"ClientToken \" + auth.token\n }\n return bus.$http.put(base_url + '/client/update_info', client_info, { params: url_params, headers: headers })\n },\n\n watch_client(auth, space_key, new_watch_value){\n const payload = {\n key: space_key,\n watch: new_watch_value\n }\n const headers = {\n \"Authorization\": \"ClientToken \" + auth.token\n }\n return bus.$http.put(base_url + '/client/watch_client', payload, { headers: headers })\n },\n\n load_valid_invite(invite_code){\n const url_params = {\n code: invite_code\n }\n return bus.$http.get(base_url + '/invites/get_valid', { params: url_params })\n },\n\n client_join_space(invite_code, password_hash, watch_client, mfa_code, mfa_backup_code){\n let payload = new FormData()\n payload.append(\"password\", password_hash)\n payload.append(\"invite_code\", invite_code)\n payload.append(\"watch_client\", watch_client ? 1 : 0)\n // Additional info for the new session\n payload.append(\"device_id\", Utils.get_device_id())\n payload.append(\"client_os\", platform.os ? platform.os.family : 'unknown')\n payload.append(\"client_name\", platform.name)\n payload.append(\"client_version\", platform.version)\n\n if(mfa_code){\n payload.append(\"mfa_code\", mfa_code)\n }\n if(mfa_backup_code){\n payload.append(\"mfa_backup_code\", mfa_backup_code)\n }\n\n return bus.$http.post(base_url + '/invites/client_join', payload)\n },\n\n resend_invite(space_id){\n const payload = {\n space_id: space_id\n }\n return bus.$http.put(base_url + \"/invites/resend\", payload, { headers: Utils.get_auth_header() })\n },\n\n resend_invite_batch(space_ids){\n const payload = {\n space_ids: space_ids\n }\n // Same endpoint as 'resend_invite', just different payload (space_ids instead of space_id)\n return bus.$http.put(base_url + \"/invites/resend\", payload, { headers: Utils.get_auth_header() })\n },\n\n reset_password(space_key){\n const payload = {\n key: space_key\n }\n return bus.$http.post(base_url + \"/space/reset_password\", payload, { headers: Utils.get_auth_header() })\n },\n\n /**\n * Report an event that happened in a Space and can be subscribed for\n *\n * @param {Number} space_id ID of the Space where the event happened\n * @param {Number} event Code of the event, use one of ClientSpacesService.SPACE_EVENT_xxx constants\n * @param {Number} actor Who initiated the event, use ne of ClientSpacesService.ACTOR_xxx constants\n * @param {Number} file_id (optional) The file or folder involved (if applicable)\n * @return Does not return any info besides the status code and error message\n */\n report_space_event(auth, space_id, event, actor, file_id){\n let payload = {\n space_id: space_id,\n event: event,\n actor: actor\n }\n if(file_id){\n payload[\"file_id\"] = file_id\n }\n\n let headers = {}, endpoint;\n\n if(auth.type === this.AUTH_TYPE_SKYFLOK_USER){\n headers = Utils.get_auth_header()\n endpoint = \"/space_event\"\n }\n if(auth.type === this.AUTH_TYPE_CLIENT){\n headers = {\n \"Authorization\": \"ClientToken \" + auth.token\n }\n endpoint = \"/client/space_event\"\n }\n\n return bus.$http.post(base_url + endpoint, payload, { headers: headers })\n },\n\n query_file_uploads_downloads(auth, space_key, desc, howmany, offset){\n const payload = {\n key: space_key,\n desc: desc ? 1 : 0,\n howmany: howmany,\n offset: offset\n }\n\n let headers = {}\n let endpoint = null\n\n if(auth.type === this.AUTH_TYPE_SKYFLOK_USER){\n headers = Utils.get_auth_header()\n endpoint = \"/space/file_uploads_downloads\"\n }\n if(auth.type === this.AUTH_TYPE_CLIENT){\n headers = {\n \"Authorization\": \"ClientToken \" + auth.token\n }\n endpoint = \"/client/file_uploads_downloads\"\n }\n\n return bus.$http.post(base_url + endpoint, payload, { headers: headers })\n },\n\n load_client_2fa_backup_codes(space_id){\n return bus.$http.get(base_url + \"/space/get_2fa_backup_codes/\"+space_id, { headers: Utils.get_auth_header() })\n },\n \n // TODO remove, Clients can generate backup codes with AuthService, proxying the request through Client Space Service is no longer needed\n generate_client_2fa_backup_codes(space_id){\n return bus.$http.put(base_url + \"/space/generate_2fa_backup_codes/\"+space_id, null, { headers: Utils.get_auth_header() })\n },\n\n get_client_2fa_events(){\n return bus.$http.get(base_url + \"/client/get_2fa_events\", { headers: Utils.get_auth_header() })\n }\n}\n\nexport { ClientSpacesService }\n\n\n\n\n/* **************************************************************************************** */\n// Install HTTP interceptor for requests going to FileVersion and StorageBackend endpoints\n// when a client space is open and the client (non-user) is interacting with it. In this\n// case, we have to proxy the request through ClientSpace Service, which calls the\n// originally requested service functionality via an authenticated interservice call\n/* **************************************************************************************** */\n\nimport Vue from 'vue'\nimport VueResource from 'vue-resource';\nVue.use(VueResource)\n\nconst client_space_url_key = Utils.parse_url_param('key')\nconst BASE_PATH = process.env.VUE_APP_BASE_PATH + '/'\nconst full_path = window.location.pathname\nconst relative_path = full_path.slice(BASE_PATH.length, full_path.length)\n\n// Both the Client and SkyFlok users store their tokens in the token cache, but the client also has a 'client-space-key=[key]' entry\n// Note that the key can either be in sessionStorage or localStorage, based on whether the client checked the \"keep me logged in\" checkbox when logging in\nconst is_client_space_client = sessionStorage.getItem(\"client-space-key\") == client_space_url_key || localStorage.getItem(\"client-space-key\") === client_space_url_key\n\nif(relative_path === ClientSpacesService.CLIENT_SPACE_APP_PATH && is_client_space_client && client_space_url_key && client_space_url_key.length > 0){\n // Client space\n\n const requests_to_redirect = [\n {\n /* List all versions of a file */\n base_url: process.env.VUE_APP_fileversion_service_url,\n method: \"GET\",\n service: \"file_version\",\n path: \"history\"\n },\n {\n /* FileVersion latest version info */\n base_url: process.env.VUE_APP_fileversion_service_url,\n method: \"GET\",\n service: \"file_version\",\n path: \"latest\"\n },\n {\n /* FileVersion latest version info, POST version */\n base_url: process.env.VUE_APP_fileversion_service_url,\n method: \"POST\",\n service: \"file_version\",\n path: \"latest\"\n },\n {\n /* FileVersion: create new version */\n base_url: process.env.VUE_APP_fileversion_service_url,\n method: \"POST\",\n service: \"file_version\",\n path: \"file_version\"\n },\n {\n /* Get download links to the file version */\n base_url: process.env.VUE_APP_fileversion_service_url,\n method: \"GET\",\n service: \"file_version\",\n path: \"download_version\"\n },\n {\n /* Get download links to the latest version of the file */\n base_url: process.env.VUE_APP_fileversion_service_url,\n method: \"GET\",\n service: \"file_version\",\n path: \"download_latest\"\n },\n {\n /* Get upload links to create a new file */\n base_url: process.env.VUE_APP_storage_backend_service_url,\n method: \"POST\",\n service: \"storage_backend\",\n path: \"get_upload_links\"\n },\n {\n /* Get upload links to create a new file */\n base_url: process.env.VUE_APP_storage_backend_service_url,\n method: \"GET\",\n service: \"storage_backend\",\n path: \"buckets\",\n block: true\n },\n {\n /* Disable getting storage info */\n base_url: process.env.VUE_APP_fileversion_service_url,\n method: \"GET\",\n service: \"file_version\",\n path: \"info/total_storage\",\n block: true\n },\n\n ]\n\n Vue.http.interceptors.push( (request, next) => {\n const request_url = new URL(request.url)\n // Check if the request is one of the ones we want to redirect\n for(var i=0 ; i\n\n
{{ error }}
\n
\n
\n Cancel \n {{ action.startsWith('copy') ? 'Copy' : 'Move' }} to {{selected_folder ? selected_folder.name : '...'}} \n
\n
\n
\n\n
\n \n\n
\n Loading \n \n
\n
\n
\n\n
\n
\n Cancel \n {{ action.startsWith('copy') ? 'Copy' : 'Move' }} to {{selected_folder ? 'to '+selected_folder.name : '...'}} \n
\n
\n
\n
{{ error }}
\n
\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./namespace-tree.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./namespace-tree.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./namespace-tree.vue?vue&type=template&id=7ec11960&scoped=true\"\nimport script from \"./namespace-tree.vue?vue&type=script&lang=js\"\nexport * from \"./namespace-tree.vue?vue&type=script&lang=js\"\nimport style0 from \"./namespace-tree.vue?vue&type=style&index=0&id=7ec11960&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7ec11960\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"sharing_status\"},[(_vm.loading)?_c('i',{staticClass:\"ion-load-c spin\"}):_c('div',[(_vm.shares && _vm.shares.length > 0)?_c('section',[_c('table',{staticClass:\"table table-sm table-striped d-none d-xl-block\",staticStyle:{\"width\":\"fit-content\"}},[_vm._m(0),_c('tbody',_vm._l((_vm.file.shares),function(share){return _c('tr',{key:share.id,class:{'text-muted': !share.active}},[_c('td',[_vm._v(_vm._s(_vm._f(\"timestamp_rel\")(share.created)))]),_c('td',[_c('user-box',{attrs:{\"userId\":share.created_by,\"team\":_vm.user.team,\"pullLeft\":true}})],1),_c('td',[(share.expire)?_c('span',[_vm._v(_vm._s(_vm._f(\"timestamp_rel\")(share.expire)))]):_c('span',[_vm._v(\"Never\")])]),_c('td',[_vm._v(\" \"+_vm._s(share.download_limit ? share.download_limit : 'No limit')+\" \")]),_c('td',[_vm._v(\" \"+_vm._s(share.active ? 'Yes' : 'No')+\" \")]),_c('td',[_c('div',{staticClass:\"input-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(share.link),expression:\"share.link\"}],staticClass:\"form-control form-control-sm\",staticStyle:{\"width\":\"100px\"},attrs:{\"type\":\"text\"},domProps:{\"value\":(share.link)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(share, \"link\", $event.target.value)}}}),_c('button',{staticClass:\"btn btn-sm btn-secondary btn-gradient\",attrs:{\"title\":\"Copy link to clipboard\"},on:{\"click\":function($event){return _vm.to_clipboard(share.link)}}},[_c('i',{staticClass:\"ion-clipboard icon-lg\"})])])]),_c('td',[(share.password)?_c('div',{staticClass:\"input-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(share.password),expression:\"share.password\"}],staticClass:\"form-control form-control-sm\",staticStyle:{\"width\":\"100px\"},attrs:{\"type\":\"text\"},domProps:{\"value\":(share.password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(share, \"password\", $event.target.value)}}}),_c('button',{staticClass:\"btn btn-sm btn-secondary btn-gradient\",attrs:{\"title\":\"Copy password to clipboard\"},on:{\"click\":function($event){return _vm.to_clipboard(share.password)}}},[_c('i',{staticClass:\"ion-clipboard icon-lg\"})])]):_c('div',[_c('i',[_vm._v(\"No password\")])])]),_c('td')])}),0)]),_c('div',{staticClass:\"d-block d-xl-none\"},_vm._l((_vm.shares),function(share,idx){return _c('div',{key:share.id},[_c('div',{staticClass:\"share-header text-bold d-flex align-items-center justify-content-between mt-2 mb-2\"},[_c('span',[_vm._v(\"Share \"+_vm._s(idx+1))]),_c('div',{staticClass:\"d-flex align-items-center justify-content-center mb-1\"},[_c('button',{staticClass:\"btn btn-sm text-sm btn-outline-warning mr-1\",attrs:{\"disabled\":share.disable_loading},on:{\"click\":function($event){return _vm.disable_share(share)}}},[_c('i',{staticClass:\"ion-alert-circled mr-1\"}),_vm._v(\" Disable \"),(share.disable_loading)?_c('i',{staticClass:\"ion-load-c ml-1\"}):_vm._e()]),_c('a',{staticClass:\"btn text-sm btn-sm btn-primary\",attrs:{\"href\":share.link,\"target\":\"_BLANK\"}},[_c('i',{staticClass:\"ion-share icon-lg\"}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"Open\")])])])]),_c('div',{staticClass:\"share-details ml-2\"},[(share.error)?_c('div',{staticClass:\"alert alert-danger alert-sm text-sm\",domProps:{\"innerHTML\":_vm._s(share.error)}}):_vm._e(),_c('div',[_c('b',[_vm._v(\"Created by: \")]),(_vm.user && _vm.user.team)?_c('user-box',{attrs:{\"team\":_vm.user.team,\"user-id\":share.created_by}}):_vm._e()],1),_c('div',[_c('b',[_vm._v(\"Expires: \")]),_vm._v(\" \"),(share.expire)?_c('span',{staticClass:\"text-lower\"},[_vm._v(_vm._s(_vm._f(\"timestamp_rel\")(share.expire)))]):_c('span',[_vm._v(\"Never\")])]),_c('div',[_c('b',[_vm._v(\"Password: \")]),(share.password)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(share.password),expression:\"share.password\"}],staticClass:\"form-control form-control-sm\",staticStyle:{\"width\":\"100px\"},attrs:{\"type\":\"text\"},domProps:{\"value\":(share.password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(share, \"password\", $event.target.value)}}}):_c('span',[_vm._v(\"None\")])])])])}),0)]):_c('div',{staticClass:\"text-success text-center\"},[_c('i',{staticClass:\"ion-locked mr-2\"}),_vm._v(\"This file is not shared \")])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('thead',[_c('th',[_vm._v(\"Created\")]),_c('th',[_vm._v(\"Shared by\")]),_c('th',[_vm._v(\"Expires\")]),_c('th',[_vm._v(\"Download limit\")]),_c('th',[_vm._v(\"Active\")]),_c('th',[_vm._v(\"Share link\")]),_c('th',[_vm._v(\"Password\")]),_c('th')])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.user)?_c('span',{staticClass:\"user_box\",attrs:{\"title\":_vm.user.name}},[(_vm.user.avatar_url && !_vm.no_avatar && _vm.avatar_left)?_c('img',{staticClass:\"thumb32 rounded-circle shadow-z2 mr-2\",staticStyle:{\"object-fit\":\"cover\"},attrs:{\"src\":_vm.user.avatar_url}}):_vm._e(),_c('span',{class:{'text-muted text-italic': _vm.user.deleted === true}},[_vm._v(_vm._s(_vm.user.name))]),(_vm.user.avatar_url && !_vm.no_avatar && !_vm.avatar_left)?_c('img',{staticClass:\"thumb32 rounded-circle shadow-z2 ml-2\",staticStyle:{\"object-fit\":\"cover\"},attrs:{\"src\":_vm.user.avatar_url}}):_vm._e()]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n {{ user.name }} \n \n \n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./user-box.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./user-box.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./user-box.vue?vue&type=template&id=711259fb&scoped=true\"\nimport script from \"./user-box.vue?vue&type=script&lang=js\"\nexport * from \"./user-box.vue?vue&type=script&lang=js\"\nimport style0 from \"./user-box.vue?vue&type=style&index=0&id=711259fb&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"711259fb\",\n null\n \n)\n\nexport default component.exports","\n\n
\n
\n \n
0\" >\n \n \n
\n \n
\n
\n
\n Created by: \n \n
\n
\n Expires: {{ share.expire | timestamp_rel }} Never \n
\n \n
\n Password: \n \n None \n
\n
\n
\n
\n \n
\n This file is not shared\n
\n
\n\n
\n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-sharing-status.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-sharing-status.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./file-sharing-status.vue?vue&type=template&id=6da9bda3&scoped=true\"\nimport script from \"./file-sharing-status.vue?vue&type=script&lang=js\"\nexport * from \"./file-sharing-status.vue?vue&type=script&lang=js\"\nimport style0 from \"./file-sharing-status.vue?vue&type=style&index=0&id=6da9bda3&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6da9bda3\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[(_vm.versions_limit >= 0)?_c('div',{staticClass:\"fw alert alert-sm alert-info\"},[_c('i',{staticClass:\"ion-information-circled mr-1\"}),_c('b',[_vm._v(\"Maximum \"+_vm._s(_vm.versions_limit+1)+\" file versions are stored.\")]),_vm._v(\" Upgrade your plan for unlimited versions. \")]):_vm._e(),(_vm.versions)?_c('section',[_c('table',{staticClass:\"table table-sm d-none d-lg-block mx-auto\",staticStyle:{\"width\":\"fit-content\"},attrs:{\"id\":\"fileversions-table\"}},[_vm._m(0),_c('tbody',_vm._l((_vm.versions),function(version,idx){return _c('tr',{key:version.id},[_c('td',{staticClass:\"text-center\",class:{'text-bold': idx === _vm.versions.length-1}},[(idx === _vm.versions.length-1)?_c('span',[_vm._v(\"Latest\")]):_c('span',[_vm._v(_vm._s(idx+1)+\".\")])]),_c('td',{staticClass:\"text-center\"},[_vm._v(_vm._s(_vm._f(\"timestamp_time_date\")(version.timestamp)))]),_c('td',{staticClass:\"text-center\"},[(_vm.user && _vm.user.team)?_c('user-box',{attrs:{\"external-actor\":_vm.modifiedBoxExternal,\"team\":_vm.user.team,\"user-id\":version.user_id}}):_vm._e()],1),_c('td',{staticClass:\"nowrap text-center\"},[_vm._v(_vm._s(_vm._f(\"format_bytes\")(version.size)))]),(_vm.download_file_fn)?_c('td',{staticClass:\"width-0\"},[(_vm.file.viewer && _vm.open_file_fn)?_c('button',{staticClass:\"btn text-sm btn-flat\",class:[_vm.file.viewer.btn_class ],attrs:{\"disabled\":_vm.open_file_fn === null,\"title\":'Open this version with ' + _vm.file.viewer.label},on:{\"click\":function($event){$event.preventDefault();_vm.open_file_fn(_vm.file, (version.id || version.version))}}},[_vm._v(\" \"+_vm._s(_vm.file.viewer.verb)+\" \"),_c('i',{staticClass:\"icon-lg ml-2\",class:_vm.file.viewer.icon_class})]):_vm._e(),(_vm.download_file_fn)?_c('button',{staticClass:\"btn text-sm btn-sm btn-primary\",attrs:{\"disabled\":_vm.file.loading},on:{\"click\":function($event){_vm.download_file_fn(_vm.file, (version.id || version.version))}}},[_c('i',{staticClass:\"icon-lg\",class:{'ion-arrow-down-a': !_vm.file.loading, 'ion-load-c spin': _vm.file.loading}}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"Download\")])]):_vm._e()]):_vm._e()])}),0)]),_c('div',{staticClass:\"d-block d-lg-none\"},_vm._l((_vm.versions),function(version,idx){return _c('div',{key:version.id},[_c('div',{staticClass:\"version-header text-bold d-flex align-items-center justify-content-between mt-2 mb-2\"},[_c('span',[_vm._v(\"Version \"+_vm._s(idx+1))]),(_vm.download_file_fn)?_c('button',{staticClass:\"btn text-sm btn-sm btn-primary mb-1\",attrs:{\"disabled\":_vm.file.loading},on:{\"click\":function($event){_vm.download_file_fn(_vm.file, (version.id || version.version))}}},[_c('i',{staticClass:\"icon-lg\",class:{'ion-arrow-down-a': !_vm.file.loading, 'ion-load-c spin': _vm.file.loading}}),_c('span',{staticClass:\"ml-1\"},[_vm._v(\"Download\")])]):_vm._e()]),_c('div',{staticClass:\"version-details ml-2\"},[_c('div',[_c('b',[_vm._v(\"Uploader: \")]),(_vm.user && _vm.user.team)?_c('user-box',{attrs:{\"external-actor\":_vm.modifiedBoxExternal,\"team\":_vm.user.team,\"user-id\":version.user_id}}):_vm._e()],1),_c('div',[_c('b',[_vm._v(\"Created: \")]),_vm._v(\" \"+_vm._s(_vm._f(\"timestamp_time_date\")(version.timestamp))+\" \")]),_c('div',[_c('b',[_vm._v(\"Size: \")]),_vm._v(\" \"+_vm._s(_vm._f(\"format_bytes\")(version.size))+\" \")])])])}),0)]):_c('i',{staticClass:\"ion-load-c spin\"})])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('thead',[_c('th',{staticClass:\"text-center width-0\"},[_vm._v(\"Version\")]),_c('th',{staticClass:\"text-center\"},[_vm._v(\"Created\")]),_c('th',{staticClass:\"text-center\"},[_vm._v(\"Uploader\")]),_c('th',{staticClass:\"text-center\"},[_vm._v(\"Size\")]),_c('th',{staticClass:\"width-0\"})])\n}]\n\nexport { render, staticRenderFns }","\n \n = 0\" class=\"fw alert alert-sm alert-info \">\n \n Maximum {{ versions_limit+1 }} file versions are stored. \n Upgrade your plan for unlimited versions.\n
\n\n \n \n \n \n Version \n Created \n Uploader \n Size \n \n \n \n \n \n Latest \n {{idx+1}}. \n \n {{ version.timestamp | timestamp_time_date }} \n \n {{ version.size | format_bytes }} \n \n \n {{ file.viewer.verb }} \n \n \n \n Download \n \n \n \n \n
\n\n \n \n
\n \n
\n
\n Uploader: \n \n
\n
\n Created: {{ version.timestamp | timestamp_time_date }}\n
\n
\n Size: {{ version.size | format_bytes }}\n
\n
\n
\n
\n\n \n\n \n\n \n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-versions-table.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-versions-table.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./file-versions-table.vue?vue&type=template&id=61497e3e&scoped=true\"\nimport script from \"./file-versions-table.vue?vue&type=script&lang=js\"\nexport * from \"./file-versions-table.vue?vue&type=script&lang=js\"\nimport style0 from \"./file-versions-table.vue?vue&type=style&index=0&id=61497e3e&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"61497e3e\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"share_form\"},[(_vm.error)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.error))]):_vm._e(),(_vm.success)?_c('div',{staticClass:\"alert alert-success\"},[_vm._v(_vm._s(_vm.success))]):_vm._e(),(!_vm.new_share)?_c('div',[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"text-center fw\"},_vm._l((_vm.entities),function(entity){return _c('sharedFile',{key:entity.id,attrs:{\"entity\":entity}})}),1)]),(_vm.invalid_share)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.invalid_share))]):_c('div',{staticClass:\"row mt-4\"},[_c('div',{staticClass:\"col-1\"}),_c('div',{staticClass:\"col-12 col-lg-10\"},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_share.apply(null, arguments)}}},[(!_vm.share_expire_days_to)?_c('div',{staticClass:\"form-group\",class:{'text-gray': !_vm.share_expire_checkbox}},[_c('div',{staticClass:\"form-check d-flex align-items-center\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.share_expire_checkbox),expression:\"share_expire_checkbox\"}],staticClass:\"form-check-input\",attrs:{\"type\":\"checkbox\",\"id\":\"share_expires\"},domProps:{\"value\":true,\"checked\":Array.isArray(_vm.share_expire_checkbox)?_vm._i(_vm.share_expire_checkbox,true)>-1:(_vm.share_expire_checkbox)},on:{\"change\":function($event){var $$a=_vm.share_expire_checkbox,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=true,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.share_expire_checkbox=$$a.concat([$$v]))}else{$$i>-1&&(_vm.share_expire_checkbox=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.share_expire_checkbox=$$c}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":\"share_expires\"}},[_c('section',{attrs:{\"clasS\":\" d-flex align-items-center gap-2\"}},[_c('span',[_vm._v(\"Share expires\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.expire_days),expression:\"form.expire_days\"}],staticClass:\"form-control form-control-sm\",class:{'text-muted': !_vm.share_expire_checkbox},staticStyle:{\"display\":\"inline\",\"width\":\"50px\"},attrs:{\"type\":\"number\",\"min\":1,\"max\":_vm.share_expire_days_to ? Math.min(365, _vm.share_expire_days_to) : 365,\"disabled\":!_vm.share_expire_checkbox},domProps:{\"value\":(_vm.form.expire_days)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"expire_days\", $event.target.value)}}}),_c('span',[_vm._v(\"days from today \"),(_vm.form.expire_days)?_c('i',[_vm._v(\"(on \"+_vm._s(_vm.expire_date)+\")\")]):_vm._e()])])])])]):_vm._e(),(_vm.password_protection_enabled)?_c('div',{staticClass:\"form-group\",class:{'text-muted': !_vm.form.enable_password}},[(_vm.teamSettings.is_passwordless_share_allowed)?_c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.enable_password),expression:\"form.enable_password\"}],staticClass:\"form-check-input\",attrs:{\"type\":\"checkbox\",\"id\":\"share_enable_password\"},domProps:{\"checked\":Array.isArray(_vm.form.enable_password)?_vm._i(_vm.form.enable_password,null)>-1:(_vm.form.enable_password)},on:{\"change\":function($event){var $$a=_vm.form.enable_password,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.form, \"enable_password\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.form, \"enable_password\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.form, \"enable_password\", $$c)}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":\"share_enable_password\"}},[_vm._v(\"Password protection\")])]):_c('span',[_vm._v(\" Password protection: \"),_vm._m(0)])]):_vm._e(),(!_vm.is_folder_share)?_c('div',{staticClass:\"d-flex align-items-center gap-2\",class:{'text-gray': !_vm.download_limit_checkbox}},[_c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.download_limit_checkbox),expression:\"download_limit_checkbox\"}],staticClass:\"form-check-input\",attrs:{\"type\":\"checkbox\",\"id\":\"share_max_downloads\"},domProps:{\"value\":true,\"checked\":Array.isArray(_vm.download_limit_checkbox)?_vm._i(_vm.download_limit_checkbox,true)>-1:(_vm.download_limit_checkbox)},on:{\"change\":function($event){var $$a=_vm.download_limit_checkbox,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=true,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.download_limit_checkbox=$$a.concat([$$v]))}else{$$i>-1&&(_vm.download_limit_checkbox=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.download_limit_checkbox=$$c}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":\"share_max_downloads\"}},[_vm._v(\"Maximum file downloads: \")])]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.download_limit),expression:\"form.download_limit\"}],staticClass:\"form-control form-control-sm\",class:{'text-muted': !_vm.download_limit_checkbox},staticStyle:{\"display\":\"inline\",\"width\":\"50px\"},attrs:{\"type\":\"number\",\"min\":\"1\",\"max\":\"100\",\"disabled\":!_vm.download_limit_checkbox},domProps:{\"value\":(_vm.form.download_limit)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"download_limit\", $event.target.value)}}}),_c('i',{staticClass:\"ion-help-circled\",attrs:{\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-content\":\"Limit how many times the shared file can be downloaded. When the download limit is reached, the share is disabled automatically.\",\"data-html\":\"true\",\"data-trigger\":\"hover\"}})]):_vm._e(),_c('div',{staticClass:\"form-group mt-4\"},[_c('label',{staticClass:\"control-label\",attrs:{\"for\":\"message-content\"}},[_vm._v(\"Message above the shared \"+_vm._s(_vm.is_folder_share ? \"folder\" : \"files\")+\":\")]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.message),expression:\"form.message\"}],staticClass:\"form-control ml-1\",attrs:{\"placeholder\":\"Optional\"},domProps:{\"value\":(_vm.form.message)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"message\", $event.target.value)}}})]),_c('div',{staticClass:\"d-flex justify-content-center\"},[_c('button',{staticClass:\"btn btn-secondary mr-2\",class:{'btn-sm text-sm': _vm.is_mobile},attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close()}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-info btn-gradient\",class:{'btn-sm text-sm': _vm.is_mobile},attrs:{\"type\":\"submit\",\"disabled\":_vm.form.loading || _vm.disable_create}},[_vm._v(\"Create Share\"),(_vm.form.loading)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):_vm._e()])])])])])]):_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-1\"}),_c('div',{staticClass:\"col-12 col-lg-10\"},[_c('div',[_c('label',{attrs:{\"for\":\"new_share_link\"}},[_vm._v(\"Share Link:\")]),_c('div',{staticClass:\"input-group mt-0\"},[_c('input',{staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"new_share_link\"},domProps:{\"value\":_vm.new_share.link}}),(!_vm.is_mobile)?_c('button',{staticClass:\"btn btn-gradient btn-secondary ml-1\",class:{'btn-sm text-sm': _vm.is_mobile},on:{\"click\":function($event){return _vm.to_clipboard('new_share_link')}}},[_c('i',{staticClass:\"ion-clipboard icon-lg\"}),_c('span',{staticClass:\"d-none d-md-inline-block ml-1\"},[_vm._v(\"Copy\")])]):_vm._e(),_c('a',{staticClass:\"btn btn-primary ml-1\",class:{'btn-sm text-sm': _vm.is_mobile},attrs:{\"href\":_vm.new_share.link,\"target\":\"_BLANK\"}},[_c('i',{staticClass:\"ion-share icon-lg mr-1\"}),_vm._v(\" Open\")])])]),(_vm.new_share.password_protected)?_c('div',{staticClass:\"mt-2\"},[_c('label',{attrs:{\"for\":\"new_share_pass\"}},[_vm._v(\"Password:\")]),_c('div',{staticClass:\"input-group\",staticStyle:{\"width\":\"300px\"}},[_c('input',{staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"new_share_pass\"},domProps:{\"value\":_vm.new_share.password}}),(!_vm.is_mobile)?_c('button',{staticClass:\"btn btn-gradient btn-secondary\",class:{'btn-sm text-sm': _vm.is_mobile},on:{\"click\":function($event){return _vm.to_clipboard('new_share_pass')}}},[_c('i',{staticClass:\"ion-clipboard icon-lg\"}),_c('span',{staticClass:\"d-none d-md-inline-block ml-1\"},[_vm._v(\"Copy\")])]):_vm._e()]),(false)?_c('div',{staticClass:\"text-center\"},[_vm._m(1)]):_vm._e()]):_vm._e(),_c('div',{staticClass:\"text-center mt-3\"},[_c('button',{staticClass:\"btn btn-outline btn-secondary\",class:{'btn-sm text-sm': _vm.is_mobile},on:{\"click\":function($event){_vm.close ? _vm.close() : false}}},[_vm._v(\"Close\")])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('span',{staticClass:\"text-success\",staticStyle:{\"cursor\":\"help\"},attrs:{\"title\":\"This is a team setting, only Team Adminstrators can change it.\"}},[_vm._v(\"Yes\"),_c('i',{staticClass:\"ion-locked ml-1\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert alert-info mt-2 d-inline-block\"},[_vm._v(\"You need to send both the link and the password to the recipients.\"),_c('br'),_vm._v(\"It's a lot more secure to use two different channels, like email and text message!\")])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.entity)?_c('span',{staticClass:\"d-inline-block mr-2 mb-2 bg-gray-lighter px-2 py-1\"},[_c('div',{staticClass:\"d-flex justify-content-center align-items-center\"},[_c('span',{staticClass:\"mr-2\"},[(_vm.is_file)?_c('img',{staticClass:\"thumb32\",attrs:{\"src\":_vm._f(\"filetype_img_src\")(_vm._f(\"extension\")(_vm.entity.name))}}):_c('i',{staticClass:\"ion-folder\"})]),_c('span',[_vm._v(_vm._s(_vm.entity.name))])])]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n \n
\n \n \n \n
{{ entity.name }} \n
\n \n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./shared-file.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./shared-file.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./shared-file.vue?vue&type=template&id=f0ce5664&scoped=true\"\nimport script from \"./shared-file.vue?vue&type=script&lang=js\"\nexport * from \"./shared-file.vue?vue&type=script&lang=js\"\nimport style0 from \"./shared-file.vue?vue&type=style&index=0&id=f0ce5664&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f0ce5664\",\n null\n \n)\n\nexport default component.exports","\n\n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./share-form.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./share-form.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./share-form.vue?vue&type=template&id=7087e7a2\"\nimport script from \"./share-form.vue?vue&type=script&lang=js\"\nexport * from \"./share-form.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import { StorageBackendService } from '@/services/storage_backend-service.js'\nimport { NamespaceService } from '@/services/namespace-service.js'\nimport { FileVersionService } from '@/services/fileversion-service.js'\nimport { StorageBackendMonitorService } from '@/services/storagebackendmonitor-service.js'\nimport { Utils } from '@/helpers/utils.js'\n\nimport AES from \"@/assets/js/aes.js\"\nimport md5 from 'md5'\n\n// Define the worker location as a relative path, this will be used only in runtime\nconst worker_path = 'assets/js/workers/upload_generation_worker.js'\n\n// Max generation size\nconst GENERATION_SIZE = 125829120 // 120 MB\n//const GENERATION_SIZE = 5829120 // ~5 MB\n\n// Uploads a single file\nfunction FileUploader() {\n\n this.ns_file = null\n this.userfile = null\n this.config = null\n\n this.upload_worker = null\n\n this.total_bytes_to_upload = 0\n\n this.upload_file_reject = null\n this.cancelled = false\n\n // Returns a Promise that resolves when the file finished uploading\n this.uploadFile = (ns_file, userfile, config) => {\n if(this.ns_file || this.userfile){ throw \"This FileUploader instance is already uploading a file!\" }\n\n // Start the loading bar\n ns_file.loading = 0.5\n\n // Hook up the cancel function\n ns_file.cancel = () => { this.cancelUpload() }\n\n // Cache ns_file and userfile\n this.ns_file = ns_file\n this.userfile = {\n name: userfile.name,\n size: userfile.size\n }\n this.config = config\n\n return new Promise(async (resolve, reject) => {\n try{\n const before = performance.now()\n // Cache reject function so we can reject the promise when the user wants to cancel upload\n this.upload_file_reject = reject\n \n // Construct packet name prefix \n const fileversion_hash_base = `${this.userfile.name}-${this.userfile.size}-${Math.round(Utils.timestamp_sec())}`\n const fileversion_hash = md5(fileversion_hash_base)\n //console.info(\"The file will be uploaded in %d generations\", generations_num)\n \n // Descriptors of each generation will be added here\n let generations = []\n \n // Slice the file to generations and upload them after each other\n const generations_num = Math.ceil(userfile.size / GENERATION_SIZE)\n for(var gen_idx=0 ; gen_idx {\n return new Promise((resolve, reject) => {\n try{\n if(this.cancelled){ reject() }\n\n // Get upload links\n const generations_num = 1\n StorageBackendService.get_upload_links(metadata.name_hash, generations_num)\n .then(res => {\n if(res.body.length < generations_num){\n throw \"StorageBackend Service returned upload links for \"+res.body.length+\" generations, requested for \"+generations_num+\". Aborting.\"\n }\n // Requested just 1 generation, the links are in the first\n let links = res.body[0]\n // set the correct generation index\n links.generation_idx = metadata.idx\n //console.info(\"%d upload links received\", links.packets.length)\n return links\n })\n .then(links => {\n if(this.cancelled){ \n // Upload was cancelled during we were waiting for the signed URLs\n reject({cancelled: true}) \n return\n }\n\n // Calculate total upload size so we can report progress percent correctly\n const redundancy_factor = links.packets.length / (links.packets.length - this.config.redundant_num)\n this.total_bytes_to_upload = this.userfile.size * redundancy_factor\n\n // Create worker to read, encrypt, encode and upload generation\n \n this.upload_worker = new Worker(worker_path)\n if(!this.upload_worker){\n throw \"Upload worker could not be loaded from path: \" + worker_path\n }\n\n this.upload_worker.onmessage = (msg) => {\n const message = msg.data\n\n //console.info(message)\n\n switch(message.event){\n\n case \"bytes_uploaded\":\n {\n // Total size of the generation: this.userfile.size * redundancy_factor\n // Now downloaded: message.bytes\n const progress_increase_percent = (message.bytes/this.total_bytes_to_upload)*100\n this.ns_file.loading += (this.ns_file.loading + progress_increase_percent) > 100 ? 0 : progress_increase_percent\n }\n break;\n\n case \"please_encrypt_this_thx\":\n // The worker cannot use WebCrypto, try to encrypt here on the main thread\n AES.encrypt(message.data).then(encrypt_result => {\n // Encryption successful\n const encrypted_data = encrypt_result.encrypted_arr\n try{\n this.upload_worker.postMessage({\n command: 'encrypt_ready',\n data: encrypted_data,\n iv: encrypt_result.iv,\n key: encrypt_result.key,\n }, [encrypted_data])\n }catch(e){\n try{\n // Cannot transfer data, try copying\n this.upload_worker.postMessage({\n command: 'encrypt_ready',\n data: encrypted_data,\n iv: encrypt_result.iv,\n key: encrypt_result.key,\n })\n } catch(err){\n console.error(\"Error sending data to the main thread for encryption\", err)\n }\n }\n }).catch(err => {\n console.error(\"Error encrypting data on main thread\", err)\n reject(err)\n })\n\n break;\n\n case \"ready\":\n // Report packet transfer times, wait for the response (otherwise the request body is not sent fully)\n this.upload_worker.terminate()\n resolve(message.generation)\n StorageBackendMonitorService.report_packet_transfers(message.packet_transfers)\n break;\n\n case \"failed\":\n // Upload failed\n this.upload_worker.terminate()\n reject();\n break;\n \n case \"report_error\":\n this.report_error(message.error)\n break;\n\n default:\n console.warn(\"Unknown event received from worker: \" + message.event)\n break;\n }\n }\n\n this.upload_worker.postMessage({\n command: 'upload',\n file_slice: file_slice,\n links: links,\n config: this.config\n })\n\n }).catch(err => {\n console.error(\"Error requesting upload links for generation #\" + metadata.idx, err)\n throw \"Error requesting upload links for generation #\" + metadata.idx\n })\n } catch(err){\n console.error(\"Error uploading generation!\", err)\n reject(err)\n }\n })\n }\n\n this.create_file = async (name, parent_id, mime_type) => {\n return new Promise((resolve, reject) => {\n try{\n NamespaceService.create_file(name, parent_id, mime_type).then(res => {\n if(this.cancelled){ reject({cancelled: true}) }\n const new_file = res.body\n resolve(new_file)\n }).catch(err => {\n console.error(\"Error creating File\", err)\n reject(err)\n })\n } catch(err){\n console.error(\"Error calling Namespace Service\", err)\n reject(err)\n }\n })\n }\n\n this.create_fileversion = async (file_id, size, hash, generations) => {\n return new Promise((resolve, reject) => {\n try{\n FileVersionService.create_version(file_id, size, hash, 0, generations).then(res => {\n if(this.cancelled){ reject({cancelled: true}) }\n const new_version = res.body\n resolve(new_version)\n }).catch(err => {\n console.error(\"Error creating FileVersion\", err)\n reject(err)\n })\n } catch(err){\n console.error(\"Error calling FileVersion Service\", err)\n reject(err)\n }\n })\n }\n\n this.report_error = async (error) => {\n await StorageBackendMonitorService.report_failed_transfer(error)\n }\n}\n\nexport { FileUploader }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox text-white b0\",class:_vm.cardbox_class,on:{\"click\":function($event){_vm.clicked ? _vm.clicked() : false}}},[_c('div',{staticClass:\"cardbox-body text-center\"},[(_vm.icon)?_c('div',{staticClass:\"text-bold display-1\"},[_c('i',{class:[_vm.icon]})]):_vm._e(),(_vm.text)?_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\" \"+_vm._s(_vm.text)+\" \")]):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n
\n
\n \n
\n
\n {{ text }}\n
\n
\n
\n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./hero-box.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./hero-box.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./hero-box.vue?vue&type=template&id=182c82c7\"\nimport script from \"./hero-box.vue?vue&type=script&lang=js\"\nexport * from \"./hero-box.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.model),expression:\"model\"}],staticClass:\"form-check-input\",attrs:{\"type\":\"checkbox\",\"name\":_vm.name,\"id\":`checkbox-${_vm.divid}`},domProps:{\"checked\":Array.isArray(_vm.model)?_vm._i(_vm.model,null)>-1:(_vm.model)},on:{\"change\":function($event){var $$a=_vm.model,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.model=$$a.concat([$$v]))}else{$$i>-1&&(_vm.model=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.model=$$c}}}}),_c('label',{staticClass:\"form-check-label\",attrs:{\"for\":`checkbox-${_vm.divid}`}},[_vm._v(_vm._s(_vm.label))])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n {{label}} \n
\n \n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./checkbox.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./checkbox.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./checkbox.vue?vue&type=template&id=41f2d904\"\nimport script from \"./checkbox.vue?vue&type=script&lang=js\"\nexport * from \"./checkbox.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[_c('div',{staticClass:\"c-pointer\",on:{\"click\":function($event){_vm.basic_info_open = !_vm.basic_info_open}}},[_c('span',{staticClass:\"text-12\"},[_vm._v(\"Basic info\")]),_c('i',{staticClass:\"ml-2\",class:{'ion-chevron-up': _vm.basic_info_open, 'ion-chevron-down': !_vm.basic_info_open }})]),_c('table',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.basic_info_open),expression:\"basic_info_open\"}],staticClass:\"table table-sm mt-2 file-details-table mb-0\"},[_c('tbody',[_c('tr',[_c('th',[_vm._v(\"Name\")]),_c('td',[_vm._v(_vm._s(_vm.file.name))])]),_c('tr',[_c('th',[_vm._v(\"Size\")]),_c('td',[_vm._v(_vm._s(_vm._f(\"format_bytes\")(_vm.file.size))+\" \"),_c('small',[_vm._v(\"(\"+_vm._s(Number(_vm.file.size).toLocaleString())+\" bytes)\")])])]),_c('tr',[_c('th',[_vm._v(\"Type\")]),_c('td',{staticClass:\"text-monospace break-word\"},[_vm._v(_vm._s(_vm.file.mime_type))])])])]),(!_vm.hide_shares)?_c('section',[_c('div',{staticClass:\"c-pointer mt-4\",on:{\"click\":function($event){_vm.sharing_open = !_vm.sharing_open}}},[_c('span',{staticClass:\"text-12\"},[_vm._v(\"Sharing\"),(_vm.shares_num !== null)?_c('span',{staticClass:\"ml-2 badge badge-primary\"},[_vm._v(_vm._s(_vm.shares_num))]):_vm._e()]),_c('i',{staticClass:\"ml-2\",class:{'ion-chevron-up': _vm.sharing_open, 'ion-chevron-down': !_vm.sharing_open }})]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.sharing_open),expression:\"sharing_open\"}],staticClass:\"mt-2\"},[_c('file-sharing-status',{attrs:{\"user\":_vm.user,\"file\":_vm.file,\"shares_num_changed\":(num) => { _vm.shares_num = num }}})],1)]):_vm._e(),(!_vm.hide_versions)?_c('section',[_c('div',{staticClass:\"c-pointer mt-4\",on:{\"click\":function($event){_vm.versions_open = !_vm.versions_open}}},[_c('span',{staticClass:\"text-12\"},[_vm._v(\"Versions\"),(_vm.versions_num !== null)?_c('span',{staticClass:\"ml-2 badge badge-primary\"},[_vm._v(_vm._s(_vm.versions_num))]):_vm._e()]),_c('i',{staticClass:\"ml-2\",class:{'ion-chevron-up': _vm.versions_open, 'ion-chevron-down': !_vm.versions_open }})]),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.versions_open),expression:\"versions_open\"}],staticClass:\"mt-2\"},[_c('file-versions-table',{attrs:{\"file\":_vm.file,\"user\":_vm.user,\"modifiedBoxExternal\":_vm.modifiedBoxExternal,\"download_file_fn\":_vm.download_file_fn,\"open_file_fn\":null,\"versions_num_changed\":(num) => { _vm.versions_num = num }}})],1)]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n Basic info \n \n
\n\n \n \n \n Name \n {{ file.name }} \n \n \n Size \n {{ file.size | format_bytes }} ({{ Number(file.size).toLocaleString() }} bytes) \n \n \n Type \n {{ file.mime_type }} \n \n \n
\n\n\n \n \n Sharing{{ shares_num }} \n \n
\n \n { shares_num = num }\">\n \n
\n \n\n \n \n Versions{{ versions_num }} \n \n
\n \n { versions_num = num }\"\n >\n \n
\n \n\n \n \n\n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-info.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./file-info.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./file-info.vue?vue&type=template&id=086c39e6&scoped=true\"\nimport script from \"./file-info.vue?vue&type=script&lang=js\"\nexport * from \"./file-info.vue?vue&type=script&lang=js\"\nimport style0 from \"./file-info.vue?vue&type=style&index=0&id=086c39e6&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"086c39e6\",\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n Drop your file to upload\n
\n\n\n\n
\n
\n
\n
\n
\n \n Hello and welcome to SkyFlok! \n To get started, first you need to set where your data will be stored. \n Please go to Team Setup and set up your account now! \n \n \n This Team account is not ready to upload files, please ask one of the Team Administrators to complete the initial setup! \n \n
\n
\n
\n
\n
\n\n\n\n
\n
\n
\n
\n
\n Congratulations, your SkyFlok account is fully set up!\n Upload some files by clicking on the large blue button below,\n or drag and drop them into the window!\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n
\n This is a safe folder that is only visible and accessible for Team Administrators.\n \n It's an ideal place for things you don't want to share with the whole team, like passwords, invoices, contracts, Non-Disclosure Agreements and similar files.\n
\n
\n
\n
\n\n\n \n
1\">\n
\n
\n \n \n \n {{folder.name}}\n \n \n \n
\n\n
\n
\n \n {{ nav_stack[nav_stack.length-1].name }}\n \n
\n
\n
\n
\n \n
\n\n
\n \n\n \n
\n
\n
\n\n
\n
{{ folder.name }} \n\n
\n
\n
\n \n
\n \n \n \n \n \n \n \n
\n \n
{{ folder.rename.error }}
\n
\n
\n
\n
\n\n
\n
\n
\n
\n \n \n \n \n \n
\n \n \n
\n \n \n
\n
\n
\n
\n\n\n \n
\n
0\">\n\n
\n \n \n
\n\n \n
\n 0\">Type: {{ list_filters.types | join }} \n
\n\n \n
\n\n
\n \n Filters\n \n\n
\n Cancel \n \n \n Files\n \n \n \n \n Download {{selected_files.length}} files\n \n \n \n Cancel\n \n \n\n
{{ is_mobile ? 'Upload' : 'Files' }}\n
Folder\n
\n
\n\n
\n
\n
\n
\n\n \n
\n \n\n \n
\n
\n { file_upload_el.click() }\"> \n
\n
\n { folder_upload_el.click() }\"> \n
\n
\n\n \n\n \n
\n\n
\n\n\n\n\n\n\n\n
\n
\n \n
\n\n
File types
\n
\n = 0 }\"\n v-for=\"(ext, idx) in file_types\" :key=\"idx\"\n @click=\"toggle_filter('types', ext)\">{{ ext }} \n
\n\n
\n
\n
\n
\n\n\n\n
\n
\n \n
\n { if(view_file.file && view_file.file.cancel){view_file.file.cancel()}; view_file.file.loading = false; view_file = null; close_modal('viewer-modal') }\"> \n
\n
\n
\n
\n\n\n\n
\n
\n \n
\n { copy_move_ready(show_folder_tree.file, operation) }\"\n @close=\"close_modal('move-copy-modal'); show_folder_tree = null\"\n />\n
\n
\n
\n
\n\n\n\n\n \n \n\n \n \n\n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./filelist-view.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./filelist-view.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./filelist-view.vue?vue&type=template&id=78aa0176&scoped=true\"\nimport script from \"./filelist-view.vue?vue&type=script&lang=js\"\nexport * from \"./filelist-view.vue?vue&type=script&lang=js\"\nimport style0 from \"./filelist-view.vue?vue&type=style&index=0&id=78aa0176&prod&lang=css&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"78aa0176\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"}),_c('div',{staticClass:\"col-6\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-warning b0 mt-5\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_vm._m(0),_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\"Upgrade your Team to use \"+_vm._s(_vm.feature)+\"!\")])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"display-3\"},[_c('i',{staticClass:\"ion-wand\"})])\n}]\n\nexport { render, staticRenderFns }","\n \n
\n
\n
\n
\n
\n
Upgrade your Team to use {{ feature }}!
\n
\n
\n
\n
\n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./upgrade_warning_box.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./upgrade_warning_box.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./upgrade_warning_box.vue?vue&type=template&id=09ec3c7e\"\nimport script from \"./upgrade_warning_box.vue?vue&type=script&lang=js\"\nexport * from \"./upgrade_warning_box.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _vm._m(0)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"}),_c('div',{staticClass:\"col-6\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-secondary b0 mt-5\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_c('div',{staticClass:\"display-3\"},[_c('i',{staticClass:\"ion-wand\"})]),_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\"This function is available for Team Administrators only!\")])])])])])\n}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./admin_feature_warning_box.vue?vue&type=template&id=7f1d68b2\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./admin_folder.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./admin_folder.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./admin_folder.vue?vue&type=template&id=5e14b9c0\"\nimport script from \"./admin_folder.vue?vue&type=script&lang=js\"\nexport * from \"./admin_folder.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('file-list-view',{attrs:{\"user\":_vm.user,\"share-allowed\":true}})\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n \n\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./files.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./files.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./files.vue?vue&type=template&id=a7a6523a\"\nimport script from \"./files.vue?vue&type=script&lang=js\"\nexport * from \"./files.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\",attrs:{\"id\":\"recycle_bin\"}},[_c('div',{staticClass:\"container pt-3\"},[(false)?_c('div',{staticClass:\"row pt-3\"},[_c('div',{staticClass:\"col-1\"}),_vm._m(0)]):_vm._e(),_c('div',{staticClass:\"row\",attrs:{\"id\":\"files\"}},[_c('div',{staticClass:\"col-12\"},[(_vm.user && _vm.user.is_admin)?_c('ul',{staticClass:\"nav nav-tabs mb-4 justify-content-center\",attrs:{\"role\":\"tablist\",\"id\":\"namespace_selector\"}},[_c('li',{staticClass:\"nav-item\",attrs:{\"role\":\"presentation\"}},[_c('a',{staticClass:\"nav-link text-gray\",class:{'active': !_vm.is_admin_folder()},attrs:{\"href\":\"#home\",\"aria-controls\":\"home\",\"role\":\"tab\",\"data-toggle\":\"tab\"},on:{\"click\":function($event){return _vm.set_admin_folder(false)}}},[_c('i',{staticClass:\"ion-document-text mr-2\"}),_vm._v(\"Team Files \")])]),_c('li',{staticClass:\"nav-item\",attrs:{\"role\":\"presentation\"}},[_c('a',{staticClass:\"nav-link text-gray\",class:{'active': _vm.is_admin_folder()},attrs:{\"href\":\"#profile\",\"aria-controls\":\"profile\",\"role\":\"tab\",\"data-toggle\":\"tab\"},on:{\"click\":function($event){return _vm.set_admin_folder(true)}}},[_c('i',{staticClass:\"ion-lock-combination mr-2\"}),_vm._v(\"Admin Folder\")])])]):_vm._e(),_c('deleted-groups',{ref:\"deletedGroups\",attrs:{\"user\":_vm.user}})],1)])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-lg-10\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-warning b0\"},[_c('div',{staticClass:\"cardbox-body text-center text-bold text-12\"},[_vm._v(\" Deleted files and directories are stored here for 30 days. \"),_c('br'),_vm._v(\" You can recover them during this period, afterwards they are deleted automatically. \")])])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[(_vm.deleted_groups)?_c('div',[_vm._l((_vm.deleted_groups),function(group,index){return _c('div',{key:index,staticClass:\"cardbox\"},[_c('div',{staticClass:\"cardbox-body text-center c-pointer\",class:{'text-bold': group.open},attrs:{\"title\":'Click to '+(group.open ? 'hide' : 'show')+' details'},on:{\"click\":function($event){group.open = !group.open}}},[_c('i',{staticClass:\"float-right\",class:{'ion-chevron-down': !group.open, 'ion-chevron-up': group.open}}),_vm._v(\" \"+_vm._s(_vm.deleted_label ? _vm.deleted_label : \"Deleted\")+\" \"),(group.deleted_by !== undefined)?_c('span',{staticClass:\"mr-2\"},[_vm._v(\" by \"),(group.deleted_by !== undefined && _vm.user && _vm.user.team)?_c('user-box',{attrs:{\"user-id\":group.deleted_by,\"team\":_vm.user.team,\"external-actor\":_vm.modifiedBoxExternal}}):_vm._e()],1):_vm._e(),_vm._v(\" \"+_vm._s(_vm._f(\"timestamp_date\")(group.deleted_at))+\", \"+_vm._s(_vm._f(\"timestamp_time\")(group.deleted_at))+\" \")]),(group.open)?_c('div',{staticClass:\"cardbox-body\"},[(!_vm.disableRestore && group.is_deleted_folder)?_c('div',{staticClass:\"fw text-center\"},[_c('button',{staticClass:\"btn btn-secondary btn-gradient\",attrs:{\"disabled\":group.entities[0].restoring},on:{\"click\":function($event){return _vm.restore(group.entities[0])}}},[_c('i',{staticClass:\"ion-arrow-return-right mr-2\"}),_vm._v(\"Restore folder\"),(group.entities[0].restoring)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])]):_vm._e(),_c('table',{staticClass:\"table table-hover mb-0\"},[_vm._m(0,true),_c('tbody',_vm._l((group.entities),function(file){return _c('tr',{key:file.id},[_c('td',{staticClass:\"text-center\"},[(file.entity_type === 'FILE')?_c('img',{staticClass:\"file-icon\",attrs:{\"src\":_vm._f(\"filetype_img_src\")(file.extension)}}):_vm._e(),(file.entity_type === 'FOLDER')?_c('i',{staticClass:\"ion-folder\",staticStyle:{\"font-size\":\"25px\"}}):_vm._e()]),_c('td',[_c('span',{staticClass:\"text-bold filename\"},[_vm._v(_vm._s(file.name))]),_c('div',{staticClass:\"path\"},[_c('small',{domProps:{\"innerHTML\":_vm._s(_vm.$options.filters.path(file.path))}})])]),_c('td',[(file.entity_type === 'FILE')?_c('span',{staticClass:\"text-upper\"},[_vm._v(_vm._s(file.extension))]):_vm._e(),(file.entity_type === 'FOLDER')?_c('span',[_c('i',[_vm._v(\"Directory\")])]):_vm._e()]),(!_vm.disableRestore && !group.is_deleted_folder)?_c('td',[(!file.restoring)?_c('button',{staticClass:\"btn btn-secondary btn-gradient\",on:{\"click\":function($event){return _vm.restore(file)}}},[_c('i',{staticClass:\"ion-arrow-return-right\"}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"Restore\")])]):_c('i',{staticClass:\"ion-load-c spin\"})]):_vm._e()])}),0)])]):_vm._e()])}),(!_vm.deleted_groups.length)?_c('div',[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"}),_c('div',{staticClass:\"col-12 col-lg-6\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-warning b0\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_vm._m(1),_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\"No \"),_c('span',{staticStyle:{\"text-transform\":\"lowercase\"}},[_vm._v(_vm._s(_vm.deleted_label ? _vm.deleted_label : \"deleted\")+\" \")]),_vm._v(\" files\")])])])])])]):_vm._e()],2):_vm._e(),(_vm.deleted_groups === null)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"}),_vm._m(2)]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('thead',[_c('th',{staticClass:\"nowrap\",staticStyle:{\"width\":\"1px\"}}),_c('th',[_vm._v(\"Name\")]),_c('th',{staticClass:\"nowrap\"},[_vm._v(\"Type\")]),_c('th',{staticClass:\"nowrap\",staticStyle:{\"width\":\"1px\"}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"text-bold display-1\"},[_c('i',{staticClass:\"ion-qr-scanner\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-lg-6\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-warning b0\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_c('div',{staticClass:\"text-bold display-1\"},[_c('div',{staticClass:\"loader\"})])])])])\n}]\n\nexport { render, staticRenderFns }","\n\n \n
\n\n
\n \n\n {{ deleted_label ? deleted_label : \"Deleted\" }}\n by\n \n \n \n {{ group.deleted_at | timestamp_date }}, {{ group.deleted_at | timestamp_time }}\n\n
\n
\n\n
\n \n Restore folder \n \n\n
\n\n
\n \n \n Name \n Type \n \n \n \n \n \n \n \n \n \n {{ file.name }} \n
\n \n \n {{ file.extension }} \n Directory \n \n \n \n Restore \n \n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
No {{ deleted_label ? deleted_label : \"deleted\" }} files
\n
\n
\n
\n
\n
\n
\n\n \n \n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./deleted_groups.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./deleted_groups.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./deleted_groups.vue?vue&type=template&id=0e4a5a64\"\nimport script from \"./deleted_groups.vue?vue&type=script&lang=js\"\nexport * from \"./deleted_groups.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n \n\n\t\t\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\tDeleted files and directories are stored here for 30 days.\n\t\t\t\t\t\t\t \n\t\t\t\t\t\t\tYou can recover them during this period, afterwards they are deleted automatically.\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t
\n\t\t
\n\n\t\t
\n\n\t\t\t
\n\n\t\t\t\t\n\t\t\t\t
\n\n\t\t\t\t
\n\n\t\t\t
\n\t\t
\n\n\n\n
\n \n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./recycle_bin.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./recycle_bin.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./recycle_bin.vue?vue&type=template&id=1b3aff7a&scoped=true\"\nimport script from \"./recycle_bin.vue?vue&type=script&lang=js\"\nexport * from \"./recycle_bin.vue?vue&type=script&lang=js\"\nimport style0 from \"./recycle_bin.vue?vue&type=style&index=0&id=1b3aff7a&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1b3aff7a\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\"},[(_vm.shares_disabled)?_c('div',{staticClass:\"container\"},[_c('upgrade-warning-box',{attrs:{\"feature\":'Shares'}})],1):_c('div',{staticClass:\"container container-lg pt-4\"},[(_vm.shares)?_c('div',[_c('h3',[_vm._v(\" Active Shares \"),_c('small',[_vm._v(\" (\"+_vm._s(_vm.active_shares.length)),(_vm.active_shares_limit && _vm.active_shares.length >= _vm.active_shares_limit)?_c('span',[_vm._v(\" out of \"+_vm._s(_vm.active_shares_limit)),(_vm.active_shares.length >= _vm.active_shares_limit)?_c('i',{staticClass:\"ml-1 icon ion-alert-circled text-warning\",attrs:{\"title\":\"You reached the limit of active Shares. Upgrade your Team to use more Shares!\"}}):_vm._e()]):_vm._e(),_vm._v(\") \"),_c('a',{staticClass:\"ml-1 text-inherit\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.load_shares()}}},[_c('i',{staticClass:\"ion-refresh\",class:{'spin': _vm.shares_loading}})])])]),(_vm.active_shares && _vm.active_shares.length > 0)?_c('div',{staticClass:\"row\"},_vm._l((_vm.active_shares),function(share){return _c('share-box',{key:share.id,attrs:{\"share\":share,\"user\":_vm.user,\"revokeHandler\":_vm.revoke_share}})}),1):_c('div',{staticClass:\"row mb-3\"},[_c('div',{staticClass:\"col-3\"}),_vm._m(0)]),(_vm.expired_shares && _vm.expired_shares.length > 0)?_c('div',[_c('h3',{attrs:{\"title\":\"These shares are either expired or manually disabled\"}},[_vm._v(\"Inactive Shares \"),_c('small',[_vm._v(\"(\"+_vm._s(_vm.expired_shares.length)+\")\")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-secondary\",on:{\"click\":function($event){_vm.show_expired=!_vm.show_expired}}},[_vm._v(_vm._s(_vm.show_expired ? 'Hide' : 'Show'))])]),_c('div',{staticClass:\"row\",class:{'d-none': !_vm.show_expired},attrs:{\"id\":\"expired_shares_container\"}},_vm._l((_vm.expired_shares),function(share){return _c('share-box',{key:share.id,attrs:{\"share\":share,\"user\":_vm.user,\"deleteHandler\":_vm.delete_share,\"activateHandler\":_vm.activate_share,\"activatedisabled\":_vm.active_shares_limit && _vm.active_shares.length >= _vm.active_shares_limit}})}),1)]):_vm._e()]):_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"}),_c('div',{staticClass:\"col-12 col-lg-6\"},[_c('hero-box',{attrs:{\"bg-class\":'bg-gradient-info',\"icon\":'loader d-block'}})],1)])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-lg-6\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-info b0\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_c('div',{staticClass:\"text-bold display-1\"},[_c('i',{staticClass:\"ion-link\"})]),_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\"No active shares\")])])])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-xl-6\"},[_c('div',{staticClass:\"cardbox\"},[_c('div',{staticClass:\"pb-1\",class:{'bg-gradient-danger': !_vm.share.active, 'bg-gradient-warning': _vm.share.active && _vm.share.type == 1, 'bg-gradient-info': _vm.share.active && _vm.share.type == 0}}),_c('div',{staticClass:\"cardbox-body\"},[(_vm.share.active)?_c('div',{staticClass:\"float-right action-btns\"},[_c('button',{staticClass:\"btn btn-outline-warning mr-1\",attrs:{\"title\":\"Disable this share immediately\"},on:{\"click\":function($event){return _vm.revokeHandler(_vm.share)}}},[_c('i',{staticClass:\"ion-alert-circled mr-1\"}),_vm._v(\" Disable \")])]):_c('div',{staticClass:\"float-right action-btns\"},[_c('button',{staticClass:\"btn btn-outline-success mr-1\",attrs:{\"disabled\":_vm.activatedisabled,\"title\":_vm.activatedisabled ? 'You reached the limit of active Shares. Upgrade your Team subscription to use more Shares!' : 'Activate this Share'},on:{\"click\":function($event){return _vm.activateHandler(_vm.share)}}},[_c('i',{staticClass:\"ion-minus-circled mr-1\"}),_vm._v(\" Activate \")]),_c('button',{staticClass:\"btn btn-danger btn-gradient\",attrs:{\"title\":\"Delete this share\"},on:{\"click\":function($event){return _vm.deleteHandler(_vm.share)}}},[_c('i',{staticClass:\"ion-minus-circled mr-1\"}),_vm._v(\" Delete \")])]),(_vm.share.message)?_c('p',{staticClass:\"bl pl-3 mb-3\",staticStyle:{\"display\":\"inline-block\"}},[_vm._v(\"Message: \"),_c('i',[_vm._v(_vm._s(_vm.share.message))])]):_vm._e(),(_vm.share.contents)?_vm._l((_vm.share.contents),function(group){return _c('div',{key:group.folder,staticClass:\"mb-3\"},[(group.folder)?_c('div',{staticClass:\"mb-2 text-muted text-sm\"},[_c('router-link',{staticClass:\"text-muted\",attrs:{\"to\":'files#'+group.folder.replace(/ > /g, '/').replace('Home', '')},domProps:{\"innerHTML\":_vm._s(group.folder)}}),_vm._v(\" > \")],1):_vm._e(),_vm._l((group.files),function(file){return _c('shared-file',{key:file.id,attrs:{\"entity\":file}})})],2)}):_c('i',{staticClass:\"ion-load-c spin\"}),(_vm.share.active)?_c('div',{staticClass:\"text-center\",staticStyle:{\"white-space\":\"nowrap\"}},[_c('button',{staticClass:\"btn btn-gradient btn-secondary mr-2\",on:{\"click\":function($event){return _vm.str_to_clipboard(_vm.link)}}},[_c('i',{staticClass:\"ion-clipboard icon-lg mr-1\"}),_vm._v(\" Copy Share Link\")]),(_vm.share.password)?_c('button',{staticClass:\"btn btn-gradient btn-secondary mr-1\",on:{\"click\":function($event){return _vm.str_to_clipboard(_vm.share.password)}}},[_c('i',{staticClass:\"ion-clipboard icon-lg mr-1\"}),_vm._v(\" Copy Password\")]):_c('span',[_c('i',{staticClass:\"text-muted text-sm mr-1\"},[_vm._v(\"No password\")])]),_c('a',{staticClass:\"ml-1\",attrs:{\"href\":_vm.link,\"target\":\"_BLANK\",\"title\":\"Open this share in a new tab\"}},[_vm._v(\" Open\"),_c('i',{staticClass:\"ion-share ml-1\"})])]):_vm._e(),_c('div',{staticClass:\"row text-center mt-3\"},[_c('div',{staticClass:\"col-3\"},[_c('div',{staticClass:\"text-muted\"},[_vm._v(\"Expires\")]),_c('div',{staticClass:\"h5\"},[(_vm.share.expire)?_c('span',[_vm._v(_vm._s(_vm._f(\"timestamp_rel\")(_vm.share.expire)))]):_c('span',[_vm._v(\"Never\")])])]),_c('div',{staticClass:\"col-3 bl created-col\"},[_c('div',{staticClass:\"text-muted\"},[_vm._v(\"Opened\")]),_c('div',{staticClass:\"h5\"},[_vm._v(_vm._s(_vm.share.accessed_count)+\"x\")])]),_c('div',{staticClass:\"col bl\"},[(_vm.user && _vm.user.team)?_c('modified-box',{attrs:{\"user-id\":_vm.share.created_by,\"timestamp\":_vm.share.created,\"team\":_vm.user.team}}):_vm._e()],1)])],2)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n
\n
\n
\n\n
\n \n\n \n Disable\n \n\n
\n
\n \n Activate\n \n \n Delete\n \n
\n\n
Message: {{ share.message }}
\n\n \n
\n \n
\n /g, '/').replace('Home', '')\" class=\"text-muted\" v-html=\"group.folder\">\n >\n
\n
\n
\n \n
\n\n \n
\n \n
Copy Share Link\n
Copy Password\n
No password \n
\n Open \n \n
\n\n\n\n
\n \n
\n
Expires
\n
{{ share.expire | timestamp_rel }} Never
\n
\n
\n
Opened
\n
{{ share.accessed_count }}x
\n
\n
\n \n
\n
\n\n\n \n\n
\n\n
\n
\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./share-box.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./share-box.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./share-box.vue?vue&type=template&id=9b92fcfc\"\nimport script from \"./share-box.vue?vue&type=script&lang=js\"\nexport * from \"./share-box.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n \n \n
\n\n\n \n \n\n
\n
\n Active Shares\n \n ({{active_shares.length}}= active_shares_limit\"> out of {{ active_shares_limit }}= active_shares_limit\" class=\"ml-1 icon ion-alert-circled text-warning\" title=\"You reached the limit of active Shares. Upgrade your Team to use more Shares!\"> )\n \n \n \n
0\">\n \n \n
\n
\n
\n
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
No active shares
\n\t\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t
\n
\n\n\n \n
0\">\n
Inactive Shares ({{expired_shares.length}}) {{ show_expired ? 'Hide' : 'Show' }} \n
\n = active_shares_limit\">\n \n
\n
\n
\n\n \n
\n\n\n
\n \n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./shares.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./shares.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./shares.vue?vue&type=template&id=f5556c22\"\nimport script from \"./shares.vue?vue&type=script&lang=js\"\nexport * from \"./shares.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\"},[(_vm.client_spaces_disabled)?_c('div',{staticClass:\"container\"},[_c('upgrade-warning-box',{attrs:{\"feature\":'Client Spaces'}})],1):_c('div',{staticClass:\"container-fluid\"},[(false)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_vm._m(0)]):_vm._e(),(_vm.user && _vm.spaces)?_c('div',{staticClass:\"fw\"},[_c('h3',{staticClass:\"fw d-flex justify-content-between\"},[_c('div',[_c('span',[_vm._v(\"Active Spaces\")]),_c('small',[_vm._v(\" (\"+_vm._s(_vm.active_spaces_num)),(_vm.active_spaces_limit && _vm.active_spaces_num >= _vm.active_spaces_limit)?_c('span',[_vm._v(\" out of \"+_vm._s(_vm.active_spaces_limit)),(_vm.active_spaces.length >= _vm.active_spaces_limit)?_c('i',{staticClass:\"ml-1 icon ion-alert-circled text-warning\",attrs:{\"title\":\"You reached the limit of active Client Spaces. Upgrade your Team to use more Spaces!\"}}):_vm._e()]):_vm._e(),_vm._v(\") \"),_c('a',{staticClass:\"ml-1 text-inherit\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.load_spaces()}}},[_c('i',{staticClass:\"ion-refresh\",class:{'spin': _vm.spaces_loading}})])])]),_c('div',{staticClass:\"d-flex align-items-center justify-content-center gap-3\"},[_c('div',[_c('button',{staticClass:\"btn btn-pill-left\",class:{'btn-secondary': _vm.view_mode != 'grid', 'btn-gradient btn-secondary': _vm.view_mode == 'grid'},on:{\"click\":function($event){_vm.view_mode = 'grid'}}},[_vm._v(\" Grid \"),_c('i',{staticClass:\"ion-grid ml-1\"})]),_c('button',{staticClass:\"btn btn-pill-right\",class:{'btn-secondary': _vm.view_mode != 'table', 'btn-gradient btn-secondary': _vm.view_mode == 'table'},on:{\"click\":function($event){_vm.view_mode = 'table'}}},[_vm._v(\" Table \"),_c('i',{staticClass:\"ion-navicon ml-1\"})])]),(_vm.user.is_admin)?_c('button',{staticClass:\"btn btn-info btn-gradient ion-person-stalker\",on:{\"click\":function($event){_vm.show_edit_managers_modal=true; _vm.open_dialog('edit_managers', null)}}},[_c('span',{staticClass:\"d-none d-sm-inline-block ml-2\"},[_vm._v(\"Edit Managers\")])]):_vm._e(),_c('button',{staticClass:\"btn btn-primary btn-gradient ion-plus-round\",attrs:{\"disabled\":_vm.active_spaces_limit && _vm.active_spaces_num >= _vm.active_spaces_limit,\"title\":(_vm.active_spaces_limit && _vm.active_spaces.length >= _vm.active_spaces_limit) ? 'Upgrade your Team for more active Client Spaces!' : ''},on:{\"click\":function($event){return _vm.create_space()}}},[_c('span',{staticClass:\"d-none d-sm-inline-block ml-2\"},[_vm._v(\"Create Space\")])])])]),(_vm.active_spaces_num > 0 && _vm.view_mode === 'grid')?_c('div',{staticClass:\"row mt-3\"},[_vm._l((_vm.active_spaces),function(space){return _c('client-space-box',{key:space.id,attrs:{\"space\":space,\"user\":_vm.user,\"watch_clicked\":() => { _vm.change_watch(space) },\"reload_spaces_callback\":() => { _vm.load_spaces() }},on:{\"edit\":() => { _vm.edit_space(space) },\"open_dialog\":(dialog_id) => { _vm.open_dialog(dialog_id, space) }}})}),_c('div',{staticClass:\"col-12 col-sm-6 col-md-4 col-xl-3 text-center\"},[_c('div',{staticClass:\"p-5 add_space_btn text-gray-light c-pointer\",on:{\"click\":function($event){return _vm.create_space()}}},[_c('i',{staticClass:\"ion-plus-round icon-3x\"}),_c('h5',{staticClass:\"mt-2 text-bold\"},[_vm._v(\"Add Space\")])])])],2):_vm._e(),(_vm.active_spaces_num > 0 && _vm.view_mode === 'table')?_c('div',{staticClass:\"row mt-3\"},[_c('div',{staticClass:\"cardbox fw mx-3\"},[(_vm.active_spaces_with_expired_invite.length > 0 && !_vm.dismiss_expired_invites_alert)?_c('div',{staticClass:\"cardbox-body\"},[_c('div',{staticClass:\"fw text-center\"},[_c('div',{staticClass:\"alert alert-warning d-inline-block text-bold\"},[_vm._v(\" There \"+_vm._s(_vm.active_spaces_with_expired_invite.length === 1 ? 'is' : 'are')+\" \"+_vm._s(_vm.active_spaces_with_expired_invite.length)+\" space\"+_vm._s(_vm.active_spaces_with_expired_invite.length === 1 ? '' : 's')+\" with expired invite! \"),_c('button',{staticClass:\"btn btn-sm btn-secondary ml-2 text-sm\",on:{\"click\":function($event){$event.preventDefault();return _vm.show_expired_invites()}}},[_vm._v(\"Show\")]),_c('a',{staticClass:\"ml-2 text-normal text-white text-sm\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.dismiss_expired_invites_alert = true}}},[_c('i',{staticClass:\"ion-close-round\"})])])])]):_vm._e(),_c('div',{staticClass:\"cardbox-body\"},[(_vm.show_filters)?_c('div',{staticClass:\"filters mb-2\"},[_c('div',{staticClass:\"filter\"},[_c('label',{staticClass:\"filter_name\",attrs:{\"for\":\"filter_client_name\"}},[_vm._v(\"Client Name\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.table_filter.client_name),expression:\"table_filter.client_name\"}],staticClass:\"form-control form-control-sm\",staticStyle:{\"width\":\"150px\"},attrs:{\"type\":\"text\",\"id\":\"filter_client_name\"},domProps:{\"value\":(_vm.table_filter.client_name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.table_filter, \"client_name\", $event.target.value)}}})]),_c('div',{staticClass:\"filter\"},[_c('label',{staticClass:\"filter_name\",attrs:{\"for\":\"filter_email\"}},[_vm._v(\"E-mail address\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.table_filter.email),expression:\"table_filter.email\"}],staticClass:\"form-control form-control-sm\",staticStyle:{\"width\":\"150px\"},attrs:{\"type\":\"text\",\"id\":\"filter_email\"},domProps:{\"value\":(_vm.table_filter.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.table_filter, \"email\", $event.target.value)}}})]),_c('div',{staticClass:\"filter\"},[_c('label',{staticClass:\"filter_name\",attrs:{\"for\":\"\"}},[_vm._v(\"Client Joined\")]),_c('checkbox',{attrs:{\"label\":\"Yes\",\"value\":_vm.table_filter.joined_yes},on:{\"changed\":newval => _vm.table_filter.joined_yes=newval}}),_c('checkbox',{attrs:{\"label\":\"No\",\"value\":_vm.table_filter.joined_no},on:{\"changed\":newval => _vm.table_filter.joined_no=newval}})],1),_c('div',{staticClass:\"filter\"},[_c('label',{staticClass:\"filter_name\",attrs:{\"for\":\"\"}},[_vm._v(\"Invite Sent\")]),_c('checkbox',{attrs:{\"label\":\"Yes\",\"value\":_vm.table_filter.invite_sent_yes},on:{\"changed\":newval => _vm.table_filter.invite_sent_yes=newval}}),_c('checkbox',{attrs:{\"label\":\"No\",\"value\":_vm.table_filter.invite_sent_no},on:{\"changed\":newval => _vm.table_filter.invite_sent_no=newval}})],1),_c('div',{staticClass:\"filter\"},[_c('label',{staticClass:\"filter_name\",attrs:{\"for\":\"\"}},[_vm._v(\"Invite Expired\")]),_c('checkbox',{attrs:{\"label\":\"Yes\",\"value\":_vm.table_filter.invite_expired_yes},on:{\"changed\":newval => _vm.table_filter.invite_expired_yes=newval}}),_c('checkbox',{attrs:{\"label\":\"No\",\"value\":_vm.table_filter.invite_expired_no},on:{\"changed\":newval => _vm.table_filter.invite_expired_no=newval}})],1),_c('div',{staticClass:\"filter\"},[_c('label',{staticClass:\"filter_name\",attrs:{\"for\":\"\"}},[_vm._v(\"Client Role\")]),_c('checkbox',{attrs:{\"label\":\"Full Control\",\"value\":_vm.table_filter.role_full_control},on:{\"changed\":newval => _vm.table_filter.role_full_control=newval}}),_c('checkbox',{attrs:{\"label\":\"Download Only\",\"value\":_vm.table_filter.role_readonly},on:{\"changed\":newval => _vm.table_filter.role_readonly=newval}})],1),_c('div',{staticClass:\"filter\"},[_c('label',{staticClass:\"filter_name\",attrs:{\"for\":\"\"}},[_vm._v(\"Two-Factor Auth\")]),_c('checkbox',{attrs:{\"label\":\"Yes\",\"value\":_vm.table_filter.mfa_enabled_yes},on:{\"changed\":newval => _vm.table_filter.mfa_enabled_yes=newval}}),_c('checkbox',{attrs:{\"label\":\"No\",\"value\":_vm.table_filter.mfa_enabled_no},on:{\"changed\":newval => _vm.table_filter.mfa_enabled_no=newval}})],1),_c('div',{staticClass:\"filter\"},[_c('label',{staticClass:\"filter_name\",attrs:{\"for\":\"\"}},[_vm._v(\"Files\")]),_c('checkbox',{attrs:{\"label\":\"Empty\",\"value\":_vm.table_filter.files_empty},on:{\"changed\":newval => _vm.table_filter.files_empty=newval}}),_c('checkbox',{attrs:{\"label\":\"Not Empty\",\"value\":_vm.table_filter.files_not_empty},on:{\"changed\":newval => _vm.table_filter.files_not_empty=newval}})],1)]):_vm._e(),(_vm.is_search)?_c('div',{staticClass:\"text-dark\"},[_c('i',{staticClass:\"ion-funnel mr-1\"}),_c('small',[_vm._v(\"Showing \"),_c('b',[_vm._v(_vm._s(_vm.active_spaces_filtered.length)+\" of \"+_vm._s(_vm.active_spaces.length))]),_vm._v(\" spaces\")])]):_vm._e(),(_vm.checked_spaces && _vm.checked_spaces.length > 0)?_c('div',{staticClass:\"card card-info text-white d-inline-block p-3\"},[_c('div',{staticClass:\"mb-2\"},[_c('b',[_vm._v(_vm._s(_vm.checked_spaces.length)+\" space\"+_vm._s(_vm.checked_spaces.length === 1 ? '' : 's')+\" selected \")]),_c('a',{staticClass:\"ion-close-round ml-2 text-white\",attrs:{\"title\":\"Clear selection\",\"href\":\"#\"},on:{\"click\":()=>{ _vm.active_spaces.forEach(s => { s.checked = false }); _vm.table_check_all=false }}})]),_c('button',{staticClass:\"btn btn-secondary text-bold mr-2\",attrs:{\"id\":\"resend_invite_batch_btn\",\"data-toggle\":\"popover\",\"data-animation\":\"false\",\"data-trigger\":\"hover\",\"data-html\":\"true\",\"data-placement\":\"top\",\"disabled\":_vm.resend_invite_batch_loading || _vm.checked_spaces_no_password.length === 0,\"data-content\":'Send an invite email to the selected spaces where the client has not joined yet ('+(_vm.checked_spaces_no_password.length)+' out of '+_vm.checked_spaces.length+' selected spaces)'},on:{\"click\":function($event){return _vm.resend_invite_batch(_vm.checked_spaces_no_password)}}},[_vm._v(\" Re-send Invite \"),_c('small',{},[_vm._v(\"(\"+_vm._s((_vm.checked_spaces_no_password.length))+\"/\"+_vm._s(_vm.checked_spaces.length)+\")\")]),_c('i',{staticClass:\"hover-available ion-information-circled ml-1\"}),(_vm.resend_invite_batch_loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()]),_c('button',{staticClass:\"btn btn-secondary text-bold mr-2\",attrs:{\"disabled\":_vm.multiselect_csv_export_loading},on:{\"click\":function($event){return _vm.multiselect_csv_export(_vm.checked_spaces)}}},[_vm._v(\" Export to CSV \"),(_vm.multiselect_csv_export_loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])]):_vm._e(),_c('table',{staticClass:\"table table-hover\",class:{'any_checked': _vm.checked_spaces && _vm.checked_spaces.length > 0 },attrs:{\"id\":\"spaces_table\"}},[_c('thead',[_c('th',{staticClass:\"d-none d-sm-table-cell\",attrs:{\"title\":\"Select or deselect all displayed spaces\"},on:{\"click\":function($event){_vm.table_check_all = !_vm.table_check_all}}},[_c('checkbox',{attrs:{\"value\":_vm.table_check_all},on:{\"changed\":newval => _vm.table_check_all = newval}})],1),_c('th',{staticClass:\"width-0 d-none d-sm-table-cell\"}),_c('th',{staticClass:\"c-pointer nowrap\",on:{\"click\":function($event){return _vm.sort_by('client_name')}}},[_vm._v(\"Client Name\"),(_vm.table_sort.field=='client_name')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()]),_c('th',{staticClass:\"c-pointer nowrap\",on:{\"click\":function($event){return _vm.sort_by('client_email')}}},[_vm._v(\"E-mail Address\"),(_vm.table_sort.field=='client_email')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()]),_c('th',{staticClass:\"d-none d-md-table-cell c-pointer text-center nowrap\",on:{\"click\":function($event){return _vm.sort_by('watch_managers')}}},[_vm._v(\" Watch\"),_c('info-icon',{attrs:{\"content\":\"Whether Space Managers are subscribed to email notification of new file uploads by the Client\"}}),(_vm.table_sort.field=='watch_managers')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()],1),_c('th',{staticClass:\"text-center d-none d-sm-table-cell c-pointer text-center nowrap\",on:{\"click\":function($event){return _vm.sort_by('joined')}}},[_vm._v(\"Joined\"),(_vm.table_sort.field=='joined')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()]),_c('th',{staticClass:\"text-center d-none d-md-table-cell c-pointer text-center nowrap\",on:{\"click\":function($event){return _vm.sort_by('client_role')}}},[_vm._v(\" Role\"),_c('info-icon',{attrs:{\"content\":\"What the client is allowed to do in the Space.Download : Download files but no uploading or deleting anythingFull : Upload, download, delete, etc\"}}),(_vm.table_sort.field=='client_role')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()],1),_c('th',{staticClass:\"text-center d-none d-lg-table-cell c-pointer nowrap\",on:{\"click\":function($event){return _vm.sort_by('mfa_enabled')}}},[_vm._v(\" 2FA\"),_c('info-icon',{attrs:{\"content\":\"Whether the Client enabled Two-Factor Authentication\"}}),(_vm.table_sort.field=='mfa_enabled')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()],1),_c('th',{staticClass:\"text-center d-none d-lg-table-cell c-pointer text-center nowrap\",on:{\"click\":function($event){return _vm.sort_by('files_num')}}},[_vm._v(\"Files\"),(_vm.table_sort.field=='files_num')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()]),_c('th',{staticClass:\"text-center d-none d-md-table-cell c-pointer nowrap\",on:{\"click\":function($event){return _vm.sort_by('managers_num')}}},[_vm._v(\"Managers\"),(_vm.table_sort.field=='managers_num')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()]),_c('th',{staticClass:\"d-none d-lg-table-cell c-pointer nowrap\",on:{\"click\":function($event){return _vm.sort_by('created')}}},[_vm._v(\"Created\"),(_vm.table_sort.field=='created')?_c('i',{staticClass:\"ml-1\",class:{'ion-arrow-up-c': !_vm.table_sort.desc, 'ion-arrow-down-c': _vm.table_sort.desc}}):_vm._e()]),_c('th',{staticClass:\"width-0\"}),_c('th',{staticClass:\"width-0\"})]),_c('tbody',_vm._l((_vm.active_spaces_filtered_sorted),function(space){return _c('tr',{key:space.id,class:{'checked': space.checked},on:{\"click\":() => { /* Multiselect return false; space.checked = !space.checked */ 0}}},[_c('td',{staticClass:\"d-none d-sm-table-cell c-pointer pr-0 mr-0\"},[_c('checkbox',{attrs:{\"value\":space.checked},on:{\"changed\":newval => _vm.table_check_all = space.checked}})],1),_c('td',{staticClass:\"d-none d-sm-table-cell pl-0 v-middle\",staticStyle:{\"height\":\"48px\"}},[(space.client_logo)?_c('img',{staticClass:\"rounded fit-contain shadow-z1\",staticStyle:{\"max-width\":\"48px\",\"max-height\":\"48px\"},attrs:{\"src\":_vm.ClientSpacesService.is_skyflok_logo(space) ? _vm.Utils.client_space_logo_src(space.client_logo) : space.client_logo}}):_c('div',{staticClass:\"shadow-z1 thumb48 rounded bg-gradient-secondary d-inline-block\"},[_c('div',{staticClass:\"d-flex align-items-center justify-content-center fh fw text-white text-bold\"},[_vm._v(\" \"+_vm._s(space.client_name.split(' ').map(frag => frag.length > 0 ? frag[0].toUpperCase() : '').splice(0,3).join(''))+\" \")])])]),_c('td',{staticClass:\"break-word\"},[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.highlight_search(space.client_name, _vm.table_filter.client_name))}})]),_c('td',{staticClass:\"break-word\"},[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.highlight_search(space.client_email, _vm.table_filter.email))}})]),_c('td',{staticClass:\"d-none d-md-table-cell text-center\"},[_c('button',{staticClass:\"btn btn-secondary btn-flat btn-flat-icon c-pointer\",attrs:{\"type\":\"button\",\"data-toggle\":\"popover\",\"data-animation\":\"false\",\"data-trigger\":\"hover\",\"data-html\":\"true\",\"data-placement\":\"top\",\"data-content\":'Click to turn ' + (space.watch_managers ? 'off' : 'on') + ' email notifications when the client uploads a file'},on:{\"click\":function($event){return _vm.change_watch(space)}}},[_c('i',{class:{'ion-android-notifications': space.watch_managers, 'ion-android-notifications-none text-gray-light': !space.watch_managers}})])]),_c('td',{staticClass:\"d-none d-sm-table-cell text-center\"},[(space.password_set)?_c('span',{staticClass:\"text-success\"},[_c('i',{staticClass:\"ion-checkmark-circled mr-1\"}),_vm._v(\" Yes \")]):(!space.invite_code)?_c('span',[_vm._v(\" Invite not sent\"),_c('br'),_c('a',{staticClass:\"btn btn-sm text-sm btn-primary text-bold mt-1\",attrs:{\"href\":\"#\",\"disabled\":space.invite_sending},on:{\"click\":function($event){$event.stopPropagation();return _vm.resend_client_invite(space)}}},[_vm._v(\" Send invite \"),(space.invite_sending)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])]):(space.invite_code && space.is_invite_expired)?_c('span',{staticClass:\"text-danger\"},[_c('i',{staticClass:\"ion-alert-circled mr-1\"}),_vm._v(\"Expired!\"),_c('br'),_c('a',{staticClass:\"btn btn-sm text-sm btn-primary text-bold mt-1\",attrs:{\"href\":\"#\",\"disabled\":space.invite_sending},on:{\"click\":function($event){$event.stopPropagation();return _vm.resend_client_invite(space)}}},[_vm._v(\" Send invite \"),(space.invite_sending)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])]):(space.invite_code && !space.is_invite_expired)?_c('span',[_vm._v(\" Invite sent \"),_c('small',[_c('i',{staticClass:\"ion-information-circled ml-1 c-help\",attrs:{\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-content\":space.will_expire_text}})]),_c('br'),_c('small',[_c('a',{attrs:{\"href\":\"#\",\"disabled\":space.invite_sending},on:{\"click\":function($event){$event.stopPropagation();return _vm.resend_client_invite(space)}}},[_vm._v(\" Re-send invite? \"),(space.invite_sending)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])])]):_vm._e()]),_c('td',{staticClass:\"d-none d-md-table-cell text-center\"},[(space.client_readonly)?_c('span',{staticClass:\"text-primary\"},[_vm._v(\"Download\")]):_c('span',{staticClass:\"text-success\"},[_vm._v(\"Full\")])]),_c('td',{staticClass:\"d-none d-lg-table-cell text-center nowrap\"},[(space.mfa_enabled)?_c('span',{staticClass:\"text-success\"},[_c('i',{staticClass:\"ion-locked mr-1\"}),_vm._v(\" Yes \")]):_c('span',{staticClass:\"text-muted\"},[_vm._v(\"No\")])]),_c('td',{staticClass:\"d-none d-lg-table-cell text-center\"},[(!space.ns_stats)?_c('i',{staticClass:\"ion-load-c spin\"}):(space.ns_stats.active_files == 0)?_c('i',[_vm._v(\"Empty\")]):_c('span',[_vm._v(\" \"+_vm._s(space.ns_stats.active_files)+\" \")])]),_c('td',{staticClass:\"d-none d-md-table-cell\"},[(space.members.length > 1)?_c('span',[_vm._v(_vm._s(space.members.length)+\" managers\")]):(_vm.user.team)?_c('user-box',{staticClass:\"nowrap\",attrs:{\"avatar_left\":true,\"team\":_vm.user.team,\"userId\":space.members[0]}}):_vm._e()],1),_c('td',{staticClass:\"d-none d-lg-table-cell\"},[_c('timestamp',{attrs:{\"timestamp\":space.created}})],1),_c('td',[_c('a',{staticClass:\"btn btn-sm text-sm btn-info ml-2 text-bold\",attrs:{\"href\":_vm._f(\"client_space_link\")(space.key),\"target\":\"_BLANK\",\"title\":'Open the Space of '+space.client_name},on:{\"click\":() => {return false; space.checked = !space.checked}}},[_c('span',{staticClass:\"d-none d-md-inline-block mr-1\"},[_vm._v(\"Open\")]),_c('i',{staticClass:\"ion-share\"})])]),_c('td',[_c('div',{staticClass:\"dropdown\",on:{\"click\":() => { return false; space.checked = !space.checked}}},[_c('button',{staticClass:\"btn btn-secondary btn-flat btn-flat-icon\",attrs:{\"data-toggle\":\"dropdown\",\"id\":'dropdown_'+space.id,\"type\":\"button\",\"aria-expanded\":\"false\"}},[_c('em',{staticClass:\"ion-android-more-horizontal\"})]),_c('div',{staticClass:\"dropdown-menu dropdown-scale dropdown-menu-right\",attrs:{\"role\":\"menu\"}},[(!space.is_archived)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.edit_space(space)}}},[_c('i',{staticClass:\"ion-edit mr-2\"}),_vm._v(\" Edit Space\")]):_vm._e(),(!space.is_archived)?_c('a',{staticClass:\"dropdown-item d-flex align-items-center\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.open_dialog('reset_password', space)}}},[_c('i',{staticClass:\"ion-refresh mr-2\"}),_vm._v(\" Reset Client password\")]):_vm._e(),(space.mfa_enabled && !space.is_archived)?_c('a',{staticClass:\"dropdown-item d-flex align-items-center\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.open_dialog('mfa_backup_codes', space)}}},[_c('i',{staticClass:\"ion-help-buoy mr-2\"}),_vm._v(\" 2FA Backup Codes\")]):_vm._e(),(!space.is_archived)?_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}}):_vm._e(),(!space.is_archived)?_c('a',{staticClass:\"dropdown-item text-danger\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.open_dialog('archive_space', space)}}},[_c('i',{staticClass:\"ion-trash-a mr-2\"}),_vm._v(\" Archive or Delete...\")]):(_vm.activatedisabled !== true)?_c('a',{staticClass:\"dropdown-item text-success\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.activateclicked(space)}}},[_c('i',{staticClass:\"ion-wand mr-2\"}),_vm._v(\" Activate Space\")]):_vm._e()])])])])}),0)])])])]):_vm._e(),(_vm.active_spaces_num === 0)?_c('div',{staticClass:\"row mb-3\"},[_c('div',{staticClass:\"col-4\"}),_c('div',{staticClass:\"col-4\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-success b0 c-pointer\",on:{\"click\":function($event){return _vm.create_space()}}},[_vm._m(1)])])]):_vm._e(),(_vm.archived_spaces && _vm.archived_spaces.length > 0)?_c('div',[_c('h3',[_vm._v(\"Archived Spaces \"),_c('small',[_vm._v(\"(\"+_vm._s(_vm.archived_spaces.length)+\")\")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-secondary\",on:{\"click\":function($event){_vm.show_archived = !_vm.show_archived}}},[_vm._v(_vm._s(_vm.show_archived ? 'Hide' : 'Show'))])]),_c('div',{staticClass:\"row\",class:{'d-none': !_vm.show_archived},attrs:{\"id\":\"archived_spaces_container\"}},_vm._l((_vm.archived_spaces),function(space){return _c('client-space-box',{key:space.id,attrs:{\"space\":space,\"user\":_vm.user,\"activatedisabled\":_vm.active_spaces_limit && _vm.active_spaces.length >= _vm.active_spaces_limit,\"activateclicked\":(space) => { _vm.activate_space(space) }}})}),1)]):_vm._e()]):_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"},[_vm._v(\" \")]),_vm._m(2)])]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"client_space_form\"}},[(_vm.show_space_form)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[(_vm.space_to_edit && _vm.space_to_edit.id)?_c('div',[_vm._v(\" Edit Client Space of \"),_c('b',[_vm._v(_vm._s(_vm.space_to_edit.client_name))])]):_c('div',[_vm._v(\" Create new Client Space \")])]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('client_space_form')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[(_vm.space_to_edit === null && !_vm.hide_form_switcher)?_c('div',{staticClass:\"d-none d-md-block mb-2 text-center\"},[(!_vm.batch_create_mode)?_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.batch_create_mode = true}}},[_c('span',{staticClass:\"badge badge-info mr-2\"},[_vm._v(\"NEW\")]),_vm._v(\"Creating many Spaces? Try the new batch mode! \")]):_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.batch_create_mode = false}}},[_vm._v(\" Create a single Space \")])]):_vm._e(),(_vm.user && _vm.user.team)?_c('client-space-form',{ref:\"space_form\",attrs:{\"space\":_vm.space_to_edit,\"team\":_vm.user.team,\"user\":_vm.user,\"batch_mode\":_vm.batch_create_mode,\"hide_form_switch\":() => { _vm.hide_form_switcher = true },\"reload_spaces_callback\":() => { _vm.load_spaces() },\"closeDialog\":() => { _vm.close_modal('client_space_form') }}}):_vm._e()],1)])]):_vm._e()]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"archive_space_modal\"}},[(_vm.space_to_archive)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\"Archive Client Space of \"),_c('b',[_vm._v(_vm._s(_vm.space_to_archive.client_name))])]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('archive_space_modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('archive-space-modal',{attrs:{\"space\":_vm.space_to_archive},on:{\"archived\":(space_id) => { _vm.on_space_updated(space_id)}}})],1)])]):_vm._e()]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"disable_space_modal\"}},[(_vm.space_to_disable)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\"Disable access of \"),_c('b',[_vm._v(_vm._s(_vm.space_to_disable.client_name))])]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('disable_space_modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_vm._v(\" Disable access \")])])]):_vm._e()]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"mfa_backup_codes_modal\"}},[(_vm.mfa_backup_codes_space)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\" Two-Factor Authentication Backup Codes \")]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('mfa_backup_codes_modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('mfa-backup-codes',{attrs:{\"space_id\":_vm.mfa_backup_codes_space.id,\"client_name\":_vm.mfa_backup_codes_space.client_name,\"user_email\":_vm.mfa_backup_codes_space.client_email}})],1)])]):_vm._e()]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"reset_password_modal\"}},[(_vm.password_reset_space)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\" Reset password of \"),_c('b',[_vm._v(_vm._s(_vm.password_reset_space.client_name))])]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('reset_password_modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body text-black\"},[_c('space-psw-reset-modal',{attrs:{\"space\":_vm.password_reset_space,\"space_updated\":(updated_space) => { _vm.password_reset_space.invite_expires = updated_space.invite_expires; _vm.password_reset_space.password_set = updated_space.password_set; _vm.password_reset_space.invite_code = updated_space.invite_code; _vm.init_space(_vm.password_reset_space) },\"close_modal\":() => { _vm.close_modal('reset_password_modal'); }}})],1)])]):_vm._e()]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"edit_managers_modal\"}},[(_vm.show_edit_managers_modal)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title text-bold\"},[_vm._v(\" Edit Managers \")]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('edit_managers_modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body text-black\"},[_c('edit-managers-modal',{attrs:{\"team\":_vm.user ? _vm.user.team : [],\"spaces\":_vm.spaces,\"close_modal\":()=>{ _vm.close_modal('edit_managers_modal') }}})],1)])]):_vm._e()])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-lg-8\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-success b0\"},[_c('div',{staticClass:\"cardbox-body text-center text-12\"},[_vm._v(\" Client Spaces are \"),_c('b',[_vm._v(\"secure, confidential shared folders\")]),_vm._v(\" between you and your clients, where both of you can upload and download files. It's a simple but very \"),_c('b',[_vm._v(\"secure alternative of emailing files to each other\")]),_vm._v(\", and you don't even need to make your clients Team Members. \")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox-body text-center\"},[_c('div',{staticClass:\"text-bold display-1\"},[_c('i',{staticClass:\"ion-plus-round\"})]),_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\"Create Client Space\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-6\"},[_c('div',[_c('div',{staticClass:\"cardbox text-white bg-gradient-success b0\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_c('div',{staticClass:\"text-bold display-1\"},[_c('div',{staticClass:\"loader\"})])])])])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-md-6 col-lg-6 col-xl-3\"},[_c('div',{staticClass:\"cardbox mx-2 mb-4\",class:{'text-muted': _vm.space.is_archived}},[_c('div',{staticClass:\"pb-1\",class:[_vm.color]}),_c('div',{staticClass:\"cardbox-body pb-0 pb-2\"},[_c('div',{staticClass:\"d-flex align-items-center justify-content-between\"},[_c('div',{staticClass:\"text-center\"},[_c('button',{staticClass:\"btn btn-secondary btn-flat btn-flat-icon d-block c-pointer\",attrs:{\"type\":\"button\",\"data-toggle\":\"popover\",\"data-animation\":\"false\",\"data-trigger\":\"hover\",\"data-placement\":\"top\",\"data-content\":_vm.watch_toggle_popover_text},on:{\"click\":function($event){return _vm.watch_clicked()}}},[_c('i',{class:{\n 'ion-android-notifications': _vm.space.watch_managers, \n 'ion-android-notifications-none text-muted': !_vm.space.watch_managers\n }})])]),_c('div',{staticClass:\"dropdown\"},[_vm._m(0),_c('div',{staticClass:\"dropdown-menu\",attrs:{\"role\":\"menu\"}},[(!_vm.space.is_archived)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.$emit('edit')}}},[_c('i',{staticClass:\"ion-edit mr-2\"}),_vm._v(\" Edit Space\")]):_vm._e(),(!_vm.space.is_archived)?_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.$emit('open_dialog', 'reset_password')}}},[_c('i',{staticClass:\"ion-refresh mr-2\"}),_vm._v(\" Reset Client Password\")]):_vm._e(),(_vm.space.mfa_enabled && !_vm.space.is_archived)?_c('a',{staticClass:\"dropdown-item d-flex align-items-center\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.$emit('open_dialog', 'mfa_backup_codes')}}},[_c('i',{staticClass:\"ion-help-buoy mr-2\"}),_vm._v(\" 2FA Backup Codes\")]):_vm._e(),(!_vm.space.is_archived)?_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}}):_vm._e(),(!_vm.space.is_archived)?_c('a',{staticClass:\"dropdown-item text-danger\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.$emit('open_dialog', 'archive_space')}}},[_c('i',{staticClass:\"ion-trash-a mr-2\"}),_vm._v(\" Archive or Delete...\")]):(_vm.activatedisabled !== true)?_c('a',{staticClass:\"dropdown-item text-success\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.activateclicked(_vm.space)}}},[_c('i',{staticClass:\"ion-wand mr-2\"}),_vm._v(\" Activate Space\")]):_vm._e()])])])]),_c('div',{staticClass:\"cardbox-body pt-0 text-center\"},[_c('a',{staticStyle:{\"color\":\"inherit\",\"text-decoration\":\"none\"},attrs:{\"href\":_vm._f(\"client_space_link\")(_vm.space.key),\"target\":\"_BLANK\"}},[_c('div',{staticClass:\"d-table-cell v-middle\",staticStyle:{\"height\":\"128px\"}},[(_vm.space.client_logo)?_c('img',{staticClass:\"shadow-z3 rounded fit-contain d-inline-block\",staticStyle:{\"max-width\":\"128px\",\"max-height\":\"128px\"},attrs:{\"src\":_vm.ClientSpacesService.is_skyflok_logo(_vm.space) ? _vm.Utils.client_space_logo_src(_vm.space.client_logo) : _vm.space.client_logo}}):_c('div',{staticClass:\"shadow-z3 thumb128 rounded bg-gradient-secondary d-inline-block\"},[_c('div',{staticClass:\"d-flex align-items-center justify-content-center fh fw text-white text-bold\"},[_c('h1',{staticClass:\"p-0 m-0\"},[_vm._v(_vm._s(_vm.space.client_name.split(' ').map(frag => { return frag.length > 0 ? frag[0].toUpperCase() : '' }).splice(0,3).join('')))])])])]),_c('div',{staticClass:\"h3 text-bold mt-3\",attrs:{\"title\":_vm.space.client_name.length > 15 ? _vm.space.client_name : ''}},[_vm._v(\" \"+_vm._s(_vm.space.client_name.substr(0, 15))+_vm._s(_vm.space.client_name.length > 15 ? '…' : '')+\" \")]),_c('div',{staticClass:\"text-sm\",class:{\n 'text-gray text-italic': _vm.client_state == 'INVITE_PENDING', \n 'text-danger': _vm.client_state == 'INVITE_EXPIRED'\n },attrs:{\"data-toggle\":_vm.client_popover_text != '' ? 'popover' : '',\"data-content\":_vm.client_popover_text,\"data-animation\":\"false\",\"data-trigger\":\"hover\",\"data-placement\":\"top\"}},[_c('span',[_vm._v(_vm._s(_vm.space.client_email))]),(_vm.client_state != '')?_c('i',{staticClass:\"ml-1\",class:{\n 'ion-clock': _vm.client_state == 'INVITE_PENDING', \n 'ion-alert-circled': _vm.client_state == 'INVITE_EXPIRED', \n 'ion-checkmark-circled text-success': _vm.client_state == 'JOINED'\n }}):_vm._e()])]),(_vm.space.delete_at)?_c('div',{staticClass:\"alert alert-warning alert-sm text-center mb-0\"},[_c('small',[_vm._v(\"This Space will be automatically deleted \"+_vm._s(_vm._f(\"timestamp_rel\")(_vm.space.delete_at)))])]):_vm._e()]),_c('div',{staticClass:\"cardbox-body pt-0 text-center\"},[_c('div',{staticClass:\"image-list d-flex align-items-center justify-content-center nowrap\"},[_vm._l((_vm.space_managers.splice(0,3)),function(member){return _c('img',{key:member.id,staticClass:\"rounded-circle thumb48 fit-cover shadow-z2\",staticStyle:{\"border\":\"2px solid white\"},attrs:{\"src\":member.avatar_url,\"alt\":member.name}})}),(_vm.space.members.length > 3)?_c('div',{staticClass:\"rounded-circle thumb48 shadow-z2 bg-gray-lighter d-inline-block text-center d-flex align-items-center justify-content-center\",staticStyle:{\"border\":\"2px solid white\",\"margin-left\":\"-8px\"}},[_c('span',[_vm._v(\"+\"+_vm._s(_vm.space.members.length-3))])]):_vm._e()],2),_c('small',{staticClass:\"nowrap\"},[_vm._v(\"Managers\")])]),_c('div',{staticClass:\"cardbox-body pt-0\"},[(!_vm.space.is_archived)?_c('a',{class:[ 'btn btn-block text-white', _vm.color ],attrs:{\"target\":\"_BLANK\",\"href\":_vm._f(\"client_space_link\")(_vm.space.key),\"title\":\"Open this Space in a new tab\"}},[_vm._m(1)]):_c('a',{staticClass:\"btn btn-block bg-gradient-secondary text-white\",attrs:{\"href\":_vm._f(\"client_space_link\")(_vm.space.key),\"target\":\"_BLANK\",\"title\":\"Browse this Space in a new tab\"}},[_vm._m(2)])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('button',{staticClass:\"btn btn-secondary btn-flat btn-sm btn-flat-icon\",attrs:{\"type\":\"button\",\"data-toggle\":\"dropdown\",\"aria-expanded\":\"false\"}},[_c('i',{staticClass:\"ion-more text-gray-light\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('b',[_vm._v(\"Open Space \"),_c('i',{staticClass:\"ion-share ml-1\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('b',[_vm._v(\"Browse Space \"),_c('i',{staticClass:\"ion-share ml-1\"})])\n}]\n\nexport { render, staticRenderFns }","\n\n
\n\n
\n\n
\n\n
\n
\n \n \n \n \n \n
\n\n\n
\n \n \n \n \n
\n
\n
\n\n
\n\n
\n
\n
\n
3\" class=\"rounded-circle thumb48 shadow-z2 bg-gray-lighter d-inline-block text-center d-flex align-items-center justify-content-center\" style=\"border: 2px solid white; margin-left: -8px\" >+{{ space.members.length-3 }}
\n
\n
Managers \n
\n\n
\n\n
\n
\n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client-space-box.1.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client-space-box.1.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./client-space-box.1.vue?vue&type=template&id=679c72b3&scoped=true\"\nimport script from \"./client-space-box.1.vue?vue&type=script&lang=js\"\nexport * from \"./client-space-box.1.vue?vue&type=script&lang=js\"\nimport style0 from \"./client-space-box.1.vue?vue&type=style&index=0&id=679c72b3&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"679c72b3\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[_c('section',{staticClass:\"d-none d-xl-block\"},[(_vm.form)?_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_form.apply(null, arguments)}}},[_c('table',{staticClass:\"table client_space_form settings-table mb-0\"},[(_vm.form_error)?_c('tr',[_c('td',{attrs:{\"colspan\":\"2\"}},[_c('div',{staticClass:\"alert alert-danger\",domProps:{\"innerHTML\":_vm._s(_vm.form_error)}})])]):_vm._e(),(_vm.batch_mode && !_vm.raw_csv)?_c('tr',[_vm._m(0),_c('td',[(!_vm.raw_csv)?_c('input',{staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"file\"},on:{\"change\":_vm.read_csv}}):_c('button',{staticClass:\"btn btn-sm btn-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.raw_csv = null; _vm.parsed_contacts = null}}},[_vm._v(\"Load a new CSV\")]),_vm._m(1)])]):_vm._e(),(_vm.batch_mode)?_c('tr',[_c('th',[_vm._v(\"Clients\"),(_vm.parsed_contacts)?_c('span',[_vm._v(\" (\"+_vm._s(_vm.parsed_contacts.length)+\")\")]):_vm._e()]),_c('td',[(!_vm.parsed_contacts)?_c('div',{staticClass:\"muted text-sm text-italic\"},[_vm._v(\"You will see the list of imported clients here after loading a CSV file\")]):_c('div',[(_vm.parsed_contacts.length != _vm.valid_batch_clients.length)?_c('div',{staticClass:\"m-2 text-warning text-sm\"},[_c('i',{staticClass:\"ion-alert-circled mr-1\"}),_vm._v(\" There is a problem with \"+_vm._s(_vm.parsed_contacts.length - _vm.valid_batch_clients.length)+\" out of \"+_vm._s(_vm.parsed_contacts.length)+\" contacts. We cannot create a Space for them unless you fix the problems manually. \")]):_vm._e(),_c('div',{staticStyle:{\"max-height\":\"300px\",\"overflow-y\":\"auto\"}},[_c('table',{staticClass:\"table table-sm table-bordered\"},[_c('thead',[_c('th',{staticClass:\"text-center\",staticStyle:{\"width\":\"1px\"}}),_c('th',{staticStyle:{\"width\":\"1px\"}},[_c('div',{staticClass:\"c-pointer\",attrs:{\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-content\":\"Send an invite email to the client. Click to check/uncheck all\"},on:{\"click\":function($event){_vm.parsed_contacts[0].send_email = !_vm.parsed_contacts[0].send_email; _vm.parsed_contacts.map(c => { c.send_email = _vm.parsed_contacts[0].send_email })}}},[_c('i',{staticClass:\"ion-email\"})])]),_c('th',{staticClass:\"text-center\"},[_vm._v(\"Client Name\")]),_c('th',{staticClass:\"text-center\"},[_vm._v(\"E-mail address\")]),_c('th',{})]),_c('tbody',[_vm._l((_vm.parsed_contacts),function(contact,index){return _c('tr',{key:index},[_c('td',{staticClass:\"nowrap\"},[_vm._v(\" \"+_vm._s(index+1)+\". \"),(contact.name == '' || !_vm.validate_email(contact.email))?_c('i',{staticClass:\"ion-alert-circled text-warning\",attrs:{\"title\":\"There is a problem with this contact, please fix if you want to create a Space for him/her!\"}}):_vm._e()]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(contact.send_email),expression:\"contact.send_email\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(contact.send_email)?_vm._i(contact.send_email,null)>-1:(contact.send_email)},on:{\"change\":function($event){var $$a=contact.send_email,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(contact, \"send_email\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(contact, \"send_email\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(contact, \"send_email\", $$c)}}}})]),_c('td',{class:{'table-danger': contact.name == ''}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(contact.name),expression:\"contact.name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\"},domProps:{\"value\":(contact.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(contact, \"name\", $event.target.value)}}})]),_c('td',{class:{'table-danger': !_vm.validate_email(contact.email)}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(contact.email),expression:\"contact.email\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"email\"},domProps:{\"value\":(contact.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(contact, \"email\", $event.target.value)}}})]),_c('td',{staticClass:\"text-center\"},[_c('a',{staticClass:\"text-danger\",attrs:{\"href\":\"#\",\"title\":\"Remove this row\"},on:{\"click\":function($event){return _vm.parsed_contacts.splice(index, 1)}}},[_c('i',{staticClass:\"ion-close-round\"})])])])}),_c('tr',[_c('td',{staticClass:\"text-center\",attrs:{\"colspan\":\"6\"}},[_c('a',{staticClass:\"text-sm\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.parsed_contacts.push({name: '', email: '', send_email: true})}}},[_c('i',{staticClass:\"ion-plus-round mr-1\"}),_vm._v(\"Add a client manually\")])])])],2)])])])])]):_vm._e(),(!_vm.batch_mode && (_vm.form.id === null || (_vm.space && !_vm.space.edit_managers_only)))?_c('tr',[_c('th',[_vm._v(\"Client name *\")]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.client_name),expression:\"form.client_name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"id\":\"form-client_name\",\"required\":\"\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.form.client_name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"client_name\", $event.target.value)}}})])]):_vm._e(),(!_vm.batch_mode && (_vm.form.id === null || (_vm.space && !_vm.space.edit_managers_only)))?_c('tr',[_c('th',[_vm._v(\"Client e-mail *\")]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.client_email),expression:\"form.client_email\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"email\",\"id\":\"form-client_email\",\"required\":\"\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.form.client_email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"client_email\", $event.target.value)}}})])]):_vm._e(),(_vm.form.id === null || (_vm.space && !_vm.space.edit_managers_only))?_c('tr',[_c('th',{staticClass:\"v-top\"},[_vm._v(\"Client logo\"),(_vm.batch_mode)?_c('div',[_c('small',[_vm._v(\"(applies to all spaces)\")])]):_vm._e()]),_c('td',{staticStyle:{\"width\":\"80%\",\"padding-top\":\"0px\"}},[_c('div',{attrs:{\"id\":\"client_space_logos_carousel\"}},_vm._l((_vm.logos),function(logo){return _c('div',{key:logo.path,staticClass:\"slide d-inline-block\"},[_c('img',{staticClass:\"logo c-pointer m-1\",class:{'selected': logo.selected},attrs:{\"title\":logo.name+' (Click to '+(logo.selected ? 'un' : '')+'select)',\"src\":logo.path,\"width\":\"84\",\"height\":\"84\"},on:{\"click\":function($event){return _vm.select_logo(logo)}}})])}),0),(_vm.space !== null && _vm.custom_logo_url)?_c('div',{staticClass:\"mt-2\"},[_c('span',{staticClass:\"text-sm mr-2\"},[_vm._v(\"Custom logo:\")]),_c('img',{staticClass:\"shadow-z5 thumb64 rounded fit-cover\",attrs:{\"src\":_vm.custom_logo_url}}),_c('button',{staticClass:\"btn btn-sm btn-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.custom_logo_url = null}}},[_vm._v(\"Clear\")])]):_c('div',{staticClass:\"mt-2\"},[(!_vm.custom_logo_url)?_c('span',{staticClass:\"text-sm mr-2\"},[_vm._v(\"Upload custom logo:\")]):_vm._e(),_c('profile-image-selector',{staticClass:\"d-inline-block\",attrs:{\"avatar_changed\":(avatar_url) => { _vm.custom_logo_url = avatar_url; _vm.logos.forEach(logo => { logo.selected = false }) },\"max_dimension_px\":128}})],1)])]):_vm._e(),(_vm.form && _vm.form.client_readonly !== undefined)?_c('tr',[_c('th',{staticClass:\"v-top\"},[_vm._v(\"Client role\"),(_vm.batch_mode)?_c('div',[_c('small',[_vm._v(\"(applies to all spaces)\")])]):_vm._e()]),_c('td',[_c('button',{staticClass:\"btn mb-2\",class:{'btn-success': !_vm.form.client_readonly, 'btn-secondary': _vm.form.client_readonly},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form.client_readonly=false}}},[_c('b',[_vm._v(\"Upload, download and delete\")]),_c('br'),_vm._v(\" The client can upload, download & delete files\"),_c('br'),_vm._v(\"and change the folder structure. \")]),_c('button',{staticClass:\"btn\",class:{'btn-primary': _vm.form.client_readonly, 'btn-secondary': !_vm.form.client_readonly},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form.client_readonly=true}}},[_c('b',[_vm._v(\"Download only\")]),_c('br'),_vm._v(\" The client cannot change anything \"),_c('br'),_vm._v(\"or upload new files, just browse and download. \")])])]):_vm._e(),_c('tr',[_c('th',{staticClass:\"v-top nowrap\"},[_vm._v(\" Space Managers \"),_c('i',{staticClass:\"ion-information-circled icon-lg ml-1\",attrs:{\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-content\":\"Team Members who are allowed to upload files to this Space. Note that Team Administrators can see and open every Space, but even they cannot upload/download if they are not Space Managers.\"}}),(_vm.batch_mode)?_c('div',[_c('small',[_vm._v(\"(applies to all spaces)\")])]):_vm._e(),_c('div',{staticClass:\"text-normal\",class:{'text-danger': _vm.members.filter(m => { return m.selected }).length === 0 }},[_c('i',{staticClass:\"text-sm\"},[_vm._v(_vm._s(_vm.members.filter(m => { return m.selected }).length)+\" selected\")])]),_c('div',[_c('small',[_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.stopPropagation();_vm.members.filter(m=>{ return m.selected }).length < _vm.members.length ? _vm.members.map(m => { m.selected = true }) : _vm.members.map(m => { m.selected = false })}}},[_vm._v(\"Select \"+_vm._s(_vm.members.filter(m=>{ return m.selected }).length < _vm.members.length ? 'all' : 'none'))])])])]),_c('td',_vm._l((_vm.members),function(member){return _c('div',{key:member.user_id,staticClass:\"float-left member-box m-1\",class:{'bg-info text-white active text-bold': member.selected},on:{\"click\":function($event){member.selected = !member.selected}}},[_c('user-box',{staticClass:\"m-1 ml-2 mr-2\",attrs:{\"team\":_vm.team,\"user-id\":member.user_id,\"no-prefix\":true,\"title\":'Click to '+(member.selected ? 'remove' : 'add')+' ' + member.name}})],1)}),0)]),_c('tr',[_c('th',[_vm._v(\"Notifications\")]),_c('td',[_c('button',{staticClass:\"btn text-bold mr-1\",class:{'btn-success': _vm.form.watch_managers, 'btn-secondary': !_vm.form.watch_managers},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form.watch_managers = true}}},[_vm._v(\"Yes \"),_c('i',{staticClass:\"ion-android-notifications ml-2\"})]),_c('button',{staticClass:\"btn text-bold\",class:{'btn-secondary btn-gradient': !_vm.form.watch_managers, 'btn-secondary': _vm.form.watch_managers},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form.watch_managers = false}}},[_vm._v(\"No \"),_c('i',{staticClass:\"ion-android-notifications-off ml-2\"})]),_c('br'),_c('small',[_vm._v(\"Space Managers get an email notification when the Client uploads new files\")])])]),_c('tr',[_c('td',{staticClass:\"text-right\",attrs:{\"colspan\":\"2\"}},[_c('button',{staticClass:\"btn btn-secondary mr-2\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.closeDialog()}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-info btn-gradient\",attrs:{\"type\":\"submit\",\"disabled\":_vm.form_loading || !_vm.is_submit_allowed}},[(_vm.form.id !== null)?_c('span',[_vm._v(\"Update Space\")]):(!_vm.batch_mode)?_c('span',[_vm._v(\"Create Space & Send Invite \"),_c('i',{staticClass:\"ion-paper-airplane ml-1\"})]):_c('span',[_vm._v(\"Create \"+_vm._s(_vm.valid_batch_clients.length)+\" Space\"+_vm._s(_vm.valid_batch_clients.length === 1 ? '' : 's')+\" & Send Invitation\"+_vm._s(_vm.valid_batch_clients.length === 1 ? '' : 's'))]),(_vm.form_loading)?_c('i',{staticClass:\"ml-2 ion-load-c spin\"}):_vm._e()]),(_vm.form.id == null)?_c('div',[_c('small',[_c('a',{staticClass:\"c-help\",attrs:{\"href\":\"#\",\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-content\":\"When you click the Create button below: The Space is created, you can start using it immediately. We send an email to your Client with an invitation link. The link expires in 24 hours. When your Client clicks the link, they can set their own password and you get an email notification. If the invitation expires without the Client accepting it, you get an email notification and you can send a new invite. \"},on:{\"click\":function($event){$event.preventDefault();return (() => { return false }).apply(null, arguments)}}},[_vm._v(\"What happens when I click create? \"),_c('i',{staticClass:\"ion-information-circled\"})])])]):_vm._e()])])])]):_vm._e()]),_c('section',{staticClass:\"d-block d-xl-none\"},[(_vm.form_error)?_c('div',{staticClass:\"alert alert-danger\",domProps:{\"innerHTML\":_vm._s(_vm.form_error)}}):_vm._e(),(_vm.form)?_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_form.apply(null, arguments)}}},[_c('div',{staticClass:\"mobile-form-field\"},[_c('div',{staticClass:\"text-bold\"},[_vm._v(\"Client Name\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.client_name),expression:\"form.client_name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"id\":\"form-client_name\",\"required\":\"\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.form.client_name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"client_name\", $event.target.value)}}})]),_c('div',{staticClass:\"mobile-form-field\"},[_c('div',{staticClass:\"text-bold\"},[_vm._v(\"Client E-mail\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.client_email),expression:\"form.client_email\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"email\",\"id\":\"form-client_email\",\"required\":\"\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.form.client_email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"client_email\", $event.target.value)}}})]),(_vm.form.id === null || (_vm.space && !_vm.space.edit_managers_only))?_c('div',{staticClass:\"mobile-form-field\"},[_c('div',{staticClass:\"text-bold\"},[_vm._v(\"Logo\")]),_c('div',{staticClass:\"mb-2\",attrs:{\"id\":\"client_space_logos_carousel\"}},_vm._l((_vm.logos),function(logo){return _c('div',{key:logo.path,staticClass:\"slide d-inline-block\"},[_c('img',{staticClass:\"builtin-logo logo c-pointer m-1\",class:{'selected': logo.selected },attrs:{\"title\":logo.name+' (Click to '+(logo.selected ? 'un' : '')+'select)',\"src\":logo.path,\"width\":\"50\",\"height\":\"50\"},on:{\"click\":function($event){return _vm.select_logo(logo)}}})])}),0),(_vm.space !== null && _vm.custom_logo_url)?_c('div',[_c('span',{staticClass:\"text-sm mr-2\"},[_vm._v(\"Custom logo:\")]),_c('img',{staticClass:\"shadow-z5 thumb64 rounded fit-cover\",attrs:{\"src\":_vm.custom_logo_url}}),_c('button',{staticClass:\"btn btn-sm btn-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.custom_logo_url = null}}},[_vm._v(\"Clear\")])]):_c('div',[(!_vm.custom_logo_url)?_c('span',{staticClass:\"text-sm mr-2\"},[_vm._v(\"Or upload custom image:\")]):_vm._e(),_c('profile-image-selector',{staticClass:\"d-inline-block\",attrs:{\"max_dimension_px\":128,\"avatar_changed\":(avatar_url) => { _vm.custom_logo_url = avatar_url; _vm.logos.forEach(logo => { logo.selected = false }) }}})],1)]):_vm._e(),_c('div',{staticClass:\"mobile-form-field\"},[_c('div',{staticClass:\"text-bold\"},[_vm._v(\"Client role\"),(_vm.batch_mode)?_c('span',[_c('small',[_vm._v(\"(applies to all spaces)\")])]):_vm._e()]),_c('button',{staticClass:\"btn fw mb-2 btn-sm text-sm client-role-button\",class:{'btn-success': !_vm.form.client_readonly, 'btn-secondary': _vm.form.client_readonly},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form.client_readonly=false}}},[_c('b',[_vm._v(\"Upload, download and delete\")]),_c('div',{staticClass:\"break-word d-block\"},[_vm._v(\"The client can upload, download & delete files and change the folder structure.\")])]),_c('button',{staticClass:\"btn fw btn-sm text-sm client-role-button\",class:{'btn-primary': _vm.form.client_readonly, 'btn-secondary': !_vm.form.client_readonly},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form.client_readonly=true}}},[_c('b',[_vm._v(\"Download only\")]),_c('br'),_vm._v(\" The client cannot change anything or upload new files, just browse and download. \")])]),_c('div',{staticClass:\"mobile-form-field d-block\"},[_c('div',{staticClass:\"text-bold\"},[_vm._v(\" Space Managers \"),_c('span',{staticClass:\"text-normal ml-2\",class:{'text-danger': _vm.members.filter(m => { return m.selected }).length === 0 }},[_c('i',{staticClass:\"text-sm\"},[_vm._v(_vm._s(_vm.members.filter(m => { return m.selected }).length)+\" selected\")])])]),_c('div',{staticClass:\"fw\"},_vm._l((_vm.members),function(member){return _c('div',{key:member.user_id,staticClass:\"member-box m-1 d-inline-block\",class:{'bg-info text-white active text-bold': member.selected},on:{\"click\":function($event){member.selected = !member.selected}}},[_c('user-box',{staticClass:\"m-1 ml-2 mr-2\",attrs:{\"team\":_vm.team,\"user-id\":member.user_id,\"no-prefix\":true,\"title\":'Click to '+(member.selected ? 'remove' : 'add')+' ' + member.name}})],1)}),0)]),_c('div',{staticClass:\"mobile-form-field\"},[_c('div',{staticClass:\"text-bold\"},[_vm._v(\"Notifications\")]),_c('div',{staticClass:\"fw\"},[_c('span',{staticClass:\"d-block text-sm mb-2\"},[_vm._v(\"Get email notifications when the Client uploads new files\")]),_c('button',{staticClass:\"btn text-bold btn-sm text-sm mr-1\",class:{'btn-success': _vm.form.watch_managers, 'btn-secondary': !_vm.form.watch_managers},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form.watch_managers = true}}},[_vm._v(\"Yes \"),_c('i',{staticClass:\"ion-android-notifications ml-2\"})]),_c('button',{staticClass:\"btn text-bold btn-sm text-sm\",class:{'btn-secondary btn-gradient': !_vm.form.watch_managers, 'btn-secondary': _vm.form.watch_managers},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form.watch_managers = false}}},[_vm._v(\"No \"),_c('i',{staticClass:\"ion-android-notifications-off ml-2\"})])])]),_c('div',{staticClass:\"fw d-flex align-items-center justify-content-center mt-3\"},[_c('button',{staticClass:\"btn btn-secondary mr-1\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.closeDialog()}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-info btn-gradient ml-1\",attrs:{\"type\":\"submit\",\"disabled\":_vm.form_loading || !_vm.is_submit_allowed}},[(_vm.form.id !== null)?_c('span',[_vm._v(\"Update Space\"),(_vm.form_loading)?_c('i',{staticClass:\"ml-1 ion-load-c spin\"}):_vm._e()]):(!_vm.batch_mode)?_c('span',[_vm._v(\"Create Space\"),(_vm.form_loading)?_c('i',{staticClass:\"ml-1 ion-load-c spin\"}):_vm._e()]):_vm._e()])])]):_vm._e()]),(_vm.form === null && _vm.new_space !== null)?_c('div',[_c('div',{staticClass:\"alert alert-success\"},[_c('p',[_c('b',[_vm._v(\"Invitation sent to \"+_vm._s(_vm.new_space.client_email))])]),_vm._v(\" You will receive an email when \"),_c('b',[_vm._v(_vm._s(_vm.new_space.client_name))]),_vm._v(\" joins the Space or when the invitation expires. \")]),_c('div',{staticClass:\"fw text-center\"},[_c('button',{staticClass:\"btn btn-secondary mr-1\",on:{\"click\":()=>{ _vm.closeDialog() }}},[_vm._v(\"Close\")]),_c('a',{staticClass:\"btn btn-primary ml-1\",attrs:{\"href\":_vm._f(\"client_space_link\")(_vm.new_space.key),\"target\":\"_BLANK\"},on:{\"click\":() => { _vm.closeDialog() }}},[_vm._v(\"Open Space \"),_c('i',{staticClass:\"ion-share ml-1\"})])])]):_vm._e(),(_vm.form === null && _vm.batch_result !== null)?_c('div',[_c('h5',{staticClass:\"text-center mb-3\"},[_c('b',[_vm._v(_vm._s(_vm.batch_result.filter(client => { return client.space_saved }).length)+\" out of \"+_vm._s(_vm.parsed_contacts.length))]),_vm._v(\" Client Spaces created successfully. \")]),_c('div',{staticStyle:{\"max-height\":\"300px\",\"overflow-y\":\"auto\"}},[_c('table',{staticClass:\"table table-sm\"},[_vm._m(2),_c('tbody',_vm._l((_vm.batch_result),function(space,index){return _c('tr',{key:index},[_c('td',[_vm._v(_vm._s(index+1)+\".\")]),_c('td',[_vm._v(\" \"+_vm._s(space.client_name)+\" \")]),_c('td',[_vm._v(\" \"+_vm._s(space.client_email)+\" \")]),_c('td',{staticClass:\"text-center\"},[(space.space_saved)?_c('i',{staticClass:\"text-success ion-checkmark-circled\"}):_c('i',{staticClass:\"text-warning ion-alert-circled\"})]),_c('td',{staticClass:\"text-center\"},[(space.email_sent)?_c('i',{staticClass:\"text-success ion-checkmark-circled\"}):_c('i',{staticClass:\"ion-minus-circled text-muted\"})])])}),0)])]),_c('div',{staticClass:\"text-center mt-4\"},[_c('button',{staticClass:\"btn btn-secondary\",on:{\"click\":function($event){return _vm.closeDialog()}}},[_vm._v(\"Close this window\")])])]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('th',{},[_vm._v(\" Outlook contacts\"),_c('br'),_vm._v(\"CSV file \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"mt-2 text-sm d-flex align-items-center justify-content-between\"},[_c('a',{attrs:{\"href\":\"https://support.office.com/en-us/article/export-contacts-from-outlook-10f09abd-643c-4495-bb80-543714eca73f\",\"target\":\"_BLANK\"}},[_c('i',{staticClass:\"ion-share mr-1\"}),_vm._v(\"How to export contacts from Outlook\")]),_c('div',[_c('a',{attrs:{\"href\":\"assets/static/skyflok_client_space_import_simple.csv\",\"title\":\"Download a simple example CSV file\",\"download\":\"skyflok_client_space_import_simple.csv\"}},[_vm._v(\"Example csv 1\")]),_c('a',{staticClass:\"ml-1\",attrs:{\"href\":\"assets/static/outlook_contacts_exported.csv\",\"title\":\"Download an example for Outlook exported contacts\",\"download\":\"outlook_contacts_exported.csv\"}},[_vm._v(\"Example csv 2\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('thead',[_c('th',{staticClass:\"width-0\"}),_c('th',{},[_vm._v(\"Client Name\")]),_c('th',{},[_vm._v(\"E-mail address\")]),_c('th',{staticClass:\"text-center nowrap width-0\"},[_vm._v(\"Space created\")]),_c('th',{staticClass:\"text-center nowrap width-0\"},[_vm._v(\"Invite sent\")])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(!_vm.avatar_url)?_c('span',[_c('input',{staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"file\",\"id\":\"new_profile_photo_input\"},on:{\"change\":_vm.image_changed}})]):_c('span',[_c('img',{staticClass:\"fit-cover img-thumbnail\",class:[_vm.imgclass],staticStyle:{\"max-width\":\"80%\"},attrs:{\"src\":_vm.avatar_url}}),_c('button',{staticClass:\"btn btn-sm btn-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.avatar_url = null}}},[_vm._v(\"Clear\")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n\n
\n \n \n\n
\n \n Clear \n \n\n
\n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./profile-image-selector.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./profile-image-selector.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./profile-image-selector.vue?vue&type=template&id=fb825346\"\nimport script from \"./profile-image-selector.vue?vue&type=script&lang=js\"\nexport * from \"./profile-image-selector.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n \n \n \n \n \n \n
\n \n \n\n \n \n \n Outlook contacts CSV file\n \n \n \n \n Load a new CSV \n \n \n \n \n Clients ({{ parsed_contacts.length }}) \n \n You will see the list of imported clients here after loading a CSV file
\n \n\n
\n \n There is a problem with {{ parsed_contacts.length - valid_batch_clients.length }} out of {{ parsed_contacts.length }} contacts. We cannot create a Space for them unless you fix the problems manually.\n
\n
\n
\n \n \n\n \n \n Client name * \n \n \n \n Client e-mail * \n \n \n\n \n Client logo(applies to all spaces)
\n \n \n
\n
\n
\n
\n\n \n
Custom logo: \n
\n
Clear \n
\n\n \n
Upload custom logo: \n
{ custom_logo_url = avatar_url; logos.forEach(logo => { logo.selected = false }) }\"\n :max_dimension_px=\"128\">\n \n
\n \n \n \n Client role(applies to all spaces)
\n \n \n Upload, download and delete \n The client can upload, download & delete files and change the folder structure.\n \n \n Download only \n The client cannot change anything or upload new files, just browse and download.\n \n \n \n \n \n Space Managers Note that Team Administrators can see and open every Space, but even they cannot upload/download if they are not Space Managers.\">\n (applies to all spaces)
\n { return m.selected }).length === 0 }\">{{ members.filter(m => { return m.selected }).length }} selected
\n \n \n \n \n \n \n
\n \n \n \n Notifications \n \n Yes \n No \n \n Space Managers get an email notification when the Client uploads new files \n \n \n \n \n Cancel \n \n Update Space \n Create Space & Send Invite \n Create {{ valid_batch_clients.length }} Space{{ valid_batch_clients.length === 1 ? '' : 's' }} & Send Invitation{{ valid_batch_clients.length === 1 ? '' : 's' }} \n \n \n \n \n \n
\n\n \n\n \n \n \n \n
\n \n \n\n \n\n \n\n \n\n \n\n \n\n \n Cancel \n \n Update Space \n Create Space \n \n
\n\n \n\n\n \n\n \n \n
\n
Invitation sent to {{ new_space.client_email }}
\n You will receive an email when
{{ new_space.client_name }} joins the Space or when the invitation expires.\n
\n\n
\n\n
\n\n \n \n
\n {{ batch_result.filter(client => { return client.space_saved }).length }} out of {{ parsed_contacts.length }} Client Spaces created successfully.\n \n\n
\n
\n \n \n Client Name \n E-mail address \n Space created \n Invite sent \n \n \n \n {{index+1}}. \n \n {{ space.client_name }}\n \n \n {{ space.client_email }}\n \n \n \n \n \n \n \n \n \n \n \n
\n
\n\n
\n Close this window \n
\n
\n\n \n \n\n\n\n\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./space-form.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./space-form.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./space-form.vue?vue&type=template&id=65ef9f70&scoped=true\"\nimport script from \"./space-form.vue?vue&type=script&lang=js\"\nexport * from \"./space-form.vue?vue&type=script&lang=js\"\nimport style0 from \"./space-form.vue?vue&type=style&index=0&id=65ef9f70&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"65ef9f70\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"fw\"},[_vm._v(\" You can reset the password and send a new invite to \"),_c('b',[_vm._v(_vm._s(_vm.space.client_name))]),_vm._v(\". \"),_vm._m(0),_c('p',{staticClass:\"mb-1\"},[_c('i',{staticClass:\"ion-checkmark mr-2 ml-4\"}),_vm._v(\" A new invite is sent to \"),_c('b',[_vm._v(_vm._s(_vm.space.client_email))])]),_vm._m(1),_c('div',{staticClass:\"mt-3 text-center\"},[_c('button',{staticClass:\"btn btn-primary text-bold\",attrs:{\"disabled\":_vm.loading},on:{\"click\":function($event){return _vm.reset_space_password()}}},[_vm._v(\" Reset password and send new invite \"),(_vm.loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()]),(_vm.error)?_c('div',{staticClass:\"mt-2 text-danger\",domProps:{\"innerHTML\":_vm._s(_vm.error)}}):_vm._e()])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"mt-3 mb-1\"},[_c('i',{staticClass:\"ion-checkmark mr-2 ml-4\"}),_vm._v(\" The current invite (if any) will be invalid immediately \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"mb-1\"},[_c('i',{staticClass:\"ion-checkmark mr-2 ml-4\"}),_vm._v(\" The new link can be used in the next 24 hours \")])\n}]\n\nexport { render, staticRenderFns }","\n \n You can reset the password and send a new invite to {{ space.client_name }} .\n\n \n \n The current invite (if any) will be invalid immediately\n
\n \n \n A new invite is sent to {{ space.client_email }} \n
\n \n \n The new link can be used in the next 24 hours\n
\n\n \n
\n Reset password and send new invite\n \n \n
\n
\n\n \n \n\n\n\n\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./psw-reset.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./psw-reset.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./psw-reset.vue?vue&type=template&id=26624ece&scoped=true\"\nimport script from \"./psw-reset.vue?vue&type=script&lang=js\"\nexport * from \"./psw-reset.vue?vue&type=script&lang=js\"\nimport style0 from \"./psw-reset.vue?vue&type=style&index=0&id=26624ece&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"26624ece\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"fw\"},[_c('div',[_vm._v(\"When a Space is archived:\")]),_vm._m(0),_vm._m(1),_vm._m(2),_vm._m(3),_vm._m(4),_c('div',{staticClass:\"mt-3 fw d-flex justify-content-center\"},[_c('button',{staticClass:\"btn btn-lg btn-warning btn-gradient text-bold mr-1\",attrs:{\"disabled\":_vm.loading},on:{\"click\":function($event){return _vm.archive_space(false)}}},[_vm._v(\" Archive \"),_c('i',{class:{'ion-load-c spin': _vm.action=='archive' && _vm.loading, 'ion-archive': !_vm.loading}})]),_c('button',{staticClass:\"btn btn-lg btn-danger btn-gradient text-bold ml-1\",attrs:{\"disabled\":_vm.loading},on:{\"click\":function($event){return _vm.archive_space(true)}}},[_vm._v(\" Delete \"),_c('i',{class:{'ion-load-c spin': _vm.action=='delete' && _vm.loading, 'ion-trash-b': !_vm.loading}})])]),(_vm.error)?_c('div',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.error))]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"mt-3 mb-1\"},[_c('i',{staticClass:\"ion-checkmark mr-2 ml-4\"}),_vm._v(\" The Client cannot access it any more. \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"mb-1\"},[_c('i',{staticClass:\"ion-checkmark mr-2 ml-4\"}),_vm._v(\" You can open it, but cannot download and upload files or change anything. \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"mb-1\"},[_c('i',{staticClass:\"ion-checkmark mr-2 ml-4\"}),_vm._v(\" Can be re-activated any time, but it might take a few minutes. \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"mb-1\"},[_c('i',{staticClass:\"ion-checkmark mr-2 ml-4\"}),_vm._v(\" Optionally, you can \"),_c('b',[_vm._v(\"delete the Space and files in it after 30 days\")]),_vm._v(\" mandatory time period. \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"mt-2 text-right\"},[_c('a',{attrs:{\"href\":\"#\",\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-content\":\"To protect you and your Clients from malware, ransomware and viruses, SkyFlok doesn't allow deleting data immediately. If you need to delete the Space and its contents sooner, please contact us via email at support@skyflok.com \"}},[_vm._v(\"Can I delete the Space immediately?\")])])\n}]\n\nexport { render, staticRenderFns }","\n \n When a Space is archived:
\n \n \n The Client cannot access it any more.\n
\n \n \n You can open it, but cannot download and upload files or change anything.\n
\n \n \n Can be re-activated any time, but it might take a few minutes.\n
\n \n \n Optionally, you can delete the Space and files in it after 30 days mandatory time period.\n
\n\n \n
If you need to delete the Space and its contents sooner, please contact us via email at
support@skyflok.com \"\n >Can I delete the Space immediately?\n
\n\n \n \n Archive\n \n \n \n Delete\n \n \n
\n {{ error }}
\n\n \n \n\n\n\n\n\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./archive-space.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./archive-space.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./archive-space.vue?vue&type=template&id=5e2c8768&scoped=true\"\nimport script from \"./archive-space.vue?vue&type=script&lang=js\"\nexport * from \"./archive-space.vue?vue&type=script&lang=js\"\nimport style0 from \"./archive-space.vue?vue&type=style&index=0&id=5e2c8768&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5e2c8768\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[_vm._m(0),(_vm.result)?_c('div',{staticClass:\"alert my-2 text-bold\",class:{'alert-success': _vm.result.success, 'alert-danger': _vm.result.error},domProps:{\"innerHTML\":_vm._s(_vm.result.text)}}):_vm._e(),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-5\"},[_vm._m(1),_vm._l((_vm.team),function(user){return _c('button',{key:user.user_id,staticClass:\"btn d-block fw my-2 c-default\",class:{'btn-primary': _vm.selected_user_id === user.user_id, 'btn-outline-primary': _vm.selected_user_id !== user.user_id},on:{\"mouseover\":function($event){_vm.selected_user_id = user.user_id},\"click\":function($event){$event.preventDefault();return (()=>{ return false }).apply(null, arguments)}}},[_c('b',[_vm._v(_vm._s(user.name))]),_vm._v(\" (\"+_vm._s(_vm.spaces ? _vm.spaces.filter(sp => { return sp.members.indexOf(user.user_id) >= 0 }).length : 0)+\") \")])})],2),_c('div',{staticClass:\"col-1\"}),(this.team && this.team.length > 0)?_c('div',{staticClass:\"col-6\"},[_c('div',{staticClass:\"mb-2\"},[_c('b',[_vm._v(\"Active Spaces\")]),_c('div',{staticClass:\"float-right\"},[_c('small',[_vm._v(\" Select \"),_c('a',{attrs:{\"href\":\"#\",\"title\":'Make ' +_vm.selected_user_name+ ' a manager in every active Space'},on:{\"click\":function($event){return _vm.select_all_spaces()}}},[_vm._v(\"all\")]),_vm._v(\" / \"),_c('a',{attrs:{\"href\":\"#\",\"title\":'Remove ' +_vm.selected_user_name+ ' from the managers of every active Space'},on:{\"click\":function($event){return _vm.select_none_spaces()}}},[_vm._v(\"none\")])])])]),_vm._l((_vm.active_spaces),function(space){return _c('button',{key:space.id,staticClass:\"btn d-block fw my-2 text-bold\",class:{\n 'btn-success': _vm.my_space_ids.indexOf(space.id)>=0,\n 'btn-outline-success text-gray': _vm.my_space_ids.indexOf(space.id) < 0,\n },attrs:{\"title\":space.members.indexOf(_vm.selected_user_id) < 0 ? 'Make '+_vm.selected_user_name+' a manager of this space' : 'Remove '+_vm.selected_user_name+' from the managers of this space'},on:{\"click\":function($event){return _vm.space_clicked(space)}}},[_vm._v(\" \"+_vm._s(space.client_name)),(space.loading)?_c('i',{staticClass:\"ml-2 ion-load-c spin\"}):_vm._e()])}),_vm._m(2),_vm._l((_vm.archived_spaces),function(space){return _c('button',{key:space.id,staticClass:\"btn d-block fw my-2 text-italic\",class:{\n 'btn-success': _vm.my_space_ids.indexOf(space.id)>=0,\n 'btn-outline-secondary text-gray': _vm.my_space_ids.indexOf(space.id) < 0,\n },attrs:{\"title\":space.members.indexOf(_vm.selected_user_id) < 0 ? 'Make '+_vm.selected_user_name+' a manager of this space' : 'Remove '+_vm.selected_user_name+' from the managers of this space'},on:{\"click\":function($event){return _vm.space_clicked(space)}}},[_vm._v(\" \"+_vm._s(space.client_name)+\" (archived)\"),(space.loading)?_c('i',{staticClass:\"ml-2 ion-load-c spin\"}):_vm._e()])})],2):_vm._e()]),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12 text-center\"},[_c('button',{staticClass:\"btn btn-secondary btn-gradient\",on:{\"click\":function($event){return _vm.close_modal()}}},[_vm._v(\"Done\")])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert alert-info mb-3 text-bold\"},[_vm._v(\" Select a team member to see which Spaces they are managers of. \"),_c('br'),_vm._v(\" Click a Space to add/remove the selected person. \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"mb-2\"},[_c('b',[_vm._v(\"Team Members\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"mt-4 mb-2\"},[_c('b',[_vm._v(\"Archived Spaces\")])])\n}]\n\nexport { render, staticRenderFns }","\n\n \n Select a team member to see which Spaces they are managers of. \n Click a Space to add/remove the selected person.\n
\n\n
\n\n \n
\n
Team Members
\n\n
{ return false }\"\n >\n {{ user.name }} ({{spaces ? spaces.filter(sp => { return sp.members.indexOf(user.user_id) >= 0 }).length : 0}})\n \n
\n
\n
0\">\n
\n\n
=0,\n 'btn-outline-success text-gray': my_space_ids.indexOf(space.id) < 0,\n }\"\n @click=\"space_clicked(space)\"\n :title=\"space.members.indexOf(selected_user_id) < 0 ? 'Make '+selected_user_name+' a manager of this space' : 'Remove '+selected_user_name+' from the managers of this space'\"\n >\n {{ space.client_name }} \n \n\n\n
Archived Spaces
\n
=0,\n 'btn-outline-secondary text-gray': my_space_ids.indexOf(space.id) < 0,\n }\"\n @click=\"space_clicked(space)\"\n :title=\"space.members.indexOf(selected_user_id) < 0 ? 'Make '+selected_user_name+' a manager of this space' : 'Remove '+selected_user_name+' from the managers of this space'\"\n >\n {{ space.client_name }} (archived) \n \n\n
\n
\n \n \n \n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./edit-managers.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./edit-managers.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./edit-managers.vue?vue&type=template&id=2e152bab\"\nimport script from \"./edit-managers.vue?vue&type=script&lang=js\"\nexport * from \"./edit-managers.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',{staticClass:\"nowrap\"},[_vm._v(\" \"+_vm._s(_vm._f(\"timestamp_rel\")(_vm.timestamp))),_c('i',{staticClass:\"ion-calendar text-muted ml-2\",attrs:{\"title\":_vm._f(\"timestamp\")(_vm.timestamp)}})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n {{ timestamp | timestamp_rel }} \n \n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./timestamp.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./timestamp.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./timestamp.vue?vue&type=template&id=0e34da99\"\nimport script from \"./timestamp.vue?vue&type=script&lang=js\"\nexport * from \"./timestamp.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[(_vm.success)?_c('div',{staticClass:\"alert alert-success\"},[_vm._v(_vm._s(_vm.success))]):_vm._e(),(_vm.error)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.error))]):_vm._e(),(!_vm.codes)?_c('section',{staticClass:\"fw text-center\"},[_vm._v(\" Loading... \"),_c('i',{staticClass:\"ion-load-c spin ml-1\"})]):_c('section',[(!_vm.space_id)?_c('div',{staticClass:\"alert alert-info\"},[_c('p',[_vm._v(\"If you lose your phone, the only way to login is using one of these backup code. Keep them as secure as your password! \")]),_vm._v(\" It's highly recommended to store them in a trusted password manager like \"),_c('a',{staticClass:\"text-bold\",attrs:{\"href\":\"https://lastpass.com\",\"target\":\"_BLANK\"}},[_vm._v(\"LastPass\")]),_vm._v(\", \"),_c('a',{staticClass:\"text-bold\",attrs:{\"href\":\"https://1password.com\",\"target\":\"_BLANK\"}},[_vm._v(\"1Password\")]),_vm._v(\" or \"),_c('a',{staticClass:\"text-bold\",attrs:{\"href\":\"https://keepersecurity.com\",\"target\":\"_BLANK\"}},[_vm._v(\"Keeper\")]),_vm._v(\". \")]):_vm._e(),_c('div',{staticClass:\"text-bold my-2 text-center\"},[_c('span',{class:{'text-warning': _vm.few_codes, 'text-success': !_vm.few_codes}},[(_vm.few_codes)?_c('i',{staticClass:\"ion-alert-circled mr-1\"}):_vm._e(),_vm._v(\" \"+_vm._s(_vm.client_name ? _vm.client_name : 'You')+\" \"+_vm._s(_vm.few_codes ? 'only ' : '')+_vm._s(_vm.client_name ? 'has' : 'have')+\" \"+_vm._s(_vm.codes.length)+\" backup codes \"),(!_vm.few_codes)?_c('i',{staticClass:\"ion-checkmark-circled ml-1\"}):_vm._e()]),(_vm.few_codes)?_c('span',{staticClass:\"ml-4\"},[_c('button',{staticClass:\"btn btn-gradient btn-secondary\",attrs:{\"disabled\":_vm.generate_loading},on:{\"click\":function($event){return _vm.generate_additional_codes()}}},[_vm._v(\" Generate more codes \"),(_vm.generate_loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])]):_vm._e()]),_c('div',{staticClass:\"row codes\"},_vm._l((_vm.codes),function(code){return _c('div',{key:code,staticClass:\"col-6 col-lg-4 text-center\"},[_vm._v(\" \"+_vm._s(code)+\" \")])}),0),(_vm.codes && _vm.codes.length)?_c('div',{staticClass:\"mt-2 row\"},[_c('div',{staticClass:\"col-6 text-right\"},[_c('button',{staticClass:\"btn btn-primary\",on:{\"click\":function($event){return _vm.copy_codes()}}},[_c('i',{staticClass:\"ion-clipboard mr-2\"}),_vm._v(\"Copy \")])]),_c('div',{staticClass:\"col-6 text-left\"},[_c('button',{staticClass:\"btn btn-primary\",on:{\"click\":function($event){return _vm.download_codes()}}},[_c('i',{staticClass:\"ion-arrow-down-a mr-2\"}),_vm._v(\"Save \")])])]):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n {{success}}
\n {{error}}
\n\n \n \n \n
If you lose your phone, the only way to login is using one of these backup code. Keep them as secure as your password!
\n It's highly recommended to store them in a trusted password manager like \n
LastPass , \n
1Password or\n
Keeper .\n
\n\n\n \n \n \n \n {{ client_name ? client_name : 'You' }} {{ few_codes ? 'only ' : '' }}{{ client_name ? 'has' : 'have' }} {{codes.length}} backup codes\n \n \n \n \n Generate more codes\n \n \n \n \n
\n\n \n\n \n
\n \n Copy\n \n
\n
\n \n Save\n \n
\n
\n\n \n \n \n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./recovery_codes.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./recovery_codes.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./recovery_codes.vue?vue&type=template&id=6a74a8cc&scoped=true\"\nimport script from \"./recovery_codes.vue?vue&type=script&lang=js\"\nexport * from \"./recovery_codes.vue?vue&type=script&lang=js\"\nimport style0 from \"./recovery_codes.vue?vue&type=style&index=0&id=6a74a8cc&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6a74a8cc\",\n null\n \n)\n\nexport default component.exports","\n\n\n \n
\n\n\n \n
\n
\n
\n
\n
\n Client Spaces are secure, confidential shared folders between you and your clients, where\n both of you can upload and download files.\n It's a simple but very secure alternative of emailing files to each other , and you don't even need to\n make your clients Team Members.\n
\n
\n
\n
\n\n
\n\n
\n \n
Active Spaces \n
\n ({{active_spaces_num}}= active_spaces_limit\"> out of {{ active_spaces_limit }}= active_spaces_limit\" class=\"ml-1 icon ion-alert-circled text-warning\" title=\"You reached the limit of active Client Spaces. Upgrade your Team to use more Spaces!\"> )\n \n \n
\n\n \n \n
\n \n Grid \n \n \n Table \n \n
\n\n
\n Edit Managers \n \n\n \n
= active_spaces_limit\" :title=\"(active_spaces_limit && active_spaces.length >= active_spaces_limit) ? 'Upgrade your Team for more active Client Spaces!' : ''\">\n Create Space \n \n
\n \n\n
0 && view_mode === 'grid'\">\n
{ edit_space(space) }\"\n :watch_clicked=\"() => { change_watch(space) }\"\n :reload_spaces_callback=\"() => { load_spaces() }\"\n @open_dialog=\"(dialog_id) => { open_dialog(dialog_id, space) }\"\n >\n \n\n
\n
\n\n
0 && view_mode === 'table'\">\n
\n\n \n
0 && !dismiss_expired_invites_alert\">\n
\n
\n There {{ active_spaces_with_expired_invite.length === 1 ? 'is' : 'are' }} {{ active_spaces_with_expired_invite.length }} space{{ active_spaces_with_expired_invite.length === 1 ? '' : 's' }} with expired invite!\n
Show \n
\n
\n
\n
\n\n
\n\n \n
\n\n
\n Client Name \n \n
\n\n
\n E-mail address \n \n
\n\n \n\n
\n Client Joined \n table_filter.joined_yes=newval\"/>\n table_filter.joined_no=newval\"/>\n
\n\n
\n Invite Sent \n table_filter.invite_sent_yes=newval\"/>\n table_filter.invite_sent_no=newval\"/>\n
\n\n
\n Invite Expired \n table_filter.invite_expired_yes=newval\"/>\n table_filter.invite_expired_no=newval\"/>\n
\n\n
\n Client Role \n table_filter.role_full_control=newval\"/>\n table_filter.role_readonly=newval\"/>\n
\n\n
\n Two-Factor Auth \n table_filter.mfa_enabled_yes=newval\"/>\n table_filter.mfa_enabled_no=newval\"/>\n
\n\n\n
\n Files \n table_filter.files_empty=newval\"/>\n table_filter.files_not_empty=newval\"/>\n
\n\n
\n\n
\n Showing {{ active_spaces_filtered.length }} of {{ active_spaces.length }} spaces \n
\n\n \n
0\" class=\"card card-info text-white d-inline-block p-3\">\n
\n\n
\n\n Re-send Invite\n ({{(checked_spaces_no_password.length)}}/{{checked_spaces.length}}) \n \n \n \n\n \n\n
\n Export to CSV\n \n \n\n\n
\n\n
0 }\">\n \n \n \n table_check_all = newval\" />\n \n \n\n \n Client Name \n E-mail Address \n \n Watch \n \n Joined \n \n RoleDownload : Download files but no uploading or deleting anythingFull : Upload, download, delete, etc\">\n \n \n \n 2FA \n \n \n Files \n Managers \n Created \n \n \n \n \n { /* Multiselect return false; space.checked = !space.checked */ 0}\"\n :class=\"{'checked': space.checked}\">\n \n \n table_check_all = space.checked\" />\n \n\n \n \n \n \n \n
\n {{ space.client_name.split(' ').map(frag => frag.length > 0 ? frag[0].toUpperCase() : '').splice(0,3).join('') }}\n
\n
\n \n \n \n \n \n \n \n \n when the client uploads a file'\"\n >\n \n \n \n \n \n Yes\n \n \n Invite not sent \n \n Send invite\n \n \n \n \n Expired! \n \n Send invite\n \n \n \n \n Invite sent \n \n \n Re-send invite?\n \n \n \n \n \n \n Download \n Full \n \n \n \n Yes\n \n No \n \n \n \n Empty \n \n {{ space.ns_stats.active_files }}\n \n \n \n 1\">{{ space.members.length }} managers \n \n \n \n \n \n \n \n \n {return false; space.checked = !space.checked}\">\n Open \n \n \n \n \n { return false; space.checked = !space.checked}\">\n \n \n
\n \n \n \n
\n\n
\n\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
Create Client Space
\n
\n
\n
\n
\n\n \n
0\">\n
Archived Spaces ({{archived_spaces.length}}) {{ show_archived ? 'Hide' : 'Show' }} \n
\n = active_spaces_limit\"\n :activateclicked=\"(space) => { activate_space(space) }\"\n />\n
\n
\n\n
\n\n \n
\n
\n\n\n\n\n\n
\n
\n \n
\n
{ on_space_updated(space_id)}\"\n />\n\n \n
\n
\n
\n\n\n
\n
\n \n
\n Disable access\n
\n
\n
\n
\n\n\n\n\n
\n
\n \n
\n { password_reset_space.invite_expires = updated_space.invite_expires; password_reset_space.password_set = updated_space.password_set; password_reset_space.invite_code = updated_space.invite_code; init_space(password_reset_space) }\"\n :close_modal=\"() => { close_modal('reset_password_modal'); }\"\n >\n \n
\n
\n
\n
\n\n\n
\n
\n \n
\n { close_modal('edit_managers_modal') }\">\n \n
\n
\n
\n
\n\n\n \n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client_spaces.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client_spaces.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./client_spaces.vue?vue&type=template&id=45719eac&scoped=true\"\nimport script from \"./client_spaces.vue?vue&type=script&lang=js\"\nexport * from \"./client_spaces.vue?vue&type=script&lang=js\"\nimport style0 from \"./client_spaces.vue?vue&type=style&index=0&id=45719eac&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"45719eac\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\"},[_c('div',{staticClass:\"container-overlap bg-gradient-info text-center\"},[(_vm.user)?_c('div',{staticClass:\"mb-3 text-center\"},[_c('img',{staticClass:\"wd-sm rounded-circle img-thumbnail fit-cover\",staticStyle:{\"height\":\"150px\"},attrs:{\"src\":_vm.avatar_url(_vm.user),\"alt\":\"user\"}}),_c('a',{staticClass:\"text-white text-sm\",staticStyle:{\"display\":\"block\",\"margin-top\":\"-2em\"},attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.change_image()}}},[_vm._v(\"Change\")])]):_vm._e(),(_vm.user)?_c('div',{staticClass:\"text-white\"},[_c('div',{staticClass:\"h3\"},[_vm._v(_vm._s(_vm.user.name))])]):_vm._e()]),_c('div',{staticClass:\"container container-md\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_c('div',{staticClass:\"col-12 col-lg-8 cardbox\"},[_c('h5',{staticClass:\"cardbox-heading pb-0\"},[_vm._v(\"Profile \"),_c('a',{staticClass:\"btn btn-sm btn-secondary float-right\",on:{\"click\":function($event){_vm.edit_mode=true}}},[_c('i',{staticClass:\"ion-edit text-grey mr-2\"}),_vm._v(\"Edit\")])]),_c('div',{staticClass:\"cardbox-body\"},[_c('edit-user-form',{attrs:{\"user\":_vm.user,\"close-form\":_vm.closeForm,\"edit-mode\":_vm.edit_mode,\"browse-image\":_vm.browse_image}})],1),_c('h5',{staticClass:\"cardbox-heading pb-0\"},[_vm._v(\" Two-Factor Authentication \"),(_vm.mfa_status && _vm.mfa_status.has_2fa && _vm.mfa_content == 'status')?_c('div',{staticClass:\"float-right dropdown btn-group\"},[_vm._m(0),_c('div',{staticClass:\"dropdown-menu dropdown-menu-right\",attrs:{\"role\":\"menu\"}},[_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'show_qr' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-lock-combination mr-2\"}),_vm._v(\" Set up a new phone or app\")]),_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'recovery_codes' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-help-buoy mr-2\"}),_vm._v(\" Show my backup codes\")]),_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'history' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-calendar mr-2\"}),_vm._v(\" Event Log\")]),_c('div',{staticClass:\"dropdown-divider\"}),_c('a',{staticClass:\"dropdown-item text-danger\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'lost_phone' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-alert-circled mr-2\"}),_vm._v(\" I lost my phone\")]),_c('a',{staticClass:\"dropdown-item text-danger\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'delete' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-trash-a mr-2\"}),_vm._v(\" Disable two factor auth\")])])]):_vm._e(),(_vm.mfa_content=='show_qr')?_c('button',{staticClass:\"btn btn-secondary btn-sm float-right\",on:{\"click\":function($event){_vm.mfa_content = 'status'}}},[_c('i',{staticClass:\"ion-close-round text-grey mr-2\"}),_vm._v(\"Cancel\")]):_vm._e()]),_c('div',{staticClass:\"cardbox-body\"},[_c('mfa',{attrs:{\"user_email\":_vm.user ? _vm.user.email_address : false,\"mfa_content\":_vm.mfa_content},on:{\"mfa_status_loaded\":(status) => { _vm.mfa_status = status },\"mfa_content_change\":(new_content) => { _vm.mfa_content = new_content }}})],1)])])]),_c('div',{staticClass:\"container container-lg\"},[_c('h3',{staticClass:\"mb-3\"},[_vm._v(\"Active Sessions \"),_c('i',{staticClass:\"ion-refresh text-muted\",class:{'spin': _vm.sessions_loading},staticStyle:{\"font-size\":\".6em\",\"cursor\":\"pointer\"},on:{\"click\":function($event){return _vm.load_sessions()}}})]),_c('div',{staticClass:\"row\"},_vm._l((_vm.sessions),function(session){return _c('div',{key:session.id,staticClass:\"col-sm-4\",attrs:{\"data-session-id\":session.id,\"data-device-id\":session.device_id}},[_c('div',{staticClass:\"cardbox\",class:{'text-success border-l-4': session.is_current}},[_c('div',{staticClass:\"cardbox-body\"},[_c('div',{staticClass:\"d-flex justify-content-start align-items-center\"},[_c('div',{staticClass:\"wd-xxs\"},[_c('img',{attrs:{\"src\":_vm.get_browser_logo_img(session.client_name),\"width\":\"60\"}})]),_c('div',{staticClass:\"ml-3\"},[_c('p',{staticClass:\"lead mb-0\",staticStyle:{\"display\":\"inline-block\"}},[_c('span',{staticStyle:{\"text-transform\":\"capitalize\"}},[_vm._v(_vm._s(session.client_name))])]),(session.is_current)?_c('small',{staticClass:\"ml-2\"},[_vm._v(\"(this session)\")]):_vm._e(),_c('div',{staticClass:\"text-muted\"},[(session.geo_country)?_c('img',{staticClass:\"mr-2\",attrs:{\"src\":_vm.get_flag_img(session.geo_country)}}):_vm._e(),(session.location_str)?_c('span',[_vm._v(_vm._s(session.location_str))]):_c('span',[_c('i',[_vm._v(\"Unknown location\")])])]),_c('div',{staticClass:\"text-muted\"},[_vm._v(\"Last used \"+_vm._s(_vm._f(\"timestamp_rel\")(session.last_used))),_c('i',{staticClass:\"ion-calendar ml-1 text-muted\",staticStyle:{\"cursor\":\"help\"},attrs:{\"title\":_vm._f(\"timestamp\")(session.issue_timestamp)}})])]),_c('div',{staticClass:\"ml-auto\"},[_c('a',{staticClass:\"text-muted\",attrs:{\"href\":\"#\",\"title\":\"Kill this session\"},on:{\"click\":function($event){return _vm.kill_session(session)}}},[_c('i',{staticClass:\"ion-close-round\"})])])])])])])}),0)])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('button',{staticClass:\"btn btn-secondary btn-sm\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"type\":\"button\",\"data-toggle\":\"dropdown\",\"aria-expanded\":\"false\"}},[_c('i',{staticClass:\"ion-gear-b text-grey mr-2\"}),_vm._v(\" Options \")])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',[(_vm.error)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.error))]):_vm._e(),(_vm.success)?_c('div',{staticClass:\"alert alert-success\"},[_vm._v(_vm._s(_vm.success))]):_vm._e(),_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_form.apply(null, arguments)}}},[_c('table',{staticClass:\"table mb-0 settings-table\",class:{'': !_vm.editMode}},[(_vm.user && _vm.form)?_c('tbody',[_c('tr',[_c('th',{staticClass:\"width-50p\"},[_vm._v(\"Name: \")]),_c('td',[(!_vm.editMode)?_c('div',[_vm._v(_vm._s(_vm.user.name))]):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.name),expression:\"form.name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"id\":\"user_name_input\"},domProps:{\"value\":(_vm.form.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"name\", $event.target.value)}}})])]),_c('tr',[_c('th',[_vm._v(\"Job title: \")]),_c('td',[(!_vm.editMode)?_c('div',[_vm._v(_vm._s(_vm.user.job_title || '-'))]):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.job_title),expression:\"form.job_title\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"placeholder\":\"E.g. CTO, software engineer, marketing trainee\"},domProps:{\"value\":(_vm.form.job_title)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"job_title\", $event.target.value)}}})])]),(_vm.editMode)?_c('tr',[_c('th',[_vm._v(\"New profile picture:\")]),_c('td',[_c('profile-image-selector',{attrs:{\"avatar_changed\":(avatar_url) => { _vm.form.avatar_url = avatar_url },\"imgclass\":'wd-sm rounded-circlewd-sm rounded-circle'}})],1)]):_vm._e(),_c('tr',[_c('th',[_vm._v(\"E-mail address: \")]),_c('td',[_vm._v(\" \"+_vm._s(_vm.user.email_address)+\" \"),_c('div',[(_vm.editMode)?_c('small',[_c('i',[_vm._v(_vm._s(_vm.isAdmin ? \"Cannot change the email address\" : \"You can't change your email address\"))])]):_vm._e()])])]),(!_vm.editMode || !_vm.psw_change)?_c('tr',[_c('th',{staticStyle:{\"vertical-align\":\"middle\"}},[_vm._v(\"Password: \")]),_c('td',[(_vm.editMode)?_c('button',{staticClass:\"btn btn-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.psw_change=true}}},[_vm._v(_vm._s(_vm.isAdmin === true ? \"Change password of \" + _vm.user.name : \"I want to change my password\"))]):_c('div',_vm._l(([1,2,3,4,5]),function(i){return _c('i',{key:i,staticClass:\"ion-asterisk text-muted mr-1 text-sm\"})}),0)])]):_vm._e(),(_vm.editMode && _vm.psw_change && !_vm.isAdmin)?_c('tr',[_c('th',[_vm._v(\"Current password:\")]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.current_psw),expression:\"form.current_psw\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"password\",\"id\":\"current_password_input\"},domProps:{\"value\":(_vm.form.current_psw)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"current_psw\", $event.target.value)}}})])]):_vm._e(),(_vm.editMode && _vm.psw_change)?_c('tr',[_c('th',[_vm._v(\"New password: \")]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.new_password),expression:\"form.new_password\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"password\"},domProps:{\"value\":(_vm.form.new_password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"new_password\", $event.target.value)}}}),_c('small',{staticStyle:{\"font-size\":\"75%\"}},[_vm._v(\"At least 8 characters, add numbers and symbols for more safety\")])])]):_vm._e(),(_vm.editMode && _vm.psw_change)?_c('tr',[_c('th',[_vm._v(\"Repeat new password:\")]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.new_password_2),expression:\"form.new_password_2\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"password\"},domProps:{\"value\":(_vm.form.new_password_2)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"new_password_2\", $event.target.value)}}})])]):_vm._e(),(!_vm.editMode)?_c('tr',[_c('th',[_vm._v(\"Registered at:\")]),_c('td',[_vm._v(_vm._s(_vm._f(\"timestamp\")(_vm.user.created))+\" \"),_c('small',[_vm._v(\"(\"+_vm._s(_vm._f(\"timestamp_rel\")(_vm.user.created))+\")\")])])]):_vm._e(),(_vm.editMode)?_c('tr',[_c('td',{staticClass:\"text-center\",staticStyle:{\"border-top\":\"none\"},attrs:{\"colspan\":\"2\"}},[_c('div',[_c('button',{staticClass:\"btn btn-secondary mr-2\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.closeForm()}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-info btn-gradient\",attrs:{\"type\":\"submit\",\"disabled\":_vm.form_loading}},[_vm._v(\"Save\"),(_vm.form_loading)?_c('i',{staticClass:\"ml-2 ion-load-c spin\"}):_vm._e()])])])]):_vm._e()]):_vm._e()])]),(_vm.editMode && _vm.user.team_settings)?_c('div',[_vm._m(0),_c('hr'),_c('div',{staticStyle:{\"width\":\"90%\",\"margin\":\"0px auto\"}},[_c('small',[_vm._v(\" Deleting your account is a permanent operation that cannot be reversed. \"),_c('br'),_vm._v(\" Your SkyFlok account and all your personal information is deleted and you won't be able to log in any more. You lose access to every file too.\"),_c('br'),_vm._v(\" Your past actions are kept in the system until the SkyFlok Team of \"+_vm._s(_vm.user.team_settings.name)+\" exists, but your name and photo are replaced by '\"),_c('i',[_vm._v(\"a deleted member\")]),_vm._v(\"' \")])]),_c('div',{staticClass:\"text-center mt-2\"},[_c('button',{staticClass:\"btn btn-danger btn-gradient\",attrs:{\"disabled\":_vm.delete_loading},on:{\"click\":function($event){return _vm.delete_my_account()}}},[_vm._v(\"I understand, delete my SkyFlok account\"),(_vm.delete_loading)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):_vm._e()]),(_vm.delete_error)?_c('div',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.delete_error))]):_vm._e()])]):_vm._e()])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"text-info text-center mt-1\"},[_c('small',[_c('i',{staticClass:\"ion-information-circled text-info mr-1\"}),_vm._v(\" Do you have questions or requests about privacy, how your personal information is handled or what happened to files you uploaded? Would you like to get a copy of all your personal data? \"),_c('br'),_vm._v(\" We are happy to help! Contact us at \"),_c('a',{attrs:{\"href\":\"mailto:SkyFlok Support\"}},[_vm._v(\"support@skyflok.com\")]),_vm._v(\"! \")])])\n}]\n\nexport { render, staticRenderFns }","\n\n
{{ error }}
\n
{{ success }}
\n
\n \n \n\n
\n
\n
\n \n Do you have questions or requests about privacy, how your personal information is handled or what happened to\n files you uploaded? Would you like to get a copy of all your personal data? \n We are happy to help! Contact us at \">support@skyflok.com !\n \n
\n
\n
\n \n Deleting your account is a permanent operation that cannot be reversed. \n Your SkyFlok account and all your personal information is deleted and you won't be able to log in any more. You lose access to every file too. \n Your past actions are kept in the system until the SkyFlok Team of {{ user.team_settings.name }} exists, but your name and photo are replaced by 'a deleted member '\n \n
\n
\n
I understand, delete my SkyFlok account \n
{{ delete_error }}
\n
\n
\n
\n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./edit-user-form.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./edit-user-form.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./edit-user-form.vue?vue&type=template&id=18b37b5f&scoped=true\"\nimport script from \"./edit-user-form.vue?vue&type=script&lang=js\"\nexport * from \"./edit-user-form.vue?vue&type=script&lang=js\"\nimport style0 from \"./edit-user-form.vue?vue&type=style&index=0&id=18b37b5f&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"18b37b5f\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.mfa_content=='status')?_c('section',{staticClass:\"fw text-center my-2\"},[(_vm.mfa_status)?_c('div',[(_vm.mfa_status.has_2fa && _vm.mfa_status.verified)?_c('section',{staticClass:\"text-success\",class:{'text-14': _vm.is_client_space}},[_c('i',{staticClass:\"ion-locked mr-2\"}),_vm._v(\" Enabled, using \"+_vm._s(_vm.mfa_status.kind == 1 ? \"mobile authenticator app\" : \"SMS\")+\" \")]):(_vm.mfa_status.has_2fa && !_vm.mfa_status.verified)?_c('section',{staticClass:\"text-warning\"},[_c('i',{staticClass:\"ion-alert-circled mr-1\"}),_vm._v(\" Enabled using \"+_vm._s(_vm.mfa_status.kind == 1 ? \"mobile authenticator app\" : \"SMS\")+\", but not verified! \"),_c('br'),_c('a',{staticClass:\"ml-1\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.$emit('mfa_content_change', _vm.mfa_status.kind == 1 ? 'show_qr' : 'change_phone_number') }).apply(null, arguments)}}},[_vm._v(\"Verify now\")])]):_c('section',[_vm._v(\" Your account is not protected by two factor authentication. \"),_c('button',{staticClass:\"btn btn-success mt-3\",on:{\"click\":() => { _vm.$emit('mfa_content_change', 'setup'); _vm.setup_mfa_step = 1 }}},[_c('i',{staticClass:\"ion-locked mr-2\"}),_vm._v(\"Enable Two-Factor Authentication \")])])]):_c('div',[_vm._v(\" Loading... \"),_c('i',{staticClass:\"ion-load-c spin ml-1\"})])]):(_vm.mfa_content == 'setup')?_c('div',{staticClass:\"fw text-center\"},[(_vm.setup_mfa_step == 1)?_c('section',[_c('div',{staticClass:\"alert alert-secondary\"},[_vm._v(\" You can use either an Authenticator app on your phone, or SMS to receive one time passcodes when you are logging in from a new device or browser. This significantly improves security of your account. \")]),_c('div',{staticClass:\"fw d-flex justify-content-center mt-3\"},[_c('div',{staticClass:\"mr-1\"},[_c('button',{staticClass:\"btn btn-success\",on:{\"click\":function($event){_vm.setup_mfa_step='app'}}},[_vm._v(\"Use an app on your phone\")]),_c('br'),_vm._m(0)]),_c('div',{staticClass:\"ml-1\"},[_c('button',{staticClass:\"btn\",attrs:{\"disabled\":true,\"title\":\"Coming soon\"},on:{\"click\":function($event){_vm.setup_mfa_step='sms'}}},[_vm._v(\"Receive codes in SMS\")])])])]):(_vm.setup_mfa_step=='app')?_c('mfa-setup-app',{attrs:{\"user_email\":_vm.email_address,\"show_error\":_vm.error},on:{\"completed\":()=>{ _vm.mfa_setup_ready() }}}):(_vm.setup_mfa_step == 'sms')?_c('section',{staticClass:\"my-3\"},[_vm._v(\" Two factor authentication with SMS is not supported yet \")]):_vm._e()],1):(_vm.mfa_content == 'delete')?_c('div',[_c('mfa-disable',{attrs:{\"show_success\":_vm.success,\"hash_password\":_vm.is_client_space === undefined ? false : _vm.is_client_space},on:{\"disabled\":()=>{ _vm.mfa_disabled() },\"cancelled\":()=>{ _vm.$emit('mfa_content_change', 'status') }}})],1):(_vm.mfa_content == 'lost_phone')?_c('div',{staticClass:\"mt-2\"},[_c('div',{staticClass:\"alert alert-secondary\"},[_c('p',[_vm._v(\" If you lost the phone that was set up for \"+_vm._s(_vm.mfa_status.kind == 1 ? \"generating codes\" : \"receiving codes in SMS\")+\", do the following: \")]),_c('ol',{staticClass:\"lost_phone_instructions\"},[_c('li',[_vm._v(\"First \"),_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.$emit('mfa_content_change', 'delete') }).apply(null, arguments)}}},[_vm._v(\"disable two-factor authentication\")]),_vm._v(\" so the lost phone won't be able to \"+_vm._s(_vm.mfa_status.kind == 1 ? \"generate codes\" : \"receive codes\")+\" for your account\")]),_c('li',[_vm._v(\"Then, set up two-factor auth again using your new phone.\")]),_c('li',[_vm._v(\"Finally, review your active SkyFlok sessions below and delete the ones from the lost phone.\")]),_c('li',[_vm._v(\"(it's good practice to change all of your passwords when you lose a personal device, just to be safe)\")])])]),_c('div',{staticClass:\"fw text-center mt-2\"},[_c('button',{staticClass:\"btn btn-secondary\",on:{\"click\":()=>{ _vm.$emit('mfa_content_change', 'status') }}},[_c('i',{staticClass:\"ion-arrow-left-c mr-2\"}),_vm._v(\"Back \")])])]):(_vm.mfa_content == 'show_qr')?_c('div',[_c('show-verify-qr',{attrs:{\"url\":_vm.mfa_app_url,\"show_error\":_vm.error},on:{\"verified\":()=>{ _vm.mfa_setup_ready() }}})],1):(_vm.mfa_content == 'recovery_codes')?_c('div',[_c('mfa-recovery-codes',{attrs:{\"user_email\":_vm.email_address,\"show_success\":_vm.success,\"show_error\":_vm.error}}),_c('div',{staticClass:\"fw text-center mt-2\"},[_c('button',{staticClass:\"btn btn-secondary\",on:{\"click\":()=>{ _vm.$emit('mfa_content_change', 'status') }}},[_c('i',{staticClass:\"ion-arrow-left-c mr-2\"}),_vm._v(\"Back \")])])],1):(_vm.mfa_content == 'history')?_c('div',[_c('mfa-history',{staticClass:\"mt-3\",attrs:{\"is_client_space\":_vm.is_client_space,\"show_success\":_vm.success,\"show_error\":_vm.error}}),_c('div',{staticClass:\"fw text-center\"},[_c('button',{staticClass:\"btn btn-secondary\",on:{\"click\":()=>{ _vm.$emit('mfa_content_change', 'status') }}},[_c('i',{staticClass:\"ion-arrow-left-c mr-2\"}),_vm._v(\"Back \")])])],1):_vm._e()\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('small',{staticClass:\"text-success\"},[_c('i',{staticClass:\"ion-locked mr-1\"}),_vm._v(\"This is the more secure option\")])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[_vm._v(\" Scan this QR code with your authenticator mobile app: \"),_c('div',{staticClass:\"fw text-center mt-2\"},[(!_vm.qr_ready)?_c('div',{staticClass:\"d-flex align-items-center justify-content-center\",staticStyle:{\"width\":\"200px\",\"height\":\"200px\",\"margin\":\"0px auto\",\"background\":\"#ebebeb\"}},[_c('i',{staticClass:\"ion-load-c spin\"})]):_c('canvas',{staticStyle:{\"background\":\"#ebebeb\"},attrs:{\"id\":\"qr_code\",\"width\":\"200\",\"height\":\"200\"}})]),(!_vm.success)?_c('div',{staticClass:\"mt-2 fw text-center\"},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.verify()}}},[_vm._v(\" Input the 6-digit code that your app is showing: \"),_c('div',{staticClass:\"input-group col-12 col-lg-6 offset-lg-3 mt-2\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.mfa_code_verify),expression:\"mfa_code_verify\"}],staticClass:\"form-control\",attrs:{\"type\":\"number\",\"id\":_vm.input_id,\"placeholder\":\"123456\"},domProps:{\"value\":(_vm.mfa_code_verify)},on:{\"input\":function($event){if($event.target.composing)return;_vm.mfa_code_verify=$event.target.value}}}),_c('button',{staticClass:\"btn btn-primary btn-gradient ml-2\",attrs:{\"type\":\"submit\",\"disabled\":!_vm.mfa_code_verify || _vm.mfa_code_verify.length != 6 || _vm.loading}},[_vm._v(\" Verify \"),(_vm.loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])]),(_vm.error)?_c('div',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.error))]):_vm._e()])]):_c('div',{staticClass:\"fw text-center text-success text-bold\"},[_vm._v(\" Setup successful! \")]),_vm._m(0)])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert alert-secondary text-left mt-3\"},[_vm._v(\" You can use any mobile application that can generate time-based one time passwords (TOTP), such as: \"),_c('div',{staticClass:\"row mt-3 auth_app_logos\"},[_c('div',{staticClass:\"col-4 col-lg-2 text-center\"},[_c('img',{staticClass:\"auth_app_logo\",attrs:{\"src\":require(\"@/assets/img/authenticator_logos/google.png\")}}),_c('small',[_vm._v(\"Google Authenticator\")])]),_c('div',{staticClass:\"col-4 col-lg-2 text-center\"},[_c('img',{staticClass:\"auth_app_logo\",attrs:{\"src\":require(\"@/assets/img/authenticator_logos/authy.png\")}}),_c('small',[_vm._v(\"Twilio Authy\")])]),_c('div',{staticClass:\"col-4 col-lg-2 text-center\"},[_c('img',{staticClass:\"auth_app_logo\",attrs:{\"src\":require(\"@/assets/img/authenticator_logos/1pass.png\")}}),_c('small',[_vm._v(\"1Password\")])]),_c('div',{staticClass:\"col-4 col-lg-2 text-center\"},[_c('img',{staticClass:\"auth_app_logo\",attrs:{\"src\":require(\"@/assets/img/authenticator_logos/lastpass.png\")}}),_c('small',[_vm._v(\"LastPass Authenticator\")])]),_c('div',{staticClass:\"col-4 col-lg-2 text-center\"},[_c('img',{staticClass:\"auth_app_logo\",attrs:{\"src\":require(\"@/assets/img/authenticator_logos/microsoft.png\")}}),_c('small',[_vm._v(\"Microsoft Authenticator\")])]),_c('div',{staticClass:\"col-4 col-lg-2 text-center\"},[_c('img',{staticClass:\"auth_app_logo\",attrs:{\"src\":require(\"@/assets/img/authenticator_logos/freeotp.png\")}}),_c('small',[_vm._v(\"FreeOTP Authenticator\")])])])])\n}]\n\nexport { render, staticRenderFns }","\n\n Scan this QR code with your authenticator mobile app:\n \n \n
\n Input the 6-digit code that your app is showing:\n \n \n \n Verify\n \n \n
\n {{ error }}
\n \n
\n \n Setup successful!\n
\n \n \n You can use any mobile application that can generate time-based one time passwords (TOTP), such as:\n
\n
\n
\n
Google Authenticator \n
\n
\n
\n
Twilio Authy \n
\n
\n
\n
1Password \n
\n
\n
\n
LastPass Authenticator \n
\n
\n
\n
Microsoft Authenticator \n
\n
\n
\n
FreeOTP Authenticator \n
\n
\n \n
\n \n \n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./show_verify_qrcode.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./show_verify_qrcode.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./show_verify_qrcode.vue?vue&type=template&id=0241a318&scoped=true\"\nimport script from \"./show_verify_qrcode.vue?vue&type=script&lang=js\"\nexport * from \"./show_verify_qrcode.vue?vue&type=script&lang=js\"\nimport style0 from \"./show_verify_qrcode.vue?vue&type=style&index=0&id=0241a318&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0241a318\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.success)?_c('section',[_vm._m(0),_c('form',{staticClass:\"text-center\",on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_delete()}}},[_c('div',{staticClass:\"d-flex align-items-center justify-content-center mt-2\",staticStyle:{\"margin\":\"0px auto\"}},[_c('div',{staticClass:\"mr-2\"},[_vm._v(\"Password:\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.password),expression:\"password\"}],staticClass:\"form-control width-50p\",attrs:{\"type\":\"password\"},domProps:{\"value\":(_vm.password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.password=$event.target.value}}})]),_c('div',{staticClass:\"mt-2\"},[_c('checkbox',{attrs:{\"value\":_vm.failsafe,\"label\":\"I understand the risk of disabling two-factor authentication\"},on:{\"changed\":newval => _vm.failsafe=newval}})],1),_c('div',{staticClass:\"d-flex align-items-center justify-content-center mt-3\"},[_c('button',{staticClass:\"btn btn-secondary mr-1\",on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.$emit('cancelled') }).apply(null, arguments)}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-danger btn-gradient ml-1\",attrs:{\"disabled\":!_vm.form_ok || _vm.loading}},[_vm._v(\" Disable two-factor authentication \"),(_vm.loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])]),(_vm.error)?_c('div',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.error))]):_vm._e()])]):_vm._e()\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"alert alert-warning text-bold\"},[_vm._v(\" You are about to weaken the security of your account!\"),_c('br'),_vm._v(\" Proceed only if you have a good reason, for example your phone is lost. \")])\n}]\n\nexport { render, staticRenderFns }","\n\n \n You are about to weaken the security of your account! \n Proceed only if you have a good reason, for example your phone is lost.\n
\n\n \n\n \n\n \n failsafe=newval\" />\n
\n \n \n { $emit('cancelled') }\">Cancel \n \n \n Disable two-factor authentication\n \n \n
\n {{ error }}
\n \n \n \n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./disable_mfa.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./disable_mfa.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./disable_mfa.vue?vue&type=template&id=57360826\"\nimport script from \"./disable_mfa.vue?vue&type=script&lang=js\"\nexport * from \"./disable_mfa.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (!_vm.qr_url)?_c('div',[_vm._v(\" Setting up... \"),_c('i',{staticClass:\"ion-load-c spin ml-2\"})]):(!_vm.verified)?_c('show-verify-qr',{attrs:{\"url\":_vm.qr_url},on:{\"verified\":()=>{ _vm.verified = true }}}):_c('div',[_c('mfa-recovery-codes',{staticClass:\"my-3\",attrs:{\"recovery_codes\":_vm.backup_codes,\"is_setup\":true,\"user_email\":_vm.user_email}}),_c('div',{staticClass:\"fw text-center-mt-4\"},[_c('button',{staticClass:\"btn btn-success\",on:{\"click\":()=>{ _vm.$emit('completed') }}},[_vm._v(\"Finish setup\")])])],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n Setting up... \n
\n { verified = true }\"/>\n \n
\n \n { $emit('completed') }\">Finish setup \n
\n \n \n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./setup_app.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./setup_app.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./setup_app.vue?vue&type=template&id=610260fc\"\nimport script from \"./setup_app.vue?vue&type=script&lang=js\"\nexport * from \"./setup_app.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',[(_vm.events_loading)?_c('div',{staticClass:\"fw text-center m-2\"},[_vm._v(\" Loading... \"),_c('i',{staticClass:\"ion-load-c spin ml-1\"})]):(_vm.events && !_vm.events.length)?_c('div',{staticClass:\"fw text-center\"},[_c('b',[_vm._v(\"No events\")])]):_c('div',[_c('table',{staticClass:\"table mb-0\"},[_vm._m(0),_c('tbody',_vm._l((_vm.events_page),function(event){return _c('tr',{key:event.id},[_c('td',{staticClass:\"text-sm width-0 nowrap\"},[_vm._v(\" \"+_vm._s(_vm._f(\"timestamp_time\")(event.timestamp))+\" \"+_vm._s(_vm._f(\"timestamp_date\")(event.timestamp))+\" \")]),_c('td',[(event.event_type == 1)?_c('span',[_vm._v(\"Two-Factor Authentication enabled with \"+_vm._s(_vm._f(\"mfa_kind\")(event.extra1)))]):_vm._e(),(event.event_type == 2)?_c('span',[_vm._v(\"Two-Factor Authentication disabled\")]):_vm._e(),(event.event_type == 3)?_c('span',[_vm._v(\"Additional backup codes generated\")]):_vm._e(),(event.event_type == 4)?_c('span',[_vm._v(\"Successful login with \"+_vm._s(_vm._f(\"mfa_kind\")(event.extra1)))]):_vm._e(),(event.event_type == 5)?_c('span',[_vm._v(\"Failed login with \"+_vm._s(_vm._f(\"mfa_kind\")(event.extra1))+\" \"),(event.extra2)?_c('info-icon',{attrs:{\"content\":'IP address: ' + event.extra2}}):_vm._e()],1):_vm._e()])])}),0)]),_c('div',{staticClass:\"text-right\"},[_c('div',{staticClass:\"d-inline-block p-1 m-1 c-pointer\",class:{'disabled text-muted': _vm.page <= 1},on:{\"click\":function($event){_vm.page > 1 ? _vm.page = _vm.page-1 : false}}},[_c('i',{staticClass:\"ion-chevron-left\"})]),_vm._l((_vm.range(_vm.total_pages)),function(p){return _c('div',{key:p,staticClass:\"d-inline-block px-2 c-pointer\",class:{'bg-primary text-white': (p == _vm.page)},on:{\"click\":() => { _vm.page = p }}},[_vm._v(_vm._s(p))])}),_c('div',{staticClass:\"d-inline-block p-1 m-1 c-pointer\",class:{'disabled text-muted': _vm.page >= _vm.total_pages},on:{\"click\":function($event){_vm.page < _vm.total_pages ? _vm.page = _vm.page+1 : false}}},[_c('i',{staticClass:\"ion-chevron-right\"})])],2)])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('thead',[_c('tr',[_c('th',{staticClass:\"width-0\"},[_vm._v(\"Timestamp\")]),_c('th',[_vm._v(\"Event\")])])])\n}]\n\nexport { render, staticRenderFns }","import { bus } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\nimport platform from 'platform'\n\n// This is not exported\nconst base_url = process.env.VUE_APP_audit_log_service_url\n\nconst AuditLogService = {\n\n query_events(params){\n return bus.$http.get(base_url + \"/list\", { params: params, headers: Utils.get_auth_header() })\n },\n\n ENTITY_TYPE_USER: 1,\n ENTITY_TYPE_TEAM: 2,\n ENTITY_TYPE_FILE: 3,\n ENTITY_TYPE_FOLDER: 4,\n ENTITY_TYPE_SHARE: 5,\n ENTITY_TYPE_CLIENT_SPACE: 6,\n ENTITY_TYPE_PLAN_CONFIG: 7,\n ENTITY_TYPE_MFA: 8,\n\n USER_CREATED: 1,\n USER_DELETED_OWN: 2,\n USER_REMOVED: 3,\n USER_PASSWORD_CHANGED: 4,\n USER_PRIMARY_EMAIL_CONFIRMED_CHANGED: 5,\n USER_SUSPEND_CHANGED: 6,\n USER_ROLE_CHANGED: 7,\n USER_PROFILE_CHANGED: 8,\n USER_OPERATOR_ADDED: 9,\n\n COMPANY_CREATED: 1,\n COMPANY_DELETED: 2,\n COMPANY_PROFILE_CHANGED: 3,\n COMPANY_ADDITIONAL_EMAILS_CHANGED: 4,\n COMPANY_BACKEND_CHANGED: 5,\n COMPANY_CODING_CONFIG_CHANGED_EVENT: 6,\n COMPANY_CONFIG_CHANGED_EVENT: 7,\n COMPANY_PLAN_CHANGED_EVENT: 8,\n COMPANY_DISABLED_EVENT: 9,\n COMPANY_ENABLED_EVENT: 10,\n COMPANY_STORAGE_QUOTA_CHANGED_EVENT: 11,\n COMPANY_USER_QUOTA_CHANGED_EVENT: 12,\n COMPANY_PLAN_TIME_LIMIT_CHANGED: 13,\n\n FILE_CREATED: 1,\n FILE_VERSION_CREATED: 2,\n FILE_REVERTED: 3,\n FILE_DELETED: 4,\n FILE_UNDELETED: 5,\n FILE_REMOVED: 6,\n FILE_ATTRIBUTE_CHANGED: 7,\n FILE_DOWNLOADED: 8,\n FILE_DOWNLOADED_SYNC: 9,\n\n FOLDER_CREATED: 1,\n FOLDER_DELETED: 2,\n FOLDER_UNDELETED: 3,\n FOLDER_REMOVED: 4,\n FOLDER_ATTRIBUTE_CHANGED: 5,\n\n SHARE_CREATED: 1,\n SHARE_REVOKED: 2,\n SHARE_PASSWORD_CHANGED: 3,\n SHARE_ATTRIBUTE_CHANGED: 4,\n SHARE_FILES_CHANGED: 5,\n SHARE_ACCESSED: 6,\n SHARE_FILE_DOWNLOADED: 7,\n\n CLIENT_SPACE_CREATED: 1,\n CLIENT_SPACE_ARCHIVED: 2,\n CLIENT_SPACE_ACTIVATED: 3,\n CLIENT_SPACE_EDITED_BY_MANAGER: 4,\n CLIENT_SPACE_EDITED_BY_CLIENT: 5,\n CLIENT_SPACE_ACCESSED_BY_CLIENT: 6,\n CLIENT_SPACE_CLIENT_JOINS: 7,\n\n\n PLAN_CREATED: 1,\n PLAN_UPDATED: 2,\n PLAN_DELETED: 3,\n\n MFA_ENABLED: 1,\n MFA_DISABLED: 2,\n MFA_BACKUP_CODES_GENERATED: 3,\n MFA_SUCCESS: 4,\n MFA_FAILED_ATTEMPT: 5,\n\n}\n\nexport { AuditLogService }","\n\n \n Loading... \n
\n \n No events \n
\n \n
\n \n \n Timestamp \n Event \n \n \n \n \n \n {{ event.timestamp | timestamp_time }} {{ event.timestamp | timestamp_date }}\n \n \n Two-Factor Authentication enabled with {{ event.extra1 | mfa_kind }} \n Two-Factor Authentication disabled \n Additional backup codes generated \n Successful login with {{ event.extra1 | mfa_kind }} \n Failed login with {{ event.extra1 | mfa_kind }} \n \n \n \n
\n\n
\n
1 ? page = page-1 : false\">
\n
{ page = p }\" class=\"d-inline-block px-2 c-pointer\" :class=\"{'bg-primary text-white': (p == page)}\">{{ p }}
\n
= total_pages}\" @click=\"page < total_pages ? page = page+1 : false\">
\n
\n
\n \n \n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./history.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./history.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./history.vue?vue&type=template&id=a38ebea8&scoped=true\"\nimport script from \"./history.vue?vue&type=script&lang=js\"\nexport * from \"./history.vue?vue&type=script&lang=js\"\nimport style0 from \"./history.vue?vue&type=style&index=0&id=a38ebea8&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a38ebea8\",\n null\n \n)\n\nexport default component.exports","\n\n \n
\n Enabled, using {{ mfa_status.kind == 1 ? \"mobile authenticator app\" : \"SMS\" }}\n \n
\n
\n Your account is not protected by two factor authentication.\n { $emit('mfa_content_change', 'setup'); setup_mfa_step = 1 }\">\n Enable Two-Factor Authentication\n \n \n
\n \n Loading... \n
\n \n\n \n
\n \n You can use either an Authenticator app on your phone, \n or SMS to receive one time passcodes when you are\n logging in from a new device or browser. This \n significantly improves security of your account.\n
\n \n \n
\n Use an app on your phone \n This is the more secure option \n
\n
\n Receive codes in SMS \n
\n
\n \n\n \n
{ mfa_setup_ready() }\">\n \n\n
\n Two factor authentication with SMS is not supported yet\n \n
\n\n\n { mfa_disabled() }\" \n @cancelled=\"()=>{ $emit('mfa_content_change', 'status') }\"\n />\n
\n\n\n
\n
\n If you lost the phone that was set up for {{ mfa_status.kind == 1 ? \"generating codes\" : \"receiving codes in SMS\" }}, do the following:\n
\n
\n First { $emit('mfa_content_change', 'delete') } \" >disable two-factor authentication so the lost phone won't be able to {{ mfa_status.kind == 1 ? \"generate codes\" : \"receive codes\" }} for your account \n Then, set up two-factor auth again using your new phone. \n Finally, review your active SkyFlok sessions below and delete the ones from the lost phone. \n (it's good practice to change all of your passwords when you lose a personal device, just to be safe) \n \n
\n
\n { $emit('mfa_content_change', 'status') }\">\n Back\n \n
\n
\n\n\n { mfa_setup_ready() }\">\n \n
\n\n\n
\n \n
\n { $emit('mfa_content_change', 'status') }\">\n Back\n \n
\n
\n\n
\n \n
\n { $emit('mfa_content_change', 'status') }\">\n Back\n \n
\n
\n\n \n\n\n\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./main.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./main.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./main.vue?vue&type=template&id=02b9b54a&scoped=true\"\nimport script from \"./main.vue?vue&type=script&lang=js\"\nexport * from \"./main.vue?vue&type=script&lang=js\"\nimport style0 from \"./main.vue?vue&type=style&index=0&id=02b9b54a&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"02b9b54a\",\n null\n \n)\n\nexport default component.exports","\n \n\n \n\n \n
\n
\n
\n
\n\n
\n \n
\n \n
\n Two-Factor Authentication\n\n \n \n \n Options\n \n \n
\n \n Cancel \n \n \n\n
\n { mfa_status = status }\"\n @mfa_content_change=\"(new_content) => { mfa_content = new_content }\"\n />\n
\n \n
\n
\n
\n\n \n \n\n
Active Sessions \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ session.client_name }}
\n
(this session) \n
\n
\n
{{ session.location_str }} \n
Unknown location \n
\n
Last used {{ session.last_used | timestamp_rel }}
\n \n
\n
\n
\n
\n
\n
\n
\n\n
\n\n \n \n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./settings.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./settings.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./settings.vue?vue&type=template&id=e7f2bc82&scoped=true\"\nimport script from \"./settings.vue?vue&type=script&lang=js\"\nexport * from \"./settings.vue?vue&type=script&lang=js\"\nimport style0 from \"./settings.vue?vue&type=style&index=0&id=e7f2bc82&prod&lang=css&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e7f2bc82\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\",attrs:{\"id\":\"team_members\"}},[_c('div',{staticClass:\"container-fluid\"},[(_vm.user && _vm.user.team_settings && (_vm.user.team_settings.name || _vm.user.team_settings.url))?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"},[_vm._v(\"Â \")]),_c('div',{staticClass:\"col-md-6\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-primary b0\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_c('div',{staticClass:\"text-bold text-lg\"},[_vm._v(_vm._s(_vm.user.team_settings.name))]),(_vm.user.team_settings.url)?_c('div',{},[_c('a',{staticClass:\"text-white\",attrs:{\"href\":_vm._f(\"fix_url\")(_vm.user.team_settings.url),\"target\":\"_BLANK\",\"rel\":\"noopener\"}},[_c('em',[_vm._v(_vm._s(_vm.user.team_settings.url))]),_vm._v(\" \"),_c('i',{staticClass:\"ion-share ml-2\"})])]):_vm._e()])])])]):_vm._e()]),_c('div',{staticClass:\"container-fluid\"},[(_vm.user && _vm.user.team)?_c('div',{staticClass:\"row\"},_vm._l((_vm.user.team),function(member){return _c('div',{key:member.id,staticClass:\"col-sm-12 col-md-6 col-xl-4\"},[_c('div',{staticClass:\"cardbox\"},[_c('div',{staticClass:\"pb-1\",class:_vm._f(\"highlight_class\")(member.name)}),_c('div',{staticClass:\"cardbox-body\"},[_c('div',{staticClass:\"d-flex\"},[_c('div',[_c('div',{staticClass:\"lead mb-2\"},[_vm._v(_vm._s(member.name)),(member.is_admin)?_c('small',{staticClass:\"text-gray-light ml-2\"},[_vm._v(\"(Admin)\")]):_vm._e()]),_c('p',[_c('span',[_vm._v(_vm._s(member.job_title || 'Â '))])]),_c('p',[_c('em',{staticClass:\"ion-email mr-2 icon-lg text-primary\"}),_c('span',[_vm._v(_vm._s(member.email_address))])])]),_c('div',{staticClass:\"ml-auto\"},[_c('img',{staticClass:\"shadow-z5 thumb80 rounded fit-cover\",attrs:{\"src\":member.avatar_url,\"alt\":\"user\"}})])])])])])}),0):_vm._e()])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n \n\n\t\t\n\t\t
\n
\n
\n
\n
\n
{{ user.team_settings.name }}
\n
\n
\n
\n
\n
\n
\n\n \n\t\t\n
\n\n
\n
\n
\n
\n
\n
\n
{{ member.name }}(Admin)
\n
{{ member.job_title || ' ' }}
\n
{{ member.email_address }}
\n
\n
\n
\n
\n \n
\n
\n\n
\n
\n \n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./team_members.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./team_members.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./team_members.vue?vue&type=template&id=e6c44d84\"\nimport script from \"./team_members.vue?vue&type=script&lang=js\"\nexport * from \"./team_members.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\",attrs:{\"id\":\"install_apps\"}},[_c('div',{staticClass:\"container pt-5\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12 col-md-6 col-xl-4\"},[_c('div',{staticClass:\"cardbox b\"},[_vm._m(0),_vm._m(1),_c('div',{staticClass:\"cardbox-body text-center\"},[_c('a',{staticClass:\"btn btn-outline-primary\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.coming_soon()}}},[_c('i',{staticClass:\"ion-social-windows icon-lg mr-2\"}),_vm._v(\"Coming soon!\")])])])]),_c('div',{staticClass:\"col-12 col-md-6 col-xl-4\"},[_c('div',{staticClass:\"cardbox b\"},[_vm._m(2),_vm._m(3),_c('div',{staticClass:\"cardbox-body text-center\"},[_c('a',{staticClass:\"btn btn-outline-secondary btn-gradient\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.coming_soon()}}},[_c('i',{staticClass:\"ion-social-apple-outline icon-lg mr-2\"}),_vm._v(\" Coming soon!\")])])])]),_c('div',{staticClass:\"col-12 col-md-6 col-xl-4\"},[_c('div',{staticClass:\"cardbox b\"},[_vm._m(4),_vm._m(5),_c('div',{staticClass:\"cardbox-body text-center\"},[_c('a',{staticClass:\"btn btn-outline-danger btn-gradient\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.coming_soon()}}},[_c('i',{staticClass:\"ion-social-tux icon-lg mr-2\"}),_vm._v(\" Coming soon!\")])])])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-2\"},[_c('div',{staticClass:\"cardbox-body bg-gradient-primary text-center text-white rounded\"},[_c('em',{staticClass:\"ion-social-windows icon-5x\"}),_c('div',{staticClass:\"text-bold text-lg\"},[_vm._v(\"Windows\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox-body\"},[_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Runs in the background\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Sync only the selected folders\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Password and/or PIN code\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Accidental overwrite protection\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-2\"},[_c('div',{staticClass:\"cardbox-body bg-gradient-secondary text-center text-white rounded\"},[_c('em',{staticClass:\"ion-social-apple-outline icon-5x\"}),_c('div',{staticClass:\"text-bold text-lg\"},[_vm._v(\"macOS\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox-body\"},[_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Runs in the background\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Sync only the selected folders\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Password and/or PIN code\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Accidental overwrite protection\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"p-2\"},[_c('div',{staticClass:\"cardbox-body bg-gradient-danger text-center text-white rounded\"},[_c('em',{staticClass:\"ion-social-tux icon-5x\"}),_c('div',{staticClass:\"text-bold text-lg\"},[_vm._v(\"Linux\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox-body\"},[_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Runs in the background\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Sync only the selected folders\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Password and/or PIN code\")])]),_c('p',{staticClass:\"mb-3\"},[_c('em',{staticClass:\"ion-checkmark-round mx-3\"}),_c('span',[_vm._v(\"Accidental overwrite protection\")])])])\n}]\n\nexport { render, staticRenderFns }","\n \n \n
\n\n
\n
\n
\n
\n
\n \n Runs in the background \n
\n
\n \n Sync only the selected folders \n
\n
\n \n Password and/or PIN code \n
\n
\n \n Accidental overwrite protection \n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n \n Runs in the background \n
\n
\n \n Sync only the selected folders \n
\n
\n \n Password and/or PIN code \n
\n
\n \n Accidental overwrite protection \n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n \n Runs in the background \n
\n
\n \n Sync only the selected folders \n
\n
\n \n Password and/or PIN code \n
\n
\n \n Accidental overwrite protection \n
\n
\n
\n
\n
\n
\n\n
\n \n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./install_apps.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./install_apps.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./install_apps.vue?vue&type=template&id=071a0720\"\nimport script from \"./install_apps.vue?vue&type=script&lang=js\"\nexport * from \"./install_apps.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\"},[_vm._m(0),_c('div',{staticClass:\"container-fluid\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_c('div',{staticClass:\"col-12 col-lg-8\"},[_c('div',{staticClass:\"cardbox\"},[_c('div',{staticClass:\"cardbox-body\"},[(_vm.form_sent)?_c('div',[_c('h2',{staticClass:\"text-center mt-4 mb-4\"},[_vm._v(\"Your report has been sent successfully!\")])]):_c('form',{staticClass:\"mt-3\",attrs:{\"action\":\"\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_form.apply(null, arguments)}}},[_c('div',{staticClass:\"form-group\"},[_c('label',[_vm._v(\"What went wrong?\")]),_c('div',{staticClass:\"input-group\"},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.text),expression:\"form.text\"}],staticClass:\"form-control fw\",staticStyle:{\"height\":\"14em\"},attrs:{\"id\":\"bugreport_text\"},domProps:{\"value\":(_vm.form.text)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form, \"text\", $event.target.value)}}})]),_vm._m(1)]),_c('div',{staticClass:\"form-group\"},[(_vm.user && _vm.user.team_settings)?_c('div',{staticClass:\"flex\"},[_c('label',{staticClass:\"mr-2\"},[_vm._v(\"Reported by:\")]),_c('img',{staticClass:\"shadow-z2 thumb32 rounded fit-cover\",attrs:{\"src\":_vm.user.avatar_url}}),_c('span',[_vm._v(_vm._s(_vm.user.name)+\", \"+_vm._s(_vm.user.team_settings.name))])]):_vm._e()]),_c('div',{staticClass:\"form-group\"},[_c('checkbox',{attrs:{\"value\":_vm.form.response_requested,\"label\":\"I would like to be contacted about this issue\"},on:{\"changed\":newval => {_vm.form.response_requested = newval}}})],1),_c('div',{staticClass:\"form-group\"},[_c('button',{staticClass:\"btn btn-success\",attrs:{\"disabled\":_vm.form_loading,\"type\":\"submit\"}},[_vm._v(\"Send bug report!\"),(_vm.form_loading)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):_vm._e()]),(_vm.error)?_c('div',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.error))]):_vm._e()])])])])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"container-overlap bg-gradient-success text-center\"},[_c('div',{staticClass:\"mb-3\"}),_c('div',{staticClass:\"text-white\"},[_c('div',{staticClass:\"text-lg\"},[_c('i',{staticClass:\"ion-bug\"})]),_c('div',{staticClass:\"h3\"},[_vm._v(\"Sorry for your inconvenience, please tell us what happened!\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"text-right\"},[_c('small',[_vm._v(\"Please describe the problem with as much detail as you can!\")])])\n}]\n\nexport { render, staticRenderFns }","\n \n \n
\n
\n
\n \n
\n \n
Sorry for your inconvenience, please tell us what happened!
\n\n
\n
\n \n
\n
\n
\n
\n
\n
\n
Your report has been sent successfully! \n \n\n
\n \n \n \n {form.response_requested = newval}\" \n />\n \n
\n\n \n \n
\n
\n\n
\n
\n
\n \n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./bug_report.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./bug_report.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./bug_report.vue?vue&type=template&id=a785fa3c&scoped=true\"\nimport script from \"./bug_report.vue?vue&type=script&lang=js\"\nexport * from \"./bug_report.vue?vue&type=script&lang=js\"\nimport style0 from \"./bug_report.vue?vue&type=style&index=0&id=a785fa3c&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a785fa3c\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\"},[(_vm.user && _vm.user.team_settings && !_vm.user.team_settings.is_free_trial)?_c('div',{staticClass:\"fw text-center text-14 pt-5\"},[_vm._m(0),_vm._v(\" Contact us at \"),_c('a',{staticClass:\"text-initial text-underline\",staticStyle:{\"color\":\"initial\"},attrs:{\"href\":\"mailto:support@skyflok.com\"}},[_vm._v(\"support@skyflok.com\")]),_vm._v(\" if you have a question or you want to change it. \")]):_c('div',{staticClass:\"container\"},[(_vm.loading)?_c('div',{staticClass:\"fw text-center text-14 pt-5\"},[_vm._v(\" Loading subscription options... \"),_c('i',{staticClass:\"ion-load-c spin ml-2\"})]):(!_vm.available_plans.length)?_c('div',{staticClass:\"fw text-center text-14 pt-5 text-danger\"},[_vm._v(\" No plans found. \")]):_c('div',{staticClass:\"row pt-5\"},[(_vm.available_plans.length == 2)?_c('div',{staticClass:\"offset-1 d-none d-md-block\"}):_vm._e(),_vm._l((_vm.available_plans),function(plan){return _c('div',{key:plan._key,staticClass:\"col-12 col-md-6 col-lg-5\"},[_c('div',{staticClass:\"cardbox b plan-box\"},[_c('div',{staticClass:\"cardbox-body px-5\"},[_c('div',{staticClass:\"text-center color-skyflok text-14\"},[_vm._v(_vm._s(plan.name))]),_c('div',{staticClass:\"text-center my-4 text-bold\"},[_c('div',{staticClass:\"mt-2 text-14\"},[_vm._v(_vm._s(plan.pricing.monthly_price)+\" / month\")]),(plan.pricing.annual_savings)?_c('small',{staticClass:\"text-gray\"},[_vm._v(_vm._s(plan.pricing.annual_savings)+\" with annual billing\")]):_c('small',[_vm._v(\" \")])]),_vm._l((plan.features),function(feature,idx){return _c('p',{key:idx},[_c('i',{staticClass:\"ion-checkmark-round mr-3\"}),_vm._v(_vm._s(feature)+\" \")])}),_c('p',{staticClass:\"text-center mt-4\"},[_c('button',{staticClass:\"btn btn-gradient btn-skyflok btn-block text-bold text-12\",class:_vm.plan_btn_class(plan),on:{\"click\":function($event){return _vm.plan_selected(plan)}}},[_vm._v(\" Select \")])])],2)])])})],2),(!_vm.loading)?_c('div',{staticClass:\"row mt-5\"},[_c('div',{staticClass:\"offset-2 d-none d-md-block\"}),_vm._m(1)]):_vm._e()]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"instructions_modal\"}},[(_vm.show_instructions)?_c('div',{staticClass:\"modal-dialog\"},[_c('div',{staticClass:\"modal-content\"},[_vm._m(2),_c('div',{staticClass:\"modal-body px-4\"},[_vm._m(3),_c('ol',{staticClass:\"mx-3\"},[_vm._m(4),_vm._m(5),_c('li',{staticClass:\"mb-2\"},[_vm._v(\"Use your email address \"),_c('span',{staticClass:\"badge badge-dark\",staticStyle:{\"font-size\":\"100%\"}},[_vm._v(_vm._s(_vm.user ? _vm.user.email_address : ''))]),_vm._v(\" under \"),_c('strong',[_vm._v(\"Billing Details\")])])]),_c('p',{staticClass:\"mt-4 px-5\"},[_c('a',{staticClass:\"btn btn-gradient btn-block\",class:_vm.plan_btn_class(_vm.selected_plan),attrs:{\"href\":_vm.selected_plan.pricing.checkout_url,\"target\":\"_blank\"},on:{\"click\":function($event){return _vm.close_modal()}}},[_vm._v(\" Open Checkout Form \"),_c('i',{staticClass:\"ion-arrow-right-c ml-1\"})])])])])]):_vm._e()])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"text-success mb-4\"},[_c('i',{staticClass:\"text-success ion-checkmark-circled mr-2\"}),_vm._v(\" Your team has an active SkyFlok subscription. \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-12 col-lg-8\"},[_c('div',{staticClass:\"cardbox\"},[_c('div',{staticClass:\"cardbox-body\"},[_c('div',{staticClass:\"text-center color-skyflok text-14\"},[_vm._v(\"Need more? No problem!\")]),_c('div',{staticClass:\"text-center\"},[_c('div',{staticClass:\"mt-2\"},[_vm._v(\" Contact us on \"),_c('a',{staticClass:\"text-initial text-underline\",staticStyle:{\"color\":\"initial\"},attrs:{\"href\":\"mailto:upgrade@skyflok.com\"}},[_vm._v(\"upgrade@skyflok.com\")])])])])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\"Checkout Form Instructions\")]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"data-dismiss\":\"modal\",\"aria-label\":\"Close\"}},[_c('span',[_vm._v(\"×\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"pt-3\"},[_vm._v(\" Please use our webshop to start a SkyFlok subscription. \"),_c('br'),_vm._v(\"On the Checkout Form: \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('li',{staticClass:\"mb-2\"},[_vm._v(\"Select \"),_c('strong',[_vm._v(\"Yearly\")]),_vm._v(\" or \"),_c('strong',[_vm._v(\"Monthly\")]),_vm._v(\" billing\")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('li',{staticClass:\"mb-2\"},[_vm._v(\"Click the \"),_c('span',{staticClass:\"badge badge-dark\",staticStyle:{\"font-size\":\"100%\"}},[_vm._v(\"Add to cart\")]),_vm._v(\" button\")])\n}]\n\nexport { render, staticRenderFns }","import { bus } from '../helpers/event_bus.js'\nimport { Utils } from '../helpers/utils.js'\n\n// This is not exported\nconst base_url = process.env.VUE_APP_billing_service_url\n\nconst BillingService = {\n\n get_skyflok_options(){\n return bus.$http.get(base_url + \"/skyflok_pricing\", { headers: Utils.get_auth_header() })\n }\n\n}\n\nexport { BillingService }","\n\n\n \n
Your team has an active SkyFlok subscription.
\n Contact us at
support@skyflok.com if you have a question or you want to change it.\n
\n\n
\n Loading subscription options... \n
\n
\n No plans found.\n
\n
\n
\n
\n
\n
\n\n
{{plan.name}}
\n \n
\n
{{plan.pricing.monthly_price}} / month
\n
{{plan.pricing.annual_savings}} with annual billing \n
\n
\n \n
\n {{feature}}\n
\n \n\n
\n \n Select\n \n
\n\n
\n
\n
\n \n
\n\n
\n
\n
\n\n
\n
\n\n
Need more? No problem!
\n \n
\n \n
\n
\n
\n
\n
\n\n\n
\n
\n \n
\n \n
\n Please use our webshop to start a SkyFlok subscription.\n On the Checkout Form:\n
\n\n
\n Select Yearly or Monthly billing \n Click the Add to cart button \n Use your email address {{user ? user.email_address : ''}} under Billing Details \n \n\n
\n \n Open Checkout Form \n \n
\n\n
\n
\n
\n
\n\n \n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./upgrade_team.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./upgrade_team.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./upgrade_team.vue?vue&type=template&id=77211cf2&scoped=true\"\nimport script from \"./upgrade_team.vue?vue&type=script&lang=js\"\nexport * from \"./upgrade_team.vue?vue&type=script&lang=js\"\nimport style0 from \"./upgrade_team.vue?vue&type=style&index=0&id=77211cf2&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"77211cf2\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.user && !_vm.user.is_admin)?_c('div',{staticClass:\"container pt-5\"},[_c('admin-warning-box')],1):_c('section',{staticClass:\"section-container\"},[_c('div',{staticClass:\"container-overlap bg-gradient-primary text-center\"},[(_vm.user && _vm.user.team_settings)?_c('div',{staticClass:\"text-white text-bold text-md\"},[(!_vm.user.team_settings.logo_url || _vm.user.team_settings.logo_url == '')?_c('div',[_vm._v(_vm._s(_vm.user.team_settings.name))]):_c('div',{staticClass:\"d-flex justify-content-center align-items-center\"},[_c('img',{staticClass:\"mr-2\",staticStyle:{\"max-height\":\"48px\"},attrs:{\"src\":_vm.user.team_settings.logo_url}}),_c('span',[_vm._v(_vm._s(_vm.user.team_settings.name))])])]):_vm._e()]),_c('div',{staticClass:\"container container-md\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_c('div',{staticClass:\"col-12 col-lg-8 cardbox\"},[_c('h5',{staticClass:\"cardbox-heading pb-0\"},[_vm._v(\"Team Settings \"),_c('a',{staticClass:\"btn btn-sm btn-secondary float-right\",on:{\"click\":function($event){return _vm.init_form()}}},[_c('i',{staticClass:\"ion-edit text-grey mr-2\"}),_vm._v(\" Edit\")])]),(_vm.user && _vm.user.team_settings)?_c('div',{staticClass:\"cardbox-body\"},[(_vm.form_error)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.form_error))]):_vm._e(),_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_form.apply(null, arguments)}}},[_c('table',{staticClass:\"table mb-0 settings-table\"},[(_vm.user && _vm.user.team_settings)?_c('tbody',[_c('tr',[_c('th',{staticStyle:{\"width\":\"40%\"}},[_vm._v(\"Team Name\")]),_c('td',[(!_vm.edit_mode)?_c('span',[_vm._v(_vm._s(_vm.user.team_settings.name || \"Not set\"))]):_c('span',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form_data.name),expression:\"form_data.name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"id\":\"team_name_input\"},domProps:{\"value\":(_vm.form_data.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form_data, \"name\", $event.target.value)}}})])])]),_c('tr',[_c('th',[_vm._v(\"Website\")]),_c('td',[(!_vm.edit_mode)?_c('span',[_vm._v(_vm._s(_vm.user.team_settings.url || \"Not set\"))]):_c('span',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form_data.url),expression:\"form_data.url\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.form_data.url)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form_data, \"url\", $event.target.value)}}})])])]),_c('tr',[_c('th',[(_vm.edit_mode)?_c('span',[_vm._v(\"New team logo\")]):_c('span',[_vm._v(\"Logo\")])]),_c('td',[(_vm.edit_mode)?_c('profile-image-selector',{attrs:{\"avatar_changed\":(avatar_url) => { _vm.form_data.logo_url = avatar_url }}}):_c('span',[(_vm.user.team_settings.logo_url)?_c('img',{staticStyle:{\"max-width\":\"100px\",\"max-height\":\"100px\"},attrs:{\"src\":_vm.user.team_settings.logo_url}}):_c('i',[_vm._v(\"No logo\")])])],1)]),_c('tr',[_vm._m(0),_c('td',[(!_vm.edit_mode)?_c('div',{staticStyle:{\"cursor\":\"help\"},attrs:{\"title\":_vm.user.team_settings.is_passwordless_share_allowed ? 'Team Members are allowed to create Shares without password protection' : 'Every Share is protected by a strong, auto-generated password.'}},[(_vm.user.team_settings.is_passwordless_share_allowed)?_c('div',{staticClass:\"text-warning\"},[_vm._v(\" No \"),_c('i',{staticClass:\"ion-unlocked ml-1\"})]):_c('div',{staticClass:\"text-success\"},[_vm._v(\" Yes \"),_c('i',{staticClass:\"ion-locked ml-1\"})])]):_c('div',[_c('button',{staticClass:\"btn btn-sm\",class:{'btn-outline-success': _vm.form_data.unsafe_shares, 'btn-success font-weight-bold': !_vm.form_data.unsafe_shares},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form_data.unsafe_shares = false}}},[_c('i',{staticClass:\"ion-locked mr-2\"}),_vm._v(\"Yes\")]),_c('button',{staticClass:\"btn btn-sm ml-2\",class:{'btn-outline-warning': !_vm.form_data.unsafe_shares, 'btn-warning font-weight-bold': _vm.form_data.unsafe_shares},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.form_data.unsafe_shares = true}}},[_c('i',{staticClass:\"ion-unlocked mr-2\"}),_vm._v(\"No\")]),_c('div',[_c('small',{class:{'text-success': !_vm.form_data.unsafe_shares, 'text-warning': _vm.form_data.unsafe_shares}},[_vm._v(_vm._s(_vm.form_data.unsafe_shares ? \"Team Members are allowed to create Shares without password protection\" : \"Every Share is protected by a strong, auto-generated password.\"))])])])])]),_c('tr',[_c('th',[_vm._v(\"User Quota\")]),(!_vm.user.team_settings.max_user_number)?_c('td',[_c('span',{staticClass:\"badge badge-success p-2\"},[_vm._v(\"Unlimited\")])]):_c('td',[_vm._v(_vm._s(_vm.user.team_settings.actual_user_number)+\" of \"+_vm._s(_vm.user.team_settings.max_user_number)+\" used \"),_c('small',[_vm._v(\"(\"+_vm._s(Math.round( (_vm.user.team_settings.actual_user_number / _vm.user.team_settings.max_user_number) * 100 ))+\"%)\")])])]),_c('tr',[_c('th',[_vm._v(\"Storage Quota\")]),(!_vm.user.team_settings.max_storage)?_c('td',[_c('span',{staticClass:\"badge badge-success p-2\"},[_vm._v(\"Unlimited\")])]):_c('td',[_vm._v(_vm._s(_vm._f(\"format_bytes\")(_vm.user.team_storage_used))+\" of \"+_vm._s(_vm._f(\"format_bytes\")(_vm.user.team_settings.max_storage))+\" used \"),_c('small',[_vm._v(\"(\"+_vm._s(Math.round((_vm.user.team_storage_used / _vm.user.team_settings.max_storage) * 100))+\"%)\")])])]),_c('tr',[_vm._m(1),_c('td',[(!_vm.edit_mode)?_c('span',[_vm._v(_vm._s(_vm.user.team_settings.email_domain ? '@'+_vm.user.team_settings.email_domain : \"Not set\"))]):_c('div',{staticClass:\"input-group\"},[_c('span',{staticClass:\"input-group-text\",attrs:{\"id\":\"email_domain_addon\"}},[_vm._v(\"@\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form_data.email_domain),expression:\"form_data.email_domain\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"aria-describedby\":\"email_domain_addon\"},domProps:{\"value\":(_vm.form_data.email_domain)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.form_data, \"email_domain\", $event.target.value)}}})])])]),(_vm.edit_mode)?_c('tr',[_c('td',{staticClass:\"text-center\",staticStyle:{\"border-top\":\"none\"},attrs:{\"colspan\":\"2\"}},[(!_vm.form_loading)?_c('div',[_c('button',{staticClass:\"btn btn-secondary mr-2\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.edit_mode = false}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-info btn-gradient\",attrs:{\"type\":\"submit\"}},[_vm._v(\"Save\")])]):_c('i',{staticClass:\"ion-load-c spin\"})])]):_vm._e(),_c('tr',[_vm._m(2),_c('td',[(!_vm.additional_emails || _vm.additional_emails.length == 0)?_c('span',[_vm._m(3)]):_c('div',[_c('table',{staticClass:\"table table-sm invites_table mb-1\"},[_vm._m(4),_c('tbody',_vm._l((_vm.additional_emails),function(email){return _c('tr',{key:JSON.stringify(email),staticClass:\"invite_row\"},[_c('td',[_vm._v(_vm._s(email.email))]),_c('td',[_vm._v(_vm._s(email.used === true ? \"Used\" : (email.used === false ? \"Pending\" : \"...\")))])])}),0)])]),(!_vm.additional_email_form.show)?_c('button',{staticClass:\"btn btn-secondary btn-gradient\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.init_additional_email_form()}}},[_c('i',{staticClass:\"ion-plus-round mr-2\"}),_vm._v(\"Invite by email\")]):_c('div',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_additional_email_form.apply(null, arguments)}}},[_c('div',{staticClass:\"input-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.additional_email_form.email),expression:\"additional_email_form.email\"}],staticClass:\"form-control\",attrs:{\"type\":\"email\",\"id\":\"additional_email_input\",\"placeholder\":\"E-mail address\"},domProps:{\"value\":(_vm.additional_email_form.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.additional_email_form, \"email\", $event.target.value)}}})]),_c('div',{staticClass:\"input-group mt-1 justify-content-end\"},[_c('button',{staticClass:\"btn btn-secondary mr-1\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.additional_email_form.show=false}}},[_c('i',{staticClass:\"ion-close-round mr-1\"}),_vm._v(\" Cancel\")]),_c('button',{staticClass:\"btn btn-success btn-gradient\",attrs:{\"type\":\"submit\",\"disabled\":_vm.additional_email_form.loading}},[_c('i',{staticClass:\"ion-paper-airplane mr-1\"}),_vm._v(\" Send invite \"),(_vm.additional_email_form.loading)?_c('i',{staticClass:\"ml-1 ion-load-c spin\"}):_vm._e()])]),(_vm.additional_email_form.error)?_c('div',{staticClass:\"text-danger\"},[_vm._v(_vm._s(_vm.additional_email_form.error))]):_vm._e()])])])])]):_vm._e()])])]):_c('div',{staticClass:\"cardbox-body\"},[_vm._v(\" Loading \"),_c('i',{staticClass:\"ion-load-c spin\"})])])])]),(_vm.cloud_locations && _vm.cloud_locations.length > 0)?_c('div',{staticClass:\"container container-xl\"},[_c('div',{staticClass:\"d-flex align-items-center justify-content-start\"},[_c('h3',[_vm._v(\"Data Locations\")]),(_vm.all_gdpr)?_c('span',{staticClass:\"badge badge-success ml-2\"},[_vm._v(\"GDPR \"),_c('i',{staticClass:\"ion ion-checkmark-circled ml-1\"})]):_vm._e()]),_c('div',{staticClass:\"text-gray-light\"},[_vm._v(\"All your files are distributed across these \"+_vm._s(_vm.cloud_locations.length)+\" locations.\")]),_c('div',{staticClass:\"row mt-4\"},_vm._l((_vm.cloud_locations.filter(loc => loc.provider || loc.backend)),function(location){return _c('div',{key:location.bucket_id,staticClass:\"col-12 col-md-6 col-xl-4 mb-4\"},[_c('div',{staticClass:\"cardbox fh mx-3\"},[_c('div',{staticClass:\"cardbox-body\"},[_c('div',{staticClass:\"selected_backend pb-0\"},[(location.provider)?[_c('p',{staticClass:\"text-center mb-4\"},[(location.provider)?_c('img',{staticClass:\"cloud-logo\",attrs:{\"src\":_vm.Utils.cloud_provider_logo_src(location.provider.logo_path)}}):_vm._e()]),_c('div',{staticClass:\"mt-4 text-bold mb-1\"},[_vm._v(\"Cloud Platform\")]),_c('div',{staticClass:\"ml-3\"},[_vm._v(_vm._s(location.provider.service_name)+\" \"),(location.provider.cloud_platform_url != '')?_c('a',{staticClass:\"btn btn-sm btn-secondary ml-1\",attrs:{\"href\":location.provider.cloud_platform_url,\"target\":\"_BLANK\",\"rel\":\"noopener\",\"role\":\"button\",\"title\":\"Open platform website in a new tab\"}},[_c('i',{staticClass:\"ion-android-open\"})]):_vm._e()])]:_vm._e(),(location.backend)?[_c('div',{staticClass:\"mt-4 text-bold mb-1\"},[_vm._v(\"Location\")]),_c('div',{staticClass:\"ml-3 nowrap\"},[(location.backend.countrycode && location.backend.countrycode != '')?_c('img',{staticClass:\"mr-1\",attrs:{\"src\":_vm.Utils.flag_img_src(location.backend.countrycode)}}):_vm._e(),_vm._v(\" \"+_vm._s(location.backend.name)+\", \"+_vm._s(location.backend.country)+\" \")]),_c('div',{staticClass:\"mt-4 d-flex justify-content-center\"},[(location.backend.is_gdpr)?_c('span',{staticClass:\"badge badge-success mr-1 ml-1 p-2 text-bold\",staticStyle:{\"font-size\":\"80%\"}},[_vm._v(\"GDPR\")]):_vm._e()])]:_vm._e()],2)])])])}),0)]):_vm._e(),_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.hide_storage_history),expression:\"!hide_storage_history\"}],staticClass:\"container\"},[_c('h3',{staticClass:\"mb-4\"},[_vm._v(\"Storage Usage\")]),_vm._m(5)])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('th',[_vm._v(\"Secure Shares \"),_c('i',{staticClass:\"ion-information-circled icon-lg ml-1\",attrs:{\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-content\":\"Mandatory password protection of shares\"}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('th',[_vm._v(\"E-mail Domain\"),_c('i',{staticClass:\"ion-information-circled icon-lg ml-1\",attrs:{\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-content\":\"When an email domain is set, anyone who has an email address from this domain can join your Team and access all Team files. New members will be required to prove owning the email address by clicking a link that we send when they register.\"}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('th',[_vm._v(\"Invited Users\"),_c('i',{staticClass:\"ion-information-circled icon-lg ml-1\",attrs:{\"data-container\":\"body\",\"data-toggle\":\"popover\",\"data-placement\":\"top\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-content\":\"You can invite members to your Team by their email addresses. If your set an email domain, you don't need to invite your colleagues who has email addresses from this domain.\"}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('p',[_c('i',[_vm._v(\"No one is invited\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('thead',[_c('th',[_vm._v(\"E-mail address\")]),_c('th',[_vm._v(\"Status\")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox\"},[_c('div',{staticClass:\"cardbox-body\"},[_c('div',{staticClass:\"flot-chart\",staticStyle:{\"height\":\"400px\"},attrs:{\"id\":\"spline-flotchart\"}})])])\n}]\n\nexport { render, staticRenderFns }","\n \n \n\n \n
\n
{{ user.team_settings.name }}
\n
\n
\n
{{ user.team_settings.name }} \n
\n
\n
\n\n \n
\n
\n
\n
Team Settings Edit \n
\n
{{ form_error }}
\n\t\t\t\t\t\t\n
\n\t\t\t\t\t\t\n \n \n Team Name \n \n {{ user.team_settings.name || \"Not set\" }} \n \n \n \n \n Website \n \n {{ user.team_settings.url || \"Not set\" }} \n \n \n \n \n \n New team logo \n Logo \n \n \n { form_data.logo_url = avatar_url }\"> \n \n \n No logo \n \n \n \n \n Secure Shares \n \n \n
\n No \n
\n
\n Yes \n
\n
\n \n
Yes\n
No\n
{{ form_data.unsafe_shares ? \"Team Members are allowed to create Shares without password protection\" : \"Every Share is protected by a strong, auto-generated password.\" }}
\n
\n \n \n \n User Quota \n Unlimited \n {{ user.team_settings.actual_user_number }} of {{ user.team_settings.max_user_number }} used ({{ Math.round( (user.team_settings.actual_user_number / user.team_settings.max_user_number) * 100 ) }}%) \n \n \n Storage Quota \n Unlimited \n {{ user.team_storage_used | format_bytes }} of {{ user.team_settings.max_storage | format_bytes }} used ({{ Math.round((user.team_storage_used / user.team_settings.max_storage) * 100) }}%) \n \n\t\t\t\t\t\t\t\t\n E-mail Domain New members will be required to prove owning the email address by clicking a link that we send when they register.\"> \n \n {{ user.team_settings.email_domain ? '@'+user.team_settings.email_domain : \"Not set\" }} \n \n @ \n \n
\n \n\t\t\t\t\t\t\t\t \n \n \n \n Cancel \n Save \n
\n \n \n \n\t\t\t\t\t\t\t\t\n Invited Users If your set an email domain, you don't need to invite your colleagues who has email addresses from this domain.\"> \n \n\t\t\t\t\t\t\t\t\t\t\n No one is invited
\n \n\t\t\t\t\t\t\t\t\t\t\n
\n \n E-mail address \n Status \n \n \n \n \n {{ email.email }} \n {{ email.used === true ? \"Used\" : (email.used === false ? \"Pending\" : \"...\") }} \n \n \n \n
\n\t\t\t\t\t\t\t\t\t\t
\n\n Invite by email \n \n
\n \n \n
\n \n Cancel \n Send invite \n
\n {{ additional_email_form.error }}
\n \n
\n\n\t\t\t\t\t\t\t\t\t \n \n\n \n\n
\n \n
\n
\n Loading \n
\n
\n
\n
\n\n 0\">\n
\n
Data Locations \n GDPR \n \n
All your files are distributed across these {{ cloud_locations.length }} locations.
\n\n
\n
loc.provider || loc.backend)\" :key=\"location.bucket_id\">\n
\n
\n
\n
\n \n \n
\n\n Cloud Platform
\n {{ location.provider.service_name }}\n
\n
\n \n
\n Location
\n \n
\n {{ location.backend.name }}, {{ location.backend.country }}\n
\n\n \n GDPR \n
\n \n\n
\n
\n
\n
\n
\n
\n\n \n\n \n\n \n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./team_settings.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./team_settings.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./team_settings.vue?vue&type=template&id=733c8192&scoped=true\"\nimport script from \"./team_settings.vue?vue&type=script&lang=js\"\nexport * from \"./team_settings.vue?vue&type=script&lang=js\"\nimport style0 from \"./team_settings.vue?vue&type=style&index=0&id=733c8192&prod&lang=css&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"733c8192\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.user && !_vm.user.is_admin)?_c('div',{staticClass:\"container pt-5\"},[_c('admin-warning-box')],1):(_vm.user)?_c('section',{staticClass:\"section-container\"},[_c('div',{staticClass:\"container container-lg\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-12\"},[(_vm.user.team_settings)?_c('div',{staticClass:\"mt-2 alert alert-info text-center\"},[_c('h5',[_vm._v(\"Join link to \"+_vm._s(_vm.user.team_settings.name)+\":\")]),_c('div',{staticClass:\"ml-2 text-bold\",staticStyle:{\"font-family\":\"monospace\",\"font-size\":\"1.5em\"}},[_c('a',{staticClass:\"text-white\",attrs:{\"href\":_vm._f(\"join_team_link\")(_vm.user.team_settings),\"target\":\"_BLANK\"}},[_vm._v(_vm._s(_vm._f(\"join_team_link\")(_vm.user.team_settings))+\" \"),_c('i',{staticClass:\"ion-share text-white\"})])]),_c('i',[_vm._v(\"New members can join if \"),(_vm.user.team_settings.email_domain)?_c('span',[_vm._v(\"they have a \"),_c('b',[_vm._v(\"@\"+_vm._s(_vm.user.team_settings.email_domain))]),_vm._v(\" email address or \")]):_vm._e(),_vm._v(\"they are \"),_c('router-link',{staticClass:\"text-white\",attrs:{\"to\":'/team-settings'}},[_c('u',[_vm._v(\"invited\")])]),_vm._v(\" by their email address. \")],1)]):_vm._e(),_c('div',{staticClass:\"cardbox\"},[_c('div',{staticClass:\"cardbox-body\"},[(_vm.user && _vm.team)?_c('table',{staticClass:\"table table-hover mb-0\"},[_vm._m(0),_c('tbody',_vm._l((_vm.team),function(member){return _c('tr',{key:member.id,staticClass:\"member-row\"},[_c('td',{staticStyle:{\"width\":\"1px\"}},[_c('img',{staticClass:\"thumb40 rounded fit-cover shadow-z3\",attrs:{\"src\":member.avatar_url,\"alt\":\"user\"}})]),_c('td',{class:{'text-bold': member.user_id === _vm.user.user_id}},[_vm._v(_vm._s(member.name)),(member.user_id === _vm.user.user_id)?_c('span',[_vm._v(\" (me)\")]):_vm._e(),(member.job_title)?_c('div',[_c('small',{staticClass:\"text-muted\"},[_vm._v(_vm._s(member.job_title))])]):_vm._e()]),_c('td',{staticClass:\"d-none d-sm-table-cell\",class:{'text-muted text-it': !member.confirmed}},[_vm._v(\" \"+_vm._s(member.email_address)+\" \"),(!member.confirmed)?_c('div',[_c('small',{staticClass:\"text-muted\"},[_c('span',{staticClass:\"mr-1\"},[_vm._v(\"Not confirmed\")]),(!member.re_sending_email)?_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.resend_email(member)}}},[_vm._v(\"Re-send email\")]):_vm._e(),(member.re_sending_email === _vm.resend_status.in_progress)?_c('i',{staticClass:\"ion-load-c spin\"}):_vm._e(),(member.re_sending_email > _vm.resend_status.in_progress)?_c('span',{class:{'text-success': member.re_sending_email == _vm.resend_status.success, 'text-danger': member.re_sending_email == _vm.resend_status.failed}},[_vm._v(_vm._s(member.re_sending_email === _vm.resend_status.success ? 'Email sent' : member.re_sending_email_err))]):_vm._e()])]):_vm._e()]),_c('td',[(member.roles)?_c('div',{staticClass:\"text-sm\"},[_c('span',[_vm._l((member.roles),function(role){return _c('div',{key:role.role,staticClass:\"nowrap\",class:{'text-muted text-it': !role.has}},[_vm._v(\" \"+_vm._s(_vm._f(\"rolename\")(role.role))+\" \"),(role.has)?_c('i',{staticClass:\"ion-checkmark-round ml-1\",class:{'view_status': role.role !='EM'}}):_vm._e(),_c('span',{staticClass:\"edit_status\"},[(role.has && role.role != 'EM')?_c('span',{attrs:{\"title\":'Remove role'}},[_c('i',{staticClass:\"icon-lg ml-1\",class:{'ion-load-c spin': role.loading, 'text-danger ion-minus-circled pointer': !role.loading},on:{\"click\":function($event){return _vm.change_role(member, role)}}})]):_vm._e(),(!role.has)?_c('span',{attrs:{\"title\":\"Add role\"}},[_c('i',{staticClass:\"icon-lg ml-1\",class:{'ion-load-c spin': role.loading, 'text-success ion-plus-circled pointer': !role.loading},attrs:{\"disabled\":true},on:{\"click\":function($event){return _vm.change_role(member, role)}}})]):_vm._e()])])}),(member.change_role_error)?_c('div',{staticClass:\"text-danger text-sm\"},[_vm._v(_vm._s(member.change_role_error))]):_vm._e()],2)]):_c('i',{staticClass:\"ion-load-c spin\"})]),_c('td',{staticClass:\"d-none d-sm-table-cell\"},[_vm._v(_vm._s(_vm._f(\"timestamp_rel\")(member.created))+\" \"),_c('i',{staticClass:\"ion-calendar ml-1 text-muted\",staticStyle:{\"cursor\":\"help\"},attrs:{\"title\":_vm._f(\"timestamp\")(member.created)}})]),_c('td',[_c('button',{staticClass:\"btn btn-secondary\",attrs:{\"type\":\"button\",\"data-toggle\":\"modal\",\"data-target\":\"#member-details\"},on:{\"click\":function($event){_vm.view_member = member}}},[_vm._v(\" Edit \"),_c('i',{staticClass:\"ion-edit ml-2\"})])])])}),0)]):_vm._e()])])])])]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"member-details\"}},[(_vm.view_member)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_c('img',{staticClass:\"thumb40 rounded fit-cover mr-2\",staticStyle:{\"border\":\"2px solid #ebebeb\"},attrs:{\"src\":_vm._f(\"avatar_url\")(_vm.view_member),\"alt\":\"user\"}}),_c('b',[_vm._v(_vm._s(_vm.view_member.name))])]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.closeModal()}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('edit-user-form',{attrs:{\"user\":_vm.view_member,\"close-form\":_vm.closeModal,\"edit-mode\":true,\"browse-image\":false,\"is-admin\":_vm.user && _vm.user.is_admin}}),_c('hr'),_c('div',{staticClass:\"d-flex justify-content-center align-items-center mt-2\"},[_c('button',{staticClass:\"btn btn-danger btn-gradient\",attrs:{\"type\":\"button\",\"disabled\":_vm.view_member.delete_loading},on:{\"click\":function($event){return _vm.delete_user(_vm.view_member)}}},[_vm._v(\"Delete \"+_vm._s(_vm.view_member.name)),(_vm.view_member.delete_loading)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):_vm._e()]),(!_vm.view_member.delete_error)?_c('small',{staticClass:\"ml-3 text-danger\"},[_vm._v(\" When you delete someone, they are logged out and immediately lose access to all files and the SkyFlok applications. However, the files they already downloaded stay on their devices. \")]):_c('div',{staticClass:\"ml-3 text-danger\"},[_vm._v(_vm._s(_vm.view_member.delete_error))])])],1)])]):_vm._e()])]):_vm._e()\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('thead',[_c('th'),_c('th',[_vm._v(\"Name\")]),_c('th',{staticClass:\"d-none d-sm-table-cell\"},[_vm._v(\"Email address\")]),_c('th',[_vm._v(\"Roles\")]),_c('th',{staticClass:\"d-none d-sm-table-cell\"},[_vm._v(\"Registered\")]),_c('th')])\n}]\n\nexport { render, staticRenderFns }","\n\n\n\n
\n
\n\n
\n
Join link to {{ user.team_settings.name }}: \n
\n
New members can join if they have a @{{ user.team_settings.email_domain }} email address or they are invited by their email address. \n
\n\n
\n
\n\n
\n \n \n Name \n Email address \n \n Roles \n Registered \n \n \n \n \n \n \n \n {{ member.name }} (me) {{ member.job_title }}
\n\n \n \n {{ member.email_address }}\n \n
\n Not confirmed \n Re-send email \n \n resend_status.in_progress\" :class=\"{'text-success': member.re_sending_email == resend_status.success, 'text-danger': member.re_sending_email == resend_status.failed}\">{{ member.re_sending_email === resend_status.success ? 'Email sent' : member.re_sending_email_err }} \n \n
\n \n\n \n \n\n \n \n \n
\n \n {{ role.role | rolename }}\n \n\n \n \n \n \n \n \n \n \n
\n {{member.change_role_error}}
\n \n\n
\n \n \n {{ member.created | timestamp_rel }} \n \n \n Edit \n \n \n \n \n
\n
\n
\n
\n
\n
\n\n\n
\n
\n \n
\n\n
\n
\n \n\n\n
\n
Delete {{ view_member.name }} \n
\n When you delete someone, they are logged out and immediately lose access to all files and the SkyFlok applications.\n However, the files they already downloaded stay on their devices.\n \n
{{ view_member.delete_error }}
\n
\n\n \n
\n
\n
\n
\n \n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./user_management.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./user_management.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./user_management.vue?vue&type=template&id=5c190a18&scoped=true\"\nimport script from \"./user_management.vue?vue&type=script&lang=js\"\nexport * from \"./user_management.vue?vue&type=script&lang=js\"\nimport style0 from \"./user_management.vue?vue&type=style&index=0&id=5c190a18&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5c190a18\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\",attrs:{\"id\":\"team-setup-container\"}},[_c('div',{staticClass:\"container-overlap bg-gradient-info d-none d-sm-block\"}),_c('div',{staticClass:\"container container-md d-block carousel\",attrs:{\"id\":\"setup_form_carousel\",\"data-interval\":\"0\",\"data-wrap\":\"false\",\"data-pause\":\"false\"}},[_c('div',{staticClass:\"cardbox fh pt-3\",staticStyle:{\"min-height\":\"42em\"}},[_c('div',{staticClass:\"cardbox-body px-5 pb-0\"},[_c('div',{staticClass:\"progress\",class:{'bg-white': _vm.current_slide_idx == 0 || _vm.current_slide_idx > 2},staticStyle:{\"height\":\"5px\"}},[(_vm.current_slide_idx <= _vm.total_steps_num)?_c('div',{staticClass:\"progress-bar bg-skyflok\",style:({width: (_vm.current_slide_idx/_vm.total_steps_num)*100 + '%' }),attrs:{\"role\":\"progressbar\"}}):_vm._e()])]),_c('div',{staticClass:\"carousel-inner\",staticStyle:{\"overflow\":\"visible\"}},[_c('div',{staticClass:\"carousel-item active p-4\"},[_c('div',{staticClass:\"cardbox-body fw fh text-center welcome-header\",class:{'p-0': _vm.Utils.is_mobile(), 'px-5': !_vm.Utils.is_mobile()}},[_vm._m(0),_c('p',{staticClass:\"pt-5 mt-5 text-12\"},[_vm._v(\"Thank you for signing up, we are glad you are here!\")]),_c('p',{staticClass:\"pt-2 text-12\"},[_vm._v(\"Before you can start using SkyFlok, there are a few things to set up.\")]),_c('div',{staticClass:\"pt-5 mt-5 text-center\"},[(_vm.invite_error && !_vm.invite_loading)?_c('div',{staticClass:\"alert alert-danger text-bold\"},[_vm._v(_vm._s(_vm.invite_error))]):_c('button',{staticClass:\"btn btn-lg text-12 btn-skyflok wizard-nav px-4\",attrs:{\"disabled\":_vm.invite_loading,\"data-slide\":\"next\",\"href\":\"#setup_form_carousel\"}},[_vm._v(\" Start\"),_c('i',{class:{'ion-load-c spin': _vm.invite_loading, 'ion-arrow-right-c': _vm.invite}})])])])]),_c('div',{staticClass:\"carousel-item p-4\"},[_c('div',{staticClass:\"cardbox-body fw\",class:{'p-0': _vm.Utils.is_mobile()}},[_c('h4',{staticClass:\"px-4\"},[_vm._v(\"Our Unique Technology\")]),_c('p',{staticClass:\"px-1 py-3\",class:{'text-center': _vm.Utils.is_mobile(), 'px-4': !_vm.Utils.is_mobile()}},[_vm._v(\" SkyFlok uses a unique patented technology to store your files. They are encrypted in your browser and distributed to multiple locations for improved security, availability and privacy. \"),_c('br'),_vm._v(\"You can select these locations in the next step. \")]),_c('div',{staticClass:\"fw text-center mt-4\",class:{'mb-3': _vm.Utils.is_mobile()}},[_c('video',{class:{'fw': _vm.Utils.is_mobile(), 'width-80p': !_vm.Utils.is_mobile()},attrs:{\"id\":\"explainer-video\",\"autoplay\":\"\",\"muted\":\"\",\"loop\":\"\",\"playsinline\":\"\"},domProps:{\"muted\":true}},[_c('source',{attrs:{\"src\":\"assets/videos/skyflok-file-upload.webm\",\"type\":\"video/webm\"}}),_c('source',{attrs:{\"src\":\"assets/videos/skyflok-file-upload.mov\",\"type\":\"video/quicktime\"}})])]),_vm._m(1)])]),_c('div',{staticClass:\"carousel-item p-4\"},[_c('div',{staticClass:\"cardbox-body fw\",class:{'p-0': _vm.Utils.is_mobile()}},[_c('h4',{staticClass:\"px-4\"},[_vm._v(\"File Locations\")]),_c('p',{staticClass:\"px-1 py-3\",class:{'text-center': _vm.Utils.is_mobile(), 'px-4': !_vm.Utils.is_mobile()}},[_vm._v(\" The following selection of our 50+ worldwide storage locations provide the fastest file transfers in your region. \")]),(!_vm.customize_locations)?_c('div',{staticClass:\"fw d-flex align-items-center justify-content-center\",class:{'px-3': !_vm.Utils.is_mobile()}},[(_vm.location_suggestion_loading)?_c('div',{staticClass:\"d-flex align-items-center justify-content-center\",staticStyle:{\"height\":\"25em\"}},[_c('span',[_vm._v(\"Loading recommendation\")]),_c('i',{staticClass:\"ion-load-c spin ml-2 color-skyflok text-md\"})]):(_vm.suggested_locations.length)?_c('table',{staticClass:\"table table-skyflok m-0\",class:{'width-75p': !_vm.Utils.is_mobile()}},[_c('thead',[_c('th',{staticClass:\"text-center\"},[_vm._v(\"Provider\")]),_c('th',[_vm._v(\"Location\")]),_c('th',{staticClass:\"text-center width-0 nowrap\"},[_vm._v(\"GDPR \"),_c('info-icon',{attrs:{\"content\":\"Whether this location is GDPR-compliant\"}})],1)]),_c('tbody',_vm._l((_vm.suggested_locations),function(location){return _c('tr',{key:location.id},[_c('td',{staticClass:\"text-center\"},[(location.provider_logo)?_c('img',{staticClass:\"cloud-provider-logo\",attrs:{\"src\":_vm.Utils.cloud_provider_logo_src(location.provider_logo)}}):_c('span',[_vm._v(_vm._s(location.provider_name))])]),_c('td',[_c('storage-location-cell',{attrs:{\"location\":location.location}})],1),_c('td',{staticClass:\"text-center\"},[_c('i',{staticClass:\"text-12\",class:{'ion-checkmark-circled color-skyflok': location.is_gdpr, 'ion-close-circled text-danger': !location.is_gdpr}})])])}),0)]):_vm._e()]):_c('div',[(!_vm.all_locations.length)?_c('div',{staticClass:\"d-flex align-items-center justify-content-center\",staticStyle:{\"height\":\"25em\"}},[_c('span',[_vm._v(\"Loading all locations...\")]),_c('i',{staticClass:\"ion-load-c spin color-skyflok ml-2 text-md\"})]):_c('div',[_c('div',{staticClass:\"fw d-flex align-items-top justify-content-center\",class:{'px-3': !_vm.Utils.is_mobile()},staticStyle:{\"min-height\":\"20em\"}},[(!_vm.show_map)?_c('table',{staticClass:\"table table-skyflok m-0\"},[_c('thead',[_c('th',{staticClass:\"width-0\"}),_c('th',{staticClass:\"text-center dropdown\"},[_c('div',{staticClass:\"dropdown-toggle c-pointer nowrap\",attrs:{\"data-toggle\":\"dropdown\"}},[_vm._v(\" Provider\")]),_c('div',{staticClass:\"dropdown-menu mt-1 px-3\",on:{\"click\":function($event){$event.stopPropagation();return (()=>{}).apply(null, arguments)}}},_vm._l((_vm.location_filter.providers),function(provider){return _c('div',{key:provider.id,staticClass:\"m-3\",class:{'my-3': !_vm.Utils.is_mobile()}},[_c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(provider.checked),expression:\"provider.checked\"}],staticClass:\"form-check-input\",attrs:{\"type\":\"checkbox\",\"id\":`checkbox-provider-${provider.id}`},domProps:{\"checked\":Array.isArray(provider.checked)?_vm._i(provider.checked,null)>-1:(provider.checked)},on:{\"change\":function($event){var $$a=provider.checked,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(provider, \"checked\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(provider, \"checked\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(provider, \"checked\", $$c)}}}}),_c('label',{staticClass:\"form-check-label nowrap\",attrs:{\"for\":`checkbox-provider-${provider.id}`}},[_vm._v(_vm._s(provider.name)),_c('small',[_vm._v(\" (\"+_vm._s(provider.locations_num)+\")\")])])])])}),0)]),_c('th',{staticClass:\"dropdown\"},[_c('div',{staticClass:\"dropdown-toggle c-pointer nowrap\",attrs:{\"data-toggle\":\"dropdown\"}},[_vm._v(\" Location \")]),_c('div',{staticClass:\"dropdown-menu mt-1 px-3\",on:{\"click\":function($event){$event.stopPropagation();return (()=>{}).apply(null, arguments)}}},_vm._l((_vm.location_filter.countries),function(country){return _c('div',{key:country.countrycode,staticClass:\"m-2\",class:{'my-3': !_vm.Utils.is_mobile()}},[_c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(country.checked),expression:\"country.checked\"}],staticClass:\"form-check-input\",attrs:{\"type\":\"checkbox\",\"id\":`checkbox-location-${country.countrycode}`},domProps:{\"checked\":Array.isArray(country.checked)?_vm._i(country.checked,null)>-1:(country.checked)},on:{\"change\":function($event){var $$a=country.checked,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(country, \"checked\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(country, \"checked\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(country, \"checked\", $$c)}}}}),_c('label',{staticClass:\"form-check-label nowrap\",attrs:{\"for\":`checkbox-location-${country.countrycode}`}},[_vm._v(\" \"+_vm._s(country.name)+\" \"),_c('img',{staticClass:\"ml-2\",attrs:{\"src\":_vm.Utils.flag_img_src(country.countrycode),\"height\":\"20\"}}),_c('small',{staticClass:\"ml-2\"},[_vm._v(\" (\"+_vm._s(country.num)+\")\")])])])])}),0)]),_c('th',{staticClass:\"text-center width-0 nowrap dropdown\"},[_c('div',{staticClass:\"dropdown-toggle c-pointer nowrap\",attrs:{\"data-toggle\":\"dropdown\"}},[_vm._v(\" GDPR \")]),_c('div',{staticClass:\"dropdown-menu mt-1 px-3\",class:{'dropdown-menu-right': _vm.Utils.is_mobile()},on:{\"click\":function($event){$event.stopPropagation();return (()=>{}).apply(null, arguments)}}},[_c('div',{staticClass:\"mx-2 my-2\",class:{'my-3': !_vm.Utils.is_mobile()}},[_c('checkbox',{attrs:{\"label\":\"GDPR locations\",\"value\":_vm.location_filter.gdpr.yes},on:{\"changed\":newval => _vm.location_filter.gdpr.yes = newval}})],1),_c('div',{staticClass:\"mx-2 my-2\",class:{'my-3': !_vm.Utils.is_mobile()}},[_c('checkbox',{attrs:{\"label\":\"Non-GDPR locations\",\"value\":_vm.location_filter.gdpr.no},on:{\"changed\":newval => _vm.location_filter.gdpr.no = newval}})],1)])]),(_vm.all_locations.length && _vm.all_locations[0].distance_km !== null)?_c('th',{staticClass:\"width-0 d-none d-sm-table-cell nowrap\"},[_vm._v(\" Distance \"),_c('info-icon',{attrs:{\"content\":\"Approximate distance from you, estimated from your IP address.\",\"custom_class\":\"text-gray\"}})],1):_vm._e()]),_c('tbody',[(_vm.is_filtered)?_c('tr',[_c('td',{attrs:{\"colspan\":\"5\"}},[_c('div',{staticClass:\"p-1\"},[_vm._l((_vm.location_filter.providers.filter(p => p.checked)),function(provider){return _c('span',{key:'provider-'+provider.id,staticClass:\"btn btn-sm btn-oval btn-skyflok-outline m-1\",on:{\"click\":function($event){provider.checked = false}}},[_vm._v(\" \"+_vm._s(provider.name)+\" \"),_c('i',{staticClass:\"ion-close ml-1\"})])}),_vm._l((_vm.location_filter.countries.filter(p => p.checked)),function(country){return _c('span',{key:'country-'+country.countrycode,staticClass:\"btn btn-sm btn-oval btn-skyflok-outline m-1\",on:{\"click\":function($event){country.checked = false}}},[_vm._v(\" \"+_vm._s(country.name)+\" \"),_c('i',{staticClass:\"ion-close ml-1\"})])}),(_vm.location_filter.gdpr.yes)?_c('span',{staticClass:\"btn btn-sm btn-oval btn-skyflok-outline m-1\",on:{\"click\":function($event){_vm.location_filter.gdpr.yes = false}}},[_vm._v(\" GDPR \"),_c('i',{staticClass:\"ion-close ml-1\"})]):_vm._e(),(_vm.location_filter.gdpr.no)?_c('span',{staticClass:\"btn btn-sm btn-oval btn-skyflok-outline m-1\",on:{\"click\":function($event){_vm.location_filter.gdpr.no = false}}},[_vm._v(\" Not GDPR \"),_c('i',{staticClass:\"ion-close ml-1\"})]):_vm._e()],2)])]):_vm._e(),_vm._l((_vm.locations_page),function(location){return _c('tr',{key:location.id,class:{'selected-row': location.selected, 'c-pointer': location.selected || _vm.custom_locations_selected.length < 6},on:{\"click\":function($event){location.selected = !location.selected}}},[_c('td',[_c('div',{staticClass:\"m-0 ml-3 p-0\"},[_c('checkbox',{attrs:{\"value\":location.selected},on:{\"changed\":newval => location.selected = newval}})],1)]),_c('td',{staticClass:\"text-center\"},[(!_vm.Utils.is_mobile() && location.provider_logo)?_c('img',{staticClass:\"cloud-provider-logo\",attrs:{\"src\":_vm.Utils.cloud_provider_logo_src(location.provider_logo)}}):_c('span',[_vm._v(_vm._s(location.provider_name))])]),_c('td',[_c('storage-location-cell',{attrs:{\"location\":location.location}})],1),_c('td',{staticClass:\"text-center\"},[_c('i',{staticClass:\"text-12\",class:{'ion-checkmark-circled color-skyflok': location.is_gdpr, 'ion-close-circled': !location.is_gdpr}})]),(location.distance_km !== null)?_c('td',{staticClass:\"d-none d-sm-table-cell\"},[_vm._v(\" \"+_vm._s(_vm._f(\"round_up_100\")(location.distance_km))+\" km \")]):_vm._e()])})],2)]):_vm._e()]),_c('div',{staticClass:\"d-flex items-center justify-content-end mt-1\",class:{'px-3': !_vm.Utils.is_mobile()}},[(false)?_c('button',{staticClass:\"btn btn-sm btn-skyflok-outline my-1 ml-0\",attrs:{\"type\":\"button\"},on:{\"click\":() => { _vm.show_map = !_vm.show_map }}},[_c('i',{staticClass:\"mr-1\",class:{'ion-map': !_vm.show_map, 'ion-navicon-round': _vm.show_map}}),_vm._v(_vm._s(_vm.show_map ? 'Table' : 'Map'))]):_vm._e(),_c('div',[(!_vm.show_map)?_c('table-pager',{attrs:{\"data\":_vm.all_locations_filtered,\"is_filtered\":_vm.is_filtered,\"update\":(data_page) => { _vm.locations_page = data_page },\"initial_page_size\":8,\"disable_pagesize_selector\":true,\"disable_filtered_label\":true,\"records_name\":\"locations\"}}):_vm._e()],1)])])]),_c('div',{staticClass:\"text-center text-sm mt-2\"},[(!_vm.customize_locations)?_c('a',{staticClass:\"color-skyflok\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){_vm.customize_locations=true}}},[_vm._v(\"Customize file locations\")]):(!_vm.location_suggestion_failed)?_c('a',{staticClass:\"color-skyflok text-12\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){_vm.customize_locations=false}}},[_vm._v(\"Back to suggested locations\")]):_vm._e()]),_c('div',{staticClass:\"row mt-3\"},[_vm._m(2),_c('div',{staticClass:\"col-6 text-right\"},[_c('button',{staticClass:\"btn btn-lg btn-skyflok wizard-nav\",attrs:{\"disabled\":!_vm.locations_ok,\"data-slide\":\"next\",\"href\":\"#setup_form_carousel\"}},[(_vm.locations_ok)?_c('span',[_vm._v(\"Next \"),_c('i',{staticClass:\"ion-arrow-right-c\"})]):(_vm.custom_locations_selected.length < 6)?_c('span',[_vm._v(\"Select \"+_vm._s(6-_vm.custom_locations_selected.length)+\" more\")]):(_vm.custom_locations_selected.length > 6)?_c('span',[_vm._v(\"Remove \"+_vm._s(_vm.custom_locations_selected.length-6)+\" location\"+_vm._s(_vm.custom_locations_selected.length-6 == 1 ? '' : 's'))]):_vm._e()])])])])]),_c('div',{staticClass:\"carousel-item p-4\"},[_c('div',{staticClass:\"cardbox-body fw mx-1\",class:{'p-0': _vm.Utils.is_mobile(), 'mx-4': !_vm.Utils.is_mobile()}},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_form.apply(null, arguments)}}},[_c('h4',[_vm._v(\"Your Account\")]),_c('p',{staticClass:\"pt-1 pb-3\",class:{'text-justify': _vm.Utils.is_mobile()}},[_vm._v(\" Choose a name for your SkyFlok Team and fill the details of your user account. \")]),(_vm.user_form)?_c('div',{staticClass:\"row mt-4 user-form\"},[(_vm.form_error)?_c('div',{staticClass:\"col-12\",class:{'pr-4': !_vm.Utils.is_mobile()}},[_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.form_error))])]):_vm._e(),_c('div',{staticClass:\"col-12 col-md-6\",class:{'pr-4': !_vm.Utils.is_mobile()}},[_c('input',{attrs:{\"type\":\"hidden\",\"name\":\"storage_location_ids\"},domProps:{\"value\":_vm.selected_location_ids.join(',')}}),_c('input',{attrs:{\"type\":\"hidden\",\"name\":\"invite_key\"},domProps:{\"value\":_vm.invite_key}}),_c('label',{staticStyle:{\"padding-top\":\"0px\"},attrs:{\"for\":\"register_team_name pt-0 mt-0\"}},[_vm._v(\"SkyFlok Team Name\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user_form.team_name),expression:\"user_form.team_name\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"register_team_name\",\"name\":\"team_name\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.user_form.team_name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.user_form, \"team_name\", $event.target.value)}}}),_c('label',{attrs:{\"for\":\"register_name pt-0 mt-0\"}},[_vm._v(\"Your Name\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user_form.name),expression:\"user_form.name\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"id\":\"register_name\",\"name\":\"person_name\",\"maxlength\":\"255\",\"autocomplete\":\"name\"},domProps:{\"value\":(_vm.user_form.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.user_form, \"name\", $event.target.value)}}}),_c('label',{attrs:{\"for\":\"register_email\"}},[_vm._v(\"Email Address\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user_form.email),expression:\"user_form.email\"}],staticClass:\"form-control\",attrs:{\"type\":\"email\",\"id\":\"register_email\",\"readonly\":\"\",\"name\":\"email\",\"autocomplete\":\"username email\"},domProps:{\"value\":(_vm.user_form.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.user_form, \"email\", $event.target.value)}}}),_c('label',{attrs:{\"for\":\"register_password\"}},[_vm._v(\"Password\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user_form.password),expression:\"user_form.password\"}],staticClass:\"form-control\",attrs:{\"type\":\"password\",\"id\":\"register_password\",\"name\":\"password\",\"autocomplete\":\"new-password\",\"placeholder\":\"At least 8 characters\"},domProps:{\"value\":(_vm.user_form.password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.user_form, \"password\", $event.target.value)}}}),_c('password-strength-meter',{attrs:{\"password_strength\":_vm.password_strength}}),_c('div',{staticClass:\"fw\"},[_c('div',{staticClass:\"form-check\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.user_form.terms_accepted),expression:\"user_form.terms_accepted\"}],staticClass:\"form-check-input\",attrs:{\"type\":\"checkbox\",\"name\":\"terms_accepted\",\"id\":\"terms-accepted\"},domProps:{\"value\":1,\"checked\":Array.isArray(_vm.user_form.terms_accepted)?_vm._i(_vm.user_form.terms_accepted,1)>-1:(_vm.user_form.terms_accepted)},on:{\"change\":function($event){var $$a=_vm.user_form.terms_accepted,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=1,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.user_form, \"terms_accepted\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.user_form, \"terms_accepted\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.user_form, \"terms_accepted\", $$c)}}}}),_vm._m(3)])])],1),_c('div',{staticClass:\"col-12 col-md-6\",class:{'pl-4 mt-4': !_vm.Utils.is_mobile(), 'pt-3': _vm.Utils.is_mobile()}},[_c('invite-config-box',{attrs:{\"invite\":_vm.invite}})],1)]):_vm._e(),_c('div',{staticClass:\"row mt-5\"},[_c('div',{staticClass:\"col-4 text-left\"},[(!_vm.form_loading)?_c('button',{staticClass:\"btn btn-lg btn-secondary\",attrs:{\"type\":\"button\",\"data-slide\":\"prev\",\"href\":\"#setup_form_carousel\"}},[_c('i',{staticClass:\"ion-arrow-left-c\"}),_c('span',{staticClass:\"d-none d-md-inline-block ml-2\"},[_vm._v(\"Back\")])]):_vm._e()]),_c('div',{staticClass:\"col-4 text-center\"},[_c('button',{staticClass:\"btn btn-lg text-12 btn-skyflok\",attrs:{\"type\":\"submit\",\"disabled\":!_vm.user_form_ok || _vm.form_loading}},[_vm._v(\" Finish Setup \"),(_vm.form_loading)?_c('i',{staticClass:\"ml-2 ion-load-c spin\"}):_vm._e()]),(_vm.submit_error_msg)?_c('div',{staticClass:\"text-danger text-center mt-1 text-sm\"},[_vm._v(_vm._s(_vm.submit_error_msg))]):_vm._e()])])])])]),_c('div',{staticClass:\"carousel-item p-4\"},[_c('div',{staticClass:\"cardbox-body fw\",staticStyle:{\"height\":\"20em\"}},[_c('div',{staticClass:\"fw fh text-center pt-5\"},[_c('h2',{staticClass:\"text-success\"},[_vm._v(\"Your Account is Ready!\")]),_c('div',{staticClass:\"py-5 d-flex justify-content-center\"},[_c('div',{staticClass:\"width-25p\",class:{'width-75p': _vm.Utils.is_mobile()}},[_c('img',{staticStyle:{\"max-width\":\"100%\"},attrs:{\"src\":require(\"@/assets/img/illustrations/moving_forward-success.svg\")}})])]),(_vm.invite)?_c('div',{staticClass:\"mt-5 fw text-center text-14\"},[_vm._v(\" Redirecting to \"),_c('router-link',{staticClass:\"color-skyflok text-underline\",attrs:{\"to\":'/login?email='+encodeURIComponent(_vm.invite.invited_email_address)}},[_vm._v(\"Login\")]),_vm._v(\" in... \"+_vm._s(_vm.redirect_timer_sec)+\" \")],1):_vm._e()])])])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('h2',{staticClass:\"py-3 d-flex align-items-center justify-content-center\"},[_c('span',[_vm._v(\"Welcome to \"),_c('span',{staticClass:\"color-skyflok mx-2\"},[_vm._v(\"SkyFlok \")])]),_c('img',{attrs:{\"src\":require(\"@/assets/img/skyflok-badge.png\"),\"width\":\"40px\"}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"fw text-right mt-3\"},[_c('button',{staticClass:\"btn btn-lg btn-skyflok wizard-nav\",attrs:{\"data-slide\":\"next\",\"href\":\"#setup_form_carousel\"}},[_vm._v(\" Next\"),_c('i',{staticClass:\"ion-arrow-right-c\"})])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-6 text-left\"},[_c('button',{staticClass:\"btn btn-lg btn-secondary\",attrs:{\"type\":\"button\",\"data-slide\":\"prev\",\"href\":\"#setup_form_carousel\"}},[_c('i',{staticClass:\"ion-arrow-left-c\"}),_c('span',{staticClass:\"d-none d-md-inline-block ml-2\"},[_vm._v(\"Back\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('label',{staticClass:\"form-check-label nowrap\",attrs:{\"for\":\"terms-accepted\"}},[_vm._v(\" I accept the \"),_c('a',{staticClass:\"color-skyflok\",attrs:{\"href\":\"https://www.skyflok.com/legal/\",\"target\":\"_blank\"}},[_vm._v(\"SkyFlok Terms & Conditions\")])])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return (_vm.data && _vm.data.length)?_c('section',{staticClass:\"d-inline-block\"},[_c('div',{staticClass:\"pager noselect mb-2 d-block\"},[_c('div',{staticClass:\"text-right\"},[(_vm.is_filtered && !_vm.disable_filtered_label)?_c('span',{staticClass:\"text-right mr-2\"},[_c('small',[_vm._v(\"Showing \"),_c('b',[_vm._v(_vm._s(_vm.data_page.length)+\" of \"+_vm._s(_vm.data.length))]),_vm._v(\" filtered \"+_vm._s(_vm.records_name ? _vm.records_name : 'records')+\".\")])]):_vm._e(),(!_vm.disable_pagesize_selector)?_c('small',[_vm._v(\" Page size: \"),_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.page_size),expression:\"page_size\"}],staticClass:\"form-control form-control-sm d-inline-block p-1\",staticStyle:{\"width\":\"55px\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.page_size=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{domProps:{\"value\":5}},[_vm._v(\"5\")]),_c('option',{domProps:{\"value\":10}},[_vm._v(\"10\")]),_c('option',{domProps:{\"value\":20}},[_vm._v(\"20\")]),_c('option',{domProps:{\"value\":50}},[_vm._v(\"50\")]),_c('option',{domProps:{\"value\":100}},[_vm._v(\"100\")])])]):_vm._e()]),_c('div',{staticClass:\"text-right pager-button\"},[_c('div',{staticClass:\"d-inline-block p-1 m-1 c-pointer\",class:{'disabled': _vm.page <= 1},on:{\"click\":function($event){_vm.page > 1 ? _vm.page = _vm.page-1 : false}}},[_c('i',{staticClass:\"ion-chevron-left\"})]),_vm._l((_vm.range(_vm.total_pages)),function(p){return _c('div',{key:p,staticClass:\"d-inline-block px-2 c-pointer\",class:{'bg-skyflok text-white active': (p == _vm.page)},on:{\"click\":function($event){_vm.page = p}}},[_vm._v(_vm._s(p))])}),_c('div',{staticClass:\"d-inline-block p-1 m-1 c-pointer\",class:{'disabled': _vm.page >= _vm.total_pages},on:{\"click\":function($event){_vm.page < _vm.total_pages ? _vm.page = _vm.page+1 : false}}},[_c('i',{staticClass:\"ion-chevron-right\"})])],2)])]):_vm._e()\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./table-pager.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./table-pager.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./table-pager.vue?vue&type=template&id=59c4d529&scoped=true\"\nimport script from \"./table-pager.vue?vue&type=script&lang=js\"\nexport * from \"./table-pager.vue?vue&type=script&lang=js\"\nimport style0 from \"./table-pager.vue?vue&type=style&index=0&id=59c4d529&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"59c4d529\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"Password__strength-meter\"},[_c('div',{staticClass:\"Password__strength-meter--fill\",attrs:{\"data-score\":_vm.password_strength}})])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n \n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./psw-strength-meter.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./psw-strength-meter.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./psw-strength-meter.vue?vue&type=template&id=bac31066&scoped=true\"\nimport script from \"./psw-strength-meter.vue?vue&type=script&lang=js\"\nexport * from \"./psw-strength-meter.vue?vue&type=script&lang=js\"\nimport style0 from \"./psw-strength-meter.vue?vue&type=style&index=0&id=bac31066&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"bac31066\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"d-flex align-items-center\",class:{'gap-2': !_vm.Utils.is_mobile()}},[_c('img',{staticClass:\"mr-2\",attrs:{\"src\":_vm.Utils.flag_img_src(_vm.location.countrycode),\"height\":\"20\"}}),(_vm.Utils.is_mobile())?_c('div',[_c('div',[_vm._v(_vm._s(_vm.location.city))]),_c('div',{staticClass:\"text-sm\"},[_vm._v(_vm._s(_vm.location.country))])]):_c('span',[_vm._v(_vm._s(_vm.location.city)+\", \"+_vm._s(_vm.location.country))])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n
\n
\n
{{location.city}}
\n
{{location.country}}
\n
\n
{{location.city}}, {{location.country}} \n
\n \n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./storage_location.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./storage_location.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./storage_location.vue?vue&type=template&id=7d9dca3b\"\nimport script from \"./storage_location.vue?vue&type=script&lang=js\"\nexport * from \"./storage_location.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n \n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./team_setup.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./team_setup.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./team_setup.vue?vue&type=template&id=69a5f50a&scoped=true\"\nimport script from \"./team_setup.vue?vue&type=script&lang=js\"\nexport * from \"./team_setup.vue?vue&type=script&lang=js\"\nimport style0 from \"./team_setup.vue?vue&type=style&index=0&id=69a5f50a&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"69a5f50a\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"layout-container\",class:{'bg-gradient-danger': _vm.error !== false, 'bg-gradient-info': _vm.error === false},staticStyle:{\"overflow\":\"overlay\"}},[_c('div',{staticClass:\"page-container\"},[_c('div',{staticClass:\"container\",class:{'narrow': !_vm.share}},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-1\"}),_c('div',{staticClass:\"col-12 col-lg-10\"},[_c('div',{staticClass:\"cardbox mt-5\",attrs:{\"id\":\"main-box\"}},[_c('div',{staticClass:\"cardbox-heading\"},[(_vm.share && _vm.share.team_info)?_c('div',{staticClass:\"cardbox-title\"},[_c('div',{staticClass:\"d-flex justify-content-center align-items-center\"},[_c('div',{staticClass:\"text-md\"},[_vm._v(\"Your shared files from \"+_vm._s(_vm.share.team_info.name))]),(_vm.share.team_info.logo_url && _vm.share.team_info.logo_url != '')?_c('img',{staticClass:\"ml-2\",staticStyle:{\"max-height\":\"48px\"},attrs:{\"src\":_vm.share.team_info.logo_url}}):_vm._e()]),_c('div',{staticStyle:{\"clear\":\"both\"}})]):_vm._e()]),_c('div',{staticClass:\"cardbox-body\",attrs:{\"id\":\"main-box-body\"}},[(_vm.error)?_c('div',{staticClass:\"text-center\"},[_c('div',{staticClass:\"alert alert-danger\",staticStyle:{\"display\":\"inline-block\",\"min-width\":\"60%\"},domProps:{\"innerHTML\":_vm._s(_vm.error)}})]):_vm._e(),(_vm.share_loading)?_c('div',[_c('i',{staticClass:\"ion-load-c icon-lg spin text-info\"})]):_vm._e(),(_vm.share_password_needed && !_vm.share)?_c('div',{staticClass:\"text-center\",staticStyle:{\"width\":\"450px\",\"margin\":\"0px auto\",\"display\":\"grid\",\"grid-template-columns\":\"140px 1fr\"}},[_vm._m(0),_c('div',{staticClass:\"text-left\",staticStyle:{\"display\":\"flex\",\"flex-direction\":\"column\",\"justify-content\":\"center\"}},[_c('div',[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.unlock_share()}}},[_c('label',{attrs:{\"for\":\"share_password\"}},[_vm._v(\"Share password:\")]),_c('div',{staticClass:\"input-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.share_password),expression:\"share_password\",modifiers:{\"trim\":true}}],staticClass:\"form-control\",attrs:{\"type\":\"password\",\"id\":\"share_password\"},domProps:{\"value\":(_vm.share_password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.share_password=$event.target.value.trim()},\"blur\":function($event){return _vm.$forceUpdate()}}}),_c('button',{staticClass:\"btn btn-gradient btn-success ml-2\",attrs:{\"type\":\"submit\",\"disabled\":_vm.login_loading}},[_vm._v(\"Unlock \"),(_vm.login_loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])])])])])]):_vm._e(),(_vm.share)?_c('div',[(_vm.share.message && _vm.share.message != '')?_c('div',{staticClass:\"share-header text-center\"},[_c('p',{staticClass:\"bl pl-3\",staticStyle:{\"display\":\"inline-block\"}},[_c('i',[_vm._v(_vm._s(_vm.share.message))])])]):_vm._e(),_c('div',{staticClass:\"share-contents\"},[(_vm.nav_stack && _vm.nav_stack.length > 1)?_c('div',{staticClass:\"d-flex align-items-center justify-content-middle mb-3\"},_vm._l((_vm.nav_stack),function(folder,index){return _c('div',{key:folder.id,staticClass:\"d-inline-block\"},[_c('button',{staticClass:\"btn btn-flat btn-info\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.navigate_to(folder, false)}}},[(folder.is_root)?_c('i',{staticClass:\"icon ion-home\"}):_c('span',[_vm._v(_vm._s(folder.name))])]),(index < _vm.nav_stack.length-1)?_c('span',[_vm._v(\">\")]):_vm._e()])}),0):_vm._e(),(_vm.folders && _vm.folders.length > 0 && !_vm.share.contents_loading)?_c('div',{staticClass:\"row\"},_vm._l((_vm.folders),function(folder){return _c('div',{key:folder.id,staticClass:\"col-12 col-md-6 col-lg-4 folder-box\",on:{\"click\":function($event){return _vm.navigate_to(folder, true)}}},[_c('div',{staticClass:\"cardbox\",class:[ 'color-' + folder.color + '-400' ],staticStyle:{\"border-left\":\"4px solid\"}},[_c('div',{staticClass:\"cardbox-body\",attrs:{\"title\":folder.name}},[_c('div',{staticClass:\"d-flex justify-content-start align-items-center\"},[_c('i',{staticClass:\"ion-folder mr-2\",staticStyle:{\"font-size\":\"25px\",\"line-height\":\"25px\"}}),_c('span',{staticClass:\"nowrap\",staticStyle:{\"overflow\":\"hidden\"}},[_vm._v(_vm._s(folder.name))])])])])])}),0):_vm._e(),(!_vm.share.contents_loading)?_c('div',[(_vm.share.contents.length > 0)?_c('table',{staticClass:\"table table-hover\"},[_c('thead',[_c('th',{staticStyle:{\"width\":\"10px\"}}),_c('th',{staticClass:\"text-left\"},[_vm._v(\"Filename\")]),_c('th',{staticClass:\"d-none d-md-table-cell\"},[_vm._v(\"Type\")]),_c('th',{staticClass:\"d-none d-md-table-cell\"},[_vm._v(\"Size\")]),(_vm.share.download_limit)?_c('th',{staticClass:\"d-none d-md-table-cell\"},[_vm._v(\"Downloads\")]):_vm._e(),_c('th',{staticClass:\"d-none d-lg-table-cell\"},[_vm._v(\"Uploaded\")]),_c('th')]),(_vm.files && _vm.files.length > 0)?_vm._l((_vm.files),function(file){return _c('tbody',{key:file.id},[_c('tr',{class:{'text-gray-light': file.loading, 'text-muted': _vm.share.download_limit && file.downloads_num >= _vm.share.download_limit }},[_c('td',[_c('img',{attrs:{\"src\":_vm._f(\"filetype_img_src\")(file.extension)}})]),_c('td',{staticClass:\"text-left text-bold table-cell cell-full cell-ellipsis\"},[(_vm.share.download_limit && file.downloads_num >= _vm.share.download_limit)?_c('div',{staticClass:\"c-not-allowed\",attrs:{\"title\":\"Cannot download this file any more, the download limit has been reached.\"}},[_vm._v(\" \"+_vm._s(file.name)+\" \"),_c('i',{staticClass:\"ion-alert-circled ml-1\"})]):_c('div',[_c('a',{staticClass:\"file_download_link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.download_file(file)}}},[_vm._v(_vm._s(file.name))]),(file.loading)?_c('span',{staticClass:\"text-muted ml-2\"},[_vm._v(\"(\"+_vm._s(file.loading.toFixed(1))+\"%)\")]):_vm._e()])]),_c('td',{staticClass:\"nowrap text-gray-light text-sm d-none d-md-table-cell\"},[_c('span',{staticStyle:{\"text-transform\":\"uppercase\"}},[_vm._v(_vm._s(file.extension))])]),_c('td',{staticClass:\"nowrap text-gray-light text-sm d-none d-md-table-cell\"},[_vm._v(\" \"+_vm._s(_vm._f(\"size\")(file.size))+\" \")]),(_vm.share.download_limit)?_c('td',{staticClass:\"text-gray-light text-sm d-none d-md-table-cell text-center\"},[_vm._v(\" \"+_vm._s(file.downloads_num)+\" / \"+_vm._s(_vm.share.download_limit)+\" \")]):_vm._e(),_c('td',{staticClass:\"nowrap text-gray-light text-sm d-none d-lg-table-cell\"},[_c('timestamp',{attrs:{\"timestamp\":file.timestamp}})],1),_c('td',{staticClass:\"nowrap text-right\"},[(file.cancel)?_c('button',{staticClass:\"btn text-sm btn-danger btn-flat\",on:{\"click\":function($event){return file.cancel()}}},[_vm._v(\"CANCEL \"),_c('i',{staticClass:\"ion-close-round ml-1\"})]):_c('section',[(file.viewer)?_c('button',{staticClass:\"btn text-sm btn-flat\",class:[file.viewer.btn_class ],attrs:{\"disabled\":_vm.share.download_limit && file.downloads_num >= _vm.share.download_limit,\"title\":'Open with ' + file.viewer.label},on:{\"click\":function($event){$event.preventDefault();return _vm.open_file(file)}}},[_vm._v(_vm._s(file.viewer.verb)+\" \"),_c('i',{staticClass:\"icon-lg ml-2\",class:file.viewer.icon_class})]):_vm._e(),_c('button',{staticClass:\"btn btn-info btn-gradient text-white ml-0\",attrs:{\"disabled\":_vm.share.download_limit && file.downloads_num >= _vm.share.download_limit},on:{\"click\":function($event){return _vm.download_file(file)}}},[_c('i',{staticClass:\"ion-arrow-down-a\"}),_c('span',{staticClass:\"ml-2\"},[_vm._v(\"Download\")])])])])]),(file.loading)?_c('tr',{staticClass:\"file-loading\"},[_c('td',{attrs:{\"colspan\":\"7\"}},[_c('div',{staticClass:\"progress\"},[_c('div',{staticClass:\"progress-bar progress-bar-striped progress-bar-animated\",style:({'width': Math.round(file.loading)+'%'}),attrs:{\"role\":\"progressbar\",\"aria-valuenow\":Math.round(file.loading),\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"}})])])]):_vm._e()])}):_vm._e(),(_vm.files && _vm.files.length === 0)?_c('tbody',[_vm._m(1)]):_vm._e()],2):_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-3\"}),_vm._m(2)])]):_c('div',[_vm._v(\" Loading... \"),_c('i',{staticClass:\"ion-load-c spin\"})])])]):_vm._e()]),_c('div',{staticClass:\"cardbox-footer d-flex align-items-center justify-content-between\"},[_c('div',{},[(_vm.share && _vm.share.locations)?_c('locations',{attrs:{\"locations\":_vm.share.locations,\"placement\":\"top\",\"team-name\":_vm.share.team_info.name,\"circles\":true,\"text-start\":_vm.locations_text}}):_vm._e()],1),_vm._m(3)])])])])])]),_c('div',{staticClass:\"modal\",attrs:{\"id\":\"viewer-modal\"}},[(_vm.view_file)?_c('div',{staticClass:\"modal-dialog modal-lg\",staticStyle:{\"max-width\":\"80%\"}},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-primary text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_c('b',[_vm._v(_vm._s(_vm.view_file.file.name))])]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){_vm.view_file = null; _vm.close_modal('viewer-modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('file-preview',{attrs:{\"file\":_vm.view_file.file,\"file_list\":_vm.view_file.file_list,\"file_downloaded_callback\":(file) => { if(file.downloads_num !== undefined){ ++file.downloads_num } }}})],1)])]):_vm._e()])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',[_c('i',{staticClass:\"ion-lock-combination lock-icon\"})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('tr',[_c('td',{staticClass:\"text-center\",attrs:{\"colspan\":\"7\"}},[_c('i',[_vm._v(\"No files in this folder\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"col-6\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-warning b0\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_c('div',{staticClass:\"text-bold display-3\"},[_c('i',{staticClass:\"ion-qr-scanner\"})]),_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\"Empty folder\")])])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('a',{attrs:{\"href\":\"https://www.skyflok.com\",\"target\":\"_BLANK\",\"rel\":\"noopener\"}},[_c('img',{attrs:{\"src\":require(\"@/assets/img/skyflok_logo_black.png\"),\"height\":\"32\"}})])\n}]\n\nexport { render, staticRenderFns }","\n\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
Your shared files from {{ share.team_info.name }}
\n
\n
\n \n
\n
\n
\n
\n\n \n
\n\n
\n \n
\n\n \n
\n
\n \n
\n
\n
\n
\n Share password: \n \n \n Unlock \n
\n \n
\n
\n
\n\n \n
\n \n\n
\n\n
1\" class=\"d-flex align-items-center justify-content-middle mb-3\">\n
\n \n \n {{folder.name}} \n \n > \n
\n
\n\n \n
0 && !share.contents_loading\">\n
\n
\n
\n
\n \n {{ folder.name }} \n
\n
\n
\n
\n
\n\n \n
\n
0\">\n \n \n Filename \n Type \n Size \n Downloads \n Uploaded \n \n \n 0\" >\n \n = share.download_limit }\">\n \n \n = share.download_limit\" title=\"Cannot download this file any more, the download limit has been reached.\" class=\"c-not-allowed\">\n {{ file.name }} \n
\n \n \n \n {{ file.extension }} \n \n \n {{ file.size | size }}\n \n \n {{ file.downloads_num }} / {{ share.download_limit }}\n \n \n \n \n \n CANCEL \n \n = share.download_limit\" class=\"btn text-sm btn-flat\" :class=\"[file.viewer.btn_class ]\" @click.prevent=\"open_file(file)\" :title=\"'Open with ' + file.viewer.label\">{{ file.viewer.verb }} \n = share.download_limit\" @click=\"download_file(file)\">Download \n \n \n \n \n \n \n \n \n \n \n \n \n \n No files in this folder \n \n \n \n
\n
\n
\n
\n Loading... \n
\n
\n
\n
\n \n
\n
\n
\n
\n\n\n
\n\n
\n
\n
\n \n
\n { if(file.downloads_num !== undefined){ ++file.downloads_num } }\"> \n
\n
\n
\n
\n\n
\n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./share_app.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./share_app.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./share_app.vue?vue&type=template&id=7d3a0de8&scoped=true\"\nimport script from \"./share_app.vue?vue&type=script&lang=js\"\nexport * from \"./share_app.vue?vue&type=script&lang=js\"\nimport style0 from \"./share_app.vue?vue&type=style&index=0&id=7d3a0de8&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7d3a0de8\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"layout-container\"},[_c('div',{staticClass:\"page-container\"},[_c('div',{staticClass:\"container-fluid\"},[_c('div',{staticClass:\"fw py-3 text-bold\",staticStyle:{\"position\":\"fixed\",\"top\":\"0px\",\"z-index\":\"1000\",\"background\":\"#f6fbfe\"}},[_c('div',{staticClass:\"d-flex align-items-center justify-content-center gap-2\"},[_c('button',{staticClass:\"btn btn-flat text-gray ion-chevron-left\",class:{'hidden': !_vm.nav_back_enabled},attrs:{\"disabled\":!_vm.nav_back_enabled},on:{\"click\":function($event){return _vm.move_date_range('back')}}}),_c('div',{staticClass:\"text-12\"},[_vm._v(_vm._s(_vm.date_range.year)+\" \"+_vm._s(_vm.selected_month_name))]),_c('button',{staticClass:\"btn btn-flat text-gray\",class:{'hidden': !_vm.nav_fwd_enabled},attrs:{\"disabled\":!_vm.nav_fwd_enabled},on:{\"click\":function($event){return _vm.move_date_range('fwd')}}},[_c('i',{staticClass:\"ion-chevron-right\",attrs:{\"data-pack\":\"default\"}})])])]),_c('div',{staticClass:\"row mt-5\"},[_c('div',{staticClass:\"col-1\"}),_c('div',{staticClass:\"col-12 col-lg-10\"},[(!_vm.selected_month_msmts || !_vm.backends_with_data.length)?_c('div',[_vm._v(\"Loading performance data...\")]):_c('div',[_c('div',{staticClass:\"text-bold text-gray-darker px-4\"},[_vm._v(\"Average Provider Speed\")]),_c('div',{staticClass:\"text-muted px-4 text-sm\"},[_vm._v(\"Download and upload speed across all locations of the provider.\")]),_c('div',{staticClass:\"px-2\",staticStyle:{\"overflow-x\":\"scroll\",\"overflow-y\":\"hidden\",\"white-space\":\"nowrap\"}},_vm._l((_vm.providers_with_speeds),function(p,idx){return _c('div',{key:idx,staticClass:\"col-11 col-sm-5 col-lg-4 col-xl-3 d-inline-block pt-3 pb-5\",attrs:{\"data-provider-name\":p.name}},[_c('div',{staticClass:\"cardbox mb-0\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[(p.logo)?_c('div',{staticClass:\"d-flex align-items-center justify-content-center\",staticStyle:{\"height\":\"50px\"}},[_c('img',{staticStyle:{\"max-width\":\"150px\",\"max-height\":\"40px\"},attrs:{\"src\":_vm.Utils.cloud_provider_logo_src(p.logo)}})]):_vm._e(),_c('div',{staticClass:\"fw pt-3\"},[(false)?_c('p',{staticClass:\"mb-0 text-center text-bold\"},[_vm._v(_vm._s(p.name))]):_vm._e(),_c('div',{staticClass:\"d-flex align-items-center justify-content-between\"},[_c('div',[_vm._v(_vm._s(Math.round(p.downloads_avg))+\" Mbps \"),_c('i',{staticClass:\"ion-arrow-down-a text-primary\"})]),_c('div',[_vm._v(_vm._s(Math.round(p.uploads_avg))+\" Mbps \"),_c('i',{staticClass:\"ion-arrow-up-a text-success\"})])])])])])])}),0),_c('div',{},[_c('div',{staticClass:\"text-bold text-gray-darker\"},[_vm._v(\"Speed Map\")]),_c('div',{staticClass:\"fw py-3 d-flex justify-content-start\"},[_c('div',{staticStyle:{\"width\":\"30%\",\"min-width\":\"300px\"}},[_c('div',{style:({'height': '6px', 'border-radius': '3px', 'background': `linear-gradient(to right, rgb(${_vm.colorscale.min.join(',')}), rgb(${_vm.colorscale.max.join(',')}))`})}),_c('div',{staticClass:\"d-flex align-items-center justify-content-between text-sm\"},[_c('span',[_vm._v(_vm._s(_vm.speedscale.min)+\" Mbps\")]),_c('span',[_vm._v(_vm._s(_vm.speedscale.max)+\" Mbps\")])])])]),_c('gmap-map',{ref:\"map\",staticStyle:{\"width\":\"100%\",\"height\":\"550px\"},attrs:{\"center\":_vm.mapCenter,\"zoom\":_vm.mapZoom,\"disableDefaultUI\":true,\"options\":{ styles: _vm.map_style, disableDefaultUI: true }}},[_c('gmap-info-window',{attrs:{\"options\":_vm.infoOptions,\"position\":_vm.infoWindowPos,\"opened\":_vm.infoWinOpen},on:{\"closeclick\":function($event){_vm.infoWinOpen=false}}}),_vm._l((_vm.backends_with_data.filter(b => b.download_speeds && b.download_speeds.length)),function(b,index){return _c('gmap-marker',{key:index,attrs:{\"title\":`${b.provider} ${b.name}`,\"position\":b,\"icon\":{\n path: 'M 100, 100m-75, 0a 75,75 0 1,0 150,0a 75,75 0 1,0 -150,0',\n fillColor: `rgb(${_vm.pickHex(_vm.scaleDownloadSpeed(_vm.Utils.avg(b.download_speeds))).join(',')})`,\n fillOpacity: 1,\n strokeWeight: 0,\n rotation: 0,\n scale: 0.1,\n },\"draggable\":false,\"clickable\":true},on:{\"click\":function($event){return _vm.toggleInfoWindow(b)}}})})],2)],1),_c('div',{staticClass:\"mt-5\"},[_c('div',{staticClass:\"mb-4 d-flex align-items-center justify-content-between\"},[_c('div',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.search),expression:\"search\"}],staticClass:\"form-control\",staticStyle:{\"width\":\"300px\"},attrs:{\"type\":\"search\",\"placeholder\":\"Provider or location\"},domProps:{\"value\":(_vm.search)},on:{\"input\":function($event){if($event.target.composing)return;_vm.search=$event.target.value}}})]),_c('div',{staticClass:\"d-flex align-items-center justify-content-center gap-3\"},_vm._l((_vm.backends_categories),function(cat,idx){return _c('button',{key:idx,staticClass:\"btn\",class:{'btn-skyflok': _vm.backend_filter == cat.value, 'btn-skyflok-outline': _vm.backend_filter != cat.value},on:{\"click\":function($event){_vm.backend_filter = cat.value}}},[_vm._v(_vm._s(cat.label))])}),0),_c('div',{staticStyle:{\"width\":\"300px\"}})]),_vm._l((_vm.backends_with_data_filtered),function(b,idx){return _c('div',{key:idx,staticClass:\"cardbox\",style:({'display': `${b.provider} ${b.name}`.toLowerCase().search(_vm.search.toLowerCase()) < 0 ? 'none' : 'block'})},[_c('div',{staticClass:\"cardbox-body\"},[_c('p',{staticClass:\"text-bold\"},[_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.Utils.highlight_search(`${b.provider} ${b.name}`, _vm.search))}}),_c('img',{staticClass:\"ml-1\",attrs:{\"src\":_vm.Utils.flag_img_src(b.countrycode)}})]),(b.download_speeds && b.download_speeds.length)?_c('section',[(!_vm.eu_countrycodes.includes(b.countrycode))?_c('div',{staticClass:\"text-warning text-sm mb-3\"},[_c('i',{staticClass:\"ion-alert-circled mr-1\"}),_vm._v(\" Note: Transfer speeds and latency are currently measured from Europe and are \"),_c('u',[_vm._v(\"not representative\")]),_vm._v(\" of the performance of this storage location. \")]):_vm._e(),_c('div',{staticClass:\"ml-5\",attrs:{\"id\":`flotchart-speed-${b.id}-legend`}}),_c('div',{staticClass:\"flot-chart\",attrs:{\"id\":`flotchart-speed-${b.id}`}}),_c('div',{staticClass:\"mt-4 ml-5\",attrs:{\"id\":`flotchart-latency-${b.id}-legend`}}),_c('div',{staticClass:\"flot-chart latency\",attrs:{\"id\":`flotchart-latency-${b.id}`}})]):_c('section',[_c('div',{staticClass:\"text-center\"},[_vm._v(\"No data available\")])])])])})],2)])])]),(false)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col\"},[_vm._v(\" Cached: \"),_vm._l((Object.entries(_vm.cache)),function([date, msmts]){return _c('div',{key:date},[_vm._v(\" \"+_vm._s(date)+\": \"+_vm._s(msmts.length)+\"x \")])})],2)]):_vm._e(),(false)?_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col\"},[_vm._v(\" \"+_vm._s(_vm.selected_month_msmts)+\" \")])]):_vm._e()])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","const map_style = [\n {\n \"featureType\": \"administrative\",\n \"elementType\": \"labels\",\n \"stylers\": [\n {\n \"visibility\": \"off\"\n }\n ]\n }, \n {\n \"featureType\": \"administrative.country\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [\n {\n \"visibility\": \"on\",\n \"color\": \"#444444\"\n }\n ]\n },\n {\n \"featureType\": \"landscape\",\n \"elementType\": \"all\",\n \"stylers\": [\n {\n \"color\": \"#f2f2f2\"\n }\n ]\n },\n {\n \"featureType\": \"poi\",\n \"elementType\": \"all\",\n \"stylers\": [\n {\n \"visibility\": \"off\"\n }\n ]\n },\n {\n \"featureType\": \"poi.business\",\n \"elementType\": \"geometry.fill\",\n \"stylers\": [\n {\n \"visibility\": \"off\"\n }\n ]\n },\n {\n \"featureType\": \"road\",\n \"elementType\": \"all\",\n \"stylers\": [\n {\n \"saturation\": -100\n },\n {\n \"lightness\": 45\n }\n ]\n },\n {\n \"featureType\": \"road.highway\",\n \"elementType\": \"all\",\n \"stylers\": [\n {\n \"visibility\": \"simplified\"\n }\n ]\n },\n {\n \"featureType\": \"road.arterial\",\n \"elementType\": \"labels.icon\",\n \"stylers\": [\n {\n \"visibility\": \"off\"\n }\n ]\n },\n {\n \"featureType\": \"transit\",\n \"elementType\": \"all\",\n \"stylers\": [\n {\n \"visibility\": \"off\"\n }\n ]\n },\n {\n \"featureType\": \"water\",\n \"elementType\": \"all\",\n \"stylers\": [\n {\n \"color\": \"#b4d4e1\"\n },\n {\n \"visibility\": \"on\"\n }\n ]\n }\n ]\n \n \n const old_map_style = [\n {\"elementType\": \"geometry\", \"stylers\": [{\"visibility\": \"off\"}]},\n {\n \"featureType\": \"transit\",\n \"stylers\": [{\"visibility\": \"off\"}]\n },\n {\n \"featureType\": \"administrative\",\n \"stylers\": [{\"visibility\": \"off\"}]\n }, \n {\n \"featureType\": \"landscape.natural\",\n \"elementType\": \"labels\",\n \"stylers\": [{\"visibility\": \"off\"}]\n },\n {\n \"featureType\": \"poi\",\n \"stylers\": [{\"visibility\": \"off\"}]\n },\n {\n \"featureType\": \"road\",\n \"stylers\": [{\"visibility\": \"off\"}]\n },\n {\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [\n {\"color\": \"#523735\"}\n ]\n },\n {\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [\n {\"color\": \"#f5f1e6\"}\n ]\n },\n \n {\n \"featureType\": \"administrative.country\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [\n {\"color\": \"#bab8b6\"},\n {\"visibility\": \"on\"}\n ]\n },\n {\n \"featureType\": \"administrative.country\",\n \"elementType\": \"labels\",\n \"stylers\": [\n {\n \"color\": \"#989898\"\n },\n {\n \"visibility\": \"simplified\"\n }\n ]\n },\n {\n \"featureType\": \"landscape.natural\",\n \"elementType\": \"geometry\",\n \"stylers\": [\n {\n \"color\": \"#d9d9d9\"\n },\n {\n \"visibility\": \"simplified\"\n }\n ]\n },\n \n {\n \"featureType\": \"road.arterial\",\n \"elementType\": \"geometry\",\n \"stylers\": [\n {\n \"color\": \"#fdfcf8\"\n }\n ]\n },\n {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry\",\n \"stylers\": [\n {\n \"color\": \"#f8c967\"\n }\n ]\n },\n {\n \"featureType\": \"road.highway\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [\n {\n \"color\": \"#e9bc62\"\n }\n ]\n },\n {\n \"featureType\": \"road.highway.controlled_access\",\n \"elementType\": \"geometry\",\n \"stylers\": [\n {\n \"color\": \"#e98d58\"\n }\n ]\n },\n {\n \"featureType\": \"road.highway.controlled_access\",\n \"elementType\": \"geometry.stroke\",\n \"stylers\": [\n {\n \"color\": \"#db8555\"\n }\n ]\n },\n {\n \"featureType\": \"road.local\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [\n {\n \"color\": \"#806b63\"\n }\n ]\n },\n \n {\n \"featureType\": \"transit.line\",\n \"elementType\": \"geometry\",\n \"stylers\": [\n {\"color\": \"#dfd2ae\"}\n ]\n },\n {\n \"featureType\": \"transit.line\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [\n {\"color\": \"#8f7d77\"}\n ]\n },\n {\n \"featureType\": \"transit.line\",\n \"elementType\": \"labels.text.stroke\",\n \"stylers\": [\n { \"color\": \"#ebe3cd\" }\n ]\n },\n {\n \"featureType\": \"transit.station\",\n \"elementType\": \"geometry\",\n \"stylers\": [\n {\"color\": \"#dfd2ae\"}\n ]\n },\n {\n \"featureType\": \"water\",\n \"elementType\": \"geometry.fill\",\n \"stylers\": [\n {\"color\": \"#E8F5F8\"},\n {\"visibility\": \"on\"}\n ]\n },\n {\n \"featureType\": \"water\",\n \"elementType\": \"labels\",\n \"stylers\": [{\"visibility\": \"off\"}]\n },\n {\n \"featureType\": \"water\",\n \"elementType\": \"labels.text.fill\",\n \"stylers\": [\n {\"color\": \"#92998d\"}\n ]\n }\n ]\n\n \n export { map_style, old_map_style }","\n \n\n
\n
\n \n
\n
\n
\n \n
{{ date_range.year }} {{ selected_month_name }}
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
Loading performance data...
\n
\n \n
Average Provider Speed
\n
Download and upload speed across all locations of the provider.
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
{{ p.name }}
\n
\n
{{ Math.round(p.downloads_avg) }} Mbps
\n
{{ Math.round(p.uploads_avg) }} Mbps
\n
\n
\n
\n
\n
\n
\n\n
\n
Speed Map
\n \n
\n
\n
\n
\n {{ speedscale.min }} Mbps \n {{ speedscale.max }} Mbps \n
\n
\n
\n
\n \n b.download_speeds && b.download_speeds.length)\"\n :key=\"index\"\n :title=\"`${b.provider} ${b.name}`\"\n :position=\"b\"\n :icon=\"{\n path: 'M 100, 100m-75, 0a 75,75 0 1,0 150,0a 75,75 0 1,0 -150,0',\n fillColor: `rgb(${pickHex(scaleDownloadSpeed(Utils.avg(b.download_speeds))).join(',')})`,\n fillOpacity: 1,\n strokeWeight: 0,\n rotation: 0,\n scale: 0.1,\n }\"\n :draggable=\"false\"\n :clickable=\"true\"\n @click=\"toggleInfoWindow(b)\"\n />\n \n
\n \n
\n \n
\n
\n \n
\n\n
\n {{ cat.label }} \n
\n
\n
\n\n
\n
\n \n
\n \n \n
\n \n
\n \n Note: Transfer speeds and latency are currently measured from Europe and are not representative of the performance of this storage location.\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n\n
\n
\n
\n \n
\n
\n Cached: \n
\n {{ date }}: {{ msmts.length }}x\n
\n
\n
\n
\n
\n {{ selected_month_msmts }}\n
\n
\n
\n
\n
\n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./backend-performance.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./backend-performance.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./backend-performance.vue?vue&type=template&id=06568562&scoped=true\"\nimport script from \"./backend-performance.vue?vue&type=script&lang=js\"\nexport * from \"./backend-performance.vue?vue&type=script&lang=js\"\nimport style0 from \"./backend-performance.vue?vue&type=style&index=0&id=06568562&prod&scoped=true&lang=css\"\nimport style1 from \"./backend-performance.vue?vue&type=style&index=1&id=06568562&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"06568562\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"section-container\"},[_c('div',{staticClass:\"container container-lg\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_c('div',{staticClass:\"col-12 col-lg-8\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-danger b0\"},[_c('div',{staticClass:\"cardbox-body text-center\"},[_vm._m(0),_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\" Nothing here. \")]),_c('p',{staticClass:\"text-bold text-md\"},[_vm._v(\" If you think this is a system error, please file a \"),_c('router-link',{staticClass:\"text-white\",staticStyle:{\"text-decoration\":\"underline\",\"white-space\":\"nowrap\"},attrs:{\"to\":\"/bugreport\"}},[_vm._v(\"Bug Report\")]),_vm._v(\" and tell us what happened. \")],1)])])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"text-bold display-1\"},[_c('i',{staticClass:\"ion-sad\"})])\n}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./not-recognized-route.vue?vue&type=template&id=7f66ff46\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"layout-container\"},[(_vm.space)?_c('div',{staticClass:\"layout-container layout-container-main\"},[_c('aside',{staticClass:\"sidebar-container\"},[_c('div',{staticClass:\"px-3\"},[_c('div',{staticClass:\"text-center py-3\"},[(_vm.acting_user)?_c('div',[(_vm.acting_user.avatar_url)?_c('img',{staticClass:\"avatar_url mr-2 mb-3\",class:{'initial128 round cover-fit': _vm.is_skyflok_user},attrs:{\"src\":_vm.is_skyflok_user ? _vm.acting_user.avatar_url : _vm.ClientSpacesService.is_skyflok_logo(_vm.space) ? _vm.Utils.client_space_logo_src(_vm.acting_user.avatar_url) : _vm.acting_user.avatar_url}}):_vm._e(),(_vm.is_skyflok_user)?_c('h5',{staticClass:\"text-lightgray text-bold mb-0\"},[_vm._v(\" \"+_vm._s(_vm.acting_user.name)+\" \")]):_c('div',{staticClass:\"c-pointer\",attrs:{\"title\":\"Click to edit your info\"},on:{\"click\":function($event){return _vm.open_client_form()}}},[_c('h5',{staticClass:\"text-lightgray text-bold d-inline\"},[_vm._v(\" \"+_vm._s(_vm.acting_user.name)+\" \")])]),_c('small',{staticClass:\"text-muted\",staticStyle:{\"word-break\":\"break-word\"}},[_vm._v(_vm._s(_vm.is_skyflok_user ? _vm.acting_user.company_name : _vm.space.client_email))])]):_vm._e()]),(!_vm.is_skyflok_user)?_c('div',{staticClass:\"mb-3 fw text-center text-white\"},[_c('button',{staticClass:\"btn fw btn-outline-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.open_client_form()}}},[_vm._v(\" My Settings \"),_c('i',{staticClass:\"ion-gear-a ml-2 text-muted\"})])]):_vm._e(),(!_vm.is_skyflok_user)?_c('div',{staticClass:\"mb-2\"},[(!_vm.mfa_status || _vm.mfa_enabled)?_c('button',{staticClass:\"btn fw btn-outline-secondary btn-flat text-normal\",staticStyle:{\"text-transform\":\"none\"},on:{\"click\":function($event){return _vm._open_modal('2fa-modal')}}},[_vm._v(\" Two-Factor Auth: \"),(!_vm.mfa_status)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):_c('span',{staticClass:\"ml-1 text-success text-bold\"},[_vm._v(\"ON \"),_c('i',{staticClass:\"ion-locked ml-1\"})])]):_c('button',{staticClass:\"btn fw btn-success\",on:{\"click\":function($event){return _vm._open_modal('2fa-modal')}}},[_c('i',{staticClass:\"ion-locked mr-2\"}),_vm._v(\"Enable Two-Factor Auth \")])]):_vm._e(),_c('div',{staticClass:\"mb-2 fw text-center text-white\"},[_c('button',{staticClass:\"btn fw btn-outline-secondary btn-flat text-normal\",staticStyle:{\"text-transform\":\"none\"},attrs:{\"title\":'Click to ' + (_vm.email_notifications ? 'stop receiving' : 'receive' ) + ' email notifications',\"disabled\":!_vm.space || _vm.change_watch_loading},on:{\"click\":function($event){return _vm.change_watch()}}},[_vm._v(\" Email Notifications: \"),(_vm.change_watch_loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):(!_vm.email_notifications)?_c('span',{staticClass:\"ml-1 text-bold\"},[_vm._v(\" OFF \"),_c('i',{staticClass:\"ion-android-notifications-none ml-1\"})]):(_vm.email_notifications)?_c('span',{staticClass:\"ml-1 text-success text-bold\"},[_vm._v(\" ON \"),_c('i',{staticClass:\"ion-android-notifications ml-1\"})]):_vm._e()])]),(_vm.is_skyflok_user || !_vm.space.client_readonly)?_c('div',{staticClass:\"mb-2\"},[_c('button',{staticClass:\"btn fw\",class:{'btn-outline-secondary btn-flat': !_vm.show_trash, 'btn-primary': _vm.show_trash},staticStyle:{\"text-transform\":\"none\"},on:{\"click\":function($event){_vm.show_trash = !_vm.show_trash}}},[_vm._v(_vm._s(_vm.show_trash ? \"Active Files\" : \"Recycle Bin\")+\" \"),_c('i',{staticClass:\"icon-lg ml-1\",class:{'ion-trash-a': !_vm.show_trash, 'ion-document-text': _vm.show_trash}})])]):_vm._e(),_c('section',[_c('div',{staticClass:\"sidebar-nav-heading px-0 pb-0\"},[_vm._v(\" LATEST EVENTS \"),_c('i',{staticClass:\"ion-refresh ml-1 text-muted c-pointer\",class:{'spin': _vm.recent_events_loading},on:{\"click\":function($event){return _vm.load_recent_events()}}}),(false)?_c('span',{staticClass:\"float-right\"},[_c('span',{staticClass:\"c-pointer text-12\",class:{'text-success': _vm.recent_events_filter.downloads, 'text-muted': !_vm.recent_events_filter.downloads},on:{\"click\":function($event){_vm.recent_events_filter.downloads = !_vm.recent_events_filter.downloads}}},[_c('i',{staticClass:\"ion-arrow-down-a\"})]),_c('span',{staticClass:\"ml-2 c-pointer text-12\",class:{'text-info': _vm.recent_events_filter.uploads, 'text-muted': !_vm.recent_events_filter.uploads},on:{\"click\":function($event){_vm.recent_events_filter.uploads = !_vm.recent_events_filter.uploads}}},[_c('i',{staticClass:\"ion-arrow-up-a\"})])]):_vm._e()]),_vm._l((_vm.recent_events_filtered),function(event){return _c('event-box',{key:event.id,attrs:{\"is_clickable\":true,\"event\":event,\"space\":_vm.space,\"skyflok_team\":_vm.acting_user.team},on:{\"file_clicked\":(file) => { _vm.sidebar_file_clicked(file) }}})}),(_vm.recent_events !== null && _vm.recent_events.length === 0)?_c('i',{staticClass:\"d-block text-center text-muted text-sm py-2\"},[_vm._v(\"No events\")]):_vm._e(),_c('div',{staticClass:\"fw text-right\"},[_c('button',{staticClass:\"btn btn-flat btn-sm ion-chevron-left text-muted\",attrs:{\"disabled\":_vm.recent_events_pager.start_offset <= 0},on:{\"click\":function($event){return _vm.recent_events_page(false)}}}),_c('button',{staticClass:\"btn btn-flat btn-sm ion-chevron-right text-muted\",attrs:{\"disabled\":_vm.recent_events && _vm.recent_events.length === 0},on:{\"click\":function($event){return _vm.recent_events_page(true)}}})])],2),(_vm.space.locations && _vm.skyflok_team)?_c('div',{staticClass:\"my-3\",attrs:{\"id\":\"data-locations\"}},[_c('locations',{attrs:{\"locations\":_vm.space.locations,\"disable_popover\":_vm.is_narrow,\"placement\":_vm.is_narrow ? 'right' : 'left',\"team-name\":_vm.skyflok_team.name}})],1):_vm._e(),_c('div',{staticClass:\"container color-selector\"},[_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_c('div',{staticClass:\"col-3\"},[_c('button',{staticClass:\"btn btn-sm btn-outline-secondary text-sm\",on:{\"click\":function($event){return _vm.set_theme('theme-dark')}}},[_vm._v(\"Dark\")])]),_c('div',{staticClass:\"col-3\"},[_c('button',{staticClass:\"btn btn-sm text-sm\",on:{\"click\":function($event){return _vm.set_theme('theme-default')}}},[_vm._v(\"Bright\")])])])]),(!_vm.is_skyflok_user)?_c('div',{staticClass:\"fw text-center mt-3\"},[_c('button',{staticClass:\"btn btn-outline-danger btn-sm text-sm text-bold\",attrs:{\"disabled\":_vm.logout_loading},on:{\"click\":function($event){return _vm.logout_client()}}},[_vm._v(\" Log out \"),(_vm.logout_loading)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):_vm._e()])]):_vm._e()])]),_c('div',{staticClass:\"sidebar-layout-obfuscator\"}),_c('main',{staticClass:\"main-container\",class:{'archived_space_bg': _vm.space.is_archived}},[_c('header',{staticClass:\"header-container\"},[_c('global-alert',{attrs:{\"alert\":_vm.alert}}),_c('nav',{staticClass:\"text-center\"},[_c('ul',{staticClass:\"d-none d-lg-block\"},[_c('li',[_c('a',{attrs:{\"href\":_vm._f(\"client_space_link\")(_vm.space.key),\"title\":\"Space Home\"}},[_c('img',{attrs:{\"src\":require(\"@/assets/img/skyflok_logo_black.png\"),\"width\":\"130\"}})])])]),_vm._m(0),_vm._m(1),_vm._m(2),_c('div',{staticClass:\"d-none d-sm-inline-block\"},[(_vm.skyflok_team)?_c('div',{staticClass:\"d-flex justify-content-between align-items-center\"},[_c('div',{staticStyle:{\"cursor\":\"default\"},attrs:{\"title\":'Secure, private shared space between ' + _vm.skyflok_team.name + ' and ' + _vm.space.client_name}},[(_vm.skyflok_team.logo_url && _vm.skyflok_team.logo_url!='')?_c('img',{staticClass:\"d-none d-md-inline-block\",staticStyle:{\"max-width\":\"100px\",\"max-height\":\"48px\"},attrs:{\"src\":_vm.skyflok_team.logo_url}}):_vm._e(),_c('h5',{staticClass:\"d-inline\"},[_vm._v(_vm._s(_vm.skyflok_team.name))]),_c('i',{staticClass:\"ion-code icon-lg mx-4\"}),(_vm.space.client_logo)?_c('img',{staticClass:\"d-none d-md-inline-block\",staticStyle:{\"max-width\":\"60px\",\"max-height\":\"48px\"},attrs:{\"src\":_vm.ClientSpacesService.is_skyflok_logo(_vm.space) ? _vm.Utils.client_space_logo_src(_vm.space.client_logo) : _vm.space.client_logo}}):_vm._e(),_c('h5',{staticClass:\"d-inline\",class:{'text-italic c-help': _vm.space.client_readonly},attrs:{\"title\":_vm.space.client_readonly ? _vm.space.client_name + ' can only browse and download files in this space, cannot upload or edit.' : null}},[_vm._v(\" \"+_vm._s(_vm.space.client_name)+\" \"),(_vm.space.client_readonly)?_c('i',{staticClass:\"ion-locked ml-1 text-sm text-gray\",attrs:{\"data-toggle\":\"popover\",\"data-content\":\"The Client can only browse and download files, but not allowed to upload, delete or change the folder structure.\",\"data-html\":\"true\",\"data-trigger\":\"hover\",\"data-placement\":\"bottom\"}}):_vm._e()])])]):_vm._e()]),_c('search-box',{staticClass:\"float-right mr-2\",attrs:{\"placeholder\":'Search',\"hideinput\":true,\"redirect-when-clicked\":false,\"custom-namespace\":true}})],1)],1),(_vm.space.is_archived)?_c('div',{staticClass:\"fw text-center py-2 text-white text-bold bg-gradient-warning\"},[_c('i',{staticClass:\"ion-locked mr-2\"}),_vm._v(\" This Space is archived, you can browse it but cannot upload, download or change anything. \"),_c('i',{staticClass:\"ion-locked ml-2\"})]):_vm._e(),(!_vm.show_trash)?_c('file-list-view',{staticStyle:{\"margin-top\":\"0px\"},attrs:{\"user\":_vm.acting_user,\"share-allowed\":false,\"upload-allowed\":!_vm.is_space_readonly,\"download-allowed\":!_vm.space.is_archived,\"namespace-ops-allowed\":!_vm.is_space_readonly,\"modified-box-external\":_vm.external_actor,\"file_uploaded_callback\":(file) => { _vm.on_file_uploaded(file) },\"file_download_started\":(file) => { _vm.report_file_event('download_start', file) },\"file_download_error\":(file) => { _vm.report_file_event('download_error', file, _vm.error) }},on:{\"file_download_succeeded\":(file) => { _vm.report_file_event('download_finished', file); _vm.load_recent_events() }}}):_c('div',{staticClass:\"container\",staticStyle:{\"padding-top\":\"100px\",\"margin-top\":\"0px\"}},[_c('div',{staticClass:\"row pt-3\"},[_c('div',{staticClass:\"col-1\"}),_c('div',{staticClass:\"col-12 col-lg-10\"},[_c('div',{staticClass:\"cardbox text-white bg-gradient-warning b0\"},[_c('div',{staticClass:\"cardbox-body text-center text-bold\",staticStyle:{\"font-size\":\"1.3rem\"}},[_vm._v(\" Deleted files and directories are stored here for 30 days. \"),_c('br'),_vm._v(\" You can recover them during this period, afterwards they are deleted automatically. \")])])])]),_c('div',{staticClass:\"row\"},[_c('div',{staticClass:\"col-2\"}),_c('div',{staticClass:\"col-12 col-lg-8\"},[_c('deleted-groups',{attrs:{\"user\":_vm.acting_user,\"modified-box-external\":_vm.external_actor,\"restore-allowed\":!_vm.space.is_archived}})],1)])])],1),(!_vm.is_skyflok_user)?_c('div',{staticClass:\"modal\",attrs:{\"id\":\"client-form-modal\"}},[(_vm.client_form)?_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-info text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\"Edit your information\")]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('client-form-modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\"},[_c('section',{staticClass:\"d-none d-md-block\"},[(_vm.client_form.error)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.client_form.error))]):_vm._e(),(_vm.client_form.success)?_c('div',{staticClass:\"alert alert-success\"},[_vm._v(_vm._s(_vm.client_form.success))]):_vm._e(),_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.client_form_submit.apply(null, arguments)}}},[_c('table',{staticClass:\"table form-table mb-0\"},[_c('tbody',[_c('tr',[_c('th',[_vm._v(\"Name:\")]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.name),expression:\"client_form.name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.client_form.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"name\", $event.target.value)}}})])]),_c('tr',[_c('th',{staticClass:\"nowrap\"},[_vm._v(\"E-mail:\")]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.client_form.email),expression:\"client_form.email\",modifiers:{\"trim\":true}}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"email\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.client_form.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"email\", $event.target.value.trim())},\"blur\":function($event){return _vm.$forceUpdate()}}})])]),_c('tr',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.client_change_pass),expression:\"!client_change_pass\"}]},[_c('th',[_vm._v(\"Password:\")]),_c('td',[_c('button',{staticClass:\"btn btn-secondary btn-sm text-sm\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.client_change_pass = true}}},[_vm._v(\"Change password\")])])]),_c('tr',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.client_change_pass),expression:\"client_change_pass\"}]},[_c('th',[_vm._v(\"Current password\")]),_c('td',[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.current_pass),expression:\"client_form.current_pass\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"password\"},domProps:{\"value\":(_vm.client_form.current_pass)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"current_pass\", $event.target.value)}}})])]),_c('tr',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.client_change_pass),expression:\"client_change_pass\"}]},[_c('th',[_vm._v(\"New password\")]),_c('td',[_c('div',{staticClass:\"fw d-flex align-items-center\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.psw1),expression:\"client_form.psw1\"}],staticClass:\"form-control form-control-sm mr-1\",attrs:{\"type\":\"password\",\"placeholder\":\"New password\"},domProps:{\"value\":(_vm.client_form.psw1)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"psw1\", $event.target.value)}}}),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.psw2),expression:\"client_form.psw2\"}],staticClass:\"form-control form-control-sm ml-1\",attrs:{\"type\":\"password\",\"placeholder\":\"Repeat new password\"},domProps:{\"value\":(_vm.client_form.psw2)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"psw2\", $event.target.value)}}})])])]),_c('tr',[_c('th',{staticClass:\"v-top\"},[_vm._v(\"Logo:\")]),_c('td',{staticStyle:{\"width\":\"80%\",\"padding-top\":\"0px\"}},[_c('div',{staticClass:\"mb-2\",attrs:{\"id\":\"client_space_logos_carousel\"}},_vm._l((_vm.client_form.logos),function(logo){return _c('div',{key:logo.path,staticClass:\"slide d-inline-block\"},[_c('img',{staticClass:\"builtin-logo logo c-pointer m-1\",class:{'selected': _vm.client_form.selected_logo === logo.path},attrs:{\"title\":logo.name+' (Click to '+(logo.selected ? 'un' : '')+'select)',\"src\":_vm.Utils.client_space_logo_src(logo.path),\"width\":\"84\",\"height\":\"84\"},on:{\"click\":function($event){return _vm.select_logo(logo)}}})])}),0),(_vm.client_form.custom_avatar_url !== null)?_c('div',[_c('span',{staticClass:\"text-sm mr-2\"},[_vm._v(\"Custom logo:\")]),_c('img',{staticClass:\"avatar_url\",attrs:{\"src\":_vm.client_form.custom_avatar_url}}),_c('button',{staticClass:\"btn btn-sm btn-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.client_form.custom_avatar_url = null}}},[_vm._v(\"Clear\")])]):_c('div',[_c('span',{staticClass:\"text-sm mr-2\"},[_vm._v(\"Upload custom image:\")]),_c('profile-image-selector',{attrs:{\"avatar_changed\":(avatar_url) => { _vm.client_form.custom_avatar_url = avatar_url }}})],1)])])]),_c('tfoot',[_c('tr',[_c('td',{staticClass:\"text-right\",attrs:{\"colspan\":\"2\"}},[_c('button',{staticClass:\"btn btn-secondary mr-2\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.close_modal('client-form-modal')}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-info btn-gradient\",attrs:{\"type\":\"submit\",\"disabled\":_vm.client_form.loading}},[_vm._v(\"Save\"),(_vm.client_form.loading)?_c('i',{staticClass:\"ion-load-c spin ml-2\"}):_vm._e()])])])])])])]),_c('section',{staticClass:\"d-block d-xl-none mb-4\"},[(_vm.client_form.error)?_c('div',{staticClass:\"alert alert-danger\"},[_vm._v(_vm._s(_vm.client_form.error))]):_vm._e(),(_vm.client_form.success)?_c('div',{staticClass:\"alert alert-success\"},[_vm._v(_vm._s(_vm.client_form.success))]):_vm._e(),_c('form',{staticClass:\"text-sm\",on:{\"submit\":function($event){$event.preventDefault();return _vm.client_form_submit.apply(null, arguments)}}},[_c('div',{staticClass:\"mobile-form-field\"},[_c('b',[_vm._v(\"Name\")]),_c('br'),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.name),expression:\"client_form.name\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.client_form.name)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"name\", $event.target.value)}}})]),_c('div',{staticClass:\"mobile-form-field\"},[_c('b',[_vm._v(\"E-mail\")]),_c('br'),_c('input',{directives:[{name:\"model\",rawName:\"v-model.trim\",value:(_vm.client_form.email),expression:\"client_form.email\",modifiers:{\"trim\":true}}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"email\",\"maxlength\":\"255\"},domProps:{\"value\":(_vm.client_form.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"email\", $event.target.value.trim())},\"blur\":function($event){return _vm.$forceUpdate()}}})]),_c('div',{staticClass:\"mobile-form-field\"},[_c('b',[_vm._v(\"Password\")]),_c('br'),_c('button',{staticClass:\"btn btn-secondary btn-sm text-sm\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.client_change_pass = true}}},[_vm._v(\"Change password\")])]),(_vm.client_change_pass)?_c('div',{staticClass:\"mobile-form-field\"},[_c('b',[_vm._v(\"Current password\")]),_c('br'),_c('div',{staticClass:\"d-flex align-items-center justify-content-center\"},[(_vm.client_form_show_current_pass)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.current_pass),expression:\"client_form.current_pass\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.client_form.current_pass)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"current_pass\", $event.target.value)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.current_pass),expression:\"client_form.current_pass\"}],staticClass:\"form-control form-control-sm\",attrs:{\"type\":\"password\"},domProps:{\"value\":(_vm.client_form.current_pass)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"current_pass\", $event.target.value)}}}),_c('i',{staticClass:\"ion-eye ml-2\",class:{'ion-eye': !_vm.client_form_show_current_pass, 'ion-eye-disabled': _vm.client_form_show_current_pass},on:{\"click\":function($event){_vm.client_form_show_current_pass = !_vm.client_form_show_current_pass}}})])]):_vm._e(),(_vm.client_change_pass)?_c('div',{staticClass:\"mobile-form-field\"},[_c('b',[_vm._v(\"New Password\")]),_c('br'),_c('section',{staticClass:\"d-flex align-items-center\"},[(_vm.client_form_show_new_pass)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.psw1),expression:\"client_form.psw1\"}],staticClass:\"form-control form-control-sm mr-1\",class:{\n 'form-control-success': _vm.client_form.psw1 && _vm.client_form.psw2 && _vm.client_form.psw1 == _vm.client_form.psw2 && _vm.client_form.psw1.length >= 8,\n 'form-control-danger': _vm.client_form.psw1 && _vm.client_form.psw2 && (_vm.client_form.psw1 !== _vm.client_form.psw2 || _vm.client_form.psw1.length < 8)\n },attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.client_form.psw1)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"psw1\", $event.target.value)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.psw1),expression:\"client_form.psw1\"}],staticClass:\"form-control form-control-sm mr-1\",class:{\n 'form-control-success': _vm.client_form.psw1 && _vm.client_form.psw2 && _vm.client_form.psw1 == _vm.client_form.psw2 && _vm.client_form.psw1.length >= 8,\n 'form-control-danger': _vm.client_form.psw1 && _vm.client_form.psw2 && (_vm.client_form.psw1 !== _vm.client_form.psw2 || _vm.client_form.psw1.length < 8)\n },attrs:{\"type\":\"password\"},domProps:{\"value\":(_vm.client_form.psw1)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"psw1\", $event.target.value)}}}),(_vm.client_form_show_new_pass)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.psw2),expression:\"client_form.psw2\"}],staticClass:\"form-control form-control-sm ml-1\",class:{\n 'form-control-success': _vm.client_form.psw1 && _vm.client_form.psw2 && _vm.client_form.psw1 == _vm.client_form.psw2 && _vm.client_form.psw1.length >= 8,\n 'form-control-danger': _vm.client_form.psw1 && _vm.client_form.psw2 && (_vm.client_form.psw1 !== _vm.client_form.psw2 || _vm.client_form.psw1.length < 8)\n },attrs:{\"type\":\"text\"},domProps:{\"value\":(_vm.client_form.psw2)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"psw2\", $event.target.value)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.client_form.psw2),expression:\"client_form.psw2\"}],staticClass:\"form-control form-control-sm ml-1\",class:{\n 'form-control-success': _vm.client_form.psw1 && _vm.client_form.psw2 && _vm.client_form.psw1 == _vm.client_form.psw2 && _vm.client_form.psw1.length >= 8,\n 'form-control-danger': _vm.client_form.psw1 && _vm.client_form.psw2 && (_vm.client_form.psw1 !== _vm.client_form.psw2 || _vm.client_form.psw1.length < 8)\n },attrs:{\"type\":\"password\"},domProps:{\"value\":(_vm.client_form.psw2)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.client_form, \"psw2\", $event.target.value)}}}),_c('i',{staticClass:\"ion-eye ml-2\",class:{'ion-eye': !_vm.client_form_show_new_pass, 'ion-eye-disabled': _vm.client_form_show_new_pass},on:{\"click\":function($event){_vm.client_form_show_new_pass = !_vm.client_form_show_new_pass}}})]),(_vm.client_form.psw1 && _vm.client_form.psw1.length < 8)?_c('small',{staticClass:\"text-danger\"},[_vm._v(\"Minimum 8 characters required\")]):_vm._e()]):_vm._e(),_c('div',{staticClass:\"mobile-form-field\"},[_c('b',[_vm._v(\"Logo\")]),_c('br'),_c('div',{staticClass:\"mb-2\",attrs:{\"id\":\"client_space_logos_carousel\"}},_vm._l((_vm.client_form.logos),function(logo){return _c('div',{key:logo.path,staticClass:\"slide d-inline-block\"},[_c('img',{staticClass:\"builtin-logo logo c-pointer m-1\",class:{'selected': _vm.client_form.selected_logo === logo.path},attrs:{\"title\":logo.name+' (Click to '+(logo.selected ? 'un' : '')+'select)',\"src\":logo.path,\"type\":\"button\",\"width\":\"50\",\"height\":\"50\"},on:{\"click\":function($event){return _vm.select_logo(logo)}}})])}),0),(_vm.client_form.custom_avatar_url !== null)?_c('div',[_c('span',{staticClass:\"text-sm mr-2\"},[_vm._v(\"Custom logo:\")]),_c('img',{staticClass:\"avatar_url\",attrs:{\"src\":_vm.client_form.custom_avatar_url}}),_c('button',{staticClass:\"btn btn-sm btn-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.client_form.custom_avatar_url = null}}},[_vm._v(\"Clear\")])]):_c('div',[(!_vm.client_form.custom_avatar_url)?_c('span',{staticClass:\"text-sm mr-2\"},[_vm._v(\"Or upload custom image:\")]):_vm._e(),_c('profile-image-selector',{attrs:{\"avatar_changed\":(avatar_url) => { _vm.client_form.custom_avatar_url = avatar_url }}})],1)]),_c('div',{staticClass:\"fw d-flex align-items-center justify-content-center mt-3\"},[_c('button',{staticClass:\"fw btn btn-secondary mr-1\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.close_modal('client-form-modal')}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"fw btn btn-gradient btn-info ml-1\",attrs:{\"type\":\"submit\",\"disabled\":_vm.client_form.loading}},[_vm._v(\"Save\"),(_vm.client_form.loading)?_c('i',{staticClass:\"ion-load-c spin\"}):_vm._e()])])])]),_c('section',{staticClass:\"fw text-center\"},[_c('button',{staticClass:\"btn btn-outline-danger text-bold\",attrs:{\"disabled\":_vm.logout_loading},on:{\"click\":function($event){$event.preventDefault();return _vm.logout_client()}}},[_c('i',{staticClass:\"ion-power mr-2\"}),_vm._v(\"Log out from this Space \"),(_vm.logout_loading)?_c('i',{staticClass:\"ion-load-c spin ml-1\"}):_vm._e()])]),_c('hr'),_vm._m(3)])])]):_vm._e()]):_vm._e(),(!_vm.is_skyflok_user)?_c('div',{staticClass:\"modal\",attrs:{\"id\":\"welcome-modal\"}},[_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-primary text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\"Welcome to SkyFlok!\")]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('welcome-modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\",class:{'px-4 mx-4': !_vm.is_mobile}},[_c('div',{staticClass:\"fw text-center mb-4\"},[_c('h4',[_vm._v(\"Hi \"),_c('b',[_vm._v(_vm._s(_vm.space.client_name))]),_vm._v(\", welcome to you new Client Space!\")])]),_c('p',[_vm._v(\" This is a secure, private shared folder between you and \"),_c('strong',[_vm._v(_vm._s(_vm.skyflok_team.name))]),_vm._v(\". \"),(!_vm.space.client_readonly)?_c('span',[_vm._v(\" You can share files with each other, organize them into folders, delete and restore them as you wish. \")]):_c('span',[_vm._v(\" You can see and download the files that \"+_vm._s(_vm.skyflok_team.name)+\" uploads here for you. \")]),_vm._v(\" In the sidebar you can see the last few files uploads and downloads. \")]),_c('p',[(_vm.space.watch_client)?_c('span',[_vm._v(\" You will \"),_c('b',[_vm._v(\"receive an email\")]),_vm._v(\" when new files has been uploaded. You can turn this feature off in the sidebar any time. \")]):_c('span',[_vm._v(\" It's recommended to turn on email notifications, so you know when there's something new for you here. \"),_c('div',{staticClass:\"fw text-center mt-2\"},[_c('button',{staticClass:\"btn btn-default btn-bold\",attrs:{\"disabled\":_vm.change_watch_loading},on:{\"click\":function($event){return _vm.change_watch()}}},[_c('i',{staticClass:\"mr-2\",class:{'ion-android-notifications': !_vm.change_watch_loading, 'ion-load-c spin': _vm.change_watch_loading}}),_vm._v(\" Turn on email notifications \")])])])]),(!_vm.mfa_enabled)?_c('p',[_vm._v(\" To maximize security, it is highly recommended to enable Two-Factor Authentication. \"),_c('span',{staticClass:\"d-block mt-2 fw text-center\"},[_c('button',{staticClass:\"btn btn-success btn-bold\",on:{\"click\":()=>{ _vm.close_modal('welcome-modal'); _vm._open_modal('2fa-modal') }}},[_c('i',{staticClass:\"ion-locked mr-2\"}),_vm._v(\" Setup Two-Factor Authenticaion \")])])]):_vm._e(),_vm._m(4),_c('p',{staticClass:\"text-center\"},[_c('button',{staticClass:\"btn btn-secondary\",on:{\"click\":function($event){return _vm.close_modal('welcome-modal')}}},[_vm._v(\"Close\")])])])])])]):_vm._e(),(!_vm.is_skyflok_user)?_c('div',{staticClass:\"modal\",attrs:{\"id\":\"2fa-modal\"}},[_c('div',{staticClass:\"modal-dialog modal-lg\"},[_c('div',{staticClass:\"modal-content\"},[_c('div',{staticClass:\"modal-header bg-gradient-primary text-white\"},[_c('h5',{staticClass:\"mt-0 modal-title\"},[_vm._v(\"Two-Factor Authentication\")]),_c('button',{staticClass:\"close\",attrs:{\"type\":\"button\",\"aria-label\":\"Close\"},on:{\"click\":function($event){return _vm.close_modal('2fa-modal')}}},[_c('span',[_vm._v(\"×\")])])]),_c('div',{staticClass:\"modal-body\",class:{'px-4 mx-4': !_vm.is_mobile}},[(_vm.mfa_alert)?_c('div',{staticClass:\"alert\",class:{'alert-danger': _vm.mfa_alert.type=='error', 'alert-success': _vm.mfa_alert.type=='success'}},[_c('span',{staticClass:\"float-right clickable\",staticStyle:{\"margin-right\":\"-.5em\"},attrs:{\"data-dismiss\":\"modal\"},on:{\"click\":function($event){$event.preventDefault();_vm.mfa_alert = null}}},[_c('em',{staticClass:\"ion-close-round\"})]),_vm._v(\" \"+_vm._s(_vm.mfa_alert.msg)+\" \")]):_vm._e(),_c('h5',{staticClass:\"cardbox-heading pb-0\"},[_vm._v(\"  \"),(_vm.mfa_status && _vm.mfa_status.has_2fa && _vm.mfa_content == 'status')?_c('div',{staticClass:\"float-right dropdown btn-group\"},[_vm._m(5),_c('div',{staticClass:\"dropdown-menu dropdown-menu-right\",attrs:{\"role\":\"menu\"}},[_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'show_qr' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-lock-combination mr-2\"}),_vm._v(\" Set up a new phone or app\")]),_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'recovery_codes' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-help-buoy mr-2\"}),_vm._v(\" Show my backup codes\")]),_c('a',{staticClass:\"dropdown-item\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'history' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-calendar mr-2\"}),_vm._v(\" Event Log\")]),_c('div',{staticClass:\"dropdown-divider\"}),_c('a',{staticClass:\"dropdown-item text-danger\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'lost_phone' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-alert-circled mr-2\"}),_vm._v(\" I lost my phone\")]),_c('a',{staticClass:\"dropdown-item text-danger\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return (()=>{ _vm.mfa_content = 'delete' }).apply(null, arguments)}}},[_c('i',{staticClass:\"ion-trash-a mr-2\"}),_vm._v(\" Disable two factor auth\")])])]):_vm._e(),(_vm.mfa_content=='show_qr')?_c('button',{staticClass:\"btn btn-secondary btn-sm float-right\",on:{\"click\":function($event){_vm.mfa_content = 'status'}}},[_c('i',{staticClass:\"ion-close-round text-grey mr-2\"}),_vm._v(\"Cancel\")]):_vm._e()]),_c('div',{staticClass:\"cardbox-body\"},[_c('mfa',{attrs:{\"user_email\":_vm.space ? _vm.space.client_email : false,\"mfa_content\":_vm.mfa_content,\"is_client_space\":true,\"show_success\":(msg)=>{ _vm.mfa_alert = { type: 'success', msg: msg } },\"show_error\":(msg)=>{ _vm.mfa_alert = { type: 'error', msg: msg } }},on:{\"mfa_status_loaded\":(status) => { _vm.mfa_status = status },\"mfa_content_change\":(new_content) => { _vm.mfa_content = new_content }}})],1)])])])]):_vm._e()]):_c('div',{staticClass:\"layout-container\"},[_c('div',{staticClass:\"page-container bg-blue-grey-900\"},[_c('div',{staticClass:\"d-flex align-items-center align-items-center-ie bg-gradient-info\"},[_c('div',{staticClass:\"fw\"},[_c('div',{staticClass:\"container container-xs\"},[_c('div',{staticClass:\"cardbox cardbox-flat text-white form-validate text-color\"},[_vm._m(6),(_vm.login.error)?_c('div',{staticClass:\"alert alert-danger mb-3\",domProps:{\"innerHTML\":_vm._s(_vm.login.error)}}):_vm._e(),(!_vm.disable_login)?_c('section',[(_vm.login_form == 'autologin')?_c('div',[_vm._m(7)]):(_vm.login_form == 'login')?_c('div',{staticClass:\"cardbox-body\",staticStyle:{\"margin-bottom\":\"200px\"}},[_c('div',{staticClass:\"mb-5\"},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.login_client()}}},[_c('div',{staticClass:\"input-group\"},[(_vm.key)?_c('input',{staticStyle:{\"display\":\"none\"},attrs:{\"type\":\"hidden\",\"name\":\"space_key\"},domProps:{\"value\":_vm.key}}):_vm._e(),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.login.password),expression:\"login.password\"}],staticClass:\"form-control form-control-inverse\",attrs:{\"type\":\"password\",\"name\":\"password\",\"id\":\"password_field\",\"required\":\"required\",\"placeholder\":\"Password\",\"data-msg\":\"Please type your password\"},domProps:{\"value\":(_vm.login.password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.login, \"password\", $event.target.value)}}}),_c('span',{staticClass:\"input-group-btn\"},[_c('button',{staticClass:\"btn btn-secondary btn-gradient\",attrs:{\"type\":\"submit\",\"disabled\":!_vm.login.password || _vm.login.loading}},[_vm._v(\" Login \"),_c('i',{staticClass:\"icon-lg ml-2\",class:{'ion-ios-locked-outline': !_vm.login.loading, 'ion-load-c spin': _vm.login.loading}})])])]),_c('div',{staticClass:\"form-group mt-2\"},[_c('checkbox',{attrs:{\"value\":_vm.login.stay_logged_in,\"label\":\"Keep me logged in\",\"name\":\"client_space_login_stay_logged_in\"},on:{\"changed\":newval => _vm.login.stay_logged_in = newval}})],1)]),_c('div',{staticClass:\"fw text-center mt-2\"},[_c('a',{staticClass:\"text-white text-sm\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.login_form='forgotten-password'}}},[_vm._v(\"Forgot your password?\")])])]),(_vm.team_info)?_c('div',{staticClass:\"text-center mt-4 mb-4 mt-0\"},[_c('div',{staticClass:\"mb-4 text-center\",staticStyle:{\"font-size\":\"1.4em\"}},[_vm._v(\" Log in to access your Client Space with\"),_c('br'),_c('b',[_vm._v(_vm._s(_vm.team_info.name))])]),_c('login-logos',{attrs:{\"team_logo\":_vm.team_info.logo_url,\"client_logo\":_vm.client_has_custom_logo ? _vm.client_logo : null}})],1):_vm._e()]):(_vm.login_form == 'email_password')?_c('div',{staticClass:\"cardbox-body\",staticStyle:{\"margin-bottom\":\"200px\"}},[_c('div',{staticClass:\"mb-5\"},[_c('form',{on:{\"submit\":function($event){$event.preventDefault();return _vm.login_client()}}},[_vm._m(8),_c('div',{staticClass:\"cardbox-body\"},[_c('div',{staticClass:\"px-5\"},[_c('div',{staticClass:\"form-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.login.email),expression:\"login.email\"}],staticClass:\"form-control form-control-inverse\",attrs:{\"id\":\"email\",\"name\":\"space_email\",\"type\":\"email\",\"placeholder\":\"Email address\"},domProps:{\"value\":(_vm.login.email)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.login, \"email\", $event.target.value)}}})]),_c('div',{staticClass:\"form-group\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.login.password),expression:\"login.password\"}],staticClass:\"form-control form-control-inverse\",attrs:{\"id\":\"password\",\"name\":\"space_password\",\"type\":\"password\",\"placeholder\":\"Password\"},domProps:{\"value\":(_vm.login.password)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.login, \"password\", $event.target.value)}}})]),_c('div',{staticClass:\"form-group\"},[_c('checkbox',{attrs:{\"value\":_vm.login.stay_logged_in,\"label\":\"Keep me logged in\",\"name\":\"client_space_login_stay_logged_in\"},on:{\"changed\":newval => _vm.login.stay_logged_in = newval}})],1),_c('button',{staticClass:\"btn btn-lg btn-oval btn-gradient text-bold btn-secondary btn-block\",attrs:{\"type\":\"submit\",\"disabled\":_vm.login.loading || !_vm.login.email || !_vm.login.password}},[_vm._v(\" Login \"),(_vm.login.loading)?_c('i',{staticClass:\"ion-load-c icon-lg spin ml-2\"}):_vm._e()])])])])])]):(_vm.login_form == '2fa')?_c('div',{staticClass:\"text-center\"},[_c('mfa-login',{attrs:{\"mfa_mode\":_vm.mfa_mode,\"user_email\":null,\"sms_phone_number\":_vm.mfa_sms_phone_number,\"mfa_cooldown_seconds\":_vm.mfa_cooldown},on:{\"code_changed\":(code) => { _vm.mfa_mode == 'backup' ? _vm.login.mfa_backup_code = code : _vm.login.mfa_code = code },\"change_mfa_mode\":(new_mode) => { _vm.mfa_mode = new_mode }}}),_c('button',{staticClass:\"btn btn-lg btn-oval btn-gradient text-bold btn-secondary px-5 mt-4\",on:{\"click\":function($event){$event.preventDefault();return _vm.login_client()}}},[_vm._v(\" Login \"),(_vm.login.loading)?_c('i',{staticClass:\"ion-load-c icon-lg spin ml-2\"}):_vm._e()])],1):(_vm.login_form == 'invite')?_c('div',{staticClass:\"cardbox-body\",staticStyle:{\"margin-bottom\":\"100px\"}},[(_vm.invite_loading)?_c('h3',[_vm._v(\"Loading your invite...\"),_c('i',{staticClass:\"ion-load-c spin ml-2\"})]):(_vm.invite)?_c('section',[_c('login-logos',{staticClass:\"mb-3\",attrs:{\"team_logo\":_vm.invite.team_logo_url,\"client_logo\":_vm.invite.client_logo}}),_c('h3',[_vm._v(\"Hello, \"+_vm._s(_vm.invite.client_name)+\"!\")]),_c('br'),_c('p',{staticClass:\"text-justified\"},[_vm._v(\" You have been invited by \"),_c('b',[_vm._v(_vm._s(_vm.invite.team_name))]),_vm._v(\" to this online shared folder called Client Space. \"),_c('br'),_vm._v(\"In this folder, you can: \")]),_c('div',{},[_vm._m(9),_c('span',{staticClass:\"d-block pl-3\",class:{'text-muted': _vm.invite.client_readonly, 'text-bold': !_vm.invite.client_readonly}},[_c('i',{staticClass:\"mr-2\",class:{'ion-checkmark': !_vm.invite.client_readonly, 'ion-close-round': _vm.invite.client_readonly}}),_vm._v(\"Upload, move, delete or restore files and folders\")])]),_c('p',{staticClass:\"text-justified mt-4\"},[_vm._v(\" Set your private password to accept the invitation and join the Space! \")]),_c('div',{staticClass:\"mt-2\"},[(!_vm.invite_password_generated)?_c('button',{staticClass:\"btn btn-sm text-sm\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.generate_password()}}},[_vm._v(\" Generate strong password \"),_c('i',{staticClass:\"ion-locked ml-1\"})]):_c('span',{staticClass:\"text-sm\"},[_vm._v(\" Your password: \"),_c('span',{staticClass:\"bg-gray-dark px-1 mr-1 py-1 text-bold text-monospace\",staticStyle:{\"font-size\":\"1.2em\"},attrs:{\"id\":\"generated_psw\"}},[_vm._v(_vm._s(_vm.invite_form.psw1))]),_c('i',{staticClass:\"ion-refresh c-pointer\",on:{\"click\":function($event){return _vm.generate_password()}}})])]),_c('form',{attrs:{\"method\":\"post\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.submit_invite_form.apply(null, arguments)}}},[_c('div',{staticClass:\"d-flex align-items-center justify-content-between py-2\"},[(_vm.invite_password_visible)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.invite_form.psw1),expression:\"invite_form.psw1\"}],staticClass:\"form-control form-control-inverse mr-1\",attrs:{\"type\":\"text\",\"name\":\"password\",\"placeholder\":\"Password\",\"required\":\"required\",\"autocomplete\":\"off\"},domProps:{\"value\":(_vm.invite_form.psw1)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.invite_form, \"psw1\", $event.target.value)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.invite_form.psw1),expression:\"invite_form.psw1\"}],staticClass:\"form-control form-control-inverse mr-1\",attrs:{\"type\":\"password\",\"name\":\"password\",\"placeholder\":\"Password\",\"required\":\"required\",\"autocomplete\":\"off\"},domProps:{\"value\":(_vm.invite_form.psw1)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.invite_form, \"psw1\", $event.target.value)}}}),(_vm.invite_password_visible)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.invite_form.psw2),expression:\"invite_form.psw2\"}],staticClass:\"form-control form-control-inverse ml-1\",attrs:{\"type\":\"text\",\"required\":\"required\",\"name\":\"password2\",\"autocomplete\":\"off\",\"placeholder\":\"Repeat password\"},domProps:{\"value\":(_vm.invite_form.psw2)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.invite_form, \"psw2\", $event.target.value)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.invite_form.psw2),expression:\"invite_form.psw2\"}],staticClass:\"form-control form-control-inverse ml-1\",attrs:{\"type\":\"password\",\"required\":\"required\",\"name\":\"password2\",\"autocomplete\":\"off\",\"placeholder\":\"Repeat password\"},domProps:{\"value\":(_vm.invite_form.psw2)},on:{\"input\":function($event){if($event.target.composing)return;_vm.$set(_vm.invite_form, \"psw2\", $event.target.value)}}}),_c('a',{staticClass:\"ml-2 text-white\",attrs:{\"href\":\"#\",\"title\":\"Show/hide password\"},on:{\"click\":function($event){$event.preventDefault();_vm.invite_password_visible = !_vm.invite_password_visible}}},[_c('i',{staticClass:\"ion-eye\",class:{'ion-eye': !_vm.invite_password_visible, 'ion-eye-disabled': _vm.invite_password_visible}})])]),(_vm.invite_show_mfa)?_c('div',{staticClass:\"mb-3\"},[_c('p',{staticClass:\"text-12 mt-2\"},[_vm._v(\"Two-Factor Authentication required\")]),_c('mfa-login',{attrs:{\"mfa_mode\":_vm.mfa_mode,\"user_email\":null,\"sms_phone_number\":_vm.mfa_sms_phone_number,\"mfa_cooldown_seconds\":_vm.mfa_cooldown},on:{\"code_changed\":(code) => { _vm.mfa_mode == 'backup' ? _vm.invite_form.mfa_backup_code = code : _vm.invite_form.mfa_code = code },\"change_mfa_mode\":(new_mode) => { _vm.mfa_mode = new_mode }}})],1):_c('div',{staticClass:\"text-italic\"},[_vm._v(\" Note: You can set up Two-Factor Authentication after joining the space. \"),_c('info-icon',{attrs:{\"content\":\"You can substantially increase security of your shared folder if you enable Two-Factor Authentication. Entering the folder will be secured both by your password and a one-time code that you receive on your phone.\"}})],1),_c('div',{staticClass:\"form-group my-3\"},[_c('checkbox',{attrs:{\"label\":\"Notify me in email when a new file is uploaded (recommended)\",\"name\":\"watch_client\",\"value\":_vm.invite_form.watch_client},on:{\"changed\":newval => _vm.invite_form.watch_client=newval}})],1),_c('div',{staticClass:\"form-group my-3\"},[_c('checkbox',{attrs:{\"label\":\"Keep me logged in\",\"name\":\"stay_logged_in\",\"value\":_vm.invite_form.stay_logged_in},on:{\"changed\":newval => _vm.invite_form.stay_logged_in=newval}})],1),(_vm.invite_form.error)?_c('div',{staticClass:\"alert alert-danger\",domProps:{\"innerHTML\":_vm._s(_vm.invite_form.error)}}):_vm._e(),(!_vm.invite_form.success)?_c('button',{staticClass:\"mt-2 btn btn-secondary text-bold text-primary fw\",attrs:{\"type\":\"submit\",\"disabled\":_vm.invite_form.loading}},[_vm._v(\"Join Client Space\"),(_vm.invite_form.loading)?_c('i',{staticClass:\"ion-load-c ml-2 spin\"}):_vm._e()]):_c('div',{staticClass:\"alert alert-success\"},[_vm._v(\"Success, entering Space...\")])])],1):_vm._e()]):(_vm.login_form == 'forgotten-password')?_c('div',{staticClass:\"cardbox-body\",staticStyle:{\"margin-bottom\":\"100px\"}},[_c('div',{staticClass:\"fw text-center mt-2\"},[(!_vm.resend_invite.success)?_c('section',[_c('p',[_vm._v(\"Click the button below to reset your password and receive a new invite link to \")]),(_vm.team_info && _vm.team_info.redacted_client_email)?_c('div',{staticClass:\"text-bold redacted_email\"},[_vm._v(_vm._s(_vm.team_info.redacted_client_email))]):_vm._e(),_c('button',{staticClass:\"btn btn-lg btn-secondary text-bold text-primary text-12 mt-4\",attrs:{\"disabled\":_vm.resend_invite.loading},on:{\"click\":function($event){return _vm.forgotten_password()}}},[_vm._v(\" Reset password\"),(_vm.resend_invite.loading)?_c('i',{staticClass:\"ion-load-c ml-2 spin\"}):_vm._e()]),(_vm.resend_invite.error)?_c('div',{staticClass:\"alert alert-danger mt-3\",domProps:{\"innerHTML\":_vm._s(_vm.resend_invite.error)}}):_vm._e(),_vm._m(10),_c('div',{staticClass:\"mt-5\"},[_c('a',{staticClass:\"text-white text-sm\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.login_form='login'}}},[_c('i',{staticClass:\"ion-arrow-left-c mr-2\"}),_vm._v(\"Back to login\")])])]):_c('section',[_c('div',{staticClass:\"alert alert-success\"},[_vm._v(\" Your password has been reset and we sent a new invite email \"),(_vm.team_info && _vm.team_info.redacted_client_email)?[_vm._v(\" to \"),_c('div',{staticClass:\"my-2 text-bold redacted_email\"},[_vm._v(_vm._s(_vm.team_info.redacted_client_email))])]:_vm._e(),_c('div',[_vm._v(\"The invite expires in 24 hours.\")])],2),_c('div',{staticClass:\"mt-4 text-12\"},[_vm._v(\"Close this page now and click the invite link in the email!\")])])])]):(_vm.login_form == 'forgotten-password-nospace')?_c('div',{staticClass:\"cardbox-body\",staticStyle:{\"margin-bottom\":\"100px\"}},[_c('div',{staticClass:\"fw text-center mt-2\"},[_vm._v(\" TODO email + button form \"),_c('div',{staticClass:\"mt-5\"},[_c('a',{staticClass:\"text-white text-sm\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.login_form='email_password'}}},[_vm._v(\"Back to login\")])])])]):_vm._e()]):_vm._e()])])])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('ul',{staticClass:\"d-inline-block d-lg-none text-left\"},[_c('li',[_c('a',{staticClass:\"sidebar-toggler menu-link menu-link-close\",attrs:{\"href\":\"#\"}},[_c('span',[_c('em')])])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('ul',{staticClass:\"d-none d-xs-block text-left\"},[_c('li',[_c('a',{staticClass:\"covermode-toggler menu-link menu-link-close\",attrs:{\"href\":\"#\"}},[_c('span',[_c('em')])])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"d-inline-block d-sm-none\",attrs:{\"id\":\"skyflok_center_logo\"}},[_c('img',{attrs:{\"src\":require(\"@/assets/img/skyflok_logo_black.png\"),\"width\":\"100\"}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"text-center\"},[_c('small',{staticClass:\"text-info\"},[_vm._v(\" Hello and welcome to SkyFlok!\"),_c('br'),_vm._v(\"If you have any questions or requests about privacy, how your personal information is handled or what happened to your uploaded files, don't hesitate to contact us via email at \"),_c('a',{attrs:{\"href\":\"mailto:support@skyflok.com\"}},[_vm._v(\"support@skyflok.com\")]),_vm._v(\". \"),_c('br'),_vm._v(\"Best regards from the SkyFlok Team! \")])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('p',{staticClass:\"mt-3\"},[_vm._v(\" If you have any questions or requests about privacy, how your personal information is handled or what happened to your uploaded files, don't hesitate to contact us via email at \"),_c('a',{attrs:{\"href\":\"mailto:support@skyflok.com\"}},[_vm._v(\"support@skyflok.com\")]),_vm._v(\". \"),_c('br'),_vm._v(\"Best regards from the SkyFlok Team! \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('button',{staticClass:\"btn btn-secondary btn-sm\",staticStyle:{\"font-size\":\"1rem\"},attrs:{\"type\":\"button\",\"data-toggle\":\"dropdown\",\"aria-expanded\":\"false\"}},[_c('i',{staticClass:\"ion-gear-b text-grey mr-2\"}),_vm._v(\" Settings \")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox-heading text-center\"},[_c('img',{staticClass:\"block-center img-fluid\",staticStyle:{\"max-width\":\"40%\"},attrs:{\"src\":require(\"@/assets/img/skyflok_logo_lg.png\"),\"alt\":\"SkyFlok\"}})])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',[_c('h4',{staticClass:\"fw text-center\"},[_vm._v(\" Loading Space... \"),_c('i',{staticClass:\"ion-load-c spin ml-2\"})])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"cardbox-heading\"},[_c('div',{staticClass:\"cardbox-title text-center\"},[_c('h4',[_vm._v(\"Log in to your Client Space\")])])])\n},function (){var _vm=this,_c=_vm._self._c;return _c('span',{staticClass:\"d-block pl-3 text-bold\"},[_c('i',{staticClass:\"ion-checkmark mr-2\"}),_vm._v(\"Browse and download any file you want\")])\n},function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"mt-4 text-justify\"},[_c('i',{staticClass:\"ion-information-circled mr-2\"}),_vm._v(\" If you have Two-Factor Authentication enabled, you will have to provide the authentication code (or backup code) as part of the password reset process. \")])\n}]\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"fw text-center\"},[(_vm.client_logo && _vm.team_logo)?_c('div',{staticClass:\"nowrap\"},[_c('img',{staticClass:\"thumb80 shadow-z5\",attrs:{\"src\":_vm.team_logo}}),_c('i',{staticClass:\"ion-code icon-lg mx-4\"}),_c('img',{staticClass:\"thumb80 shadow-z5\",attrs:{\"src\":_vm.client_logo}})]):(_vm.team_logo)?_c('div',[(_vm.team_logo)?_c('img',{attrs:{\"src\":_vm.team_logo}}):_vm._e()]):(_vm.client_logo)?_c('div',[(_vm.client_logo)?_c('img',{attrs:{\"src\":_vm.client_logo}}):_vm._e()]):_vm._e()])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n
\n
\n
\n
\n
\n\n
\n
\n
\n\n
\n
\n
\n
\n \n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client_space_login_logos.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client_space_login_logos.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./client_space_login_logos.vue?vue&type=template&id=704f4232&scoped=true\"\nimport script from \"./client_space_login_logos.vue?vue&type=script&lang=js\"\nexport * from \"./client_space_login_logos.vue?vue&type=script&lang=js\"\nimport style0 from \"./client_space_login_logos.vue?vue&type=style&index=0&id=704f4232&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"704f4232\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"d-flex align-items-center justify-contents-middle fw py-2 mr-2\",class:{'c-pointer': _vm.is_clickable},attrs:{\"title\":_vm.is_clickable ? 'Click to show file' : false},on:{\"click\":()=>{ _vm.is_clickable ? _vm.$emit('file_clicked', _vm.event.file) : false }}},[(_vm.event_user)?_c('div',{staticClass:\"thumb32\"},[(_vm.event_user.avatar_url || _vm.event_user.logo_url)?_c('img',{staticClass:\"thumb32 fit-contain\",class:{'rounded-circle':!_vm.event_user.is_client, 'rounded': _vm.event_user.is_client},attrs:{\"src\":_vm.event_user.avatar_url ? (_vm.event_user.is_builtin_logo ? _vm.Utils.client_space_logo_src(_vm.event_user.avatar_url) : _vm.event_user.avatar_url) : _vm.event_user.logo_url}}):_vm._e()]):_vm._e(),_c('div',{staticClass:\"ml-2 fw text-sm nowrap\",staticStyle:{\"line-height\":\"1.1em\",\"overflow\":\"hidden\"}},[(_vm.event.event_type == 'file_download' || _vm.event.event_type == 'file_upload')?_c('div',[_c('i',{staticClass:\"mr-1\",class:{\n 'ion-arrow-down-a text-success': _vm.event.event_type == 'file_download', \n 'ion-arrow-up-a text-info': _vm.event.event_type == 'file_upload'\n }}),(_vm.event.file)?_c('img',{staticClass:\"mr-1\",attrs:{\"src\":_vm._f(\"filetype_img_src\")(_vm.get_extension(_vm.event_file.name)),\"height\":\"20\"}}):_vm._e(),_c('span',{domProps:{\"innerHTML\":_vm._s(_vm.event_file.name)}})]):_vm._e(),_c('small',{staticClass:\"text-muted\"},[_vm._v(\" \"+_vm._s(_vm._f(\"timestamp_rel\")(_vm.event.timestamp))+\" \")])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n { is_clickable ? $emit('file_clicked', event.file) : false }\"\n :title=\"is_clickable ? 'Click to show file' : false\"\n >\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n {{ event.timestamp | timestamp_rel }}\n \n
\n
\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client_space_app_event.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client_space_app_event.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./client_space_app_event.vue?vue&type=template&id=a2409b8e&scoped=true\"\nimport script from \"./client_space_app_event.vue?vue&type=script&lang=js\"\nexport * from \"./client_space_app_event.vue?vue&type=script&lang=js\"\nimport style0 from \"./client_space_app_event.vue?vue&type=style&index=0&id=a2409b8e&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a2409b8e\",\n null\n \n)\n\nexport default component.exports","\n\n \n\n \n \n\n\n
\n\n \n\n \n \n This Space is archived, you can browse it but cannot upload, download or change anything.\n \n
\n\n { on_file_uploaded(file) }\"\n :file_download_started=\"(file) => { report_file_event('download_start', file) }\"\n @file_download_succeeded=\"(file) => { report_file_event('download_finished', file); load_recent_events() }\"\n :file_download_error=\"(file) => { report_file_event('download_error', file, error) }\"\n > \n\n \n \n\n
\n
\n
\n
\n
\n Deleted files and directories are stored here for 30 days.\n \n You can recover them during this period, afterwards they are deleted automatically.\n
\n
\n
\n
\n\n
\n
\n\n \n\n \n
\n\n \n
\n
\n
\n \n
\n
\n
Hi {{ space.client_name }} , welcome to you new Client Space! \n \n
\n This is a secure, private shared folder between you and {{ skyflok_team.name }} .\n \n You can share files with each other, organize them into folders, delete and restore them as you wish.\n \n \n You can see and download the files that {{ skyflok_team.name }} uploads here for you.\n \n In the sidebar you can see the last few files uploads and downloads.\n
\n
\n \n You will receive an email when new files has been uploaded. You can turn this feature off in the sidebar any time.\n \n \n It's recommended to turn on email notifications, so you know when there's something new for you here.\n \n \n \n Turn on email notifications \n \n
\n \n
\n\n
\n To maximize security, it is highly recommended to enable Two-Factor Authentication. \n \n { close_modal('welcome-modal'); _open_modal('2fa-modal') }\">\n \n Setup Two-Factor Authenticaion\n \n \n
\n\n
\n If you have any questions or requests about privacy, how your personal\n information is handled or what happened to your uploaded files, don't hesitate to contact us\n via email at support@skyflok.com .\n Best regards from the SkyFlok Team!\n
\n\n
\n Close \n
\n
\n
\n
\n
\n\n \n
\n
\n
\n \n
\n \n
\n \n {{mfa_alert.msg}}\n
\n\n
\n \n \n \n \n Settings\n \n \n
\n \n \n Cancel \n \n \n\n
\n { mfa_alert = { type: 'success', msg: msg } }\"\n :show_error=\"(msg)=>{ mfa_alert = { type: 'error', msg: msg } }\"\n @mfa_status_loaded=\"(status) => { mfa_status = status }\"\n @mfa_content_change=\"(new_content) => { mfa_content = new_content }\"\n />\n
\n\n
\n
\n
\n
\n\n
\n\n \n \n
\n
\n
\n
\n
\n\n
\n
\n
\n\n
\n\n
\n\n \n \n
\n
\n Loading Space... \n \n \n
\n\n \n \n
\n\n
\n
\n Log in to access your Client Space with \n {{ team_info.name }} \n
\n\n
\n \n\n
\n
\n\n \n \n
\n
\n\n \n
\n
Log in to your Client Space \n \n
\n\n \n
\n
\n \n
\n
\n \n
\n
\n login.stay_logged_in = newval\" />\n
\n\n
\n Login \n \n
\n
\n \n \n
\n
\n\n \n \n { mfa_mode == 'backup' ? login.mfa_backup_code = code : login.mfa_code = code }\"\n @change_mfa_mode=\"(new_mode) => { mfa_mode = new_mode }\"\n />\n\n \n Login \n \n
\n\n \n \n\n
Loading your invite... \n
\n \n \n\n\n Hello, {{ invite.client_name }}! \n \n \n You have been invited by {{ invite.team_name }} to this online shared folder called Client Space.\n In this folder, you can:\n
\n \n \n Browse and download any file you want \n Upload, move, delete or restore files and folders \n
\n\n \n Set your private password to accept the invitation and join the Space!\n
\n\n \n \n Generate strong password\n \n \n \n Your password:\n {{ invite_form.psw1 }} \n \n \n
\n \n \n\n \n \n \n
Two-Factor Authentication required
\n
{ mfa_mode == 'backup' ? invite_form.mfa_backup_code = code : invite_form.mfa_code = code }\"\n @change_mfa_mode=\"(new_mode) => { mfa_mode = new_mode }\"\n \n />\n \n \n Note: You can set up Two-Factor Authentication after joining the space. \n \n
\n\n \n invite_form.watch_client=newval\" \n />\n
\n\n \n invite_form.stay_logged_in=newval\" \n />\n
\n\n
\n\n Join Client Space \n Success, entering Space...
\n\n \n \n\n
\n\n \n \n
\n
\n Click the button below to reset your password and receive a new invite link to
\n {{ team_info.redacted_client_email }}
\n \n Reset password \n \n\n
\n\n \n \n If you have Two-Factor Authentication enabled, you will have to provide the authentication code \n (or backup code) as part of the password reset process.\n
\n\n \n \n
\n \n Your password has been reset and we sent a new invite email \n
\n to {{ team_info.redacted_client_email }}
\n \n
The invite expires in 24 hours.
\n
\n Close this page now and click the invite link in the email!
\n \n\n \n\n
\n
\n\n \n
\n TODO email + button form\n\n
\n\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n \n \n\n\n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client_space_app.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./client_space_app.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./client_space_app.vue?vue&type=template&id=3f0de07c&scoped=true\"\nimport script from \"./client_space_app.vue?vue&type=script&lang=js\"\nexport * from \"./client_space_app.vue?vue&type=script&lang=js\"\nimport style0 from \"./client_space_app.vue?vue&type=style&index=0&id=3f0de07c&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3f0de07c\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('span',[_vm._v(\"Client Join\")])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./join-form.vue?vue&type=template&id=240d9722\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"layout-container\",class:{'bg-gradient-danger': _vm.error !== false, 'bg-gradient-secondary': _vm.error === false},staticStyle:{\"overflow\":\"overlay\"}},[_c('div',{staticClass:\"page-container\"},[_c('div',{staticClass:\"container-fluid\"},[_c('div',{staticClass:\"row\"},[(_vm.blob_url)?_c('file-preview',{staticClass:\"col-12 text-center\",attrs:{\"blob_url\":_vm.blob_url,\"file_name\":_vm.file_name,\"mime_type\":_vm.mime_type,\"viewer_name\":_vm.viewer_name}}):_c('div',[_vm._v(\" No file \")])],1)])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n
\n
\n
\n\n
\n \n
\n No file\n
\n\n
\n
\n
\n
\n \n\n\n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./preview-app.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./preview-app.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./preview-app.vue?vue&type=template&id=210f494e\"\nimport script from \"./preview-app.vue?vue&type=script&lang=js\"\nexport * from \"./preview-app.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"layout-container\"},[_c('div',{staticClass:\"page-container\"},[_c('div',{staticClass:\"d-flex align-items-center align-items-center-ie\"},[_c('div',{staticClass:\"fw container container-sm\"},[_c('div',{staticClass:\"cardbox text-bold\"},[_c('div',{staticClass:\"pb-1\",class:[_vm.status_ribbon_class]}),_c('div',{staticClass:\"p-4\"},[_c('router-view',{on:{\"changeStatus\":(new_status) => _vm.status_changed(new_status)}})],1),_vm._m(0),_c('div',{staticClass:\"pt-1\",class:[_vm.status_ribbon_class]})])])])])])\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"d-flex align-items-center justify-content-center fw mb-2 text-gray text-sm\"},[_vm._v(\" Made in Scandinavia \"),_c('img',{staticClass:\"ml-2\",attrs:{\"src\":require(\"@/assets/img/flags/DK.png\"),\"height\":\"20\",\"alt\":\"Danish flag\"}})])\n}]\n\nexport { render, staticRenderFns }","\n\n\t
\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t
\n
\n\t\t\t\t\t status_changed(new_status)\" \n\t\t\t\t\t/>\n
\n
\n Made in Scandinavia\n
\n
\n
\n\t\t\t
\n\t\t
\n\t
\n\t
\n
\n \n","import mod from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./register-forms-container.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./register-forms-container.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./register-forms-container.vue?vue&type=template&id=c8cfb1c2\"\nimport script from \"./register-forms-container.vue?vue&type=script&lang=js\"\nexport * from \"./register-forms-container.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\n\nimport VueRouter from 'vue-router'\nimport VueResource from 'vue-resource'\nimport * as Sentry from \"@sentry/vue\";\n\nVue.use(VueRouter)\nVue.use(VueResource)\n\n\nimport App from './App.vue'\nimport loginView from './components/login.vue'\nimport registerView from './components/register.vue'\nimport joinTeamView from './components/join-team.vue'\n\nimport adminFolderView from './views/admin_folder.vue'\nimport filesView from './views/files.vue'\nimport recycleBinView from './views/recycle_bin.vue'\nimport sharesView from './views/shares.vue'\nimport clientSpacesView from './views/client_spaces.vue'\nimport settingsView from './views/settings.vue'\nimport teamMembersView from './views/team_members.vue'\nimport installAppsView from './views/install_apps.vue'\nimport bugReportView from './views/bug_report.vue'\nimport upgradeTeamView from './views/upgrade_team.vue'\nimport teamSettingsView from './views/team_settings.vue'\nimport userManagementView from './views/user_management.vue'\nimport teamSetupView from './views/team_setup.vue'\nimport shareApp from './components/share_app.vue'\nimport backendPerformancePage from './views/backend-performance.vue'\nimport notRecognizedRouteView from './views/not-recognized-route.vue'\nimport clientSpaceApp from './views/client_space_app.vue'\nimport clientSpaceJoinView from './client-space-app/join-form'\nimport previewApp from './components/preview-app.vue'\n\n// Container for login, register and join forms\nimport externalRegisterFormsContainer from './view-containers/register-forms-container' \n\nimport { bus, events } from './helpers/event_bus.js'\nimport { Utils } from './helpers/utils.js'\nimport { TokenCache } from './helpers/token-cache.js'\nimport { AuthService } from './services/auth-service.js'\nimport { UserService } from './services/user-service.js'\nimport { FileVersionService } from './services/fileversion-service.js'\nimport { StorageBackendService } from './services/storage_backend-service.js'\nimport { ClientSpacesService } from './services/client_spaces-service.js'\n\n//jQuery is injected via WebPack ProvidePlugin in vue.config.js\n//import '@/assets/css/animate.css'\nimport '@/assets/css/ionicons/css/ionicons.css'\nimport '@/assets/css/colors.css'\nimport \"@/assets/vendor/bootstrap-4.0.0/css/bootstrap.min.css\"\nimport \"@/assets/vendor/bootstrap-4.0.0/js/bootstrap.bundle.min.js\" // includes Popper.js\nimport \"@/assets/css/app.css\"\n//import \"@/assets/js/app.js\"\n\nimport * as VueGoogleMaps from \"vue2-google-maps\"\nVue.use(VueGoogleMaps, {\n load: {\n key: 'AIzaSyDd1uHcI91v3EkmJgmpWe34ANQw3wsnZm8',\n libraries: 'places'\n },\n installComponents: true\n});\n\n// List the router names that will be handled separately (e.g. the main wrapper is NOT app.vue)\n// Route names are used as title labels on the UI, write them nicely!\nconst ROUTE_LOGIN_NAME = \"Login\"\n//const ROUTE_RECOVER_PSW_NAME = \"Recover Password\"\nconst ROUTE_REGISTER_NAME = \"Register\"\nconst ROUTE_REGISTER_FREETRIAL_NAME = \"Sign up to free trial\"\nconst ROUTE_JOIN_TEAM_NAME = \"Join Team\"\n\nconst ROUTE_FILES_NAME = \"Team Files\"\nconst ROUTE_RECYCLE_BIN_NAME = \"Recycle Bin\"\nconst ROUTE_SHARES_NAME = \"Shares\"\nconst ROUTE_CLIENT_SPACES_NAME = \"Client Spaces\"\nconst ROUTE_ADMIN_FOLDER_NAME = \"Admin Folder\"\nconst ROUTE_SETTINGS_NAME = \"My Settings\"\nconst ROUTE_TEAM_NAME = \"Team Members\"\nconst ROUTE_INSTALL_NAME = \"Install Apps\"\nconst ROUTE_BUGREPORT_NAME = \"Bug Report\"\nconst ROUTE_UPGRADE_NAME = \"Choose your subscription\"\n\n//const ROUTE_CLOUD_SELECTOR_NAME = \"Cloud Selector\"\nconst ROUTE_TEAM_SETUP_NAME = \"Team Setup\"\nconst ROUTE_TEAM_SETTINGS_NAME = \"Team Settings\"\nconst ROUTE_USER_MANAGEMENT_NAME = \"User Management\"\n\nconst ROUTE_SHARE_WEBAPP = \"SkyFlok Shared Files\"\nconst ROUTE_CLIENT_SPACES_WEBAPP = \"SkyFlok Client Space\"\nconst ROUTE_CLIENT_SPACE_JOIN = \"Join Client Space\"\nconst ROUTE_PREVIEW_APP = \"File Preview\"\nconst ROUTE_BACKEND_PERFORMANCE_PAGE = \"Backend Performance\"\n\n\n\n/*\n List all routes that shouldn't render the default app layout where the user\n is logged in and the menu bar is on the left\n\n Used in the render() function to decide whether to render a special\n layout or the default one\n*/\nconst special_routes = [\n {\n name: ROUTE_LOGIN_NAME,\n view: loginView\n },\n {\n name: ROUTE_SHARE_WEBAPP,\n view: shareApp\n },\n {\n name: ROUTE_CLIENT_SPACES_WEBAPP,\n view: clientSpaceApp\n },\n {\n name: ROUTE_PREVIEW_APP,\n view: previewApp\n },\n {\n /* TODO use externalRegisterFormsContainer */\n name: ROUTE_JOIN_TEAM_NAME,\n view: joinTeamView\n },\n { /* TODO use externalRegisterFormsContainer */\n name: ROUTE_CLIENT_SPACE_JOIN,\n view: clientSpaceJoinView\n },\n {\n name: ROUTE_REGISTER_FREETRIAL_NAME,\n view: externalRegisterFormsContainer\n },\n {\n name: ROUTE_REGISTER_NAME,\n view: externalRegisterFormsContainer\n },\n {\n name: ROUTE_BACKEND_PERFORMANCE_PAGE,\n view: backendPerformancePage\n }\n]\n\n\n// List routes where the user does not have to be logged in\nconst routes_without_login = [\n ROUTE_LOGIN_NAME,\n ROUTE_TEAM_SETUP_NAME,\n ROUTE_REGISTER_NAME,\n ROUTE_REGISTER_FREETRIAL_NAME,\n ROUTE_JOIN_TEAM_NAME,\n ROUTE_SHARE_WEBAPP,\n ROUTE_CLIENT_SPACES_WEBAPP,\n ROUTE_PREVIEW_APP,\n ROUTE_BACKEND_PERFORMANCE_PAGE\n]\n\nconst IS_PROD_ENV = process.env.VUE_APP_IS_PROD == '1'\n\nconst BASE_PATH = process.env.VUE_APP_BASE_PATH + '/'\n\nconst LOGIN_PATH = 'login'\nconst JOIN_TEAM_PATH = 'join-team'\nconst SHARE_APP_PATH = 'share'\nconst PREVIEW_APP_PATH = 'preview'\nconst TEAM_SETUP_PATH = 'team-setup'\n\nconst CLIENT_SPACE_APP = ClientSpacesService.CLIENT_SPACE_APP_PATH\n\nconst features = {\n client_spaces: true\n}\n\n\nlet router = new VueRouter({\n routes: [\n\n { name: ROUTE_LOGIN_NAME, path: `/${LOGIN_PATH}`, component: loginView},\n { name: ROUTE_REGISTER_NAME, path: '/register', component: registerView },\n { name: ROUTE_REGISTER_FREETRIAL_NAME, path: '/register_trial', component: registerView },\n\n { name: ROUTE_JOIN_TEAM_NAME, path: '/'+JOIN_TEAM_PATH, component: joinTeamView },\n { name: ROUTE_SHARE_WEBAPP, path: '/'+SHARE_APP_PATH, component: shareApp },\n { name: ROUTE_CLIENT_SPACES_WEBAPP, path: '/'+CLIENT_SPACE_APP, component: clientSpaceApp },\n { name: ROUTE_CLIENT_SPACE_JOIN, path: '/join-space', component: clientSpaceJoinView },\n { name: ROUTE_PREVIEW_APP, path: '/preview', component: previewApp },\n { name: ROUTE_BACKEND_PERFORMANCE_PAGE, path: '/backend-performance', component: backendPerformancePage },\n\n { name: ROUTE_FILES_NAME, path: '/files', component: filesView, props: { is_admin_folder: false } },\n { name: ROUTE_RECYCLE_BIN_NAME, path: '/recycle_bin', component: recycleBinView, props: { is_admin_folder: false } },\n { name: ROUTE_SHARES_NAME, path: '/shares', component: sharesView },\n { name: ROUTE_CLIENT_SPACES_NAME, path: '/client_spaces', component: clientSpacesView },\n { name: ROUTE_ADMIN_FOLDER_NAME, path: '/admin_folder', component: adminFolderView },\n { name: ROUTE_SETTINGS_NAME, path: '/settings', component: settingsView },\n { name: ROUTE_INSTALL_NAME, path: '/install', component: installAppsView },\n { name: ROUTE_BUGREPORT_NAME, path: '/bugreport', component: bugReportView },\n { name: ROUTE_UPGRADE_NAME, path: '/upgrade-team', component: upgradeTeamView },\n \n { name: ROUTE_TEAM_NAME, path: '/team', component: teamMembersView },\n\n { name: ROUTE_TEAM_SETTINGS_NAME, path: '/team-settings', component: teamSettingsView },\n { name: ROUTE_TEAM_SETUP_NAME, path: '/team-setup', component: teamSetupView },\n { name: ROUTE_USER_MANAGEMENT_NAME, path: '/user-management', component: userManagementView },\n\n { name: '', path: '/', redirect: '/files' },\n { path: '*', name: '', component: notRecognizedRouteView }\n\n ],\n hashbang: false,\n mode: 'history',\n base: BASE_PATH,\n root: '/',\n saveScrollPosition: false\n});\n\nSentry.init({\n Vue,\n dsn: \"https://1251e5376a1f4325ab3c9a4a9b679b08@o278410.ingest.us.sentry.io/1499475\",\n integrations: [\n Sentry.browserTracingIntegration({ router }),\n Sentry.replayIntegration({\n maskAllText: false,\n blockAllMedia: false\n }),\n ],\n // Performance Monitoring\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled\n tracePropagationTargets: [],\n // Session Replay\n replaysSessionSampleRate: 0.05, // Sample rate of all sessions\n replaysOnErrorSampleRate: 1.0, // Sample rate of sessions with JS errors\n enabled: IS_PROD_ENV\n});\nSentry.setTag(\"git_last_commit_id\", __GIT_INFO__.hash)\nSentry.setTag(\"git_branch\", __GIT_INFO__.branch)\n\n \n\n// Paths that should not redirect to /login when any request comes back with HTTP 401 (Unauthorized)\nconst no_redirect_paths = [\n LOGIN_PATH,\n JOIN_TEAM_PATH,\n SHARE_APP_PATH,\n CLIENT_SPACE_APP,\n PREVIEW_APP_PATH,\n TEAM_SETUP_PATH\n]\n\nVue.http.interceptors.push(function(request, next) {\n next(function(response){\n if(response.status === 401){\n // Check if the path is a special app that should not be redirected to /login\n const full_path = window.location.pathname\n const path_prefix = router.options.base\n const relative_path = full_path.slice(path_prefix.length, full_path.length)\n if(no_redirect_paths.indexOf(relative_path) < 0){\n // Nope, redirect\n bus.$emit(events.LOGOUT)\n }\n }\n })\n});\n\nVue.filter('avatar_url', function(user){ return Utils.avatar_url(user) })\nVue.filter('timestamp', function(time){ return Utils.timestamp(time) })\nVue.filter('timestamp_rel', function(time){ return Utils.timestamp_rel(time) })\nVue.filter('timestamp_date', function(time){ return Utils.timestamp_date(time) })\nVue.filter('timestamp_time', function(time){ return Utils.timestamp_time(time) })\nVue.filter('timestamp_time_date', function(time){ return Utils.timestamp_date(time)+\", \"+Utils.timestamp_time(time) })\nVue.filter('json', function(obj){ return JSON.stringify(obj, null, 2) })\nVue.filter('join', function(arr, separator){ return arr.join(separator ? separator : ',') })\nVue.filter('path', function(path_str){ return Utils.path(path_str) })\nVue.filter('format_bytes', function(bytes, round){ return Utils.format_bytes(bytes, round) })\nVue.filter('extension', function(filename){ return Utils.get_file_extension(filename) })\nVue.filter('filetype_img_src', function(extension){ return Utils.filetype_img_src(extension) })\nVue.filter('share_link', function(share_key){ return window.location.origin + BASE_PATH + SHARE_APP_PATH + \"?key=\" + share_key })\nVue.filter('client_space_link', function(key){ return window.location.origin + BASE_PATH + CLIENT_SPACE_APP + \"?key=\" + key })\nVue.filter('file_preview_link', function(blob_url, viewer_name, file_name, mime_type){ return window.location.origin + BASE_PATH + PREVIEW_APP_PATH + \"?url=\" + encodeURIComponent(blob_url) + \"&viewer=\" + viewer_name + \"&name=\" + encodeURIComponent(file_name) + \"&type=\" + encodeURIComponent(mime_type) })\nVue.filter('join_team_link', function(team){ return window.location.origin + BASE_PATH + JOIN_TEAM_PATH + \"?key=\"+team.join_key })\nVue.filter('login_link', function(){ return window.location.origin + BASE_PATH + \"login\" })\nVue.filter('round_up_100', function(num){ return Utils.round_up_100(num) })\n\n/*\n// To use VueGoogleMaps, add the following to 'dependencies' in package.json:\n// \"vue2-google-maps\": \"^0.10.7\"\n\nimport * as VueGoogleMaps from \"vue2-google-maps\"\nVue.use(VueGoogleMaps, {\n load: {\n key: 'AIzaSyDd1uHcI91v3EkmJgmpWe34ANQw3wsnZm8',\n libraries: 'places'\n },\n installComponents: true\n});\n*/\n\n// start app\nnew Vue({\n el: \"#app\",\n data() {\n return {\n user: null\n }\n },\n\n http: {\n timeout: 1000\n },\n\n created() {\n var self = this\n\n // Check if there's a valid user (if the route requires one)\n if(this.$route.name && routes_without_login.indexOf(this.$route.name) >= 0){\n // no logged in user needed\n }\n else if(this.user === null){\n let cached_token = TokenCache.get()\n if(!cached_token){\n\n // Redirect to login if there's no logged in user\n // Preserve the original requested URL, so we can redirect to it after successful login\n router.push('/login?return_to='+encodeURI(window.location.href))\n }\n else{\n\n if(window.location.pathname === router.options.base){\n // Send to /files if the path is empty\n router.push(\"/files\")\n }\n this.init_user(cached_token, false, false)\n }\n }\n\n // Register event listeners for events coming from children components\n bus.$on(events.LOGIN_SUCCESSFUL, token => {\n\n // Store the token in the local cache\n TokenCache.store(token)\n\n // Load user details\n this.init_user(token, \"/files\", true)\n })\n\n bus.$on(events.LOGOUT, function(){\n // Reset the user\n this.user = null\n\n // Clear all caches, except for the device ID and MSP portal stuff\n for(var key in localStorage){ \n if(localStorage.hasOwnProperty(key) && key != Utils.device_id_key && !key.startsWith('MSP-')){ \n localStorage.removeItem(key)\n } \n }\n\n // Redirect to login if not there yet\n if(router.currentRoute.path != '/login'){\n router.push('/login')\n }\n })\n \n bus.$on(events.USED_STORAGE_CHANGED, function(){\n self.refresh_storage_use()\n })\n\n bus.$on(events.RELOAD_TEAM, function(){\n self.refresh_team()\n })\n\n bus.$on(events.RELOAD_TEAM_SETTINGS, function(){\n self.get_company_settings()\n })\n\n bus.$on(events.USER_PROFILE_CHANGED, function(new_attributes){\n for(var key in new_attributes){\n if(key !== 'id' && new_attributes[key] !== null && Object.hasOwnProperty(new_attributes, key)){\n self.user[key] = new_attributes[key]\n }\n }\n // Propagate the change to 'Team' too\n new_attributes.id = self.user_id\n bus.$emit(events.TEAM_MEMBER_PROFILE_CHANGED, new_attributes)\n })\n\n bus.$on(events.TEAM_MEMBER_PROFILE_CHANGED, function(new_attributes){\n if(!self.user || !self.user.team){ return }\n let member = self.user.team.find(m => { return m.user_id === new_attributes.id})\n if(!member){ return; }\n\n // Change the attributes we got\n for(var key in new_attributes){\n if(key !== 'id' && new_attributes.hasOwnProperty(key)){\n member[key] = new_attributes[key]\n }\n }\n })\n\n bus.$on(events.RELOAD_BUCKETS, function(){\n self.load_buckets()\n })\n\n bus.$on(events.NAVIGATE_TO, function(page_url){\n router.push(page_url)\n })\n\n bus.$on(events.RELOAD_2FA_STATUS, function(){\n self.load_2fa_status(false)\n })\n },\n\n methods: {\n\n init_user(token, redirect, is_fresh_login){\n // Let's see if the cached token is still valid\n UserService.get_me().then(resp => {\n // Store logged in user\n let user = resp.body\n user.avatar_url = Utils.avatar_url(user)\n\n AuthService.authenticate_token(token).then(res => {\n if(!res.ok){ console.error(\"Failed to authenticate token: HTTP \"+res.status, res.body); bus.$emit(events.LOGOUT); return; }\n\n const roles = res.body\n user.roles = roles.roles\n user.is_admin = user.roles.indexOf(\"OA\") >= 0\n\n // Publish the user object now when we have the roles\n this.user = user\n\n this.refresh_team()\n this.refresh_storage_use()\n this.get_company_settings()\n this.load_buckets()\n\n this.load_2fa_status(is_fresh_login)\n\n if(redirect){\n router.push(redirect)\n }\n })\n }).catch(() => {\n // The cached token expired, clear it and redirect to login\n bus.$emit(events.LOGOUT)\n })\n },\n\n refresh_team: function(){\n UserService.get_my_team(true).then(res => {\n if(!res.ok){ console.error(\"Failed to get my team: HTTP \"+res.status, res.body); return; }\n\n // Set missing avatar URL\n let team = res.body\n team.forEach(member => {\n member.avatar_url = Utils.avatar_url(member)\n }, this)\n\n if(!this.user){ return }\n this.$set(this.user, \"team\", team)\n bus.$emit(events.TEAM_LOADED)\n }).catch(err => { console.error(\"Failed to get my team: HTTP \"+err.status, err.body); })\n },\n\n refresh_storage_use: function(){\n FileVersionService.get_company_storage_use().then(res => {\n if(!res.ok){ console.error(\"Failed to get company storage use: HTTP \"+res.status, res.body); return; }\n if(!this.user){ return }\n this.$set(this.user, \"team_storage_used\", res.body.bytes - 0)\n }).catch(err => {\n console.error(\"Failed to get company storage use: HTTP \"+err.status, err.body);\n })\n },\n\n load_buckets(){\n // Load buckets\n StorageBackendService.get_buckets().then( res => {\n const buckets = res.body\n this.$set(this.user, 'buckets', buckets)\n if(buckets.length === 0){\n // navigate to Cloud Selector and show welcome box\n router.push('/team-setup')\n }\n\n }, err_resp => {\n console.error(\"Failed to retrieve buckets: \", err_resp)\n })\n },\n\n get_company_settings(){\n UserService.get_company_settings().then(res => {\n const settings = res.body\n this.$set(this.user, \"team_settings\", settings)\n }).catch(err => { console.error(\"Failed to get team settings: HTTP \"+err.status, err.body); })\n },\n\n load_2fa_status(show_warning){\n AuthService.get_2fa_status().then(res => {\n const status = res.body\n if(status.has_2fa && !status.verified){\n if(show_warning){\n Utils.show_warning(\"You have started setting up two-factor authentication, but haven't finished verifying your phone! Go to My Settings to complete the setup!\")\n }\n // Show a warning icon in the menu at /settings\n if(!this.user.menu_warning){\n this.user.menu_warning = []\n } \n this.user.menu_warning.push('settings')\n }\n else{\n\n if(this.user.menu_warning && this.user.menu_warning.indexOf('settings') >= 0){\n const idx = this.user.menu_warning.indexOf('settings')\n this.user.menu_warning.splice(idx, 1)\n }\n\n if(!status.has_2fa){\n // Show info?\n }\n }\n\n \n }).catch(err => { console.error(\"Failed to get 2FA status: HTTP \"+err.status, err.body); })\n }\n\n },\n\n router,\n\n render(h){\n // Check if the route is special (e.g. its container is not App.vue)\n // Using externalRegisterFormsContainer:\n // - Set externalRegisterFormsContainer as the 'view' in special_routes\n // - Add a route rule with 'component' set as the content you want to render within externalRegisterFormsContainer\n const special_route = special_routes.find(r => r.name == this.$route.name)\n if(special_route){\n return h(special_route.view, { props: { user: this.user } })\n }\n\n /* Very important to pass the logged in user in props so children components can access it if they want to */\n return h(App, { props: { user: this.user, features: features } })\n },\n \n});\n\n/*\nimport Vue from 'vue'\nimport App from './App.vue'\n\nVue.config.productionTip = false\n\nnew Vue({\n render: h => h(App),\n}).$mount('#app')\n*/","var map = {\n\t\"./android_browser.png\": 27748,\n\t\"./brave.png\": 71924,\n\t\"./browsers-icons.png\": 51570,\n\t\"./chrome.png\": 77330,\n\t\"./chrome_mobile.png\": 28890,\n\t\"./firefox.png\": 56542,\n\t\"./firefox_for_ios.png\": 4537,\n\t\"./firefox_mobile.png\": 89103,\n\t\"./iexplorer.png\": 54501,\n\t\"./macos-client.png\": 62152,\n\t\"./microsoft_edge.png\": 72586,\n\t\"./opera.png\": 75824,\n\t\"./opera_mobile.png\": 56187,\n\t\"./palemoon.png\": 76313,\n\t\"./postman.png\": 29342,\n\t\"./safari.png\": 81550,\n\t\"./samsung_internet.png\": 56247,\n\t\"./skyflok-macos-client.png\": 11639,\n\t\"./skyflok-windows-client.png\": 19760,\n\t\"./test_client_name.png\": 52744\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 65522;","var map = {\n\t\"./Accounting.png\": 29789,\n\t\"./Architecture.png\": 24985,\n\t\"./Doctor.png\": 99450,\n\t\"./Female.png\": 94900,\n\t\"./Film_Producer.png\": 30273,\n\t\"./Insurance.png\": 97045,\n\t\"./Journalist.png\": 86102,\n\t\"./Law_firm.png\": 10682,\n\t\"./Male.png\": 9980,\n\t\"./Media_Designer.png\": 27240,\n\t\"./Notary.png\": 91756,\n\t\"./Photographer.png\": 61633,\n\t\"./Researcher.png\": 67125,\n\t\"./SaaS.png\": 30030,\n\t\"./Startup.png\": 77035,\n\t\"./University.png\": 44583,\n\t\"./Writer.png\": 93524\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 47758;","var map = {\n\t\"./AWS-logo.jpg\": 3870,\n\t\"./Bluemix_logo.jpg\": 23739,\n\t\"./Cloud-Sigma-logo.jpg\": 74078,\n\t\"./Deutsche_Telekom-Logo.jpg\": 91262,\n\t\"./LOGO-WEB-ALIBABA-01.jpg\": 51588,\n\t\"./atman.png\": 75707,\n\t\"./aws_logo_smile.png\": 90146,\n\t\"./azure-logo.png\": 97496,\n\t\"./backblaze-logo-horiz.jpg\": 33882,\n\t\"./baidu-open-cloud-logo.png.jpg\": 2826,\n\t\"./citycloud.png\": 40919,\n\t\"./dunkel.png\": 55502,\n\t\"./exoscale.png\": 43389,\n\t\"./google_cloud_new.png\": 20509,\n\t\"./google_cloud_platform.jpg\": 71612,\n\t\"./ionos.png\": 96103,\n\t\"./leaseweb.png\": 50629,\n\t\"./microsoft_azure.jpg\": 20467,\n\t\"./orange.png\": 52274,\n\t\"./outscale.png\": 46097,\n\t\"./ovh-logo.jpg\": 76203,\n\t\"./ovh_logo.png\": 47900,\n\t\"./scaleway.png\": 22093,\n\t\"./ventus.png\": 97491\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 77169;","var map = {\n\t\"./AD.png\": 53047,\n\t\"./AE.png\": 83701,\n\t\"./AF.png\": 76578,\n\t\"./AG.png\": 99620,\n\t\"./AI.png\": 12197,\n\t\"./AL.png\": 46348,\n\t\"./AM.png\": 5937,\n\t\"./AN.png\": 95059,\n\t\"./AO.png\": 19227,\n\t\"./AQ.png\": 16541,\n\t\"./AR.png\": 57147,\n\t\"./AS.png\": 34485,\n\t\"./AT.png\": 75860,\n\t\"./AU.png\": 70265,\n\t\"./AW.png\": 81386,\n\t\"./AX.png\": 40246,\n\t\"./AZ.png\": 66833,\n\t\"./BA.png\": 15528,\n\t\"./BB.png\": 81150,\n\t\"./BD.png\": 59145,\n\t\"./BE.png\": 34914,\n\t\"./BF.png\": 24766,\n\t\"./BG.png\": 55204,\n\t\"./BH.png\": 89895,\n\t\"./BI.png\": 53521,\n\t\"./BJ.png\": 90305,\n\t\"./BL.png\": 72233,\n\t\"./BM.png\": 71758,\n\t\"./BN.png\": 71750,\n\t\"./BO.png\": 56026,\n\t\"./BR.png\": 9996,\n\t\"./BS.png\": 96425,\n\t\"./BT.png\": 22543,\n\t\"./BW.png\": 30536,\n\t\"./BY.png\": 10451,\n\t\"./BZ.png\": 12769,\n\t\"./CA.png\": 73436,\n\t\"./CC.png\": 28703,\n\t\"./CD.png\": 3445,\n\t\"./CF.png\": 46133,\n\t\"./CG.png\": 65826,\n\t\"./CH.png\": 94278,\n\t\"./CI.png\": 40931,\n\t\"./CK.png\": 68986,\n\t\"./CL.png\": 63122,\n\t\"./CM.png\": 72609,\n\t\"./CN.png\": 85271,\n\t\"./CO.png\": 26650,\n\t\"./CR.png\": 74521,\n\t\"./CU.png\": 15496,\n\t\"./CV.png\": 20479,\n\t\"./CW.png\": 45768,\n\t\"./CX.png\": 36797,\n\t\"./CY.png\": 32832,\n\t\"./CZ.png\": 50521,\n\t\"./DE.png\": 65362,\n\t\"./DJ.png\": 68056,\n\t\"./DK.png\": 10011,\n\t\"./DM.png\": 61011,\n\t\"./DO.png\": 1166,\n\t\"./DZ.png\": 71935,\n\t\"./EC.png\": 74564,\n\t\"./EE.png\": 2779,\n\t\"./EG.png\": 60127,\n\t\"./EH.png\": 85877,\n\t\"./ER.png\": 8098,\n\t\"./ES.png\": 28343,\n\t\"./ET.png\": 17485,\n\t\"./EU.png\": 49717,\n\t\"./FI.png\": 627,\n\t\"./FJ.png\": 38464,\n\t\"./FK.png\": 93481,\n\t\"./FM.png\": 9961,\n\t\"./FO.png\": 7845,\n\t\"./FR.png\": 94476,\n\t\"./GA.png\": 79488,\n\t\"./GB.png\": 74538,\n\t\"./GD.png\": 85661,\n\t\"./GE.png\": 16510,\n\t\"./GG.png\": 19289,\n\t\"./GH.png\": 60280,\n\t\"./GI.png\": 48093,\n\t\"./GL.png\": 85201,\n\t\"./GM.png\": 37243,\n\t\"./GN.png\": 96087,\n\t\"./GQ.png\": 98541,\n\t\"./GR.png\": 90004,\n\t\"./GS.png\": 87928,\n\t\"./GT.png\": 77099,\n\t\"./GU.png\": 91374,\n\t\"./GW.png\": 42433,\n\t\"./GY.png\": 80459,\n\t\"./HK.png\": 75892,\n\t\"./HN.png\": 48469,\n\t\"./HR.png\": 86199,\n\t\"./HT.png\": 44206,\n\t\"./HU.png\": 57546,\n\t\"./IC.png\": 76160,\n\t\"./ID.png\": 40355,\n\t\"./IE.png\": 36551,\n\t\"./IL.png\": 86538,\n\t\"./IM.png\": 22977,\n\t\"./IN.png\": 41790,\n\t\"./IQ.png\": 83152,\n\t\"./IR.png\": 50407,\n\t\"./IS.png\": 36679,\n\t\"./IT.png\": 64727,\n\t\"./JE.png\": 89690,\n\t\"./JM.png\": 46875,\n\t\"./JO.png\": 44800,\n\t\"./JP.png\": 39667,\n\t\"./KE.png\": 19809,\n\t\"./KG.png\": 9541,\n\t\"./KH.png\": 86688,\n\t\"./KI.png\": 48225,\n\t\"./KM.png\": 79380,\n\t\"./KN.png\": 12094,\n\t\"./KP.png\": 51015,\n\t\"./KR.png\": 84504,\n\t\"./KW.png\": 23497,\n\t\"./KY.png\": 78752,\n\t\"./KZ.png\": 8694,\n\t\"./LA.png\": 99625,\n\t\"./LB.png\": 70569,\n\t\"./LC.png\": 98053,\n\t\"./LI.png\": 98039,\n\t\"./LK.png\": 15917,\n\t\"./LR.png\": 92495,\n\t\"./LS.png\": 11728,\n\t\"./LT.png\": 52474,\n\t\"./LU.png\": 64424,\n\t\"./LV.png\": 4929,\n\t\"./LY.png\": 5824,\n\t\"./MA.png\": 43309,\n\t\"./MC.png\": 90485,\n\t\"./MD.png\": 81723,\n\t\"./ME.png\": 53817,\n\t\"./MF.png\": 80190,\n\t\"./MG.png\": 89365,\n\t\"./MH.png\": 44878,\n\t\"./MK.png\": 93693,\n\t\"./ML.png\": 40467,\n\t\"./MM.png\": 7055,\n\t\"./MN.png\": 32072,\n\t\"./MO.png\": 39719,\n\t\"./MP.png\": 99194,\n\t\"./MQ.png\": 33621,\n\t\"./MR.png\": 60146,\n\t\"./MS.png\": 45455,\n\t\"./MT.png\": 50606,\n\t\"./MU.png\": 61879,\n\t\"./MV.png\": 87404,\n\t\"./MW.png\": 67035,\n\t\"./MX.png\": 27224,\n\t\"./MY.png\": 45793,\n\t\"./MZ.png\": 99400,\n\t\"./NA.png\": 11438,\n\t\"./NC.png\": 95767,\n\t\"./NE.png\": 11077,\n\t\"./NF.png\": 7065,\n\t\"./NG.png\": 66807,\n\t\"./NI.png\": 44275,\n\t\"./NL.png\": 93113,\n\t\"./NO.png\": 52616,\n\t\"./NP.png\": 60270,\n\t\"./NR.png\": 67853,\n\t\"./NU.png\": 63955,\n\t\"./NZ.png\": 76507,\n\t\"./OM.png\": 72776,\n\t\"./PA.png\": 10728,\n\t\"./PE.png\": 73697,\n\t\"./PF.png\": 98114,\n\t\"./PG.png\": 26167,\n\t\"./PH.png\": 73162,\n\t\"./PK.png\": 6909,\n\t\"./PL.png\": 77374,\n\t\"./PN.png\": 22383,\n\t\"./PR.png\": 89447,\n\t\"./PS.png\": 51857,\n\t\"./PT.png\": 71533,\n\t\"./PW.png\": 52577,\n\t\"./PY.png\": 55754,\n\t\"./QA.png\": 85261,\n\t\"./RO.png\": 62734,\n\t\"./RS.png\": 72669,\n\t\"./RU.png\": 1233,\n\t\"./RW.png\": 16861,\n\t\"./SA.png\": 19849,\n\t\"./SB.png\": 83920,\n\t\"./SC.png\": 70910,\n\t\"./SD.png\": 60809,\n\t\"./SE.png\": 74250,\n\t\"./SG.png\": 2778,\n\t\"./SH.png\": 91253,\n\t\"./SI.png\": 26224,\n\t\"./SK.png\": 90948,\n\t\"./SL.png\": 7288,\n\t\"./SM.png\": 99544,\n\t\"./SN.png\": 59425,\n\t\"./SO.png\": 13450,\n\t\"./SR.png\": 32215,\n\t\"./SS.png\": 64530,\n\t\"./ST.png\": 73636,\n\t\"./SV.png\": 73543,\n\t\"./SY.png\": 19322,\n\t\"./SZ.png\": 26262,\n\t\"./TC.png\": 71999,\n\t\"./TD.png\": 12948,\n\t\"./TF.png\": 4093,\n\t\"./TG.png\": 2104,\n\t\"./TH.png\": 60229,\n\t\"./TJ.png\": 79846,\n\t\"./TK.png\": 6974,\n\t\"./TL.png\": 82197,\n\t\"./TM.png\": 53690,\n\t\"./TN.png\": 48148,\n\t\"./TO.png\": 54751,\n\t\"./TR.png\": 17657,\n\t\"./TT.png\": 80997,\n\t\"./TV.png\": 58796,\n\t\"./TW.png\": 1839,\n\t\"./TZ.png\": 76405,\n\t\"./UA.png\": 42106,\n\t\"./UG.png\": 69136,\n\t\"./US.png\": 2931,\n\t\"./UY.png\": 13881,\n\t\"./UZ.png\": 17789,\n\t\"./VA.png\": 4907,\n\t\"./VC.png\": 20080,\n\t\"./VE.png\": 43332,\n\t\"./VG.png\": 26769,\n\t\"./VI.png\": 58934,\n\t\"./VN.png\": 11019,\n\t\"./VU.png\": 70460,\n\t\"./WF.png\": 20648,\n\t\"./WS.png\": 98604,\n\t\"./YE.png\": 70723,\n\t\"./YT.png\": 17127,\n\t\"./ZA.png\": 65111,\n\t\"./ZM.png\": 91795,\n\t\"./ZW.png\": 81216,\n\t\"./_abkhazia.png\": 98852,\n\t\"./_basque-country.png\": 32767,\n\t\"./_british-antarctic-territory.png\": 91707,\n\t\"./_commonwealth.png\": 50679,\n\t\"./_england.png\": 9170,\n\t\"./_gosquared.png\": 29392,\n\t\"./_kosovo.png\": 40005,\n\t\"./_mars.png\": 15577,\n\t\"./_nagorno-karabakh.png\": 23086,\n\t\"./_nato.png\": 34165,\n\t\"./_northern-cyprus.png\": 37216,\n\t\"./_olympics.png\": 74675,\n\t\"./_red-cross.png\": 78504,\n\t\"./_scotland.png\": 58445,\n\t\"./_somaliland.png\": 92659,\n\t\"./_south-ossetia.png\": 46573,\n\t\"./_united-nations.png\": 64449,\n\t\"./_unknown.png\": 85785,\n\t\"./_wales.png\": 13934\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 87838;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 66861;\nmodule.exports = webpackEmptyContext;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/app/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkskyflok_filemanager\"] = self[\"webpackChunkskyflok_filemanager\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(95376); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["render","_vm","this","_c","_self","staticClass","_l","children","folder","key","name","class","selected","on","$event","stopPropagation","clicked","color","_v","_s","length","attrs","_e","staticRenderFns","props","beforeCreate","$options","components","namespaceTreeRow","require","component","AES","AES_MODE","AES_IV_LENGTH","AES_PASS_LENGTH","AUTH_TAG_LENGTH","_is_microsoft_edge","navigator","userAgent","indexOf","is_crypto_supported","crypto","msCrypto","encrypt","async","crypto_api","iv_arr","getRandomValues","Uint8Array","key_arr","algorithm","iv","tagLength","additionalData","subtle","importKey","buffer","encrypted_buffer","encrypted_arr","decrypt","byteLength","decrypted_buffer","module","exports","n","t","e","i","enumerable","configurable","writable","Object","defineProperty","prototype","r","assign","arguments","hasOwnProperty","call","apply","o","s","a","l","c","h","f","u","d","p","g","m","_","v","E","y","b","T","C","w","I","A","D","S","O","N","k","one","TRANSITION_END","setTimeout","triggerTransitionEnd","getUID","Math","random","document","getElementById","getSelectorFromElement","getAttribute","charAt","escapeSelector","substr","replace","find","reflow","offsetHeight","trigger","end","supportsTransitionEnd","Boolean","isElement","nodeType","typeCheckConfig","toString","match","toLowerCase","RegExp","test","Error","toUpperCase","window","QUnit","fn","emulateTransitionEnd","event","special","bindType","delegateType","handle","target","is","handleObj","handler","default","L","CLOSE","CLOSED","CLICK_DATA_API","_element","close","_getRootElement","_triggerCloseEvent","isDefaultPrevented","_removeElement","dispose","removeData","closest","Event","removeClass","hasClass","_destroyElement","detach","remove","_jQueryInterface","each","data","_handleDismiss","preventDefault","get","Constructor","noConflict","P","FOCUS_BLUR_DATA_API","toggle","type","checked","hasAttribute","classList","contains","focus","setAttribute","toggleClass","x","interval","keyboard","slide","pause","wrap","SLIDE","SLID","KEYDOWN","MOUSEENTER","MOUSELEAVE","TOUCHEND","LOAD_DATA_API","ACTIVE","ACTIVE_ITEM","ITEM","NEXT_PREV","INDICATORS","DATA_SLIDE","DATA_RIDE","_items","_interval","_activeElement","_isPaused","_isSliding","touchTimeout","_config","_getConfig","_indicatorsElement","_addEventListeners","next","_slide","nextWhenVisible","hidden","css","prev","cycle","clearInterval","setInterval","visibilityState","bind","to","_getItemIndex","off","_keydown","documentElement","clearTimeout","tagName","which","makeArray","parent","_getItemByDirection","_triggerSlideEvent","relatedTarget","direction","from","_setActiveIndicatorElement","addClass","TypeError","_dataApiClickHandler","R","SHOW","SHOWN","HIDE","HIDDEN","ACTIVES","DATA_TOGGLE","_isTransitioning","_triggerArray","id","filter","_selector","push","_parent","_getParent","_addAriaAndCollapsedClass","hide","show","not","_getDimension","style","attr","setTransitioning","slice","getBoundingClientRect","jquery","_getTargetFromElement","currentTarget","j","H","M","W","U","Promise","resolve","then","B","F","getComputedStyle","K","nodeName","parentNode","host","V","body","ownerDocument","overflow","overflowX","overflowY","Q","offsetParent","Y","G","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","createRange","setStart","setEnd","commonAncestorContainer","firstElementChild","q","scrollingElement","z","parseFloat","X","Z","appVersion","J","max","$","height","width","tt","et","nt","value","it","rt","right","left","bottom","top","ot","clientWidth","clientHeight","offsetWidth","st","borderTopWidth","borderLeftWidth","marginTop","marginLeft","at","innerWidth","innerHeight","lt","keys","map","area","sort","split","ct","ht","marginBottom","marginRight","ft","ut","dt","Array","pt","findIndex","forEach","function","console","warn","enabled","offsets","popper","reference","gt","some","mt","_t","defaultView","vt","updateBound","addEventListener","passive","scrollParents","scrollElement","eventsEnabled","Et","state","cancelAnimationFrame","scheduleUpdate","removeEventListener","yt","isNaN","isFinite","bt","Tt","order","Ct","wt","It","concat","reverse","At","FLIP","CLOCKWISE","COUNTERCLOCKWISE","Dt","trim","search","reduce","St","placement","removeOnDestroy","onCreate","onUpdate","modifiers","shift","start","offset","preventOverflow","boundariesElement","instance","padding","boundaries","priority","primary","escapeWithReference","secondary","min","keepTogether","floor","arrow","element","querySelector","arrowElement","round","flip","flipped","originalPlacement","behavior","flipVariations","inner","attributes","computeStyle","gpuAcceleration","position","willChange","styles","arrowStyles","applyStyle","removeAttribute","onLoad","Ot","requestAnimationFrame","update","options","Defaults","isDestroyed","isCreated","enableEventListeners","disableEventListeners","removeChild","Utils","global","PopperUtils","placements","Nt","CLICK","KEYDOWN_DATA_API","KEYUP_DATA_API","boundary","_popper","_menu","_getMenuElement","_inNavbar","_detectNavbar","disabled","_getParentFromElement","_clearMenus","_getPopperConfig","noop","destroy","constructor","Default","DefaultType","_getPlacement","_dataApiKeydownHandler","kt","modal","backdrop","FOCUSIN","RESIZE","CLICK_DISMISS","KEYDOWN_DISMISS","MOUSEUP_DISMISS","MOUSEDOWN_DISMISS","DIALOG","DATA_DISMISS","FIXED_CONTENT","STICKY_CONTENT","NAVBAR_TOGGLER","_dialog","_backdrop","_isShown","_isBodyOverflowing","_ignoreBackdropClick","_originalBodyPadding","_scrollbarWidth","_checkScrollbar","_setScrollbar","_adjustDialog","_setEscapeEvent","_setResizeEvent","_showBackdrop","_showElement","_hideModal","handleUpdate","ELEMENT_NODE","appendChild","display","scrollTop","_enforceFocus","has","_resetAdjustments","_resetScrollbar","_removeBackdrop","createElement","className","appendTo","scrollHeight","paddingLeft","paddingRight","_getScrollbarWidth","Lt","animation","template","title","delay","html","selector","container","fallbackPlacement","AUTO","TOP","RIGHT","BOTTOM","LEFT","INSERTED","FOCUSOUT","_isEnabled","_timeout","_hoverState","_activeTrigger","config","tip","_setListeners","enable","disable","toggleEnabled","DATA_KEY","_getDelegateConfig","click","_isWithActiveTrigger","_enter","_leave","getTipElement","EVENT_KEY","isWithContent","NAME","setContent","_getAttachment","addAttachmentClass","_handlePopperPlacementChange","_fixTransition","_TRANSITION_DURATION","_cleanTipClass","getTitle","setElementContent","empty","append","text","_fixTitle","content","join","Pt","create","__proto__","_getContent","xt","method","ACTIVATE","SCROLL","DATA_SPY","NAV_LIST_GROUP","NAV_LINKS","NAV_ITEMS","LIST_ITEMS","DROPDOWN","DROPDOWN_ITEMS","DROPDOWN_TOGGLE","_scrollElement","_offsets","_targets","_activeTarget","_scrollHeight","_process","refresh","_getScrollTop","_getScrollHeight","pageYOffset","_getOffsetHeight","_activate","_clear","parents","Rt","tab","_transitionComplete","Util","Alert","Button","Carousel","Collapse","Dropdown","Modal","Popover","Scrollspy","Tab","Tooltip","getControlPoints","x0","y0","x1","y1","x2","y2","tension","d01","d12","fa","fb","p1x","p1y","p2x","p2y","pow","sqrt","line","drawLine","points","ctx","fill","seriesColor","parse","normalize","beginPath","moveTo","plength","stroke","lineWidth","lineTo","closePath","fillStyle","queue","cpoints","drawSpline","plot","series","splines","idx","cp","datapoints","ps","pointsize","plotOffset","getPlotOffset","len","pts","extend","lines","xaxis","yaxis","p2c","save","strokeStyle","restore","plugins","init","hooks","drawSeries","version","jQuery","defaultOptions","tooltip","cssClass","xDateFormat","yDateFormat","monthNames","dayNames","shifts","defaultTheme","snap","clickTips","onHover","flotItem","$tooltipEl","$compat","tooltipOpts","FlotTooltip","tipPosition","that","plotPluginsLength","plotPlugins","mouseMove","pos","pageX","pageY","setTooltipPosition","plotclick","item","clickmode","getPlaceholder","plothover","hideTooltip","getDomElement","unbind","lineDistance","dotLineLength","tg","abs","l1","l2","showTooltip","tooltipOptions","plotOptions","maxDistance","grid","mouseActiveRadius","closestTrace","distance","ttPos","getData","xBeforeIndex","xAfterIndex","pointPrev","pointNext","distToLine","closestIndex","pointOnLine","datapoint","dataIndex","seriesIndex","bindEvents","eventHolder","getOptions","wfunc","hfunc","shutdown","removeTooltip","$tip","totalTipWidth","outerWidth","totalTipHeight","outerHeight","scrollLeft","xPrev","yPrev","targetPosition","tipText","stringFormat","customText","percentPattern","seriesPattern","colorPattern","xLabelPattern","yLabelPattern","xPattern","yPattern","xPatternWithoutPrecision","yPatternWithoutPrecision","customTextPattern","nPiePattern","threshold","curvedLines","steps","label","originSeries","percent","percents","adjustValPrecision","hasAxisLabel","axisLabel","isTimeMode","isXDateFormat","timestampToDate","isYDateFormat","ticks","hasRotatedXAxisTicks","tickIndex","xIndex","valueX","isCategoriesMode","yIndex","valueY","tickFormatter","axisName","mode","tmst","dateFormat","theDate","dateGenerator","formatDate","pattern","precision","matchResult","$1","toFixed","inArray","rotatedTicks","categories","processRawData","xCategories","yCategories","format","number","required","bars","autoscale","zero","defaultValue","horizontal","getNextIndex","index","categoriesTickGenerator","axis","res","setupCategoriesForAxis","isArray","transformPointsOnAxis","formatColumn","val","processDatapoints","make","add","scale","clamp","parseInt","clone","extract","elem","str","exec","lookupColors","aqua","azure","beige","black","blue","brown","cyan","darkblue","darkcyan","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkviolet","fuchsia","gold","green","indigo","khaki","lightblue","lightcyan","lightgreen","lightgrey","lightpink","lightyellow","lime","magenta","maroon","navy","olive","orange","pink","purple","violet","red","silver","white","yellow","Canvas","cls","getContext","G_vmlCanvasManager","initElement","context","devicePixelRatio","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","resize","textContainer","_textCache","Plot","placeholder","data_","options_","colors","legend","noColumns","labelFormatter","labelBoxBorderColor","margin","backgroundColor","backgroundOpacity","sorted","font","tickColor","transform","inverseTransform","autoscaleMargin","labelWidth","labelHeight","reserveSpace","tickLength","alignTicksWithAxis","tickDecimals","tickSize","minTickSize","xaxes","yaxes","radius","fillColor","symbol","barWidth","align","shadowSize","highlightColor","aboveData","borderColor","labelMargin","axisMargin","borderWidth","minBorderMargin","markings","markingsColor","markingsLineWidth","clickable","hoverable","autoHighlight","interaction","redrawOverlayInterval","surface","overlay","octx","plotWidth","plotHeight","processOptions","processOffset","drawBackground","draw","drawOverlay","executeHooks","hook","args","initPlugins","classes","parseOptions","opts","axisOptions","axisCount","fontSize","fontSizeDefault","fontDefaults","size","variant","weight","family","lineHeight","noTicks","x2axis","y2axis","coloredAreas","coloredAreasColor","getOrCreateAxis","setData","parseData","fillInSeriesOptions","processData","axisNumber","obj","coord","allAxes","grep","canvasToAxisCoords","used","c2p","undefined","axisToCanvasCoords","axes","neededColors","maxIndex","sc","colorPool","colorPoolSize","variation","colori","topSentry","Number","POSITIVE_INFINITY","bottomSentry","NEGATIVE_INFINITY","fakeInfinity","MAX_VALUE","updateAxis","datamin","datamax","insertSteps","nullify","Infinity","xmin","ymin","xmax","ymax","delta","setupCanvases","existing","clear","mousemove","onMouseMove","onMouseLeave","onClick","redrawTimeout","setTransformationHelpers","identity","measureTickLabels","maxWidth","legacyStyles","layer","info","getTextInfo","allocateAxisBoxFirstPhase","lw","lh","isXAxis","innermost","outermost","first","found","box","allocateAxisBoxSecondPhase","adjustLayoutForThingsStickingOut","minMargin","margins","ceil","setupGrid","showGrid","axisOpts","setRange","allocatedAxes","setupTickGeneration","setTicks","snapRangeToTicks","drawAxisLabels","insertLegend","widen","dec","log","LN10","maxDec","magn","norm","tickGenerator","floorInBase","NaN","factor","formatted","decimal","isFunction","otherAxis","niceTicks","extraDec","ts","oticks","drawGrid","triggerRedrawOverlay","extractRange","ranges","tmp","translate","getColorOrGradient","fillRect","bw","bc","getAxes","xrange","yrange","xequal","yequal","subPixel","xoff","yoff","strokeRect","tick","halign","valign","removeText","addText","drawSeriesLines","drawSeriesBars","drawSeriesPoints","plotLine","xoffset","yoffset","axisx","axisy","prevx","prevy","plotLineArea","areaOpen","ypos","segmentStart","segmentEnd","x1old","x2old","lineJoin","sw","angle","PI","sin","cos","getFillStyle","plotPoints","shadow","arc","drawBar","barLeft","barRight","fillStyleCallback","drawLeft","drawRight","drawTop","drawBottom","plotBars","filloptions","fragments","entries","rowStarted","lf","ascending","entry","table","div","prependTo","getCanvas","getXAxes","getYAxes","highlight","unhighlight","pointOffset","point","highlights","findNearbyItem","mouseX","mouseY","seriesFilter","smallestDistance","mx","my","maxx","maxy","dx","dy","dist","triggerClickHoverEvent","eventname","canvasX","canvasY","auto","hi","drawBarHighlight","drawPointHighlight","indexOfHighlight","splice","pointRadius","spec","defaultColor","gradient","createLinearGradient","co","brightness","opacity","addColorStop","base","clearRect","cache","layerKey","getTextLayer","layerCache","styleKey","styleCache","positions","active","rendered","insertAfter","textStyle","timezone","timeformat","twelveHourClock","fmt","strftime","hours12","leftPad","pad","escape","hours","getHours","isAM","getDay","getMonth","getDate","getMinutes","getSeconds","getFullYear","makeUtcWrapper","addProxyMethod","sourceObj","sourceMethod","targetObj","targetMethod","utc","date","Date","timezoneJS","setTimezone","setTime","timeUnitSize","baseSpec","specMonths","specQuarters","minSize","unit","year","step","setSeconds","setMinutes","setHours","setMonth","setFullYear","setMilliseconds","minute","hour","day","setDate","month","quarter","carry","getTime","useQuarters","span","suffix","hourCode","sidebar_hidden","is_team_setup","staticStyle","menu_click","show_team_logo","user","team_settings","logo_url","avatar_url","company_name","path","no_buckets","dragover_recycle_bin","drop_to_bin","dragover_bin","share_enabled","client_spaces_enabled","is_admin","menu_warning","is_free_trial","max_storage","team_storage_used","_f","set_theme","theme","file_dragged","alert","_m","is_mobile","hide_route_name","$route","header_info_icon","directives","rawName","expression","logout","plan_expires_days","plan_key","features","token_key","TokenCache","storage","localStorage","getItem","is_stored","store","token","setItem","removeItem","bus","Vue","computed","auth_header","events","LOGIN_SUCCESSFUL","LOGIN_FAILED","LOGOUT","USED_STORAGE_CHANGED","USER_PROFILE_CHANGED","TEAM_MEMBER_PROFILE_CHANGED","RELOAD_TEAM","RELOAD_TEAM_SETTINGS","RELOAD_BUCKETS","TEAM_LOADED","SPACES_LOADED","SHOW_ALERT","ERROR","SUCCESS","WARNING","HIGHLIGHT_FILE","REMOVE_FROM_FILELIST","FILE_FOLDER_DRAG_START","FILE_FOLDER_DRAG_END","FILELIST_CHANGE_FOLDER_TO","FILELIST_CHANGE_FOLDER_TO_ID","NAVIGATE_TO","RELOAD_2FA_STATUS","SHARE_ARCHIVED","base_url","process","FileVersionService","DETAILS_FULL","DETAILS_BASIC","create_version","file_id","file_size","file_hash","ancestor_id","generations_arr","payload","hash","generations","$http","post","headers","get_auth_header","download_version","file_version_id","url_params","params","download_latest","get_latest_info_with_count","file_ids_arr","file_ids","with_count","get_file_history","revert_file","previous_version_id","version_id","put","get_company_storage_use","get_storage_history","MobileDownload","BASE_URL","_ENDPOINT_URL","get_url","fileData","filename","FormData","StorageBackendMonitorService","report_packet_transfers","data_arr","report_failed_transfer","error_report","worker_path","FILESTREAM_MIN_SIZE_MB","FileDownloader","ns_file","download_worker","download_file_reject","cancelled","downloadFile","version_obj","loading","cancel","cancelDownload","mime_type","get_mime_type","get_file_extension","reject","before","performance","now","filestream","preview","newHandle","showSaveFilePicker","startIn","suggestedName","createWritable","error","get_version","get_latest_version","downloaded_length","gen","generation_data","_download_generation","useful_length","write","after","time_ms","speed_kbps","saved_to_disk","blob","Blob","file_url","catch","err","download_url","blob_url","URL","createObjectURL","terminate","generation","file_version","Worker","onmessage","msg","message","progress_increase_percent","bytes","decrypt_result","decrypted_data","postMessage","command","packet_transfers","report_error","_cached_images","device_id_key","flag_images","cloud_provider_images","client_space_images","asset_videos","material_colors","APP_COLORS","all_colors","client_space_logo_base_path","client_space_logos","GOOGLE_PLATFORM_JS","show_error","sticky","$emit","show_warning","show_success","make_error_message","status","random_between","random_string","possible","unique_array","array_with_duplicates","Set","email_address","md5","is_valid_email","re","String","capitalize","string","string_to_color","colors_arr","intval","charCodeAt","app_color_by_name","orig_path_string","path_segments","unshift","pop","timestamp_ms","timestamp_sec","timestamp_rel","timestamp","isInteger","current","msPerMinute","msPerHour","msPerDay","msPerMonth","msPerYear","elapsed","is_future","time_str","monthNamesShort","timestamp_date","time","timestamp_time","minutes","to_clipboard","innerHTML","select","success","execCommand","toLocaleTimeString","toLocaleDateString","format_bytes","do_round","kB","MB","GB","TB","result","frac_digits","get_file_viewer","file","is_mobile_browser","browser_name","extension","viewer","script_extensions","icon_class","verb","btn_class","mimeTypes","get_device_id","device_id","last_dot_idx","lastIndexOf","filetype_img_src","default_img","supported_extensions","jpeg_additional_extensions","cloud_provider_logo_src","flag_img_src","countrycode","client_space_logo_src","client_logo","asset_video_url","video_filename","force_download_file","callback","set_download","set_blank","href","download","download_or_open_file","view_file_ready_callback","download_complete_callback","error_callback","open_when_ready","sort_objects","array","sort_attr","is_asc","_a","_b","dot_idx","outer_key","inner_key","tmp2","lg","sort_by_name","parse_url_param","param_name","default_value","urldecode","url","location","params_arr","substring","pair","decodeURIComponent","csv_to_array","row","ret","screen","partially_redact_email","email_parts","front","domain","domain_parts","characters_to_keep","log2","_redact_after_idx","tld","scroll_top","scroll","round_up_100","num","loadScript","src","shouldAppend","el","head","unloadScript","avg","arr","add_gps_noise","coords","noise_max","lat","lng","highlight_search","search_str","ch","AuthService","ROLE_TEAM_ADMIN","ROLE_TEAM_MEMBER","ROLE_OPERATOR","MFA_MODE_APP","MFA_MODE_SMS","login","credentials","os","client_name","client_version","email","password","google_id_token","mfa_backup_code","mfa_code","authenticate_token","get_pending_registration","challenge","confirm_primary_email","confirm_key","confirm_invited_registration","change_password","current_password","new_password","change_password_admin","user_id","resend_confirmation_email","user_name","get_active_sessions","kill_session","session_id","get_user_roles_batch","user_ids","suspend_user","new_value","grant_role","role_code","revoke_role","role","delete","delete_user","get_2fa_status","setup_2fa","verify_2fa_code","code","get_2fa_url","get_2fa_recovery_codes","generate_2fa_recovery_codes","disable_2fa","chaos","NamespaceService","ENTITY_TYPE_FOLDER","ENTITY_TYPE_FILE","NS_TYPE_ADMIN_FOLDER","NS_TYPE_DEFAULT","NS_TYPE_CLIENT_SPACE","NS_KEY_HEADER","NS_KEY_OLD_HEADER","ns_type","ns_key","list","folderId","list_deleted","folder_id","deleted","all","with_path","get_all_namespace","folders_only","ns_type_override","ns_key_override","get_files_by_id","resolve_path","path_string","create_file","parent_id","delete_entity","delete_file","delete_folder","undelete_entity","target_id","undelete_file","undelete_folder","create_folder","foldername","create_folders","folder_paths","rename_file","new_name","move_entity","target_folder_id","target_ns_type","target_ns_key","move_file","move_folder","copy_file","new_parent_id","search_string","query","ShareService","SHARE_TYPE_FILE","SHARE_TYPE_FOLDER","SHARE_APP_PATH","get_active_shares","create_file_share","share_name","expire_days","is_psw_protected","download_limit","files","password_protected","create_folder_share","get_shares_num","ids","fileids","get_shares_of_file","add_file_to_share","share_id","revoke_share","activate_revoked_share","delete_share","get_share_by_key","share_key","with_locations","download_file_by_key","get_subfolder_by_key","subfolder_id","use","VueResource","BASE_PATH","full_path","pathname","relative_path","requests_to_redirect","service","http","interceptors","request","request_url","rule","is_same_service","origin","is_same_method","is_same_endpoint","block","share_psw","set","response","CloudProviderService","StorageLocationService","list_my_team_locations","StorageBackendService","get_buckets","get_suggested_locations","invite_code","get_all_locations_with_distance","include_markers","team_backend_setup","backend_ids","backends","send_bugreport","reply_requested","get_upload_links","object_name_base","generations_num","get_class","domProps","visible","ALERT_VISIBLE_MS","watch","created","methods","$nextTick","keep","self","is_narrow_screen","open_search_dialog","search_term","results","composing","entity_type","FOLDER_TYPE","search_result_clicked","FILE_TYPE","search_focused","wide_search","hideinput","$evt","mounted","cached_namespace","customNamespace","location_hash","redirectWhenClicked","$router","locations","disable_popover","open_modal","locations_sorted","circles","close_modal","teamName","textStart","popover_content","loc","country","locationsContent","popover","globalAlert","searchBox","locationFlags","data_locations","buckets","dateOfExpiring","plan_expires","expires_in","$on","bg_container","bg_img","background","layoutContainer","$body","keyup","keyCode","evt","dropped","JSON","dataTransfer","confirm","err_resp","page","filters","days_rel","days_num","google_user","image_url","show_mfa","email_prefilled","google_sign_in","confirm_result","ok","error_msg","mfa_mode","form","mfa_sms_phone_number","mfa_cooldown","new_mode","$set","pass","login_loading","login_btn_disabled","mfa_cooldown_seconds","user_email","sms_phone_number","original_mfa_mode","mfaLogin","mfa_cooldown_interval","login_btn_state","id_token","platform","redirect_url","details","phone_number","seconds_to_wait","gapi","load","auth2","client_id","getAuthInstance","gUser","signIn","login_google","googleUser","warning","profile","getBasicProfile","getName","getEmail","getImageUrl","getAuthResponse","hide_form","team_config","time_limit_days","submit","email_suggested","form_ok","invite","UserService","get_user","get_me","edit_user","job_title","edit_me","get_my_team","mark_admins","get_company_settings","add_user_email","delete_user_email","update_team_settings","get_team_info","join_key","trial_invite_signup","get_invite_by_key","invite_key","team_invite_signup","formData","fetch","register_company","register_to_team","reg_form","terms_accepted","newsletter","ConfigService","get_config","email_domain_typos","correct","typos","invited_team_name","initial_storage_gb","initial_users","active_spaces_limit","custom_class","infoIcon","STATUS","DEFAULT","SKYFLOK_TRIAL_KEY","inviteConfigBox","form_status","email_ok","suggestion_found","record","typo_found","typo","endsWith","is_success","redirect_to_login","team_info","is_pending_registration","submit_form","email_readonly","has_password","show_password_section","_i","$$a","$$el","$$c","$$v","$$i","form_loading","script","regFooter","password_generated","input_elements","form_submit_enabled","encodeURIComponent","terms_accepted_readonly","user_roles","roles","admin_folder_disabled","dropzone_active","remove_file_highlight","disable_upload","something_dropped","is_client_space_client","show_clouds_ready_box","nav_stack","dragover","drop","change_folder_to","folders","rename","get_folderbox_class","rename_submit","disable_share","disable_namespace_ops","folderbox_dropdown","folder_shares_enabled","open_share_form","copy_move_file","deleteAction","icon","new_folder_mode","new_folder_name","new_folder_loading","new_folder_form","list_filters","types","disable_download","files_multiselect_on","files_multidownload_in_progress","download_all_cancel","download_all_selected","selected_files","file_upload_el","folder_upload_el","files_select_all","newval","sort_by","list_sort","asc","are_files_with_multiple_versions","open","show_details","highlighted","download_file","last_modified_by","team","last_modified","modifiedBoxExternal","versions_num","shares_num","open_file","open_file_info_modal","shares","toLocaleString","loading_filelist","namespace","entities_to_share","share_created","create_share_ready","file_types","ext","toggle_filter","view_file","file_list","show_folder_tree","action","startsWith","operation","copy_move_ready","info_modal_file","files_selected","folder_selected","pullRight","is_client_space_logo","userId","externalActor","file_to_preview","prev_file","next_file","viewer_name","text_file_contents","file_name","read_text_blob","xhr","XMLHttpRequest","responseType","onload","myBlob","reader","FileReader","onloadend","onerror","file_contents_text","readAsText","send","filePreview","total_files","curr_idx","downloader","file_downloaded_callback","jump_prev","jump_next","destroyed","submit_loading","selected_folder","namespace_loading","tree_folder_selected","ClientSpacesService","AUTH_TYPE_SKYFLOK_USER","AUTH_TYPE_CLIENT","CLIENT_SPACE_APP_PATH","SPACE_EVENT_FILE_UPLOADED","SPACE_EVENT_FILE_DELETED","SPACE_EVENT_FOLDER_DELETED","ACTOR_SPACE_MANAGER","ACTOR_CLIENT","is_skyflok_logo","space","with_mfa_status","create_batch","clients","common","archive","space_id","schedule_delete","is_archived","add_space_manager","manager_user_id","remove_space_manager","CHANGE_WATCH_ALL_SPACES","watch_managers","new_watch_value","get_files_count","get_space_size","login_client","client_os","logout_client","auth","get_space","with_team_info","endpoint","space_key","client_info_edit","client_info","watch_client","load_valid_invite","client_join_space","password_hash","resend_invite","resend_invite_batch","space_ids","reset_password","report_space_event","actor","query_file_uploads_downloads","desc","howmany","load_client_2fa_backup_codes","generate_client_2fa_backup_codes","get_client_2fa_events","client_space_url_key","sessionStorage","client_token","selected_namespace","my_client_spaces","is_move_operation","load_namespace","load_folders_only","en","moved_folder_id","targetFile","flatToHierarchy","promise","new_file_id","flat","roots","share","created_by","expire","link","disable_loading","no_avatar","avatar_left","userBox","shares_num_changed","load_shares","share_link","alphakey","shares_updated","versions_limit","versions","download_file_fn","open_file_fn","versioning_keep_versions","versions_num_changed","new_share","entities","entity","invalid_share","submit_share","share_expire_days_to","share_expire_checkbox","expire_date","password_protection_enabled","enable_password","teamSettings","is_passwordless_share_allowed","is_folder_share","download_limit_checkbox","disable_create","is_file","sharedFile","weekday","share_max_size_bytes","limit","share_max_size","share_max_files","share_expire_days_from","share_password_protection_enabled","total_size","create_share_func","share_expire_days","shareCreated","input_id","$el","flash_time_ms","blur","GENERATION_SIZE","FileUploader","userfile","upload_worker","total_bytes_to_upload","upload_file_reject","uploadFile","cancelUpload","fileversion_hash_base","fileversion_hash","gen_idx","segment_start_offset","segment_end_offset","file_slice","metadata","name_hash","gen_descriptor","_upload_generation","new_file","new_version","create_fileversion","links","generation_idx","redundancy_factor","packets","redundant_num","encrypt_result","encrypted_data","cardbox_class","classObj","bgClass","model","divid","basic_info_open","hide_shares","sharing_open","hide_versions","versions_open","fileSharingStatus","fileVersionsTable","MAX_PARALLEL_UPLOADS","MAX_PARALLEL_DOWNLOADS","MAX_FOLDERS_AND_FILES_UPLOAD","MAX_PATH_LENGTH","NAMESPACE_RELOAD_PERIOD_MS","ENABLE_NAMESPACE_REFRESH","modifiedBox","namespaceTree","shareForm","heroBox","fileInfoModal","checkbox","ignore_hashchange","uploading_files_ctr","upload_queue","download_queue","highlight_file_id","ns_reload_handler","is_view_destroyed","team_members_here","user_team","current_dir","current_folder_id","contents","upload_queue_length","download_queue_length","uploadAllowed","downloadAllowed","shareAllowed","namespaceOpsAllowed","cached_ns_key","is_desktop_safari","newVal","oldVal","onbeforeunload","uploading_num","is_uploading","free_slots","files_waiting","new_file_to_start","upload_file","downloading_num","is_downloading","load_folder_contents","load_cached_namespace","load_folder_from_hash","version_string","onhashchange","onblur","stop_periodic_refresh","onclose","highlight_file","cache_namespace","target_folder","reload_namespace","onfocus","dragenter_listener","unmounted","is_empty","namespace_sanitized","stringify","ex","ns_string","fresh_contents","includes","deleted_idx","fresh_entity","local_entity","init_contents","init_file","init_folder","basic_file","force_update","basic_folder","load_file_versions","load_shares_num","latest_with_count","share_nums","active_shares_num","el_idx","new_path","initial_path","part","folders_in_path","valid_path","trigger_el_id","dropdown","animate","$delete","target_entity","copy_move_folder","select_file_name","el_id","field","createTextRange","selRange","collapse","moveStart","moveEnd","setSelectionRange","selectionStart","selectionEnd","rec","parent_folder_id","file_record","temp_file_id","readAsArrayBuffer","paths","filepath","webkitRelativePath","folderpath","new_folders","new_folder","new_folder_path","new_folder_id","parent_path","redundant_packets","cloud_selector_redundant_packets","encrypt_data","uploaded_version","file_uploaded_callback","queue_index","_do_download_file","get_preview_url","file_download_started","downloaded_file","file_download_error","is_open","folder_name","finally","entity_id","ns_entity","feature","upgradeWarningBox","adminWarningBox","fileListView","admin_folder_enabled","is_admin_folder","set_admin_folder","ref","deleted_groups","group","deleted_label","deleted_by","deleted_at","disableRestore","is_deleted_folder","restoring","restoreAllowed","reload","delete_key","deleted_groups_arr","path_diff","a_type","b_type","type_diff","localeCompare","range","file_path","deletedGroups","$refs","shares_disabled","active_shares","active_shares_limit","shares_loading","expired_shares","show_expired","activate_share","revokeHandler","activatedisabled","activateHandler","deleteHandler","str_to_clipboard","accessed_count","shareBox","all_entity_ids","shared_files","is_deleted","client_spaces_disabled","spaces","active_spaces_num","active_spaces","load_spaces","spaces_loading","view_mode","show_edit_managers_modal","open_dialog","create_space","watch_clicked","change_watch","reload_spaces_callback","edit","edit_space","dialog_id","active_spaces_with_expired_invite","dismiss_expired_invites_alert","show_expired_invites","show_filters","table_filter","joined_yes","joined_no","invite_sent_yes","invite_sent_no","invite_expired_yes","invite_expired_no","role_full_control","role_readonly","mfa_enabled_yes","mfa_enabled_no","files_empty","files_not_empty","is_search","active_spaces_filtered","checked_spaces","table_check_all","resend_invite_batch_loading","checked_spaces_no_password","multiselect_csv_export_loading","multiselect_csv_export","table_sort","active_spaces_filtered_sorted","frag","client_email","password_set","is_invite_expired","invite_sending","resend_client_invite","will_expire_text","client_readonly","mfa_enabled","ns_stats","active_files","members","activateclicked","archived_spaces","show_archived","activate_space","show_space_form","space_to_edit","hide_form_switcher","batch_create_mode","hide_form_switch","closeDialog","space_to_archive","on_space_updated","space_to_disable","mfa_backup_codes_space","password_reset_space","updated_space","invite_expires","init_space","watch_toggle_popover_text","client_state","client_popover_text","delete_at","space_managers","member","activate_loading","activate_error","space_size","watching","active_files_num","get_space_link","client_space_link","form_error","batch_mode","raw_csv","parsed_contacts","read_csv","valid_batch_clients","send_email","contact","validate_email","edit_managers_only","logos","logo","select_logo","custom_logo_url","is_submit_allowed","new_space","batch_result","client","space_saved","email_sent","imgclass","image_changed","avatar_changed","Function","max_dimension_px","imageToDataUri","img","canvas","drawImage","toDataURL","resizeImage","picture","Image","readAsDataURL","profileImageSelector","init_form","space_members_selected","clients_ok","csv_array","headings_row","clientname_index","name_index","title_index","firstname_index","middlename_index","lastname_index","email_index","name_parts","existing_item","pc","is_starred","util","client_logo_name","me","selected_logo","csv_file","reset_space_password","space_updated","archive_space","success_msg","selected_user_id","sp","selected_user_name","select_all_spaces","select_none_spaces","my_space_ids","space_clicked","set_initial_user","is_manager","api_method","codes","few_codes","generate_loading","generate_additional_codes","copy_codes","download_codes","recovery_codes","codes_str","load_codes","apicall","new_codes","txt_blob","clientSpaceBox","clientSpaceForm","spacePswResetModal","archiveSpaceModal","editManagersModal","mfaBackupCodes","archive_loading","archive_error","_get_joined_val","view","user_choice","deep","client_spaces","cached_sort","new_keys_found","cached_filters","existing_space","load_files_num","dialog_name","modal_id","show_password_of_space","_open_modal","new_archive_state","stats","stat","emails_scheduled","hide_multiselect","mfa_backup_codes_modal","is_long","new_watch","confirm_message","all_on_btn","onclick","change_watch_all","all_off_btn","_get_joined_val_str","joined_val_num","_get_managers_names","names","member_id","csv_contents","revokeObjectURL","change_image","edit_mode","closeForm","browse_image","mfa_status","has_2fa","mfa_content","new_content","sessions_loading","load_sessions","sessions","session","is_current","get_browser_logo_img","geo_country","get_flag_img","location_str","last_used","issue_timestamp","editMode","isAdmin","psw_change","current_psw","new_password_2","delete_loading","delete_my_account","delete_error","is_initialited","browseImage","promises","user_update_ok","password_change_ok","profile_change_details","verified","is_client_space","kind","setup_mfa_step","completed","mfa_setup_ready","mfa_disabled","mfa_app_url","qr_ready","verify","mfa_code_verify","show_qr","focus_input","QRious","input","submit_delete","failsafe","hash_password","qr_url","backup_codes","showVerifyQr","mfaRecoveryCodes","setup_2fa_app","setup_2fa_config","events_loading","events_page","event_type","extra1","extra2","total_pages","AuditLogService","query_events","ENTITY_TYPE_USER","ENTITY_TYPE_TEAM","ENTITY_TYPE_SHARE","ENTITY_TYPE_CLIENT_SPACE","ENTITY_TYPE_PLAN_CONFIG","ENTITY_TYPE_MFA","USER_CREATED","USER_DELETED_OWN","USER_REMOVED","USER_PASSWORD_CHANGED","USER_PRIMARY_EMAIL_CONFIRMED_CHANGED","USER_SUSPEND_CHANGED","USER_ROLE_CHANGED","USER_OPERATOR_ADDED","COMPANY_CREATED","COMPANY_DELETED","COMPANY_PROFILE_CHANGED","COMPANY_ADDITIONAL_EMAILS_CHANGED","COMPANY_BACKEND_CHANGED","COMPANY_CODING_CONFIG_CHANGED_EVENT","COMPANY_CONFIG_CHANGED_EVENT","COMPANY_PLAN_CHANGED_EVENT","COMPANY_DISABLED_EVENT","COMPANY_ENABLED_EVENT","COMPANY_STORAGE_QUOTA_CHANGED_EVENT","COMPANY_USER_QUOTA_CHANGED_EVENT","COMPANY_PLAN_TIME_LIMIT_CHANGED","FILE_CREATED","FILE_VERSION_CREATED","FILE_REVERTED","FILE_DELETED","FILE_UNDELETED","FILE_REMOVED","FILE_ATTRIBUTE_CHANGED","FILE_DOWNLOADED","FILE_DOWNLOADED_SYNC","FOLDER_CREATED","FOLDER_DELETED","FOLDER_UNDELETED","FOLDER_REMOVED","FOLDER_ATTRIBUTE_CHANGED","SHARE_CREATED","SHARE_REVOKED","SHARE_PASSWORD_CHANGED","SHARE_ATTRIBUTE_CHANGED","SHARE_FILES_CHANGED","SHARE_ACCESSED","SHARE_FILE_DOWNLOADED","CLIENT_SPACE_CREATED","CLIENT_SPACE_ARCHIVED","CLIENT_SPACE_ACTIVATED","CLIENT_SPACE_EDITED_BY_MANAGER","CLIENT_SPACE_EDITED_BY_CLIENT","CLIENT_SPACE_ACCESSED_BY_CLIENT","CLIENT_SPACE_CLIENT_JOINS","PLAN_CREATED","PLAN_UPDATED","PLAN_DELETED","MFA_ENABLED","MFA_DISABLED","MFA_BACKUP_CODES_GENERATED","MFA_SUCCESS","MFA_FAILED_ATTEMPT","page_size","load_history","start_offset","end_offset","is_client","query_params","mfa_kind","mfaDisable","mfaSetupApp","mfaHistory","mfa_recovery_codes","load_mfa_status","editUserForm","mfa","userid","load_events","events_offset","events_pagesize","_get_session_location_string","location_parts","geo_city","geo_state","images","image_filename","offset_min","offset_hours","lang","lang_code","box_highlights","fix_url","highlight_class","coming_soon","form_sent","response_requested","available_plans","plan","_key","pricing","monthly_price","annual_savings","plan_btn_class","plan_selected","show_instructions","selected_plan","checkout_url","BillingService","get_skyflok_options","load_plans","form_data","unsafe_shares","max_user_number","actual_user_number","email_domain","additional_emails","additional_email_form","submit_additional_email_form","init_additional_email_form","cloud_locations","all_gdpr","provider","backend","bucket_id","logo_path","service_name","cloud_platform_url","is_gdpr","hide_storage_history","STORAGE_CHART_OPTIONS","additional_email_addresses","providers","bucket","provider_code","backend_id","today","total_storage","msmt","total_storage_use","old_files","_splineData","delete_email","phone","confirmed","re_sending_email","resend_email","resend_status","in_progress","failed","re_sending_email_err","change_role","change_role_error","view_member","closeModal","initialized","is_suspended","suspend_loading","suspend_error","service_method","rolename","roles_arr","current_slide_idx","total_steps_num","invite_error","invite_loading","customize_locations","all_locations","show_map","location_filter","locations_num","countries","gdpr","yes","no","distance_km","is_filtered","locations_page","custom_locations_selected","provider_logo","provider_name","all_locations_filtered","data_page","location_suggestion_loading","suggested_locations","location_suggestion_failed","locations_ok","user_form","selected_location_ids","team_name","password_strength","user_form_ok","submit_error_msg","invited_email_address","redirect_timer_sec","disable_filtered_label","records_name","disable_pagesize_selector","$$selectedVal","_value","multiple","initial_page_size","city","tablePager","storageLocationCell","passwordStrengthMeter","cloud_providers","$explainer_video","unique_provider_ids","provider_ids","provider_id","are_providers_filtered","fp","are_countries_filtered","checked_num","markers","team_name_ok","user_name_ok","user_email_ok","password_ok","play","load_all_locations","load_invite","load_suggested_locations","invite_loaded","fetch_result","json","creds","PasswordCredential","carousel","err_response","invited_name","with_map_markers","unique_countries","ul","unique_providers","Map","values","share_loading","share_password_needed","unlock_share","share_password","$forceUpdate","navigate_to","is_root","contents_loading","downloads_num","locations_text","beginning","share_received","parse_error","init_folder_contents","is_subfolder","nav_back_enabled","move_date_range","date_range","selected_month_name","nav_fwd_enabled","selected_month_msmts","backends_with_data","providers_with_speeds","downloads_avg","uploads_avg","colorscale","speedscale","mapCenter","mapZoom","map_style","disableDefaultUI","infoOptions","infoWindowPos","infoWinOpen","download_speeds","pickHex","scaleDownloadSpeed","fillOpacity","strokeWeight","rotation","toggleInfoWindow","backends_categories","cat","backend_filter","backends_with_data_filtered","eu_countrycodes","current_year","current_month","first_data_year","first_data_month","SPEED_CHART_OPTIONS","xval","yval","cats","labels","LATENCY_CHART_OPTIONS","MAP_CENTER_GLOBAL","MAP_CENTER_EU","MAP_CENTER_US","measurements","infoWindowBackendId","exclude_countrycodes","countrycodes","cache_key","providers_speeds","downloads","uploads","latencies","download_speed_mbps","upload_speed_mbps","download_latency_ms","download_speed_range","speed","msmts","perfs","bb","noisy_coords","speed_chart_data","date_to_day","latency_chart_data","backends_category","load_measurements","month_offset","year_to_load","month_to_load","date_key","from_date","setUTCFullYear","setUTCMonth","setUTCDate","setUTCHours","setUTCMinutes","to_date","daily_perf_measurements","datestr","last_digit","color1","color2","w1","w2","rgb","acting_user","is_skyflok_user","open_client_form","email_notifications","change_watch_loading","show_trash","recent_events_loading","load_recent_events","recent_events_filtered","sidebar_file_clicked","recent_events","recent_events_pager","recent_events_page","skyflok_team","is_narrow","logout_loading","external_actor","is_space_readonly","on_file_uploaded","report_file_event","client_form","client_form_submit","client_change_pass","current_pass","psw1","psw2","custom_avatar_url","client_form_show_current_pass","client_form_show_new_pass","mfa_alert","disable_login","login_form","stay_logged_in","client_has_custom_logo","team_logo_url","invite_password_generated","invite_form","generate_password","submit_invite_form","invite_password_visible","invite_show_mfa","redacted_client_email","forgotten_password","team_logo","is_clickable","event_user","is_builtin_logo","get_extension","event_file","event_verb","event_html","window_width","SPACE_SYNC_INTERVAL_SEC","loginLogos","eventBox","user_auth","check_interval_handler","space_reload_interval_handler","recent_events_filter","all_events","client_token_storage","show_login_form","load_space","hostname","psw_input","error_handler","change_pass","builtin_logo","plaintext_pass_format","_close_sidebar","psw","do_initialize","with_storage_locations","on_successful_login","clear_client_token","space_is_archived","init_space_ui","is_forward","parentpath","space_is_active","_show_message","_range","get_client_token","set_client_token","status_ribbon_class","new_status","status_changed","VueRouter","VueGoogleMaps","libraries","installComponents","ROUTE_LOGIN_NAME","ROUTE_REGISTER_NAME","ROUTE_REGISTER_FREETRIAL_NAME","ROUTE_JOIN_TEAM_NAME","ROUTE_FILES_NAME","ROUTE_RECYCLE_BIN_NAME","ROUTE_SHARES_NAME","ROUTE_CLIENT_SPACES_NAME","ROUTE_ADMIN_FOLDER_NAME","ROUTE_SETTINGS_NAME","ROUTE_TEAM_NAME","ROUTE_INSTALL_NAME","ROUTE_BUGREPORT_NAME","ROUTE_UPGRADE_NAME","ROUTE_TEAM_SETUP_NAME","ROUTE_TEAM_SETTINGS_NAME","ROUTE_USER_MANAGEMENT_NAME","ROUTE_SHARE_WEBAPP","ROUTE_CLIENT_SPACES_WEBAPP","ROUTE_CLIENT_SPACE_JOIN","ROUTE_PREVIEW_APP","ROUTE_BACKEND_PERFORMANCE_PAGE","special_routes","loginView","shareApp","clientSpaceApp","previewApp","joinTeamView","clientSpaceJoinView","externalRegisterFormsContainer","backendPerformancePage","routes_without_login","IS_PROD_ENV","LOGIN_PATH","JOIN_TEAM_PATH","PREVIEW_APP_PATH","TEAM_SETUP_PATH","CLIENT_SPACE_APP","router","routes","registerView","filesView","recycleBinView","sharesView","clientSpacesView","adminFolderView","settingsView","installAppsView","bugReportView","upgradeTeamView","teamMembersView","teamSettingsView","teamSetupView","userManagementView","redirect","notRecognizedRouteView","hashbang","root","saveScrollPosition","Sentry","dsn","integrations","maskAllText","blockAllMedia","tracesSampleRate","tracePropagationTargets","replaysSessionSampleRate","replaysOnErrorSampleRate","__GIT_INFO__","branch","no_redirect_paths","path_prefix","separator","path_str","timeout","cached_token","init_user","encodeURI","currentRoute","refresh_storage_use","refresh_team","new_attributes","load_buckets","page_url","load_2fa_status","is_fresh_login","resp","settings","special_route","App","webpackContext","req","webpackContextResolve","__webpack_require__","webpackEmptyContext","__webpack_module_cache__","moduleId","cachedModule","loaded","__webpack_modules__","deferred","chunkIds","notFulfilled","fulfilled","every","getter","__esModule","definition","globalThis","hmd","prop","Symbol","toStringTag","nmd","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}