');
+ // http://stackoverflow.com/questions/14441456/how-to-detect-which-device-view-youre-on-using-twitter-bootstrap-api
+ var envs = ['xs', 'sm', 'md', 'lg'];
+ var $el = $('
');
$el.appendTo($('body'));
- for (var i = envs.length - 1; i >= 0; i--) {
+ for (var i = envs.length - 1; i >= 0; i -= 1) {
var env = envs[i];
$el.addClass('hidden-' + env);
@@ -292,10 +296,10 @@
},
getHoursArray: function () {
- var currentHour = new Date().getHours(),
- labels = [];
+ var currentHour = new Date().getHours();
+ var labels = [];
- for (var i = currentHour, ii = currentHour - 24; i > ii; i--) {
+ for (var i = currentHour, ii = currentHour - 24; i > ii; i -= 1) {
var hour = i < 0 ? 24 + i : i;
labels.push(hour + ':00');
}
@@ -304,12 +308,12 @@
},
getDaysArray: function (from) {
- var currentDay = new Date(from || Date.now()).getTime(),
- months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
- labels = [],
- tmpDate;
+ var currentDay = new Date(from || Date.now()).getTime();
+ var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
+ var labels = [];
+ var tmpDate;
- for(var x = 29; x >= 0; x--) {
+ for (var x = 29; x >= 0; x -= 1) {
tmpDate = new Date(currentDay - (1000 * 60 * 60 * 24 * x));
labels.push(months[tmpDate.getMonth()] + ' ' + tmpDate.getDate());
}
@@ -319,8 +323,8 @@
/* Retrieved from http://stackoverflow.com/a/7557433 @ 27 Mar 2016 */
isElementInViewport: function (el) {
- //special bonus for those using jQuery
- if (typeof jQuery === "function" && el instanceof jQuery) {
+ // special bonus for those using jQuery
+ if (typeof jQuery === 'function' && el instanceof jQuery) {
el = el[0];
}
@@ -329,14 +333,16 @@
return (
rect.top >= 0 &&
rect.left >= 0 &&
- rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */
- rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */
+ rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /* or $(window).height() */
+ rect.right <= (window.innerWidth || document.documentElement.clientWidth) /* or $(window).width() */
);
},
// get all the url params in a single key/value hash
params: function (options) {
- var a, hash = {}, params;
+ var a;
+ var hash = {};
+ var params;
options = options || {};
options.skipToType = options.skipToType || {};
@@ -344,12 +350,12 @@
if (options.url) {
a = utils.urlToLocation(options.url);
}
- params = (a ? a.search : window.location.search).substring(1).split("&");
+ params = (a ? a.search : window.location.search).substring(1).split('&');
params.forEach(function (param) {
- var val = param.split('='),
- key = decodeURI(val[0]),
- value = options.skipToType[key] ? decodeURI(val[1]) : utils.toType(decodeURI(val[1]));
+ var val = param.split('=');
+ var key = decodeURI(val[0]);
+ var value = options.skipToType[key] ? decodeURI(val[1]) : utils.toType(decodeURI(val[1]));
if (key) {
if (key.substr(-2, 2) === '[]') {
@@ -384,24 +390,23 @@
var type = typeof str;
if (type !== 'string') {
return str;
- } else {
- var nb = parseFloat(str);
- if (!isNaN(nb) && isFinite(str)) {
- return nb;
- }
- if (str === 'false') {
- return false;
- }
- if (str === 'true') {
- return true;
- }
+ }
+ var nb = parseFloat(str);
+ if (!isNaN(nb) && isFinite(str)) {
+ return nb;
+ }
+ if (str === 'false') {
+ return false;
+ }
+ if (str === 'true') {
+ return true;
+ }
- try {
- str = JSON.parse(str);
- } catch (e) {}
+ try {
+ str = JSON.parse(str);
+ } catch (e) {}
- return str;
- }
+ return str;
},
// Safely get/set chained properties on an object
@@ -410,23 +415,23 @@
// get example: utils.props(A, 'a.b.c.foo.bar') // returns undefined without throwing a TypeError
// credits to github.com/gkindel
props: function (obj, props, value) {
- if(obj === undefined) {
+ if (obj === undefined) {
obj = window;
}
- if(props == null) {
+ if (props == null) {
return undefined;
}
var i = props.indexOf('.');
- if( i == -1 ) {
- if(value !== undefined) {
+ if (i === -1) {
+ if (value !== undefined) {
obj[props] = value;
}
return obj[props];
}
- var prop = props.slice(0, i),
- newProps = props.slice(i + 1);
+ var prop = props.slice(0, i);
+ var newProps = props.slice(i + 1);
- if(props !== undefined && !(obj[prop] instanceof Object) ) {
+ if (props !== undefined && !(obj[prop] instanceof Object)) {
obj[prop] = {};
}
@@ -439,47 +444,43 @@
targetLocation.host === referenceLocation.host && targetLocation.protocol === referenceLocation.protocol && // Otherwise need to check if protocol and host match
(relative_path.length > 0 ? targetLocation.pathname.indexOf(relative_path) === 0 : true) // Subfolder installs need this additional check
);
- }
+ },
};
- if (typeof String.prototype.startsWith != 'function') {
+ module.exports = utils;
+ if (typeof window !== 'undefined') {
+ window.utils = module.exports;
+ }
+
+ /* eslint "no-extend-native": "off" */
+ if (typeof String.prototype.startsWith !== 'function') {
String.prototype.startsWith = function (prefix) {
if (this.length < prefix.length) {
return false;
}
- for (var i = prefix.length - 1; (i >= 0) && (this[i] === prefix[i]); --i) {
- continue;
- }
- return i < 0;
+ return this.slice(0, prefix.length) === prefix;
};
}
- if (typeof String.prototype.endsWith != 'function') {
+ if (typeof String.prototype.endsWith !== 'function') {
String.prototype.endsWith = function (suffix) {
if (this.length < suffix.length) {
return false;
}
- var len = this.length;
- var suffixLen = suffix.length;
- for (var i = 1; (i <= suffixLen && this[len - i] === suffix[suffixLen - i]); ++i) {
- continue;
+ if (suffix.length === 0) {
+ return true;
}
- return i > suffixLen;
+ return this.slice(-suffix.length) === suffix;
};
}
- if (typeof String.prototype.rtrim != 'function') {
+ if (typeof String.prototype.rtrim !== 'function') {
String.prototype.rtrim = function () {
return this.replace(/\s+$/g, '');
};
}
-
- if ('undefined' !== typeof window) {
- window.utils = module.exports;
- }
-
-}('undefined' === typeof module ? {
+}(typeof module === 'undefined' ? {
module: {
- exports: {}
- }
+ exports: {},
+ },
} : module));
diff --git a/public/src/widgets.js b/public/src/widgets.js
index 377ccb2c53..f5f667d2a7 100644
--- a/public/src/widgets.js
+++ b/public/src/widgets.js
@@ -1,5 +1,5 @@
-"use strict";
-/*global ajaxify, templates, config, utils*/
+'use strict';
+
(function (ajaxify) {
ajaxify.widgets = {};
@@ -29,19 +29,19 @@
}
});
- $.get(config.relative_path + '/api/widgets/render' + '?' + config['cache-buster'], {
+ $.get(config.relative_path + '/api/widgets/render?' + config['cache-buster'], {
locations: widgetLocations,
template: template + '.tpl',
url: url,
cid: ajaxify.data.cid,
- isMobile: utils.isMobile()
+ isMobile: utils.isMobile(),
}, function (renderedAreas) {
- for (var x = 0; x < renderedAreas.length; ++x) {
+ for (var x = 0; x < renderedAreas.length; x += 1) {
var renderedWidgets = renderedAreas[x].widgets;
var location = renderedAreas[x].location;
var html = '';
- for (var i = 0; i < renderedWidgets.length; ++i) {
+ for (var i = 0; i < renderedWidgets.length; i += 1) {
html += templates.parse(renderedWidgets[i].html, {});
}
@@ -79,7 +79,7 @@
widgetAreas.find('img[title].teaser-pic,img[title].user-img').each(function () {
$(this).tooltip({
placement: 'top',
- title: $(this).attr('title')
+ title: $(this).attr('title'),
});
});
$(window).trigger('action:widgets.loaded', {});
diff --git a/public/vendor/mdl/mdl.css b/public/vendor/mdl/material.css
similarity index 78%
rename from public/vendor/mdl/mdl.css
rename to public/vendor/mdl/material.css
index c037532647..74b6b7b71f 100644
--- a/public/vendor/mdl/mdl.css
+++ b/public/vendor/mdl/material.css
@@ -1,6 +1,6 @@
/**
* material-design-lite - Material Design Components in CSS, JS and HTML
- * @version v1.0.3
+ * @version v1.3.0
* @license Apache-2.0
* @copyright 2015 Google, Inc.
* @link https://github.com/google/material-design-lite
@@ -62,6 +62,15 @@
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -113,6 +122,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -161,7 +171,10 @@
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -180,6 +193,7 @@
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -250,6 +264,15 @@
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -301,6 +324,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -349,7 +373,10 @@
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/*
* What follows is the result of much research on cross-browser styling.
* Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
@@ -496,6 +523,12 @@ textarea {
These examples override the primary ('mobile first') styles.
Modify as content requires.
========================================================================== */
+@media only screen and (min-width: 35em) {
+ /* Style adjustments for viewports that meet the condition */ }
+
+@media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 1.25dppx), (min-resolution: 120dpi) {
+ /* Style adjustments for high resolution devices */ }
+
/* ==========================================================================
Print styles.
Inlined to avoid the additional HTTP request:
@@ -505,13 +538,11 @@ textarea {
*,
*:before,
*:after,
- *:first-letter,
- *:first-line {
+ *:first-letter {
background: transparent !important;
color: #000 !important;
/* Black prints faster: http://www.sanbeiji.com/archives/953 */
- box-shadow: none !important;
- text-shadow: none !important; }
+ box-shadow: none !important; }
a,
a:visited {
text-decoration: underline; }
@@ -660,6 +691,15 @@ main {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -711,6 +751,7 @@ main {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -759,7 +800,10 @@ main {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -778,6 +822,7 @@ main {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
/*html, body {
font-family: "Helvetica", "Arial", sans-serif;
font-size: 14px;
@@ -1160,6 +1205,21 @@ ul, ol {
.mdl-typography--font-black {
font-weight: 900 !important; }
+.material-icons {
+ font-family: 'Material Icons';
+ font-weight: normal;
+ font-style: normal;
+ font-size: 24px;
+ line-height: 1;
+ letter-spacing: normal;
+ text-transform: none;
+ display: inline-block;
+ word-wrap: normal;
+ -moz-font-feature-settings: 'liga';
+ font-feature-settings: 'liga';
+ -webkit-font-feature-settings: 'liga';
+ -webkit-font-smoothing: antialiased; }
+
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -1215,6 +1275,15 @@ ul, ol {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -1266,6 +1335,7 @@ ul, ol {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -1314,7 +1384,10 @@ ul, ol {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-color-text--red {
color: rgb(244,67,54) !important; }
@@ -3050,6 +3123,15 @@ ul, ol {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -3101,6 +3183,7 @@ ul, ol {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -3149,7 +3232,10 @@ ul, ol {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-ripple {
background: rgb(0,0,0);
border-radius: 50%;
@@ -3160,13 +3246,13 @@ ul, ol {
position: absolute;
top: 0;
-webkit-transform: translate(-50%, -50%);
- -ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
width: 50px;
overflow: hidden; }
.mdl-ripple.is-animating {
- -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1);
- transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1); }
+ transition: width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1);
+ transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1);
+ transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1); }
.mdl-ripple.is-visible {
opacity: 0.3; }
@@ -3225,6 +3311,15 @@ ul, ol {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -3276,6 +3371,7 @@ ul, ol {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -3324,22 +3420,21 @@ ul, ol {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-animation--default {
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
.mdl-animation--fast-out-slow-in {
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
.mdl-animation--linear-out-slow-in {
- -webkit-transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+ transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }
.mdl-animation--fast-out-linear-in {
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 1, 1); }
+ transition-timing-function: cubic-bezier(0.4, 0, 1, 1); }
/**
* Copyright 2015 Google Inc. All Rights Reserved.
@@ -3396,6 +3491,15 @@ ul, ol {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -3447,6 +3551,7 @@ ul, ol {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -3495,7 +3600,10 @@ ul, ol {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-badge {
position: relative;
white-space: nowrap;
@@ -3504,26 +3612,21 @@ ul, ol {
margin-right: auto; }
.mdl-badge[data-badge]:after {
content: attr(data-badge);
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
- -webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-align-content: center;
-ms-flex-line-pack: center;
align-content: center;
- -webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
@@ -3545,6 +3648,10 @@ ul, ol {
color: rgb(255,64,129);
background: rgba(255,255,255,0.2);
box-shadow: 0 0 1px gray; }
+ .mdl-badge.mdl-badge--overlap {
+ margin-right: 10px; }
+ .mdl-badge.mdl-badge--overlap:after {
+ right: -10px; }
/**
* Copyright 2015 Google Inc. All Rights Reserved.
@@ -3601,6 +3708,15 @@ ul, ol {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -3652,6 +3768,7 @@ ul, ol {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -3700,7 +3817,10 @@ ul, ol {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -3719,6 +3839,7 @@ ul, ol {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-button {
background: transparent;
border: none;
@@ -3726,8 +3847,9 @@ ul, ol {
color: rgb(0,0,0);
position: relative;
height: 36px;
+ margin: 0;
min-width: 64px;
- padding: 0 8px;
+ padding: 0 16px;
display: inline-block;
font-family: "Roboto", "Helvetica", "Arial", sans-serif;
font-size: 14px;
@@ -3736,9 +3858,8 @@ ul, ol {
line-height: 1;
letter-spacing: 0;
overflow: hidden;
- will-change: box-shadow, transform;
- -webkit-transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
- transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ will-change: box-shadow;
+ transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
outline: none;
cursor: pointer;
text-decoration: none;
@@ -3800,7 +3921,6 @@ input.mdl-button[type="submit"] {
top: 50%;
left: 50%;
-webkit-transform: translate(-12px, -12px);
- -ms-transform: translate(-12px, -12px);
transform: translate(-12px, -12px);
line-height: 24px;
width: 24px; }
@@ -3846,7 +3966,6 @@ input.mdl-button[type="submit"] {
top: 50%;
left: 50%;
-webkit-transform: translate(-12px, -12px);
- -ms-transform: translate(-12px, -12px);
transform: translate(-12px, -12px);
line-height: 24px;
width: 24px; }
@@ -3890,26 +4009,21 @@ input.mdl-button[type="submit"] {
color: rgb(255,255,255);
background-color: rgb(255,64,129); }
-.mdl-button[disabled][disabled],
-.mdl-button.mdl-button--disabled.mdl-button--disabled {
+.mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled {
color: rgba(0,0,0, 0.26);
- cursor: auto;
+ cursor: default;
background-color: transparent; }
-.mdl-button--fab[disabled][disabled],
-.mdl-button--fab.mdl-button--disabled.mdl-button--disabled {
+.mdl-button--fab[disabled][disabled], .mdl-button--fab.mdl-button--disabled.mdl-button--disabled {
background-color: rgba(0,0,0, 0.12);
- color: rgba(0,0,0, 0.26);
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); }
+ color: rgba(0,0,0, 0.26); }
-.mdl-button--raised[disabled][disabled],
-.mdl-button--raised.mdl-button--disabled.mdl-button--disabled {
+.mdl-button--raised[disabled][disabled], .mdl-button--raised.mdl-button--disabled.mdl-button--disabled {
background-color: rgba(0,0,0, 0.12);
color: rgba(0,0,0, 0.26);
- box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); }
+ box-shadow: none; }
-.mdl-button--colored[disabled][disabled],
-.mdl-button--colored.mdl-button--disabled.mdl-button--disabled {
+.mdl-button--colored[disabled][disabled], .mdl-button--colored.mdl-button--disabled.mdl-button--disabled {
color: rgba(0,0,0, 0.26); }
.mdl-button .material-icons {
@@ -3970,6 +4084,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -4021,6 +4144,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -4069,14 +4193,14 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-card {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
@@ -4101,17 +4225,14 @@ input.mdl-button[type="submit"] {
box-sizing: border-box; }
.mdl-card__title {
- -webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
color: rgb(0,0,0);
display: block;
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-pack: stretch;
-webkit-justify-content: stretch;
-ms-flex-pack: stretch;
justify-content: stretch;
@@ -4120,7 +4241,6 @@ input.mdl-button[type="submit"] {
-webkit-perspective-origin: 165px 56px;
perspective-origin: 165px 56px;
-webkit-transform-origin: 165px 56px;
- -ms-transform-origin: 165px 56px;
transform-origin: 165px 56px;
box-sizing: border-box; }
.mdl-card__title.mdl-card--border {
@@ -4132,7 +4252,6 @@ input.mdl-button[type="submit"] {
align-self: flex-end;
color: inherit;
display: block;
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
@@ -4141,22 +4260,23 @@ input.mdl-button[type="submit"] {
line-height: normal;
overflow: hidden;
-webkit-transform-origin: 149px 48px;
- -ms-transform-origin: 149px 48px;
transform-origin: 149px 48px;
margin: 0; }
.mdl-card__subtitle-text {
font-size: 14px;
- color: grey;
+ color: rgba(0,0,0, 0.54);
margin: 0; }
.mdl-card__supporting-text {
color: rgba(0,0,0, 0.54);
- font-size: 13px;
+ font-size: 1rem;
line-height: 18px;
overflow: hidden;
padding: 16px 16px;
width: 90%; }
+ .mdl-card__supporting-text.mdl-card--border {
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1); }
.mdl-card__actions {
font-size: 16px;
@@ -4169,7 +4289,6 @@ input.mdl-button[type="submit"] {
border-top: 1px solid rgba(0, 0, 0, 0.1); }
.mdl-card--expand {
- -webkit-box-flex: 1;
-webkit-flex-grow: 1;
-ms-flex-positive: 1;
flex-grow: 1; }
@@ -4234,6 +4353,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -4285,6 +4413,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -4333,7 +4462,10 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -4352,6 +4484,7 @@ input.mdl-button[type="submit"] {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-checkbox {
position: relative;
z-index: 1;
@@ -4396,6 +4529,7 @@ input.mdl-button[type="submit"] {
z-index: 2; }
.mdl-checkbox.is-checked .mdl-checkbox__box-outline {
border: 2px solid rgb(63,81,181); }
+ fieldset[disabled] .mdl-checkbox .mdl-checkbox__box-outline,
.mdl-checkbox.is-disabled .mdl-checkbox__box-outline {
border: 2px solid rgba(0,0,0, 0.26);
cursor: auto; }
@@ -4426,14 +4560,12 @@ input.mdl-button[type="submit"] {
-webkit-mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==");
mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==");
background: transparent;
- -webkit-transition-duration: 0.28s;
- transition-duration: 0.28s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- -webkit-transition-property: background;
- transition-property: background; }
+ transition-duration: 0.28s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-property: background; }
.mdl-checkbox.is-checked .mdl-checkbox__tick-outline {
background: rgb(63,81,181) url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K"); }
+ fieldset[disabled] .mdl-checkbox.is-checked .mdl-checkbox__tick-outline,
.mdl-checkbox.is-checked.is-disabled .mdl-checkbox__tick-outline {
background: rgba(0,0,0, 0.26) url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K"); }
@@ -4443,6 +4575,7 @@ input.mdl-button[type="submit"] {
font-size: 16px;
line-height: 24px;
margin: 0; }
+ fieldset[disabled] .mdl-checkbox .mdl-checkbox__label,
.mdl-checkbox.is-disabled .mdl-checkbox__label {
color: rgba(0,0,0, 0.26);
cursor: auto; }
@@ -4461,8 +4594,10 @@ input.mdl-button[type="submit"] {
-webkit-mask-image: -webkit-radial-gradient(circle, white, black); }
.mdl-checkbox__ripple-container .mdl-ripple {
background: rgb(63,81,181); }
+ fieldset[disabled] .mdl-checkbox .mdl-checkbox__ripple-container,
.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container {
cursor: auto; }
+ fieldset[disabled] .mdl-checkbox .mdl-checkbox__ripple-container .mdl-ripple,
.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container .mdl-ripple {
background: transparent; }
@@ -4521,6 +4656,257 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
+ */
+/* ========== TYPOGRAPHY ========== */
+/* We're splitting fonts into "preferred" and "performance" in order to optimize
+ page loading. For important text, such as the body, we want it to load
+ immediately and not wait for the web font load, whereas for other sections,
+ such as headers and titles, we're OK with things taking a bit longer to load.
+ We do have some optional classes and parameters in the mixins, in case you
+ definitely want to make sure you're using the preferred font and don't mind
+ the performance hit.
+ We should be able to improve on this once CSS Font Loading L3 becomes more
+ widely available.
+*/
+/* ========== COLORS ========== */
+/**
+*
+* Material design color palettes.
+* @see http://www.google.com/design/spec/style/color.html
+*
+**/
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* ========== Color Palettes ========== */
+/* colors.scss */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* ========== IMAGES ========== */
+/* ========== Color & Themes ========== */
+/* ========== Typography ========== */
+/* ========== Components ========== */
+/* ========== Standard Buttons ========== */
+/* ========== Icon Toggles ========== */
+/* ========== Radio Buttons ========== */
+/* ========== Ripple effect ========== */
+/* ========== Layout ========== */
+/* ========== Content Tabs ========== */
+/* ========== Checkboxes ========== */
+/* ========== Switches ========== */
+/* ========== Spinner ========== */
+/* ========== Text fields ========== */
+/* ========== Card ========== */
+/* ========== Sliders ========== */
+/* ========== Progress ========== */
+/* ========== List ========== */
+/* ========== Item ========== */
+/* ========== Dropdown menu ========== */
+/* ========== Tooltips ========== */
+/* ========== Footer ========== */
+/* TEXTFIELD */
+/* SWITCH */
+/* SPINNER */
+/* RADIO */
+/* MENU */
+/* LIST */
+/* LAYOUT */
+/* ICON TOGGLE */
+/* FOOTER */
+/*mega-footer*/
+/*mini-footer*/
+/* CHECKBOX */
+/* CARD */
+/* Card dimensions */
+/* Cover image */
+/* BUTTON */
+/**
+ *
+ * Dimensions
+ *
+ */
+/* ANIMATION */
+/* PROGRESS */
+/* BADGE */
+/* SHADOWS */
+/* GRID */
+/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
+/* TOOLTIP */
+/* CHIP */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* Typography */
+/* Shadows */
+/* Animations */
+/* Dialog */
+.mdl-chip {
+ height: 32px;
+ font-family: "Roboto", "Helvetica", "Arial", sans-serif;
+ line-height: 32px;
+ padding: 0 12px;
+ border: 0;
+ border-radius: 16px;
+ background-color: #dedede;
+ display: inline-block;
+ color: rgba(0,0,0, 0.87);
+ margin: 2px 0;
+ font-size: 0;
+ white-space: nowrap; }
+ .mdl-chip__text {
+ font-size: 13px;
+ vertical-align: middle;
+ display: inline-block; }
+ .mdl-chip__action {
+ height: 24px;
+ width: 24px;
+ background: transparent;
+ opacity: 0.54;
+ display: inline-block;
+ cursor: pointer;
+ text-align: center;
+ vertical-align: middle;
+ padding: 0;
+ margin: 0 0 0 4px;
+ font-size: 13px;
+ text-decoration: none;
+ color: rgba(0,0,0, 0.87);
+ border: none;
+ outline: none;
+ overflow: hidden; }
+ .mdl-chip__contact {
+ height: 32px;
+ width: 32px;
+ border-radius: 16px;
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 8px;
+ overflow: hidden;
+ text-align: center;
+ font-size: 18px;
+ line-height: 32px; }
+ .mdl-chip:focus {
+ outline: 0;
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); }
+ .mdl-chip:active {
+ background-color: #d6d6d6; }
+ .mdl-chip--deletable {
+ padding-right: 4px; }
+ .mdl-chip--contact {
+ padding-left: 0; }
+
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*------------------------------------* $CONTENTS
+\*------------------------------------*/
+/**
+ * STYLE GUIDE VARIABLES------------------Declarations of Sass variables
+ * -----Typography
+ * -----Colors
+ * -----Textfield
+ * -----Switch
+ * -----Spinner
+ * -----Radio
+ * -----Menu
+ * -----List
+ * -----Layout
+ * -----Icon toggles
+ * -----Footer
+ * -----Column
+ * -----Checkbox
+ * -----Card
+ * -----Button
+ * -----Animation
+ * -----Progress
+ * -----Badge
+ * -----Shadows
+ * -----Grid
+ * -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -4572,6 +4958,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -4620,7 +5007,10 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -4639,6 +5029,7 @@ input.mdl-button[type="submit"] {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-data-table {
position: relative;
border: 1px solid rgba(0, 0, 0, 0.12);
@@ -4653,18 +5044,15 @@ input.mdl-button[type="submit"] {
.mdl-data-table tbody tr {
position: relative;
height: 48px;
- -webkit-transition-duration: 0.28s;
- transition-duration: 0.28s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- -webkit-transition-property: background-color;
- transition-property: background-color; }
+ transition-duration: 0.28s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-property: background-color; }
.mdl-data-table tbody tr.is-selected {
background-color: #e0e0e0; }
.mdl-data-table tbody tr:hover {
background-color: #eeeeee; }
.mdl-data-table td, .mdl-data-table th {
- padding: 0 18px 0 18px;
+ padding: 0 18px 12px 18px;
text-align: right; }
.mdl-data-table td:first-of-type, .mdl-data-table th:first-of-type {
padding-left: 24px; }
@@ -4672,16 +5060,14 @@ input.mdl-button[type="submit"] {
padding-right: 24px; }
.mdl-data-table td {
position: relative;
- vertical-align: top;
+ vertical-align: middle;
height: 48px;
border-top: 1px solid rgba(0, 0, 0, 0.12);
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
padding-top: 12px;
box-sizing: border-box; }
.mdl-data-table td .mdl-data-table__select {
- vertical-align: top;
- position: absolute;
- left: 24px; }
+ vertical-align: middle; }
.mdl-data-table th {
position: relative;
vertical-align: bottom;
@@ -4695,10 +5081,32 @@ input.mdl-button[type="submit"] {
color: rgba(0, 0, 0, 0.54);
padding-bottom: 8px;
box-sizing: border-box; }
- .mdl-data-table th .mdl-data-table__select {
- position: absolute;
- bottom: 8px;
- left: 24px; }
+ .mdl-data-table th.mdl-data-table__header--sorted-ascending, .mdl-data-table th.mdl-data-table__header--sorted-descending {
+ color: rgba(0, 0, 0, 0.87); }
+ .mdl-data-table th.mdl-data-table__header--sorted-ascending:before, .mdl-data-table th.mdl-data-table__header--sorted-descending:before {
+ font-family: 'Material Icons';
+ font-weight: normal;
+ font-style: normal;
+ font-size: 24px;
+ line-height: 1;
+ letter-spacing: normal;
+ text-transform: none;
+ display: inline-block;
+ word-wrap: normal;
+ -moz-font-feature-settings: 'liga';
+ font-feature-settings: 'liga';
+ -webkit-font-feature-settings: 'liga';
+ -webkit-font-smoothing: antialiased;
+ font-size: 16px;
+ content: "\e5d8";
+ margin-right: 5px;
+ vertical-align: sub; }
+ .mdl-data-table th.mdl-data-table__header--sorted-ascending:hover, .mdl-data-table th.mdl-data-table__header--sorted-descending:hover {
+ cursor: pointer; }
+ .mdl-data-table th.mdl-data-table__header--sorted-ascending:hover:before, .mdl-data-table th.mdl-data-table__header--sorted-descending:hover:before {
+ color: rgba(0, 0, 0, 0.26); }
+ .mdl-data-table th.mdl-data-table__header--sorted-descending:before {
+ content: "\e5db"; }
.mdl-data-table__select {
width: 16px; }
@@ -4761,6 +5169,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -4812,6 +5229,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -4860,7 +5278,10 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -4879,31 +5300,257 @@ input.mdl-button[type="submit"] {
/* Typography */
/* Shadows */
/* Animations */
-.mdl-mega-footer {
- padding: 16px 40px;
- color: rgb(158,158,158);
- background-color: rgb(66,66,66); }
-
-.mdl-mega-footer--top-section:after,
-.mdl-mega-footer--middle-section:after,
-.mdl-mega-footer--bottom-section:after,
-.mdl-mega-footer__top-section:after,
-.mdl-mega-footer__middle-section:after,
-.mdl-mega-footer__bottom-section:after {
- content: '';
- display: block;
- clear: both; }
-
-.mdl-mega-footer--left-section,
-.mdl-mega-footer__left-section {
- margin-bottom: 16px; }
-
-.mdl-mega-footer--right-section,
-.mdl-mega-footer__right-section {
- margin-bottom: 16px; }
+/* Dialog */
+.mdl-dialog {
+ border: none;
+ box-shadow: 0 9px 46px 8px rgba(0, 0, 0, 0.14), 0 11px 15px -7px rgba(0, 0, 0, 0.12), 0 24px 38px 3px rgba(0, 0, 0, 0.2);
+ width: 280px; }
+ .mdl-dialog__title {
+ padding: 24px 24px 0;
+ margin: 0;
+ font-size: 2.5rem; }
+ .mdl-dialog__actions {
+ padding: 8px 8px 8px 24px;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-direction: row-reverse;
+ -ms-flex-direction: row-reverse;
+ flex-direction: row-reverse;
+ -webkit-flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap; }
+ .mdl-dialog__actions > * {
+ margin-right: 8px;
+ height: 36px; }
+ .mdl-dialog__actions > *:first-child {
+ margin-right: 0; }
+ .mdl-dialog__actions--full-width {
+ padding: 0 0 8px 0; }
+ .mdl-dialog__actions--full-width > * {
+ height: 48px;
+ -webkit-flex: 0 0 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ padding-right: 16px;
+ margin-right: 0;
+ text-align: right; }
+ .mdl-dialog__content {
+ padding: 20px 24px 24px 24px;
+ color: rgba(0,0,0, 0.54); }
-.mdl-mega-footer--right-section a,
-.mdl-mega-footer__right-section a {
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*------------------------------------* $CONTENTS
+\*------------------------------------*/
+/**
+ * STYLE GUIDE VARIABLES------------------Declarations of Sass variables
+ * -----Typography
+ * -----Colors
+ * -----Textfield
+ * -----Switch
+ * -----Spinner
+ * -----Radio
+ * -----Menu
+ * -----List
+ * -----Layout
+ * -----Icon toggles
+ * -----Footer
+ * -----Column
+ * -----Checkbox
+ * -----Card
+ * -----Button
+ * -----Animation
+ * -----Progress
+ * -----Badge
+ * -----Shadows
+ * -----Grid
+ * -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
+ */
+/* ========== TYPOGRAPHY ========== */
+/* We're splitting fonts into "preferred" and "performance" in order to optimize
+ page loading. For important text, such as the body, we want it to load
+ immediately and not wait for the web font load, whereas for other sections,
+ such as headers and titles, we're OK with things taking a bit longer to load.
+ We do have some optional classes and parameters in the mixins, in case you
+ definitely want to make sure you're using the preferred font and don't mind
+ the performance hit.
+ We should be able to improve on this once CSS Font Loading L3 becomes more
+ widely available.
+*/
+/* ========== COLORS ========== */
+/**
+*
+* Material design color palettes.
+* @see http://www.google.com/design/spec/style/color.html
+*
+**/
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* ========== Color Palettes ========== */
+/* colors.scss */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* ========== IMAGES ========== */
+/* ========== Color & Themes ========== */
+/* ========== Typography ========== */
+/* ========== Components ========== */
+/* ========== Standard Buttons ========== */
+/* ========== Icon Toggles ========== */
+/* ========== Radio Buttons ========== */
+/* ========== Ripple effect ========== */
+/* ========== Layout ========== */
+/* ========== Content Tabs ========== */
+/* ========== Checkboxes ========== */
+/* ========== Switches ========== */
+/* ========== Spinner ========== */
+/* ========== Text fields ========== */
+/* ========== Card ========== */
+/* ========== Sliders ========== */
+/* ========== Progress ========== */
+/* ========== List ========== */
+/* ========== Item ========== */
+/* ========== Dropdown menu ========== */
+/* ========== Tooltips ========== */
+/* ========== Footer ========== */
+/* TEXTFIELD */
+/* SWITCH */
+/* SPINNER */
+/* RADIO */
+/* MENU */
+/* LIST */
+/* LAYOUT */
+/* ICON TOGGLE */
+/* FOOTER */
+/*mega-footer*/
+/*mini-footer*/
+/* CHECKBOX */
+/* CARD */
+/* Card dimensions */
+/* Cover image */
+/* BUTTON */
+/**
+ *
+ * Dimensions
+ *
+ */
+/* ANIMATION */
+/* PROGRESS */
+/* BADGE */
+/* SHADOWS */
+/* GRID */
+/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
+/* TOOLTIP */
+/* CHIP */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* Typography */
+/* Shadows */
+/* Animations */
+/* Dialog */
+.mdl-mega-footer {
+ padding: 16px 40px;
+ color: rgb(158,158,158);
+ background-color: rgb(66,66,66); }
+
+.mdl-mega-footer--top-section:after,
+.mdl-mega-footer--middle-section:after,
+.mdl-mega-footer--bottom-section:after,
+.mdl-mega-footer__top-section:after,
+.mdl-mega-footer__middle-section:after,
+.mdl-mega-footer__bottom-section:after {
+ content: '';
+ display: block;
+ clear: both; }
+
+.mdl-mega-footer--left-section,
+.mdl-mega-footer__left-section {
+ margin-bottom: 16px; }
+
+.mdl-mega-footer--right-section,
+.mdl-mega-footer__right-section {
+ margin-bottom: 16px; }
+
+.mdl-mega-footer--right-section a,
+.mdl-mega-footer__right-section a {
display: block;
margin-bottom: 16px;
color: inherit;
@@ -4986,21 +5633,27 @@ input.mdl-button[type="submit"] {
cursor: pointer;
z-index: 1;
opacity: 0; }
- .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer--heading:after,
- .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer__heading:after,
- .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer--heading:after,
- .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer__heading:after {
+ .mdl-mega-footer--heading-checkbox + .mdl-mega-footer--heading:after,
+ .mdl-mega-footer--heading-checkbox + .mdl-mega-footer__heading:after,
+ .mdl-mega-footer__heading-checkbox + .mdl-mega-footer--heading:after,
+ .mdl-mega-footer__heading-checkbox + .mdl-mega-footer__heading:after {
font-family: 'Material Icons';
content: '\E5CE'; }
-.mdl-mega-footer--heading-checkbox:checked ~ ul,
-.mdl-mega-footer__heading-checkbox:checked ~ ul {
+.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--link-list,
+.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__link-list,
+.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list,
+.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list,
+.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--link-list,
+.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__link-list,
+.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list,
+.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list {
display: none; }
-.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--heading:after,
-.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__heading:after,
-.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--heading:after,
-.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__heading:after {
+.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading:after,
+.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading:after,
+.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading:after,
+.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading:after {
font-family: 'Material Icons';
content: '\E5CF'; }
@@ -5060,18 +5713,24 @@ input.mdl-button[type="submit"] {
.mdl-mega-footer--heading-checkbox,
.mdl-mega-footer__heading-checkbox {
display: none; }
- .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer--heading:after,
- .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer__heading:after,
- .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer--heading:after,
- .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer__heading:after {
- background-image: none; }
- .mdl-mega-footer--heading-checkbox:checked ~ ul,
- .mdl-mega-footer__heading-checkbox:checked ~ ul {
+ .mdl-mega-footer--heading-checkbox + .mdl-mega-footer--heading:after,
+ .mdl-mega-footer--heading-checkbox + .mdl-mega-footer__heading:after,
+ .mdl-mega-footer__heading-checkbox + .mdl-mega-footer--heading:after,
+ .mdl-mega-footer__heading-checkbox + .mdl-mega-footer__heading:after {
+ content: ''; }
+ .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--link-list,
+ .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__link-list,
+ .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list,
+ .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list,
+ .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--link-list,
+ .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__link-list,
+ .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list,
+ .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list {
display: block; }
- .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--heading:after,
- .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__heading:after,
- .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--heading:after,
- .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__heading:after {
+ .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading:after,
+ .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading:after,
+ .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading:after,
+ .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading:after {
content: ''; } }
.mdl-mega-footer--bottom-section,
@@ -5150,6 +5809,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -5201,6 +5869,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -5249,16 +5918,17 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-mini-footer {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-flow: row wrap;
-ms-flex-flow: row wrap;
flex-flow: row wrap;
- -webkit-box-pack: justify;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
@@ -5273,7 +5943,6 @@ input.mdl-button[type="submit"] {
.mdl-mini-footer--link-list,
.mdl-mini-footer__link-list {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
@@ -5300,7 +5969,6 @@ input.mdl-button[type="submit"] {
.mdl-mini-footer--left-section,
.mdl-mini-footer__left-section {
display: inline-block;
- -webkit-box-ordinal-group: 1;
-webkit-order: 0;
-ms-flex-order: 0;
order: 0; }
@@ -5308,7 +5976,6 @@ input.mdl-button[type="submit"] {
.mdl-mini-footer--right-section,
.mdl-mini-footer__right-section {
display: inline-block;
- -webkit-box-ordinal-group: 2;
-webkit-order: 1;
-ms-flex-order: 1;
order: 1; }
@@ -5377,6 +6044,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -5428,6 +6104,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -5476,7 +6153,10 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-icon-toggle {
position: relative;
z-index: 1;
@@ -5516,8 +6196,7 @@ input.mdl-button[type="submit"] {
text-align: center;
background-color: transparent;
will-change: background-color;
- -webkit-transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1);
- transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); }
+ transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); }
.mdl-icon-toggle__label.material-icons {
line-height: 32px;
font-size: 24px; }
@@ -5526,8 +6205,7 @@ input.mdl-button[type="submit"] {
.mdl-icon-toggle.is-disabled .mdl-icon-toggle__label {
color: rgba(0,0,0, 0.26);
cursor: auto;
- -webkit-transition: none;
- transition: none; }
+ transition: none; }
.mdl-icon-toggle.is-focused .mdl-icon-toggle__label {
background-color: rgba(0,0,0, 0.12); }
.mdl-icon-toggle.is-focused.is-checked .mdl-icon-toggle__label {
@@ -5607,6 +6285,336 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
+ */
+/* ========== TYPOGRAPHY ========== */
+/* We're splitting fonts into "preferred" and "performance" in order to optimize
+ page loading. For important text, such as the body, we want it to load
+ immediately and not wait for the web font load, whereas for other sections,
+ such as headers and titles, we're OK with things taking a bit longer to load.
+ We do have some optional classes and parameters in the mixins, in case you
+ definitely want to make sure you're using the preferred font and don't mind
+ the performance hit.
+ We should be able to improve on this once CSS Font Loading L3 becomes more
+ widely available.
+*/
+/* ========== COLORS ========== */
+/**
+*
+* Material design color palettes.
+* @see http://www.google.com/design/spec/style/color.html
+*
+**/
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* ========== Color Palettes ========== */
+/* colors.scss */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* ========== IMAGES ========== */
+/* ========== Color & Themes ========== */
+/* ========== Typography ========== */
+/* ========== Components ========== */
+/* ========== Standard Buttons ========== */
+/* ========== Icon Toggles ========== */
+/* ========== Radio Buttons ========== */
+/* ========== Ripple effect ========== */
+/* ========== Layout ========== */
+/* ========== Content Tabs ========== */
+/* ========== Checkboxes ========== */
+/* ========== Switches ========== */
+/* ========== Spinner ========== */
+/* ========== Text fields ========== */
+/* ========== Card ========== */
+/* ========== Sliders ========== */
+/* ========== Progress ========== */
+/* ========== List ========== */
+/* ========== Item ========== */
+/* ========== Dropdown menu ========== */
+/* ========== Tooltips ========== */
+/* ========== Footer ========== */
+/* TEXTFIELD */
+/* SWITCH */
+/* SPINNER */
+/* RADIO */
+/* MENU */
+/* LIST */
+/* LAYOUT */
+/* ICON TOGGLE */
+/* FOOTER */
+/*mega-footer*/
+/*mini-footer*/
+/* CHECKBOX */
+/* CARD */
+/* Card dimensions */
+/* Cover image */
+/* BUTTON */
+/**
+ *
+ * Dimensions
+ *
+ */
+/* ANIMATION */
+/* PROGRESS */
+/* BADGE */
+/* SHADOWS */
+/* GRID */
+/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
+/* TOOLTIP */
+/* CHIP */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* Typography */
+/* Shadows */
+/* Animations */
+/* Dialog */
+.mdl-list {
+ display: block;
+ padding: 8px 0;
+ list-style: none; }
+
+.mdl-list__item {
+ font-family: "Roboto", "Helvetica", "Arial", sans-serif;
+ font-size: 16px;
+ font-weight: 400;
+ line-height: 24px;
+ letter-spacing: 0.04em;
+ line-height: 1;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ min-height: 48px;
+ box-sizing: border-box;
+ -webkit-flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
+ padding: 16px;
+ cursor: default;
+ color: rgba(0,0,0, 0.87);
+ overflow: hidden; }
+ .mdl-list__item .mdl-list__item-primary-content {
+ -webkit-order: 0;
+ -ms-flex-order: 0;
+ order: 0;
+ -webkit-flex-grow: 2;
+ -ms-flex-positive: 2;
+ flex-grow: 2;
+ text-decoration: none;
+ box-sizing: border-box;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-align-items: center;
+ -ms-flex-align: center;
+ align-items: center; }
+ .mdl-list__item .mdl-list__item-primary-content .mdl-list__item-icon {
+ margin-right: 32px; }
+ .mdl-list__item .mdl-list__item-primary-content .mdl-list__item-avatar {
+ margin-right: 16px; }
+ .mdl-list__item .mdl-list__item-secondary-content {
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-flow: column;
+ -ms-flex-flow: column;
+ flex-flow: column;
+ -webkit-align-items: flex-end;
+ -ms-flex-align: end;
+ align-items: flex-end;
+ margin-left: 16px; }
+ .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-secondary-action label {
+ display: inline; }
+ .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-secondary-info {
+ font-size: 12px;
+ font-weight: 400;
+ line-height: 1;
+ letter-spacing: 0;
+ color: rgba(0,0,0, 0.54); }
+ .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-sub-header {
+ padding: 0 0 0 16px; }
+
+.mdl-list__item-icon,
+.mdl-list__item-icon.material-icons {
+ height: 24px;
+ width: 24px;
+ font-size: 24px;
+ box-sizing: border-box;
+ color: rgb(117,117,117); }
+
+.mdl-list__item-avatar,
+.mdl-list__item-avatar.material-icons {
+ height: 40px;
+ width: 40px;
+ box-sizing: border-box;
+ border-radius: 50%;
+ background-color: rgb(117,117,117);
+ font-size: 40px;
+ color: white; }
+
+.mdl-list__item--two-line {
+ height: 72px; }
+ .mdl-list__item--two-line .mdl-list__item-primary-content {
+ height: 36px;
+ line-height: 20px;
+ display: block; }
+ .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-avatar {
+ float: left; }
+ .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-icon {
+ float: left;
+ margin-top: 6px; }
+ .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-secondary-content {
+ height: 36px; }
+ .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-sub-title {
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 24px;
+ letter-spacing: 0;
+ line-height: 18px;
+ color: rgba(0,0,0, 0.54);
+ display: block;
+ padding: 0; }
+
+.mdl-list__item--three-line {
+ height: 88px; }
+ .mdl-list__item--three-line .mdl-list__item-primary-content {
+ height: 52px;
+ line-height: 20px;
+ display: block; }
+ .mdl-list__item--three-line .mdl-list__item-primary-content .mdl-list__item-avatar,
+ .mdl-list__item--three-line .mdl-list__item-primary-content .mdl-list__item-icon {
+ float: left; }
+ .mdl-list__item--three-line .mdl-list__item-secondary-content {
+ height: 52px; }
+ .mdl-list__item--three-line .mdl-list__item-text-body {
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 24px;
+ letter-spacing: 0;
+ line-height: 18px;
+ height: 52px;
+ color: rgba(0,0,0, 0.54);
+ display: block;
+ padding: 0; }
+
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*------------------------------------* $CONTENTS
+\*------------------------------------*/
+/**
+ * STYLE GUIDE VARIABLES------------------Declarations of Sass variables
+ * -----Typography
+ * -----Colors
+ * -----Textfield
+ * -----Switch
+ * -----Spinner
+ * -----Radio
+ * -----Menu
+ * -----List
+ * -----Layout
+ * -----Icon toggles
+ * -----Footer
+ * -----Column
+ * -----Checkbox
+ * -----Card
+ * -----Button
+ * -----Animation
+ * -----Progress
+ * -----Badge
+ * -----Shadows
+ * -----Grid
+ * -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -5658,6 +6666,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -5706,7 +6715,10 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -5725,6 +6737,7 @@ input.mdl-button[type="submit"] {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-menu__container {
display: block;
margin: 0;
@@ -5736,8 +6749,7 @@ input.mdl-button[type="submit"] {
width: 0;
visibility: hidden;
z-index: -1; }
- .mdl-menu__container.is-visible,
- .mdl-menu__container.is-animating {
+ .mdl-menu__container.is-visible, .mdl-menu__container.is-animating {
z-index: 999;
visibility: visible; }
@@ -5754,33 +6766,28 @@ input.mdl-button[type="submit"] {
overflow: hidden;
opacity: 0;
-webkit-transform: scale(0);
- -ms-transform: scale(0);
transform: scale(0);
-webkit-transform-origin: 0 0;
- -ms-transform-origin: 0 0;
transform-origin: 0 0;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
will-change: transform;
- -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
- transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
z-index: -1; }
.mdl-menu__container.is-visible .mdl-menu__outline {
opacity: 1;
-webkit-transform: scale(1);
- -ms-transform: scale(1);
transform: scale(1);
z-index: 999; }
.mdl-menu__outline.mdl-menu--bottom-right {
-webkit-transform-origin: 100% 0;
- -ms-transform-origin: 100% 0;
transform-origin: 100% 0; }
.mdl-menu__outline.mdl-menu--top-left {
-webkit-transform-origin: 0 100%;
- -ms-transform-origin: 0 100%;
transform-origin: 0 100%; }
.mdl-menu__outline.mdl-menu--top-right {
-webkit-transform-origin: 100% 100%;
- -ms-transform-origin: 100% 100%;
transform-origin: 100% 100%; }
.mdl-menu {
@@ -5800,8 +6807,7 @@ input.mdl-button[type="submit"] {
opacity: 1;
z-index: 999; }
.mdl-menu.is-animating {
- -webkit-transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1);
- transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1); }
+ transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1); }
.mdl-menu.mdl-menu--bottom-right {
left: auto;
right: 0; }
@@ -5838,8 +6844,7 @@ input.mdl-button[type="submit"] {
line-height: 48px;
white-space: nowrap;
opacity: 0;
- -webkit-transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
- transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
@@ -5848,15 +6853,17 @@ input.mdl-button[type="submit"] {
opacity: 1; }
.mdl-menu__item::-moz-focus-inner {
border: 0; }
- .mdl-menu__item[disabled] {
+ .mdl-menu__item--full-bleed-divider {
+ border-bottom: 1px solid rgba(0,0,0, 0.12); }
+ .mdl-menu__item[disabled], .mdl-menu__item[data-mdl-disabled] {
color: rgb(189,189,189);
background-color: transparent;
cursor: auto; }
- .mdl-menu__item[disabled]:hover {
+ .mdl-menu__item[disabled]:hover, .mdl-menu__item[data-mdl-disabled]:hover {
background-color: transparent; }
- .mdl-menu__item[disabled]:focus {
+ .mdl-menu__item[disabled]:focus, .mdl-menu__item[data-mdl-disabled]:focus {
background-color: transparent; }
- .mdl-menu__item[disabled] .mdl-ripple {
+ .mdl-menu__item[disabled] .mdl-ripple, .mdl-menu__item[data-mdl-disabled] .mdl-ripple {
background: transparent; }
.mdl-menu__item:hover {
background-color: rgb(238,238,238); }
@@ -5931,6 +6938,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -5982,6 +6998,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -6030,12 +7047,16 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-progress {
display: block;
position: relative;
height: 4px;
- width: 500px; }
+ width: 500px;
+ max-width: 100%; }
.mdl-progress > .bar {
display: block;
@@ -6043,8 +7064,7 @@ input.mdl-button[type="submit"] {
top: 0;
bottom: 0;
width: 0%;
- -webkit-transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1);
- transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1); }
+ transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1); }
.mdl-progress > .progressbar {
background-color: rgb(63,81,181);
@@ -6052,7 +7072,6 @@ input.mdl-button[type="submit"] {
left: 0; }
.mdl-progress > .bufferbar {
- background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181));
background-image: linear-gradient(to right, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181));
z-index: 0;
left: 0; }
@@ -6061,16 +7080,17 @@ input.mdl-button[type="submit"] {
right: 0; }
@supports (-webkit-appearance: none) {
+ .mdl-progress:not(.mdl-progress--indeterminate):not(.mdl-progress--indeterminate) > .auxbar,
.mdl-progress:not(.mdl-progress__indeterminate):not(.mdl-progress__indeterminate) > .auxbar {
- background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181));
background-image: linear-gradient(to right, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181));
-webkit-mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=");
mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo="); } }
+.mdl-progress:not(.mdl-progress--indeterminate) > .auxbar,
.mdl-progress:not(.mdl-progress__indeterminate) > .auxbar {
- background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.9), rgba(255,255,255, 0.9)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181));
background-image: linear-gradient(to right, rgba(255,255,255, 0.9), rgba(255,255,255, 0.9)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181)); }
+.mdl-progress.mdl-progress--indeterminate > .bar1,
.mdl-progress.mdl-progress__indeterminate > .bar1 {
background-color: rgb(63,81,181);
-webkit-animation-name: indeterminate1;
@@ -6082,6 +7102,7 @@ input.mdl-button[type="submit"] {
-webkit-animation-timing-function: linear;
animation-timing-function: linear; }
+.mdl-progress.mdl-progress--indeterminate > .bar3,
.mdl-progress.mdl-progress__indeterminate > .bar3 {
background-image: none;
background-color: rgb(63,81,181);
@@ -6199,6 +7220,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -6250,6 +7280,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -6298,7 +7329,10 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -6317,8 +7351,8 @@ input.mdl-button[type="submit"] {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-navigation {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
@@ -6330,19 +7364,21 @@ input.mdl-button[type="submit"] {
.mdl-navigation__link {
color: rgb(66,66,66);
text-decoration: none;
- font-weight: 500;
- font-size: 13px;
- margin: 0; }
+ margin: 0;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 24px;
+ letter-spacing: 0;
+ opacity: 0.87; }
+ .mdl-navigation__link .material-icons {
+ vertical-align: middle; }
.mdl-layout {
width: 100%;
height: 100%;
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
@@ -6362,6 +7398,7 @@ input.mdl-button[type="submit"] {
width: 100%;
height: 100%; }
+.mdl-layout__title,
.mdl-layout-title {
display: block;
position: relative;
@@ -6374,18 +7411,14 @@ input.mdl-button[type="submit"] {
box-sizing: border-box; }
.mdl-layout-spacer {
- -webkit-box-flex: 1;
-webkit-flex-grow: 1;
-ms-flex-positive: 1;
flex-grow: 1; }
.mdl-layout__drawer {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
@@ -6403,43 +7436,41 @@ input.mdl-button[type="submit"] {
border-right: 1px solid rgb(224,224,224);
background: rgb(250,250,250);
-webkit-transform: translateX(-250px);
- -ms-transform: translateX(-250px);
transform: translateX(-250px);
-webkit-transform-style: preserve-3d;
transform-style: preserve-3d;
will-change: transform;
- -webkit-transition-duration: 0.2s;
- transition-duration: 0.2s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- -webkit-transition-property: -webkit-transform;
- transition-property: transform;
+ transition-duration: 0.2s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-property: -webkit-transform;
+ transition-property: transform;
+ transition-property: transform, -webkit-transform;
color: rgb(66,66,66);
overflow: visible;
overflow-y: auto;
z-index: 5; }
.mdl-layout__drawer.is-visible {
-webkit-transform: translateX(0);
- -ms-transform: translateX(0);
transform: translateX(0); }
+ .mdl-layout__drawer.is-visible ~ .mdl-layout__content.mdl-layout__content {
+ overflow: hidden; }
.mdl-layout__drawer > * {
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0; }
+ .mdl-layout__drawer > .mdl-layout__title,
.mdl-layout__drawer > .mdl-layout-title {
line-height: 64px;
padding-left: 40px; }
@media screen and (max-width: 1024px) {
+ .mdl-layout__drawer > .mdl-layout__title,
.mdl-layout__drawer > .mdl-layout-title {
line-height: 56px;
padding-left: 16px; } }
.mdl-layout__drawer .mdl-navigation {
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
- -webkit-box-align: stretch;
-webkit-align-items: stretch;
-ms-flex-align: stretch;
align-items: stretch;
@@ -6458,12 +7489,11 @@ input.mdl-button[type="submit"] {
.mdl-layout__drawer .mdl-navigation .mdl-navigation__link:hover {
background-color: rgb(224,224,224); }
.mdl-layout__drawer .mdl-navigation .mdl-navigation__link--current {
- background-color: rgb(0,0,0);
- color: rgb(63,81,181); }
+ background-color: rgb(224,224,224);
+ color: rgb(0,0,0); }
@media screen and (min-width: 1025px) {
.mdl-layout--fixed-drawer > .mdl-layout__drawer {
-webkit-transform: translateX(0);
- -ms-transform: translateX(0);
transform: translateX(0); } }
.mdl-layout__drawer-button {
@@ -6479,9 +7509,9 @@ input.mdl-button[type="submit"] {
text-align: center;
cursor: pointer;
font-size: 26px;
- line-height: 50px;
+ line-height: 56px;
font-family: Helvetica, Arial, sans-serif;
- margin: 10px 12px;
+ margin: 8px 12px;
top: 0;
left: 0;
color: rgb(255,255,255);
@@ -6498,23 +7528,23 @@ input.mdl-button[type="submit"] {
margin: 4px;
color: rgba(0, 0, 0, 0.5); } }
@media screen and (min-width: 1025px) {
- .mdl-layout--fixed-drawer > .mdl-layout__drawer-button {
- display: none; } }
+ .mdl-layout__drawer-button {
+ line-height: 54px; }
+ .mdl-layout--no-desktop-drawer-button .mdl-layout__drawer-button,
+ .mdl-layout--fixed-drawer > .mdl-layout__drawer-button,
+ .mdl-layout--no-drawer-button .mdl-layout__drawer-button {
+ display: none; } }
.mdl-layout__header {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
-webkit-flex-wrap: nowrap;
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
- -webkit-box-pack: start;
-webkit-justify-content: flex-start;
-ms-flex-pack: start;
justify-content: flex-start;
@@ -6532,19 +7562,16 @@ input.mdl-button[type="submit"] {
background-color: rgb(63,81,181);
color: rgb(255,255,255);
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
- -webkit-transition-duration: 0.2s;
- transition-duration: 0.2s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- -webkit-transition-property: max-height, box-shadow;
- transition-property: max-height, box-shadow; }
+ transition-duration: 0.2s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-property: max-height, box-shadow; }
@media screen and (max-width: 1024px) {
.mdl-layout__header {
min-height: 56px; } }
- .mdl-layout--fixed-drawer:not(.is-small-screen) > .mdl-layout__header {
+ .mdl-layout--fixed-drawer.is-upgraded:not(.is-small-screen) > .mdl-layout__header {
margin-left: 240px;
width: calc(100% - 240px); }
- @media screen and (min-width: 1024px) {
+ @media screen and (min-width: 1025px) {
.mdl-layout--fixed-drawer > .mdl-layout__header .mdl-layout__header-row {
padding-left: 40px; } }
.mdl-layout__header > .mdl-layout-icon {
@@ -6576,7 +7603,6 @@ input.mdl-button[type="submit"] {
.mdl-layout__header {
display: none; }
.mdl-layout--fixed-header > .mdl-layout__header {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex; } }
@@ -6596,14 +7622,15 @@ input.mdl-button[type="submit"] {
overflow: hidden; }
.mdl-layout__header--waterfall.is-casting-shadow {
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); }
+ .mdl-layout__header--waterfall.mdl-layout__header--waterfall-hide-top {
+ -webkit-justify-content: flex-end;
+ -ms-flex-pack: end;
+ justify-content: flex-end; }
.mdl-layout__header-row {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
@@ -6617,17 +7644,23 @@ input.mdl-button[type="submit"] {
-webkit-align-self: stretch;
-ms-flex-item-align: stretch;
align-self: stretch;
- -webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
height: 64px;
margin: 0;
padding: 0 40px 0 80px; }
+ .mdl-layout--no-drawer-button .mdl-layout__header-row {
+ padding-left: 40px; }
+ @media screen and (min-width: 1025px) {
+ .mdl-layout--no-desktop-drawer-button .mdl-layout__header-row {
+ padding-left: 40px; } }
@media screen and (max-width: 1024px) {
.mdl-layout__header-row {
height: 56px;
- padding: 0 16px 0 72px; } }
+ padding: 0 16px 0 72px; }
+ .mdl-layout--no-drawer-button .mdl-layout__header-row {
+ padding-left: 16px; } }
.mdl-layout__header-row > * {
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
@@ -6638,12 +7671,9 @@ input.mdl-button[type="submit"] {
margin: 0;
padding: 0;
height: 64px;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
- -webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center; }
@@ -6669,22 +7699,29 @@ input.mdl-button[type="submit"] {
width: 100%;
z-index: 4;
visibility: hidden;
- -webkit-transition-property: background-color;
- transition-property: background-color;
- -webkit-transition-duration: 0.2s;
- transition-duration: 0.2s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
- .mdl-layout__drawer.is-visible ~ .mdl-layout__obfuscator {
+ transition-property: background-color;
+ transition-duration: 0.2s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+ .mdl-layout__obfuscator.is-visible {
background-color: rgba(0, 0, 0, 0.5);
visibility: visible; }
+ @supports (pointer-events: auto) {
+ .mdl-layout__obfuscator {
+ background-color: rgba(0, 0, 0, 0.5);
+ opacity: 0;
+ transition-property: opacity;
+ visibility: visible;
+ pointer-events: none; }
+ .mdl-layout__obfuscator.is-visible {
+ pointer-events: auto;
+ opacity: 1; } }
.mdl-layout__content {
-ms-flex: 0 1 auto;
+ position: relative;
display: inline-block;
overflow-y: auto;
overflow-x: hidden;
- -webkit-box-flex: 1;
-webkit-flex-grow: 1;
-ms-flex-positive: 1;
flex-grow: 1;
@@ -6704,9 +7741,8 @@ input.mdl-button[type="submit"] {
.mdl-layout__tab-bar {
height: 96px;
margin: 0;
- width: calc(100% - 112px);
+ width: calc(100% - 112px);
padding: 0 0 0 56px;
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
@@ -6715,10 +7751,20 @@ input.mdl-button[type="submit"] {
overflow-x: scroll; }
.mdl-layout__tab-bar::-webkit-scrollbar {
display: none; }
+ .mdl-layout--no-drawer-button .mdl-layout__tab-bar {
+ padding-left: 16px;
+ width: calc(100% - 32px); }
+ @media screen and (min-width: 1025px) {
+ .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar {
+ padding-left: 16px;
+ width: calc(100% - 32px); } }
@media screen and (max-width: 1024px) {
.mdl-layout__tab-bar {
- width: calc(100% - 60px);
- padding: 0 0 0 60px; } }
+ width: calc(100% - 60px);
+ padding: 0 0 0 60px; }
+ .mdl-layout--no-drawer-button .mdl-layout__tab-bar {
+ width: calc(100% - 8px);
+ padding-left: 4px; } }
.mdl-layout--fixed-tabs .mdl-layout__tab-bar {
padding: 0;
overflow: hidden;
@@ -6731,7 +7777,6 @@ input.mdl-button[type="submit"] {
border: none;
margin: 0;
z-index: 2;
- -webkit-box-flex: 0;
-webkit-flex-grow: 0;
-ms-flex-positive: 0;
flex-grow: 0;
@@ -6759,9 +7804,15 @@ input.mdl-button[type="submit"] {
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
+ .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar-button,
+ .mdl-layout--no-drawer-button .mdl-layout__tab-bar-button {
+ width: 16px; }
+ .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar-button .material-icons,
+ .mdl-layout--no-drawer-button .mdl-layout__tab-bar-button .material-icons {
+ position: relative;
+ left: -4px; }
@media screen and (max-width: 1024px) {
.mdl-layout__tab-bar-button {
- display: none;
width: 60px; } }
.mdl-layout--fixed-tabs .mdl-layout__tab-bar-button {
display: none; }
@@ -6783,7 +7834,6 @@ input.mdl-button[type="submit"] {
float: left;
position: relative;
display: block;
- -webkit-box-flex: 0;
-webkit-flex-grow: 0;
-ms-flex-positive: 0;
flex-grow: 0;
@@ -6804,7 +7854,6 @@ input.mdl-button[type="submit"] {
padding: 0 12px 0 12px; } }
.mdl-layout--fixed-tabs .mdl-layout__tab {
float: none;
- -webkit-box-flex: 1;
-webkit-flex-grow: 1;
-ms-flex-positive: 1;
flex-grow: 1;
@@ -6822,8 +7871,7 @@ input.mdl-button[type="submit"] {
background: rgb(255,64,129);
-webkit-animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards;
animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards;
- -webkit-transition: all 1s cubic-bezier(0.4, 0, 1, 1);
- transition: all 1s cubic-bezier(0.4, 0, 1, 1); }
+ transition: all 1s cubic-bezier(0.4, 0, 1, 1); }
.mdl-layout__tab .mdl-layout__tab-ripple-container {
display: block;
position: absolute;
@@ -6898,6 +7946,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -6949,6 +8006,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -6997,7 +8055,10 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -7016,12 +8077,15 @@ input.mdl-button[type="submit"] {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-radio {
position: relative;
font-size: 16px;
line-height: 24px;
display: inline-block;
+ vertical-align: middle;
box-sizing: border-box;
+ height: 24px;
margin: 0;
padding-left: 0; }
.mdl-radio.is-upgraded {
@@ -7057,6 +8121,7 @@ input.mdl-button[type="submit"] {
z-index: 2; }
.mdl-radio.is-checked .mdl-radio__outer-circle {
border: 2px solid rgb(63,81,181); }
+ .mdl-radio__outer-circle fieldset[disabled] .mdl-radio,
.mdl-radio.is-disabled .mdl-radio__outer-circle {
border: 2px solid rgba(0,0,0, 0.26);
cursor: auto; }
@@ -7071,19 +8136,19 @@ input.mdl-button[type="submit"] {
width: 8px;
height: 8px;
cursor: pointer;
- -webkit-transition-duration: 0.28s;
- transition-duration: 0.28s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- -webkit-transition-property: -webkit-transform;
- transition-property: transform;
- -webkit-transform: scale3d(0, 0, 0);
- transform: scale3d(0, 0, 0);
+ transition-duration: 0.28s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-property: -webkit-transform;
+ transition-property: transform;
+ transition-property: transform, -webkit-transform;
+ -webkit-transform: scale(0, 0);
+ transform: scale(0, 0);
border-radius: 50%;
background: rgb(63,81,181); }
.mdl-radio.is-checked .mdl-radio__inner-circle {
- -webkit-transform: scale3d(1, 1, 1);
- transform: scale3d(1, 1, 1); }
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1); }
+ fieldset[disabled] .mdl-radio .mdl-radio__inner-circle,
.mdl-radio.is-disabled .mdl-radio__inner-circle {
background: rgba(0,0,0, 0.26);
cursor: auto; }
@@ -7092,6 +8157,7 @@ input.mdl-button[type="submit"] {
.mdl-radio__label {
cursor: pointer; }
+ fieldset[disabled] .mdl-radio .mdl-radio__label,
.mdl-radio.is-disabled .mdl-radio__label {
color: rgba(0,0,0, 0.26);
cursor: auto; }
@@ -7110,8 +8176,10 @@ input.mdl-button[type="submit"] {
-webkit-mask-image: -webkit-radial-gradient(circle, white, black); }
.mdl-radio__ripple-container .mdl-ripple {
background: rgb(63,81,181); }
+ fieldset[disabled] .mdl-radio .mdl-radio__ripple-container,
.mdl-radio.is-disabled .mdl-radio__ripple-container {
cursor: auto; }
+ fieldset[disabled] .mdl-radio .mdl-radio__ripple-container .mdl-ripple,
.mdl-radio.is-disabled .mdl-radio__ripple-container .mdl-ripple {
background: transparent; }
@@ -7170,6 +8238,15 @@ input.mdl-button[type="submit"] {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -7221,6 +8298,7 @@ input.mdl-button[type="submit"] {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -7269,7 +8347,10 @@ input.mdl-button[type="submit"] {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
_:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
-ms-appearance: none;
height: 32px;
@@ -7293,6 +8374,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
color: rgb(63,81,181);
-webkit-align-self: center;
-ms-flex-item-align: center;
+ -ms-grid-row-align: center;
align-self: center;
z-index: 1;
cursor: pointer;
@@ -7329,8 +8411,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
border-radius: 50%;
background: rgb(63,81,181);
border: none;
- -webkit-transition: -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
- transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); }
+ transition: border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); }
.mdl-slider.is-upgraded::-moz-range-thumb {
-moz-appearance: none;
width: 12px;
@@ -7359,24 +8442,23 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
border: none;
border-radius: 50%;
background: rgb(63,81,181);
- -ms-transform: scale(0.375);
- transform: scale(0.375);
- transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); }
+ transform: scale(0.375);
+ transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1);
+ transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); }
.mdl-slider.is-upgraded:focus:not(:active)::-ms-thumb {
background: radial-gradient(circle closest-side, rgb(63,81,181) 0%, rgb(63,81,181) 37.5%, rgba(63,81,181, 0.26) 37.5%, rgba(63,81,181, 0.26) 100%);
- -ms-transform: scale(1);
- transform: scale(1); }
+ transform: scale(1); }
.mdl-slider.is-upgraded:active::-ms-thumb {
background: rgb(63,81,181);
- -ms-transform: scale(0.5625);
- transform: scale(0.5625); }
+ transform: scale(0.5625); }
.mdl-slider.is-upgraded.is-lowest-value::-webkit-slider-thumb {
border: 2px solid rgba(0,0,0, 0.26);
background: transparent; }
.mdl-slider.is-upgraded.is-lowest-value::-moz-range-thumb {
border: 2px solid rgba(0,0,0, 0.26);
background: transparent; }
- .mdl-slider.is-upgraded.is-lowest-value ~
+ .mdl-slider.is-upgraded.is-lowest-value +
.mdl-slider__background-flex > .mdl-slider__background-upper {
left: 6px; }
.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-webkit-slider-thumb {
@@ -7389,7 +8471,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
border: 1.6px solid rgba(0,0,0, 0.26);
-webkit-transform: scale(1.5);
transform: scale(1.5); }
- .mdl-slider.is-upgraded.is-lowest-value:active ~
+ .mdl-slider.is-upgraded.is-lowest-value:active +
.mdl-slider__background-flex > .mdl-slider__background-upper {
left: 9px; }
.mdl-slider.is-upgraded.is-lowest-value:active::-moz-range-thumb {
@@ -7399,11 +8481,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
background: radial-gradient(circle closest-side, transparent 0%, transparent 66.67%, rgba(0,0,0, 0.26) 66.67%, rgba(0,0,0, 0.26) 100%); }
.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-ms-thumb {
background: radial-gradient(circle closest-side, rgba(0,0,0, 0.12) 0%, rgba(0,0,0, 0.12) 25%, rgba(0,0,0, 0.26) 25%, rgba(0,0,0, 0.26) 37.5%, rgba(0,0,0, 0.12) 37.5%, rgba(0,0,0, 0.12) 100%);
- -ms-transform: scale(1);
- transform: scale(1); }
+ transform: scale(1); }
.mdl-slider.is-upgraded.is-lowest-value:active::-ms-thumb {
- -ms-transform: scale(0.5625);
- transform: scale(0.5625);
+ transform: scale(0.5625);
background: radial-gradient(circle closest-side, transparent 0%, transparent 77.78%, rgba(0,0,0, 0.26) 77.78%, rgba(0,0,0, 0.26) 100%); }
.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-lower {
background: transparent; }
@@ -7411,51 +8491,37 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
margin-left: 6px; }
.mdl-slider.is-upgraded.is-lowest-value:active::-ms-fill-upper {
margin-left: 9px; }
- .mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb,
- .mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb,
- .mdl-slider.is-upgraded:disabled::-webkit-slider-thumb {
+ .mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb, .mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb, .mdl-slider.is-upgraded:disabled::-webkit-slider-thumb {
-webkit-transform: scale(0.667);
transform: scale(0.667);
background: rgba(0,0,0, 0.26); }
- .mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb,
- .mdl-slider.is-upgraded:disabled:active::-moz-range-thumb,
- .mdl-slider.is-upgraded:disabled::-moz-range-thumb {
+ .mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb, .mdl-slider.is-upgraded:disabled:active::-moz-range-thumb, .mdl-slider.is-upgraded:disabled::-moz-range-thumb {
transform: scale(0.667);
background: rgba(0,0,0, 0.26); }
- .mdl-slider.is-upgraded:disabled ~
+ .mdl-slider.is-upgraded:disabled +
.mdl-slider__background-flex > .mdl-slider__background-lower {
background-color: rgba(0,0,0, 0.26);
left: -6px; }
- .mdl-slider.is-upgraded:disabled ~
+ .mdl-slider.is-upgraded:disabled +
.mdl-slider__background-flex > .mdl-slider__background-upper {
left: 6px; }
- .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb,
- .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb,
- .mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb {
+ .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb {
border: 3px solid rgba(0,0,0, 0.26);
background: transparent;
-webkit-transform: scale(0.667);
transform: scale(0.667); }
- .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb,
- .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb,
- .mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb {
+ .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb {
border: 3px solid rgba(0,0,0, 0.26);
background: transparent;
transform: scale(0.667); }
- .mdl-slider.is-upgraded.is-lowest-value:disabled:active ~
+ .mdl-slider.is-upgraded.is-lowest-value:disabled:active +
.mdl-slider__background-flex > .mdl-slider__background-upper {
left: 6px; }
- .mdl-slider.is-upgraded:disabled:focus::-ms-thumb,
- .mdl-slider.is-upgraded:disabled:active::-ms-thumb,
- .mdl-slider.is-upgraded:disabled::-ms-thumb {
- -ms-transform: scale(0.25);
- transform: scale(0.25);
+ .mdl-slider.is-upgraded:disabled:focus::-ms-thumb, .mdl-slider.is-upgraded:disabled:active::-ms-thumb, .mdl-slider.is-upgraded:disabled::-ms-thumb {
+ transform: scale(0.25);
background: rgba(0,0,0, 0.26); }
- .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb,
- .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb,
- .mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb {
- -ms-transform: scale(0.25);
- transform: scale(0.25);
+ .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb {
+ transform: scale(0.25);
background: radial-gradient(circle closest-side, transparent 0%, transparent 50%, rgba(0,0,0, 0.26) 50%, rgba(0,0,0, 0.26) 100%); }
.mdl-slider.is-upgraded:disabled::-ms-fill-lower {
margin-right: 6px;
@@ -7476,12 +8542,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
height: 18px;
position: relative;
background: none;
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row; }
@@ -7494,7 +8557,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
top: 50%;
left: 0;
margin: 0 26px;
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
@@ -7502,12 +8564,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
border: 0;
padding: 0;
-webkit-transform: translate(0, -1px);
- -ms-transform: translate(0, -1px);
transform: translate(0, -1px); }
.mdl-slider__background-lower {
background: rgb(63,81,181);
- -webkit-box-flex: 0;
-webkit-flex: 0;
-ms-flex: 0;
flex: 0;
@@ -7517,15 +8577,281 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
.mdl-slider__background-upper {
background: rgba(0,0,0, 0.26);
- -webkit-box-flex: 0;
-webkit-flex: 0;
-ms-flex: 0;
flex: 0;
position: relative;
border: 0;
padding: 0;
- -webkit-transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1);
- transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1); }
+ transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1); }
+
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*------------------------------------* $CONTENTS
+\*------------------------------------*/
+/**
+ * STYLE GUIDE VARIABLES------------------Declarations of Sass variables
+ * -----Typography
+ * -----Colors
+ * -----Textfield
+ * -----Switch
+ * -----Spinner
+ * -----Radio
+ * -----Menu
+ * -----List
+ * -----Layout
+ * -----Icon toggles
+ * -----Footer
+ * -----Column
+ * -----Checkbox
+ * -----Card
+ * -----Button
+ * -----Animation
+ * -----Progress
+ * -----Badge
+ * -----Shadows
+ * -----Grid
+ * -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
+ */
+/* ========== TYPOGRAPHY ========== */
+/* We're splitting fonts into "preferred" and "performance" in order to optimize
+ page loading. For important text, such as the body, we want it to load
+ immediately and not wait for the web font load, whereas for other sections,
+ such as headers and titles, we're OK with things taking a bit longer to load.
+ We do have some optional classes and parameters in the mixins, in case you
+ definitely want to make sure you're using the preferred font and don't mind
+ the performance hit.
+ We should be able to improve on this once CSS Font Loading L3 becomes more
+ widely available.
+*/
+/* ========== COLORS ========== */
+/**
+*
+* Material design color palettes.
+* @see http://www.google.com/design/spec/style/color.html
+*
+**/
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* ========== Color Palettes ========== */
+/* colors.scss */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* ========== IMAGES ========== */
+/* ========== Color & Themes ========== */
+/* ========== Typography ========== */
+/* ========== Components ========== */
+/* ========== Standard Buttons ========== */
+/* ========== Icon Toggles ========== */
+/* ========== Radio Buttons ========== */
+/* ========== Ripple effect ========== */
+/* ========== Layout ========== */
+/* ========== Content Tabs ========== */
+/* ========== Checkboxes ========== */
+/* ========== Switches ========== */
+/* ========== Spinner ========== */
+/* ========== Text fields ========== */
+/* ========== Card ========== */
+/* ========== Sliders ========== */
+/* ========== Progress ========== */
+/* ========== List ========== */
+/* ========== Item ========== */
+/* ========== Dropdown menu ========== */
+/* ========== Tooltips ========== */
+/* ========== Footer ========== */
+/* TEXTFIELD */
+/* SWITCH */
+/* SPINNER */
+/* RADIO */
+/* MENU */
+/* LIST */
+/* LAYOUT */
+/* ICON TOGGLE */
+/* FOOTER */
+/*mega-footer*/
+/*mini-footer*/
+/* CHECKBOX */
+/* CARD */
+/* Card dimensions */
+/* Cover image */
+/* BUTTON */
+/**
+ *
+ * Dimensions
+ *
+ */
+/* ANIMATION */
+/* PROGRESS */
+/* BADGE */
+/* SHADOWS */
+/* GRID */
+/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
+/* TOOLTIP */
+/* CHIP */
+/**
+ * Copyright 2015 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* Typography */
+/* Shadows */
+/* Animations */
+/* Dialog */
+.mdl-snackbar {
+ position: fixed;
+ bottom: 0;
+ left: 50%;
+ cursor: default;
+ background-color: #323232;
+ z-index: 3;
+ display: block;
+ display: -webkit-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-justify-content: space-between;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
+ font-family: "Roboto", "Helvetica", "Arial", sans-serif;
+ will-change: transform;
+ -webkit-transform: translate(0, 80px);
+ transform: translate(0, 80px);
+ transition: -webkit-transform 0.25s cubic-bezier(0.4, 0, 1, 1);
+ transition: transform 0.25s cubic-bezier(0.4, 0, 1, 1);
+ transition: transform 0.25s cubic-bezier(0.4, 0, 1, 1), -webkit-transform 0.25s cubic-bezier(0.4, 0, 1, 1);
+ pointer-events: none; }
+ @media (max-width: 479px) {
+ .mdl-snackbar {
+ width: 100%;
+ left: 0;
+ min-height: 48px;
+ max-height: 80px; } }
+ @media (min-width: 480px) {
+ .mdl-snackbar {
+ min-width: 288px;
+ max-width: 568px;
+ border-radius: 2px;
+ -webkit-transform: translate(-50%, 80px);
+ transform: translate(-50%, 80px); } }
+ .mdl-snackbar--active {
+ -webkit-transform: translate(0, 0);
+ transform: translate(0, 0);
+ pointer-events: auto;
+ transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.2, 1);
+ transition: transform 0.25s cubic-bezier(0, 0, 0.2, 1);
+ transition: transform 0.25s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.25s cubic-bezier(0, 0, 0.2, 1); }
+ @media (min-width: 480px) {
+ .mdl-snackbar--active {
+ -webkit-transform: translate(-50%, 0);
+ transform: translate(-50%, 0); } }
+ .mdl-snackbar__text {
+ padding: 14px 12px 14px 24px;
+ vertical-align: middle;
+ color: white;
+ float: left; }
+ .mdl-snackbar__action {
+ background: transparent;
+ border: none;
+ color: rgb(255,64,129);
+ float: right;
+ text-transform: uppercase;
+ padding: 14px 24px 14px 12px;
+ font-family: "Roboto", "Helvetica", "Arial", sans-serif;
+ font-size: 14px;
+ font-weight: 500;
+ text-transform: uppercase;
+ line-height: 1;
+ letter-spacing: 0;
+ overflow: hidden;
+ outline: none;
+ opacity: 0;
+ pointer-events: none;
+ cursor: pointer;
+ text-decoration: none;
+ text-align: center;
+ -webkit-align-self: center;
+ -ms-flex-item-align: center;
+ -ms-grid-row-align: center;
+ align-self: center; }
+ .mdl-snackbar__action::-moz-focus-inner {
+ border: 0; }
+ .mdl-snackbar__action:not([aria-hidden]) {
+ opacity: 1;
+ pointer-events: auto; }
/**
* Copyright 2015 Google Inc. All Rights Reserved.
@@ -7582,6 +8908,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -7633,6 +8968,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -7681,7 +9017,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-spinner {
display: inline-block;
position: relative;
@@ -7929,6 +9268,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
height: 100%;
overflow: hidden;
border-color: inherit; }
+ .mdl-spinner__circle-clipper.mdl-spinner__left {
+ float: left; }
+ .mdl-spinner__circle-clipper.mdl-spinner__right {
+ float: right; }
.mdl-spinner__circle-clipper .mdl-spinner__circle {
width: 200%; }
@@ -7950,7 +9293,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
.mdl-spinner__left .mdl-spinner__circle {
border-right-color: transparent !important;
-webkit-transform: rotate(129deg);
- -ms-transform: rotate(129deg);
transform: rotate(129deg); }
.mdl-spinner.is-active .mdl-spinner__left .mdl-spinner__circle {
-webkit-animation: mdl-spinner__left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
@@ -7959,7 +9301,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
left: -100%;
border-left-color: transparent !important;
-webkit-transform: rotate(-129deg);
- -ms-transform: rotate(-129deg);
transform: rotate(-129deg); }
.mdl-spinner.is-active .mdl-spinner__right .mdl-spinner__circle {
-webkit-animation: mdl-spinner__right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;
@@ -8064,6 +9405,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -8115,6 +9465,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -8163,7 +9514,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -8182,6 +9536,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-switch {
position: relative;
z-index: 1;
@@ -8227,6 +9582,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
cursor: pointer; }
.mdl-switch.is-checked .mdl-switch__track {
background: rgba(63,81,181, 0.5); }
+ .mdl-switch__track fieldset[disabled] .mdl-switch,
.mdl-switch.is-disabled .mdl-switch__track {
background: rgba(0,0,0, 0.12);
cursor: auto; }
@@ -8241,16 +9597,14 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
border-radius: 50%;
cursor: pointer;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
- -webkit-transition-duration: 0.28s;
- transition-duration: 0.28s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- -webkit-transition-property: left;
- transition-property: left; }
+ transition-duration: 0.28s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-property: left; }
.mdl-switch.is-checked .mdl-switch__thumb {
background: rgb(63,81,181);
left: 16px;
box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); }
+ .mdl-switch__thumb fieldset[disabled] .mdl-switch,
.mdl-switch.is-disabled .mdl-switch__thumb {
background: rgb(189,189,189);
cursor: auto; }
@@ -8260,7 +9614,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
top: 50%;
left: 50%;
-webkit-transform: translate(-4px, -4px);
- -ms-transform: translate(-4px, -4px);
transform: translate(-4px, -4px);
display: inline-block;
box-sizing: border-box;
@@ -8282,6 +9635,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
line-height: 24px;
margin: 0;
left: 24px; }
+ .mdl-switch__label fieldset[disabled] .mdl-switch,
.mdl-switch.is-disabled .mdl-switch__label {
color: rgb(189,189,189);
cursor: auto; }
@@ -8298,20 +9652,18 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
cursor: pointer;
overflow: hidden;
-webkit-mask-image: -webkit-radial-gradient(circle, white, black);
- -webkit-transition-duration: 0.40s;
- transition-duration: 0.40s;
- -webkit-transition-timing-function: step-end;
- transition-timing-function: step-end;
- -webkit-transition-property: left;
- transition-property: left; }
+ transition-duration: 0.40s;
+ transition-timing-function: step-end;
+ transition-property: left; }
.mdl-switch__ripple-container .mdl-ripple {
background: rgb(63,81,181); }
+ .mdl-switch__ripple-container fieldset[disabled] .mdl-switch,
.mdl-switch.is-disabled .mdl-switch__ripple-container {
cursor: auto; }
+ fieldset[disabled] .mdl-switch .mdl-switch__ripple-container .mdl-ripple,
.mdl-switch.is-disabled .mdl-switch__ripple-container .mdl-ripple {
background: transparent; }
.mdl-switch.is-checked .mdl-switch__ripple-container {
- cursor: auto;
left: 2px; }
/**
@@ -8369,6 +9721,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -8420,6 +9781,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -8468,29 +9830,27 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-tabs {
display: block;
width: 100%; }
.mdl-tabs__tab-bar {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
-webkit-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
- -webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-align-content: space-between;
-ms-flex-line-pack: justify;
align-content: space-between;
- -webkit-box-align: start;
-webkit-align-items: flex-start;
-ms-flex-align: start;
align-items: flex-start;
@@ -8506,7 +9866,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
float: left;
position: relative;
display: block;
- color: red;
text-decoration: none;
height: 48px;
line-height: 48px;
@@ -8529,8 +9888,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
background: rgb(63,81,181);
-webkit-animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards;
animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards;
- -webkit-transition: all 1s cubic-bezier(0.4, 0, 1, 1);
- transition: all 1s cubic-bezier(0.4, 0, 1, 1); }
+ transition: all 1s cubic-bezier(0.4, 0, 1, 1); }
.mdl-tabs__tab .mdl-tabs__ripple-container {
display: block;
position: absolute;
@@ -8621,6 +9979,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -8672,6 +10039,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -8720,7 +10088,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -8739,6 +10110,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-textfield {
position: relative;
font-size: 16px;
@@ -8762,22 +10134,32 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
min-width: 32px;
width: auto;
min-height: 32px; }
+ .mdl-textfield--expandable .mdl-button--icon {
+ top: 16px; }
.mdl-textfield__input {
border: none;
border-bottom: 1px solid rgba(0,0,0, 0.12);
display: block;
font-size: 16px;
+ font-family: "Helvetica", "Arial", sans-serif;
margin: 0;
padding: 4px 0;
width: 100%;
+ background: none;
text-align: left;
color: inherit; }
+ .mdl-textfield__input[type="number"] {
+ -moz-appearance: textfield; }
+ .mdl-textfield__input[type="number"]::-webkit-inner-spin-button, .mdl-textfield__input[type="number"]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0; }
.mdl-textfield.is-focused .mdl-textfield__input {
outline: none; }
.mdl-textfield.is-invalid .mdl-textfield__input {
- border-color: rgb(222, 50, 38);
+ border-color: rgb(213,0,0);
box-shadow: none; }
+ fieldset[disabled] .mdl-textfield .mdl-textfield__input,
.mdl-textfield.is-disabled .mdl-textfield__input {
background-color: transparent;
border-bottom: 1px dotted rgba(0,0,0, 0.12);
@@ -8800,26 +10182,30 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
overflow: hidden;
white-space: nowrap;
text-align: left; }
- .mdl-textfield.is-dirty .mdl-textfield__label {
+ .mdl-textfield.is-dirty .mdl-textfield__label,
+ .mdl-textfield.has-placeholder .mdl-textfield__label {
visibility: hidden; }
.mdl-textfield--floating-label .mdl-textfield__label {
- -webkit-transition-duration: 0.2s;
- transition-duration: 0.2s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+ transition-duration: 0.2s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+ .mdl-textfield--floating-label.has-placeholder .mdl-textfield__label {
+ transition: none; }
+ fieldset[disabled] .mdl-textfield .mdl-textfield__label,
.mdl-textfield.is-disabled.is-disabled .mdl-textfield__label {
color: rgba(0,0,0, 0.26); }
.mdl-textfield--floating-label.is-focused .mdl-textfield__label,
- .mdl-textfield--floating-label.is-dirty .mdl-textfield__label {
+ .mdl-textfield--floating-label.is-dirty .mdl-textfield__label,
+ .mdl-textfield--floating-label.has-placeholder .mdl-textfield__label {
color: rgb(63,81,181);
font-size: 12px;
top: 4px;
visibility: visible; }
.mdl-textfield--floating-label.is-focused .mdl-textfield__expandable-holder .mdl-textfield__label,
- .mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label {
+ .mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label,
+ .mdl-textfield--floating-label.has-placeholder .mdl-textfield__expandable-holder .mdl-textfield__label {
top: -16px; }
.mdl-textfield--floating-label.is-invalid .mdl-textfield__label {
- color: rgb(222, 50, 38);
+ color: rgb(213,0,0);
font-size: 12px; }
.mdl-textfield__label:after {
background-color: rgb(63,81,181);
@@ -8828,10 +10214,8 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
height: 2px;
left: 45%;
position: absolute;
- -webkit-transition-duration: 0.2s;
- transition-duration: 0.2s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 0.2s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
visibility: hidden;
width: 10px; }
.mdl-textfield.is-focused .mdl-textfield__label:after {
@@ -8839,10 +10223,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
visibility: visible;
width: 100%; }
.mdl-textfield.is-invalid .mdl-textfield__label:after {
- background-color: rgb(222, 50, 38); }
+ background-color: rgb(213,0,0); }
.mdl-textfield__error {
- color: rgb(222, 50, 38);
+ color: rgb(213,0,0);
position: absolute;
font-size: 12px;
margin-top: 3px;
@@ -8855,10 +10239,8 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
display: inline-block;
position: relative;
margin-left: 32px;
- -webkit-transition-duration: 0.2s;
- transition-duration: 0.2s;
- -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 0.2s;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
display: inline-block;
max-width: 0.1px; }
.mdl-textfield.is-focused .mdl-textfield__expandable-holder, .mdl-textfield.is-dirty .mdl-textfield__expandable-holder {
@@ -8921,6 +10303,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -8972,6 +10363,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -9020,15 +10412,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-tooltip {
-webkit-transform: scale(0);
- -ms-transform: scale(0);
transform: scale(0);
-webkit-transform-origin: top center;
- -ms-transform-origin: top center;
transform-origin: top center;
- will-change: transform;
z-index: 999;
background: rgba(97,97,97, 0.9);
border-radius: 2px;
@@ -9136,6 +10528,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -9187,6 +10588,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -9235,7 +10637,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -9254,6 +10659,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* Typography */
/* Shadows */
/* Animations */
+/* Dialog */
.mdl-shadow--2dp {
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); }
@@ -9272,6 +10678,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
.mdl-shadow--16dp {
box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); }
+.mdl-shadow--24dp {
+ box-shadow: 0 9px 46px 8px rgba(0, 0, 0, 0.14), 0 11px 15px -7px rgba(0, 0, 0, 0.12), 0 24px 38px 3px rgba(0, 0, 0, 0.2); }
+
/**
* Copyright 2015 Google Inc. All Rights Reserved.
*
@@ -9332,6 +10741,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* -----Shadows
* -----Grid
* -----Data table
+ * -----Dialog
+ * -----Snackbar
+ * -----Tooltip
+ * -----Chip
+ *
+ * Even though all variables have the `!default` directive, most of them
+ * should not be changed as they are dependent one another. This can cause
+ * visual distortions (like alignment issues) that are hard to track down
+ * and fix.
*/
/* ========== TYPOGRAPHY ========== */
/* We're splitting fonts into "preferred" and "performance" in order to optimize
@@ -9383,6 +10801,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+/* ========== IMAGES ========== */
/* ========== Color & Themes ========== */
/* ========== Typography ========== */
/* ========== Components ========== */
@@ -9431,9 +10850,11 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
/* SHADOWS */
/* GRID */
/* DATA TABLE */
+/* DIALOG */
+/* SNACKBAR */
/* TOOLTIP */
+/* CHIP */
.mdl-grid {
- display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
@@ -9441,7 +10862,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
-ms-flex-flow: row wrap;
flex-flow: row wrap;
margin: 0 auto 0 auto;
- -webkit-box-align: stretch;
-webkit-align-items: stretch;
-ms-flex-align: stretch;
align-items: stretch; }
@@ -9459,6 +10879,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
.mdl-cell--middle {
-webkit-align-self: center;
-ms-flex-item-align: center;
+ -ms-grid-row-align: center;
align-self: center; }
.mdl-cell--bottom {
@@ -9469,11 +10890,72 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
.mdl-cell--stretch {
-webkit-align-self: stretch;
-ms-flex-item-align: stretch;
+ -ms-grid-row-align: stretch;
align-self: stretch; }
.mdl-grid.mdl-grid--no-spacing > .mdl-cell {
margin: 0; }
+.mdl-cell--order-1 {
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1; }
+
+.mdl-cell--order-2 {
+ -webkit-order: 2;
+ -ms-flex-order: 2;
+ order: 2; }
+
+.mdl-cell--order-3 {
+ -webkit-order: 3;
+ -ms-flex-order: 3;
+ order: 3; }
+
+.mdl-cell--order-4 {
+ -webkit-order: 4;
+ -ms-flex-order: 4;
+ order: 4; }
+
+.mdl-cell--order-5 {
+ -webkit-order: 5;
+ -ms-flex-order: 5;
+ order: 5; }
+
+.mdl-cell--order-6 {
+ -webkit-order: 6;
+ -ms-flex-order: 6;
+ order: 6; }
+
+.mdl-cell--order-7 {
+ -webkit-order: 7;
+ -ms-flex-order: 7;
+ order: 7; }
+
+.mdl-cell--order-8 {
+ -webkit-order: 8;
+ -ms-flex-order: 8;
+ order: 8; }
+
+.mdl-cell--order-9 {
+ -webkit-order: 9;
+ -ms-flex-order: 9;
+ order: 9; }
+
+.mdl-cell--order-10 {
+ -webkit-order: 10;
+ -ms-flex-order: 10;
+ order: 10; }
+
+.mdl-cell--order-11 {
+ -webkit-order: 11;
+ -ms-flex-order: 11;
+ order: 11; }
+
+.mdl-cell--order-12 {
+ -webkit-order: 12;
+ -ms-flex-order: 12;
+ order: 12; }
+
@media (max-width: 479px) {
.mdl-grid {
padding: 8px; }
@@ -9484,78 +10966,144 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
width: 100%; }
.mdl-cell--hide-phone {
display: none !important; }
+ .mdl-cell--order-1-phone.mdl-cell--order-1-phone {
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1; }
+ .mdl-cell--order-2-phone.mdl-cell--order-2-phone {
+ -webkit-order: 2;
+ -ms-flex-order: 2;
+ order: 2; }
+ .mdl-cell--order-3-phone.mdl-cell--order-3-phone {
+ -webkit-order: 3;
+ -ms-flex-order: 3;
+ order: 3; }
+ .mdl-cell--order-4-phone.mdl-cell--order-4-phone {
+ -webkit-order: 4;
+ -ms-flex-order: 4;
+ order: 4; }
+ .mdl-cell--order-5-phone.mdl-cell--order-5-phone {
+ -webkit-order: 5;
+ -ms-flex-order: 5;
+ order: 5; }
+ .mdl-cell--order-6-phone.mdl-cell--order-6-phone {
+ -webkit-order: 6;
+ -ms-flex-order: 6;
+ order: 6; }
+ .mdl-cell--order-7-phone.mdl-cell--order-7-phone {
+ -webkit-order: 7;
+ -ms-flex-order: 7;
+ order: 7; }
+ .mdl-cell--order-8-phone.mdl-cell--order-8-phone {
+ -webkit-order: 8;
+ -ms-flex-order: 8;
+ order: 8; }
+ .mdl-cell--order-9-phone.mdl-cell--order-9-phone {
+ -webkit-order: 9;
+ -ms-flex-order: 9;
+ order: 9; }
+ .mdl-cell--order-10-phone.mdl-cell--order-10-phone {
+ -webkit-order: 10;
+ -ms-flex-order: 10;
+ order: 10; }
+ .mdl-cell--order-11-phone.mdl-cell--order-11-phone {
+ -webkit-order: 11;
+ -ms-flex-order: 11;
+ order: 11; }
+ .mdl-cell--order-12-phone.mdl-cell--order-12-phone {
+ -webkit-order: 12;
+ -ms-flex-order: 12;
+ order: 12; }
.mdl-cell--1-col,
.mdl-cell--1-col-phone.mdl-cell--1-col-phone {
width: calc(25% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--1-col,
- .mdl-grid--no-spacing > .mdl-cell--1-col-phone.mdl-cell--1-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing >
+ .mdl-cell--1-col-phone.mdl-cell--1-col-phone {
width: 25%; }
.mdl-cell--2-col,
.mdl-cell--2-col-phone.mdl-cell--2-col-phone {
width: calc(50% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--2-col,
- .mdl-grid--no-spacing > .mdl-cell--2-col-phone.mdl-cell--2-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing >
+ .mdl-cell--2-col-phone.mdl-cell--2-col-phone {
width: 50%; }
.mdl-cell--3-col,
.mdl-cell--3-col-phone.mdl-cell--3-col-phone {
width: calc(75% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--3-col,
- .mdl-grid--no-spacing > .mdl-cell--3-col-phone.mdl-cell--3-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing >
+ .mdl-cell--3-col-phone.mdl-cell--3-col-phone {
width: 75%; }
.mdl-cell--4-col,
.mdl-cell--4-col-phone.mdl-cell--4-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--4-col,
- .mdl-grid--no-spacing > .mdl-cell--4-col-phone.mdl-cell--4-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing >
+ .mdl-cell--4-col-phone.mdl-cell--4-col-phone {
width: 100%; }
.mdl-cell--5-col,
.mdl-cell--5-col-phone.mdl-cell--5-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--5-col,
- .mdl-grid--no-spacing > .mdl-cell--5-col-phone.mdl-cell--5-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing >
+ .mdl-cell--5-col-phone.mdl-cell--5-col-phone {
width: 100%; }
.mdl-cell--6-col,
.mdl-cell--6-col-phone.mdl-cell--6-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--6-col,
- .mdl-grid--no-spacing > .mdl-cell--6-col-phone.mdl-cell--6-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing >
+ .mdl-cell--6-col-phone.mdl-cell--6-col-phone {
width: 100%; }
.mdl-cell--7-col,
.mdl-cell--7-col-phone.mdl-cell--7-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--7-col,
- .mdl-grid--no-spacing > .mdl-cell--7-col-phone.mdl-cell--7-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing >
+ .mdl-cell--7-col-phone.mdl-cell--7-col-phone {
width: 100%; }
.mdl-cell--8-col,
.mdl-cell--8-col-phone.mdl-cell--8-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--8-col,
- .mdl-grid--no-spacing > .mdl-cell--8-col-phone.mdl-cell--8-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing >
+ .mdl-cell--8-col-phone.mdl-cell--8-col-phone {
width: 100%; }
.mdl-cell--9-col,
.mdl-cell--9-col-phone.mdl-cell--9-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--9-col,
- .mdl-grid--no-spacing > .mdl-cell--9-col-phone.mdl-cell--9-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing >
+ .mdl-cell--9-col-phone.mdl-cell--9-col-phone {
width: 100%; }
.mdl-cell--10-col,
.mdl-cell--10-col-phone.mdl-cell--10-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--10-col,
- .mdl-grid--no-spacing > .mdl-cell--10-col-phone.mdl-cell--10-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing >
+ .mdl-cell--10-col-phone.mdl-cell--10-col-phone {
width: 100%; }
.mdl-cell--11-col,
.mdl-cell--11-col-phone.mdl-cell--11-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--11-col,
- .mdl-grid--no-spacing > .mdl-cell--11-col-phone.mdl-cell--11-col-phone {
+ .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing >
+ .mdl-cell--11-col-phone.mdl-cell--11-col-phone {
width: 100%; }
.mdl-cell--12-col,
.mdl-cell--12-col-phone.mdl-cell--12-col-phone {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--12-col,
- .mdl-grid--no-spacing > .mdl-cell--12-col-phone.mdl-cell--12-col-phone {
- width: 100%; } }
+ .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing >
+ .mdl-cell--12-col-phone.mdl-cell--12-col-phone {
+ width: 100%; }
+ .mdl-cell--1-offset,
+ .mdl-cell--1-offset-phone.mdl-cell--1-offset-phone {
+ margin-left: calc(25% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--1-offset-phone.mdl-cell--1-offset-phone {
+ margin-left: 25%; }
+ .mdl-cell--2-offset,
+ .mdl-cell--2-offset-phone.mdl-cell--2-offset-phone {
+ margin-left: calc(50% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--2-offset-phone.mdl-cell--2-offset-phone {
+ margin-left: 50%; }
+ .mdl-cell--3-offset,
+ .mdl-cell--3-offset-phone.mdl-cell--3-offset-phone {
+ margin-left: calc(75% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--3-offset-phone.mdl-cell--3-offset-phone {
+ margin-left: 75%; } }
@media (min-width: 480px) and (max-width: 839px) {
.mdl-grid {
@@ -9567,78 +11115,168 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
width: 50%; }
.mdl-cell--hide-tablet {
display: none !important; }
+ .mdl-cell--order-1-tablet.mdl-cell--order-1-tablet {
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1; }
+ .mdl-cell--order-2-tablet.mdl-cell--order-2-tablet {
+ -webkit-order: 2;
+ -ms-flex-order: 2;
+ order: 2; }
+ .mdl-cell--order-3-tablet.mdl-cell--order-3-tablet {
+ -webkit-order: 3;
+ -ms-flex-order: 3;
+ order: 3; }
+ .mdl-cell--order-4-tablet.mdl-cell--order-4-tablet {
+ -webkit-order: 4;
+ -ms-flex-order: 4;
+ order: 4; }
+ .mdl-cell--order-5-tablet.mdl-cell--order-5-tablet {
+ -webkit-order: 5;
+ -ms-flex-order: 5;
+ order: 5; }
+ .mdl-cell--order-6-tablet.mdl-cell--order-6-tablet {
+ -webkit-order: 6;
+ -ms-flex-order: 6;
+ order: 6; }
+ .mdl-cell--order-7-tablet.mdl-cell--order-7-tablet {
+ -webkit-order: 7;
+ -ms-flex-order: 7;
+ order: 7; }
+ .mdl-cell--order-8-tablet.mdl-cell--order-8-tablet {
+ -webkit-order: 8;
+ -ms-flex-order: 8;
+ order: 8; }
+ .mdl-cell--order-9-tablet.mdl-cell--order-9-tablet {
+ -webkit-order: 9;
+ -ms-flex-order: 9;
+ order: 9; }
+ .mdl-cell--order-10-tablet.mdl-cell--order-10-tablet {
+ -webkit-order: 10;
+ -ms-flex-order: 10;
+ order: 10; }
+ .mdl-cell--order-11-tablet.mdl-cell--order-11-tablet {
+ -webkit-order: 11;
+ -ms-flex-order: 11;
+ order: 11; }
+ .mdl-cell--order-12-tablet.mdl-cell--order-12-tablet {
+ -webkit-order: 12;
+ -ms-flex-order: 12;
+ order: 12; }
.mdl-cell--1-col,
.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet {
width: calc(12.5% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--1-col,
- .mdl-grid--no-spacing > .mdl-cell--1-col-tablet.mdl-cell--1-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing >
+ .mdl-cell--1-col-tablet.mdl-cell--1-col-tablet {
width: 12.5%; }
.mdl-cell--2-col,
.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet {
width: calc(25% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--2-col,
- .mdl-grid--no-spacing > .mdl-cell--2-col-tablet.mdl-cell--2-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing >
+ .mdl-cell--2-col-tablet.mdl-cell--2-col-tablet {
width: 25%; }
.mdl-cell--3-col,
.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet {
width: calc(37.5% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--3-col,
- .mdl-grid--no-spacing > .mdl-cell--3-col-tablet.mdl-cell--3-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing >
+ .mdl-cell--3-col-tablet.mdl-cell--3-col-tablet {
width: 37.5%; }
.mdl-cell--4-col,
.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet {
width: calc(50% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--4-col,
- .mdl-grid--no-spacing > .mdl-cell--4-col-tablet.mdl-cell--4-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing >
+ .mdl-cell--4-col-tablet.mdl-cell--4-col-tablet {
width: 50%; }
.mdl-cell--5-col,
.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet {
width: calc(62.5% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--5-col,
- .mdl-grid--no-spacing > .mdl-cell--5-col-tablet.mdl-cell--5-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing >
+ .mdl-cell--5-col-tablet.mdl-cell--5-col-tablet {
width: 62.5%; }
.mdl-cell--6-col,
.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet {
width: calc(75% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--6-col,
- .mdl-grid--no-spacing > .mdl-cell--6-col-tablet.mdl-cell--6-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing >
+ .mdl-cell--6-col-tablet.mdl-cell--6-col-tablet {
width: 75%; }
.mdl-cell--7-col,
.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet {
width: calc(87.5% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--7-col,
- .mdl-grid--no-spacing > .mdl-cell--7-col-tablet.mdl-cell--7-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing >
+ .mdl-cell--7-col-tablet.mdl-cell--7-col-tablet {
width: 87.5%; }
.mdl-cell--8-col,
.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--8-col,
- .mdl-grid--no-spacing > .mdl-cell--8-col-tablet.mdl-cell--8-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing >
+ .mdl-cell--8-col-tablet.mdl-cell--8-col-tablet {
width: 100%; }
.mdl-cell--9-col,
.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--9-col,
- .mdl-grid--no-spacing > .mdl-cell--9-col-tablet.mdl-cell--9-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing >
+ .mdl-cell--9-col-tablet.mdl-cell--9-col-tablet {
width: 100%; }
.mdl-cell--10-col,
.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--10-col,
- .mdl-grid--no-spacing > .mdl-cell--10-col-tablet.mdl-cell--10-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing >
+ .mdl-cell--10-col-tablet.mdl-cell--10-col-tablet {
width: 100%; }
.mdl-cell--11-col,
.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--11-col,
- .mdl-grid--no-spacing > .mdl-cell--11-col-tablet.mdl-cell--11-col-tablet {
+ .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing >
+ .mdl-cell--11-col-tablet.mdl-cell--11-col-tablet {
width: 100%; }
.mdl-cell--12-col,
.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--12-col,
- .mdl-grid--no-spacing > .mdl-cell--12-col-tablet.mdl-cell--12-col-tablet {
- width: 100%; } }
+ .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing >
+ .mdl-cell--12-col-tablet.mdl-cell--12-col-tablet {
+ width: 100%; }
+ .mdl-cell--1-offset,
+ .mdl-cell--1-offset-tablet.mdl-cell--1-offset-tablet {
+ margin-left: calc(12.5% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--1-offset-tablet.mdl-cell--1-offset-tablet {
+ margin-left: 12.5%; }
+ .mdl-cell--2-offset,
+ .mdl-cell--2-offset-tablet.mdl-cell--2-offset-tablet {
+ margin-left: calc(25% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--2-offset-tablet.mdl-cell--2-offset-tablet {
+ margin-left: 25%; }
+ .mdl-cell--3-offset,
+ .mdl-cell--3-offset-tablet.mdl-cell--3-offset-tablet {
+ margin-left: calc(37.5% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--3-offset-tablet.mdl-cell--3-offset-tablet {
+ margin-left: 37.5%; }
+ .mdl-cell--4-offset,
+ .mdl-cell--4-offset-tablet.mdl-cell--4-offset-tablet {
+ margin-left: calc(50% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--4-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--4-offset-tablet.mdl-cell--4-offset-tablet {
+ margin-left: 50%; }
+ .mdl-cell--5-offset,
+ .mdl-cell--5-offset-tablet.mdl-cell--5-offset-tablet {
+ margin-left: calc(62.5% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--5-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--5-offset-tablet.mdl-cell--5-offset-tablet {
+ margin-left: 62.5%; }
+ .mdl-cell--6-offset,
+ .mdl-cell--6-offset-tablet.mdl-cell--6-offset-tablet {
+ margin-left: calc(75% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--6-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--6-offset-tablet.mdl-cell--6-offset-tablet {
+ margin-left: 75%; }
+ .mdl-cell--7-offset,
+ .mdl-cell--7-offset-tablet.mdl-cell--7-offset-tablet {
+ margin-left: calc(87.5% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--7-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--7-offset-tablet.mdl-cell--7-offset-tablet {
+ margin-left: 87.5%; } }
@media (min-width: 840px) {
.mdl-grid {
@@ -9650,75 +11288,189 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded {
width: 33.3333333333%; }
.mdl-cell--hide-desktop {
display: none !important; }
+ .mdl-cell--order-1-desktop.mdl-cell--order-1-desktop {
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1; }
+ .mdl-cell--order-2-desktop.mdl-cell--order-2-desktop {
+ -webkit-order: 2;
+ -ms-flex-order: 2;
+ order: 2; }
+ .mdl-cell--order-3-desktop.mdl-cell--order-3-desktop {
+ -webkit-order: 3;
+ -ms-flex-order: 3;
+ order: 3; }
+ .mdl-cell--order-4-desktop.mdl-cell--order-4-desktop {
+ -webkit-order: 4;
+ -ms-flex-order: 4;
+ order: 4; }
+ .mdl-cell--order-5-desktop.mdl-cell--order-5-desktop {
+ -webkit-order: 5;
+ -ms-flex-order: 5;
+ order: 5; }
+ .mdl-cell--order-6-desktop.mdl-cell--order-6-desktop {
+ -webkit-order: 6;
+ -ms-flex-order: 6;
+ order: 6; }
+ .mdl-cell--order-7-desktop.mdl-cell--order-7-desktop {
+ -webkit-order: 7;
+ -ms-flex-order: 7;
+ order: 7; }
+ .mdl-cell--order-8-desktop.mdl-cell--order-8-desktop {
+ -webkit-order: 8;
+ -ms-flex-order: 8;
+ order: 8; }
+ .mdl-cell--order-9-desktop.mdl-cell--order-9-desktop {
+ -webkit-order: 9;
+ -ms-flex-order: 9;
+ order: 9; }
+ .mdl-cell--order-10-desktop.mdl-cell--order-10-desktop {
+ -webkit-order: 10;
+ -ms-flex-order: 10;
+ order: 10; }
+ .mdl-cell--order-11-desktop.mdl-cell--order-11-desktop {
+ -webkit-order: 11;
+ -ms-flex-order: 11;
+ order: 11; }
+ .mdl-cell--order-12-desktop.mdl-cell--order-12-desktop {
+ -webkit-order: 12;
+ -ms-flex-order: 12;
+ order: 12; }
.mdl-cell--1-col,
.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop {
width: calc(8.3333333333% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--1-col,
- .mdl-grid--no-spacing > .mdl-cell--1-col-desktop.mdl-cell--1-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing >
+ .mdl-cell--1-col-desktop.mdl-cell--1-col-desktop {
width: 8.3333333333%; }
.mdl-cell--2-col,
.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop {
width: calc(16.6666666667% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--2-col,
- .mdl-grid--no-spacing > .mdl-cell--2-col-desktop.mdl-cell--2-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing >
+ .mdl-cell--2-col-desktop.mdl-cell--2-col-desktop {
width: 16.6666666667%; }
.mdl-cell--3-col,
.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop {
width: calc(25% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--3-col,
- .mdl-grid--no-spacing > .mdl-cell--3-col-desktop.mdl-cell--3-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing >
+ .mdl-cell--3-col-desktop.mdl-cell--3-col-desktop {
width: 25%; }
.mdl-cell--4-col,
.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop {
width: calc(33.3333333333% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--4-col,
- .mdl-grid--no-spacing > .mdl-cell--4-col-desktop.mdl-cell--4-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing >
+ .mdl-cell--4-col-desktop.mdl-cell--4-col-desktop {
width: 33.3333333333%; }
.mdl-cell--5-col,
.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop {
width: calc(41.6666666667% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--5-col,
- .mdl-grid--no-spacing > .mdl-cell--5-col-desktop.mdl-cell--5-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing >
+ .mdl-cell--5-col-desktop.mdl-cell--5-col-desktop {
width: 41.6666666667%; }
.mdl-cell--6-col,
.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop {
width: calc(50% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--6-col,
- .mdl-grid--no-spacing > .mdl-cell--6-col-desktop.mdl-cell--6-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing >
+ .mdl-cell--6-col-desktop.mdl-cell--6-col-desktop {
width: 50%; }
.mdl-cell--7-col,
.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop {
width: calc(58.3333333333% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--7-col,
- .mdl-grid--no-spacing > .mdl-cell--7-col-desktop.mdl-cell--7-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing >
+ .mdl-cell--7-col-desktop.mdl-cell--7-col-desktop {
width: 58.3333333333%; }
.mdl-cell--8-col,
.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop {
width: calc(66.6666666667% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--8-col,
- .mdl-grid--no-spacing > .mdl-cell--8-col-desktop.mdl-cell--8-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing >
+ .mdl-cell--8-col-desktop.mdl-cell--8-col-desktop {
width: 66.6666666667%; }
.mdl-cell--9-col,
.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop {
width: calc(75% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--9-col,
- .mdl-grid--no-spacing > .mdl-cell--9-col-desktop.mdl-cell--9-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing >
+ .mdl-cell--9-col-desktop.mdl-cell--9-col-desktop {
width: 75%; }
.mdl-cell--10-col,
.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop {
width: calc(83.3333333333% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--10-col,
- .mdl-grid--no-spacing > .mdl-cell--10-col-desktop.mdl-cell--10-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing >
+ .mdl-cell--10-col-desktop.mdl-cell--10-col-desktop {
width: 83.3333333333%; }
.mdl-cell--11-col,
.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop {
width: calc(91.6666666667% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--11-col,
- .mdl-grid--no-spacing > .mdl-cell--11-col-desktop.mdl-cell--11-col-desktop {
+ .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing >
+ .mdl-cell--11-col-desktop.mdl-cell--11-col-desktop {
width: 91.6666666667%; }
.mdl-cell--12-col,
.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop {
width: calc(100% - 16px); }
- .mdl-grid--no-spacing > .mdl-cell--12-col,
- .mdl-grid--no-spacing > .mdl-cell--12-col-desktop.mdl-cell--12-col-desktop {
- width: 100%; } }
+ .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing >
+ .mdl-cell--12-col-desktop.mdl-cell--12-col-desktop {
+ width: 100%; }
+ .mdl-cell--1-offset,
+ .mdl-cell--1-offset-desktop.mdl-cell--1-offset-desktop {
+ margin-left: calc(8.3333333333% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--1-offset-desktop.mdl-cell--1-offset-desktop {
+ margin-left: 8.3333333333%; }
+ .mdl-cell--2-offset,
+ .mdl-cell--2-offset-desktop.mdl-cell--2-offset-desktop {
+ margin-left: calc(16.6666666667% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--2-offset-desktop.mdl-cell--2-offset-desktop {
+ margin-left: 16.6666666667%; }
+ .mdl-cell--3-offset,
+ .mdl-cell--3-offset-desktop.mdl-cell--3-offset-desktop {
+ margin-left: calc(25% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--3-offset-desktop.mdl-cell--3-offset-desktop {
+ margin-left: 25%; }
+ .mdl-cell--4-offset,
+ .mdl-cell--4-offset-desktop.mdl-cell--4-offset-desktop {
+ margin-left: calc(33.3333333333% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--4-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--4-offset-desktop.mdl-cell--4-offset-desktop {
+ margin-left: 33.3333333333%; }
+ .mdl-cell--5-offset,
+ .mdl-cell--5-offset-desktop.mdl-cell--5-offset-desktop {
+ margin-left: calc(41.6666666667% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--5-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--5-offset-desktop.mdl-cell--5-offset-desktop {
+ margin-left: 41.6666666667%; }
+ .mdl-cell--6-offset,
+ .mdl-cell--6-offset-desktop.mdl-cell--6-offset-desktop {
+ margin-left: calc(50% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--6-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--6-offset-desktop.mdl-cell--6-offset-desktop {
+ margin-left: 50%; }
+ .mdl-cell--7-offset,
+ .mdl-cell--7-offset-desktop.mdl-cell--7-offset-desktop {
+ margin-left: calc(58.3333333333% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--7-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--7-offset-desktop.mdl-cell--7-offset-desktop {
+ margin-left: 58.3333333333%; }
+ .mdl-cell--8-offset,
+ .mdl-cell--8-offset-desktop.mdl-cell--8-offset-desktop {
+ margin-left: calc(66.6666666667% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--8-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--8-offset-desktop.mdl-cell--8-offset-desktop {
+ margin-left: 66.6666666667%; }
+ .mdl-cell--9-offset,
+ .mdl-cell--9-offset-desktop.mdl-cell--9-offset-desktop {
+ margin-left: calc(75% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--9-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--9-offset-desktop.mdl-cell--9-offset-desktop {
+ margin-left: 75%; }
+ .mdl-cell--10-offset,
+ .mdl-cell--10-offset-desktop.mdl-cell--10-offset-desktop {
+ margin-left: calc(83.3333333333% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--10-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--10-offset-desktop.mdl-cell--10-offset-desktop {
+ margin-left: 83.3333333333%; }
+ .mdl-cell--11-offset,
+ .mdl-cell--11-offset-desktop.mdl-cell--11-offset-desktop {
+ margin-left: calc(91.6666666667% + 8px); }
+ .mdl-grid.mdl-grid--no-spacing > .mdl-cell--11-offset, .mdl-grid.mdl-grid--no-spacing >
+ .mdl-cell--11-offset-desktop.mdl-cell--11-offset-desktop {
+ margin-left: 91.6666666667%; } }
diff --git a/public/vendor/mdl/mdl.min.css b/public/vendor/mdl/mdl.min.css
deleted file mode 100644
index 3815742333..0000000000
--- a/public/vendor/mdl/mdl.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";.mdl-button,.mdl-button .material-icons,.mdl-checkbox,audio,canvas,iframe,img,svg,video{vertical-align:middle}.visuallyhidden,hr{border:0;height:1px}.mdl-typography--display-4,.mdl-typography--display-4-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:112px;font-weight:300;line-height:1;letter-spacing:-.04em}.mdl-typography--display-3,.mdl-typography--display-4,.mdl-typography--display-4-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-card,.mdl-card__media,.mdl-card__title{box-sizing:border-box}.mdl-badge[data-badge]:after,.mdl-card,.mdl-layout,.mdl-layout__drawer,.mdl-layout__header{-webkit-box-direction:normal}::-moz-selection{background:#b3d4fc;text-shadow:none}::selection{background:#b3d4fc;text-shadow:none}hr{display:block;border-top:1px solid #ccc;margin:1em 0;padding:0}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}.browserupgrade{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.hidden{display:none!important}.visuallyhidden{clip:rect(0 0 0 0);margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}body,html{width:100%}.invisible{visibility:hidden}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before,:first-letter,:first-line{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.mdl-accordion,.mdl-button,.mdl-card,.mdl-checkbox,.mdl-dropdown-menu,.mdl-icon-toggle,.mdl-item,.mdl-radio,.mdl-slider,.mdl-switch,.mdl-tabs__tab,a{-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:rgba(255,255,255,0)}html{height:100%;-ms-touch-action:manipulation;touch-action:manipulation}body{min-height:100%;margin:0}main{display:block}[hidden]{display:none!important}.mdl-typography--display-4-color-contrast{opacity:.54}.mdl-typography--display-3,.mdl-typography--display-3-color-contrast{font-size:56px;font-weight:400;line-height:1.35;letter-spacing:-.02em}.mdl-typography--display-3-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.54}.mdl-typography--display-2,.mdl-typography--display-2-color-contrast{font-weight:400;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:45px;line-height:48px}.mdl-typography--display-2-color-contrast{opacity:.54}.mdl-typography--display-1{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:34px;font-weight:400;line-height:40px}.mdl-typography--display-1-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:34px;font-weight:400;line-height:40px;opacity:.54}.mdl-typography--headline,.mdl-typography--headline-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:24px;font-weight:400;line-height:32px;-moz-osx-font-smoothing:grayscale}.mdl-typography--headline-color-contrast{opacity:.87}.mdl-typography--title,.mdl-typography--title-color-contrast{font-size:20px;font-weight:500;line-height:1;letter-spacing:.02em}.mdl-typography--title{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-typography--title-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.87}.mdl-typography--subhead,.mdl-typography--subhead-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;line-height:24px;font-size:16px;font-weight:400;letter-spacing:.04em}.mdl-typography--subhead-color-contrast{opacity:.87}.mdl-typography--body-2{font-size:14px;font-weight:700;line-height:24px;letter-spacing:0}.mdl-typography--body-2-color-contrast{font-size:14px;font-weight:700;line-height:24px;letter-spacing:0;opacity:.87}.mdl-typography--body-1,.mdl-typography--body-1-color-contrast{line-height:24px;letter-spacing:0;font-size:14px;font-weight:400}.mdl-typography--body-1-color-contrast{opacity:.87}.mdl-typography--body-2-force-preferred-font{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;letter-spacing:0}.mdl-typography--body-2-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;letter-spacing:0;opacity:.87}.mdl-typography--body-1-force-preferred-font,.mdl-typography--body-1-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:24px;letter-spacing:0}.mdl-typography--body-1-force-preferred-font-color-contrast{opacity:.87}.mdl-typography--caption,.mdl-typography--caption-color-contrast,.mdl-typography--caption-force-preferred-font,.mdl-typography--caption-force-preferred-font-color-contrast{font-size:12px;font-weight:400;line-height:1;letter-spacing:0}.mdl-typography--caption-force-preferred-font{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-typography--caption-color-contrast{opacity:.54}.mdl-typography--caption-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.54}.mdl-typography--button,.mdl-typography--button-color-contrast,.mdl-typography--menu,.mdl-typography--menu-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;letter-spacing:0;font-weight:500;font-size:14px;line-height:1}.mdl-typography--menu-color-contrast{opacity:.87}.mdl-typography--button{text-transform:uppercase}.mdl-typography--button-color-contrast{text-transform:uppercase;opacity:.87}.mdl-typography--text-left{text-align:left}.mdl-typography--text-right{text-align:right}.mdl-typography--text-center{text-align:center}.mdl-typography--text-justify{text-align:justify}.mdl-typography--text-nowrap{white-space:nowrap}.mdl-typography--text-lowercase{text-transform:lowercase}.mdl-typography--text-uppercase{text-transform:uppercase}.mdl-typography--text-capitalize{text-transform:capitalize}.mdl-button,.mdl-layout__tab,.mdl-tabs__tab{text-decoration:none;text-transform:uppercase}.mdl-typography--font-thin{font-weight:200!important}.mdl-typography--font-light{font-weight:300!important}.mdl-typography--font-regular{font-weight:400!important}.mdl-typography--font-medium{font-weight:500!important}.mdl-typography--font-bold{font-weight:700!important}.mdl-typography--font-black{font-weight:900!important}.mdl-color-text--red{color:#f44336!important}.mdl-color--red{background-color:#f44336!important}.mdl-color-text--red-50{color:#ffebee!important}.mdl-color--red-50{background-color:#ffebee!important}.mdl-color-text--red-100{color:#ffcdd2!important}.mdl-color--red-100{background-color:#ffcdd2!important}.mdl-color-text--red-200{color:#ef9a9a!important}.mdl-color--red-200{background-color:#ef9a9a!important}.mdl-color-text--red-300{color:#e57373!important}.mdl-color--red-300{background-color:#e57373!important}.mdl-color-text--red-400{color:#ef5350!important}.mdl-color--red-400{background-color:#ef5350!important}.mdl-color-text--red-500{color:#f44336!important}.mdl-color--red-500{background-color:#f44336!important}.mdl-color-text--red-600{color:#e53935!important}.mdl-color--red-600{background-color:#e53935!important}.mdl-color-text--red-700{color:#d32f2f!important}.mdl-color--red-700{background-color:#d32f2f!important}.mdl-color-text--red-800{color:#c62828!important}.mdl-color--red-800{background-color:#c62828!important}.mdl-color-text--red-900{color:#b71c1c!important}.mdl-color--red-900{background-color:#b71c1c!important}.mdl-color-text--red-A100{color:#ff8a80!important}.mdl-color--red-A100{background-color:#ff8a80!important}.mdl-color-text--red-A200{color:#ff5252!important}.mdl-color--red-A200{background-color:#ff5252!important}.mdl-color-text--red-A400{color:#ff1744!important}.mdl-color--red-A400{background-color:#ff1744!important}.mdl-color-text--red-A700{color:#d50000!important}.mdl-color--red-A700{background-color:#d50000!important}.mdl-color-text--pink{color:#e91e63!important}.mdl-color--pink{background-color:#e91e63!important}.mdl-color-text--pink-50{color:#fce4ec!important}.mdl-color--pink-50{background-color:#fce4ec!important}.mdl-color-text--pink-100{color:#f8bbd0!important}.mdl-color--pink-100{background-color:#f8bbd0!important}.mdl-color-text--pink-200{color:#f48fb1!important}.mdl-color--pink-200{background-color:#f48fb1!important}.mdl-color-text--pink-300{color:#f06292!important}.mdl-color--pink-300{background-color:#f06292!important}.mdl-color-text--pink-400{color:#ec407a!important}.mdl-color--pink-400{background-color:#ec407a!important}.mdl-color-text--pink-500{color:#e91e63!important}.mdl-color--pink-500{background-color:#e91e63!important}.mdl-color-text--pink-600{color:#d81b60!important}.mdl-color--pink-600{background-color:#d81b60!important}.mdl-color-text--pink-700{color:#c2185b!important}.mdl-color--pink-700{background-color:#c2185b!important}.mdl-color-text--pink-800{color:#ad1457!important}.mdl-color--pink-800{background-color:#ad1457!important}.mdl-color-text--pink-900{color:#880e4f!important}.mdl-color--pink-900{background-color:#880e4f!important}.mdl-color-text--pink-A100{color:#ff80ab!important}.mdl-color--pink-A100{background-color:#ff80ab!important}.mdl-color-text--pink-A200{color:#ff4081!important}.mdl-color--pink-A200{background-color:#ff4081!important}.mdl-color-text--pink-A400{color:#f50057!important}.mdl-color--pink-A400{background-color:#f50057!important}.mdl-color-text--pink-A700{color:#c51162!important}.mdl-color--pink-A700{background-color:#c51162!important}.mdl-color-text--purple{color:#9c27b0!important}.mdl-color--purple{background-color:#9c27b0!important}.mdl-color-text--purple-50{color:#f3e5f5!important}.mdl-color--purple-50{background-color:#f3e5f5!important}.mdl-color-text--purple-100{color:#e1bee7!important}.mdl-color--purple-100{background-color:#e1bee7!important}.mdl-color-text--purple-200{color:#ce93d8!important}.mdl-color--purple-200{background-color:#ce93d8!important}.mdl-color-text--purple-300{color:#ba68c8!important}.mdl-color--purple-300{background-color:#ba68c8!important}.mdl-color-text--purple-400{color:#ab47bc!important}.mdl-color--purple-400{background-color:#ab47bc!important}.mdl-color-text--purple-500{color:#9c27b0!important}.mdl-color--purple-500{background-color:#9c27b0!important}.mdl-color-text--purple-600{color:#8e24aa!important}.mdl-color--purple-600{background-color:#8e24aa!important}.mdl-color-text--purple-700{color:#7b1fa2!important}.mdl-color--purple-700{background-color:#7b1fa2!important}.mdl-color-text--purple-800{color:#6a1b9a!important}.mdl-color--purple-800{background-color:#6a1b9a!important}.mdl-color-text--purple-900{color:#4a148c!important}.mdl-color--purple-900{background-color:#4a148c!important}.mdl-color-text--purple-A100{color:#ea80fc!important}.mdl-color--purple-A100{background-color:#ea80fc!important}.mdl-color-text--purple-A200{color:#e040fb!important}.mdl-color--purple-A200{background-color:#e040fb!important}.mdl-color-text--purple-A400{color:#d500f9!important}.mdl-color--purple-A400{background-color:#d500f9!important}.mdl-color-text--purple-A700{color:#a0f!important}.mdl-color--purple-A700{background-color:#a0f!important}.mdl-color-text--deep-purple{color:#673ab7!important}.mdl-color--deep-purple{background-color:#673ab7!important}.mdl-color-text--deep-purple-50{color:#ede7f6!important}.mdl-color--deep-purple-50{background-color:#ede7f6!important}.mdl-color-text--deep-purple-100{color:#d1c4e9!important}.mdl-color--deep-purple-100{background-color:#d1c4e9!important}.mdl-color-text--deep-purple-200{color:#b39ddb!important}.mdl-color--deep-purple-200{background-color:#b39ddb!important}.mdl-color-text--deep-purple-300{color:#9575cd!important}.mdl-color--deep-purple-300{background-color:#9575cd!important}.mdl-color-text--deep-purple-400{color:#7e57c2!important}.mdl-color--deep-purple-400{background-color:#7e57c2!important}.mdl-color-text--deep-purple-500{color:#673ab7!important}.mdl-color--deep-purple-500{background-color:#673ab7!important}.mdl-color-text--deep-purple-600{color:#5e35b1!important}.mdl-color--deep-purple-600{background-color:#5e35b1!important}.mdl-color-text--deep-purple-700{color:#512da8!important}.mdl-color--deep-purple-700{background-color:#512da8!important}.mdl-color-text--deep-purple-800{color:#4527a0!important}.mdl-color--deep-purple-800{background-color:#4527a0!important}.mdl-color-text--deep-purple-900{color:#311b92!important}.mdl-color--deep-purple-900{background-color:#311b92!important}.mdl-color-text--deep-purple-A100{color:#b388ff!important}.mdl-color--deep-purple-A100{background-color:#b388ff!important}.mdl-color-text--deep-purple-A200{color:#7c4dff!important}.mdl-color--deep-purple-A200{background-color:#7c4dff!important}.mdl-color-text--deep-purple-A400{color:#651fff!important}.mdl-color--deep-purple-A400{background-color:#651fff!important}.mdl-color-text--deep-purple-A700{color:#6200ea!important}.mdl-color--deep-purple-A700{background-color:#6200ea!important}.mdl-color-text--indigo{color:#3f51b5!important}.mdl-color--indigo{background-color:#3f51b5!important}.mdl-color-text--indigo-50{color:#e8eaf6!important}.mdl-color--indigo-50{background-color:#e8eaf6!important}.mdl-color-text--indigo-100{color:#c5cae9!important}.mdl-color--indigo-100{background-color:#c5cae9!important}.mdl-color-text--indigo-200{color:#9fa8da!important}.mdl-color--indigo-200{background-color:#9fa8da!important}.mdl-color-text--indigo-300{color:#7986cb!important}.mdl-color--indigo-300{background-color:#7986cb!important}.mdl-color-text--indigo-400{color:#5c6bc0!important}.mdl-color--indigo-400{background-color:#5c6bc0!important}.mdl-color-text--indigo-500{color:#3f51b5!important}.mdl-color--indigo-500{background-color:#3f51b5!important}.mdl-color-text--indigo-600{color:#3949ab!important}.mdl-color--indigo-600{background-color:#3949ab!important}.mdl-color-text--indigo-700{color:#303f9f!important}.mdl-color--indigo-700{background-color:#303f9f!important}.mdl-color-text--indigo-800{color:#283593!important}.mdl-color--indigo-800{background-color:#283593!important}.mdl-color-text--indigo-900{color:#1a237e!important}.mdl-color--indigo-900{background-color:#1a237e!important}.mdl-color-text--indigo-A100{color:#8c9eff!important}.mdl-color--indigo-A100{background-color:#8c9eff!important}.mdl-color-text--indigo-A200{color:#536dfe!important}.mdl-color--indigo-A200{background-color:#536dfe!important}.mdl-color-text--indigo-A400{color:#3d5afe!important}.mdl-color--indigo-A400{background-color:#3d5afe!important}.mdl-color-text--indigo-A700{color:#304ffe!important}.mdl-color--indigo-A700{background-color:#304ffe!important}.mdl-color-text--blue{color:#2196f3!important}.mdl-color--blue{background-color:#2196f3!important}.mdl-color-text--blue-50{color:#e3f2fd!important}.mdl-color--blue-50{background-color:#e3f2fd!important}.mdl-color-text--blue-100{color:#bbdefb!important}.mdl-color--blue-100{background-color:#bbdefb!important}.mdl-color-text--blue-200{color:#90caf9!important}.mdl-color--blue-200{background-color:#90caf9!important}.mdl-color-text--blue-300{color:#64b5f6!important}.mdl-color--blue-300{background-color:#64b5f6!important}.mdl-color-text--blue-400{color:#42a5f5!important}.mdl-color--blue-400{background-color:#42a5f5!important}.mdl-color-text--blue-500{color:#2196f3!important}.mdl-color--blue-500{background-color:#2196f3!important}.mdl-color-text--blue-600{color:#1e88e5!important}.mdl-color--blue-600{background-color:#1e88e5!important}.mdl-color-text--blue-700{color:#1976d2!important}.mdl-color--blue-700{background-color:#1976d2!important}.mdl-color-text--blue-800{color:#1565c0!important}.mdl-color--blue-800{background-color:#1565c0!important}.mdl-color-text--blue-900{color:#0d47a1!important}.mdl-color--blue-900{background-color:#0d47a1!important}.mdl-color-text--blue-A100{color:#82b1ff!important}.mdl-color--blue-A100{background-color:#82b1ff!important}.mdl-color-text--blue-A200{color:#448aff!important}.mdl-color--blue-A200{background-color:#448aff!important}.mdl-color-text--blue-A400{color:#2979ff!important}.mdl-color--blue-A400{background-color:#2979ff!important}.mdl-color-text--blue-A700{color:#2962ff!important}.mdl-color--blue-A700{background-color:#2962ff!important}.mdl-color-text--light-blue{color:#03a9f4!important}.mdl-color--light-blue{background-color:#03a9f4!important}.mdl-color-text--light-blue-50{color:#e1f5fe!important}.mdl-color--light-blue-50{background-color:#e1f5fe!important}.mdl-color-text--light-blue-100{color:#b3e5fc!important}.mdl-color--light-blue-100{background-color:#b3e5fc!important}.mdl-color-text--light-blue-200{color:#81d4fa!important}.mdl-color--light-blue-200{background-color:#81d4fa!important}.mdl-color-text--light-blue-300{color:#4fc3f7!important}.mdl-color--light-blue-300{background-color:#4fc3f7!important}.mdl-color-text--light-blue-400{color:#29b6f6!important}.mdl-color--light-blue-400{background-color:#29b6f6!important}.mdl-color-text--light-blue-500{color:#03a9f4!important}.mdl-color--light-blue-500{background-color:#03a9f4!important}.mdl-color-text--light-blue-600{color:#039be5!important}.mdl-color--light-blue-600{background-color:#039be5!important}.mdl-color-text--light-blue-700{color:#0288d1!important}.mdl-color--light-blue-700{background-color:#0288d1!important}.mdl-color-text--light-blue-800{color:#0277bd!important}.mdl-color--light-blue-800{background-color:#0277bd!important}.mdl-color-text--light-blue-900{color:#01579b!important}.mdl-color--light-blue-900{background-color:#01579b!important}.mdl-color-text--light-blue-A100{color:#80d8ff!important}.mdl-color--light-blue-A100{background-color:#80d8ff!important}.mdl-color-text--light-blue-A200{color:#40c4ff!important}.mdl-color--light-blue-A200{background-color:#40c4ff!important}.mdl-color-text--light-blue-A400{color:#00b0ff!important}.mdl-color--light-blue-A400{background-color:#00b0ff!important}.mdl-color-text--light-blue-A700{color:#0091ea!important}.mdl-color--light-blue-A700{background-color:#0091ea!important}.mdl-color-text--cyan{color:#00bcd4!important}.mdl-color--cyan{background-color:#00bcd4!important}.mdl-color-text--cyan-50{color:#e0f7fa!important}.mdl-color--cyan-50{background-color:#e0f7fa!important}.mdl-color-text--cyan-100{color:#b2ebf2!important}.mdl-color--cyan-100{background-color:#b2ebf2!important}.mdl-color-text--cyan-200{color:#80deea!important}.mdl-color--cyan-200{background-color:#80deea!important}.mdl-color-text--cyan-300{color:#4dd0e1!important}.mdl-color--cyan-300{background-color:#4dd0e1!important}.mdl-color-text--cyan-400{color:#26c6da!important}.mdl-color--cyan-400{background-color:#26c6da!important}.mdl-color-text--cyan-500{color:#00bcd4!important}.mdl-color--cyan-500{background-color:#00bcd4!important}.mdl-color-text--cyan-600{color:#00acc1!important}.mdl-color--cyan-600{background-color:#00acc1!important}.mdl-color-text--cyan-700{color:#0097a7!important}.mdl-color--cyan-700{background-color:#0097a7!important}.mdl-color-text--cyan-800{color:#00838f!important}.mdl-color--cyan-800{background-color:#00838f!important}.mdl-color-text--cyan-900{color:#006064!important}.mdl-color--cyan-900{background-color:#006064!important}.mdl-color-text--cyan-A100{color:#84ffff!important}.mdl-color--cyan-A100{background-color:#84ffff!important}.mdl-color-text--cyan-A200{color:#18ffff!important}.mdl-color--cyan-A200{background-color:#18ffff!important}.mdl-color-text--cyan-A400{color:#00e5ff!important}.mdl-color--cyan-A400{background-color:#00e5ff!important}.mdl-color-text--cyan-A700{color:#00b8d4!important}.mdl-color--cyan-A700{background-color:#00b8d4!important}.mdl-color-text--teal{color:#009688!important}.mdl-color--teal{background-color:#009688!important}.mdl-color-text--teal-50{color:#e0f2f1!important}.mdl-color--teal-50{background-color:#e0f2f1!important}.mdl-color-text--teal-100{color:#b2dfdb!important}.mdl-color--teal-100{background-color:#b2dfdb!important}.mdl-color-text--teal-200{color:#80cbc4!important}.mdl-color--teal-200{background-color:#80cbc4!important}.mdl-color-text--teal-300{color:#4db6ac!important}.mdl-color--teal-300{background-color:#4db6ac!important}.mdl-color-text--teal-400{color:#26a69a!important}.mdl-color--teal-400{background-color:#26a69a!important}.mdl-color-text--teal-500{color:#009688!important}.mdl-color--teal-500{background-color:#009688!important}.mdl-color-text--teal-600{color:#00897b!important}.mdl-color--teal-600{background-color:#00897b!important}.mdl-color-text--teal-700{color:#00796b!important}.mdl-color--teal-700{background-color:#00796b!important}.mdl-color-text--teal-800{color:#00695c!important}.mdl-color--teal-800{background-color:#00695c!important}.mdl-color-text--teal-900{color:#004d40!important}.mdl-color--teal-900{background-color:#004d40!important}.mdl-color-text--teal-A100{color:#a7ffeb!important}.mdl-color--teal-A100{background-color:#a7ffeb!important}.mdl-color-text--teal-A200{color:#64ffda!important}.mdl-color--teal-A200{background-color:#64ffda!important}.mdl-color-text--teal-A400{color:#1de9b6!important}.mdl-color--teal-A400{background-color:#1de9b6!important}.mdl-color-text--teal-A700{color:#00bfa5!important}.mdl-color--teal-A700{background-color:#00bfa5!important}.mdl-color-text--green{color:#4caf50!important}.mdl-color--green{background-color:#4caf50!important}.mdl-color-text--green-50{color:#e8f5e9!important}.mdl-color--green-50{background-color:#e8f5e9!important}.mdl-color-text--green-100{color:#c8e6c9!important}.mdl-color--green-100{background-color:#c8e6c9!important}.mdl-color-text--green-200{color:#a5d6a7!important}.mdl-color--green-200{background-color:#a5d6a7!important}.mdl-color-text--green-300{color:#81c784!important}.mdl-color--green-300{background-color:#81c784!important}.mdl-color-text--green-400{color:#66bb6a!important}.mdl-color--green-400{background-color:#66bb6a!important}.mdl-color-text--green-500{color:#4caf50!important}.mdl-color--green-500{background-color:#4caf50!important}.mdl-color-text--green-600{color:#43a047!important}.mdl-color--green-600{background-color:#43a047!important}.mdl-color-text--green-700{color:#388e3c!important}.mdl-color--green-700{background-color:#388e3c!important}.mdl-color-text--green-800{color:#2e7d32!important}.mdl-color--green-800{background-color:#2e7d32!important}.mdl-color-text--green-900{color:#1b5e20!important}.mdl-color--green-900{background-color:#1b5e20!important}.mdl-color-text--green-A100{color:#b9f6ca!important}.mdl-color--green-A100{background-color:#b9f6ca!important}.mdl-color-text--green-A200{color:#69f0ae!important}.mdl-color--green-A200{background-color:#69f0ae!important}.mdl-color-text--green-A400{color:#00e676!important}.mdl-color--green-A400{background-color:#00e676!important}.mdl-color-text--green-A700{color:#00c853!important}.mdl-color--green-A700{background-color:#00c853!important}.mdl-color-text--light-green{color:#8bc34a!important}.mdl-color--light-green{background-color:#8bc34a!important}.mdl-color-text--light-green-50{color:#f1f8e9!important}.mdl-color--light-green-50{background-color:#f1f8e9!important}.mdl-color-text--light-green-100{color:#dcedc8!important}.mdl-color--light-green-100{background-color:#dcedc8!important}.mdl-color-text--light-green-200{color:#c5e1a5!important}.mdl-color--light-green-200{background-color:#c5e1a5!important}.mdl-color-text--light-green-300{color:#aed581!important}.mdl-color--light-green-300{background-color:#aed581!important}.mdl-color-text--light-green-400{color:#9ccc65!important}.mdl-color--light-green-400{background-color:#9ccc65!important}.mdl-color-text--light-green-500{color:#8bc34a!important}.mdl-color--light-green-500{background-color:#8bc34a!important}.mdl-color-text--light-green-600{color:#7cb342!important}.mdl-color--light-green-600{background-color:#7cb342!important}.mdl-color-text--light-green-700{color:#689f38!important}.mdl-color--light-green-700{background-color:#689f38!important}.mdl-color-text--light-green-800{color:#558b2f!important}.mdl-color--light-green-800{background-color:#558b2f!important}.mdl-color-text--light-green-900{color:#33691e!important}.mdl-color--light-green-900{background-color:#33691e!important}.mdl-color-text--light-green-A100{color:#ccff90!important}.mdl-color--light-green-A100{background-color:#ccff90!important}.mdl-color-text--light-green-A200{color:#b2ff59!important}.mdl-color--light-green-A200{background-color:#b2ff59!important}.mdl-color-text--light-green-A400{color:#76ff03!important}.mdl-color--light-green-A400{background-color:#76ff03!important}.mdl-color-text--light-green-A700{color:#64dd17!important}.mdl-color--light-green-A700{background-color:#64dd17!important}.mdl-color-text--lime{color:#cddc39!important}.mdl-color--lime{background-color:#cddc39!important}.mdl-color-text--lime-50{color:#f9fbe7!important}.mdl-color--lime-50{background-color:#f9fbe7!important}.mdl-color-text--lime-100{color:#f0f4c3!important}.mdl-color--lime-100{background-color:#f0f4c3!important}.mdl-color-text--lime-200{color:#e6ee9c!important}.mdl-color--lime-200{background-color:#e6ee9c!important}.mdl-color-text--lime-300{color:#dce775!important}.mdl-color--lime-300{background-color:#dce775!important}.mdl-color-text--lime-400{color:#d4e157!important}.mdl-color--lime-400{background-color:#d4e157!important}.mdl-color-text--lime-500{color:#cddc39!important}.mdl-color--lime-500{background-color:#cddc39!important}.mdl-color-text--lime-600{color:#c0ca33!important}.mdl-color--lime-600{background-color:#c0ca33!important}.mdl-color-text--lime-700{color:#afb42b!important}.mdl-color--lime-700{background-color:#afb42b!important}.mdl-color-text--lime-800{color:#9e9d24!important}.mdl-color--lime-800{background-color:#9e9d24!important}.mdl-color-text--lime-900{color:#827717!important}.mdl-color--lime-900{background-color:#827717!important}.mdl-color-text--lime-A100{color:#f4ff81!important}.mdl-color--lime-A100{background-color:#f4ff81!important}.mdl-color-text--lime-A200{color:#eeff41!important}.mdl-color--lime-A200{background-color:#eeff41!important}.mdl-color-text--lime-A400{color:#c6ff00!important}.mdl-color--lime-A400{background-color:#c6ff00!important}.mdl-color-text--lime-A700{color:#aeea00!important}.mdl-color--lime-A700{background-color:#aeea00!important}.mdl-color-text--yellow{color:#ffeb3b!important}.mdl-color--yellow{background-color:#ffeb3b!important}.mdl-color-text--yellow-50{color:#fffde7!important}.mdl-color--yellow-50{background-color:#fffde7!important}.mdl-color-text--yellow-100{color:#fff9c4!important}.mdl-color--yellow-100{background-color:#fff9c4!important}.mdl-color-text--yellow-200{color:#fff59d!important}.mdl-color--yellow-200{background-color:#fff59d!important}.mdl-color-text--yellow-300{color:#fff176!important}.mdl-color--yellow-300{background-color:#fff176!important}.mdl-color-text--yellow-400{color:#ffee58!important}.mdl-color--yellow-400{background-color:#ffee58!important}.mdl-color-text--yellow-500{color:#ffeb3b!important}.mdl-color--yellow-500{background-color:#ffeb3b!important}.mdl-color-text--yellow-600{color:#fdd835!important}.mdl-color--yellow-600{background-color:#fdd835!important}.mdl-color-text--yellow-700{color:#fbc02d!important}.mdl-color--yellow-700{background-color:#fbc02d!important}.mdl-color-text--yellow-800{color:#f9a825!important}.mdl-color--yellow-800{background-color:#f9a825!important}.mdl-color-text--yellow-900{color:#f57f17!important}.mdl-color--yellow-900{background-color:#f57f17!important}.mdl-color-text--yellow-A100{color:#ffff8d!important}.mdl-color--yellow-A100{background-color:#ffff8d!important}.mdl-color-text--yellow-A200{color:#ff0!important}.mdl-color--yellow-A200{background-color:#ff0!important}.mdl-color-text--yellow-A400{color:#ffea00!important}.mdl-color--yellow-A400{background-color:#ffea00!important}.mdl-color-text--yellow-A700{color:#ffd600!important}.mdl-color--yellow-A700{background-color:#ffd600!important}.mdl-color-text--amber{color:#ffc107!important}.mdl-color--amber{background-color:#ffc107!important}.mdl-color-text--amber-50{color:#fff8e1!important}.mdl-color--amber-50{background-color:#fff8e1!important}.mdl-color-text--amber-100{color:#ffecb3!important}.mdl-color--amber-100{background-color:#ffecb3!important}.mdl-color-text--amber-200{color:#ffe082!important}.mdl-color--amber-200{background-color:#ffe082!important}.mdl-color-text--amber-300{color:#ffd54f!important}.mdl-color--amber-300{background-color:#ffd54f!important}.mdl-color-text--amber-400{color:#ffca28!important}.mdl-color--amber-400{background-color:#ffca28!important}.mdl-color-text--amber-500{color:#ffc107!important}.mdl-color--amber-500{background-color:#ffc107!important}.mdl-color-text--amber-600{color:#ffb300!important}.mdl-color--amber-600{background-color:#ffb300!important}.mdl-color-text--amber-700{color:#ffa000!important}.mdl-color--amber-700{background-color:#ffa000!important}.mdl-color-text--amber-800{color:#ff8f00!important}.mdl-color--amber-800{background-color:#ff8f00!important}.mdl-color-text--amber-900{color:#ff6f00!important}.mdl-color--amber-900{background-color:#ff6f00!important}.mdl-color-text--amber-A100{color:#ffe57f!important}.mdl-color--amber-A100{background-color:#ffe57f!important}.mdl-color-text--amber-A200{color:#ffd740!important}.mdl-color--amber-A200{background-color:#ffd740!important}.mdl-color-text--amber-A400{color:#ffc400!important}.mdl-color--amber-A400{background-color:#ffc400!important}.mdl-color-text--amber-A700{color:#ffab00!important}.mdl-color--amber-A700{background-color:#ffab00!important}.mdl-color-text--orange{color:#ff9800!important}.mdl-color--orange{background-color:#ff9800!important}.mdl-color-text--orange-50{color:#fff3e0!important}.mdl-color--orange-50{background-color:#fff3e0!important}.mdl-color-text--orange-100{color:#ffe0b2!important}.mdl-color--orange-100{background-color:#ffe0b2!important}.mdl-color-text--orange-200{color:#ffcc80!important}.mdl-color--orange-200{background-color:#ffcc80!important}.mdl-color-text--orange-300{color:#ffb74d!important}.mdl-color--orange-300{background-color:#ffb74d!important}.mdl-color-text--orange-400{color:#ffa726!important}.mdl-color--orange-400{background-color:#ffa726!important}.mdl-color-text--orange-500{color:#ff9800!important}.mdl-color--orange-500{background-color:#ff9800!important}.mdl-color-text--orange-600{color:#fb8c00!important}.mdl-color--orange-600{background-color:#fb8c00!important}.mdl-color-text--orange-700{color:#f57c00!important}.mdl-color--orange-700{background-color:#f57c00!important}.mdl-color-text--orange-800{color:#ef6c00!important}.mdl-color--orange-800{background-color:#ef6c00!important}.mdl-color-text--orange-900{color:#e65100!important}.mdl-color--orange-900{background-color:#e65100!important}.mdl-color-text--orange-A100{color:#ffd180!important}.mdl-color--orange-A100{background-color:#ffd180!important}.mdl-color-text--orange-A200{color:#ffab40!important}.mdl-color--orange-A200{background-color:#ffab40!important}.mdl-color-text--orange-A400{color:#ff9100!important}.mdl-color--orange-A400{background-color:#ff9100!important}.mdl-color-text--orange-A700{color:#ff6d00!important}.mdl-color--orange-A700{background-color:#ff6d00!important}.mdl-color-text--deep-orange{color:#ff5722!important}.mdl-color--deep-orange{background-color:#ff5722!important}.mdl-color-text--deep-orange-50{color:#fbe9e7!important}.mdl-color--deep-orange-50{background-color:#fbe9e7!important}.mdl-color-text--deep-orange-100{color:#ffccbc!important}.mdl-color--deep-orange-100{background-color:#ffccbc!important}.mdl-color-text--deep-orange-200{color:#ffab91!important}.mdl-color--deep-orange-200{background-color:#ffab91!important}.mdl-color-text--deep-orange-300{color:#ff8a65!important}.mdl-color--deep-orange-300{background-color:#ff8a65!important}.mdl-color-text--deep-orange-400{color:#ff7043!important}.mdl-color--deep-orange-400{background-color:#ff7043!important}.mdl-color-text--deep-orange-500{color:#ff5722!important}.mdl-color--deep-orange-500{background-color:#ff5722!important}.mdl-color-text--deep-orange-600{color:#f4511e!important}.mdl-color--deep-orange-600{background-color:#f4511e!important}.mdl-color-text--deep-orange-700{color:#e64a19!important}.mdl-color--deep-orange-700{background-color:#e64a19!important}.mdl-color-text--deep-orange-800{color:#d84315!important}.mdl-color--deep-orange-800{background-color:#d84315!important}.mdl-color-text--deep-orange-900{color:#bf360c!important}.mdl-color--deep-orange-900{background-color:#bf360c!important}.mdl-color-text--deep-orange-A100{color:#ff9e80!important}.mdl-color--deep-orange-A100{background-color:#ff9e80!important}.mdl-color-text--deep-orange-A200{color:#ff6e40!important}.mdl-color--deep-orange-A200{background-color:#ff6e40!important}.mdl-color-text--deep-orange-A400{color:#ff3d00!important}.mdl-color--deep-orange-A400{background-color:#ff3d00!important}.mdl-color-text--deep-orange-A700{color:#dd2c00!important}.mdl-color--deep-orange-A700{background-color:#dd2c00!important}.mdl-color-text--brown{color:#795548!important}.mdl-color--brown{background-color:#795548!important}.mdl-color-text--brown-50{color:#efebe9!important}.mdl-color--brown-50{background-color:#efebe9!important}.mdl-color-text--brown-100{color:#d7ccc8!important}.mdl-color--brown-100{background-color:#d7ccc8!important}.mdl-color-text--brown-200{color:#bcaaa4!important}.mdl-color--brown-200{background-color:#bcaaa4!important}.mdl-color-text--brown-300{color:#a1887f!important}.mdl-color--brown-300{background-color:#a1887f!important}.mdl-color-text--brown-400{color:#8d6e63!important}.mdl-color--brown-400{background-color:#8d6e63!important}.mdl-color-text--brown-500{color:#795548!important}.mdl-color--brown-500{background-color:#795548!important}.mdl-color-text--brown-600{color:#6d4c41!important}.mdl-color--brown-600{background-color:#6d4c41!important}.mdl-color-text--brown-700{color:#5d4037!important}.mdl-color--brown-700{background-color:#5d4037!important}.mdl-color-text--brown-800{color:#4e342e!important}.mdl-color--brown-800{background-color:#4e342e!important}.mdl-color-text--brown-900{color:#3e2723!important}.mdl-color--brown-900{background-color:#3e2723!important}.mdl-color-text--grey{color:#9e9e9e!important}.mdl-color--grey{background-color:#9e9e9e!important}.mdl-color-text--grey-50{color:#fafafa!important}.mdl-color--grey-50{background-color:#fafafa!important}.mdl-color-text--grey-100{color:#f5f5f5!important}.mdl-color--grey-100{background-color:#f5f5f5!important}.mdl-color-text--grey-200{color:#eee!important}.mdl-color--grey-200{background-color:#eee!important}.mdl-color-text--grey-300{color:#e0e0e0!important}.mdl-color--grey-300{background-color:#e0e0e0!important}.mdl-color-text--grey-400{color:#bdbdbd!important}.mdl-color--grey-400{background-color:#bdbdbd!important}.mdl-color-text--grey-500{color:#9e9e9e!important}.mdl-color--grey-500{background-color:#9e9e9e!important}.mdl-color-text--grey-600{color:#757575!important}.mdl-color--grey-600{background-color:#757575!important}.mdl-color-text--grey-700{color:#616161!important}.mdl-color--grey-700{background-color:#616161!important}.mdl-color-text--grey-800{color:#424242!important}.mdl-color--grey-800{background-color:#424242!important}.mdl-color-text--grey-900{color:#212121!important}.mdl-color--grey-900{background-color:#212121!important}.mdl-color-text--blue-grey{color:#607d8b!important}.mdl-color--blue-grey{background-color:#607d8b!important}.mdl-color-text--blue-grey-50{color:#eceff1!important}.mdl-color--blue-grey-50{background-color:#eceff1!important}.mdl-color-text--blue-grey-100{color:#cfd8dc!important}.mdl-color--blue-grey-100{background-color:#cfd8dc!important}.mdl-color-text--blue-grey-200{color:#b0bec5!important}.mdl-color--blue-grey-200{background-color:#b0bec5!important}.mdl-color-text--blue-grey-300{color:#90a4ae!important}.mdl-color--blue-grey-300{background-color:#90a4ae!important}.mdl-color-text--blue-grey-400{color:#78909c!important}.mdl-color--blue-grey-400{background-color:#78909c!important}.mdl-color-text--blue-grey-500{color:#607d8b!important}.mdl-color--blue-grey-500{background-color:#607d8b!important}.mdl-color-text--blue-grey-600{color:#546e7a!important}.mdl-color--blue-grey-600{background-color:#546e7a!important}.mdl-color-text--blue-grey-700{color:#455a64!important}.mdl-color--blue-grey-700{background-color:#455a64!important}.mdl-color-text--blue-grey-800{color:#37474f!important}.mdl-color--blue-grey-800{background-color:#37474f!important}.mdl-color-text--blue-grey-900{color:#263238!important}.mdl-color--blue-grey-900{background-color:#263238!important}.mdl-color--black{background-color:#000!important}.mdl-color-text--black{color:#000!important}.mdl-color--white{background-color:#fff!important}.mdl-color-text--white{color:#fff!important}.mdl-color--primary{background-color:#3f51b5!important}.mdl-color--primary-contrast{background-color:#fff!important}.mdl-color--primary-dark{background-color:#303f9f!important}.mdl-color--accent{background-color:#ff4081!important}.mdl-color--accent-contrast{background-color:#fff!important}.mdl-color-text--primary{color:#3f51b5!important}.mdl-color-text--primary-contrast{color:#fff!important}.mdl-color-text--primary-dark{color:#303f9f!important}.mdl-color-text--accent{color:#ff4081!important}.mdl-color-text--accent-contrast{color:#fff!important}.mdl-ripple{background:#000;border-radius:50%;height:50px;left:0;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:50px;overflow:hidden}.mdl-ripple.is-animating{-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.2,1),width .3s cubic-bezier(0,0,.2,1),height .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1);transition:transform .3s cubic-bezier(0,0,.2,1),width .3s cubic-bezier(0,0,.2,1),height .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1)}.mdl-ripple.is-visible{opacity:.3}.mdl-animation--default,.mdl-animation--fast-out-slow-in{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-animation--linear-out-slow-in{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.mdl-animation--fast-out-linear-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.mdl-badge{position:relative;white-space:nowrap;margin-right:24px}.mdl-badge:not([data-badge]){margin-right:auto}.mdl-badge[data-badge]:after{content:attr(data-badge);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:absolute;top:-11px;right:-24px;font-family:Roboto,Helvetica,Arial,sans-serif;font-weight:600;font-size:12px;width:22px;height:22px;border-radius:50%;background:#ff4081;color:#fff}.mdl-button .mdl-badge[data-badge]:after{top:-10px;right:-5px}.mdl-badge.mdl-badge--no-background[data-badge]:after{color:#ff4081;background:rgba(255,255,255,.2);box-shadow:0 0 1px gray}.mdl-button{background:0 0;border:none;border-radius:2px;color:#000;position:relative;height:36px;min-width:64px;padding:0 8px;display:inline-block;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0;overflow:hidden;will-change:box-shadow,transform;-webkit-transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);outline:0;cursor:pointer;text-align:center;line-height:36px}.mdl-button--fab,.mdl-button--icon{overflow:hidden;font-size:24px;padding:0}.mdl-button::-moz-focus-inner{border:0}.mdl-button:hover{background-color:rgba(158,158,158,.2)}.mdl-button:focus:not(:active){background-color:rgba(0,0,0,.12)}.mdl-button:active{background-color:rgba(158,158,158,.4)}.mdl-button.mdl-button--colored{color:#3f51b5}.mdl-button.mdl-button--colored:focus:not(:active){background-color:rgba(0,0,0,.12)}input.mdl-button[type=submit]{-webkit-appearance:none}.mdl-button--raised{background:rgba(158,158,158,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--raised:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:rgba(158,158,158,.4)}.mdl-button--raised:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:rgba(158,158,158,.4)}.mdl-button--raised.mdl-button--colored{background:#3f51b5;color:#fff}.mdl-button--raised.mdl-button--colored:active,.mdl-button--raised.mdl-button--colored:focus:not(:active),.mdl-button--raised.mdl-button--colored:hover{background-color:#3f51b5}.mdl-button--raised.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--fab{border-radius:50%;height:56px;margin:auto;min-width:56px;width:56px;background:rgba(158,158,158,.2);box-shadow:0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);position:relative;line-height:normal}.mdl-button--fab .material-icons{transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--fab .material-icons,.mdl-button--icon .material-icons{position:absolute;top:50%;left:50%;-webkit-transform:translate(-12px,-12px);-ms-transform:translate(-12px,-12px)}.mdl-button--fab.mdl-button--mini-fab{height:40px;min-width:40px;width:40px}.mdl-button--fab .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button--fab:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:rgba(158,158,158,.4)}.mdl-button--fab:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:rgba(158,158,158,.4)}.mdl-button--fab.mdl-button--colored{background:#ff4081;color:#fff}.mdl-button--fab.mdl-button--colored:active,.mdl-button--fab.mdl-button--colored:focus:not(:active),.mdl-button--fab.mdl-button--colored:hover{background-color:#ff4081}.mdl-button--fab.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--icon{border-radius:50%;height:32px;margin-left:0;margin-right:0;min-width:32px;width:32px;color:inherit;line-height:normal}.mdl-button--icon .material-icons{transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon{height:24px;min-width:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon .material-icons{top:0;left:0}.mdl-button--icon .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button__ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-button.mdl-button--disabled .mdl-button__ripple-container .mdl-ripple,.mdl-button[disabled] .mdl-button__ripple-container .mdl-ripple{background-color:transparent}.mdl-button--primary.mdl-button--primary{color:#3f51b5}.mdl-button--primary.mdl-button--primary .mdl-ripple{background:#fff}.mdl-button--primary.mdl-button--primary.mdl-button--fab,.mdl-button--primary.mdl-button--primary.mdl-button--raised{color:#fff;background-color:#3f51b5}.mdl-button--accent.mdl-button--accent{color:#ff4081}.mdl-button--accent.mdl-button--accent .mdl-ripple{background:#fff}.mdl-button--accent.mdl-button--accent.mdl-button--fab,.mdl-button--accent.mdl-button--accent.mdl-button--raised{color:#fff;background-color:#ff4081}.mdl-button.mdl-button--disabled.mdl-button--disabled,.mdl-button[disabled][disabled]{color:rgba(0,0,0,.26);cursor:auto;background-color:transparent}.mdl-button--fab.mdl-button--disabled.mdl-button--disabled,.mdl-button--fab[disabled][disabled],.mdl-button--raised.mdl-button--disabled.mdl-button--disabled,.mdl-button--raised[disabled][disabled]{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.26);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--colored.mdl-button--disabled.mdl-button--disabled,.mdl-button--colored[disabled][disabled]{color:rgba(0,0,0,.26)}.mdl-card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;font-size:16px;font-weight:400;min-height:200px;overflow:hidden;width:330px;z-index:1;position:relative;background:#fff;border-radius:2px}.mdl-card__media{background-color:#ff4081;background-repeat:repeat;background-position:50% 50%;background-size:cover;background-origin:padding-box;background-attachment:scroll}.mdl-card__title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#000;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;line-height:normal;padding:16px;-webkit-perspective-origin:165px 56px;perspective-origin:165px 56px;-webkit-transform-origin:165px 56px;-ms-transform-origin:165px 56px;transform-origin:165px 56px}.mdl-card__title.mdl-card--border{border-bottom:1px solid rgba(0,0,0,.1)}.mdl-card__title-text{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;color:inherit;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:24px;font-weight:300;line-height:normal;overflow:hidden;-webkit-transform-origin:149px 48px;-ms-transform-origin:149px 48px;transform-origin:149px 48px;margin:0}.mdl-card__subtitle-text{font-size:14px;color:grey;margin:0}.mdl-card__supporting-text{color:rgba(0,0,0,.54);font-size:13px;line-height:18px;overflow:hidden;padding:16px;width:90%}.mdl-card__actions,.mdl-checkbox{box-sizing:border-box;width:100%}.mdl-card__actions{font-size:16px;line-height:normal;background-color:transparent;padding:8px}.mdl-card__actions.mdl-card--border{border-top:1px solid rgba(0,0,0,.1)}.mdl-card--expand{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdl-card__menu{position:absolute;right:16px;top:16px}.mdl-checkbox{position:relative;z-index:1;display:inline-block;height:24px;margin:0;padding:0}.mdl-checkbox.is-upgraded{padding-left:24px}.mdl-checkbox__input{line-height:24px}.mdl-checkbox.is-upgraded .mdl-checkbox__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-checkbox__box-outline,.mdl-checkbox__focus-helper{position:absolute;left:0;top:3px;display:inline-block;box-sizing:border-box;width:16px;height:16px}.mdl-checkbox__box-outline{margin:0;cursor:pointer;overflow:hidden;border:2px solid rgba(0,0,0,.54);border-radius:2px;z-index:2}.mdl-checkbox.is-checked .mdl-checkbox__box-outline{border:2px solid #3f51b5}.mdl-checkbox.is-disabled .mdl-checkbox__box-outline{border:2px solid rgba(0,0,0,.26);cursor:auto}.mdl-checkbox__focus-helper{border-radius:50%;background-color:transparent}.mdl-checkbox.is-focused .mdl-checkbox__focus-helper{box-shadow:0 0 0 8px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}.mdl-checkbox.is-focused.is-checked .mdl-checkbox__focus-helper{box-shadow:0 0 0 8px rgba(63,81,181,.26);background-color:rgba(63,81,181,.26)}.mdl-layout__drawer,.mdl-layout__header,.mdl-menu__outline{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-checkbox__tick-outline{position:absolute;top:0;left:0;height:100%;width:100%;-webkit-mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==);mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==);background:0 0;-webkit-transition-duration:.28s;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:background;transition-property:background}.mdl-checkbox__tick-outline,.mdl-data-table tbody tr{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-checkbox__ripple-container,.mdl-icon-toggle__ripple-container{box-sizing:border-box;overflow:hidden;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-checkbox.is-checked .mdl-checkbox__tick-outline{background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K) #3f51b5}.mdl-checkbox.is-checked.is-disabled .mdl-checkbox__tick-outline{background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K) rgba(0,0,0,.26)}.mdl-checkbox__label{position:relative;cursor:pointer;font-size:16px;line-height:24px;margin:0}.mdl-checkbox.is-disabled .mdl-checkbox__label{color:rgba(0,0,0,.26);cursor:auto}.mdl-checkbox__ripple-container{position:absolute;z-index:2;top:-6px;left:-10px;width:36px;height:36px;border-radius:50%;cursor:pointer}.mdl-checkbox__ripple-container .mdl-ripple{background:#3f51b5}.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container{cursor:auto}.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container .mdl-ripple{background:0 0}.mdl-data-table{position:relative;border:1px solid rgba(0,0,0,.12);border-collapse:collapse;white-space:nowrap;font-size:13px;background-color:#fff}.mdl-data-table thead{padding-bottom:3px}.mdl-data-table thead .mdl-data-table__select{margin-top:0}.mdl-data-table tbody tr{position:relative;height:48px;-webkit-transition-duration:.28s;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:background-color;transition-property:background-color}.mdl-data-table tbody tr.is-selected{background-color:#e0e0e0}.mdl-data-table tbody tr:hover{background-color:#eee}.mdl-data-table td,.mdl-data-table th{padding:0 18px;text-align:right}.mdl-data-table td:first-of-type,.mdl-data-table th:first-of-type{padding-left:24px}.mdl-data-table td:last-of-type,.mdl-data-table th:last-of-type{padding-right:24px}.mdl-data-table td{position:relative;vertical-align:top;height:48px;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);padding-top:12px;box-sizing:border-box}.mdl-data-table td .mdl-data-table__select{vertical-align:top;position:absolute;left:24px}.mdl-data-table th{position:relative;vertical-align:bottom;text-overflow:ellipsis;font-weight:700;line-height:24px;letter-spacing:0;height:48px;font-size:12px;color:rgba(0,0,0,.54);padding-bottom:8px;box-sizing:border-box}.mdl-data-table th .mdl-data-table__select{position:absolute;bottom:8px;left:24px}.mdl-data-table__select{width:16px}.mdl-data-table__cell--non-numeric.mdl-data-table__cell--non-numeric{text-align:left}.mdl-mega-footer{padding:16px 40px;color:#9e9e9e;background-color:#424242}.mdl-mega-footer--bottom-section:after,.mdl-mega-footer--middle-section:after,.mdl-mega-footer--top-section:after,.mdl-mega-footer__bottom-section:after,.mdl-mega-footer__middle-section:after,.mdl-mega-footer__top-section:after{content:'';display:block;clear:both}.mdl-mega-footer--left-section,.mdl-mega-footer--right-section,.mdl-mega-footer__left-section,.mdl-mega-footer__right-section{margin-bottom:16px}.mdl-mega-footer--right-section a,.mdl-mega-footer__right-section a{display:block;margin-bottom:16px;color:inherit;text-decoration:none}@media screen and (min-width:760px){.mdl-mega-footer--left-section,.mdl-mega-footer__left-section{float:left}.mdl-mega-footer--right-section,.mdl-mega-footer__right-section{float:right}.mdl-mega-footer--right-section a,.mdl-mega-footer__right-section a{display:inline-block;margin-left:16px;line-height:36px;vertical-align:middle}}.mdl-mega-footer--social-btn,.mdl-mega-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-mega-footer--drop-down-section,.mdl-mega-footer__drop-down-section{display:block;position:relative}@media screen and (min-width:760px){.mdl-mega-footer--drop-down-section,.mdl-mega-footer__drop-down-section{width:33%}.mdl-mega-footer--drop-down-section:nth-child(1),.mdl-mega-footer--drop-down-section:nth-child(2),.mdl-mega-footer__drop-down-section:nth-child(1),.mdl-mega-footer__drop-down-section:nth-child(2){float:left}.mdl-mega-footer--drop-down-section:nth-child(3),.mdl-mega-footer__drop-down-section:nth-child(3){float:right}.mdl-mega-footer--drop-down-section:nth-child(3):after,.mdl-mega-footer__drop-down-section:nth-child(3):after{clear:right}.mdl-mega-footer--drop-down-section:nth-child(4),.mdl-mega-footer__drop-down-section:nth-child(4){clear:right;float:right}.mdl-mega-footer--middle-section:after,.mdl-mega-footer__middle-section:after{content:'';display:block;clear:both}.mdl-mega-footer--bottom-section,.mdl-mega-footer__bottom-section{padding-top:0}}@media screen and (min-width:1024px){.mdl-mega-footer--drop-down-section,.mdl-mega-footer--drop-down-section:nth-child(3),.mdl-mega-footer--drop-down-section:nth-child(4),.mdl-mega-footer__drop-down-section,.mdl-mega-footer__drop-down-section:nth-child(3),.mdl-mega-footer__drop-down-section:nth-child(4){width:24%;float:left}}.mdl-mega-footer--heading-checkbox,.mdl-mega-footer__heading-checkbox{position:absolute;width:100%;height:55.8px;padding:32px;margin:-16px 0 0;cursor:pointer;z-index:1;opacity:0}.mdl-mega-footer--heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer__heading:after{font-family:'Material Icons';content:'\E5CE'}.mdl-mega-footer--heading-checkbox:checked~ul,.mdl-mega-footer__heading-checkbox:checked~ul{display:none}.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer__heading:after{font-family:'Material Icons';content:'\E5CF'}.mdl-mega-footer--heading,.mdl-mega-footer__heading{position:relative;width:100%;padding-right:39.8px;margin-bottom:16px;box-sizing:border-box;font-size:14px;line-height:23.8px;font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:#e0e0e0}.mdl-mega-footer--heading:after,.mdl-mega-footer__heading:after{content:'';position:absolute;top:0;right:0;display:block;width:23.8px;height:23.8px;background-size:cover}.mdl-mega-footer--link-list,.mdl-mega-footer__link-list{list-style:none;margin:0 0 32px;padding:0}.mdl-mega-footer--link-list:after,.mdl-mega-footer__link-list:after{clear:both;display:block;content:''}.mdl-mega-footer--link-list li,.mdl-mega-footer__link-list li{font-size:14px;font-weight:400;letter-spacing:0;line-height:20px}.mdl-mega-footer--link-list a,.mdl-mega-footer__link-list a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mega-footer--bottom-section,.mdl-mega-footer__bottom-section{padding-top:16px;margin-bottom:16px}.mdl-logo{margin-bottom:16px;color:#fff}.mdl-mega-footer--bottom-section .mdl-mega-footer--link-list li,.mdl-mega-footer__bottom-section .mdl-mega-footer__link-list li{float:left;margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mega-footer--heading-checkbox,.mdl-mega-footer__heading-checkbox{display:none}.mdl-mega-footer--heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer__heading:after{background-image:none}.mdl-mega-footer--heading-checkbox:checked~ul,.mdl-mega-footer__heading-checkbox:checked~ul{display:block}.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer__heading:after{content:''}.mdl-logo{float:left;margin-bottom:0;margin-right:16px}}.mdl-mini-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:32px 16px;color:#9e9e9e;background-color:#424242}.mdl-mini-footer:after{content:'';display:block}.mdl-mini-footer .mdl-logo{line-height:36px}.mdl-mini-footer--link-list,.mdl-mini-footer__link-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;list-style:none;margin:0;padding:0}.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li{margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li{line-height:36px}}.mdl-mini-footer--link-list a,.mdl-mini-footer__link-list a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mini-footer--left-section,.mdl-mini-footer__left-section{display:inline-block;-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.mdl-mini-footer--right-section,.mdl-mini-footer__right-section{display:inline-block;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.mdl-mini-footer--social-btn,.mdl-mini-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-icon-toggle{position:relative;z-index:1;vertical-align:middle;display:inline-block;height:32px;margin:0;padding:0}.mdl-icon-toggle__input{line-height:32px}.mdl-icon-toggle.is-upgraded .mdl-icon-toggle__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-icon-toggle__label{display:inline-block;position:relative;cursor:pointer;height:32px;width:32px;min-width:32px;color:#616161;border-radius:50%;padding:0;margin-left:0;margin-right:0;text-align:center;background-color:transparent;will-change:background-color;-webkit-transition:background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1)}.mdl-icon-toggle__label.material-icons{line-height:32px;font-size:24px}.mdl-icon-toggle.is-checked .mdl-icon-toggle__label{color:#3f51b5}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__label{color:rgba(0,0,0,.26);cursor:auto;-webkit-transition:none;transition:none}.mdl-icon-toggle.is-focused .mdl-icon-toggle__label{background-color:rgba(0,0,0,.12)}.mdl-icon-toggle.is-focused.is-checked .mdl-icon-toggle__label{background-color:rgba(63,81,181,.26)}.mdl-icon-toggle__ripple-container{position:absolute;z-index:2;top:-2px;left:-2px;width:36px;height:36px;border-radius:50%;cursor:pointer}.mdl-menu,.mdl-menu__outline{position:absolute;top:0;left:0}.mdl-icon-toggle__ripple-container .mdl-ripple{background:#616161}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__ripple-container{cursor:auto}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__ripple-container .mdl-ripple{background:0 0}.mdl-menu__container{display:block;margin:0;padding:0;border:none;position:absolute;overflow:visible;height:0;width:0;visibility:hidden;z-index:-1}.mdl-menu__container.is-animating,.mdl-menu__container.is-visible{z-index:999;visibility:visible}.mdl-menu__outline{background:#fff;padding:0;border-radius:2px;overflow:hidden;opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;will-change:transform;-webkit-transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);z-index:-1}.mdl-menu__item,.mdl-menu__outline{margin:0;display:block;border:none}.mdl-menu__item,.mdl-menu__item[disabled],.mdl-menu__item[disabled]:focus,.mdl-menu__item[disabled]:hover{background-color:transparent}.mdl-menu__container.is-visible .mdl-menu__outline{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);z-index:999}.mdl-menu__outline.mdl-menu--bottom-right{-webkit-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.mdl-menu__outline.mdl-menu--top-left{-webkit-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.mdl-menu__outline.mdl-menu--top-right{-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.mdl-menu{list-style:none;height:auto;width:auto;min-width:124px;padding:8px 0;margin:0;opacity:0;clip:rect(0 0 0 0);z-index:-1}.mdl-menu__container.is-visible .mdl-menu{opacity:1;z-index:999}.mdl-menu.is-animating{-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1)}.mdl-menu.mdl-menu--bottom-right{left:auto;right:0}.mdl-menu.mdl-menu--top-left{top:auto;bottom:0}.mdl-menu.mdl-menu--top-right{top:auto;left:auto;bottom:0;right:0}.mdl-menu.mdl-menu--unaligned{top:auto;left:auto}.mdl-menu__item{color:rgba(0,0,0,.87);text-align:left;padding:0 16px;outline-color:#bdbdbd;position:relative;overflow:hidden;font-size:14px;font-weight:400;letter-spacing:0;text-decoration:none;cursor:pointer;height:48px;line-height:48px;white-space:nowrap;opacity:0;-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1);user-select:none}.mdl-layout__tab-bar-button,.mdl-menu__item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.mdl-menu__item:focus,.mdl-textfield.is-focused .mdl-textfield__input{outline:0}.mdl-menu__container.is-visible .mdl-menu__item{opacity:1}.mdl-menu__item::-moz-focus-inner{border:0}.mdl-menu__item[disabled]{color:#bdbdbd;cursor:auto}.mdl-menu__item[disabled] .mdl-ripple{background:0 0}.mdl-menu__item:focus,.mdl-menu__item:hover{background-color:#eee}.mdl-menu__item:active{background-color:#e0e0e0}.mdl-menu__item--ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-progress{display:block;position:relative;height:4px;width:500px}.mdl-progress>.bar{display:block;position:absolute;top:0;bottom:0;width:0;-webkit-transition:width .2s cubic-bezier(.4,0,.2,1);transition:width .2s cubic-bezier(.4,0,.2,1)}.mdl-layout,.mdl-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.mdl-progress>.progressbar{background-color:#3f51b5;z-index:1;left:0}.mdl-progress>.bufferbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.7),rgba(255,255,255,.7)),linear-gradient(to right,#3f51b5,#3f51b5);z-index:0;left:0}.mdl-progress>.auxbar{right:0}@supports (-webkit-appearance:none){.mdl-progress:not(.mdl-progress__indeterminate):not(.mdl-progress__indeterminate)>.auxbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.7),rgba(255,255,255,.7)),linear-gradient(to right,#3f51b5,#3f51b5);-webkit-mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=);mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=)}}.mdl-progress:not(.mdl-progress__indeterminate)>.auxbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.9),rgba(255,255,255,.9)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.9),rgba(255,255,255,.9)),linear-gradient(to right,#3f51b5,#3f51b5)}.mdl-progress.mdl-progress__indeterminate>.bar1{background-color:#3f51b5;-webkit-animation-name:indeterminate1;animation-name:indeterminate1;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}.mdl-progress.mdl-progress__indeterminate>.bar1,.mdl-progress.mdl-progress__indeterminate>.bar3{-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}.mdl-progress.mdl-progress__indeterminate>.bar3{background-image:none;background-color:#3f51b5;-webkit-animation-name:indeterminate2;animation-name:indeterminate2;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}@-webkit-keyframes indeterminate1{0%{left:0;width:0}50%{left:25%;width:75%}75%{left:100%;width:0}}@keyframes indeterminate1{0%{left:0;width:0}50%{left:25%;width:75%}75%{left:100%;width:0}}@-webkit-keyframes indeterminate2{0%,50%{left:0;width:0}75%{left:0;width:25%}100%{left:100%;width:0}}@keyframes indeterminate2{0%,50%{left:0;width:0}75%{left:0;width:25%}100%{left:100%;width:0}}.mdl-navigation{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;box-sizing:border-box}.mdl-navigation__link{color:#424242;text-decoration:none;font-weight:500;font-size:13px;margin:0}.mdl-layout{width:100%;height:100%;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow-y:auto;overflow-x:hidden;position:relative;-webkit-overflow-scrolling:touch}.mdl-layout.is-small-screen .mdl-layout--large-screen-only,.mdl-layout:not(.is-small-screen) .mdl-layout--small-screen-only{display:none}.mdl-layout__container{position:absolute;width:100%;height:100%}.mdl-layout-title{display:block;position:relative;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:20px;line-height:1;letter-spacing:.02em;font-weight:400;box-sizing:border-box}.mdl-layout-spacer{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdl-layout__drawer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:240px;height:100%;max-height:100%;position:absolute;top:0;left:0;box-sizing:border-box;border-right:1px solid #e0e0e0;background:#fafafa;-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px);-webkit-transform-style:preserve-3d;transform-style:preserve-3d;will-change:transform;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform;color:#424242;overflow:visible;overflow-y:auto;z-index:5}.mdl-layout__drawer.is-visible{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.mdl-layout__drawer>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mdl-layout__drawer>.mdl-layout-title{line-height:64px;padding-left:40px}@media screen and (max-width:1024px){.mdl-layout__drawer>.mdl-layout-title{line-height:56px;padding-left:16px}}.mdl-layout__drawer .mdl-navigation{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;padding-top:16px}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link{display:block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:16px 40px;margin:0;color:#757575}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link:hover{background-color:#e0e0e0}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link--current{background-color:#000;color:#3f51b5}.mdl-layout__drawer-button{display:block;position:absolute;height:48px;width:48px;border:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden;text-align:center;cursor:pointer;font-size:26px;line-height:50px;font-family:Helvetica,Arial,sans-serif;margin:10px 12px;top:0;left:0;color:#fff;z-index:4}.mdl-layout__header .mdl-layout__drawer-button{position:absolute;color:#fff;background-color:inherit}@media screen and (max-width:1024px){.mdl-layout__drawer .mdl-navigation .mdl-navigation__link{padding:16px}.mdl-layout__header .mdl-layout__drawer-button{margin:4px}.mdl-layout__drawer-button{margin:4px;color:rgba(0,0,0,.5)}}@media screen and (min-width:1025px){.mdl-layout--fixed-drawer>.mdl-layout__drawer{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.mdl-layout--fixed-drawer>.mdl-layout__drawer-button{display:none}}.mdl-layout__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;box-sizing:border-box;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100%;margin:0;padding:0;border:none;min-height:64px;max-height:1000px;z-index:3;background-color:#3f51b5;color:#fff;-webkit-transition-duration:.2s;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:max-height,box-shadow;transition-property:max-height,box-shadow}.mdl-layout__header,.mdl-layout__obfuscator{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-layout--fixed-drawer:not(.is-small-screen)>.mdl-layout__header{margin-left:240px;width:calc(100% - 240px)}.mdl-layout__header-row,.mdl-layout__header-row .mdl-navigation{-webkit-box-orient:horizontal;-webkit-box-direction:normal;margin:0}@media screen and (min-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__header .mdl-layout__header-row{padding-left:40px}}.mdl-layout__header>.mdl-layout-icon{position:absolute;left:40px;top:16px;height:32px;width:32px;overflow:hidden;z-index:3;display:block}.mdl-layout.has-drawer .mdl-layout__header>.mdl-layout-icon{display:none}.mdl-layout__header.is-compact{max-height:64px}.mdl-layout__header.is-compact.has-tabs{height:112px}@media screen and (max-width:1024px){.mdl-layout__header{min-height:56px;display:none}.mdl-layout__header>.mdl-layout-icon{left:16px;top:12px}.mdl-layout__header.is-compact{max-height:56px}.mdl-layout__header.is-compact.has-tabs{min-height:104px}.mdl-layout--fixed-header>.mdl-layout__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}.mdl-layout__header--transparent.mdl-layout__header--transparent{background-color:transparent;box-shadow:none}.mdl-layout__header--scroll,.mdl-layout__header--seamed{box-shadow:none}.mdl-layout__header--waterfall{box-shadow:none;overflow:hidden}.mdl-layout__header--waterfall.is-casting-shadow,.mdl-switch__thumb{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-layout__header-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-sizing:border-box;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:64px;padding:0 40px 0 80px}@media screen and (max-width:1024px){.mdl-layout__header-row{height:56px;padding:0 16px 0 72px}}.mdl-layout__header-row>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mdl-layout__header--scroll .mdl-layout__header-row{width:100%}.mdl-layout__header-row .mdl-navigation{padding:0;height:64px;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mdl-layout__header-row .mdl-navigation__link{display:block;color:#fff;line-height:64px;padding:0 24px}@media screen and (max-width:1024px){.mdl-layout__header-row .mdl-navigation{height:56px}.mdl-layout__header-row .mdl-navigation__link{line-height:56px;padding:0 16px}}.mdl-layout__tab,.mdl-layout__tab-bar-button .material-icons{line-height:48px}.mdl-layout__obfuscator{background-color:transparent;position:absolute;top:0;left:0;height:100%;width:100%;z-index:4;visibility:hidden;-webkit-transition-property:background-color;transition-property:background-color;-webkit-transition-duration:.2s;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-layout__drawer.is-visible~.mdl-layout__obfuscator{background-color:rgba(0,0,0,.5);visibility:visible}.mdl-layout__content{-ms-flex:0 1 auto;display:inline-block;overflow-y:auto;overflow-x:hidden;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;z-index:1;-webkit-overflow-scrolling:touch}.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:240px}.mdl-layout__container.has-scrolling-header .mdl-layout__content{overflow:visible}@media screen and (max-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:0}.mdl-layout__container.has-scrolling-header .mdl-layout__content{overflow-y:auto;overflow-x:hidden}}.mdl-layout__tab-bar{height:96px;margin:0;width:calc(100% - 112px);padding:0 0 0 56px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background-color:#3f51b5;overflow-y:hidden;overflow-x:scroll}.mdl-layout__tab-bar::-webkit-scrollbar{display:none}@media screen and (max-width:1024px){.mdl-layout__tab-bar{width:calc(100% - 60px);padding:0 0 0 60px}}.mdl-layout--fixed-tabs .mdl-layout__tab-bar{padding:0;overflow:hidden;width:100%}.mdl-layout__tab-bar-container{position:relative;height:48px;width:100%;border:none;margin:0;z-index:2;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.mdl-layout__container>.mdl-layout__tab-bar-container{position:absolute;top:0;left:0}.mdl-layout__tab-bar-button{display:inline-block;position:absolute;top:0;height:48px;width:56px;z-index:4;text-align:center;background-color:#3f51b5;color:transparent;cursor:pointer;user-select:none}@media screen and (max-width:1024px){.mdl-layout__tab-bar-button{display:none;width:60px}}.mdl-layout--fixed-tabs .mdl-layout__tab-bar-button{display:none}.mdl-layout__tab-bar-button.is-active{color:#fff}.mdl-layout__tab-bar-left-button{left:0}.mdl-layout__tab-bar-right-button{right:0}.mdl-layout__tab{margin:0;border:none;padding:0 24px;float:left;position:relative;display:block;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:48px;text-align:center;font-weight:500;font-size:14px;color:rgba(255,255,255,.6);overflow:hidden}.mdl-radio,.mdl-radio__button,.mdl-switch__input{line-height:24px}@media screen and (max-width:1024px){.mdl-layout__tab{padding:0 12px}}.mdl-layout--fixed-tabs .mdl-layout__tab{float:none;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0}.mdl-layout.is-upgraded .mdl-layout__tab.is-active{color:#fff}.mdl-layout.is-upgraded .mdl-layout__tab.is-active::after{height:2px;width:100%;display:block;content:" ";bottom:0;left:0;position:absolute;background:#ff4081;-webkit-animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;-webkit-transition:all 1s cubic-bezier(.4,0,1,1);transition:all 1s cubic-bezier(.4,0,1,1)}.mdl-layout__tab .mdl-layout__tab-ripple-container{display:block;position:absolute;height:100%;width:100%;left:0;top:0;z-index:1;overflow:hidden}.mdl-layout__tab .mdl-layout__tab-ripple-container .mdl-ripple{background-color:#fff}.mdl-layout__tab-panel{display:block}.mdl-layout.is-upgraded .mdl-layout__tab-panel{display:none}.mdl-layout.is-upgraded .mdl-layout__tab-panel.is-active{display:block}.mdl-radio,.mdl-radio__outer-circle{margin:0;box-sizing:border-box;display:inline-block}.mdl-radio{position:relative;font-size:16px;padding-left:0}.mdl-radio.is-upgraded{padding-left:24px}.mdl-radio.is-upgraded .mdl-radio__button{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-radio__outer-circle{position:absolute;top:4px;left:0;width:16px;height:16px;cursor:pointer;border:2px solid rgba(0,0,0,.54);border-radius:50%;z-index:2}.mdl-radio.is-checked .mdl-radio__outer-circle{border:2px solid #3f51b5}.mdl-radio.is-disabled .mdl-radio__outer-circle{border:2px solid rgba(0,0,0,.26);cursor:auto}.mdl-radio__inner-circle{position:absolute;z-index:1;margin:0;top:8px;left:4px;box-sizing:border-box;width:8px;height:8px;cursor:pointer;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform;-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0);border-radius:50%;background:#3f51b5}.mdl-radio__ripple-container,.mdl-switch__ripple-container{box-sizing:border-box;z-index:2;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-radio.is-checked .mdl-radio__inner-circle{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}.mdl-radio.is-disabled .mdl-radio__inner-circle{background:rgba(0,0,0,.26);cursor:auto}.mdl-radio.is-focused .mdl-radio__inner-circle{box-shadow:0 0 0 10px rgba(0,0,0,.1)}.mdl-radio__label{cursor:pointer}.mdl-radio.is-disabled .mdl-radio__label{color:rgba(0,0,0,.26);cursor:auto}.mdl-radio__ripple-container{position:absolute;top:-9px;left:-13px;width:42px;height:42px;border-radius:50%;cursor:pointer;overflow:hidden}.mdl-radio__ripple-container .mdl-ripple{background:#3f51b5}.mdl-radio.is-disabled .mdl-radio__ripple-container{cursor:auto}.mdl-radio.is-disabled .mdl-radio__ripple-container .mdl-ripple{background:0 0}:root .mdl-slider.mdl-slider.is-upgraded,_:-ms-input-placeholder{-ms-appearance:none;height:32px;margin:0}.mdl-slider{width:calc(100% - 40px);margin:0 20px}.mdl-slider.is-upgraded{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:2px;background:0 0;user-select:none;outline:0;padding:0;color:#3f51b5;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;z-index:1;cursor:pointer}.mdl-slider.is-upgraded,.mdl-switch{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.mdl-slider.is-upgraded::-moz-focus-outer{border:0}.mdl-slider.is-upgraded::-ms-tooltip{display:none}.mdl-slider.is-upgraded::-webkit-slider-runnable-track{background:0 0}.mdl-slider.is-upgraded::-moz-range-track{background:0 0;border:none}.mdl-slider.is-upgraded::-ms-track{background:0 0;color:transparent;height:2px;width:100%;border:none}.mdl-slider.is-upgraded::-ms-fill-lower{padding:0;background:linear-gradient(to right,transparent,transparent 16px,#3f51b5 16px,#3f51b5 0)}.mdl-slider.is-upgraded::-ms-fill-upper{padding:0;background:linear-gradient(to left,transparent,transparent 16px,rgba(0,0,0,.26) 16px,rgba(0,0,0,.26) 0)}.mdl-slider.is-upgraded::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;box-sizing:border-box;border-radius:50%;background:#3f51b5;border:none;-webkit-transition:-webkit-transform .18s cubic-bezier(.4,0,.2,1),border .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1);transition:transform .18s cubic-bezier(.4,0,.2,1),border .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1)}.mdl-slider.is-upgraded::-moz-range-thumb{-moz-appearance:none;width:12px;height:12px;box-sizing:border-box;border-radius:50%;background:#3f51b5;border:none}.mdl-slider.is-upgraded:focus:not(:active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(63,81,181,.26)}.mdl-slider.is-upgraded:focus:not(:active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(63,81,181,.26)}.mdl-slider.is-upgraded:active::-webkit-slider-thumb{background:#3f51b5;-webkit-transform:scale(1.5);transform:scale(1.5)}.mdl-slider.is-upgraded:active::-moz-range-thumb{background:#3f51b5;transform:scale(1.5)}.mdl-slider.is-upgraded::-ms-thumb{width:32px;height:32px;border:none;border-radius:50%;background:#3f51b5;-ms-transform:scale(.375);transform:scale(.375);transition:transform .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1)}.mdl-slider.is-upgraded:focus:not(:active)::-ms-thumb{background:radial-gradient(circle closest-side,#3f51b5 0,#3f51b5 37.5%,rgba(63,81,181,.26) 37.5%,rgba(63,81,181,.26) 100%);-ms-transform:scale(1);transform:scale(1)}.mdl-slider.is-upgraded:active::-ms-thumb{background:#3f51b5;-ms-transform:scale(.5625);transform:scale(.5625)}.mdl-slider.is-upgraded.is-lowest-value::-webkit-slider-thumb{border:2px solid rgba(0,0,0,.26);background:0 0}.mdl-slider.is-upgraded.is-lowest-value::-moz-range-thumb{border:2px solid rgba(0,0,0,.26);background:0 0}.mdl-slider.is-upgraded.is-lowest-value~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(0,0,0,.12);background:rgba(0,0,0,.12)}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(0,0,0,.12);background:rgba(0,0,0,.12)}.mdl-slider.is-upgraded.is-lowest-value:active::-webkit-slider-thumb{border:1.6px solid rgba(0,0,0,.26);-webkit-transform:scale(1.5);transform:scale(1.5)}.mdl-slider.is-upgraded.is-lowest-value:active~.mdl-slider__background-flex>.mdl-slider__background-upper{left:9px}.mdl-slider.is-upgraded.is-lowest-value:active::-moz-range-thumb{border:1.5px solid rgba(0,0,0,.26);transform:scale(1.5)}.mdl-slider.is-upgraded.is-lowest-value::-ms-thumb{background:radial-gradient(circle closest-side,transparent 0,transparent 66.67%,rgba(0,0,0,.26) 66.67%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-ms-thumb{background:radial-gradient(circle closest-side,rgba(0,0,0,.12) 0,rgba(0,0,0,.12) 25%,rgba(0,0,0,.26) 25%,rgba(0,0,0,.26) 37.5%,rgba(0,0,0,.12) 37.5%,rgba(0,0,0,.12) 100%);-ms-transform:scale(1);transform:scale(1)}.mdl-slider.is-upgraded.is-lowest-value:active::-ms-thumb{-ms-transform:scale(.5625);transform:scale(.5625);background:radial-gradient(circle closest-side,transparent 0,transparent 77.78%,rgba(0,0,0,.26) 77.78%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-lower{background:0 0}.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-upper{margin-left:6px}.mdl-slider.is-upgraded.is-lowest-value:active::-ms-fill-upper{margin-left:9px}.mdl-slider.is-upgraded:disabled::-webkit-slider-thumb,.mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb,.mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb{-webkit-transform:scale(.667);transform:scale(.667);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded:disabled::-moz-range-thumb,.mdl-slider.is-upgraded:disabled:active::-moz-range-thumb,.mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb{transform:scale(.667);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded:disabled~.mdl-slider__background-flex>.mdl-slider__background-lower{background-color:rgba(0,0,0,.26);left:-6px}.mdl-slider.is-upgraded.is-lowest-value:disabled:active~.mdl-slider__background-flex>.mdl-slider__background-upper,.mdl-slider.is-upgraded:disabled~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb{border:3px solid rgba(0,0,0,.26);background:0 0;-webkit-transform:scale(.667);transform:scale(.667)}.mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb{border:3px solid rgba(0,0,0,.26);background:0 0;transform:scale(.667)}.mdl-slider.is-upgraded:disabled::-ms-thumb,.mdl-slider.is-upgraded:disabled:active::-ms-thumb,.mdl-slider.is-upgraded:disabled:focus::-ms-thumb{-ms-transform:scale(.25);transform:scale(.25);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb{-ms-transform:scale(.25);transform:scale(.25);background:radial-gradient(circle closest-side,transparent 0,transparent 50%,rgba(0,0,0,.26) 50%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded:disabled::-ms-fill-lower{margin-right:6px;background:linear-gradient(to right,transparent,transparent 25px,rgba(0,0,0,.26) 25px,rgba(0,0,0,.26) 0)}.mdl-slider__background-flex,.mdl-slider__container{background:0 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.mdl-slider.is-upgraded:disabled::-ms-fill-upper{margin-left:6px}.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-fill-upper{margin-left:6px}.mdl-slider__ie-container{height:18px;overflow:visible;border:none;margin:none;padding:none}.mdl-slider__container{height:18px;position:relative;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.mdl-slider__background-flex{position:absolute;height:2px;width:calc(100% - 52px);top:50%;left:0;margin:0 26px;display:flex;overflow:hidden;border:0;padding:0;-webkit-transform:translate(0,-1px);-ms-transform:translate(0,-1px);transform:translate(0,-1px)}.mdl-slider__background-lower{background:#3f51b5;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;position:relative;border:0;padding:0}.mdl-slider__background-upper{background:rgba(0,0,0,.26);-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;position:relative;border:0;padding:0;-webkit-transition:left .18s cubic-bezier(.4,0,.2,1);transition:left .18s cubic-bezier(.4,0,.2,1)}.mdl-spinner{display:inline-block;position:relative;width:28px;height:28px}.mdl-spinner:not(.is-upgraded).is-active:after{content:"Loading..."}.mdl-spinner.is-upgraded.is-active{-webkit-animation:mdl-spinner__container-rotate 1568.23529412ms linear infinite;animation:mdl-spinner__container-rotate 1568.23529412ms linear infinite}@-webkit-keyframes mdl-spinner__container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes mdl-spinner__container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.mdl-spinner__layer{position:absolute;width:100%;height:100%;opacity:0}.mdl-spinner__layer-1{border-color:#42a5f5}.mdl-spinner--single-color .mdl-spinner__layer-1{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-1{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-2{border-color:#f44336}.mdl-spinner--single-color .mdl-spinner__layer-2{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-2{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-3{border-color:#fdd835}.mdl-spinner--single-color .mdl-spinner__layer-3{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-3{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-4{border-color:#4caf50}.mdl-spinner--single-color .mdl-spinner__layer-4{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-4{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes mdl-spinner__fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes mdl-spinner__fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes mdl-spinner__layer-1-fade-in-out{100%,25%,90%,from{opacity:.99}26%,89%{opacity:0}}@keyframes mdl-spinner__layer-1-fade-in-out{100%,25%,90%,from{opacity:.99}26%,89%{opacity:0}}@-webkit-keyframes mdl-spinner__layer-2-fade-in-out{15%,51%,from{opacity:0}25%,50%{opacity:.99}}@keyframes mdl-spinner__layer-2-fade-in-out{15%,51%,from{opacity:0}25%,50%{opacity:.99}}@-webkit-keyframes mdl-spinner__layer-3-fade-in-out{40%,76%,from{opacity:0}50%,75%{opacity:.99}}@keyframes mdl-spinner__layer-3-fade-in-out{40%,76%,from{opacity:0}50%,75%{opacity:.99}}@-webkit-keyframes mdl-spinner__layer-4-fade-in-out{100%,65%,from{opacity:0}75%,90%{opacity:.99}}@keyframes mdl-spinner__layer-4-fade-in-out{100%,65%,from{opacity:0}75%,90%{opacity:.99}}.mdl-spinner__gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.mdl-spinner__gap-patch .mdl-spinner__circle{width:1000%;left:-450%}.mdl-spinner__circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.mdl-spinner__circle-clipper .mdl-spinner__circle{width:200%}.mdl-spinner__circle{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0;left:0}.mdl-spinner__left .mdl-spinner__circle{border-right-color:transparent!important;-webkit-transform:rotate(129deg);-ms-transform:rotate(129deg);transform:rotate(129deg)}.mdl-spinner.is-active .mdl-spinner__left .mdl-spinner__circle{-webkit-animation:mdl-spinner__left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__right .mdl-spinner__circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);-ms-transform:rotate(-129deg);transform:rotate(-129deg)}.mdl-spinner.is-active .mdl-spinner__right .mdl-spinner__circle{-webkit-animation:mdl-spinner__right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes mdl-spinner__left-spin{from,to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@keyframes mdl-spinner__left-spin{from,to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@-webkit-keyframes mdl-spinner__right-spin{from,to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}@keyframes mdl-spinner__right-spin{from,to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}.mdl-switch{position:relative;z-index:1;vertical-align:middle;display:inline-block;box-sizing:border-box;width:100%;height:24px;margin:0;padding:0;overflow:visible;-webkit-touch-callout:none;user-select:none}.mdl-switch.is-upgraded{padding-left:28px}.mdl-switch.is-upgraded .mdl-switch__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-switch__track{background:rgba(0,0,0,.26);position:absolute;left:0;top:5px;height:14px;width:36px;border-radius:14px;cursor:pointer}.mdl-switch.is-checked .mdl-switch__track{background:rgba(63,81,181,.5)}.mdl-switch.is-disabled .mdl-switch__track{background:rgba(0,0,0,.12);cursor:auto}.mdl-switch__thumb{background:#fafafa;position:absolute;left:0;top:2px;height:20px;width:20px;cursor:pointer;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:left}.mdl-switch__ripple-container,.mdl-switch__thumb{border-radius:50%;-webkit-transition-property:left}.mdl-switch.is-checked .mdl-switch__thumb{background:#3f51b5;left:16px;box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-switch.is-disabled .mdl-switch__thumb{background:#bdbdbd;cursor:auto}.mdl-switch__focus-helper{position:absolute;top:50%;left:50%;-webkit-transform:translate(-4px,-4px);-ms-transform:translate(-4px,-4px);transform:translate(-4px,-4px);display:inline-block;box-sizing:border-box;width:8px;height:8px;border-radius:50%;background-color:transparent}.mdl-switch.is-focused .mdl-switch__focus-helper{box-shadow:0 0 0 20px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}.mdl-switch.is-focused.is-checked .mdl-switch__focus-helper{box-shadow:0 0 0 20px rgba(63,81,181,.26);background-color:rgba(63,81,181,.26)}.mdl-switch__label{position:relative;cursor:pointer;font-size:16px;line-height:24px;margin:0;left:24px}.mdl-switch.is-disabled .mdl-switch__label{color:#bdbdbd;cursor:auto}.mdl-switch__ripple-container{position:absolute;top:-12px;left:-14px;width:48px;height:48px;cursor:pointer;overflow:hidden;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-timing-function:step-end;transition-timing-function:step-end;transition-property:left}.mdl-switch__ripple-container .mdl-ripple{background:#3f51b5}.mdl-switch.is-disabled .mdl-switch__ripple-container{cursor:auto}.mdl-switch.is-disabled .mdl-switch__ripple-container .mdl-ripple{background:0 0}.mdl-switch.is-checked .mdl-switch__ripple-container{cursor:auto;left:2px}.mdl-tabs{display:block;width:100%}.mdl-tabs__tab-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;height:48px;padding:0;margin:0;border-bottom:1px solid #e0e0e0}.mdl-tabs__tab{margin:0;border:none;padding:0 24px;float:left;position:relative;display:block;color:red;height:48px;line-height:48px;text-align:center;font-weight:500;font-size:14px;color:rgba(0,0,0,.54);overflow:hidden}.mdl-tabs.is-upgraded .mdl-tabs__tab.is-active{color:rgba(0,0,0,.87)}.mdl-tabs.is-upgraded .mdl-tabs__tab.is-active:after{height:2px;width:100%;display:block;content:" ";bottom:0;left:0;position:absolute;background:#3f51b5;-webkit-animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;-webkit-transition:all 1s cubic-bezier(.4,0,1,1);transition:all 1s cubic-bezier(.4,0,1,1)}.mdl-tabs__tab .mdl-tabs__ripple-container{display:block;position:absolute;height:100%;width:100%;left:0;top:0;z-index:1;overflow:hidden}.mdl-tabs__tab .mdl-tabs__ripple-container .mdl-ripple{background:#3f51b5}.mdl-tabs__panel{display:block}.mdl-tabs.is-upgraded .mdl-tabs__panel{display:none}.mdl-tabs.is-upgraded .mdl-tabs__panel.is-active{display:block}@-webkit-keyframes border-expand{0%{opacity:0;width:0}100%{opacity:1;width:100%}}@keyframes border-expand{0%{opacity:0;width:0}100%{opacity:1;width:100%}}.mdl-textfield{position:relative;font-size:16px;display:inline-block;box-sizing:border-box;width:300px;max-width:100%;margin:0;padding:20px 0}.mdl-textfield .mdl-button{position:absolute;bottom:20px}.mdl-textfield--align-right{text-align:right}.mdl-textfield--full-width{width:100%}.mdl-textfield--expandable{min-width:32px;width:auto;min-height:32px}.mdl-textfield__input,.mdl-textfield__label{display:block;font-size:16px;width:100%;text-align:left}.mdl-textfield__input{border:none;border-bottom:1px solid rgba(0,0,0,.12);margin:0;padding:4px 0;color:inherit}.mdl-textfield.is-disabled.is-disabled .mdl-textfield__label,.mdl-textfield__label{color:rgba(0,0,0,.26)}.mdl-textfield.is-invalid .mdl-textfield__input{border-color:#de3226;box-shadow:none}.mdl-textfield.is-disabled .mdl-textfield__input{background-color:transparent;border-bottom:1px dotted rgba(0,0,0,.12);color:rgba(0,0,0,.26)}.mdl-textfield textarea.mdl-textfield__input{display:block}.mdl-textfield__label{bottom:0;left:0;right:0;pointer-events:none;position:absolute;top:24px;overflow:hidden;white-space:nowrap}.mdl-textfield.is-dirty .mdl-textfield__label{visibility:hidden}.mdl-textfield--floating-label .mdl-textfield__label{-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-textfield--floating-label.is-dirty .mdl-textfield__label,.mdl-textfield--floating-label.is-focused .mdl-textfield__label{color:#3f51b5;font-size:12px;top:4px;visibility:visible}.mdl-textfield--floating-label.is-invalid .mdl-textfield__label,.mdl-textfield__error{color:#de3226;font-size:12px}.mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label,.mdl-textfield--floating-label.is-focused .mdl-textfield__expandable-holder .mdl-textfield__label{top:-16px}.mdl-textfield__label:after{background-color:#3f51b5;bottom:20px;content:'';height:2px;left:45%;position:absolute;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden;width:10px}.mdl-textfield__expandable-holder,.mdl-textfield__label:after{-webkit-transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-textfield.is-focused .mdl-textfield__label:after{left:0;visibility:visible;width:100%}.mdl-textfield.is-invalid .mdl-textfield__label:after{background-color:#de3226}.mdl-textfield__error{position:absolute;margin-top:3px;visibility:hidden;display:block}.mdl-textfield.is-invalid .mdl-textfield__error{visibility:visible}.mdl-textfield__expandable-holder{position:relative;margin-left:32px;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-block;max-width:.1px}.mdl-textfield.is-dirty .mdl-textfield__expandable-holder,.mdl-textfield.is-focused .mdl-textfield__expandable-holder{max-width:600px}.mdl-textfield__expandable-holder .mdl-textfield__label:after{bottom:0}.mdl-tooltip{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;will-change:transform;z-index:999;background:rgba(97,97,97,.9);border-radius:2px;color:#fff;display:inline-block;font-size:10px;font-weight:500;line-height:14px;max-width:170px;position:fixed;top:-500px;left:-500px;padding:8px;text-align:center}.mdl-tooltip.is-active{-webkit-animation:pulse 200ms cubic-bezier(0,0,.2,1) forwards;animation:pulse 200ms cubic-bezier(0,0,.2,1) forwards}.mdl-tooltip--large{line-height:14px;font-size:14px;padding:16px}@-webkit-keyframes pulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}50%{-webkit-transform:scale(.99);transform:scale(.99)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1;visibility:visible}}@keyframes pulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}50%{-webkit-transform:scale(.99);transform:scale(.99)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1;visibility:visible}}.mdl-shadow--2dp{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-shadow--3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-shadow--4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2)}.mdl-shadow--6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.2)}.mdl-shadow--8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.mdl-shadow--16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.2)}.mdl-grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;margin:0 auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.mdl-grid.mdl-grid--no-spacing{padding:0}.mdl-cell{box-sizing:border-box}.mdl-cell--top{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.mdl-cell--middle{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.mdl-cell--bottom{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.mdl-cell--stretch{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch}.mdl-grid.mdl-grid--no-spacing>.mdl-cell{margin:0}@media (max-width:479px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:100%}.mdl-cell--hide-phone{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-phone.mdl-cell--1-col-phone{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-phone.mdl-cell--1-col-phone{width:25%}.mdl-cell--2-col,.mdl-cell--2-col-phone.mdl-cell--2-col-phone{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-phone.mdl-cell--2-col-phone{width:50%}.mdl-cell--3-col,.mdl-cell--3-col-phone.mdl-cell--3-col-phone{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-phone.mdl-cell--3-col-phone{width:75%}.mdl-cell--4-col,.mdl-cell--4-col-phone.mdl-cell--4-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-phone.mdl-cell--4-col-phone{width:100%}.mdl-cell--5-col,.mdl-cell--5-col-phone.mdl-cell--5-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-phone.mdl-cell--5-col-phone{width:100%}.mdl-cell--6-col,.mdl-cell--6-col-phone.mdl-cell--6-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-phone.mdl-cell--6-col-phone{width:100%}.mdl-cell--7-col,.mdl-cell--7-col-phone.mdl-cell--7-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-phone.mdl-cell--7-col-phone{width:100%}.mdl-cell--8-col,.mdl-cell--8-col-phone.mdl-cell--8-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-phone.mdl-cell--8-col-phone{width:100%}.mdl-cell--9-col,.mdl-cell--9-col-phone.mdl-cell--9-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-phone.mdl-cell--9-col-phone{width:100%}.mdl-cell--10-col,.mdl-cell--10-col-phone.mdl-cell--10-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-phone.mdl-cell--10-col-phone{width:100%}.mdl-cell--11-col,.mdl-cell--11-col-phone.mdl-cell--11-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-phone.mdl-cell--11-col-phone{width:100%}.mdl-cell--12-col,.mdl-cell--12-col-phone.mdl-cell--12-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-phone.mdl-cell--12-col-phone{width:100%}}@media (min-width:480px) and (max-width:839px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:50%}.mdl-cell--hide-tablet{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet{width:calc(12.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet{width:12.5%}.mdl-cell--2-col,.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet{width:25%}.mdl-cell--3-col,.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet{width:calc(37.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet{width:37.5%}.mdl-cell--4-col,.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet{width:50%}.mdl-cell--5-col,.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet{width:calc(62.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet{width:62.5%}.mdl-cell--6-col,.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet{width:75%}.mdl-cell--7-col,.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet{width:calc(87.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet{width:87.5%}.mdl-cell--8-col,.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet{width:100%}.mdl-cell--9-col,.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet{width:100%}.mdl-cell--10-col,.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet{width:100%}.mdl-cell--11-col,.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet{width:100%}.mdl-cell--12-col,.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet{width:100%}}@media (min-width:840px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:33.3333333333%}.mdl-cell--hide-desktop{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop{width:calc(8.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop{width:8.3333333333%}.mdl-cell--2-col,.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop{width:calc(16.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop{width:16.6666666667%}.mdl-cell--3-col,.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop{width:25%}.mdl-cell--4-col,.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop{width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop{width:33.3333333333%}.mdl-cell--5-col,.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop{width:calc(41.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop{width:41.6666666667%}.mdl-cell--6-col,.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop{width:50%}.mdl-cell--7-col,.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop{width:calc(58.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop{width:58.3333333333%}.mdl-cell--8-col,.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop{width:calc(66.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop{width:66.6666666667%}.mdl-cell--9-col,.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop{width:75%}.mdl-cell--10-col,.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop{width:calc(83.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop{width:83.3333333333%}.mdl-cell--11-col,.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop{width:calc(91.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop{width:91.6666666667%}.mdl-cell--12-col,.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop{width:100%}}
\ No newline at end of file
diff --git a/src/admin/search.js b/src/admin/search.js
index 4c53815e48..3a6f52cfd0 100644
--- a/src/admin/search.js
+++ b/src/admin/search.js
@@ -19,7 +19,7 @@ function filterDirectories(directories) {
// exclude category.tpl, group.tpl, category-analytics.tpl
return !dir.includes('/partials/') &&
/\/.*\//.test(dir) &&
- !/manage\/(category|group|category\-analytics)$/.test(dir);
+ !/manage\/(category|group|category-analytics)$/.test(dir);
});
}
@@ -45,7 +45,7 @@ function sanitize(html) {
function simplify(translations) {
return translations
// remove all mustaches
- .replace(/(?:\{{1,2}[^\}]*?\}{1,2})/g, '')
+ .replace(/(?:\{{1,2}[^}]*?\}{1,2})/g, '')
// collapse whitespace
.replace(/(?:[ \t]*[\n\r]+[ \t]*)+/g, '\n')
.replace(/[\t ]+/g, ' ');
@@ -137,7 +137,7 @@ function initDict(language, callback) {
title = '[[admin/menu:general/dashboard]]';
} else {
title = title.match(/admin\/(.+?)\/(.+?)$/);
- title = '[[admin/menu:section-' +
+ title = '[[admin/menu:section-' +
(title[1] === 'development' ? 'advanced' : title[1]) +
']]' + (title[2] ? (' > [[admin/menu:' +
title[1] + '/' + title[2] + ']]') : '');
diff --git a/src/analytics.js b/src/analytics.js
index c6cfbeba7e..8e9871580b 100644
--- a/src/analytics.js
+++ b/src/analytics.js
@@ -25,7 +25,7 @@ Analytics.increment = function (keys, callback) {
keys.forEach(function (key) {
counters[key] = counters[key] || 0;
- ++counters[key];
+ counters[key] += 1;
});
if (typeof callback === 'function') {
@@ -34,7 +34,7 @@ Analytics.increment = function (keys, callback) {
};
Analytics.pageView = function (payload) {
- ++pageViews;
+ pageViews += 1;
if (payload.ip) {
db.sortedSetScore('ip:recent', payload.ip, function (err, score) {
@@ -42,20 +42,20 @@ Analytics.pageView = function (payload) {
return;
}
if (!score) {
- ++uniqueIPCount;
+ uniqueIPCount += 1;
}
var today = new Date();
today.setHours(today.getHours(), 0, 0, 0);
if (!score || score < today.getTime()) {
- ++uniquevisitors;
+ uniquevisitors += 1;
db.sortedSetAdd('ip:recent', Date.now(), payload.ip);
}
});
}
if (payload.path) {
- var categoryMatch = payload.path.match(isCategory),
- cid = categoryMatch ? parseInt(categoryMatch[1], 10) : null;
+ var categoryMatch = payload.path.match(isCategory);
+ var cid = categoryMatch ? parseInt(categoryMatch[1], 10) : null;
if (cid) {
Analytics.increment(['pageviews:byCid:' + cid]);
@@ -90,7 +90,7 @@ Analytics.writeData = function (callback) {
}
if (Object.keys(counters).length > 0) {
- for(var key in counters) {
+ for (var key in counters) {
if (counters.hasOwnProperty(key)) {
dbQueue.push(async.apply(db.sortedSetIncrBy, 'analytics:' + key, counters[key], today.getTime()));
delete counters[key];
@@ -107,13 +107,13 @@ Analytics.writeData = function (callback) {
};
Analytics.getHourlyStatsForSet = function (set, hour, numHours, callback) {
- var terms = {},
- hoursArr = [];
+ var terms = {};
+ var hoursArr = [];
hour = new Date(hour);
hour.setHours(hour.getHours(), 0, 0, 0);
- for (var i = 0, ii = numHours; i < ii; i++) {
+ for (var i = 0, ii = numHours; i < ii; i += 1) {
hoursArr.push(hour.getTime());
hour.setHours(hour.getHours() - 1, 0, 0, 0);
}
@@ -146,7 +146,8 @@ Analytics.getDailyStatsForSet = function (set, day, numDays, callback) {
day.setHours(0, 0, 0, 0);
async.whilst(function () {
- return numDays--;
+ numDays -= 1;
+ return numDays + 1;
}, function (next) {
Analytics.getHourlyStatsForSet(set, day.getTime() - (1000 * 60 * 60 * 24 * numDays), 24, function (err, day) {
if (err) {
@@ -181,7 +182,7 @@ Analytics.getMonthlyPageViews = function (callback) {
if (err) {
return callback(err);
}
- callback(null, {thisMonth: scores[0] || 0, lastMonth: scores[1] || 0});
+ callback(null, { thisMonth: scores[0] || 0, lastMonth: scores[1] || 0 });
});
};
@@ -197,7 +198,7 @@ Analytics.getCategoryAnalytics = function (cid, callback) {
Analytics.getErrorAnalytics = function (callback) {
async.parallel({
'not-found': async.apply(Analytics.getDailyStatsForSet, 'analytics:errors:404', Date.now(), 7),
- 'toobusy': async.apply(Analytics.getDailyStatsForSet, 'analytics:errors:503', Date.now(), 7)
+ toobusy: async.apply(Analytics.getDailyStatsForSet, 'analytics:errors:503', Date.now(), 7),
}, callback);
};
diff --git a/src/batch.js b/src/batch.js
index 19595df07e..cb3fd298a1 100644
--- a/src/batch.js
+++ b/src/batch.js
@@ -95,7 +95,7 @@ exports.processArray = function (array, process, options, callback) {
if (err) {
return next(err);
}
- start = start + batch;
+ start += batch;
if (options.interval) {
setTimeout(next, options.interval);
} else {
diff --git a/src/categories.js b/src/categories.js
index 5bb5222d38..815049ad4c 100644
--- a/src/categories.js
+++ b/src/categories.js
@@ -10,7 +10,6 @@ var plugins = require('./plugins');
var privileges = require('./privileges');
(function (Categories) {
-
require('./categories/data')(Categories);
require('./categories/create')(Categories);
require('./categories/delete')(Categories);
@@ -49,7 +48,7 @@ var privileges = require('./privileges');
},
isIgnored: function (next) {
Categories.isIgnored([data.cid], data.uid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -58,11 +57,11 @@ var privileges = require('./privileges');
category.isIgnored = results.isIgnored[0];
category.topic_count = results.topicCount;
- plugins.fireHook('filter:category.get', {category: category, uid: data.uid}, next);
+ plugins.fireHook('filter:category.get', { category: category, uid: data.uid }, next);
},
function (data, next) {
next(null, data.category);
- }
+ },
], callback);
};
@@ -73,7 +72,7 @@ var privileges = require('./privileges');
Categories.getPageCount = function (cid, uid, callback) {
async.parallel({
topicCount: async.apply(Categories.getCategoryField, cid, 'topic_count'),
- settings: async.apply(user.getSettings, uid)
+ settings: async.apply(user.getSettings, uid),
}, function (err, results) {
if (err) {
return callback(err);
@@ -107,7 +106,7 @@ var privileges = require('./privileges');
},
function (cids, next) {
Categories.getCategories(cids, uid, next);
- }
+ },
], callback);
};
@@ -146,7 +145,7 @@ var privileges = require('./privileges');
},
hasRead: function (next) {
Categories.hasReadCategories(cids, uid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -214,7 +213,7 @@ var privileges = require('./privileges');
});
if (!parentCids.length) {
- return callback(null, cids.map(function () {return null;}));
+ return callback(null, cids.map(function () { return null; }));
}
Categories.getCategoriesData(parentCids, next);
@@ -224,13 +223,13 @@ var privileges = require('./privileges');
return parentData[parentCids.indexOf(parseInt(category.parentCid, 10))];
});
next(null, parentData);
- }
+ },
], callback);
};
Categories.getChildren = function (cids, uid, callback) {
var categories = cids.map(function (cid) {
- return {cid: cid};
+ return { cid: cid };
});
async.each(categories, function (category, next) {
@@ -266,7 +265,7 @@ var privileges = require('./privileges');
async.each(category.children, function (child, next) {
getChildrenRecursive(child, uid, next);
}, next);
- }
+ },
], callback);
}
@@ -293,9 +292,12 @@ var privileges = require('./privileges');
* @param parentCid {number} start from 0 to build full tree
*/
Categories.getTree = function (categories, parentCid) {
- var tree = [], i = 0, len = categories.length, category;
+ var tree = [];
+ var i = 0;
+ var len = categories.length;
+ var category;
- for (i; i < len; ++i) {
+ for (i; i < len; i += 1) {
category = categories[i];
if (!category.hasOwnProperty('parentCid') || category.parentCid === null) {
category.parentCid = 0;
@@ -357,9 +359,7 @@ var privileges = require('./privileges');
return uid && !isIgnoring[index];
});
next(null, readingUids);
- }
+ },
], callback);
};
-
-
}(exports));
diff --git a/src/categories/activeusers.js b/src/categories/activeusers.js
index 15673939ae..5ce28c4b11 100644
--- a/src/categories/activeusers.js
+++ b/src/categories/activeusers.js
@@ -5,7 +5,6 @@ var posts = require('../posts');
var db = require('../database');
module.exports = function (Categories) {
-
Categories.getActiveUsers = function (cid, callback) {
async.waterfall([
function (next) {
@@ -22,7 +21,7 @@ module.exports = function (Categories) {
});
next(null, uids);
- }
+ },
], callback);
};
};
diff --git a/src/categories/create.js b/src/categories/create.js
index ba12fc31b0..140b23dc9d 100644
--- a/src/categories/create.js
+++ b/src/categories/create.js
@@ -9,7 +9,6 @@ var privileges = require('../privileges');
var utils = require('../../public/src/utils');
module.exports = function (Categories) {
-
Categories.create = function (data, callback) {
var category;
var parentCid = data.parentCid ? data.parentCid : 0;
@@ -40,11 +39,11 @@ module.exports = function (Categories) {
order: order,
link: '',
numRecentReplies: 1,
- class: ( data.class ? data.class : 'col-md-3 col-xs-6' ),
- imageClass: 'cover'
+ class: (data.class ? data.class : 'col-md-3 col-xs-6'),
+ imageClass: 'cover',
};
- plugins.fireHook('filter:category.create', {category: category, data: data}, next);
+ plugins.fireHook('filter:category.create', { category: category, data: data }, next);
},
function (data, next) {
category = data.category;
@@ -63,7 +62,7 @@ module.exports = function (Categories) {
async.apply(db.sortedSetAdd, 'cid:' + parentCid + ':children', category.order, category.cid),
async.apply(privileges.categories.give, defaultPrivileges, category.cid, 'administrators'),
async.apply(privileges.categories.give, defaultPrivileges, category.cid, 'registered-users'),
- async.apply(privileges.categories.give, ['find', 'read', 'topics:read'], category.cid, 'guests')
+ async.apply(privileges.categories.give, ['find', 'read', 'topics:read'], category.cid, 'guests'),
], next);
},
function (results, next) {
@@ -75,7 +74,7 @@ module.exports = function (Categories) {
function (category, next) {
plugins.fireHook('action:category.create', {category: category});
next(null, category);
- }
+ },
], callback);
};
@@ -93,7 +92,7 @@ module.exports = function (Categories) {
function (next) {
async.parallel({
source: async.apply(db.getObject, 'category:' + fromCid),
- destination: async.apply(db.getObject, 'category:' + toCid)
+ destination: async.apply(db.getObject, 'category:' + toCid),
}, next);
},
function (results, next) {
@@ -132,7 +131,7 @@ module.exports = function (Categories) {
},
function (results, next) {
Categories.copyPrivilegesFrom(fromCid, toCid, next);
- }
+ },
], function (err) {
callback(err, destination);
});
@@ -176,8 +175,7 @@ module.exports = function (Categories) {
async.eachSeries(members, function (member, next) {
groups.join('cid:' + toCid + ':privileges:' + privilege, member, next);
}, next);
- }
+ },
], callback);
}
-
};
diff --git a/src/categories/data.js b/src/categories/data.js
index ccc31343d9..25b7021610 100644
--- a/src/categories/data.js
+++ b/src/categories/data.js
@@ -7,7 +7,6 @@ var winston = require('winston');
var db = require('../database');
module.exports = function (Categories) {
-
Categories.getCategoryData = function (cid, callback) {
db.getObject('category:' + cid, function (err, category) {
if (err) {
@@ -46,11 +45,13 @@ module.exports = function (Categories) {
category.disabled = category.hasOwnProperty('disabled') ? parseInt(category.disabled, 10) === 1 : undefined;
category.icon = category.icon || 'hidden';
if (category.hasOwnProperty('post_count')) {
- category.post_count = category.totalPostCount = category.post_count || 0;
+ category.post_count = category.post_count || 0;
+ category.totalPostCount = category.post_count;
}
if (category.hasOwnProperty('topic_count')) {
- category.topic_count = category.totalTopicCount = category.topic_count || 0;
+ category.topic_count = category.topic_count || 0;
+ category.totalTopicCount = category.topic_count;
}
if (category.image) {
@@ -96,7 +97,7 @@ module.exports = function (Categories) {
async.apply(db.getSortedSetRange, 'categories:cid', 0, -1),
function (cids, next) {
Categories.getCategoriesFields(cids, fields, next);
- }
+ },
], callback);
};
@@ -111,5 +112,4 @@ module.exports = function (Categories) {
Categories.incrementCategoryFieldBy = function (cid, field, value, callback) {
db.incrObjectFieldBy('category:' + cid, field, value, callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/categories/delete.js b/src/categories/delete.js
index cb0d30a09d..b9ddeca6a4 100644
--- a/src/categories/delete.js
+++ b/src/categories/delete.js
@@ -9,7 +9,6 @@ var groups = require('../groups');
var privileges = require('../privileges');
module.exports = function (Categories) {
-
Categories.purge = function (cid, uid, callback) {
async.waterfall([
function (next) {
@@ -17,7 +16,7 @@ module.exports = function (Categories) {
async.eachLimit(tids, 10, function (tid, next) {
topics.purgePostsAndTopic(tid, uid, next);
}, next);
- }, {alwaysStartAt: 0}, next);
+ }, { alwaysStartAt: 0 }, next);
},
function (next) {
Categories.getPinnedTids('cid:' + cid + ':tids:pinned', 0, -1, next);
@@ -33,7 +32,7 @@ module.exports = function (Categories) {
function (next) {
plugins.fireHook('action:category.delete', {cid: cid, uid: uid});
next();
- }
+ },
], callback);
};
@@ -55,14 +54,14 @@ module.exports = function (Categories) {
'cid:' + cid + ':ignorers',
'cid:' + cid + ':children',
'cid:' + cid + ':tag:whitelist',
- 'category:' + cid
+ 'category:' + cid,
], next);
},
function (next) {
async.each(privileges.privilegeList, function (privilege, next) {
groups.destroy('cid:' + cid + ':privileges:' + privilege, next);
}, next);
- }
+ },
], function (err) {
callback(err);
});
@@ -77,7 +76,7 @@ module.exports = function (Categories) {
},
children: function (next) {
db.getSortedSetRange('cid:' + cid + ':children', 0, -1, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -94,14 +93,14 @@ module.exports = function (Categories) {
},
function (next) {
db.sortedSetAdd('cid:0:children', cid, cid, next);
- }
+ },
], next);
}, next);
- }
+ },
], next);
- }
+ },
], function (err) {
callback(err);
});
}
-};
\ No newline at end of file
+};
diff --git a/src/categories/recentreplies.js b/src/categories/recentreplies.js
index 831991d61a..c38fec527e 100644
--- a/src/categories/recentreplies.js
+++ b/src/categories/recentreplies.js
@@ -14,7 +14,6 @@ var batch = require('../batch');
module.exports = function (Categories) {
-
Categories.getRecentReplies = function (cid, uid, count, callback) {
if (!parseInt(count, 10)) {
return callback(null, []);
@@ -28,8 +27,8 @@ module.exports = function (Categories) {
privileges.posts.filter('read', pids, uid, next);
},
function (pids, next) {
- posts.getPostSummaryByPids(pids, uid, {stripTags: true}, next);
- }
+ posts.getPostSummaryByPids(pids, uid, { stripTags: true }, next);
+ },
], callback);
};
@@ -40,7 +39,7 @@ module.exports = function (Categories) {
},
numRecentReplies: function (next) {
db.getObjectField('category:' + cid, 'numRecentReplies', next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -61,7 +60,7 @@ module.exports = function (Categories) {
},
function (next) {
db.sortedSetAdd('cid:' + cid + ':recent_tids', Date.now(), tid, next);
- }
+ },
], callback);
});
};
@@ -95,7 +94,7 @@ module.exports = function (Categories) {
bubbleUpChildrenPosts(categoryData);
next();
- }
+ },
], callback);
};
@@ -131,17 +130,19 @@ module.exports = function (Categories) {
results.teasers.forEach(function (teaser, index) {
if (teaser) {
teaser.cid = topicData[index].cid;
- teaser.parentCid = parseInt(parentCids[teaser.cid]) || 0;
- teaser.tid = teaser.uid = teaser.user.uid = undefined;
+ teaser.parentCid = parseInt(parentCids[teaser.cid], 10) || 0;
+ teaser.tid = undefined;
+ teaser.uid = undefined;
+ teaser.user.uid = undefined;
teaser.topic = {
slug: topicData[index].slug,
- title: validator.escape(String(topicData[index].title))
+ title: validator.escape(String(topicData[index].title)),
};
}
});
results.teasers = results.teasers.filter(Boolean);
next(null, results.teasers);
- }
+ },
], callback);
}
@@ -211,9 +212,9 @@ module.exports = function (Categories) {
},
function (next) {
db.sortedSetAdd('cid:' + cid + ':pids', timestamps, pids, next);
- }
+ },
], next);
- }
+ },
], next);
}, function (err) {
if (err) {
@@ -238,7 +239,7 @@ module.exports = function (Categories) {
},
function (next) {
db.incrObjectFieldBy('category:' + newCid, 'post_count', postCount, next);
- }
+ },
], function (err) {
if (err) {
winston.error(err.message);
@@ -248,4 +249,3 @@ module.exports = function (Categories) {
}
};
-
diff --git a/src/categories/topics.js b/src/categories/topics.js
index 9e477e51ef..a346307e9c 100644
--- a/src/categories/topics.js
+++ b/src/categories/topics.js
@@ -7,7 +7,6 @@ var topics = require('../topics');
var plugins = require('../plugins');
module.exports = function (Categories) {
-
Categories.getCategoryTopics = function (data, callback) {
async.waterfall([
function (next) {
@@ -21,23 +20,23 @@ module.exports = function (Categories) {
},
function (topics, next) {
if (!Array.isArray(topics) || !topics.length) {
- return next(null, {topics: [], uid: data.uid});
+ return next(null, { topics: [], uid: data.uid });
}
- for (var i = 0; i < topics.length; ++i) {
+ for (var i = 0; i < topics.length; i += 1) {
topics[i].index = data.start + i;
}
- plugins.fireHook('filter:category.topics.get', {cid: data.cid, topics: topics, uid: data.uid}, next);
+ plugins.fireHook('filter:category.topics.get', { cid: data.cid, topics: topics, uid: data.uid }, next);
},
function (results, next) {
- next(null, {topics: results.topics, nextStart: data.stop + 1});
- }
+ next(null, { topics: results.topics, nextStart: data.stop + 1 });
+ },
], callback);
};
Categories.getTopicIds = function (cid, set, reverse, start, stop, callback) {
- var pinnedTids;
+ var pinnedTids;
var pinnedCount;
var totalPinnedCount;
@@ -65,7 +64,7 @@ module.exports = function (Categories) {
stop = stop === -1 ? stop : start + normalTidsToGet - 1;
if (Array.isArray(set)) {
- db[reverse ? 'getSortedSetRevIntersect' : 'getSortedSetIntersect']({sets: set, start: start, stop: stop}, next);
+ db[reverse ? 'getSortedSetRevIntersect' : 'getSortedSetIntersect']({ sets: set, start: start, stop: stop }, next);
} else {
db[reverse ? 'getSortedSetRevRange' : 'getSortedSetRange'](set, start, stop, next);
}
@@ -76,7 +75,7 @@ module.exports = function (Categories) {
});
next(null, pinnedTids.concat(normalTids));
- }
+ },
], callback);
};
@@ -132,15 +131,14 @@ module.exports = function (Categories) {
},
function (next) {
db.sortedSetIncrBy('cid:' + cid + ':tids:posts', 1, postData.tid, next);
- }
+ },
], function (err) {
next(err);
});
},
function (next) {
Categories.updateRecentTid(cid, postData.tid, next);
- }
+ },
], callback);
};
-
};
diff --git a/src/categories/unread.js b/src/categories/unread.js
index 3a1ba27277..1ef6ee40b5 100644
--- a/src/categories/unread.js
+++ b/src/categories/unread.js
@@ -1,11 +1,8 @@
+'use strict';
-"use strict";
-
-var async = require('async');
var db = require('../database');
module.exports = function (Categories) {
-
Categories.markAsRead = function (cids, uid, callback) {
callback = callback || function () {};
if (!Array.isArray(cids) || !cids.length) {
@@ -43,7 +40,7 @@ module.exports = function (Categories) {
Categories.hasReadCategories = function (cids, uid, callback) {
var sets = [];
- for (var i = 0, ii = cids.length; i < ii; i++) {
+ for (var i = 0, ii = cids.length; i < ii; i += 1) {
sets.push('cid:' + cids[i] + ':read_by_uid');
}
@@ -53,5 +50,4 @@ module.exports = function (Categories) {
Categories.hasReadCategory = function (cid, uid, callback) {
db.isSetMember('cid:' + cid + ':read_by_uid', uid, callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/categories/update.js b/src/categories/update.js
index afaad6d974..04bf0e2235 100644
--- a/src/categories/update.js
+++ b/src/categories/update.js
@@ -10,9 +10,7 @@ var translator = require('../../public/src/modules/translator');
var plugins = require('../plugins');
module.exports = function (Categories) {
-
Categories.update = function (modified, callback) {
-
var cids = Object.keys(modified);
async.each(cids, function (cid, next) {
@@ -43,7 +41,7 @@ module.exports = function (Categories) {
}
},
function (next) {
- plugins.fireHook('filter:category.update', {category: modifiedFields}, next);
+ plugins.fireHook('filter:category.update', { category: modifiedFields }, next);
},
function (categoryData, next) {
category = categoryData.category;
@@ -59,9 +57,9 @@ module.exports = function (Categories) {
}, next);
},
function (next) {
- plugins.fireHook('action:category.update', {cid: cid, modified: category});
+ plugins.fireHook('action:category.update', { cid: cid, modified: category });
next();
- }
+ },
], callback);
}
@@ -84,7 +82,7 @@ module.exports = function (Categories) {
} else {
next();
}
- }
+ },
], callback);
}
@@ -108,9 +106,9 @@ module.exports = function (Categories) {
},
function (next) {
db.setObjectField('category:' + cid, 'parentCid', newParent, next);
- }
+ },
], next);
- }
+ },
], function (err) {
callback(err);
});
@@ -131,7 +129,7 @@ module.exports = function (Categories) {
return index;
});
db.sortedSetAdd('cid:' + cid + ':tag:whitelist', scores, tags, next);
- }
+ },
], callback);
}
@@ -148,9 +146,9 @@ module.exports = function (Categories) {
function (next) {
parentCid = parseInt(parentCid, 10) || 0;
db.sortedSetAdd('cid:' + parentCid + ':children', order, cid, next);
- }
+ },
], next);
- }
+ },
], function (err) {
callback(err);
});
@@ -163,8 +161,7 @@ module.exports = function (Categories) {
},
function (parsedDescription, next) {
Categories.setCategoryField(cid, 'descriptionParsed', parsedDescription, next);
- }
+ },
], callback);
};
-
};
diff --git a/src/controllers/accounts.js b/src/controllers/accounts.js
index 2c99a981c3..a7aa1716b4 100644
--- a/src/controllers/accounts.js
+++ b/src/controllers/accounts.js
@@ -10,7 +10,7 @@ var accountsController = {
posts: require('./accounts/posts'),
notifications: require('./accounts/notifications'),
chats: require('./accounts/chats'),
- session: require('./accounts/session')
+ session: require('./accounts/session'),
};
module.exports = accountsController;
diff --git a/src/controllers/accounts/chats.js b/src/controllers/accounts/chats.js
index c951bafdbd..8ffac0a4dc 100644
--- a/src/controllers/accounts/chats.js
+++ b/src/controllers/accounts/chats.js
@@ -21,7 +21,7 @@ chatsController.get = function (req, res, callback) {
function (next) {
async.parallel({
uid: async.apply(user.getUidByUserslug, req.params.userslug),
- username: async.apply(user.getUsernameByUserslug, req.params.userslug)
+ username: async.apply(user.getUsernameByUserslug, req.params.userslug),
}, next);
},
function (results, next) {
@@ -45,7 +45,7 @@ chatsController.get = function (req, res, callback) {
nextStart: recentChats.nextStart,
allowed: true,
title: '[[pages:chats]]',
- breadcrumbs: helpers.buildBreadcrumbs([{text: username, url: '/user/' + req.params.userslug}, {text: '[[pages:chats]]'}])
+ breadcrumbs: helpers.buildBreadcrumbs([{ text: username, url: '/user/' + req.params.userslug }, { text: '[[pages:chats]]' }]),
});
}
messaging.isUserInRoom(req.uid, req.params.roomid, next);
@@ -62,10 +62,10 @@ chatsController.get = function (req, res, callback) {
callerUid: req.uid,
uid: uid,
roomId: req.params.roomid,
- isNew: false
- })
+ isNew: false,
+ }),
}, next);
- }
+ },
], function (err, data) {
if (err) {
return callback(err);
@@ -87,9 +87,9 @@ chatsController.get = function (req, res, callback) {
room.usernames = messaging.generateUsernames(room.users, req.uid);
room.title = room.roomName || room.usernames || '[[pages:chats]]';
room.breadcrumbs = helpers.buildBreadcrumbs([
- {text: username, url: '/user/' + req.params.userslug},
- {text: '[[pages:chats]]', url: '/user/' + req.params.userslug + '/chats'},
- {text: room.roomName || room.usernames || '[[pages:chats]]'}
+ { text: username, url: '/user/' + req.params.userslug },
+ { text: '[[pages:chats]]', url: '/user/' + req.params.userslug + '/chats' },
+ { text: room.roomName || room.usernames || '[[pages:chats]]' },
]);
room.maximumUsersInChatRoom = parseInt(meta.config.maximumUsersInChatRoom, 10) || 0;
room.maximumChatMessageLength = parseInt(meta.config.maximumChatMessageLength, 10) || 1000;
@@ -114,5 +114,4 @@ chatsController.redirectToChat = function (req, res, next) {
};
-
-module.exports = chatsController;
\ No newline at end of file
+module.exports = chatsController;
diff --git a/src/controllers/accounts/edit.js b/src/controllers/accounts/edit.js
index 58409060e4..25f1112556 100644
--- a/src/controllers/accounts/edit.js
+++ b/src/controllers/accounts/edit.js
@@ -25,7 +25,7 @@ editController.get = function (req, res, callback) {
userData.maximumSignatureLength = parseInt(meta.config.maximumSignatureLength, 10) || 255;
userData.maximumAboutMeLength = parseInt(meta.config.maximumAboutMeLength, 10) || 1000;
userData.maximumProfileImageSize = parseInt(meta.config.maximumProfileImageSize, 10);
- userData.allowProfileImageUploads = parseInt(meta.config.allowProfileImageUploads) === 1;
+ userData.allowProfileImageUploads = parseInt(meta.config.allowProfileImageUploads, 10) === 1;
userData.allowAccountDelete = parseInt(meta.config.allowAccountDelete, 10) === 1;
userData.profileImageDimension = parseInt(meta.config.profileImageDimension, 10) || 128;
@@ -37,12 +37,15 @@ editController.get = function (req, res, callback) {
});
userData.title = '[[pages:account/edit, ' + userData.username + ']]';
- userData.breadcrumbs = helpers.buildBreadcrumbs([{
- text: userData.username,
- url: '/user/' + userData.userslug
- }, {
- text: '[[user:edit]]'
- }]);
+ userData.breadcrumbs = helpers.buildBreadcrumbs([
+ {
+ text: userData.username,
+ url: '/user/' + userData.userslug,
+ },
+ {
+ text: '[[user:edit]]',
+ },
+ ]);
userData.editButtons = [];
plugins.fireHook('filter:user.account.edit', userData, function (err, userData) {
@@ -81,15 +84,19 @@ function renderRoute(name, req, res, next) {
}
userData.title = '[[pages:account/edit/' + name + ', ' + userData.username + ']]';
- userData.breadcrumbs = helpers.buildBreadcrumbs([{
- text: userData.username,
- url: '/user/' + userData.userslug
- }, {
- text: '[[user:edit]]',
- url: '/user/' + userData.userslug + '/edit'
- }, {
- text: '[[user:' + name + ']]'
- }]);
+ userData.breadcrumbs = helpers.buildBreadcrumbs([
+ {
+ text: userData.username,
+ url: '/user/' + userData.userslug,
+ },
+ {
+ text: '[[user:edit]]',
+ url: '/user/' + userData.userslug + '/edit',
+ },
+ {
+ text: '[[user:' + name + ']]',
+ },
+ ]);
res.render('account/edit/' + name, userData);
});
@@ -107,7 +114,7 @@ function getUserData(req, next, callback) {
return callback();
}
db.getObjectField('user:' + userData.uid, 'password', next);
- }
+ },
], function (err, password) {
if (err) {
return callback(err);
@@ -138,7 +145,7 @@ editController.uploadPicture = function (req, res, next) {
}
user.uploadPicture(updateUid, userPhoto, next);
- }
+ },
], function (err, image) {
fs.unlink(userPhoto.path, function (err) {
if (err) {
@@ -151,7 +158,7 @@ editController.uploadPicture = function (req, res, next) {
res.json([{
name: userPhoto.name,
- url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url
+ url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url,
}]);
});
};
@@ -161,14 +168,14 @@ editController.uploadCoverPicture = function (req, res, next) {
user.updateCoverPicture({
file: req.files.files[0],
- uid: params.uid
+ uid: params.uid,
}, function (err, image) {
if (err) {
return next(err);
}
res.json([{
- url: image.url
+ url: image.url,
}]);
});
};
diff --git a/src/controllers/accounts/follow.js b/src/controllers/accounts/follow.js
index 7d1e91b5e2..eac274136d 100644
--- a/src/controllers/accounts/follow.js
+++ b/src/controllers/accounts/follow.js
@@ -36,7 +36,7 @@ function getFollow(tpl, name, req, res, callback) {
}
var method = name === 'following' ? 'getFollowing' : 'getFollowers';
user[method](userData.uid, start, stop, next);
- }
+ },
], function (err, users) {
if (err) {
return callback(err);
@@ -47,10 +47,10 @@ function getFollow(tpl, name, req, res, callback) {
var count = name === 'following' ? userData.followingCount : userData.followerCount;
var pageCount = Math.ceil(count / resultsPerPage);
userData.pagination = pagination.create(page, pageCount);
- userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:' + name + ']]'}]);
+ userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:' + name + ']]' }]);
res.render(tpl, userData);
});
}
-module.exports = followController;
\ No newline at end of file
+module.exports = followController;
diff --git a/src/controllers/accounts/groups.js b/src/controllers/accounts/groups.js
index 038d63de1d..650c510fc9 100644
--- a/src/controllers/accounts/groups.js
+++ b/src/controllers/accounts/groups.js
@@ -38,7 +38,7 @@ groupsController.get = function (req, res, callback) {
group.members = members[index];
});
next();
- }
+ },
], function (err) {
if (err) {
return callback(err);
@@ -46,9 +46,9 @@ groupsController.get = function (req, res, callback) {
userData.groups = groupsData;
userData.title = '[[pages:account/groups, ' + userData.username + ']]';
- userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[global:header.groups]]'}]);
+ userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[global:header.groups]]' }]);
res.render('account/groups', userData);
});
};
-module.exports = groupsController;
\ No newline at end of file
+module.exports = groupsController;
diff --git a/src/controllers/accounts/helpers.js b/src/controllers/accounts/helpers.js
index e2bc008de8..2130fbf078 100644
--- a/src/controllers/accounts/helpers.js
+++ b/src/controllers/accounts/helpers.js
@@ -52,14 +52,14 @@ helpers.getUserDataByUserSlug = function (userslug, callerUID, callback) {
plugins.fireHook('filter:user.profileLinks', [], next);
},
profile_menu: function (next) {
- plugins.fireHook('filter:user.profileMenu', {uid: uid, callerUID: callerUID, links: []}, next);
+ plugins.fireHook('filter:user.profileMenu', { uid: uid, callerUID: callerUID, links: [] }, next);
},
groups: function (next) {
groups.getUserGroups([uid], next);
},
sso: function (next) {
- plugins.fireHook('filter:auth.list', {uid: uid, associations: []}, next);
- }
+ plugins.fireHook('filter:auth.list', { uid: uid, associations: [] }, next);
+ },
}, next);
},
function (results, next) {
@@ -150,7 +150,7 @@ helpers.getUserDataByUserSlug = function (userslug, callerUID, callback) {
userData['email:disableEdit'] = !userData.isAdmin && parseInt(meta.config['email:disableEdit'], 10) === 1;
next(null, userData);
- }
+ },
], callback);
};
diff --git a/src/controllers/accounts/info.js b/src/controllers/accounts/info.js
index 77ab2f275e..e852ebc3df 100644
--- a/src/controllers/accounts/info.js
+++ b/src/controllers/accounts/info.js
@@ -23,9 +23,9 @@ infoController.get = function (req, res, callback) {
history: async.apply(user.getModerationHistory, userData.uid),
sessions: async.apply(user.auth.getSessions, userData.uid, req.sessionID),
usernames: async.apply(user.getHistory, 'user:' + userData.uid + ':usernames'),
- emails: async.apply(user.getHistory, 'user:' + userData.uid + ':emails')
+ emails: async.apply(user.getHistory, 'user:' + userData.uid + ':emails'),
}, next);
- }
+ },
], function (err, data) {
if (err) {
return callback(err);
@@ -36,10 +36,10 @@ infoController.get = function (req, res, callback) {
userData.usernames = data.usernames;
userData.emails = data.emails;
userData.title = '[[pages:account/info]]';
- userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:account_info]]'}]);
+ userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:account_info]]' }]);
res.render('account/info', userData);
});
};
-module.exports = infoController;
\ No newline at end of file
+module.exports = infoController;
diff --git a/src/controllers/accounts/notifications.js b/src/controllers/accounts/notifications.js
index 50a5a5913b..6184ec056d 100644
--- a/src/controllers/accounts/notifications.js
+++ b/src/controllers/accounts/notifications.js
@@ -14,7 +14,7 @@ notificationsController.get = function (req, res, next) {
notifications: notifications,
nextStart: 40,
title: '[[pages:notifications]]',
- breadcrumbs: helpers.buildBreadcrumbs([{text: '[[pages:notifications]]'}])
+ breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[pages:notifications]]' }]),
});
});
};
diff --git a/src/controllers/accounts/posts.js b/src/controllers/accounts/posts.js
index 9875387997..2f603b8015 100644
--- a/src/controllers/accounts/posts.js
+++ b/src/controllers/accounts/posts.js
@@ -18,44 +18,44 @@ var templateToData = {
set: 'bookmarks',
type: 'posts',
noItemsFoundKey: '[[topic:bookmarks.has_no_bookmarks]]',
- crumb: '[[user:bookmarks]]'
+ crumb: '[[user:bookmarks]]',
},
'account/posts': {
set: 'posts',
type: 'posts',
noItemsFoundKey: '[[user:has_no_posts]]',
- crumb: '[[global:posts]]'
+ crumb: '[[global:posts]]',
},
'account/upvoted': {
set: 'upvote',
type: 'posts',
noItemsFoundKey: '[[user:has_no_upvoted_posts]]',
- crumb: '[[global:upvoted]]'
+ crumb: '[[global:upvoted]]',
},
'account/downvoted': {
set: 'downvote',
type: 'posts',
noItemsFoundKey: '[[user:has_no_downvoted_posts]]',
- crumb: '[[global:downvoted]]'
+ crumb: '[[global:downvoted]]',
},
'account/best': {
set: 'posts:votes',
type: 'posts',
noItemsFoundKey: '[[user:has_no_voted_posts]]',
- crumb: '[[global:best]]'
+ crumb: '[[global:best]]',
},
'account/watched': {
set: 'followed_tids',
type: 'topics',
noItemsFoundKey: '[[user:has_no_watched_topics]]',
- crumb: '[[user:watched]]'
+ crumb: '[[user:watched]]',
},
'account/topics': {
set: 'topics',
type: 'topics',
noItemsFoundKey: '[[user:has_no_topics]]',
- crumb: '[[global:topics]]'
- }
+ crumb: '[[global:topics]]',
+ },
};
postsController.getBookmarks = function (req, res, next) {
@@ -101,7 +101,7 @@ function getFromUserSet(template, req, res, callback) {
},
userData: function (next) {
accountHelpers.getUserDataByUserSlug(req.params.userslug, req.uid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -127,9 +127,9 @@ function getFromUserSet(template, req, res, callback) {
var start = (page - 1) * itemsPerPage;
var stop = start + itemsPerPage - 1;
data.method(setName, req.uid, start, stop, next);
- }
+ },
}, next);
- }
+ },
], function (err, results) {
if (err) {
return callback(err);
@@ -143,10 +143,10 @@ function getFromUserSet(template, req, res, callback) {
userData.noItemsFoundKey = data.noItemsFoundKey;
userData.title = '[[pages:' + data.template + ', ' + userData.username + ']]';
- userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: data.crumb}]);
+ userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: data.crumb }]);
res.render(data.template, userData);
});
}
-module.exports = postsController;
\ No newline at end of file
+module.exports = postsController;
diff --git a/src/controllers/accounts/profile.js b/src/controllers/accounts/profile.js
index e95fedd0d1..1fc092a5f4 100644
--- a/src/controllers/accounts/profile.js
+++ b/src/controllers/accounts/profile.js
@@ -62,7 +62,7 @@ profileController.get = function (req, res, callback) {
} else {
next();
}
- }
+ },
}, next);
},
function (results, next) {
@@ -76,7 +76,7 @@ profileController.get = function (req, res, callback) {
userData.hasPrivateChat = results.hasPrivateChat;
userData.aboutme = results.aboutme;
userData.nextStart = results.posts.nextStart;
- userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username}]);
+ userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username }]);
userData.title = userData.username;
var pageCount = Math.ceil(userData.postcount / itemsPerPage);
userData.pagination = pagination.create(page, pageCount, req.query);
@@ -92,21 +92,21 @@ profileController.get = function (req, res, callback) {
res.locals.metaTags = [
{
- name: "title",
- content: userData.fullname || userData.username
+ name: 'title',
+ content: userData.fullname || userData.username,
},
{
- name: "description",
- content: plainAboutMe
+ name: 'description',
+ content: plainAboutMe,
},
{
property: 'og:title',
- content: userData.fullname || userData.username
+ content: userData.fullname || userData.username,
},
{
property: 'og:description',
- content: plainAboutMe
- }
+ content: plainAboutMe,
+ },
];
if (userData.picture) {
@@ -114,12 +114,12 @@ profileController.get = function (req, res, callback) {
{
property: 'og:image',
content: userData.picture,
- noEscape: true
+ noEscape: true,
},
{
- property: "og:image:url",
+ property: 'og:image:url',
content: userData.picture,
- noEscape: true
+ noEscape: true,
}
);
}
@@ -127,8 +127,8 @@ profileController.get = function (req, res, callback) {
return group && group.name === userData.groupTitle;
});
- plugins.fireHook('filter:user.account', {userData: userData, uid: req.uid}, next);
- }
+ plugins.fireHook('filter:user.account', { userData: userData, uid: req.uid }, next);
+ },
], function (err, results) {
if (err) {
return callback(err);
@@ -137,4 +137,4 @@ profileController.get = function (req, res, callback) {
});
};
-module.exports = profileController;
\ No newline at end of file
+module.exports = profileController;
diff --git a/src/controllers/accounts/session.js b/src/controllers/accounts/session.js
index e8123820ee..809cdb6dad 100644
--- a/src/controllers/accounts/session.js
+++ b/src/controllers/accounts/session.js
@@ -42,14 +42,13 @@ sessionController.revoke = function (req, res, next) {
}
user.auth.revokeSession(_id, uid, next);
- }
+ },
], function (err) {
if (err) {
return res.status(500).send(err.message);
- } else {
- return res.sendStatus(200);
}
+ return res.sendStatus(200);
});
};
-module.exports = sessionController;
\ No newline at end of file
+module.exports = sessionController;
diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js
index 68cef8be5f..edd5d58282 100644
--- a/src/controllers/accounts/settings.js
+++ b/src/controllers/accounts/settings.js
@@ -39,7 +39,7 @@ settingsController.get = function (req, res, callback) {
},
soundsMapping: function (next) {
meta.sounds.getUserSoundMap(userData.uid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -53,7 +53,7 @@ settingsController.get = function (req, res, callback) {
'chat-outgoing',
];
var aliases = {
- 'notification': 'notificationSound',
+ notification: 'notificationSound',
'chat-incoming': 'incomingChatSound',
'chat-outgoing': 'outgoingChatSound',
};
@@ -93,38 +93,38 @@ settingsController.get = function (req, res, callback) {
userData.customSettings = data.customSettings;
userData.disableEmailSubscriptions = parseInt(meta.config.disableEmailSubscriptions, 10) === 1;
next();
- }
+ },
], function (err) {
if (err) {
return callback(err);
}
userData.dailyDigestFreqOptions = [
- { value: 'off', name: '[[user:digest_off]]', selected: 'off' === userData.settings.dailyDigestFreq },
- { value: 'day', name: '[[user:digest_daily]]', selected: 'day' === userData.settings.dailyDigestFreq },
- { value: 'week', name: '[[user:digest_weekly]]', selected: 'week' === userData.settings.dailyDigestFreq },
- { value: 'month', name: '[[user:digest_monthly]]', selected: 'month' === userData.settings.dailyDigestFreq }
+ { value: 'off', name: '[[user:digest_off]]', selected: userData.settings.dailyDigestFreq === 'off' },
+ { value: 'day', name: '[[user:digest_daily]]', selected: userData.settings.dailyDigestFreq === 'day' },
+ { value: 'week', name: '[[user:digest_weekly]]', selected: userData.settings.dailyDigestFreq === 'week' },
+ { value: 'month', name: '[[user:digest_monthly]]', selected: userData.settings.dailyDigestFreq === 'month' },
];
userData.bootswatchSkinOptions = [
- { "name": "Default", "value": "default" },
- { "name": "Cerulean", "value": "cerulean" },
- { "name": "Cosmo", "value": "cosmo" },
- { "name": "Cyborg", "value": "cyborg" },
- { "name": "Darkly", "value": "darkly" },
- { "name": "Flatly", "value": "flatly" },
- { "name": "Journal", "value": "journal" },
- { "name": "Lumen", "value": "lumen" },
- { "name": "Paper", "value": "paper" },
- { "name": "Readable", "value": "readable" },
- { "name": "Sandstone", "value": "sandstone" },
- { "name": "Simplex", "value": "simplex" },
- { "name": "Slate", "value": "slate" },
- { "name": "Spacelab", "value": "spacelab" },
- { "name": "Superhero", "value": "superhero" },
- { "name": "United", "value": "united" },
- { "name": "Yeti", "value": "yeti" }
+ { name: 'Default', value: 'default' },
+ { name: 'Cerulean', value: 'cerulean' },
+ { name: 'Cosmo', value: 'cosmo' },
+ { name: 'Cyborg', value: 'cyborg' },
+ { name: 'Darkly', value: 'darkly' },
+ { name: 'Flatly', value: 'flatly' },
+ { name: 'Journal', value: 'journal' },
+ { name: 'Lumen', value: 'lumen' },
+ { name: 'Paper', value: 'paper' },
+ { name: 'Readable', value: 'readable' },
+ { name: 'Sandstone', value: 'sandstone' },
+ { name: 'Simplex', value: 'simplex' },
+ { name: 'Slate', value: 'slate' },
+ { name: 'Spacelab', value: 'spacelab' },
+ { name: 'Superhero', value: 'superhero' },
+ { name: 'United', value: 'united' },
+ { name: 'Yeti', value: 'yeti' },
];
var isCustom = true;
@@ -140,9 +140,9 @@ settingsController.get = function (req, res, callback) {
}
userData.homePageRoutes.push({
- route: 'custom',
- name: 'Custom',
- selected: isCustom
+ route: 'custom',
+ name: 'Custom',
+ selected: isCustom,
});
userData.bootswatchSkinOptions.forEach(function (skin) {
@@ -160,7 +160,7 @@ settingsController.get = function (req, res, callback) {
userData.inTopicSearchAvailable = plugins.hasListeners('filter:topic.search');
userData.title = '[[pages:account/settings]]';
- userData.breadcrumbs = helpers.buildBreadcrumbs([{text: userData.username, url: '/user/' + userData.userslug}, {text: '[[user:settings]]'}]);
+ userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:settings]]' }]);
res.render('account/settings', userData);
});
@@ -182,36 +182,36 @@ function getHomePageRoutes(callback) {
categoryData = categoryData.map(function (category) {
return {
route: 'category/' + category.slug,
- name: 'Category: ' + category.name
+ name: 'Category: ' + category.name,
};
});
categoryData = categoryData || [];
- plugins.fireHook('filter:homepage.get', {routes: [
+ plugins.fireHook('filter:homepage.get', { routes: [
{
route: 'categories',
- name: 'Categories'
+ name: 'Categories',
},
{
route: 'unread',
- name: 'Unread'
+ name: 'Unread',
},
{
route: 'recent',
- name: 'Recent'
+ name: 'Recent',
},
{
route: 'popular',
- name: 'Popular'
- }
- ].concat(categoryData)}, next);
+ name: 'Popular',
+ },
+ ].concat(categoryData) }, next);
},
function (data, next) {
next(null, data.routes);
- }
+ },
], callback);
}
-module.exports = settingsController;
\ No newline at end of file
+module.exports = settingsController;
diff --git a/src/controllers/admin.js b/src/controllers/admin.js
index c58def03cf..91922bec0b 100644
--- a/src/controllers/admin.js
+++ b/src/controllers/admin.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var adminController = {
dashboard: require('./admin/dashboard'),
@@ -9,7 +9,7 @@ var adminController = {
appearance: require('./admin/appearance'),
extend: {
widgets: require('./admin/widgets'),
- rewards: require('./admin/rewards')
+ rewards: require('./admin/rewards'),
},
events: require('./admin/events'),
logs: require('./admin/logs'),
@@ -27,7 +27,7 @@ var adminController = {
themes: require('./admin/themes'),
users: require('./admin/users'),
uploads: require('./admin/uploads'),
- info: require('./admin/info')
+ info: require('./admin/info'),
};
diff --git a/src/controllers/admin/appearance.js b/src/controllers/admin/appearance.js
index 8956bd175d..021733d417 100644
--- a/src/controllers/admin/appearance.js
+++ b/src/controllers/admin/appearance.js
@@ -1,8 +1,8 @@
-"use strict";
+'use strict';
var appearanceController = {};
-appearanceController.get = function (req, res, next) {
+appearanceController.get = function (req, res) {
var term = req.params.term ? req.params.term : 'themes';
res.render('admin/appearance/' + term, {});
diff --git a/src/controllers/admin/blacklist.js b/src/controllers/admin/blacklist.js
index 73e4d6c333..7ce4edda49 100644
--- a/src/controllers/admin/blacklist.js
+++ b/src/controllers/admin/blacklist.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var meta = require('../../meta');
@@ -11,7 +11,7 @@ blacklistController.get = function (req, res, next) {
}
res.render('admin/manage/ip-blacklist', {
rules: rules,
- title: '[[pages:ip-blacklist]]'
+ title: '[[pages:ip-blacklist]]',
});
});
};
diff --git a/src/controllers/admin/cache.js b/src/controllers/admin/cache.js
index 21ef6ff086..dce16818f8 100644
--- a/src/controllers/admin/cache.js
+++ b/src/controllers/admin/cache.js
@@ -2,7 +2,7 @@
var cacheController = {};
-cacheController.get = function (req, res, next) {
+cacheController.get = function (req, res) {
var postCache = require('../../posts/cache');
var groupCache = require('../../groups').cache;
@@ -19,17 +19,17 @@ cacheController.get = function (req, res, next) {
max: postCache.max,
itemCount: postCache.itemCount,
percentFull: percentFull,
- avgPostSize: avgPostSize
+ avgPostSize: avgPostSize,
},
groupCache: {
length: groupCache.length,
max: groupCache.max,
itemCount: groupCache.itemCount,
percentFull: ((groupCache.length / groupCache.max) * 100).toFixed(2),
- dump: req.query.debug ? JSON.stringify(groupCache.dump(), null, 4) : false
- }
+ dump: req.query.debug ? JSON.stringify(groupCache.dump(), null, 4) : false,
+ },
});
};
-module.exports = cacheController;
\ No newline at end of file
+module.exports = cacheController;
diff --git a/src/controllers/admin/categories.js b/src/controllers/admin/categories.js
index 8a59bb0b4e..4a60fc14e2 100644
--- a/src/controllers/admin/categories.js
+++ b/src/controllers/admin/categories.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
@@ -14,7 +14,7 @@ var categoriesController = {};
categoriesController.get = function (req, res, next) {
async.parallel({
category: async.apply(categories.getCategories, [req.params.category_id], req.user.uid),
- privileges: async.apply(privileges.categories.list, req.params.category_id)
+ privileges: async.apply(privileges.categories.list, req.params.category_id),
}, function (err, data) {
if (err) {
return next(err);
@@ -32,13 +32,13 @@ categoriesController.get = function (req, res, next) {
data.category.name = translator.escape(String(data.category.name));
res.render('admin/manage/category', {
category: data.category,
- privileges: data.privileges
+ privileges: data.privileges,
});
});
});
};
-categoriesController.getAll = function (req, res, next) {
+categoriesController.getAll = function (req, res) {
// Categories list will be rendered on client side with recursion, etc.
res.render('admin/manage/categories', {});
};
@@ -46,7 +46,7 @@ categoriesController.getAll = function (req, res, next) {
categoriesController.getAnalytics = function (req, res, next) {
async.parallel({
name: async.apply(categories.getCategoryField, req.params.category_id, 'name'),
- analytics: async.apply(analytics.getCategoryAnalytics, req.params.category_id)
+ analytics: async.apply(analytics.getCategoryAnalytics, req.params.category_id),
}, function (err, data) {
if (err) {
return next(err);
diff --git a/src/controllers/admin/dashboard.js b/src/controllers/admin/dashboard.js
index 2ffbea0e98..70149e580e 100644
--- a/src/controllers/admin/dashboard.js
+++ b/src/controllers/admin/dashboard.js
@@ -20,26 +20,26 @@ dashboardController.get = function (req, res, next) {
{
done: !meta.reloadRequired,
doneText: '[[admin/general/dashboard:restart-not-required]]',
- notDoneText:'[[admin/general/dashboard:restart-required]]'
+ notDoneText: '[[admin/general/dashboard:restart-required]]',
},
{
done: plugins.hasListeners('filter:search.query'),
doneText: '[[admin/general/dashboard:search-plugin-installed]]',
- notDoneText:'[[admin/general/dashboard:search-plugin-not-installed]]',
+ notDoneText: '[[admin/general/dashboard:search-plugin-not-installed]]',
tooltip: '[[admin/general/dashboard:search-plugin-tooltip]]',
- link:'/admin/extend/plugins'
- }
+ link: '/admin/extend/plugins',
+ },
];
if (global.env !== 'production') {
notices.push({
done: false,
- notDoneText: '[[admin/general/dashboard:running-in-development]]'
+ notDoneText: '[[admin/general/dashboard:running-in-development]]',
});
}
plugins.fireHook('filter:admin.notices', notices, next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -47,7 +47,7 @@ dashboardController.get = function (req, res, next) {
res.render('admin/general/dashboard', {
version: nconf.get('version'),
notices: results.notices,
- stats: results.stats
+ stats: results.stats,
});
});
};
@@ -65,7 +65,7 @@ function getStats(callback) {
},
function (next) {
getStatsForSet('topics:tid', 'topicCount', next);
- }
+ },
], function (err, results) {
if (err) {
return callback(err);
@@ -83,7 +83,7 @@ function getStatsForSet(set, field, callback) {
var terms = {
day: 86400000,
week: 604800000,
- month: 2592000000
+ month: 2592000000,
};
var now = Date.now();
@@ -99,7 +99,7 @@ function getStatsForSet(set, field, callback) {
},
alltime: function (next) {
getGlobalField(field, next);
- }
+ },
}, callback);
}
diff --git a/src/controllers/admin/database.js b/src/controllers/admin/database.js
index 5a28b95ec4..9ce8a3c00f 100644
--- a/src/controllers/admin/database.js
+++ b/src/controllers/admin/database.js
@@ -6,7 +6,6 @@ var nconf = require('nconf');
var databaseController = {};
-
databaseController.get = function (req, res, next) {
async.parallel({
redis: function (next) {
@@ -24,7 +23,7 @@ databaseController.get = function (req, res, next) {
} else {
next();
}
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -33,4 +32,4 @@ databaseController.get = function (req, res, next) {
});
};
-module.exports = databaseController;
\ No newline at end of file
+module.exports = databaseController;
diff --git a/src/controllers/admin/errors.js b/src/controllers/admin/errors.js
index 4cacd425c9..5a00e95537 100644
--- a/src/controllers/admin/errors.js
+++ b/src/controllers/admin/errors.js
@@ -11,7 +11,7 @@ var errorsController = {};
errorsController.get = function (req, res, next) {
async.parallel({
'not-found': async.apply(meta.errors.get, true),
- analytics: async.apply(analytics.getErrorAnalytics)
+ analytics: async.apply(analytics.getErrorAnalytics),
}, function (err, data) {
if (err) {
return next(err);
@@ -24,7 +24,7 @@ errorsController.get = function (req, res, next) {
errorsController.export = function (req, res, next) {
async.waterfall([
async.apply(meta.errors.get, false),
- async.apply(json2csv)
+ async.apply(json2csv),
], function (err, csv) {
if (err) {
return next(err);
@@ -35,4 +35,4 @@ errorsController.export = function (req, res, next) {
};
-module.exports = errorsController;
\ No newline at end of file
+module.exports = errorsController;
diff --git a/src/controllers/admin/events.js b/src/controllers/admin/events.js
index 8a4d63bad1..97838d2266 100644
--- a/src/controllers/admin/events.js
+++ b/src/controllers/admin/events.js
@@ -10,7 +10,6 @@ var eventsController = {};
eventsController.get = function (req, res, next) {
-
var page = parseInt(req.query.page, 10) || 1;
var itemsPerPage = 20;
var start = (page - 1) * itemsPerPage;
@@ -22,7 +21,7 @@ eventsController.get = function (req, res, next) {
},
events: function (next) {
events.getEvents(start, stop, next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -33,10 +32,10 @@ eventsController.get = function (req, res, next) {
res.render('admin/advanced/events', {
events: results.events,
pagination: pagination.create(page, pageCount),
- next: 20
+ next: 20,
});
});
};
-module.exports = eventsController;
\ No newline at end of file
+module.exports = eventsController;
diff --git a/src/controllers/admin/groups.js b/src/controllers/admin/groups.js
index db940c8324..5e7dd1e78f 100644
--- a/src/controllers/admin/groups.js
+++ b/src/controllers/admin/groups.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
@@ -6,12 +6,9 @@ var db = require('../../database');
var groups = require('../../groups');
var meta = require('../../meta');
var pagination = require('../../pagination');
-var helpers = require('../helpers');
-
var groupsController = {};
-
groupsController.list = function (req, res, next) {
var page = parseInt(req.query.page, 10) || 1;
var groupsPerPage = 20;
@@ -28,14 +25,14 @@ groupsController.list = function (req, res, next) {
pageCount = Math.ceil(groupNames.length / groupsPerPage);
var start = (page - 1) * groupsPerPage;
- var stop = start + groupsPerPage - 1;
+ var stop = start + groupsPerPage - 1;
groupNames = groupNames.slice(start, stop + 1);
groups.getGroupsData(groupNames, next);
},
function (groupData, next) {
- next(null, {groups: groupData, pagination: pagination.create(page, pageCount)});
- }
+ next(null, { groups: groupData, pagination: pagination.create(page, pageCount) });
+ },
], function (err, data) {
if (err) {
return next(err);
@@ -44,7 +41,7 @@ groupsController.list = function (req, res, next) {
res.render('admin/manage/groups', {
groups: data.groups,
pagination: data.pagination,
- yourid: req.uid
+ yourid: req.uid,
});
});
};
@@ -59,14 +56,14 @@ groupsController.get = function (req, res, callback) {
if (!exists) {
return callback();
}
- groups.get(groupName, {uid: req.uid, truncateUserList: true, userListCount: 20}, next);
- }
+ groups.get(groupName, { uid: req.uid, truncateUserList: true, userListCount: 20 }, next);
+ },
], function (err, group) {
if (err) {
return callback(err);
}
group.isOwner = true;
- res.render('admin/manage/group', {group: group, allowPrivateGroups: parseInt(meta.config.allowPrivateGroups, 10) === 1});
+ res.render('admin/manage/group', { group: group, allowPrivateGroups: parseInt(meta.config.allowPrivateGroups, 10) === 1 });
});
};
diff --git a/src/controllers/admin/homepage.js b/src/controllers/admin/homepage.js
index 9fdf3a2371..1450283847 100644
--- a/src/controllers/admin/homepage.js
+++ b/src/controllers/admin/homepage.js
@@ -25,37 +25,37 @@ homePageController.get = function (req, res, next) {
categoryData = categoryData.map(function (category) {
return {
route: 'category/' + category.slug,
- name: 'Category: ' + category.name
+ name: 'Category: ' + category.name,
};
});
next(null, categoryData);
- }
+ },
], function (err, categoryData) {
if (err || !categoryData) {
categoryData = [];
}
- plugins.fireHook('filter:homepage.get', {routes: [
+ plugins.fireHook('filter:homepage.get', { routes: [
{
route: 'categories',
- name: 'Categories'
+ name: 'Categories',
},
{
route: 'recent',
- name: 'Recent'
+ name: 'Recent',
},
{
route: 'popular',
- name: 'Popular'
- }
- ].concat(categoryData)}, function (err, data) {
+ name: 'Popular',
+ },
+ ].concat(categoryData) }, function (err, data) {
if (err) {
return next(err);
}
data.routes.push({
route: '',
- name: 'Custom'
+ name: 'Custom',
});
res.render('admin/general/homepage', data);
@@ -63,4 +63,4 @@ homePageController.get = function (req, res, next) {
});
};
-module.exports = homePageController;
\ No newline at end of file
+module.exports = homePageController;
diff --git a/src/controllers/admin/info.js b/src/controllers/admin/info.js
index 8fa54ae4f0..88fef98b4b 100644
--- a/src/controllers/admin/info.js
+++ b/src/controllers/admin/info.js
@@ -13,7 +13,7 @@ var infoController = {};
var info = {};
-infoController.get = function (req, res, next) {
+infoController.get = function (req, res) {
info = {};
pubsub.publish('sync:node:info:start');
setTimeout(function () {
@@ -22,9 +22,15 @@ infoController.get = function (req, res, next) {
data.push(info[key]);
});
data.sort(function (a, b) {
- return (a.os.hostname < b.os.hostname) ? -1 : (a.os.hostname > b.os.hostname) ? 1 : 0;
+ if (a.os.hostname < b.os.hostname) {
+ return -1;
+ }
+ if (a.os.hostname > b.os.hostname) {
+ return 1;
+ }
+ return 0;
});
- res.render('admin/development/info', {info: data, infoJSON: JSON.stringify(data, null, 4), host: os.hostname(), port: nconf.get('port')});
+ res.render('admin/development/info', { info: data, infoJSON: JSON.stringify(data, null, 4), host: os.hostname(), port: nconf.get('port') });
}, 500);
};
@@ -33,7 +39,7 @@ pubsub.on('sync:node:info:start', function () {
if (err) {
return winston.error(err);
}
- pubsub.publish('sync:node:info:end', {data: data, id: os.hostname() + ':' + nconf.get('port')});
+ pubsub.publish('sync:node:info:end', { data: data, id: os.hostname() + ':' + nconf.get('port') });
});
});
@@ -49,7 +55,7 @@ function getNodeInfo(callback) {
title: process.title,
version: process.version,
memoryUsage: process.memoryUsage(),
- uptime: process.uptime()
+ uptime: process.uptime(),
},
os: {
hostname: os.hostname(),
@@ -57,8 +63,8 @@ function getNodeInfo(callback) {
platform: os.platform(),
arch: os.arch(),
release: os.release(),
- load: os.loadavg().map(function (load) { return load.toFixed(2); }).join(', ')
- }
+ load: os.loadavg().map(function (load) { return load.toFixed(2); }).join(', '),
+ },
};
async.parallel({
@@ -67,7 +73,7 @@ function getNodeInfo(callback) {
},
gitInfo: function (next) {
getGitInfo(next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -79,7 +85,7 @@ function getNodeInfo(callback) {
}
function getGitInfo(callback) {
- function get(cmd, callback) {
+ function get(cmd, callback) {
exec(cmd, function (err, stdout) {
if (err) {
winston.error(err);
@@ -93,8 +99,8 @@ function getGitInfo(callback) {
},
branch: function (next) {
get('git rev-parse --abbrev-ref HEAD', next);
- }
+ },
}, callback);
}
-module.exports = infoController;
\ No newline at end of file
+module.exports = infoController;
diff --git a/src/controllers/admin/languages.js b/src/controllers/admin/languages.js
index 2b458d1508..0ac4e98e99 100644
--- a/src/controllers/admin/languages.js
+++ b/src/controllers/admin/languages.js
@@ -17,9 +17,9 @@ languagesController.get = function (req, res, next) {
});
res.render('admin/general/languages', {
- languages: languages
+ languages: languages,
});
});
};
-module.exports = languagesController;
\ No newline at end of file
+module.exports = languagesController;
diff --git a/src/controllers/admin/logger.js b/src/controllers/admin/logger.js
index 7ae327a858..0e8006bbeb 100644
--- a/src/controllers/admin/logger.js
+++ b/src/controllers/admin/logger.js
@@ -6,4 +6,4 @@ loggerController.get = function (req, res) {
res.render('admin/development/logger', {});
};
-module.exports = loggerController;
\ No newline at end of file
+module.exports = loggerController;
diff --git a/src/controllers/admin/logs.js b/src/controllers/admin/logs.js
index 6723d3795f..c2c5166dd7 100644
--- a/src/controllers/admin/logs.js
+++ b/src/controllers/admin/logs.js
@@ -13,10 +13,10 @@ logsController.get = function (req, res, next) {
}
res.render('admin/advanced/logs', {
- data: validator.escape(logs)
+ data: validator.escape(logs),
});
});
};
-module.exports = logsController;
\ No newline at end of file
+module.exports = logsController;
diff --git a/src/controllers/admin/navigation.js b/src/controllers/admin/navigation.js
index 423f21721c..9c96444be3 100644
--- a/src/controllers/admin/navigation.js
+++ b/src/controllers/admin/navigation.js
@@ -20,4 +20,4 @@ navigationController.get = function (req, res, next) {
});
};
-module.exports = navigationController;
\ No newline at end of file
+module.exports = navigationController;
diff --git a/src/controllers/admin/plugins.js b/src/controllers/admin/plugins.js
index f1a72720ac..4e8e1a415e 100644
--- a/src/controllers/admin/plugins.js
+++ b/src/controllers/admin/plugins.js
@@ -24,22 +24,22 @@ pluginsController.get = function (req, res, next) {
next(null, plugins);
});
- }
+ },
}, function (err, payload) {
if (err) {
return next(err);
}
var compatiblePkgNames = payload.compatible.map(function (pkgData) {
- return pkgData.name;
- });
+ return pkgData.name;
+ });
- res.render('admin/extend/plugins' , {
+ res.render('admin/extend/plugins', {
installed: payload.compatible.filter(function (plugin) {
return plugin.installed;
}),
upgradeCount: payload.compatible.reduce(function (count, current) {
if (current.installed && current.outdated) {
- ++count;
+ count += 1;
}
return count;
}, 0),
@@ -48,9 +48,9 @@ pluginsController.get = function (req, res, next) {
}),
incompatible: payload.all.filter(function (plugin) {
return compatiblePkgNames.indexOf(plugin.name) === -1;
- })
+ }),
});
});
};
-module.exports = pluginsController;
\ No newline at end of file
+module.exports = pluginsController;
diff --git a/src/controllers/admin/rewards.js b/src/controllers/admin/rewards.js
index 8ff05c75b3..56c5ed3cd0 100644
--- a/src/controllers/admin/rewards.js
+++ b/src/controllers/admin/rewards.js
@@ -13,5 +13,4 @@ rewardsController.get = function (req, res, next) {
};
-
-module.exports = rewardsController;
\ No newline at end of file
+module.exports = rewardsController;
diff --git a/src/controllers/admin/settings.js b/src/controllers/admin/settings.js
index 0d1f509631..55e5a1dfbf 100644
--- a/src/controllers/admin/settings.js
+++ b/src/controllers/admin/settings.js
@@ -11,12 +11,12 @@ settingsController.get = function (req, res, next) {
var term = req.params.term ? req.params.term : 'general';
switch (req.params.term) {
- case 'email':
- renderEmail(req, res, next);
- break;
+ case 'email':
+ renderEmail(req, res, next);
+ break;
- default:
- res.render('admin/settings/' + term);
+ default:
+ res.render('admin/settings/' + term);
}
};
@@ -47,11 +47,11 @@ function renderEmail(req, res, next) {
path: path,
fullpath: email,
text: text,
- original: original.toString()
+ original: original.toString(),
});
});
}, next);
- }
+ },
], function (err, emails) {
if (err) {
return next(err);
@@ -61,7 +61,7 @@ function renderEmail(req, res, next) {
emails: emails,
sendable: emails.filter(function (email) {
return email.path.indexOf('_plaintext') === -1 && email.path.indexOf('partials') === -1;
- })
+ }),
});
});
}
diff --git a/src/controllers/admin/social.js b/src/controllers/admin/social.js
index 11c7982701..da12f3341e 100644
--- a/src/controllers/admin/social.js
+++ b/src/controllers/admin/social.js
@@ -12,9 +12,9 @@ socialController.get = function (req, res, next) {
}
res.render('admin/general/social', {
- posts: posts
+ posts: posts,
});
});
};
-module.exports = socialController;
\ No newline at end of file
+module.exports = socialController;
diff --git a/src/controllers/admin/sounds.js b/src/controllers/admin/sounds.js
index b042048313..bc4730a865 100644
--- a/src/controllers/admin/sounds.js
+++ b/src/controllers/admin/sounds.js
@@ -10,7 +10,7 @@ soundsController.get = function (req, res, next) {
if (err) {
return next(err);
}
-
+
settings = settings || {};
var types = [
@@ -44,4 +44,4 @@ soundsController.get = function (req, res, next) {
});
};
-module.exports = soundsController;
\ No newline at end of file
+module.exports = soundsController;
diff --git a/src/controllers/admin/tags.js b/src/controllers/admin/tags.js
index a645e2ef11..f586e5f70c 100644
--- a/src/controllers/admin/tags.js
+++ b/src/controllers/admin/tags.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var topics = require('../../topics');
@@ -10,7 +10,7 @@ tagsController.get = function (req, res, next) {
return next(err);
}
- res.render('admin/manage/tags', {tags: tags});
+ res.render('admin/manage/tags', { tags: tags });
});
};
diff --git a/src/controllers/admin/themes.js b/src/controllers/admin/themes.js
index 97e7a58d6e..94fdf43746 100644
--- a/src/controllers/admin/themes.js
+++ b/src/controllers/admin/themes.js
@@ -12,8 +12,8 @@ themesController.get = function (req, res, next) {
return next(err);
}
- var themeConfig = require(path.join(themeDir, 'theme.json')),
- screenshotPath = path.join(themeDir, themeConfig.screenshot);
+ var themeConfig = require(path.join(themeDir, 'theme.json'));
+ var screenshotPath = path.join(themeDir, themeConfig.screenshot);
if (themeConfig.screenshot && file.existsSync(screenshotPath)) {
res.sendFile(screenshotPath);
} else {
@@ -22,4 +22,4 @@ themesController.get = function (req, res, next) {
});
};
-module.exports = themesController;
\ No newline at end of file
+module.exports = themesController;
diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js
index 0b7104f1de..02bd065c0b 100644
--- a/src/controllers/admin/uploads.js
+++ b/src/controllers/admin/uploads.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var fs = require('fs');
var path = require('path');
@@ -31,7 +31,7 @@ uploadsController.uploadCategoryPicture = function (req, res, next) {
}
if (validateUpload(req, res, next, uploadedFile, allowedImageTypes)) {
- var filename = 'category-' + params.cid + path.extname(uploadedFile.name);
+ var filename = 'category-' + params.cid + path.extname(uploadedFile.name);
uploadImage(filename, 'category', uploadedFile, req, res, next);
}
};
@@ -51,15 +51,15 @@ uploadsController.uploadFavicon = function (req, res, next) {
return next(err);
}
- res.json([{name: uploadedFile.name, url: image.url}]);
+ res.json([{ name: uploadedFile.name, url: image.url }]);
});
}
};
uploadsController.uploadTouchIcon = function (req, res, next) {
- var uploadedFile = req.files.files[0],
- allowedTypes = ['image/png'],
- sizes = [36, 48, 72, 96, 144, 192];
+ var uploadedFile = req.files.files[0];
+ var allowedTypes = ['image/png'];
+ var sizes = [36, 48, 72, 96, 144, 192];
if (validateUpload(req, res, next, uploadedFile, allowedTypes)) {
file.saveFileToLocal('touchicon-orig.png', 'system', uploadedFile.path, function (err, imageObj) {
@@ -75,8 +75,8 @@ uploadsController.uploadTouchIcon = function (req, res, next) {
path: path.join(nconf.get('upload_path'), 'system', 'touchicon-' + size + '.png'),
extension: 'png',
width: size,
- height: size
- })
+ height: size,
+ }),
], next);
}, function (err) {
fs.unlink(uploadedFile.path, function (err) {
@@ -89,7 +89,7 @@ uploadsController.uploadTouchIcon = function (req, res, next) {
return next(err);
}
- res.json([{name: uploadedFile.name, url: imageObj.url}]);
+ res.json([{ name: uploadedFile.name, url: imageObj.url }]);
});
});
}
@@ -142,7 +142,7 @@ function validateUpload(req, res, next, uploadedFile, allowedTypes) {
}
});
- res.json({error: '[[error:invalid-image-type, ' + allowedTypes.join(', ') + ']]'});
+ res.json({ error: '[[error:invalid-image-type, ' + allowedTypes.join(', ') + ']]' });
return false;
}
@@ -160,11 +160,11 @@ function uploadImage(filename, folder, uploadedFile, req, res, next) {
return next(err);
}
- res.json([{name: uploadedFile.name, url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url}]);
+ res.json([{ name: uploadedFile.name, url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url }]);
}
if (plugins.hasListeners('filter:uploadImage')) {
- plugins.fireHook('filter:uploadImage', {image: uploadedFile, uid: req.user.uid}, done);
+ plugins.fireHook('filter:uploadImage', { image: uploadedFile, uid: req.user.uid }, done);
} else {
file.saveFileToLocal(filename, folder, uploadedFile.path, done);
}
diff --git a/src/controllers/admin/users.js b/src/controllers/admin/users.js
index 422de5b02d..0eae3b82c6 100644
--- a/src/controllers/admin/users.js
+++ b/src/controllers/admin/users.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var validator = require('validator');
@@ -15,10 +15,10 @@ var usersController = {};
var userFields = ['uid', 'username', 'userslug', 'email', 'postcount', 'joindate', 'banned',
'reputation', 'picture', 'flags', 'lastonline', 'email:confirmed'];
-usersController.search = function (req, res, next) {
+usersController.search = function (req, res) {
res.render('admin/manage/users', {
search_display: '',
- users: []
+ users: [],
});
};
@@ -71,7 +71,7 @@ usersController.registrationQueue = function (req, res, next) {
user.getRegistrationQueue(start, stop, next);
},
customHeaders: function (next) {
- plugins.fireHook('filter:admin.registrationQueue.customHeaders', {headers: []}, next);
+ plugins.fireHook('filter:admin.registrationQueue.customHeaders', { headers: [] }, next);
},
invites: function (next) {
async.waterfall([
@@ -97,14 +97,14 @@ usersController.registrationQueue = function (req, res, next) {
invites.invitations = invites.invitations.map(function (email, i) {
return {
email: email,
- username: usernames[index][i] === '[[global:guest]]' ? '' : usernames[index][i]
+ username: usernames[index][i] === '[[global:guest]]' ? '' : usernames[index][i],
};
});
});
next(null, invitations);
- }
+ },
], next);
- }
+ },
}, function (err, data) {
if (err) {
return next(err);
@@ -146,9 +146,9 @@ function getUsers(set, section, min, max, req, res, next) {
},
function (uids, next) {
user.getUsersWithFields(uids, userFields, req.uid, next);
- }
+ },
], next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -161,7 +161,7 @@ function getUsers(set, section, min, max, req, res, next) {
var data = {
users: results.users,
page: page,
- pageCount: Math.max(1, Math.ceil(results.count / resultsPerPage))
+ pageCount: Math.max(1, Math.ceil(results.count / resultsPerPage)),
};
data[section] = true;
render(req, res, data);
@@ -185,7 +185,7 @@ usersController.getCSV = function (req, res, next) {
events.log({
type: 'getUsersCSV',
uid: req.user.uid,
- ip: req.ip
+ ip: req.ip,
});
user.getUsersCSV(function (err, data) {
diff --git a/src/controllers/admin/widgets.js b/src/controllers/admin/widgets.js
index c2d0d1e667..889fa1dcc6 100644
--- a/src/controllers/admin/widgets.js
+++ b/src/controllers/admin/widgets.js
@@ -13,4 +13,4 @@ widgetsController.get = function (req, res, next) {
};
-module.exports = widgetsController;
\ No newline at end of file
+module.exports = widgetsController;
diff --git a/src/controllers/api.js b/src/controllers/api.js
index 1bbf3962c8..66392e6160 100644
--- a/src/controllers/api.js
+++ b/src/controllers/api.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var validator = require('validator');
@@ -71,7 +71,7 @@ apiController.getConfig = function (req, res, next) {
enabled: parseInt(meta.config.cookieConsentEnabled, 10) === 1,
message: translator.escape(meta.config.cookieConsentMessage || '[[global:cookies.message]]').replace(/\\/g, '\\\\'),
dismiss: translator.escape(meta.config.cookieConsentDismiss || '[[global:cookies.accept]]').replace(/\\/g, '\\\\'),
- link: translator.escape(meta.config.cookieConsentLink || '[[global:cookies.learn_more]]').replace(/\\/g, '\\\\')
+ link: translator.escape(meta.config.cookieConsentLink || '[[global:cookies.learn_more]]').replace(/\\/g, '\\\\'),
};
async.waterfall([
@@ -93,7 +93,7 @@ apiController.getConfig = function (req, res, next) {
config.delayImageLoading = settings.delayImageLoading !== undefined ? settings.delayImageLoading : true;
config.bootswatchSkin = settings.bootswatchSkin || config.bootswatchSkin;
plugins.fireHook('filter:config.get', config, next);
- }
+ },
], function (err, config) {
if (err) {
return next(err);
@@ -119,16 +119,16 @@ apiController.renderWidgets = function (req, res, next) {
url: req.query.url,
locations: req.query.locations,
isMobile: req.query.isMobile === 'true',
- cid: req.query.cid
+ cid: req.query.cid,
},
req,
res,
function (err, widgets) {
- if (err) {
- return next(err);
- }
- res.status(200).json(widgets);
- });
+ if (err) {
+ return next(err);
+ }
+ res.status(200).json(widgets);
+ });
};
apiController.getPostData = function (pid, uid, callback) {
@@ -138,7 +138,7 @@ apiController.getPostData = function (pid, uid, callback) {
},
post: function (next) {
posts.getPostData(pid, next);
- }
+ },
}, function (err, results) {
if (err || !results.post) {
return callback(err);
@@ -167,7 +167,7 @@ apiController.getTopicData = function (tid, uid, callback) {
},
topic: function (next) {
topics.getTopicData(tid, next);
- }
+ },
}, function (err, results) {
if (err || !results.topic) {
return callback(err);
@@ -187,7 +187,7 @@ apiController.getCategoryData = function (cid, uid, callback) {
},
category: function (next) {
categories.getCategoryData(cid, next);
- }
+ },
}, function (err, results) {
if (err || !results.category) {
return callback(err);
@@ -205,7 +205,7 @@ apiController.getObject = function (req, res, next) {
var methods = {
post: apiController.getPostData,
topic: apiController.getTopicData,
- category: apiController.getCategoryData
+ category: apiController.getCategoryData,
};
var method = methods[req.params.type];
if (!method) {
@@ -230,7 +230,7 @@ apiController.getCurrentUser = function (req, res, next) {
},
function (userslug, next) {
accountHelpers.getUserDataByUserSlug(userslug, req.uid, next);
- }
+ },
], function (err, userData) {
if (err) {
return next(err);
@@ -278,7 +278,7 @@ apiController.getUserDataByField = function (callerUid, field, fieldValue, callb
return next();
}
apiController.getUserDataByUID(callerUid, uid, next);
- }
+ },
], callback);
};
@@ -293,7 +293,7 @@ apiController.getUserDataByUID = function (callerUid, uid, callback) {
async.parallel({
userData: async.apply(user.getUserData, uid),
- settings: async.apply(user.getSettings, uid)
+ settings: async.apply(user.getSettings, uid),
}, function (err, results) {
if (err || !results.userData) {
return callback(err || new Error('[[error:no-user]]'));
@@ -311,7 +311,7 @@ apiController.getModerators = function (req, res, next) {
if (err) {
return next(err);
}
- res.json({moderators: moderators});
+ res.json({ moderators: moderators });
});
};
diff --git a/src/controllers/authentication.js b/src/controllers/authentication.js
index 4aa1b028f6..2319332d83 100644
--- a/src/controllers/authentication.js
+++ b/src/controllers/authentication.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var winston = require('winston');
@@ -6,7 +6,6 @@ var passport = require('passport');
var nconf = require('nconf');
var validator = require('validator');
var _ = require('underscore');
-var url = require('url');
var db = require('../database');
var meta = require('../meta');
@@ -19,7 +18,7 @@ var sockets = require('../socket.io');
var authenticationController = {};
-authenticationController.register = function (req, res, next) {
+authenticationController.register = function (req, res) {
var registrationType = meta.config.registrationType || 'normal';
if (registrationType === 'disabled') {
@@ -74,7 +73,7 @@ authenticationController.register = function (req, res, next) {
},
function (queue, next) {
res.locals.processLogin = true; // set it to false in plugin if you wish to just register only
- plugins.fireHook('filter:register.check', {req: req, res: res, userData: userData, queue: queue}, next);
+ plugins.fireHook('filter:register.check', { req: req, res: res, userData: userData, queue: queue }, next);
},
function (data, next) {
if (data.queue) {
@@ -82,7 +81,7 @@ authenticationController.register = function (req, res, next) {
} else {
registerAndLoginUser(req, res, userData, next);
}
- }
+ },
], function (err, data) {
if (err) {
return res.status(400).send(err.message);
@@ -102,7 +101,7 @@ function registerAndLoginUser(req, res, userData, callback) {
function (next) {
plugins.fireHook('filter:register.interstitial', {
userData: userData,
- interstitials: []
+ interstitials: [],
}, function (err, data) {
if (err) {
return next(err);
@@ -113,11 +112,10 @@ function registerAndLoginUser(req, res, userData, callback) {
if (!deferRegistration) {
return next();
- } else {
- userData.register = true;
- req.session.registration = userData;
- return res.json({ referrer: nconf.get('relative_path') + '/register/complete' });
}
+ userData.register = true;
+ req.session.registration = userData;
+ return res.json({ referrer: nconf.get('relative_path') + '/register/complete' });
});
},
function (next) {
@@ -133,8 +131,8 @@ function registerAndLoginUser(req, res, userData, callback) {
},
function (next) {
user.deleteInvitationKey(userData.email);
- plugins.fireHook('filter:register.complete', {uid: uid, referrer: req.body.referrer || nconf.get('relative_path') + '/'}, next);
- }
+ plugins.fireHook('filter:register.complete', { uid: uid, referrer: req.body.referrer || nconf.get('relative_path') + '/' }, next);
+ },
], callback);
}
@@ -145,8 +143,8 @@ function addToApprovalQueue(req, userData, callback) {
user.addToApprovalQueue(userData, next);
},
function (next) {
- next(null, {message: '[[register:registration-added-to-queue]]'});
- }
+ next(null, { message: '[[register:registration-added-to-queue]]' });
+ },
], callback);
}
@@ -154,7 +152,7 @@ authenticationController.registerComplete = function (req, res, next) {
// For the interstitials that respond, execute the callback with the form body
plugins.fireHook('filter:register.interstitial', {
userData: req.session.registration,
- interstitials: []
+ interstitials: [],
}, function (err, data) {
if (err) {
return next(err);
@@ -214,7 +212,7 @@ authenticationController.login = function (req, res, next) {
if (err) {
return next(err);
}
- req.body.username = username ? username : req.body.username;
+ req.body.username = username || req.body.username;
continueLogin(req, res, next);
});
} else if (loginWith.indexOf('username') !== -1 && !validator.isEmail(req.body.username)) {
@@ -284,7 +282,7 @@ authenticationController.doLogin = function (req, uid, callback) {
return callback();
}
- req.login({uid: uid}, function (err) {
+ req.login({ uid: uid }, function (err) {
if (err) {
return callback(err);
}
@@ -310,7 +308,7 @@ authenticationController.onSuccessfulLogin = function (req, uid, callback) {
datetime: Date.now(),
platform: req.useragent.platform,
browser: req.useragent.browser,
- version: req.useragent.version
+ version: req.useragent.version,
});
// Associate login session with user
@@ -323,7 +321,7 @@ authenticationController.onSuccessfulLogin = function (req, uid, callback) {
},
function (next) {
user.updateLastOnlineTime(uid, next);
- }
+ },
], function (err) {
if (err) {
return callback(err);
@@ -343,7 +341,8 @@ authenticationController.localLogin = function (req, username, password, next) {
}
var userslug = utils.slugify(username);
- var uid, userData = {};
+ var uid;
+ var userData = {};
async.waterfall([
function (next) {
@@ -369,7 +368,7 @@ authenticationController.localLogin = function (req, username, password, next) {
},
banned: function (next) {
user.isBanned(uid, next);
- }
+ },
}, next);
},
function (result, next) {
@@ -408,7 +407,7 @@ authenticationController.localLogin = function (req, username, password, next) {
}
user.auth.clearLoginAttempts(uid);
next(null, userData, '[[success:authentication-successful]]');
- }
+ },
], next);
};
@@ -426,7 +425,7 @@ authenticationController.logout = function (req, res, next) {
user.setUserField(uid, 'lastonline', Date.now() - 300000);
- plugins.fireHook('static:user.loggedOut', {req: req, res: res, uid: uid}, function () {
+ plugins.fireHook('static:user.loggedOut', { req: req, res: res, uid: uid }, function () {
res.status(200).send('');
// Force session check for all connected socket.io clients with the same session id
diff --git a/src/controllers/categories.js b/src/controllers/categories.js
index 9a18e7f1dd..8112dead67 100644
--- a/src/controllers/categories.js
+++ b/src/controllers/categories.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var nconf = require('nconf');
@@ -12,17 +12,17 @@ var categoriesController = {};
categoriesController.list = function (req, res, next) {
res.locals.metaTags = [{
- name: "title",
- content: validator.escape(String(meta.config.title || 'NodeBB'))
+ name: 'title',
+ content: validator.escape(String(meta.config.title || 'NodeBB')),
}, {
- name: "description",
- content: validator.escape(String(meta.config.description || ''))
+ name: 'description',
+ content: validator.escape(String(meta.config.description || '')),
}, {
property: 'og:title',
- content: '[[pages:categories]]'
+ content: '[[pages:categories]]',
}, {
property: 'og:type',
- content: 'website'
+ content: 'website',
}];
var ogImage = meta.config['og:image'] || meta.config['brand:logo'] || '';
@@ -32,7 +32,7 @@ categoriesController.list = function (req, res, next) {
}
res.locals.metaTags.push({
property: 'og:image',
- content: ogImage
+ content: ogImage,
});
}
@@ -48,7 +48,7 @@ categoriesController.list = function (req, res, next) {
categories.flattenCategories(allCategories, categoryData);
categories.getRecentTopicReplies(allCategories, req.uid, next);
- }
+ },
], function (err) {
if (err) {
return next(err);
@@ -56,11 +56,11 @@ categoriesController.list = function (req, res, next) {
var data = {
title: '[[pages:categories]]',
- categories: categoryData
+ categories: categoryData,
};
if (req.path.startsWith('/api/categories') || req.path.startsWith('/categories')) {
- data.breadcrumbs = helpers.buildBreadcrumbs([{text: data.title}]);
+ data.breadcrumbs = helpers.buildBreadcrumbs([{ text: data.title }]);
}
data.categories.forEach(function (category) {
@@ -68,7 +68,7 @@ categoriesController.list = function (req, res, next) {
category.teaser = {
url: nconf.get('relative_path') + '/topic/' + category.posts[0].topic.slug + '/' + category.posts[0].index,
timestampISO: category.posts[0].timestampISO,
- pid: category.posts[0].pid
+ pid: category.posts[0].pid,
};
}
});
diff --git a/src/controllers/category.js b/src/controllers/category.js
index 3570f279ee..ce5f7b5e07 100644
--- a/src/controllers/category.js
+++ b/src/controllers/category.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
@@ -37,7 +37,7 @@ categoryController.get = function (req, res, callback) {
},
userSettings: function (next) {
user.getSettings(req.uid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -87,7 +87,7 @@ categoryController.get = function (req, res, callback) {
set = 'cid:' + cid + ':tids:posts';
}
- var start = (currentPage - 1) * settings.topicsPerPage + topicIndex;
+ var start = ((currentPage - 1) * settings.topicsPerPage) + topicIndex;
var stop = start + settings.topicsPerPage - 1;
var payload = {
@@ -97,7 +97,7 @@ categoryController.get = function (req, res, callback) {
start: start,
stop: stop,
uid: req.uid,
- settings: settings
+ settings: settings,
};
async.waterfall([
@@ -120,11 +120,10 @@ categoryController.get = function (req, res, callback) {
}
}
categories.getCategoryById(payload, next);
- }
+ },
], next);
},
function (categoryData, next) {
-
categories.modifyTopicsByPrivilege(categoryData.topics, userPrivileges);
if (categoryData.link) {
@@ -135,8 +134,8 @@ categoryController.get = function (req, res, callback) {
var breadcrumbs = [
{
text: categoryData.name,
- url: nconf.get('relative_path') + '/category/' + categoryData.slug
- }
+ url: nconf.get('relative_path') + '/category/' + categoryData.slug,
+ },
];
helpers.buildCategoryBreadcrumbs(categoryData.parentCid, function (err, crumbs) {
if (err) {
@@ -155,7 +154,7 @@ categoryController.get = function (req, res, callback) {
categories.getRecentTopicReplies(allCategories, req.uid, function (err) {
next(err, categoryData);
});
- }
+ },
], function (err, categoryData) {
if (err) {
return callback(err);
@@ -167,26 +166,26 @@ categoryController.get = function (req, res, callback) {
res.locals.metaTags = [
{
name: 'title',
- content: categoryData.name
+ content: categoryData.name,
},
{
property: 'og:title',
- content: categoryData.name
+ content: categoryData.name,
},
{
name: 'description',
- content: categoryData.description
+ content: categoryData.description,
},
{
- property: "og:type",
- content: 'website'
- }
+ property: 'og:type',
+ content: 'website',
+ },
];
if (categoryData.backgroundImage) {
res.locals.metaTags.push({
name: 'og:image',
- content: categoryData.backgroundImage
+ content: categoryData.backgroundImage,
});
}
@@ -194,12 +193,12 @@ categoryController.get = function (req, res, callback) {
{
rel: 'alternate',
type: 'application/rss+xml',
- href: nconf.get('url') + '/category/' + cid + '.rss'
+ href: nconf.get('url') + '/category/' + cid + '.rss',
},
{
rel: 'up',
- href: nconf.get('url')
- }
+ href: nconf.get('url'),
+ },
];
if (parseInt(req.uid, 10)) {
diff --git a/src/controllers/globalmods.js b/src/controllers/globalmods.js
index 7e4fd1ffec..793c33653e 100644
--- a/src/controllers/globalmods.js
+++ b/src/controllers/globalmods.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var user = require('../user');
var adminBlacklistController = require('./admin/blacklist');
diff --git a/src/controllers/groups.js b/src/controllers/groups.js
index 2cbbcc7c76..fb780c1b97 100644
--- a/src/controllers/groups.js
+++ b/src/controllers/groups.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var nconf = require('nconf');
@@ -19,7 +19,7 @@ groupsController.list = function (req, res, next) {
return next(err);
}
data.title = '[[pages:groups]]';
- data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[pages:groups]]'}]);
+ data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[pages:groups]]' }]);
res.render('groups/list', data);
});
};
@@ -32,17 +32,18 @@ groupsController.getGroupsFromSet = function (uid, sort, start, stop, callback)
set = 'groups:visible:createtime';
}
- groups.getGroupsFromSet(set, uid, start, stop, function (err, groups) {
- if (err) {
- return callback(err);
- }
-
- callback(null, {
- groups: groups,
- allowGroupCreation: parseInt(meta.config.allowGroupCreation, 10) === 1,
- nextStart: stop + 1
- });
- });
+ async.waterfall([
+ function (next) {
+ groups.getGroupsFromSet(set, uid, start, stop, next);
+ },
+ function (groupsData, next) {
+ next(null, {
+ groups: groupsData,
+ allowGroupCreation: parseInt(meta.config.allowGroupCreation, 10) === 1,
+ nextStart: stop + 1,
+ });
+ },
+ ], callback);
};
groupsController.details = function (req, res, callback) {
@@ -58,7 +59,7 @@ groupsController.details = function (req, res, callback) {
}
async.parallel({
exists: async.apply(groups.exists, groupName),
- hidden: async.apply(groups.isHidden, groupName)
+ hidden: async.apply(groups.isHidden, groupName),
}, next);
},
function (results, next) {
@@ -70,7 +71,7 @@ groupsController.details = function (req, res, callback) {
}
async.parallel({
isMember: async.apply(groups.isMember, req.uid, groupName),
- isInvited: async.apply(groups.isInvited, req.uid, groupName)
+ isInvited: async.apply(groups.isInvited, req.uid, groupName),
}, function (err, checks) {
if (err || checks.isMember || checks.isInvited) {
return next(err);
@@ -84,20 +85,20 @@ groupsController.details = function (req, res, callback) {
groups.get(groupName, {
uid: req.uid,
truncateUserList: true,
- userListCount: 20
+ userListCount: 20,
}, next);
},
posts: function (next) {
groups.getLatestMemberPosts(groupName, 10, req.uid, next);
},
- isAdmin:function (next) {
+ isAdmin: function (next) {
user.isAdministrator(req.uid, next);
},
isGlobalMod: function (next) {
user.isGlobalModerator(req.uid, next);
- }
+ },
}, next);
- }
+ },
], function (err, results) {
if (err) {
return callback(err);
@@ -108,7 +109,7 @@ groupsController.details = function (req, res, callback) {
}
results.group.isOwner = results.group.isOwner || results.isAdmin || (results.isGlobalMod && !results.group.system);
results.title = '[[pages:group, ' + results.group.displayName + ']]';
- results.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[pages:groups]]', url: '/groups' }, {text: results.group.displayName}]);
+ results.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[pages:groups]]', url: '/groups' }, { text: results.group.displayName }]);
results.allowPrivateGroups = parseInt(meta.config.allowPrivateGroups, 10) === 1;
res.render('groups/details', results);
@@ -129,7 +130,7 @@ groupsController.members = function (req, res, callback) {
async.parallel({
isAdminOrGlobalMod: async.apply(user.isAdminOrGlobalMod, req.uid),
isMember: async.apply(groups.isMember, req.uid, groupName),
- isHidden: async.apply(groups.isHidden, groupName)
+ isHidden: async.apply(groups.isHidden, groupName),
}, next);
},
function (results, next) {
@@ -145,16 +146,16 @@ groupsController.members = function (req, res, callback) {
}
var breadcrumbs = helpers.buildBreadcrumbs([
- {text: '[[pages:groups]]', url: '/groups' },
- {text: validator.escape(String(groupName)), url: '/groups/' + req.params.slug},
- {text: '[[groups:details.members]]'}
+ { text: '[[pages:groups]]', url: '/groups' },
+ { text: validator.escape(String(groupName)), url: '/groups/' + req.params.slug },
+ { text: '[[groups:details.members]]' },
]);
res.render('groups/members', {
users: users,
nextStart: 50,
loadmore_display: users.length > 50 ? 'block' : 'hide',
- breadcrumbs: breadcrumbs
+ breadcrumbs: breadcrumbs,
});
});
};
@@ -173,14 +174,14 @@ groupsController.uploadCover = function (req, res, next) {
groups.updateCover(req.uid, {
file: req.files.files[0].path,
- groupName: params.groupName
+ groupName: params.groupName,
}, next);
- }
+ },
], function (err, image) {
if (err) {
return next(err);
}
- res.json([{url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url}]);
+ res.json([{ url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url }]);
});
};
diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js
index 488ac6507c..5571bfbf62 100644
--- a/src/controllers/helpers.js
+++ b/src/controllers/helpers.js
@@ -17,8 +17,8 @@ helpers.notAllowed = function (req, res, error) {
plugins.fireHook('filter:helpers.notAllowed', {
req: req,
res: res,
- error: error
- }, function (err, data) {
+ error: error,
+ }, function (err) {
if (err) {
return winston.error(err);
}
@@ -28,24 +28,22 @@ helpers.notAllowed = function (req, res, error) {
path: req.path.replace(/^\/api/, ''),
loggedIn: !!req.uid,
error: error,
- title: '[[global:403.title]]'
+ title: '[[global:403.title]]',
});
} else {
res.status(403).render('403', {
path: req.path,
loggedIn: !!req.uid,
error: error,
- title: '[[global:403.title]]'
+ title: '[[global:403.title]]',
});
}
+ } else if (res.locals.isAPI) {
+ req.session.returnTo = nconf.get('relative_path') + req.url.replace(/^\/api/, '');
+ res.status(401).json('not-authorized');
} else {
- if (res.locals.isAPI) {
- req.session.returnTo = nconf.get('relative_path') + req.url.replace(/^\/api/, '');
- res.status(401).json('not-authorized');
- } else {
- req.session.returnTo = nconf.get('relative_path') + req.url;
- res.redirect(nconf.get('relative_path') + '/login');
- }
+ req.session.returnTo = nconf.get('relative_path') + req.url;
+ res.redirect(nconf.get('relative_path') + '/login');
}
});
};
@@ -72,7 +70,7 @@ helpers.buildCategoryBreadcrumbs = function (cid, callback) {
if (!parseInt(data.disabled, 10)) {
breadcrumbs.unshift({
text: validator.escape(String(data.name)),
- url: nconf.get('relative_path') + '/category/' + data.slug
+ url: nconf.get('relative_path') + '/category/' + data.slug,
});
}
@@ -87,13 +85,13 @@ helpers.buildCategoryBreadcrumbs = function (cid, callback) {
if (!meta.config.homePageRoute && meta.config.homePageCustom) {
breadcrumbs.unshift({
text: '[[global:header.categories]]',
- url: nconf.get('relative_path') + '/categories'
+ url: nconf.get('relative_path') + '/categories',
});
}
breadcrumbs.unshift({
text: '[[global:home]]',
- url: nconf.get('relative_path') + '/'
+ url: nconf.get('relative_path') + '/',
});
callback(null, breadcrumbs);
@@ -104,8 +102,8 @@ helpers.buildBreadcrumbs = function (crumbs) {
var breadcrumbs = [
{
text: '[[global:home]]',
- url: nconf.get('relative_path') + '/'
- }
+ url: nconf.get('relative_path') + '/',
+ },
];
crumbs.forEach(function (crumb) {
@@ -164,8 +162,8 @@ helpers.getWatchedCategories = function (uid, selectedCid, callback) {
recursive(category, categoriesData, '');
});
- next(null, {categories: categoriesData, selectedCategory: selectedCategory});
- }
+ next(null, { categories: categoriesData, selectedCategory: selectedCategory });
+ },
], callback);
};
diff --git a/src/controllers/index.js b/src/controllers/index.js
index 800559db4b..1ec1696e21 100644
--- a/src/controllers/index.js
+++ b/src/controllers/index.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var nconf = require('nconf');
@@ -28,7 +28,7 @@ var Controllers = {
admin: require('./admin'),
globalMods: require('./globalmods'),
mods: require('./mods'),
- sitemap: require('./sitemap')
+ sitemap: require('./sitemap'),
};
@@ -46,7 +46,7 @@ Controllers.home = function (req, res, next) {
var hook = 'action:homepage.get:' + route;
if (plugins.hasListeners(hook)) {
- return plugins.fireHook(hook, {req: req, res: res, next: next});
+ return plugins.fireHook(hook, { req: req, res: res, next: next });
}
if (route === 'categories' || route === '/') {
@@ -61,7 +61,7 @@ Controllers.home = function (req, res, next) {
var match = /^category\/(\d+)\/(.*)$/.exec(route);
if (match) {
- req.params.topic_index = "1";
+ req.params.topic_index = '1';
req.params.category_id = match[1];
req.params.slug = match[2];
Controllers.category.get(req, res, next);
@@ -83,8 +83,8 @@ Controllers.reset = function (req, res, next) {
displayExpiryNotice: req.session.passwordExpired,
code: req.params.code,
minimumPasswordLength: parseInt(meta.config.minimumPasswordLength, 10),
- breadcrumbs: helpers.buildBreadcrumbs([{text: '[[reset_password:reset_password]]', url: '/reset'}, {text: '[[reset_password:update_password]]'}]),
- title: '[[pages:reset]]'
+ breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[reset_password:reset_password]]', url: '/reset' }, { text: '[[reset_password:update_password]]' }]),
+ title: '[[pages:reset]]',
});
delete req.session.passwordExpired;
@@ -92,8 +92,8 @@ Controllers.reset = function (req, res, next) {
} else {
res.render('reset', {
code: null,
- breadcrumbs: helpers.buildBreadcrumbs([{text: '[[reset_password:reset_password]]'}]),
- title: '[[pages:reset]]'
+ breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[reset_password:reset_password]]' }]),
+ title: '[[pages:reset]]',
});
}
};
@@ -122,18 +122,17 @@ Controllers.login = function (req, res, next) {
data.allowLocalLogin = parseInt(meta.config.allowLocalLogin, 10) === 1 || parseInt(req.query.local, 10) === 1;
data.allowRegistration = registrationType === 'normal' || registrationType === 'admin-approval' || registrationType === 'admin-approval-ip';
data.allowLoginWith = '[[login:' + allowLoginWith + ']]';
- data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:login]]'}]);
+ data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[global:login]]' }]);
data.error = req.flash('error')[0] || errorText;
data.title = '[[pages:login]]';
if (!data.allowLocalLogin && !data.allowRegistration && data.alternate_logins && data.authentication.length === 1) {
if (res.locals.isAPI) {
return helpers.redirect(res, {
- external: data.authentication[0].url
+ external: data.authentication[0].url,
});
- } else {
- return res.redirect(nconf.get('relative_path') + data.authentication[0].url);
}
+ return res.redirect(nconf.get('relative_path') + data.authentication[0].url);
}
if (req.uid) {
user.getUserFields(req.uid, ['username', 'email'], function (err, user) {
@@ -147,7 +146,6 @@ Controllers.login = function (req, res, next) {
} else {
res.render('login', data);
}
-
};
Controllers.register = function (req, res, next) {
@@ -171,8 +169,8 @@ Controllers.register = function (req, res, next) {
}
},
function (next) {
- plugins.fireHook('filter:parse.post', {postData: {content: meta.config.termsOfUse || ''}}, next);
- }
+ plugins.fireHook('filter:parse.post', { postData: { content: meta.config.termsOfUse || '' } }, next);
+ },
], function (err, termsOfUse) {
if (err) {
return next(err);
@@ -180,7 +178,7 @@ Controllers.register = function (req, res, next) {
var loginStrategies = require('../routes/authentication').getLoginStrategies();
var data = {
'register_window:spansize': loginStrategies.length ? 'col-md-6' : 'col-md-12',
- 'alternate_logins': !!loginStrategies.length
+ alternate_logins: !!loginStrategies.length,
};
data.authentication = loginStrategies;
@@ -189,7 +187,7 @@ Controllers.register = function (req, res, next) {
data.maximumUsernameLength = parseInt(meta.config.maximumUsernameLength, 10);
data.minimumPasswordLength = parseInt(meta.config.minimumPasswordLength, 10);
data.termsOfUse = termsOfUse.postData.content;
- data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[register:register]]'}]);
+ data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[register:register]]' }]);
data.regFormEntry = [];
data.error = req.flash('error')[0] || errorText;
data.title = '[[pages:register]]';
@@ -205,7 +203,7 @@ Controllers.registerInterstitial = function (req, res, next) {
plugins.fireHook('filter:register.interstitial', {
userData: req.session.registration,
- interstitials: []
+ interstitials: [],
}, function (err, data) {
if (err) {
return next(err);
@@ -230,7 +228,7 @@ Controllers.registerInterstitial = function (req, res, next) {
res.render('registerComplete', {
title: '[[pages:registration-complete]]',
errors: errors,
- sections: sections
+ sections: sections,
});
});
});
@@ -241,7 +239,7 @@ Controllers.compose = function (req, res, next) {
req: req,
res: res,
next: next,
- templateData: {}
+ templateData: {},
}, function (err, data) {
if (err) {
return next(err);
@@ -249,7 +247,7 @@ Controllers.compose = function (req, res, next) {
if (data.templateData.disabled) {
res.render('', {
- title: '[[modules:composer.compose]]'
+ title: '[[modules:composer.compose]]',
});
} else {
data.templateData.title = '[[modules:composer.compose]]';
@@ -270,12 +268,12 @@ Controllers.confirmEmail = function (req, res) {
Controllers.robots = function (req, res) {
res.set('Content-Type', 'text/plain');
- if (meta.config["robots.txt"]) {
- res.send(meta.config["robots.txt"]);
+ if (meta.config['robots.txt']) {
+ res.send(meta.config['robots.txt']);
} else {
- res.send("User-agent: *\n" +
- "Disallow: " + nconf.get('relative_path') + "/admin/\n" +
- "Sitemap: " + nconf.get('url') + "/sitemap.xml");
+ res.send('User-agent: *\n' +
+ 'Disallow: ' + nconf.get('relative_path') + '/admin/\n' +
+ 'Sitemap: ' + nconf.get('url') + '/sitemap.xml');
}
};
@@ -285,7 +283,7 @@ Controllers.manifest = function (req, res) {
start_url: nconf.get('relative_path') + '/',
display: 'standalone',
orientation: 'portrait',
- icons: []
+ icons: [],
};
if (meta.config['brand:touchIcon']) {
@@ -293,32 +291,32 @@ Controllers.manifest = function (req, res) {
src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-36.png',
sizes: '36x36',
type: 'image/png',
- density: 0.75
+ density: 0.75,
}, {
src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-48.png',
sizes: '48x48',
type: 'image/png',
- density: 1.0
+ density: 1.0,
}, {
src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-72.png',
sizes: '72x72',
type: 'image/png',
- density: 1.5
+ density: 1.5,
}, {
src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-96.png',
sizes: '96x96',
type: 'image/png',
- density: 2.0
+ density: 2.0,
}, {
src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-144.png',
sizes: '144x144',
type: 'image/png',
- density: 3.0
+ density: 3.0,
}, {
src: nconf.get('relative_path') + '/assets/uploads/system/touchicon-192.png',
sizes: '192x192',
type: 'image/png',
- density: 4.0
+ density: 4.0,
});
}
@@ -330,7 +328,7 @@ Controllers.outgoing = function (req, res) {
var data = {
outgoing: validator.escape(String(url)),
title: meta.config.title,
- breadcrumbs: helpers.buildBreadcrumbs([{text: '[[notifications:outgoing_link]]'}])
+ breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[notifications:outgoing_link]]' }]),
};
if (url) {
@@ -344,7 +342,7 @@ Controllers.termsOfUse = function (req, res, next) {
if (!meta.config.termsOfUse) {
return next();
}
- res.render('tos', {termsOfUse: meta.config.termsOfUse});
+ res.render('tos', { termsOfUse: meta.config.termsOfUse });
};
Controllers.ping = function (req, res) {
@@ -359,7 +357,7 @@ Controllers.handle404 = function (req, res) {
return plugins.fireHook('action:meta.override404', {
req: req,
res: res,
- error: {}
+ error: {},
});
}
@@ -379,11 +377,11 @@ Controllers.handle404 = function (req, res) {
var path = String(req.path || '');
if (res.locals.isAPI) {
- return res.json({path: validator.escape(path.replace(/^\/api/, '')), title: '[[global:404.title]]'});
+ return res.json({ path: validator.escape(path.replace(/^\/api/, '')), title: '[[global:404.title]]' });
}
var middleware = require('../middleware');
middleware.buildHeader(req, res, function () {
- res.render('404', {path: validator.escape(path), title: '[[global:404.title]]'});
+ res.render('404', { path: validator.escape(path), title: '[[global:404.title]]' });
});
} else {
res.status(404).type('txt').send('Not found');
@@ -404,7 +402,7 @@ Controllers.handleURIErrors = function (err, req, res, next) {
winston.warn('[controller] Bad request: ' + req.path);
if (res.locals.isAPI) {
res.status(400).json({
- error: '[[global:400.title]]'
+ error: '[[global:400.title]]',
});
} else {
var middleware = require('../middleware');
@@ -413,20 +411,20 @@ Controllers.handleURIErrors = function (err, req, res, next) {
});
}
}
-
- return;
} else {
next(err);
}
};
-Controllers.handleErrors = function (err, req, res, next) {
+// this needs to have four arguments or express treats it as `(req, res, next)`
+// don't remove `next`!
+Controllers.handleErrors = function (err, req, res, next) { // eslint-disable-line no-unused-vars
switch (err.code) {
- case 'EBADCSRFTOKEN':
- winston.error(req.path + '\n', err.message);
- return res.sendStatus(403);
- case 'blacklisted-ip':
- return res.status(403).type('text/plain').send(err.message);
+ case 'EBADCSRFTOKEN':
+ winston.error(req.path + '\n', err.message);
+ return res.sendStatus(403);
+ case 'blacklisted-ip':
+ return res.status(403).type('text/plain').send(err.message);
}
if (parseInt(err.status, 10) === 302 && err.path) {
@@ -439,7 +437,7 @@ Controllers.handleErrors = function (err, req, res, next) {
var path = String(req.path || '');
if (res.locals.isAPI) {
- res.json({path: validator.escape(path), error: err.message});
+ res.json({ path: validator.escape(path), error: err.message });
} else {
var middleware = require('../middleware');
middleware.buildHeader(req, res, function () {
diff --git a/src/controllers/mods.js b/src/controllers/mods.js
index 8056b8c5b5..a34ebacb8b 100644
--- a/src/controllers/mods.js
+++ b/src/controllers/mods.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
@@ -14,7 +14,7 @@ var modsController = {
modsController.flags.list = function (req, res, next) {
async.parallel({
isAdminOrGlobalMod: async.apply(user.isAdminOrGlobalMod, req.uid),
- moderatedCids: async.apply(user.getModeratedCids, req.uid)
+ moderatedCids: async.apply(user.getModeratedCids, req.uid),
}, function (err, results) {
if (err) {
return next(err);
diff --git a/src/controllers/popular.js b/src/controllers/popular.js
index f38edd594c..21c07224c1 100644
--- a/src/controllers/popular.js
+++ b/src/controllers/popular.js
@@ -14,11 +14,10 @@ var lastUpdateTime = 0;
var terms = {
daily: 'day',
weekly: 'week',
- monthly: 'month'
+ monthly: 'month',
};
popularController.get = function (req, res, next) {
-
var term = terms[req.params.term];
if (!term && req.params.term) {
@@ -30,7 +29,7 @@ popularController.get = function (req, res, next) {
day: '[[recent:day]]',
week: '[[recent:week]]',
month: '[[recent:month]]',
- alltime: '[[global:header.popular]]'
+ alltime: '[[global:header.popular]]',
};
if (!req.uid) {
@@ -49,14 +48,14 @@ popularController.get = function (req, res, next) {
'feeds:disableRSS': parseInt(meta.config['feeds:disableRSS'], 10) === 1,
rssFeedUrl: nconf.get('relative_path') + '/popular/' + (req.params.term || 'daily') + '.rss',
title: '[[pages:popular-' + term + ']]',
- term: term
+ term: term,
};
if (req.path.startsWith('/api/popular') || req.path.startsWith('/popular')) {
- var breadcrumbs = [{text: termToBreadcrumb[term]}];
+ var breadcrumbs = [{ text: termToBreadcrumb[term] }];
if (req.params.term) {
- breadcrumbs.unshift({text: '[[global:header.popular]]', url: '/popular'});
+ breadcrumbs.unshift({ text: '[[global:header.popular]]', url: '/popular' });
}
data.breadcrumbs = helpers.buildBreadcrumbs(breadcrumbs);
@@ -71,4 +70,4 @@ popularController.get = function (req, res, next) {
});
};
-module.exports = popularController;
\ No newline at end of file
+module.exports = popularController;
diff --git a/src/controllers/posts.js b/src/controllers/posts.js
index dae990e171..90596d5b34 100644
--- a/src/controllers/posts.js
+++ b/src/controllers/posts.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var posts = require('../posts');
var helpers = require('./helpers');
diff --git a/src/controllers/recent.js b/src/controllers/recent.js
index 2da6e7d09c..c5d1d2128a 100644
--- a/src/controllers/recent.js
+++ b/src/controllers/recent.js
@@ -13,7 +13,7 @@ var pagination = require('../pagination');
var recentController = {};
-var validFilter = {'': true, 'new': true, 'watched': true};
+var validFilter = { '': true, new: true, watched: true };
recentController.get = function (req, res, next) {
var page = parseInt(req.query.page, 10) || 1;
@@ -35,7 +35,7 @@ recentController.get = function (req, res, next) {
},
watchedCategories: function (next) {
helpers.getWatchedCategories(req.uid, cid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -46,7 +46,7 @@ recentController.get = function (req, res, next) {
stop = start + settings.topicsPerPage - 1;
topics.getRecentTopics(cid, req.uid, start, stop, filter, next);
- }
+ },
], function (err, data) {
if (err) {
return next(err);
@@ -63,17 +63,17 @@ recentController.get = function (req, res, next) {
name: '[[unread:all-topics]]',
url: 'recent',
selected: filter === '',
- filter: ''
+ filter: '',
}, {
name: '[[unread:new-topics]]',
url: 'recent/new',
selected: filter === 'new',
- filter: 'new'
+ filter: 'new',
}, {
name: '[[unread:watched-topics]]',
url: 'recent/watched',
selected: filter === 'watched',
- filter: 'watched'
+ filter: 'watched',
}];
data.selectedFilter = data.filters.find(function (filter) {
@@ -84,7 +84,7 @@ recentController.get = function (req, res, next) {
data.pagination = pagination.create(page, pageCount, req.query);
if (req.path.startsWith('/api/recent') || req.path.startsWith('/recent')) {
- data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[recent:title]]'}]);
+ data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[recent:title]]' }]);
}
data.querystring = cid ? ('?cid=' + validator.escape(String(cid))) : '';
@@ -92,4 +92,4 @@ recentController.get = function (req, res, next) {
});
};
-module.exports = recentController;
\ No newline at end of file
+module.exports = recentController;
diff --git a/src/controllers/search.js b/src/controllers/search.js
index db3adf0682..be98589c54 100644
--- a/src/controllers/search.js
+++ b/src/controllers/search.js
@@ -42,20 +42,20 @@ searchController.search = function (req, res, next) {
sortDirection: req.query.sortDirection,
page: page,
uid: req.uid,
- qs: req.query
+ qs: req.query,
};
async.parallel({
categories: async.apply(categories.buildForSelect, req.uid),
- search: async.apply(search.search, data)
+ search: async.apply(search.search, data),
}, function (err, results) {
if (err) {
return next(err);
}
var categoriesData = [
- {value: 'all', text: '[[unread:all_categories]]'},
- {value: 'watched', text: '[[category:watched-categories]]'}
+ { value: 'all', text: '[[unread:all_categories]]' },
+ { value: 'watched', text: '[[category:watched-categories]]' },
].concat(results.categories);
var searchData = results.search;
@@ -65,7 +65,7 @@ searchController.search = function (req, res, next) {
searchData.showAsPosts = !req.query.showAs || req.query.showAs === 'posts';
searchData.showAsTopics = req.query.showAs === 'topics';
searchData.title = '[[global:header.search]]';
- searchData.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]);
+ searchData.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[global:search]]' }]);
searchData.expandSearch = !req.query.term;
searchData.searchDefaultSortBy = meta.config.searchDefaultSortBy || '';
diff --git a/src/controllers/sitemap.js b/src/controllers/sitemap.js
index 42b0ae1076..453aed4f6e 100644
--- a/src/controllers/sitemap.js
+++ b/src/controllers/sitemap.js
@@ -65,4 +65,4 @@ sitemapController.getTopicPage = function (req, res, next) {
});
};
-module.exports = sitemapController;
\ No newline at end of file
+module.exports = sitemapController;
diff --git a/src/controllers/tags.js b/src/controllers/tags.js
index a433694220..cffff0e44c 100644
--- a/src/controllers/tags.js
+++ b/src/controllers/tags.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
@@ -8,7 +8,7 @@ var validator = require('validator');
var user = require('../user');
var topics = require('../topics');
var pagination = require('../pagination');
-var helpers = require('./helpers');
+var helpers = require('./helpers');
var tagsController = {};
@@ -19,8 +19,8 @@ tagsController.getTag = function (req, res, next) {
var templateData = {
topics: [],
tag: tag,
- breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]', url: '/tags'}, {text: tag}]),
- title: '[[pages:tag, ' + tag + ']]'
+ breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[tags:tags]]', url: '/tags' }, { text: tag }]),
+ title: '[[pages:tag, ' + tag + ']]',
};
var settings;
var topicCount = 0;
@@ -39,7 +39,7 @@ tagsController.getTag = function (req, res, next) {
},
tids: function (next) {
topics.getTagTids(req.params.tag, start, stop, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -48,7 +48,7 @@ tagsController.getTag = function (req, res, next) {
}
topicCount = results.topicCount;
topics.getTopics(results.tids, req.uid, next);
- }
+ },
], function (err, topics) {
if (err) {
return next(err);
@@ -57,16 +57,16 @@ tagsController.getTag = function (req, res, next) {
res.locals.metaTags = [
{
name: 'title',
- content: tag
+ content: tag,
},
{
property: 'og:title',
- content: tag
+ content: tag,
},
{
property: 'og:url',
- content: nconf.get('url') + '/tags/' + tag
- }
+ content: nconf.get('url') + '/tags/' + tag,
+ },
];
templateData.topics = topics;
@@ -86,8 +86,8 @@ tagsController.getTags = function (req, res, next) {
var data = {
tags: tags,
nextStart: 100,
- breadcrumbs: helpers.buildBreadcrumbs([{text: '[[tags:tags]]'}]),
- title: '[[pages:tags]]'
+ breadcrumbs: helpers.buildBreadcrumbs([{ text: '[[tags:tags]]' }]),
+ title: '[[pages:tags]]',
};
res.render('tags', data);
});
diff --git a/src/controllers/topics.js b/src/controllers/topics.js
index 1224de5bcd..1d813868ae 100644
--- a/src/controllers/topics.js
+++ b/src/controllers/topics.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
@@ -39,7 +39,7 @@ topicsController.get = function (req, res, callback) {
},
topic: function (next) {
topics.getTopicData(tid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -113,7 +113,7 @@ topicsController.get = function (req, res, callback) {
currentPage = Math.max(1, Math.ceil(index / settings.postsPerPage));
}
- var start = (currentPage - 1) * settings.postsPerPage + postIndex;
+ var start = ((currentPage - 1) * settings.postsPerPage) + postIndex;
var stop = start + settings.postsPerPage - 1;
topics.getTopicWithPosts(results.topic, set, req.uid, start, stop, reverse, next);
@@ -125,18 +125,17 @@ topicsController.get = function (req, res, callback) {
topics.modifyPostsByPrivilege(topicData, userPrivileges);
- plugins.fireHook('filter:controllers.topic.get', {topicData: topicData, uid: req.uid}, next);
+ plugins.fireHook('filter:controllers.topic.get', { topicData: topicData, uid: req.uid }, next);
},
function (data, next) {
-
var breadcrumbs = [
{
text: data.topicData.category.name,
- url: nconf.get('relative_path') + '/category/' + data.topicData.category.slug
+ url: nconf.get('relative_path') + '/category/' + data.topicData.category.slug,
},
{
- text: data.topicData.title
- }
+ text: data.topicData.title,
+ },
];
helpers.buildCategoryBreadcrumbs(data.topicData.category.parentCid, function (err, crumbs) {
@@ -149,7 +148,7 @@ topicsController.get = function (req, res, callback) {
},
function (topicData, next) {
function findPost(index) {
- for(var i = 0; i < topicData.posts.length; ++i) {
+ for (var i = 0; i < topicData.posts.length; i += 1) {
if (parseInt(topicData.posts[i].index, 10) === parseInt(index, 10)) {
return topicData.posts[i];
}
@@ -187,71 +186,71 @@ topicsController.get = function (req, res, callback) {
res.locals.metaTags = [
{
- name: "title",
- content: topicData.titleRaw
+ name: 'title',
+ content: topicData.titleRaw,
},
{
- name: "description",
- content: description
+ name: 'description',
+ content: description,
},
{
property: 'og:title',
- content: topicData.titleRaw
+ content: topicData.titleRaw,
},
{
property: 'og:description',
- content: description
+ content: description,
},
{
- property: "og:type",
- content: 'article'
+ property: 'og:type',
+ content: 'article',
},
{
- property: "og:url",
+ property: 'og:url',
content: nconf.get('url') + '/topic/' + topicData.slug + (req.params.post_index ? ('/' + req.params.post_index) : ''),
- noEscape: true
+ noEscape: true,
},
{
property: 'og:image',
content: ogImageUrl,
- noEscape: true
+ noEscape: true,
},
{
- property: "og:image:url",
+ property: 'og:image:url',
content: ogImageUrl,
- noEscape: true
+ noEscape: true,
},
{
- property: "article:published_time",
- content: utils.toISOString(topicData.timestamp)
+ property: 'article:published_time',
+ content: utils.toISOString(topicData.timestamp),
},
{
property: 'article:modified_time',
- content: utils.toISOString(topicData.lastposttime)
+ content: utils.toISOString(topicData.lastposttime),
},
{
property: 'article:section',
- content: topicData.category ? topicData.category.name : ''
- }
+ content: topicData.category ? topicData.category.name : '',
+ },
];
res.locals.linkTags = [
{
rel: 'alternate',
type: 'application/rss+xml',
- href: nconf.get('url') + '/topic/' + tid + '.rss'
- }
+ href: nconf.get('url') + '/topic/' + tid + '.rss',
+ },
];
if (topicData.category) {
res.locals.linkTags.push({
rel: 'up',
- href: nconf.get('url') + '/category/' + topicData.category.slug
+ href: nconf.get('url') + '/category/' + topicData.category.slug,
});
}
next(null, topicData);
- }
+ },
], function (err, data) {
if (err) {
return callback(err);
@@ -299,7 +298,7 @@ topicsController.teaser = function (req, res, next) {
var tid = req.params.topic_id;
if (!utils.isNumber(tid)) {
- return next(new Error('[[error:invalid-tid]]'));
+ return next();
}
async.waterfall([
@@ -316,8 +315,8 @@ topicsController.teaser = function (req, res, next) {
if (!pid) {
return res.status(404).json('not-found');
}
- posts.getPostSummaryByPids([pid], req.uid, {stripTags: false}, next);
- }
+ posts.getPostSummaryByPids([pid], req.uid, { stripTags: false }, next);
+ },
], function (err, posts) {
if (err) {
return next(err);
@@ -341,7 +340,7 @@ topicsController.pagination = function (req, res, callback) {
async.parallel({
privileges: async.apply(privileges.topics.get, tid, req.uid),
settings: async.apply(user.getSettings, req.uid),
- topic: async.apply(topics.getTopicData, tid)
+ topic: async.apply(topics.getTopicData, tid),
}, function (err, results) {
if (err || !results.topic) {
return callback(err);
diff --git a/src/controllers/unread.js b/src/controllers/unread.js
index 8be52f955c..5e00cf5c96 100644
--- a/src/controllers/unread.js
+++ b/src/controllers/unread.js
@@ -12,7 +12,7 @@ var helpers = require('./helpers');
var unreadController = {};
-var validFilter = {'': true, 'new': true, 'watched': true};
+var validFilter = { '': true, new: true, watched: true };
unreadController.get = function (req, res, next) {
var page = parseInt(req.query.page, 10) || 1;
@@ -32,7 +32,7 @@ unreadController.get = function (req, res, next) {
},
settings: function (next) {
user.getSettings(req.uid, next);
- }
+ },
}, next);
},
function (_results, next) {
@@ -47,9 +47,9 @@ unreadController.get = function (req, res, next) {
start: start,
stop: stop,
filter: filter,
- cutoff: cutoff
+ cutoff: cutoff,
}, next);
- }
+ },
], function (err, data) {
if (err) {
return next(err);
@@ -67,7 +67,7 @@ unreadController.get = function (req, res, next) {
data.selectedCategory = results.watchedCategories.selectedCategory;
if (req.path.startsWith('/api/unread') || req.path.startsWith('/unread')) {
- data.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[unread:title]]'}]);
+ data.breadcrumbs = helpers.buildBreadcrumbs([{ text: '[[unread:title]]' }]);
}
data.title = '[[pages:unread]]';
@@ -75,17 +75,17 @@ unreadController.get = function (req, res, next) {
name: '[[unread:all-topics]]',
url: 'unread',
selected: filter === '',
- filter: ''
+ filter: '',
}, {
name: '[[unread:new-topics]]',
url: 'unread/new',
selected: filter === 'new',
- filter: 'new'
+ filter: 'new',
}, {
name: '[[unread:watched-topics]]',
url: 'unread/watched',
selected: filter === 'watched',
- filter: 'watched'
+ filter: 'watched',
}];
data.selectedFilter = data.filters.find(function (filter) {
diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js
index 923e3cf7d8..25375e91a9 100644
--- a/src/controllers/uploads.js
+++ b/src/controllers/uploads.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var fs = require('fs');
var path = require('path');
@@ -6,7 +6,6 @@ var async = require('async');
var nconf = require('nconf');
var validator = require('validator');
var winston = require('winston');
-var mime = require('mime');
var meta = require('../meta');
var file = require('../file');
@@ -31,7 +30,7 @@ uploadsController.upload = function (req, res, filesIterator) {
deleteTempFiles(files);
if (err) {
- return res.status(500).send(err.message);
+ return res.status(500).json({ path: req.path, error: err.message });
}
res.status(200).send(images);
@@ -61,7 +60,7 @@ function uploadAsImage(req, uploadedFile, callback) {
if (plugins.hasListeners('filter:uploadImage')) {
return plugins.fireHook('filter:uploadImage', {
image: uploadedFile,
- uid: req.uid
+ uid: req.uid,
}, callback);
}
file.isFileTypeAllowed(uploadedFile.path, next);
@@ -75,7 +74,7 @@ function uploadAsImage(req, uploadedFile, callback) {
}
resizeImage(fileObj, next);
- }
+ },
], callback);
}
@@ -92,7 +91,7 @@ function uploadAsFile(req, uploadedFile, callback) {
return next(new Error('[[error:uploads-are-disabled]]'));
}
uploadFile(req.uid, uploadedFile, next);
- }
+ },
], callback);
}
@@ -114,11 +113,10 @@ function resizeImage(fileObj, callback) {
path: fileObj.path,
target: path.join(dirname, basename + '-resized' + extname),
extension: extname,
- width: parseInt(meta.config.maximumImageWidth, 10) || 760
+ width: parseInt(meta.config.maximumImageWidth, 10) || 760,
}, next);
},
function (next) {
-
// Return the resized version to the composer/postData
var dirname = path.dirname(fileObj.url);
var extname = path.extname(fileObj.url);
@@ -127,7 +125,7 @@ function resizeImage(fileObj, callback) {
fileObj.url = path.join(dirname, basename + '-resized' + extname);
next(null, fileObj);
- }
+ },
], callback);
}
@@ -138,36 +136,34 @@ uploadsController.uploadThumb = function (req, res, next) {
}
uploadsController.upload(req, res, function (uploadedFile, next) {
- file.isFileTypeAllowed(uploadedFile.path, function (err) {
- if (err) {
- return next(err);
- }
-
- if (!uploadedFile.type.match(/image./)) {
- return next(new Error('[[error:invalid-file]]'));
- }
-
- var size = parseInt(meta.config.topicThumbSize, 10) || 120;
- image.resizeImage({
- path: uploadedFile.path,
- extension: path.extname(uploadedFile.name),
- width: size,
- height: size
- }, function (err) {
- if (err) {
- return next(err);
+ async.waterfall([
+ function (next) {
+ if (!uploadedFile.type.match(/image./)) {
+ return next(new Error('[[error:invalid-file]]'));
}
+ file.isFileTypeAllowed(uploadedFile.path, next);
+ },
+ function (next) {
+ var size = parseInt(meta.config.topicThumbSize, 10) || 120;
+ image.resizeImage({
+ path: uploadedFile.path,
+ extension: path.extname(uploadedFile.name),
+ width: size,
+ height: size,
+ }, next);
+ },
+ function (next) {
if (plugins.hasListeners('filter:uploadImage')) {
return plugins.fireHook('filter:uploadImage', {
image: uploadedFile,
- uid: req.uid
+ uid: req.uid,
}, next);
}
uploadFile(req.uid, uploadedFile, next);
- });
- });
+ },
+ ], next);
}, next);
};
@@ -175,30 +171,32 @@ uploadsController.uploadGroupCover = function (uid, uploadedFile, callback) {
if (plugins.hasListeners('filter:uploadImage')) {
return plugins.fireHook('filter:uploadImage', {
image: uploadedFile,
- uid: uid
+ uid: uid,
}, callback);
}
if (plugins.hasListeners('filter:uploadFile')) {
return plugins.fireHook('filter:uploadFile', {
file: uploadedFile,
- uid: uid
+ uid: uid,
}, callback);
}
- file.isFileTypeAllowed(uploadedFile.path, function (err) {
- if (err) {
- return callback(err);
- }
- saveFileToLocal(uploadedFile, callback);
- });
+ async.waterfall([
+ function (next) {
+ file.isFileTypeAllowed(uploadedFile.path, next);
+ },
+ function (next) {
+ saveFileToLocal(uploadedFile, next);
+ },
+ ], callback);
};
function uploadFile(uid, uploadedFile, callback) {
if (plugins.hasListeners('filter:uploadFile')) {
return plugins.fireHook('filter:uploadFile', {
file: uploadedFile,
- uid: uid
+ uid: uid,
}, callback);
}
@@ -230,17 +228,18 @@ function saveFileToLocal(uploadedFile, callback) {
filename = Date.now() + '-' + validator.escape(filename.replace(path.extname(uploadedFile.name) || '', '')).substr(0, 255) + extension;
- file.saveFileToLocal(filename, 'files', uploadedFile.path, function (err, upload) {
- if (err) {
- return callback(err);
- }
-
- callback(null, {
- url: nconf.get('relative_path') + upload.url,
- path: upload.path,
- name: uploadedFile.name
- });
- });
+ async.waterfall([
+ function (next) {
+ file.saveFileToLocal(filename, 'files', uploadedFile.path, next);
+ },
+ function (upload, next) {
+ next(null, {
+ url: nconf.get('relative_path') + upload.url,
+ path: upload.path,
+ name: uploadedFile.name,
+ });
+ },
+ ], callback);
}
function deleteTempFiles(files) {
diff --git a/src/controllers/users.js b/src/controllers/users.js
index baf18a5b64..ae3643bb8d 100644
--- a/src/controllers/users.js
+++ b/src/controllers/users.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var user = require('../user');
@@ -20,7 +20,7 @@ usersController.index = function (req, res, next) {
'sort-posts': usersController.getUsersSortedByPosts,
'sort-reputation': usersController.getUsersSortedByReputation,
banned: usersController.getBannedUsers,
- flagged: usersController.getFlaggedUsers
+ flagged: usersController.getFlaggedUsers,
};
if (req.query.term) {
@@ -42,12 +42,12 @@ usersController.search = function (req, res, next) {
sortBy: req.query.sortBy,
onlineOnly: req.query.onlineOnly === 'true',
bannedOnly: req.query.bannedOnly === 'true',
- flaggedOnly: req.query.flaggedOnly === 'true'
+ flaggedOnly: req.query.flaggedOnly === 'true',
}, next);
},
isAdminOrGlobalMod: function (next) {
user.isAdminOrGlobalMod(req.uid, next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -69,7 +69,7 @@ usersController.getOnlineUsers = function (req, res, next) {
},
guests: function (next) {
require('../socket.io/admin/rooms').getTotalGuestCount(next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -79,7 +79,7 @@ usersController.getOnlineUsers = function (req, res, next) {
if (!userData.isAdminOrGlobalMod) {
userData.users = userData.users.filter(function (user) {
if (user && user.status === 'offline') {
- hiddenCount ++;
+ hiddenCount += 1;
}
return user && user.status !== 'offline';
});
@@ -146,22 +146,22 @@ usersController.renderUsersPage = function (set, req, res, next) {
usersController.getUsers = function (set, uid, query, callback) {
var setToData = {
- 'users:postcount': {title: '[[pages:users/sort-posts]]', crumb: '[[users:top_posters]]'},
- 'users:reputation': {title: '[[pages:users/sort-reputation]]', crumb: '[[users:most_reputation]]'},
- 'users:joindate': {title: '[[pages:users/latest]]', crumb: '[[global:users]]'},
- 'users:online': {title: '[[pages:users/online]]', crumb: '[[global:online]]'},
- 'users:banned': {title: '[[pages:users/banned]]', crumb: '[[user:banned]]'},
- 'users:flags': {title: '[[pages:users/most-flags]]', crumb: '[[users:most_flags]]'},
+ 'users:postcount': { title: '[[pages:users/sort-posts]]', crumb: '[[users:top_posters]]' },
+ 'users:reputation': { title: '[[pages:users/sort-reputation]]', crumb: '[[users:most_reputation]]' },
+ 'users:joindate': { title: '[[pages:users/latest]]', crumb: '[[global:users]]' },
+ 'users:online': { title: '[[pages:users/online]]', crumb: '[[global:online]]' },
+ 'users:banned': { title: '[[pages:users/banned]]', crumb: '[[user:banned]]' },
+ 'users:flags': { title: '[[pages:users/most-flags]]', crumb: '[[users:most_flags]]' },
};
if (!setToData[set]) {
- setToData[set] = {title: '', crumb: ''};
+ setToData[set] = { title: '', crumb: '' };
}
- var breadcrumbs = [{text: setToData[set].crumb}];
+ var breadcrumbs = [{ text: setToData[set].crumb }];
if (set !== 'users:joindate') {
- breadcrumbs.unshift({text: '[[global:users]]', url: '/users'});
+ breadcrumbs.unshift({ text: '[[global:users]]', url: '/users' });
}
var page = parseInt(query.page, 10) || 1;
@@ -175,7 +175,7 @@ usersController.getUsers = function (set, uid, query, callback) {
},
usersData: function (next) {
usersController.getUsersAndCount(set, uid, start, stop, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -188,7 +188,7 @@ usersController.getUsers = function (set, uid, query, callback) {
userCount: results.usersData.count,
title: setToData[set].title || '[[pages:users/latest]]',
breadcrumbs: helpers.buildBreadcrumbs(breadcrumbs),
- isAdminOrGlobalMod: results.isAdminOrGlobalMod
+ isAdminOrGlobalMod: results.isAdminOrGlobalMod,
};
userData['section_' + (query.section || 'joindate')] = true;
callback(null, userData);
@@ -211,7 +211,7 @@ usersController.getUsersAndCount = function (set, uid, start, stop, callback) {
} else {
db.getObjectField('global', 'userCount', next);
}
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
diff --git a/src/coverPhoto.js b/src/coverPhoto.js
index 6307110253..024ae48f20 100644
--- a/src/coverPhoto.js
+++ b/src/coverPhoto.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var coverPhoto = {};
var meta = require('./meta');
@@ -14,13 +14,13 @@ coverPhoto.getDefaultProfileCover = function (uid) {
};
function getCover(type, id) {
- if (meta.config[type + ':defaultCovers']) {
+ if (meta.config[type + ':defaultCovers']) {
var covers = meta.config[type + ':defaultCovers'].trim().split(/[\s,]+/g);
-
+
if (typeof id === 'string') {
id = (id.charCodeAt(0) + id.charCodeAt(1)) % covers.length;
} else {
- id = id % covers.length;
+ id %= covers.length;
}
return covers[id];
diff --git a/src/database.js b/src/database.js
index 65a5453d09..c62255306b 100644
--- a/src/database.js
+++ b/src/database.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var nconf = require('nconf');
var databaseName = nconf.get('database');
@@ -11,4 +11,4 @@ if (!databaseName) {
var primaryDB = require('./database/' + databaseName);
-module.exports = primaryDB;
\ No newline at end of file
+module.exports = primaryDB;
diff --git a/src/database/mongo.js b/src/database/mongo.js
index 3a3331e900..9bc321703b 100644
--- a/src/database/mongo.js
+++ b/src/database/mongo.js
@@ -2,7 +2,6 @@
'use strict';
(function (module) {
-
var winston = require('winston');
var async = require('async');
var nconf = require('nconf');
@@ -17,30 +16,30 @@
{
name: 'mongo:host',
description: 'Host IP or address of your MongoDB instance',
- 'default': nconf.get('mongo:host') || '127.0.0.1'
+ default: nconf.get('mongo:host') || '127.0.0.1',
},
{
name: 'mongo:port',
description: 'Host port of your MongoDB instance',
- 'default': nconf.get('mongo:port') || 27017
+ default: nconf.get('mongo:port') || 27017,
},
{
name: 'mongo:username',
description: 'MongoDB username',
- 'default': nconf.get('mongo:username') || ''
+ default: nconf.get('mongo:username') || '',
},
{
name: 'mongo:password',
description: 'Password of your MongoDB database',
hidden: true,
default: nconf.get('mongo:password') || '',
- before: function (value) { value = value || nconf.get('mongo:password') || ''; return value; }
+ before: function (value) { value = value || nconf.get('mongo:password') || ''; return value; },
},
{
- name: "mongo:database",
- description: "MongoDB database name",
- 'default': nconf.get('mongo:database') || 'nodebb'
- }
+ name: 'mongo:database',
+ description: 'MongoDB database name',
+ default: nconf.get('mongo:database') || 'nodebb',
+ },
];
module.helpers = module.helpers || {};
@@ -76,7 +75,7 @@
var ports = nconf.get('mongo:port').toString().split(',');
var servers = [];
- for (var i = 0; i < hosts.length; i++) {
+ for (var i = 0; i < hosts.length; i += 1) {
servers.push(hosts[i] + ':' + ports[i]);
}
@@ -84,15 +83,15 @@
var connOptions = {
server: {
- poolSize: parseInt(nconf.get('mongo:poolSize'), 10) || 10
- }
+ poolSize: parseInt(nconf.get('mongo:poolSize'), 10) || 10,
+ },
};
connOptions = _.deepExtend((nconf.get('mongo:options') || {}), connOptions);
mongoClient.connect(connString, connOptions, function (err, _db) {
if (err) {
- winston.error("NodeBB could not connect to your Mongo database. Mongo returned the following error: " + err.message);
+ winston.error('NodeBB could not connect to your Mongo database. Mongo returned the following error: ' + err.message);
return callback(err);
}
@@ -135,13 +134,13 @@
module.sessionStore = new sessionStore({
client: rdb.client,
- ttl: ttl
+ ttl: ttl,
});
} else if (nconf.get('mongo')) {
sessionStore = require('connect-mongo')(session);
module.sessionStore = new sessionStore({
db: db,
- ttl: ttl
+ ttl: ttl,
});
}
@@ -162,7 +161,7 @@
async.series([
async.apply(createIndex, 'objects', { _key: 1, score: -1 }, { background: true }),
async.apply(createIndex, 'objects', { _key: 1, value: -1 }, { background: true, unique: true, sparse: true }),
- async.apply(createIndex, 'objects', { expireAt: 1 }, { expireAfterSeconds: 0, background: true })
+ async.apply(createIndex, 'objects', { expireAt: 1 }, { expireAfterSeconds: 0, background: true }),
], function (err) {
if (err) {
winston.error('Error creating index ' + err.message);
@@ -189,10 +188,10 @@
}
async.parallel({
serverStatus: function (next) {
- db.command({ 'serverStatus': 1 }, next);
+ db.command({ serverStatus: 1 }, next);
},
stats: function (next) {
- db.command({ 'dbStats': 1 }, next);
+ db.command({ dbStats: 1 }, next);
},
listCollections: function (next) {
db.listCollections().toArray(function (err, items) {
@@ -203,7 +202,7 @@
db.collection(collection.name).stats(next);
}, next);
});
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -219,7 +218,7 @@
avgObjSize: collectionInfo.avgObjSize,
storageSize: collectionInfo.storageSize,
totalIndexSize: collectionInfo.totalIndexSize,
- indexSizes: collectionInfo.indexSizes
+ indexSizes: collectionInfo.indexSizes,
};
});
@@ -246,5 +245,4 @@
module.close = function () {
db.close();
};
-
-} (exports));
+}(exports));
diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js
index 4951b44529..57c72cdc91 100644
--- a/src/database/mongo/hash.js
+++ b/src/database/mongo/hash.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
module.exports = function (db, module) {
var helpers = module.helpers.mongo;
@@ -9,7 +9,7 @@ module.exports = function (db, module) {
return callback();
}
- db.collection('objects').update({_key: key}, {$set: data}, {upsert: true, w: 1}, function (err) {
+ db.collection('objects').update({ _key: key }, { $set: data }, { upsert: true, w: 1 }, function (err) {
callback(err);
});
};
@@ -29,14 +29,14 @@ module.exports = function (db, module) {
if (!key) {
return callback();
}
- db.collection('objects').findOne({_key: key}, {_id: 0, _key: 0}, callback);
+ db.collection('objects').findOne({ _key: key }, { _id: 0, _key: 0 }, callback);
};
module.getObjects = function (keys, callback) {
if (!Array.isArray(keys) || !keys.length) {
return callback(null, []);
}
- db.collection('objects').find({_key: {$in: keys}}, {_id: 0}).toArray(function (err, data) {
+ db.collection('objects').find({ _key: { $in: keys } }, { _id: 0 }).toArray(function (err, data) {
if (err) {
return callback(err);
}
@@ -44,7 +44,7 @@ module.exports = function (db, module) {
var map = helpers.toMap(data);
var returnData = [];
- for (var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
returnData.push(map[keys[i]]);
}
@@ -58,10 +58,10 @@ module.exports = function (db, module) {
}
field = helpers.fieldToString(field);
var _fields = {
- _id: 0
+ _id: 0,
};
_fields[field] = 1;
- db.collection('objects').findOne({_key: key}, {fields: _fields}, function (err, item) {
+ db.collection('objects').findOne({ _key: key }, { fields: _fields }, function (err, item) {
if (err || !item) {
return callback(err, null);
}
@@ -75,20 +75,21 @@ module.exports = function (db, module) {
return callback();
}
var _fields = {
- _id: 0
+ _id: 0,
};
+ var i;
- for(var i = 0; i < fields.length; ++i) {
+ for (i = 0; i < fields.length; i += 1) {
fields[i] = helpers.fieldToString(fields[i]);
_fields[fields[i]] = 1;
}
- db.collection('objects').findOne({_key: key}, {fields: _fields}, function (err, item) {
+ db.collection('objects').findOne({ _key: key }, { fields: _fields }, function (err, item) {
if (err) {
return callback(err);
}
item = item || {};
var result = {};
- for(i = 0; i < fields.length; ++i) {
+ for (i = 0; i < fields.length; i += 1) {
result[fields[i]] = item[fields[i]] !== undefined ? item[fields[i]] : null;
}
callback(null, result);
@@ -101,15 +102,15 @@ module.exports = function (db, module) {
}
var _fields = {
_id: 0,
- _key: 1
+ _key: 1,
};
- for(var i = 0; i < fields.length; ++i) {
+ for (var i = 0; i < fields.length; i += 1) {
fields[i] = helpers.fieldToString(fields[i]);
_fields[fields[i]] = 1;
}
- db.collection('objects').find({_key: {$in: keys}}, {fields: _fields}).toArray(function (err, items) {
+ db.collection('objects').find({ _key: { $in: keys } }, { fields: _fields }).toArray(function (err, items) {
if (err) {
return callback(err);
}
@@ -122,10 +123,10 @@ module.exports = function (db, module) {
var returnData = [];
var item;
- for (var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
item = map[keys[i]] || {};
- for (var k = 0; k < fields.length; ++k) {
+ for (var k = 0; k < fields.length; k += 1) {
if (item[fields[k]] === undefined) {
item[fields[k]] = null;
}
@@ -145,12 +146,12 @@ module.exports = function (db, module) {
module.getObjectValues = function (key, callback) {
module.getObject(key, function (err, data) {
- if(err) {
+ if (err) {
return callback(err);
}
var values = [];
- for(var key in data) {
+ for (var key in data) {
if (data && data.hasOwnProperty(key)) {
values.push(data[key]);
}
@@ -166,7 +167,7 @@ module.exports = function (db, module) {
var data = {};
field = helpers.fieldToString(field);
data[field] = '';
- db.collection('objects').findOne({_key: key}, {fields: data}, function (err, item) {
+ db.collection('objects').findOne({ _key: key }, { fields: data }, function (err, item) {
callback(err, !!item && item[field] !== undefined && item[field] !== null);
});
};
@@ -182,7 +183,7 @@ module.exports = function (db, module) {
data[field] = '';
});
- db.collection('objects').findOne({_key: key}, {fields: data}, function (err, item) {
+ db.collection('objects').findOne({ _key: key }, { fields: data }, function (err, item) {
if (err) {
return callback(err);
}
@@ -216,7 +217,7 @@ module.exports = function (db, module) {
data[field] = '';
});
- db.collection('objects').update({_key: key}, {$unset : data}, function (err) {
+ db.collection('objects').update({ _key: key }, { $unset: data }, function (err) {
callback(err);
});
};
@@ -240,8 +241,8 @@ module.exports = function (db, module) {
field = helpers.fieldToString(field);
data[field] = value;
- db.collection('objects').findAndModify({_key: key}, {}, {$inc: data}, {new: true, upsert: true}, function (err, result) {
+ db.collection('objects').findAndModify({ _key: key }, {}, { $inc: data }, { new: true, upsert: true }, function (err, result) {
callback(err, result && result.value ? result.value[field] : null);
});
};
-};
\ No newline at end of file
+};
diff --git a/src/database/mongo/helpers.js b/src/database/mongo/helpers.js
index 0985e62617..47f8434c77 100644
--- a/src/database/mongo/helpers.js
+++ b/src/database/mongo/helpers.js
@@ -1,10 +1,10 @@
-"use strict";
+'use strict';
var helpers = {};
helpers.toMap = function (data) {
var map = {};
- for (var i = 0; i < data.length; ++i) {
+ for (var i = 0; i < data.length; i += 1) {
map[data[i]._key] = data[i];
data[i]._key = undefined;
}
@@ -12,11 +12,11 @@ helpers.toMap = function (data) {
};
helpers.fieldToString = function (field) {
- if(field === null || field === undefined) {
+ if (field === null || field === undefined) {
return field;
}
- if(typeof field !== 'string') {
+ if (typeof field !== 'string') {
field = field.toString();
}
// if there is a '.' in the field name it inserts subdocument in mongo, replace '.'s with \uff0E
@@ -25,7 +25,7 @@ helpers.fieldToString = function (field) {
};
helpers.valueToString = function (value) {
- if(value === null || value === undefined) {
+ if (value === null || value === undefined) {
return value;
}
@@ -34,4 +34,4 @@ helpers.valueToString = function (value) {
helpers.noop = function () {};
-module.exports = helpers;
\ No newline at end of file
+module.exports = helpers;
diff --git a/src/database/mongo/list.js b/src/database/mongo/list.js
index c4b4ffbb6c..0c5e2955e5 100644
--- a/src/database/mongo/list.js
+++ b/src/database/mongo/list.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
module.exports = function (db, module) {
var helpers = module.helpers.mongo;
@@ -18,7 +18,7 @@ module.exports = function (db, module) {
}
if (exists) {
- db.collection('objects').update({_key:key}, {$push: {array: {$each: [value], $position: 0}}}, {upsert:true, w:1 }, function (err, res) {
+ db.collection('objects').update({ _key: key }, { $push: { array: { $each: [value], $position: 0 } } }, { upsert: true, w: 1 }, function (err) {
callback(err);
});
} else {
@@ -33,7 +33,7 @@ module.exports = function (db, module) {
return callback();
}
value = helpers.valueToString(value);
- db.collection('objects').update({ _key: key }, { $push: { array: value } }, {upsert:true, w:1}, function (err, res) {
+ db.collection('objects').update({ _key: key }, { $push: { array: value } }, { upsert: true, w: 1 }, function (err) {
callback(err);
});
};
@@ -48,20 +48,20 @@ module.exports = function (db, module) {
return callback(err);
}
- db.collection('objects').update({_key: key }, { $pop: { array: 1 } }, function (err, result) {
+ db.collection('objects').update({ _key: key }, { $pop: { array: 1 } }, function (err) {
callback(err, (value && value.length) ? value[0] : null);
});
});
};
module.listRemoveAll = function (key, value, callback) {
- callback = callback || helpers.noop;
+ callback = callback || helpers.noop;
if (!key) {
return callback();
}
value = helpers.valueToString(value);
- db.collection('objects').update({_key: key }, { $pull: { array: value } }, function (err, res) {
+ db.collection('objects').update({ _key: key }, { $pull: { array: value } }, function (err) {
callback(err);
});
};
@@ -76,7 +76,7 @@ module.exports = function (db, module) {
return callback(err);
}
- db.collection('objects').update({_key: key}, {$set: {array: value}}, function (err, res) {
+ db.collection('objects').update({ _key: key }, { $set: { array: value } }, function (err) {
callback(err);
});
});
@@ -87,8 +87,8 @@ module.exports = function (db, module) {
return callback();
}
- db.collection('objects').findOne({_key:key}, { array: 1}, function (err, data) {
- if(err || !(data && data.array)) {
+ db.collection('objects').findOne({ _key: key }, { array: 1 }, function (err, data) {
+ if (err || !(data && data.array)) {
return callback(err, []);
}
@@ -100,4 +100,4 @@ module.exports = function (db, module) {
callback(null, data.array);
});
};
-};
\ No newline at end of file
+};
diff --git a/src/database/mongo/main.js b/src/database/mongo/main.js
index 0aebaf75b2..4ca3bb2cd3 100644
--- a/src/database/mongo/main.js
+++ b/src/database/mongo/main.js
@@ -1,6 +1,4 @@
-"use strict";
-
-var winston = require('winston');
+'use strict';
module.exports = function (db, module) {
var helpers = module.helpers.mongo;
@@ -23,7 +21,7 @@ module.exports = function (db, module) {
if (!key) {
return callback();
}
- db.collection('objects').findOne({_key: key}, function (err, item) {
+ db.collection('objects').findOne({ _key: key }, function (err, item) {
callback(err, item !== undefined && item !== null);
});
};
@@ -33,7 +31,7 @@ module.exports = function (db, module) {
if (!key) {
return callback();
}
- db.collection('objects').remove({_key: key}, function (err, res) {
+ db.collection('objects').remove({ _key: key }, function (err) {
callback(err);
});
};
@@ -43,7 +41,7 @@ module.exports = function (db, module) {
if (!Array.isArray(keys) || !keys.length) {
return callback();
}
- db.collection('objects').remove({_key: {$in: keys}}, function (err, res) {
+ db.collection('objects').remove({ _key: { $in: keys } }, function (err) {
callback(err);
});
};
@@ -60,7 +58,7 @@ module.exports = function (db, module) {
if (!key) {
return callback();
}
- var data = {value: value};
+ var data = { value: value };
module.setObject(key, data, callback);
};
@@ -69,14 +67,14 @@ module.exports = function (db, module) {
if (!key) {
return callback();
}
- db.collection('objects').findAndModify({_key: key}, {}, {$inc: {value: 1}}, {new: true, upsert: true}, function (err, result) {
+ db.collection('objects').findAndModify({ _key: key }, {}, { $inc: { value: 1 } }, { new: true, upsert: true }, function (err, result) {
callback(err, result && result.value ? result.value.value : null);
});
};
module.rename = function (oldKey, newKey, callback) {
callback = callback || helpers.noop;
- db.collection('objects').update({_key: oldKey}, {$set:{_key: newKey}}, {multi: true}, function (err, res) {
+ db.collection('objects').update({ _key: oldKey }, { $set: { _key: newKey } }, { multi: true }, function (err) {
callback(err);
});
};
@@ -96,4 +94,4 @@ module.exports = function (db, module) {
module.pexpireAt = function (key, timestamp, callback) {
module.setObjectField(key, 'expireAt', new Date(timestamp), callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/database/mongo/sets.js b/src/database/mongo/sets.js
index 0a035a3398..18ce2a932a 100644
--- a/src/database/mongo/sets.js
+++ b/src/database/mongo/sets.js
@@ -1,11 +1,11 @@
-"use strict";
+'use strict';
module.exports = function (db, module) {
var helpers = module.helpers.mongo;
module.setAdd = function (key, value, callback) {
callback = callback || helpers.noop;
- if(!Array.isArray(value)) {
+ if (!Array.isArray(value)) {
value = [value];
}
@@ -14,17 +14,17 @@ module.exports = function (db, module) {
});
db.collection('objects').update({
- _key: key
+ _key: key,
}, {
$addToSet: {
members: {
- $each: value
- }
- }
+ $each: value,
+ },
+ },
}, {
upsert: true,
- w: 1
- }, function (err, res) {
+ w: 1,
+ }, function (err) {
callback(err);
});
};
@@ -36,7 +36,7 @@ module.exports = function (db, module) {
return callback();
}
- if(!Array.isArray(value)) {
+ if (!Array.isArray(value)) {
value = [value];
}
@@ -46,22 +46,22 @@ module.exports = function (db, module) {
var bulk = db.collection('objects').initializeUnorderedBulkOp();
- for(var i = 0; i < keys.length; ++i) {
- bulk.find({_key: keys[i]}).upsert().updateOne({ $addToSet: {
+ for (var i = 0; i < keys.length; i += 1) {
+ bulk.find({ _key: keys[i] }).upsert().updateOne({ $addToSet: {
members: {
- $each: value
- }
- }});
+ $each: value,
+ },
+ } });
}
- bulk.execute(function (err, res) {
+ bulk.execute(function (err) {
callback(err);
});
};
module.setRemove = function (key, value, callback) {
callback = callback || helpers.noop;
- if(!Array.isArray(value)) {
+ if (!Array.isArray(value)) {
value = [value];
}
@@ -69,7 +69,7 @@ module.exports = function (db, module) {
array[index] = helpers.valueToString(element);
});
- db.collection('objects').update({_key: key}, {$pullAll: {members: value}}, function (err, res) {
+ db.collection('objects').update({ _key: key }, { $pullAll: { members: value } }, function (err) {
callback(err);
});
};
@@ -83,13 +83,13 @@ module.exports = function (db, module) {
var bulk = db.collection('objects').initializeUnorderedBulkOp();
- for(var i = 0; i < keys.length; ++i) {
- bulk.find({_key: keys[i]}).updateOne({$pull: {
- members: value
- }});
+ for (var i = 0; i < keys.length; i += 1) {
+ bulk.find({ _key: keys[i] }).updateOne({ $pull: {
+ members: value,
+ } });
}
- bulk.execute(function (err, res) {
+ bulk.execute(function (err) {
callback(err);
});
};
@@ -100,7 +100,7 @@ module.exports = function (db, module) {
}
value = helpers.valueToString(value);
- db.collection('objects').findOne({_key: key, members: value}, {_id: 0, members: 0},function (err, item) {
+ db.collection('objects').findOne({ _key: key, members: value }, { _id: 0, members: 0 }, function (err, item) {
callback(err, item !== null && item !== undefined);
});
};
@@ -110,11 +110,11 @@ module.exports = function (db, module) {
return callback(null, []);
}
- for (var i = 0; i < values.length; ++i) {
+ for (var i = 0; i < values.length; i += 1) {
values[i] = helpers.valueToString(values[i]);
}
- db.collection('objects').findOne({_key: key}, {_id: 0, _key: 0}, function (err, items) {
+ db.collection('objects').findOne({ _key: key }, { _id: 0, _key: 0 }, function (err, items) {
if (err) {
return callback(err);
}
@@ -133,7 +133,7 @@ module.exports = function (db, module) {
}
value = helpers.valueToString(value);
- db.collection('objects').find({_key: {$in : sets}, members: value}, {_id:0, members: 0}).toArray(function (err, result) {
+ db.collection('objects').find({ _key: { $in: sets }, members: value }, { _id: 0, members: 0 }).toArray(function (err, result) {
if (err) {
return callback(err);
}
@@ -154,7 +154,7 @@ module.exports = function (db, module) {
if (!key) {
return callback(null, []);
}
- db.collection('objects').findOne({_key: key}, {members: 1}, {_id: 0, _key: 0}, function (err, data) {
+ db.collection('objects').findOne({ _key: key }, { members: 1 }, { _id: 0, _key: 0 }, function (err, data) {
callback(err, data ? data.members : []);
});
};
@@ -163,7 +163,7 @@ module.exports = function (db, module) {
if (!Array.isArray(keys) || !keys.length) {
return callback(null, []);
}
- db.collection('objects').find({_key: {$in: keys}}, {_id: 0, _key: 1, members: 1}).toArray(function (err, data) {
+ db.collection('objects').find({ _key: { $in: keys } }, { _id: 0, _key: 1, members: 1 }).toArray(function (err, data) {
if (err) {
return callback(err);
}
@@ -174,7 +174,7 @@ module.exports = function (db, module) {
});
var returnData = new Array(keys.length);
- for(var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
returnData[i] = sets[keys[i]] || [];
}
callback(null, returnData);
@@ -185,7 +185,7 @@ module.exports = function (db, module) {
if (!key) {
return callback(null, 0);
}
- db.collection('objects').findOne({_key: key}, {_id: 0}, function (err, data) {
+ db.collection('objects').findOne({ _key: key }, { _id: 0 }, function (err, data) {
callback(err, data ? data.members.length : 0);
});
};
@@ -205,8 +205,8 @@ module.exports = function (db, module) {
module.setRemoveRandom = function (key, callback) {
callback = callback || function () {};
- db.collection('objects').findOne({_key:key}, function (err, data) {
- if(err || !data) {
+ db.collection('objects').findOne({ _key: key }, function (err, data) {
+ if (err || !data) {
return callback(err);
}
@@ -217,4 +217,4 @@ module.exports = function (db, module) {
});
});
};
-};
\ No newline at end of file
+};
diff --git a/src/database/mongo/sorted.js b/src/database/mongo/sorted.js
index b9d511d94d..defaed80fc 100644
--- a/src/database/mongo/sorted.js
+++ b/src/database/mongo/sorted.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var utils = require('../../../public/src/utils');
@@ -32,13 +32,13 @@ module.exports = function (db, module) {
return callback();
}
- var fields = {_id: 0, value: 1};
+ var fields = { _id: 0, value: 1 };
if (withScores) {
fields.score = 1;
}
if (Array.isArray(key)) {
- key = {$in: key};
+ key = { $in: key };
}
var limit = stop - start + 1;
@@ -46,10 +46,10 @@ module.exports = function (db, module) {
limit = 0;
}
- db.collection('objects').find({_key: key}, {fields: fields})
+ db.collection('objects').find({ _key: key }, { fields: fields })
.limit(limit)
.skip(start)
- .sort({score: sort})
+ .sort({ score: sort })
.toArray(function (err, data) {
if (err || !data) {
return callback(err);
@@ -89,25 +89,25 @@ module.exports = function (db, module) {
count = 0;
}
- var query = {_key: key};
+ var query = { _key: key };
if (min !== '-inf') {
- query.score = {$gte: min};
+ query.score = { $gte: min };
}
if (max !== '+inf') {
query.score = query.score || {};
query.score.$lte = max;
}
- var fields = {_id: 0, value: 1};
+ var fields = { _id: 0, value: 1 };
if (withScores) {
fields.score = 1;
}
- db.collection('objects').find(query, {fields: fields})
+ db.collection('objects').find(query, { fields: fields })
.limit(count)
.skip(start)
- .sort({score: sort})
+ .sort({ score: sort })
.toArray(function (err, data) {
if (err) {
return callback(err);
@@ -128,9 +128,9 @@ module.exports = function (db, module) {
return callback();
}
- var query = {_key: key};
+ var query = { _key: key };
if (min !== '-inf') {
- query.score = {$gte: min};
+ query.score = { $gte: min };
}
if (max !== '+inf') {
query.score = query.score || {};
@@ -138,7 +138,7 @@ module.exports = function (db, module) {
}
db.collection('objects').count(query, function (err, count) {
- callback(err, count ? count : 0);
+ callback(err, count || 0);
});
};
@@ -146,9 +146,9 @@ module.exports = function (db, module) {
if (!key) {
return callback(null, 0);
}
- db.collection('objects').count({_key: key}, function (err, count) {
+ db.collection('objects').count({ _key: key }, function (err, count) {
count = parseInt(count, 10);
- callback(err, count ? count : 0);
+ callback(err, count || 0);
});
};
@@ -157,9 +157,9 @@ module.exports = function (db, module) {
return callback();
}
var pipeline = [
- { $match : { _key : { $in: keys } } } ,
- { $group: { _id: {_key: '$_key'}, count: { $sum: 1 } } },
- { $project: { _id: 1, count: '$count' } }
+ { $match: { _key: { $in: keys } } },
+ { $group: { _id: { _key: '$_key' }, count: { $sum: 1 } } },
+ { $project: { _id: 1, count: '$count' } },
];
db.collection('objects').aggregate(pipeline, function (err, results) {
if (err) {
@@ -198,7 +198,7 @@ module.exports = function (db, module) {
}
value = helpers.valueToString(value);
method(key, 0, -1, function (err, result) {
- if(err) {
+ if (err) {
return callback(err);
}
@@ -212,8 +212,8 @@ module.exports = function (db, module) {
return callback(null, []);
}
var data = new Array(values.length);
- for (var i = 0; i < values.length; ++i) {
- data[i] = {key: keys[i], value: values[i]};
+ for (var i = 0; i < values.length; i += 1) {
+ data[i] = { key: keys[i], value: values[i] };
}
async.map(data, function (item, next) {
@@ -244,7 +244,7 @@ module.exports = function (db, module) {
return callback();
}
value = helpers.valueToString(value);
- db.collection('objects').findOne({_key: key, value: value}, {fields:{_id: 0, score: 1}}, function (err, result) {
+ db.collection('objects').findOne({ _key: key, value: value }, { fields: { _id: 0, score: 1 } }, function (err, result) {
callback(err, result ? result.score : null);
});
};
@@ -254,16 +254,16 @@ module.exports = function (db, module) {
return callback();
}
value = helpers.valueToString(value);
- db.collection('objects').find({_key:{$in:keys}, value: value}, {_id:0, _key:1, score: 1}).toArray(function (err, result) {
+ db.collection('objects').find({ _key: { $in: keys }, value: value }, { _id: 0, _key: 1, score: 1 }).toArray(function (err, result) {
if (err) {
return callback(err);
}
- var map = helpers.toMap(result),
- returnData = [],
- item;
+ var map = helpers.toMap(result);
+ var returnData = [];
+ var item;
- for(var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
item = map[keys[i]];
returnData.push(item ? item.score : null);
}
@@ -277,7 +277,7 @@ module.exports = function (db, module) {
return callback();
}
values = values.map(helpers.valueToString);
- db.collection('objects').find({_key: key, value: {$in: values}}, {_id: 0, value: 1, score: 1}).toArray(function (err, result) {
+ db.collection('objects').find({ _key: key, value: { $in: values } }, { _id: 0, value: 1, score: 1 }).toArray(function (err, result) {
if (err) {
return callback(err);
}
@@ -290,7 +290,7 @@ module.exports = function (db, module) {
var returnData = new Array(values.length);
var score;
- for(var i = 0; i < values.length; ++i) {
+ for (var i = 0; i < values.length; i += 1) {
score = map[values[i]];
returnData[i] = utils.isNumber(score) ? score : null;
}
@@ -304,7 +304,7 @@ module.exports = function (db, module) {
return callback();
}
value = helpers.valueToString(value);
- db.collection('objects').findOne({_key: key, value: value}, {_id: 0, value: 1}, function (err, result) {
+ db.collection('objects').findOne({ _key: key, value: value }, { _id: 0, value: 1 }, function (err, result) {
callback(err, !!result);
});
};
@@ -314,7 +314,7 @@ module.exports = function (db, module) {
return callback();
}
values = values.map(helpers.valueToString);
- db.collection('objects').find({_key: key, value: {$in: values}}, {fields: {_id: 0, value: 1}}).toArray(function (err, results) {
+ db.collection('objects').find({ _key: key, value: { $in: values } }, { fields: { _id: 0, value: 1 } }).toArray(function (err, results) {
if (err) {
return callback(err);
}
@@ -335,7 +335,7 @@ module.exports = function (db, module) {
return callback();
}
value = helpers.valueToString(value);
- db.collection('objects').find({_key: {$in: keys}, value: value}, {fields: {_id: 0, _key: 1, value: 1}}).toArray(function (err, results) {
+ db.collection('objects').find({ _key: { $in: keys }, value: value }, { fields: { _id: 0, _key: 1, value: 1 } }).toArray(function (err, results) {
if (err) {
return callback(err);
}
@@ -355,20 +355,20 @@ module.exports = function (db, module) {
if (!Array.isArray(keys) || !keys.length) {
return callback(null, []);
}
- db.collection('objects').find({_key: {$in: keys}}, {_id: 0, _key: 1, value: 1}).toArray(function (err, data) {
+ db.collection('objects').find({ _key: { $in: keys } }, { _id: 0, _key: 1, value: 1 }).toArray(function (err, data) {
if (err) {
return callback(err);
}
var sets = {};
data.forEach(function (set) {
- sets[set._key] = sets[set._key] || [];
- sets[set._key].push(set.value);
+ sets[set._key] = sets[set._key] || [];
+ sets[set._key].push(set.value);
});
var returnData = new Array(keys.length);
- for(var i = 0; i < keys.length; ++i) {
- returnData[i] = sets[keys[i]] || [];
+ for (var i = 0; i < keys.length; i += 1) {
+ returnData[i] = sets[keys[i]] || [];
}
callback(null, returnData);
});
@@ -383,7 +383,7 @@ module.exports = function (db, module) {
value = helpers.valueToString(value);
data.score = parseFloat(increment);
- db.collection('objects').findAndModify({_key: key, value: value}, {}, {$inc: data}, {new: true, upsert: true}, function (err, result) {
+ db.collection('objects').findAndModify({ _key: key, value: value }, {}, { $inc: data }, { new: true, upsert: true }, function (err, result) {
// if there is duplicate key error retry the upsert
// https://github.com/NodeBB/NodeBB/issues/4467
// https://jira.mongodb.org/browse/SERVER-14322
@@ -416,11 +416,11 @@ module.exports = function (db, module) {
count = 0;
}
- var query = {_key: key};
+ var query = { _key: key };
buildLexQuery(query, min, max);
- db.collection('objects').find(query, {_id: 0, value: 1})
- .sort({value: sort})
+ db.collection('objects').find(query, { _id: 0, value: 1 })
+ .sort({ value: sort })
.skip(start)
.limit(count === -1 ? 0 : count)
.toArray(function (err, data) {
@@ -431,13 +431,13 @@ module.exports = function (db, module) {
return item && item.value;
});
callback(err, data);
- });
+ });
}
module.sortedSetRemoveRangeByLex = function (key, min, max, callback) {
callback = callback || helpers.noop;
- var query = {_key: key};
+ var query = { _key: key };
buildLexQuery(query, min, max);
db.collection('objects').remove(query, function (err) {
@@ -448,11 +448,11 @@ module.exports = function (db, module) {
function buildLexQuery(query, min, max) {
if (min !== '-') {
if (min.match(/^\(/)) {
- query.value = {$gt: min.slice(1)};
+ query.value = { $gt: min.slice(1) };
} else if (min.match(/^\[/)) {
- query.value = {$gte: min.slice(1)};
+ query.value = { $gte: min.slice(1) };
} else {
- query.value = {$gte: min};
+ query.value = { $gte: min };
}
}
if (max !== '+') {
@@ -470,9 +470,9 @@ module.exports = function (db, module) {
module.processSortedSet = function (setKey, process, batch, callback) {
var done = false;
var ids = [];
- var cursor = db.collection('objects').find({_key: setKey})
- .sort({score: 1})
- .project({_id: 0, value: 1})
+ var cursor = db.collection('objects').find({ _key: setKey })
+ .sort({ score: 1 })
+ .project({ _id: 0, value: 1 })
.batchSize(batch);
async.whilst(
@@ -503,5 +503,4 @@ module.exports = function (db, module) {
callback
);
};
-
};
diff --git a/src/database/mongo/sorted/add.js b/src/database/mongo/sorted/add.js
index e03452b3df..b90501feee 100644
--- a/src/database/mongo/sorted/add.js
+++ b/src/database/mongo/sorted/add.js
@@ -1,7 +1,6 @@
'use strict';
module.exports = function (db, module) {
-
var helpers = module.helpers.mongo;
module.sortedSetAdd = function (key, score, value, callback) {
@@ -15,7 +14,7 @@ module.exports = function (db, module) {
value = helpers.valueToString(value);
- db.collection('objects').update({_key: key, value: value}, {$set: {score: parseFloat(score)}}, {upsert:true, w: 1}, function (err) {
+ db.collection('objects').update({ _key: key, value: value }, { $set: { score: parseFloat(score) } }, { upsert: true, w: 1 }, function (err) {
if (err && err.message.startsWith('E11000 duplicate key error')) {
return process.nextTick(module.sortedSetAdd, key, score, value, callback);
}
@@ -35,8 +34,8 @@ module.exports = function (db, module) {
var bulk = db.collection('objects').initializeUnorderedBulkOp();
- for(var i = 0; i < scores.length; ++i) {
- bulk.find({_key: key, value: values[i]}).upsert().updateOne({$set: {score: parseFloat(scores[i])}});
+ for (var i = 0; i < scores.length; i += 1) {
+ bulk.find({ _key: key, value: values[i] }).upsert().updateOne({ $set: { score: parseFloat(scores[i]) } });
}
bulk.execute(function (err) {
@@ -53,13 +52,12 @@ module.exports = function (db, module) {
var bulk = db.collection('objects').initializeUnorderedBulkOp();
- for(var i = 0; i < keys.length; ++i) {
- bulk.find({_key: keys[i], value: value}).upsert().updateOne({$set: {score: parseFloat(score)}});
+ for (var i = 0; i < keys.length; i += 1) {
+ bulk.find({ _key: keys[i], value: value }).upsert().updateOne({ $set: { score: parseFloat(score) } });
}
bulk.execute(function (err) {
callback(err);
});
};
-
-};
\ No newline at end of file
+};
diff --git a/src/database/mongo/sorted/intersect.js b/src/database/mongo/sorted/intersect.js
index ed8ade3fb3..82f24214ea 100644
--- a/src/database/mongo/sorted/intersect.js
+++ b/src/database/mongo/sorted/intersect.js
@@ -1,17 +1,16 @@
'use strict';
module.exports = function (db, module) {
-
module.sortedSetIntersectCard = function (keys, callback) {
if (!Array.isArray(keys) || !keys.length) {
return callback(null, 0);
}
var pipeline = [
- { $match: { _key: {$in: keys}} },
- { $group: { _id: {value: '$value'}, count: {$sum: 1}} },
- { $match: { count: keys.length} },
- { $group: { _id: null, count: { $sum: 1 } } }
+ { $match: { _key: { $in: keys } } },
+ { $group: { _id: { value: '$value' }, count: { $sum: 1 } } },
+ { $match: { count: keys.length } },
+ { $group: { _id: null, count: { $sum: 1 } } },
];
db.collection('objects').aggregate(pipeline, function (err, data) {
@@ -48,7 +47,7 @@ module.exports = function (db, module) {
limit = 0;
}
- var pipeline = [{ $match: { _key: {$in: sets}} }];
+ var pipeline = [{ $match: { _key: { $in: sets } } }];
weights.forEach(function (weight, index) {
if (weight !== 1) {
@@ -56,16 +55,24 @@ module.exports = function (db, module) {
$project: {
value: 1,
score: {
- $cond: { if: { $eq: [ "$_key", sets[index] ] }, then: { $multiply: [ '$score', weight ] }, else: '$score' }
- }
- }
+ $cond: {
+ if: {
+ $eq: ['$_key', sets[index]],
+ },
+ then: {
+ $multiply: ['$score', weight],
+ },
+ else: '$score',
+ },
+ },
+ },
});
}
});
- pipeline.push({ $group: { _id: {value: '$value'}, totalScore: aggregate, count: {$sum: 1}} });
- pipeline.push({ $match: { count: sets.length} });
- pipeline.push({ $sort: { totalScore: params.sort} });
+ pipeline.push({ $group: { _id: { value: '$value' }, totalScore: aggregate, count: { $sum: 1 } } });
+ pipeline.push({ $match: { count: sets.length } });
+ pipeline.push({ $sort: { totalScore: params.sort } });
if (start) {
pipeline.push({ $skip: start });
@@ -75,7 +82,7 @@ module.exports = function (db, module) {
pipeline.push({ $limit: limit });
}
- var project = { _id: 0, value: '$_id.value'};
+ var project = { _id: 0, value: '$_id.value' };
if (params.withScores) {
project.score = '$totalScore';
}
@@ -95,5 +102,4 @@ module.exports = function (db, module) {
callback(null, data);
});
}
-
-};
\ No newline at end of file
+};
diff --git a/src/database/mongo/sorted/remove.js b/src/database/mongo/sorted/remove.js
index 71320619c4..e8dea857eb 100644
--- a/src/database/mongo/sorted/remove.js
+++ b/src/database/mongo/sorted/remove.js
@@ -1,7 +1,6 @@
'use strict';
module.exports = function (db, module) {
-
var helpers = module.helpers.mongo;
module.sortedSetRemove = function (key, value, callback) {
@@ -15,10 +14,10 @@ module.exports = function (db, module) {
if (Array.isArray(value)) {
value = value.map(helpers.valueToString);
- db.collection('objects').remove({_key: key, value: {$in: value}}, done);
+ db.collection('objects').remove({ _key: key, value: { $in: value } }, done);
} else {
value = helpers.valueToString(value);
- db.collection('objects').remove({_key: key, value: value}, done);
+ db.collection('objects').remove({ _key: key, value: value }, done);
}
};
@@ -29,7 +28,7 @@ module.exports = function (db, module) {
}
value = helpers.valueToString(value);
- db.collection('objects').remove({_key: {$in: keys}, value: value}, function (err) {
+ db.collection('objects').remove({ _key: { $in: keys }, value: value }, function (err) {
callback(err);
});
};
@@ -39,10 +38,10 @@ module.exports = function (db, module) {
if (!Array.isArray(keys) || !keys.length) {
return callback();
}
- var query = {_key: {$in: keys}};
+ var query = { _key: { $in: keys } };
if (min !== '-inf') {
- query.score = {$gte: min};
+ query.score = { $gte: min };
}
if (max !== '+inf') {
query.score = query.score || {};
@@ -53,5 +52,4 @@ module.exports = function (db, module) {
callback(err);
});
};
-
-};
\ No newline at end of file
+};
diff --git a/src/database/mongo/sorted/union.js b/src/database/mongo/sorted/union.js
index 49669bd830..a06df788aa 100644
--- a/src/database/mongo/sorted/union.js
+++ b/src/database/mongo/sorted/union.js
@@ -1,16 +1,15 @@
'use strict';
module.exports = function (db, module) {
-
module.sortedSetUnionCard = function (keys, callback) {
if (!Array.isArray(keys) || !keys.length) {
return callback(null, 0);
}
var pipeline = [
- { $match: { _key: {$in: keys} } },
- { $group: { _id: {value: '$value' } } },
- { $group: { _id: null, count: { $sum: 1 } } }
+ { $match: { _key: { $in: keys } } },
+ { $group: { _id: { value: '$value' } } },
+ { $group: { _id: null, count: { $sum: 1 } } },
];
var project = { _id: 0, count: '$count' };
@@ -48,9 +47,9 @@ module.exports = function (db, module) {
}
var pipeline = [
- { $match: { _key: {$in: params.sets}} },
- { $group: { _id: {value: '$value'}, totalScore: aggregate} },
- { $sort: { totalScore: params.sort} }
+ { $match: { _key: { $in: params.sets } } },
+ { $group: { _id: { value: '$value' }, totalScore: aggregate } },
+ { $sort: { totalScore: params.sort } },
];
if (params.start) {
@@ -81,5 +80,4 @@ module.exports = function (db, module) {
callback(null, data);
});
}
-
-};
\ No newline at end of file
+};
diff --git a/src/database/redis.js b/src/database/redis.js
index 8519b57bae..27394f7463 100644
--- a/src/database/redis.js
+++ b/src/database/redis.js
@@ -1,38 +1,36 @@
'use strict';
(function (module) {
-
var winston = require('winston');
var nconf = require('nconf');
var semver = require('semver');
var session = require('express-session');
var redis;
- var connectRedis;
var redisClient;
module.questions = [
{
name: 'redis:host',
description: 'Host IP or address of your Redis instance',
- 'default': nconf.get('redis:host') || '127.0.0.1'
+ default: nconf.get('redis:host') || '127.0.0.1',
},
{
name: 'redis:port',
description: 'Host port of your Redis instance',
- 'default': nconf.get('redis:port') || 6379
+ default: nconf.get('redis:port') || 6379,
},
{
name: 'redis:password',
description: 'Password of your Redis database',
hidden: true,
default: nconf.get('redis:password') || '',
- before: function (value) { value = value || nconf.get('redis:password') || ''; return value; }
+ before: function (value) { value = value || nconf.get('redis:password') || ''; return value; },
},
{
- name: "redis:database",
- description: "Which database to use (0..n)",
- 'default': nconf.get('redis:database') || 0
- }
+ name: 'redis:database',
+ description: 'Which database to use (0..n)',
+ default: nconf.get('redis:database') || 0,
+ },
];
module.init = function (callback) {
@@ -68,7 +66,7 @@
module.sessionStore = new sessionStore({
client: module.client,
- ttl: ttl
+ ttl: ttl,
});
if (typeof callback === 'function') {
@@ -110,7 +108,7 @@
if (dbIdx) {
cxn.select(dbIdx, function (error) {
if (error) {
- winston.error("NodeBB could not connect to your Redis database. Redis returned the following error: " + error.message);
+ winston.error('NodeBB could not connect to your Redis database. Redis returned the following error: ' + error.message);
process.exit();
}
});
@@ -150,7 +148,7 @@
return callback(err);
}
- var lines = data.toString().split("\r\n").sort();
+ var lines = data.toString().split('\r\n').sort();
var redisData = {};
lines.forEach(function (line) {
var parts = line.split(':');
@@ -168,5 +166,5 @@
module.helpers = module.helpers || {};
module.helpers.redis = require('./redis/helpers');
-} (exports));
+}(exports));
diff --git a/src/database/redis/hash.js b/src/database/redis/hash.js
index f679f7637d..938beb2971 100644
--- a/src/database/redis/hash.js
+++ b/src/database/redis/hash.js
@@ -1,7 +1,6 @@
-"use strict";
+'use strict';
module.exports = function (redisClient, module) {
-
var helpers = module.helpers.redis;
module.setObject = function (key, data, callback) {
@@ -52,14 +51,14 @@ module.exports = function (redisClient, module) {
}
var multi = redisClient.multi();
- for(var x = 0; x < keys.length; ++x) {
+ for (var x = 0; x < keys.length; x += 1) {
multi.hmget.apply(multi, [keys[x]].concat(fields));
}
function makeObject(array) {
var obj = {};
- for (var i = 0, ii = fields.length; i < ii; ++i) {
+ for (var i = 0, ii = fields.length; i < ii; i += 1) {
obj[fields[i]] = array[i];
}
return obj;
@@ -97,13 +96,13 @@ module.exports = function (redisClient, module) {
module.deleteObjectField = function (key, field, callback) {
callback = callback || function () {};
- redisClient.hdel(key, field, function (err, res) {
+ redisClient.hdel(key, field, function (err) {
callback(err);
});
};
module.deleteObjectFields = function (key, fields, callback) {
- helpers.multiKeyValues(redisClient, 'hdel', key, fields, function (err, results) {
+ helpers.multiKeyValues(redisClient, 'hdel', key, fields, function (err) {
callback(err);
});
};
@@ -119,4 +118,4 @@ module.exports = function (redisClient, module) {
module.incrObjectFieldBy = function (key, field, value, callback) {
redisClient.hincrby(key, field, value, callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/database/redis/helpers.js b/src/database/redis/helpers.js
index a4ca7e116f..7100437177 100644
--- a/src/database/redis/helpers.js
+++ b/src/database/redis/helpers.js
@@ -1,11 +1,11 @@
-"use strict";
+'use strict';
var helpers = {};
helpers.multiKeys = function (redisClient, command, keys, callback) {
callback = callback || function () {};
var multi = redisClient.multi();
- for (var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
multi[command](keys[i]);
}
multi.exec(callback);
@@ -14,7 +14,7 @@ helpers.multiKeys = function (redisClient, command, keys, callback) {
helpers.multiKeysValue = function (redisClient, command, keys, value, callback) {
callback = callback || function () {};
var multi = redisClient.multi();
- for (var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
multi[command](keys[i], value);
}
multi.exec(callback);
@@ -23,17 +23,17 @@ helpers.multiKeysValue = function (redisClient, command, keys, value, callback)
helpers.multiKeyValues = function (redisClient, command, key, values, callback) {
callback = callback || function () {};
var multi = redisClient.multi();
- for (var i = 0; i < values.length; ++i) {
+ for (var i = 0; i < values.length; i += 1) {
multi[command](key, values[i]);
}
multi.exec(callback);
};
helpers.resultsToBool = function (results) {
- for (var i = 0; i < results.length; ++i) {
+ for (var i = 0; i < results.length; i += 1) {
results[i] = results[i] === 1;
}
return results;
};
-module.exports = helpers;
\ No newline at end of file
+module.exports = helpers;
diff --git a/src/database/redis/list.js b/src/database/redis/list.js
index c44c23b475..fb445573ff 100644
--- a/src/database/redis/list.js
+++ b/src/database/redis/list.js
@@ -1,16 +1,16 @@
-"use strict";
+'use strict';
module.exports = function (redisClient, module) {
module.listPrepend = function (key, value, callback) {
callback = callback || function () {};
- redisClient.lpush(key, value, function (err, res) {
+ redisClient.lpush(key, value, function (err) {
callback(err);
});
};
module.listAppend = function (key, value, callback) {
callback = callback || function () {};
- redisClient.rpush(key, value, function (err, res) {
+ redisClient.rpush(key, value, function (err) {
callback(err);
});
};
@@ -22,14 +22,14 @@ module.exports = function (redisClient, module) {
module.listRemoveAll = function (key, value, callback) {
callback = callback || function () {};
- redisClient.lrem(key, 0, value, function (err, res) {
+ redisClient.lrem(key, 0, value, function (err) {
callback(err);
});
};
module.listTrim = function (key, start, stop, callback) {
callback = callback || function () {};
- redisClient.ltrim(key, start, stop, function (err, res) {
+ redisClient.ltrim(key, start, stop, function (err) {
callback(err);
});
};
@@ -38,4 +38,4 @@ module.exports = function (redisClient, module) {
callback = callback || function () {};
redisClient.lrange(key, start, stop, callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/database/redis/main.js b/src/database/redis/main.js
index 10f26cfd3e..baca6b0ffe 100644
--- a/src/database/redis/main.js
+++ b/src/database/redis/main.js
@@ -1,7 +1,6 @@
-"use strict";
+'use strict';
module.exports = function (redisClient, module) {
-
module.flushdb = function (callback) {
redisClient.send_command('flushdb', [], function (err) {
if (typeof callback === 'function') {
@@ -22,7 +21,7 @@ module.exports = function (redisClient, module) {
module.delete = function (key, callback) {
callback = callback || function () {};
- redisClient.del(key, function (err, res) {
+ redisClient.del(key, function (err) {
callback(err);
});
};
@@ -30,10 +29,10 @@ module.exports = function (redisClient, module) {
module.deleteAll = function (keys, callback) {
callback = callback || function () {};
var multi = redisClient.multi();
- for(var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
multi.del(keys[i]);
}
- multi.exec(function (err, res) {
+ multi.exec(function (err) {
callback(err);
});
};
@@ -56,7 +55,7 @@ module.exports = function (redisClient, module) {
module.rename = function (oldKey, newKey, callback) {
callback = callback || function () {};
- redisClient.rename(oldKey, newKey, function (err, res) {
+ redisClient.rename(oldKey, newKey, function (err) {
callback(err && err.message !== 'ERR no such key' ? err : null);
});
};
diff --git a/src/database/redis/sets.js b/src/database/redis/sets.js
index 5b2b803868..a5716438e4 100644
--- a/src/database/redis/sets.js
+++ b/src/database/redis/sets.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
module.exports = function (redisClient, module) {
var helpers = module.helpers.redis;
@@ -11,28 +11,28 @@ module.exports = function (redisClient, module) {
if (!value.length) {
return callback();
}
- redisClient.sadd(key, value, function (err, res) {
+ redisClient.sadd(key, value, function (err) {
callback(err);
});
};
module.setsAdd = function (keys, value, callback) {
callback = callback || function () {};
- helpers.multiKeysValue(redisClient, 'sadd', keys, value, function (err, res) {
+ helpers.multiKeysValue(redisClient, 'sadd', keys, value, function (err) {
callback(err);
});
};
module.setRemove = function (key, value, callback) {
callback = callback || function () {};
- redisClient.srem(key, value, function (err, res) {
+ redisClient.srem(key, value, function (err) {
callback(err);
});
};
module.setsRemove = function (keys, value, callback) {
callback = callback || function () {};
- helpers.multiKeysValue(redisClient, 'srem', keys, value, function (err, res) {
+ helpers.multiKeysValue(redisClient, 'srem', keys, value, function (err) {
callback(err);
});
};
@@ -77,4 +77,4 @@ module.exports = function (redisClient, module) {
};
return module;
-};
\ No newline at end of file
+};
diff --git a/src/database/redis/sorted.js b/src/database/redis/sorted.js
index 1e8c629fa9..a2c18296db 100644
--- a/src/database/redis/sorted.js
+++ b/src/database/redis/sorted.js
@@ -1,7 +1,6 @@
-"use strict";
+'use strict';
module.exports = function (redisClient, module) {
-
var utils = require('../../../public/src/utils');
var helpers = module.helpers.redis;
@@ -29,7 +28,7 @@ module.exports = function (redisClient, module) {
function sortedSetRange(method, key, start, stop, withScores, callback) {
if (Array.isArray(key)) {
- return module.sortedSetUnion({method: method, sets: key, start: start, stop: stop, withScores: withScores}, callback);
+ return module.sortedSetUnion({ method: method, sets: key, start: start, stop: stop, withScores: withScores }, callback);
}
var params = [key, start, stop];
@@ -45,8 +44,8 @@ module.exports = function (redisClient, module) {
return callback(null, data);
}
var objects = [];
- for(var i = 0; i < data.length; i += 2) {
- objects.push({value: data[i], score: parseFloat(data[i + 1])});
+ for (var i = 0; i < data.length; i += 2) {
+ objects.push({ value: data[i], score: parseFloat(data[i + 1]) });
}
callback(null, objects);
});
@@ -74,8 +73,8 @@ module.exports = function (redisClient, module) {
return callback(err);
}
var objects = [];
- for(var i = 0; i < data.length; i += 2) {
- objects.push({value: data[i], score: parseFloat(data[i + 1])});
+ for (var i = 0; i < data.length; i += 2) {
+ objects.push({ value: data[i], score: parseFloat(data[i + 1]) });
}
callback(null, objects);
});
@@ -94,7 +93,7 @@ module.exports = function (redisClient, module) {
return callback(null, []);
}
var multi = redisClient.multi();
- for(var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
multi.zcard(keys[i]);
}
multi.exec(callback);
@@ -106,7 +105,7 @@ module.exports = function (redisClient, module) {
module.sortedSetsRanks = function (keys, values, callback) {
var multi = redisClient.multi();
- for(var i = 0; i < values.length; ++i) {
+ for (var i = 0; i < values.length; i += 1) {
multi.zrank(keys[i], values[i]);
}
multi.exec(callback);
@@ -114,7 +113,7 @@ module.exports = function (redisClient, module) {
module.sortedSetRanks = function (key, values, callback) {
var multi = redisClient.multi();
- for(var i = 0; i < values.length; ++i) {
+ for (var i = 0; i < values.length; i += 1) {
multi.zrank(key, values[i]);
}
multi.exec(callback);
@@ -164,7 +163,7 @@ module.exports = function (redisClient, module) {
module.getSortedSetsMembers = function (keys, callback) {
var multi = redisClient.multi();
- for (var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
multi.zrange(keys[i], 0, -1);
}
multi.exec(callback);
@@ -198,7 +197,8 @@ module.exports = function (redisClient, module) {
function sortedSetLex(method, reverse, key, min, max, start, count, callback) {
callback = callback || start;
- var minmin, maxmax;
+ var minmin;
+ var maxmax;
if (reverse) {
minmin = '+';
maxmax = '-';
@@ -207,10 +207,10 @@ module.exports = function (redisClient, module) {
maxmax = '+';
}
- if (min !== minmin && !min.match(/^[\[\(]/)) {
+ if (min !== minmin && !min.match(/^[[(]/)) {
min = '[' + min;
}
- if (max !== maxmax && !max.match(/^[\[\(]/)) {
+ if (max !== maxmax && !max.match(/^[[(]/)) {
max = '[' + max;
}
diff --git a/src/database/redis/sorted/add.js b/src/database/redis/sorted/add.js
index b2eb710221..e60d079eac 100644
--- a/src/database/redis/sorted/add.js
+++ b/src/database/redis/sorted/add.js
@@ -1,7 +1,6 @@
'use strict';
module.exports = function (redisClient, module) {
-
module.sortedSetAdd = function (key, score, value, callback) {
callback = callback || function () {};
if (Array.isArray(score) && Array.isArray(value)) {
@@ -23,7 +22,7 @@ module.exports = function (redisClient, module) {
var args = [key];
- for(var i = 0; i < scores.length; ++i) {
+ for (var i = 0; i < scores.length; i += 1) {
args.push(scores[i], values[i]);
}
@@ -36,7 +35,7 @@ module.exports = function (redisClient, module) {
callback = callback || function () {};
var multi = redisClient.multi();
- for(var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
multi.zadd(keys[i], score, value);
}
@@ -44,6 +43,4 @@ module.exports = function (redisClient, module) {
callback(err);
});
};
-
-
-};
\ No newline at end of file
+};
diff --git a/src/database/redis/sorted/intersect.js b/src/database/redis/sorted/intersect.js
index a4e3c131b4..86240a7a34 100644
--- a/src/database/redis/sorted/intersect.js
+++ b/src/database/redis/sorted/intersect.js
@@ -2,7 +2,6 @@
'use strict';
module.exports = function (redisClient, module) {
-
module.sortedSetIntersectCard = function (keys, callback) {
if (!Array.isArray(keys) || !keys.length) {
return callback(null, 0);
@@ -70,10 +69,10 @@ module.exports = function (redisClient, module) {
}
results = results[1] || [];
var objects = [];
- for(var i = 0; i < results.length; i += 2) {
- objects.push({value: results[i], score: parseFloat(results[i + 1])});
+ for (var i = 0; i < results.length; i += 2) {
+ objects.push({ value: results[i], score: parseFloat(results[i + 1]) });
}
callback(null, objects);
});
}
-};
\ No newline at end of file
+};
diff --git a/src/database/redis/sorted/remove.js b/src/database/redis/sorted/remove.js
index aa1d42a3ce..eacb6ca861 100644
--- a/src/database/redis/sorted/remove.js
+++ b/src/database/redis/sorted/remove.js
@@ -2,7 +2,6 @@
'use strict';
module.exports = function (redisClient, module) {
-
var helpers = module.helpers.redis;
module.sortedSetRemove = function (key, value, callback) {
@@ -28,11 +27,11 @@ module.exports = function (redisClient, module) {
module.sortedSetsRemoveRangeByScore = function (keys, min, max, callback) {
callback = callback || function () {};
var multi = redisClient.multi();
- for(var i = 0; i < keys.length; ++i) {
+ for (var i = 0; i < keys.length; i += 1) {
multi.zremrangebyscore(keys[i], min, max);
}
multi.exec(function (err) {
callback(err);
});
};
-};
\ No newline at end of file
+};
diff --git a/src/database/redis/sorted/union.js b/src/database/redis/sorted/union.js
index 677b086259..ea17ee2d4e 100644
--- a/src/database/redis/sorted/union.js
+++ b/src/database/redis/sorted/union.js
@@ -2,7 +2,6 @@
'use strict';
module.exports = function (redisClient, module) {
-
module.sortedSetUnionCard = function (keys, callback) {
var tempSetName = 'temp_' + Date.now();
@@ -30,7 +29,6 @@ module.exports = function (redisClient, module) {
};
module.sortedSetUnion = function (params, callback) {
-
var tempSetName = 'temp_' + Date.now();
var rangeParams = [tempSetName, params.start, params.stop];
@@ -51,10 +49,10 @@ module.exports = function (redisClient, module) {
}
results = results[1] || [];
var objects = [];
- for(var i = 0; i < results.length; i += 2) {
- objects.push({value: results[i], score: parseFloat(results[i + 1])});
+ for (var i = 0; i < results.length; i += 2) {
+ objects.push({ value: results[i], score: parseFloat(results[i + 1]) });
}
callback(null, objects);
});
};
-};
\ No newline at end of file
+};
diff --git a/src/emailer.js b/src/emailer.js
index 4ccd35ed99..95ffbdceba 100644
--- a/src/emailer.js
+++ b/src/emailer.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var winston = require('winston');
@@ -17,7 +17,7 @@ var translator = require('../public/src/modules/translator');
var transports = {
sendmail: nodemailer.createTransport(sendmailTransport()),
- gmail: undefined
+ gmail: undefined,
};
var app;
@@ -29,15 +29,16 @@ var fallbackTransport;
// Enable Gmail transport if enabled in ACP
if (parseInt(meta.config['email:GmailTransport:enabled'], 10) === 1) {
- fallbackTransport = transports.gmail = nodemailer.createTransport(smtpTransport({
+ transports.gmail = nodemailer.createTransport(smtpTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: meta.config['email:GmailTransport:user'],
- pass: meta.config['email:GmailTransport:pass']
- }
+ pass: meta.config['email:GmailTransport:pass'],
+ },
}));
+ fallbackTransport = transports.gmail;
} else {
fallbackTransport = transports.sendmail;
}
@@ -56,7 +57,7 @@ var fallbackTransport;
function (next) {
async.parallel({
email: async.apply(User.getUserField, uid, 'email'),
- settings: async.apply(User.getSettings, uid)
+ settings: async.apply(User.getSettings, uid),
}, next);
},
function (results, next) {
@@ -66,7 +67,7 @@ var fallbackTransport;
}
params.uid = uid;
Emailer.sendToEmail(template, results.email, results.settings.userLang, params, next);
- }
+ },
], callback);
};
@@ -85,7 +86,7 @@ var fallbackTransport;
translator.translate(params.subject, lang, function (translated) {
next(null, translated);
});
- }
+ },
}, next);
},
function (results, next) {
@@ -97,12 +98,12 @@ var fallbackTransport;
subject: results.subject,
html: results.html,
plaintext: htmlToText.fromString(results.html, {
- ignoreImage: true
+ ignoreImage: true,
}),
template: template,
uid: params.uid,
pid: params.pid,
- fromUid: params.fromUid
+ fromUid: params.fromUid,
};
Plugins.fireHook('filter:email.modify', data, next);
},
@@ -112,7 +113,7 @@ var fallbackTransport;
} else {
Emailer.sendViaFallback(data, next);
}
- }
+ },
], function (err) {
if (err && err.code === 'ENOENT') {
callback(new Error('[[error:sendmail-not-found]]'));
@@ -163,6 +164,5 @@ var fallbackTransport;
return parsed.hostname;
}
-
}(module.exports));
diff --git a/src/emitter.js b/src/emitter.js
index ca262257b7..140c35f639 100644
--- a/src/emitter.js
+++ b/src/emitter.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var eventEmitter = new (require('events')).EventEmitter();
@@ -32,4 +32,4 @@ eventEmitter.any = function (events, callback) {
});
};
-module.exports = eventEmitter;
\ No newline at end of file
+module.exports = eventEmitter;
diff --git a/src/events.js b/src/events.js
index 3f061566b9..ab2864bc23 100644
--- a/src/events.js
+++ b/src/events.js
@@ -4,7 +4,7 @@
var async = require('async');
var validator = require('validator');
-var db = require('./database');
+var db = require('./database');
var batch = require('./batch');
var user = require('./user');
var utils = require('../public/src/utils');
@@ -27,10 +27,10 @@ var utils = require('../public/src/utils');
},
function (next) {
db.setObject('event:' + eid, data, next);
- }
+ },
], next);
- }
- ], function (err, result) {
+ },
+ ], function (err) {
callback(err);
});
};
@@ -61,12 +61,16 @@ var utils = require('../public/src/utils');
}
});
var e = utils.merge(event);
- e.eid = e.uid = e.type = e.ip = e.user = undefined;
+ e.eid = undefined;
+ e.uid = undefined;
+ e.type = undefined;
+ e.ip = undefined;
+ e.user = undefined;
event.jsonString = JSON.stringify(e, null, 4);
event.timestampISO = new Date(parseInt(event.timestamp, 10)).toUTCString();
});
next(null, eventsData);
- }
+ },
], callback);
};
@@ -87,7 +91,7 @@ var utils = require('../public/src/utils');
},
userData: function (next) {
user.getUsersFields(uids, ['username', 'userslug', 'picture'], next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -121,7 +125,7 @@ var utils = require('../public/src/utils');
},
function (next) {
db.sortedSetRemove('events:time', eids, next);
- }
+ },
], callback);
};
@@ -130,8 +134,6 @@ var utils = require('../public/src/utils');
batch.processSortedSet('events:time', function (eids, next) {
events.deleteEvents(eids, next);
- }, {alwaysStartAt: 0}, callback);
+ }, { alwaysStartAt: 0 }, callback);
};
-
-
}(module.exports));
diff --git a/src/file.js b/src/file.js
index 585a46dcaf..572e2cf622 100644
--- a/src/file.js
+++ b/src/file.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var fs = require('fs');
var nconf = require('nconf');
@@ -35,7 +35,7 @@ file.saveFileToLocal = function (filename, folder, tempPath, callback) {
is.on('end', function () {
callback(null, {
url: '/assets/uploads/' + folder + '/' + filename,
- path: uploadPath
+ path: uploadPath,
});
});
@@ -49,7 +49,7 @@ file.base64ToLocal = function (imageData, uploadPath, callback) {
uploadPath = path.join(nconf.get('upload_path'), uploadPath);
fs.writeFile(uploadPath, buffer, {
- encoding: 'base64'
+ encoding: 'base64',
}, function (err) {
callback(err, uploadPath);
});
@@ -119,8 +119,7 @@ file.existsSync = function (path) {
file.link = function link(filePath, destPath, cb) {
if (process.platform === 'win32') {
fs.link(filePath, destPath, cb);
- }
- else {
+ } else {
fs.symlink(filePath, destPath, 'file', cb);
}
};
diff --git a/src/groups.js b/src/groups.js
index 15b42b368b..5ed854b944 100644
--- a/src/groups.js
+++ b/src/groups.js
@@ -11,7 +11,6 @@ var privileges = require('./privileges');
var utils = require('../public/src/utils');
(function (Groups) {
-
require('./groups/create')(Groups);
require('./groups/delete')(Groups);
require('./groups/update')(Groups);
@@ -20,30 +19,29 @@ var utils = require('../public/src/utils');
require('./groups/search')(Groups);
require('./groups/cover')(Groups);
- var ephemeralGroups = ['guests'],
-
- internals = {
- getEphemeralGroup: function (groupName) {
- return {
- name: groupName,
- slug: utils.slugify(groupName),
- description: '',
- deleted: '0',
- hidden: '0',
- system: '1'
- };
- },
- removeEphemeralGroups: function (groups) {
- var x = groups.length;
- while(x--) {
- if (ephemeralGroups.indexOf(groups[x]) !== -1) {
- groups.splice(x, 1);
- }
+ var ephemeralGroups = ['guests'];
+
+ var internals = {
+ getEphemeralGroup: function (groupName) {
+ return {
+ name: groupName,
+ slug: utils.slugify(groupName),
+ description: '',
+ deleted: '0',
+ hidden: '0',
+ system: '1',
+ };
+ },
+ removeEphemeralGroups: function (groups) {
+ for (var x = groups.length; x >= 0; x -= 1) {
+ if (ephemeralGroups.indexOf(groups[x]) !== -1) {
+ groups.splice(x, 1);
}
-
- return groups;
}
- };
+
+ return groups;
+ },
+ };
Groups.internals = internals;
@@ -73,7 +71,7 @@ var utils = require('../public/src/utils');
}
Groups.getGroupsAndMembers(groupNames, next);
- }
+ },
], callback);
};
@@ -88,7 +86,7 @@ var utils = require('../public/src/utils');
},
members: function (next) {
Groups.getMemberUsers(groupNames, 0, 3, next);
- }
+ },
}, function (err, data) {
if (err) {
return callback(err);
@@ -132,7 +130,7 @@ var utils = require('../public/src/utils');
},
function (uids, next) {
user.getUsersData(uids, next);
- }
+ },
], next);
},
invited: function (next) {
@@ -142,13 +140,13 @@ var utils = require('../public/src/utils');
},
function (uids, next) {
user.getUsersData(uids, next);
- }
+ },
], next);
},
isMember: async.apply(Groups.isMember, options.uid, groupName),
isPending: async.apply(Groups.isPending, options.uid, groupName),
isInvited: async.apply(Groups.isInvited, options.uid, groupName),
- isOwner: async.apply(Groups.ownership.isOwner, options.uid, groupName)
+ isOwner: async.apply(Groups.ownership.isOwner, options.uid, groupName),
}, function (err, results) {
if (err) {
return callback(err);
@@ -186,7 +184,7 @@ var utils = require('../public/src/utils');
results.base.isInvited = results.isInvited;
results.base.isOwner = results.isOwner;
- plugins.fireHook('filter:group.get', {group: results.base}, function (err, data) {
+ plugins.fireHook('filter:group.get', { group: results.base }, function (err, data) {
callback(err, data ? data.group : null);
});
});
@@ -206,12 +204,12 @@ var utils = require('../public/src/utils');
},
function (uids, next) {
user.getUsers(uids, uid, next);
- }
+ },
], next);
},
members: function (next) {
user.getUsersFromSet('group:' + groupName + ':members', uid, start, stop, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -276,7 +274,7 @@ var utils = require('../public/src/utils');
if (err) {
return callback(err);
}
- plugins.fireHook('action:group.set', {field: field, value: value, type: 'set'});
+ plugins.fireHook('action:group.set', { field: field, value: value, type: 'set' });
callback();
});
};
@@ -287,7 +285,7 @@ var utils = require('../public/src/utils');
return callback(err);
}
- callback(null, (parseInt(isPrivate, 10) === 0) ? false : true);
+ callback(null, parseInt(isPrivate, 10) !== 0);
});
};
@@ -304,15 +302,15 @@ var utils = require('../public/src/utils');
Groups.exists = function (name, callback) {
if (Array.isArray(name)) {
var slugs = name.map(function (groupName) {
- return utils.slugify(groupName);
- });
+ return utils.slugify(groupName);
+ });
async.parallel([
function (next) {
next(null, slugs.map(function (slug) {
return ephemeralGroups.indexOf(slug) !== -1;
}));
},
- async.apply(db.isSortedSetMembers, 'groups:createtime', name)
+ async.apply(db.isSortedSetMembers, 'groups:createtime', name),
], function (err, results) {
if (err) {
return callback(err);
@@ -327,7 +325,7 @@ var utils = require('../public/src/utils');
function (next) {
next(null, ephemeralGroups.indexOf(slug) !== -1);
},
- async.apply(db.isSortedSetMember, 'groups:createtime', name)
+ async.apply(db.isSortedSetMember, 'groups:createtime', name),
], function (err, results) {
callback(err, !err ? (results[0] || results[1]) : null);
});
@@ -360,8 +358,8 @@ var utils = require('../public/src/utils');
privileges.posts.filter('read', pids, uid, next);
},
function (pids, next) {
- posts.getPostSummaryByPids(pids, uid, {stripTags: false}, next);
- }
+ posts.getPostSummaryByPids(pids, uid, { stripTags: false }, next);
+ },
], callback);
};
@@ -408,7 +406,7 @@ var utils = require('../public/src/utils');
group.hidden = parseInt(group.hidden, 10) === 1;
group.system = parseInt(group.system, 10) === 1;
group.private = (group.private === null || group.private === undefined) ? true : !!parseInt(group.private, 10);
- group.disableJoinRequests = parseInt(group.disableJoinRequests) === 1;
+ group.disableJoinRequests = parseInt(group.disableJoinRequests, 10) === 1;
group['cover:url'] = group['cover:url'] || require('./coverPhoto').getDefaultGroupCover(group.name);
group['cover:thumb:url'] = group['cover:thumb:url'] || group['cover:url'];
@@ -416,7 +414,7 @@ var utils = require('../public/src/utils');
}
});
- plugins.fireHook('filter:groups.get', {groups: groupData}, function (err, data) {
+ plugins.fireHook('filter:groups.get', { groups: groupData }, function (err, data) {
callback(err, data ? data.groups : null);
});
});
@@ -448,8 +446,7 @@ var utils = require('../public/src/utils');
Groups.getGroupsData(memberOf, next);
});
}, next);
- }
+ },
], callback);
};
-
}(module.exports));
diff --git a/src/groups/cover.js b/src/groups/cover.js
index 8f18c60ad7..a7d7550fa0 100644
--- a/src/groups/cover.js
+++ b/src/groups/cover.js
@@ -1,10 +1,7 @@
'use strict';
var async = require('async');
-var nconf = require('nconf');
-var path = require('path');
var fs = require('fs');
-var crypto = require('crypto');
var Jimp = require('jimp');
var mime = require('mime');
var winston = require('winston');
@@ -14,7 +11,6 @@ var image = require('../image');
var uploadsController = require('../controllers/uploads');
module.exports = function (Groups) {
-
Groups.updateCoverPosition = function (groupName, position, callback) {
if (!groupName) {
return callback(new Error('[[error:invalid-data]]'));
@@ -23,7 +19,6 @@ module.exports = function (Groups) {
};
Groups.updateCover = function (uid, data, callback) {
-
// Position only? That's fine
if (!data.imageData && !data.file && data.position) {
return Groups.updateCoverPosition(data.groupName, data.position, callback);
@@ -45,7 +40,7 @@ module.exports = function (Groups) {
uploadsController.uploadGroupCover(uid, {
name: 'groupCover',
path: tempPath,
- type: type
+ type: type,
}, next);
},
function (uploadData, next) {
@@ -59,7 +54,7 @@ module.exports = function (Groups) {
uploadsController.uploadGroupCover(uid, {
name: 'groupCoverThumb',
path: tempPath,
- type: type
+ type: type,
}, next);
},
function (uploadData, next) {
@@ -71,13 +66,13 @@ module.exports = function (Groups) {
} else {
next(null);
}
- }
+ },
], function (err) {
fs.unlink(tempPath, function (unlinkErr) {
if (unlinkErr) {
winston.error(unlinkErr);
}
- callback(err, {url: url});
+ callback(err, { url: url });
});
});
};
@@ -92,7 +87,7 @@ module.exports = function (Groups) {
},
function (image, next) {
image.write(path, next);
- }
+ },
], function (err) {
callback(err);
});
@@ -101,5 +96,4 @@ module.exports = function (Groups) {
Groups.removeCover = function (data, callback) {
db.deleteObjectFields('group:' + data.groupName, ['cover:url', 'cover:thumb:url', 'cover:position'], callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/groups/create.js b/src/groups/create.js
index e4533e1ab0..c7d57b1ebb 100644
--- a/src/groups/create.js
+++ b/src/groups/create.js
@@ -7,7 +7,6 @@ var utils = require('../../public/src/utils');
var db = require('../database');
module.exports = function (Groups) {
-
Groups.create = function (data, callback) {
var system = isSystemGroup(data);
var groupData;
@@ -42,14 +41,14 @@ module.exports = function (Groups) {
hidden: parseInt(data.hidden, 10) === 1 ? 1 : 0,
system: system ? 1 : 0,
private: isPrivate,
- disableJoinRequests: disableJoinRequests
+ disableJoinRequests: disableJoinRequests,
};
- plugins.fireHook('filter:group.create', {group: groupData, data: data}, next);
+ plugins.fireHook('filter:group.create', { group: groupData, data: data }, next);
},
function (results, next) {
var tasks = [
async.apply(db.sortedSetAdd, 'groups:createtime', groupData.createtime, groupData.name),
- async.apply(db.setObject, 'group:' + groupData.name, groupData)
+ async.apply(db.setObject, 'group:' + groupData.name, groupData),
];
if (data.hasOwnProperty('ownerUid')) {
@@ -72,9 +71,8 @@ module.exports = function (Groups) {
function (results, next) {
plugins.fireHook('action:group.create', {group: groupData});
next(null, groupData);
- }
+ },
], callback);
-
};
function isSystemGroup(data) {
diff --git a/src/groups/delete.js b/src/groups/delete.js
index 3c2e02ae73..28dcce8340 100644
--- a/src/groups/delete.js
+++ b/src/groups/delete.js
@@ -6,7 +6,6 @@ var utils = require('../../public/src/utils');
var db = require('./../database');
module.exports = function (Groups) {
-
Groups.destroy = function (groupName, callback) {
Groups.getGroupsData([groupName], function (err, groupsData) {
if (err) {
@@ -37,7 +36,7 @@ module.exports = function (Groups) {
db.sortedSetRemove('group:' + group + ':members', groupName, next);
}, next);
});
- }
+ },
], function (err) {
if (err) {
return callback(err);
diff --git a/src/groups/membership.js b/src/groups/membership.js
index e57847a61c..31a32da17c 100644
--- a/src/groups/membership.js
+++ b/src/groups/membership.js
@@ -1,6 +1,6 @@
'use strict';
-var async = require('async');
+var async = require('async');
var winston = require('winston');
var _ = require('underscore');
@@ -15,11 +15,10 @@ var LRU = require('lru-cache');
var cache = LRU({
max: 40000,
- maxAge: 1000 * 60 * 60
+ maxAge: 1000 * 60 * 60,
});
module.exports = function (Groups) {
-
Groups.cache = cache;
Groups.join = function (groupName, uid, callback) {
@@ -46,7 +45,7 @@ module.exports = function (Groups) {
Groups.create({
name: groupName,
description: '',
- hidden: 1
+ hidden: 1,
}, function (err) {
if (err && err.message !== '[[error:group-already-exists]]') {
winston.error('[groups.join] Could not create new hidden group: ' + err.message);
@@ -62,13 +61,13 @@ module.exports = function (Groups) {
},
isHidden: function (next) {
Groups.isHidden(groupName, next);
- }
+ },
}, next);
},
function (results, next) {
var tasks = [
async.apply(db.sortedSetAdd, 'group:' + groupName + ':members', Date.now(), uid),
- async.apply(db.incrObjectField, 'group:' + groupName, 'memberCount')
+ async.apply(db.incrObjectField, 'group:' + groupName, 'memberCount'),
];
if (results.isAdmin) {
tasks.push(async.apply(db.setAdd, 'group:' + groupName + ':owners', uid));
@@ -85,10 +84,10 @@ module.exports = function (Groups) {
function (next) {
plugins.fireHook('action:group.join', {
groupName: groupName,
- uid: uid
+ uid: uid,
});
next();
- }
+ },
], callback);
};
@@ -120,12 +119,12 @@ module.exports = function (Groups) {
bodyLong: '[[groups:request.notification_text, ' + username + ', ' + groupName + ']]',
nid: 'group:' + groupName + ':uid:' + uid + ':request',
path: '/groups/' + utils.slugify(groupName),
- from: uid
+ from: uid,
}, next);
},
owners: function (next) {
Groups.getOwners(groupName, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -133,24 +132,22 @@ module.exports = function (Groups) {
return next();
}
notifications.push(results.notification, results.owners, next);
- }
+ },
], callback);
};
Groups.acceptMembership = function (groupName, uid, callback) {
- // Note: For simplicity, this method intentially doesn't check the caller uid for ownership!
async.waterfall([
async.apply(db.setRemove, 'group:' + groupName + ':pending', uid),
async.apply(db.setRemove, 'group:' + groupName + ':invited', uid),
- async.apply(Groups.join, groupName, uid)
+ async.apply(Groups.join, groupName, uid),
], callback);
};
Groups.rejectMembership = function (groupName, uid, callback) {
- // Note: For simplicity, this method intentially doesn't check the caller uid for ownership!
async.parallel([
async.apply(db.setRemove, 'group:' + groupName + ':pending', uid),
- async.apply(db.setRemove, 'group:' + groupName + ':invited', uid)
+ async.apply(db.setRemove, 'group:' + groupName + ':invited', uid),
], callback);
};
@@ -161,11 +158,11 @@ module.exports = function (Groups) {
bodyShort: '[[groups:invited.notification_title, ' + groupName + ']]',
bodyLong: '',
nid: 'group:' + groupName + ':uid:' + uid + ':invite',
- path: '/groups/' + utils.slugify(groupName)
+ path: '/groups/' + utils.slugify(groupName),
}),
function (notification, next) {
notifications.push(notification, [uid], next);
- }
+ },
], callback);
};
@@ -182,7 +179,7 @@ module.exports = function (Groups) {
exists: async.apply(Groups.exists, groupName),
isMember: async.apply(Groups.isMember, uid, groupName),
isPending: async.apply(Groups.isPending, uid, groupName),
- isInvited: async.apply(Groups.isInvited, uid, groupName)
+ isInvited: async.apply(Groups.isInvited, uid, groupName),
}, next);
},
function (checks, next) {
@@ -201,10 +198,10 @@ module.exports = function (Groups) {
function (next) {
plugins.fireHook(hookName, {
groupName: groupName,
- uid: uid
+ uid: uid,
});
next();
- }
+ },
], callback);
}
@@ -229,7 +226,7 @@ module.exports = function (Groups) {
async.parallel([
async.apply(db.sortedSetRemove, 'group:' + groupName + ':members', uid),
async.apply(db.setRemove, 'group:' + groupName + ':owners', uid),
- async.apply(db.decrObjectField, 'group:' + groupName, 'memberCount')
+ async.apply(db.decrObjectField, 'group:' + groupName, 'memberCount'),
], next);
},
function (results, next) {
@@ -242,21 +239,19 @@ module.exports = function (Groups) {
}
if (Groups.isPrivilegeGroup(groupName) && parseInt(groupData.memberCount, 10) === 0) {
Groups.destroy(groupName, next);
+ } else if (parseInt(groupData.hidden, 10) !== 1) {
+ db.sortedSetAdd('groups:visible:memberCount', groupData.memberCount, groupName, next);
} else {
- if (parseInt(groupData.hidden, 10) !== 1) {
- db.sortedSetAdd('groups:visible:memberCount', groupData.memberCount, groupName, next);
- } else {
- next();
- }
+ next();
}
},
function (next) {
plugins.fireHook('action:group.leave', {
groupName: groupName,
- uid: uid
+ uid: uid,
});
next();
- }
+ },
], callback);
};
@@ -279,10 +274,10 @@ module.exports = function (Groups) {
},
function (next) {
Groups.rejectMembership(groupName, uid, next);
- }
+ },
], next);
}, next);
- }
+ },
], callback);
};
@@ -318,7 +313,7 @@ module.exports = function (Groups) {
});
function clearCache(uid, groupName) {
- pubsub.publish('group:cache:del', {uid: uid, groupName: groupName});
+ pubsub.publish('group:cache:del', { uid: uid, groupName: groupName });
cache.del(uid + ':' + groupName);
}
@@ -343,7 +338,7 @@ module.exports = function (Groups) {
function (isMember, next) {
cache.set(cacheKey, isMember);
next(null, isMember);
- }
+ },
], callback);
};
@@ -355,7 +350,7 @@ module.exports = function (Groups) {
}
if (!groupName || !uids.length) {
- return callback(null, uids.map(function () {return false;}));
+ return callback(null, uids.map(function () { return false; }));
}
var nonCachedUids = uids.filter(function (uid) {
@@ -376,7 +371,7 @@ module.exports = function (Groups) {
});
getFromCache(next);
- }
+ },
], callback);
};
@@ -388,7 +383,7 @@ module.exports = function (Groups) {
}
if (!uid || parseInt(uid, 10) <= 0 || !groups.length) {
- return callback(null, groups.map(function () {return false;}));
+ return callback(null, groups.map(function () { return false; }));
}
var nonCachedGroups = groups.filter(function (groupName) {
@@ -413,7 +408,7 @@ module.exports = function (Groups) {
});
getFromCache(next);
- }
+ },
], callback);
};
@@ -471,7 +466,7 @@ module.exports = function (Groups) {
});
var result = members.map(function (groupNames) {
- for (var i = 0; i < groupNames.length; ++i) {
+ for (var i = 0; i < groupNames.length; i += 1) {
if (map[groupNames[i]]) {
return true;
}
@@ -551,7 +546,7 @@ module.exports = function (Groups) {
return next(new Error('[[error:group-needs-owner]]'));
}
Groups.leave(groupName, uid, next);
- }
+ },
], callback);
} else {
Groups.leave(groupName, uid, callback);
diff --git a/src/groups/ownership.js b/src/groups/ownership.js
index f397abe5e7..0b386bbe35 100644
--- a/src/groups/ownership.js
+++ b/src/groups/ownership.js
@@ -1,11 +1,10 @@
'use strict';
-var async = require('async'),
- db = require('../database'),
- plugins = require('../plugins');
+var async = require('async');
+var db = require('../database');
+var plugins = require('../plugins');
module.exports = function (Groups) {
-
Groups.ownership = {};
Groups.ownership.isOwner = function (uid, groupName, callback) {
@@ -30,9 +29,9 @@ module.exports = function (Groups) {
db.setAdd('group:' + groupName + ':owners', toUid, next);
},
function (next) {
- plugins.fireHook('action:group.grantOwnership', {uid: toUid, groupName: groupName});
+ plugins.fireHook('action:group.grantOwnership', { uid: toUid, groupName: groupName });
next();
- }
+ },
], callback);
};
@@ -51,9 +50,9 @@ module.exports = function (Groups) {
db.setRemove('group:' + groupName + ':owners', toUid, next);
},
function (next) {
- plugins.fireHook('action:group.rescindOwnership', {uid: toUid, groupName: groupName});
+ plugins.fireHook('action:group.rescindOwnership', { uid: toUid, groupName: groupName });
next();
- }
+ },
], callback);
};
};
diff --git a/src/groups/search.js b/src/groups/search.js
index 3b6bfab9cd..3c580b5e8d 100644
--- a/src/groups/search.js
+++ b/src/groups/search.js
@@ -7,7 +7,6 @@ var db = require('./../database');
module.exports = function (Groups) {
-
Groups.search = function (query, options, callback) {
if (!query) {
return callback(null, []);
@@ -33,38 +32,37 @@ module.exports = function (Groups) {
}
Groups.sort(options.sort, groupsData, next);
- }
+ },
], callback);
};
Groups.sort = function (strategy, groups, next) {
- switch(strategy) {
- case 'count':
- groups = groups.sort(function (a, b) {
- return a.slug > b.slug;
- }).sort(function (a, b) {
- return b.memberCount - a.memberCount;
- });
- break;
+ switch (strategy) {
+ case 'count':
+ groups = groups.sort(function (a, b) {
+ return a.slug > b.slug;
+ }).sort(function (a, b) {
+ return b.memberCount - a.memberCount;
+ });
+ break;
- case 'date':
- groups = groups.sort(function (a, b) {
- return b.createtime - a.createtime;
- });
- break;
+ case 'date':
+ groups = groups.sort(function (a, b) {
+ return b.createtime - a.createtime;
+ });
+ break;
- case 'alpha': // intentional fall-through
- default:
- groups = groups.sort(function (a, b) {
- return a.slug > b.slug ? 1 : -1;
- });
+ case 'alpha': // intentional fall-through
+ default:
+ groups = groups.sort(function (a, b) {
+ return a.slug > b.slug ? 1 : -1;
+ });
}
next(null, groups);
};
Groups.searchMembers = function (data, callback) {
-
function findUids(query, searchBy, callback) {
query = query.toLowerCase();
@@ -77,14 +75,14 @@ module.exports = function (Groups) {
},
function (users, next) {
var uids = [];
- for(var i = 0; i < users.length; ++i) {
+ for (var i = 0; i < users.length; i += 1) {
var field = users[i][searchBy];
if (field.toLowerCase().startsWith(query)) {
uids.push(users[i].uid);
}
}
next(null, uids);
- }
+ },
], callback);
}
@@ -93,7 +91,7 @@ module.exports = function (Groups) {
if (err) {
return callback(err);
}
- callback(null, {users: users});
+ callback(null, { users: users });
});
return;
}
@@ -112,24 +110,22 @@ module.exports = function (Groups) {
Groups.ownership.isOwners(uids, data.groupName, next);
},
function (isOwners, next) {
-
results.users.forEach(function (user, index) {
if (user) {
user.isOwner = isOwners[index];
}
});
- results.users.sort(function (a,b) {
+ results.users.sort(function (a, b) {
if (a.isOwner && !b.isOwner) {
return -1;
} else if (!a.isOwner && b.isOwner) {
return 1;
- } else {
- return 0;
}
+ return 0;
});
next(null, results);
- }
+ },
], callback);
};
};
diff --git a/src/groups/update.js b/src/groups/update.js
index 4dfe760a96..99e8dcc65a 100644
--- a/src/groups/update.js
+++ b/src/groups/update.js
@@ -9,7 +9,6 @@ var db = require('../database');
module.exports = function (Groups) {
-
Groups.update = function (groupName, values, callback) {
callback = callback || function () {};
@@ -23,7 +22,7 @@ module.exports = function (Groups) {
}
plugins.fireHook('filter:group.update', {
groupName: groupName,
- values: values
+ values: values,
}, next);
},
function (result, next) {
@@ -32,7 +31,7 @@ module.exports = function (Groups) {
var payload = {
description: values.description || '',
icon: values.icon || '',
- labelColor: values.labelColor || '#000000'
+ labelColor: values.labelColor || '#000000',
};
if (values.hasOwnProperty('userTitle')) {
@@ -71,16 +70,16 @@ module.exports = function (Groups) {
}
},
async.apply(db.setObject, 'group:' + groupName, payload),
- async.apply(renameGroup, groupName, values.name)
+ async.apply(renameGroup, groupName, values.name),
], next);
},
function (result, next) {
plugins.fireHook('action:group.update', {
name: groupName,
- values: values
+ values: values,
});
next();
- }
+ },
], callback);
};
@@ -118,7 +117,7 @@ module.exports = function (Groups) {
callback = callback || function () {};
async.parallel([
async.apply(db.setObjectField, 'group:' + groupName, 'hidden', hidden ? 1 : 0),
- async.apply(updateVisibility, groupName, hidden)
+ async.apply(updateVisibility, groupName, hidden),
], function (err) {
callback(err);
});
@@ -131,7 +130,7 @@ module.exports = function (Groups) {
},
function (currentValue, next) {
var currentlyPrivate = parseInt(currentValue.private, 10) === 1;
- if (!currentlyPrivate || currentlyPrivate === isPrivate) {
+ if (!currentlyPrivate || currentlyPrivate === isPrivate) {
return callback();
}
db.getSetMembers('group:' + groupName + ':pending', next);
@@ -146,9 +145,9 @@ module.exports = function (Groups) {
winston.verbose('[groups.update] Group is now public, automatically adding ' + uids.length + ' new members, who were pending prior.');
async.series([
async.apply(db.sortedSetAdd, 'group:' + groupName + ':members', scores, uids),
- async.apply(db.delete, 'group:' + groupName + ':pending')
+ async.apply(db.delete, 'group:' + groupName + ':pending'),
], next);
- }
+ },
], function (err) {
callback(err);
});
@@ -218,11 +217,11 @@ module.exports = function (Groups) {
function (next) {
plugins.fireHook('action:group.rename', {
old: oldName,
- new: newName
+ new: newName,
});
next();
- }
+ },
], callback);
});
});
@@ -244,7 +243,7 @@ module.exports = function (Groups) {
},
function (next) {
db.sortedSetAdd(group, score, newName, next);
- }
+ },
], callback);
});
}
diff --git a/src/hotswap.js b/src/hotswap.js
index ece8f205d7..76cb2f774b 100644
--- a/src/hotswap.js
+++ b/src/hotswap.js
@@ -1,8 +1,8 @@
-"use strict";
+'use strict';
-var HotSwap = {},
- winston = require('winston'),
- stack;
+var HotSwap = {};
+var winston = require('winston');
+var stack;
HotSwap.prepare = function (app) {
stack = app._router.stack;
@@ -10,7 +10,7 @@ HotSwap.prepare = function (app) {
HotSwap.find = function (id) {
if (stack) {
- for(var x = 0,numEntries = stack.length; x < numEntries; x++) {
+ for (var x = 0, numEntries = stack.length; x < numEntries; x += 1) {
if (stack[x].handle.hotswapId === id) {
return x;
}
@@ -31,4 +31,4 @@ HotSwap.replace = function (id, router) {
}
};
-module.exports = HotSwap;
\ No newline at end of file
+module.exports = HotSwap;
diff --git a/src/image.js b/src/image.js
index 7b428f2331..1609993731 100644
--- a/src/image.js
+++ b/src/image.js
@@ -19,7 +19,7 @@ image.resizeImage = function (data, callback) {
target: data.target,
extension: data.extension,
width: data.width,
- height: data.height
+ height: data.height,
}, function (err) {
callback(err);
});
@@ -29,13 +29,13 @@ image.resizeImage = function (data, callback) {
return callback(err);
}
- var w = image.bitmap.width,
- h = image.bitmap.height,
- origRatio = w / h,
- desiredRatio = data.width && data.height ? data.width / data.height : origRatio,
- x = 0,
- y = 0,
- crop;
+ var w = image.bitmap.width;
+ var h = image.bitmap.height;
+ var origRatio = w / h;
+ var desiredRatio = data.width && data.height ? data.width / data.height : origRatio;
+ var x = 0;
+ var y = 0;
+ var crop;
if (origRatio !== desiredRatio) {
if (desiredRatio > origRatio) {
@@ -47,7 +47,7 @@ image.resizeImage = function (data, callback) {
crop = async.apply(image.crop.bind(image), x, y, h * desiredRatio, h);
} else {
x = 0; // width is the smaller dimension here
- y = Math.floor(h / 2 - (w * desiredRatio / 2));
+ y = Math.floor((h / 2) - (w * desiredRatio / 2));
crop = async.apply(image.crop.bind(image), x, y, w, w * desiredRatio);
}
} else {
@@ -71,7 +71,7 @@ image.resizeImage = function (data, callback) {
},
function (image, next) {
image.write(data.target || data.path, next);
- }
+ },
], function (err) {
callback(err);
});
@@ -83,7 +83,7 @@ image.normalise = function (path, extension, callback) {
if (plugins.hasListeners('filter:image.normalise')) {
plugins.fireHook('filter:image.normalise', {
path: path,
- extension: extension
+ extension: extension,
}, function (err) {
callback(err, path + '.png');
});
@@ -138,8 +138,8 @@ image.writeImageDataToTempFile = function (imageData, callback) {
var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64');
fs.writeFile(filepath, buffer, {
- encoding: 'base64'
+ encoding: 'base64',
}, function (err) {
callback(err, filepath);
});
-};
\ No newline at end of file
+};
diff --git a/src/install.js b/src/install.js
index c5ae1e214b..a06a138f26 100644
--- a/src/install.js
+++ b/src/install.js
@@ -15,7 +15,7 @@ questions.main = [
{
name: 'url',
description: 'URL used to access this NodeBB',
- 'default':
+ default:
nconf.get('url') ||
(nconf.get('base_url') ? (nconf.get('base_url') + (nconf.get('use_port') ? ':' + nconf.get('port') : '')) : null) || // backwards compatibility (remove for v0.7.0)
'http://localhost:4567',
@@ -25,20 +25,20 @@ questions.main = [
{
name: 'secret',
description: 'Please enter a NodeBB secret',
- 'default': nconf.get('secret') || utils.generateUUID()
+ default: nconf.get('secret') || utils.generateUUID(),
},
{
name: 'database',
description: 'Which database to use',
- 'default': nconf.get('database') || 'mongo'
- }
+ default: nconf.get('database') || 'mongo',
+ },
];
questions.optional = [
{
name: 'port',
- default: nconf.get('port') || 4567
- }
+ default: nconf.get('port') || 4567,
+ },
];
function checkSetupFlag(next) {
@@ -75,7 +75,7 @@ function checkSetupFlag(next) {
}
} else if (nconf.get('database')) {
install.values = {
- database: nconf.get('database')
+ database: nconf.get('database'),
};
next();
} else {
@@ -133,7 +133,7 @@ function setupConfig(next) {
var allQuestions = questions.main.concat(questions.optional).concat(redisQuestions).concat(mongoQuestions);
allQuestions.forEach(function (question) {
- config[question.name] = install.values[question.name] || question['default'] || undefined;
+ config[question.name] = install.values[question.name] || question.default || undefined;
});
setImmediate(next, null, config);
} else {
@@ -145,7 +145,7 @@ function setupConfig(next) {
},
function (config, next) {
completeConfigSetup(config, next);
- }
+ },
], next);
}
@@ -153,7 +153,7 @@ function completeConfigSetup(config, next) {
// Add CI object
if (install.ciVals) {
config.test_database = {};
- for(var prop in install.ciVals) {
+ for (var prop in install.ciVals) {
if (install.ciVals.hasOwnProperty(prop)) {
config.test_database[prop] = install.ciVals[prop];
}
@@ -169,7 +169,7 @@ function completeConfigSetup(config, next) {
},
function (next) {
require('./database').createIndices(next);
- }
+ },
], next);
}
@@ -199,7 +199,7 @@ function enableDefaultTheme(next) {
process.stdout.write('Enabling default theme: ' + defaultTheme + '\n');
meta.themes.set({
type: 'local',
- id: defaultTheme
+ id: defaultTheme,
}, next);
});
}
@@ -228,84 +228,84 @@ function createAdmin(callback) {
winston.warn('No administrators have been detected, running initial user setup\n');
var questions = [{
- name: 'username',
- description: 'Administrator username',
- required: true,
- type: 'string'
- }, {
- name: 'email',
- description: 'Administrator email address',
- pattern: /.+@.+/,
- required: true
- }],
- passwordQuestions = [{
- name: 'password',
- description: 'Password',
- required: true,
- hidden: true,
- type: 'string'
- }, {
- name: 'password:confirm',
- description: 'Confirm Password',
- required: true,
- hidden: true,
- type: 'string'
- }],
- success = function (err, results) {
+ name: 'username',
+ description: 'Administrator username',
+ required: true,
+ type: 'string',
+ }, {
+ name: 'email',
+ description: 'Administrator email address',
+ pattern: /.+@.+/,
+ required: true,
+ }];
+ var passwordQuestions = [{
+ name: 'password',
+ description: 'Password',
+ required: true,
+ hidden: true,
+ type: 'string',
+ }, {
+ name: 'password:confirm',
+ description: 'Confirm Password',
+ required: true,
+ hidden: true,
+ type: 'string',
+ }];
+ function success(err, results) {
+ if (err) {
+ return callback(err);
+ }
+ if (!results) {
+ return callback(new Error('aborted'));
+ }
+
+ if (results['password:confirm'] !== results.password) {
+ winston.warn('Passwords did not match, please try again');
+ return retryPassword(results);
+ }
+
+ if (results.password.length < meta.config.minimumPasswordLength) {
+ winston.warn('Password too short, please try again');
+ return retryPassword(results);
+ }
+
+ var adminUid;
+ async.waterfall([
+ function (next) {
+ User.create({ username: results.username, password: results.password, email: results.email }, next);
+ },
+ function (uid, next) {
+ adminUid = uid;
+ Groups.join('administrators', uid, next);
+ },
+ function (next) {
+ Groups.show('administrators', next);
+ },
+ function (next) {
+ Groups.ownership.grant(adminUid, 'administrators', next);
+ },
+ ], function (err) {
if (err) {
return callback(err);
}
+ callback(null, password ? results : undefined);
+ });
+ }
+ function retryPassword(originalResults) {
+ // Ask only the password questions
+ prompt.get(passwordQuestions, function (err, results) {
if (!results) {
return callback(new Error('aborted'));
}
- if (results['password:confirm'] !== results.password) {
- winston.warn("Passwords did not match, please try again");
- return retryPassword(results);
- }
-
- if (results.password.length < meta.config.minimumPasswordLength) {
- winston.warn("Password too short, please try again");
- return retryPassword(results);
- }
-
- var adminUid;
- async.waterfall([
- function (next) {
- User.create({username: results.username, password: results.password, email: results.email}, next);
- },
- function (uid, next) {
- adminUid = uid;
- Groups.join('administrators', uid, next);
- },
- function (next) {
- Groups.show('administrators', next);
- },
- function (next) {
- Groups.ownership.grant(adminUid, 'administrators', next);
- }
- ], function (err) {
- if (err) {
- return callback(err);
- }
- callback(null, password ? results : undefined);
- });
- },
- retryPassword = function (originalResults) {
- // Ask only the password questions
- prompt.get(passwordQuestions, function (err, results) {
- if (!results) {
- return callback(new Error('aborted'));
- }
-
- // Update the original data with newly collected password
- originalResults.password = results.password;
- originalResults['password:confirm'] = results['password:confirm'];
+ // Update the original data with newly collected password
+ originalResults.password = results.password;
+ originalResults['password:confirm'] = results['password:confirm'];
- // Send back to success to handle
- success(err, originalResults);
- });
- };
+ // Send back to success to handle
+ success(err, originalResults);
+ });
+ }
// Add the password questions
questions = questions.concat(passwordQuestions);
@@ -323,7 +323,7 @@ function createAdmin(callback) {
username: install.values['admin:username'] || nconf.get('admin:username') || 'admin',
email: install.values['admin:email'] || nconf.get('admin:email') || '',
password: install.values['admin:password'] || nconf.get('admin:password') || password,
- 'password:confirm': install.values['admin:password:confirm'] || nconf.get('admin:password') || password
+ 'password:confirm': install.values['admin:password:confirm'] || nconf.get('admin:password') || password,
};
success(null, results);
@@ -347,12 +347,12 @@ function createGlobalModeratorsGroup(next) {
description: 'Forum wide moderators',
hidden: 0,
private: 1,
- disableJoinRequests: 1
+ disableJoinRequests: 1,
}, next);
},
function (groupData, next) {
groups.show('Global Moderators', next);
- }
+ },
], next);
}
@@ -397,8 +397,8 @@ function createMenuItems(next) {
}
function createWelcomePost(next) {
- var db = require('./database'),
- Topics = require('./topics');
+ var db = require('./database');
+ var Topics = require('./topics');
async.parallel([
function (next) {
@@ -406,14 +406,14 @@ function createWelcomePost(next) {
},
function (next) {
db.getObjectField('global', 'topicCount', next);
- }
+ },
], function (err, results) {
if (err) {
return next(err);
}
- var content = results[0],
- numTopics = results[1];
+ var content = results[0];
+ var numTopics = results[1];
if (!parseInt(numTopics, 10)) {
process.stdout.write('Creating welcome post!\n');
@@ -421,7 +421,7 @@ function createWelcomePost(next) {
uid: 1,
cid: 2,
title: 'Welcome to your NodeBB!',
- content: content.toString()
+ content: content.toString(),
}, next);
} else {
next();
@@ -430,20 +430,19 @@ function createWelcomePost(next) {
}
function enableDefaultPlugins(next) {
-
process.stdout.write('Enabling default plugins\n');
var defaultEnabled = [
- 'nodebb-plugin-composer-default',
- 'nodebb-plugin-markdown',
- 'nodebb-plugin-mentions',
- 'nodebb-widget-essentials',
- 'nodebb-rewards-essentials',
- 'nodebb-plugin-soundpack-default',
- 'nodebb-plugin-emoji-extended',
- 'nodebb-plugin-emoji-one'
- ],
- customDefaults = nconf.get('defaultPlugins');
+ 'nodebb-plugin-composer-default',
+ 'nodebb-plugin-markdown',
+ 'nodebb-plugin-mentions',
+ 'nodebb-widget-essentials',
+ 'nodebb-rewards-essentials',
+ 'nodebb-plugin-soundpack-default',
+ 'nodebb-plugin-emoji-extended',
+ 'nodebb-plugin-emoji-one',
+ ];
+ var customDefaults = nconf.get('defaultPlugins');
winston.info('[install/defaultPlugins] customDefaults', customDefaults);
@@ -478,7 +477,7 @@ function setCopyrightWidget(next) {
},
footer: function (next) {
db.getObjectField('widgets:global', 'footer', next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -493,7 +492,6 @@ function setCopyrightWidget(next) {
}
install.setup = function (callback) {
-
async.series([
checkSetupFlag,
checkCIFlag,
@@ -513,10 +511,13 @@ install.setup = function (callback) {
if (err) {
return next(err);
}
- if (!uptodate) { upgrade.upgrade(next); }
- else { next(); }
+ if (!uptodate) {
+ upgrade.upgrade(next);
+ } else {
+ next();
+ }
});
- }
+ },
], function (err, results) {
if (err) {
winston.warn('NodeBB Setup Aborted.\n ' + err.stack);
@@ -549,7 +550,7 @@ install.save = function (server_conf, callback) {
process.stdout.write('Configuration Saved OK\n');
nconf.file({
- file: path.join(__dirname, '..', 'config.json')
+ file: path.join(__dirname, '..', 'config.json'),
});
callback();
diff --git a/src/logger.js b/src/logger.js
index 4d6b8f717c..73180d7add 100644
--- a/src/logger.js
+++ b/src/logger.js
@@ -4,35 +4,33 @@
* Logger module: ability to dynamically turn on/off logging for http requests & socket.io events
*/
-var fs = require('fs'),
- path = require('path'),
- winston = require('winston'),
- util = require('util'),
+var fs = require('fs');
+var path = require('path');
+var winston = require('winston');
+var util = require('util');
- file = require('./file'),
- meta = require('./meta'),
- morgan = require('morgan');
+var file = require('./file');
+var meta = require('./meta');
+var morgan = require('morgan');
var opts = {
/*
* state used by Logger
*/
- express : {
- app : {},
- set : 0,
- ofn : null,
+ express: {
+ app: {},
+ set: 0,
+ ofn: null,
+ },
+ streams: {
+ log: { f: process.stdout },
},
- streams : {
- log : { f : process.stdout },
- }
};
/* -- Logger -- */
(function (Logger) {
-
-
Logger.init = function (app) {
opts.express.app = app;
/* Open log file stream & initialize express logging if meta.config.logger* variables are set */
@@ -59,15 +57,14 @@ var opts = {
* If logging is currently enabled, create a stream.
* Otherwise, close the current stream
*/
- if(meta.config.loggerStatus > 0 || meta.config.loggerIOStatus) {
+ if (meta.config.loggerStatus > 0 || meta.config.loggerIOStatus) {
var stream = Logger.open(value);
- if(stream) {
+ if (stream) {
opts.streams.log.f = stream;
} else {
opts.streams.log.f = process.stdout;
}
- }
- else {
+ } else {
Logger.close(opts.streams.log);
}
};
@@ -75,22 +72,21 @@ var opts = {
Logger.open = function (value) {
/* Open the streams to log to: either a path or stdout */
var stream;
- if(value) {
- if(file.existsSync(value)) {
+ if (value) {
+ if (file.existsSync(value)) {
var stats = fs.statSync(value);
- if(stats) {
- if(stats.isDirectory()) {
- stream = fs.createWriteStream(path.join(value, 'nodebb.log'), {flags: 'a'});
+ if (stats) {
+ if (stats.isDirectory()) {
+ stream = fs.createWriteStream(path.join(value, 'nodebb.log'), { flags: 'a' });
} else {
- stream = fs.createWriteStream(value, {flags: 'a'});
+ stream = fs.createWriteStream(value, { flags: 'a' });
}
}
} else {
- stream = fs.createWriteStream(value, {flags: 'a'});
-
+ stream = fs.createWriteStream(value, { flags: 'a' });
}
- if(stream) {
+ if (stream) {
stream.on('error', function (err) {
winston.error(err.message);
});
@@ -102,7 +98,7 @@ var opts = {
};
Logger.close = function (stream) {
- if(stream.f !== process.stdout && stream.f) {
+ if (stream.f !== process.stdout && stream.f) {
stream.end();
}
stream.f = null;
@@ -112,33 +108,32 @@ var opts = {
/*
* This monitor's when a user clicks "save" in the Logger section of the admin panel
*/
- Logger.setup_one(data.key,data.value);
+ Logger.setup_one(data.key, data.value);
Logger.io_close(socket);
Logger.io(socket);
};
Logger.express_open = function () {
- if(opts.express.set !== 1) {
+ if (opts.express.set !== 1) {
opts.express.set = 1;
opts.express.app.use(Logger.expressLogger);
}
/*
* Always initialize "ofn" (original function) with the original logger function
*/
- opts.express.ofn = morgan('combined', {stream : opts.streams.log.f});
+ opts.express.ofn = morgan('combined', { stream: opts.streams.log.f });
};
- Logger.expressLogger = function (req,res,next) {
+ Logger.expressLogger = function (req, res, next) {
/*
* The new express.logger
*
* This hijack allows us to turn logger on/off dynamically within express
*/
- if(meta.config.loggerStatus > 0) {
- return opts.express.ofn(req,res,next);
- } else {
- return next();
+ if (meta.config.loggerStatus > 0) {
+ return opts.express.ofn(req, res, next);
}
+ return next();
};
Logger.prepare_io_string = function (_type, _uid, _args) {
@@ -149,9 +144,9 @@ var opts = {
*/
try {
return 'io: ' + _uid + ' ' + _type + ' ' + util.inspect(Array.prototype.slice.call(_args)) + '\n';
- } catch(err) {
- winston.info("Logger.prepare_io_string: Failed", err);
- return "error";
+ } catch (err) {
+ winston.info('Logger.prepare_io_string: Failed', err);
+ return 'error';
}
};
@@ -166,11 +161,11 @@ var opts = {
for (var sid in clients) {
if (clients.hasOwnProperty(sid)) {
var client = clients[sid];
- if(client.oEmit && client.oEmit !== client.emit) {
+ if (client.oEmit && client.oEmit !== client.emit) {
client.emit = client.oEmit;
}
- if(client.$oEmit && client.$oEmit !== client.$emit) {
+ if (client.$oEmit && client.$oEmit !== client.$emit) {
client.$emit = client.$oEmit;
}
}
@@ -187,7 +182,7 @@ var opts = {
}
var clients = socket.io.sockets.sockets;
- for(var sid in clients) {
+ for (var sid in clients) {
if (clients.hasOwnProperty(sid)) {
Logger.io_one(clients[sid], clients[sid].uid);
}
@@ -200,13 +195,13 @@ var opts = {
*/
function override(method, name, errorMsg) {
return function () {
- if(opts.streams.log.f) {
+ if (opts.streams.log.f) {
opts.streams.log.f.write(Logger.prepare_io_string(name, uid, arguments));
}
try {
method.apply(socket, arguments);
- } catch(err) {
+ } catch (err) {
winston.info(errorMsg, err);
}
};
@@ -223,5 +218,4 @@ var opts = {
socket.$emit = override($emit, 'on', 'Logger.io_one: $emit.apply: Failed');
}
};
-
}(exports));
diff --git a/src/messaging.js b/src/messaging.js
index a37503e3e3..e141adff4f 100644
--- a/src/messaging.js
+++ b/src/messaging.js
@@ -57,7 +57,7 @@ Messaging.getMessages = function (params, callback) {
messageData.index = indices[messageData.messageId.toString()];
});
next(null, messageData);
- }
+ },
], callback);
};
@@ -65,7 +65,7 @@ function canGet(hook, callerUid, uid, callback) {
plugins.fireHook(hook, {
callerUid: callerUid,
uid: uid,
- canGet: parseInt(callerUid, 10) === parseInt(uid, 10)
+ canGet: parseInt(callerUid, 10) === parseInt(uid, 10),
}, function (err, data) {
callback(err, data ? data.canGet : false);
});
@@ -84,7 +84,7 @@ Messaging.parse = function (message, fromuid, uid, roomId, isNew, callback) {
uid: uid,
roomId: roomId,
isNew: isNew,
- parsedMessage: parsed
+ parsedMessage: parsed,
};
plugins.fireHook('filter:messaging.parse', messageData, function (err, messageData) {
@@ -106,7 +106,7 @@ Messaging.isNewSet = function (uid, roomId, timestamp, callback) {
} else {
next(null, true);
}
- }
+ },
], callback);
};
@@ -139,7 +139,7 @@ Messaging.getRecentChats = function (callerUid, uid, start, stop, callback) {
uids = uids.filter(function (value) {
return value && parseInt(value, 10) !== parseInt(uid, 10);
});
- user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline'] , next);
+ user.getUsersFields(uids, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline'], next);
});
}, next);
},
@@ -147,7 +147,7 @@ Messaging.getRecentChats = function (callerUid, uid, start, stop, callback) {
async.map(roomIds, function (roomId, next) {
Messaging.getTeaser(uid, roomId, next);
}, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -170,8 +170,8 @@ Messaging.getRecentChats = function (callerUid, uid, start, stop, callback) {
room.usernames = Messaging.generateUsernames(room.users, uid);
});
- next(null, {rooms: results.roomData, nextStart: stop + 1});
- }
+ next(null, { rooms: results.roomData, nextStart: stop + 1 });
+ },
], callback);
};
@@ -206,19 +206,19 @@ Messaging.getTeaser = function (uid, roomId, callback) {
}
teaser.timestampISO = utils.toISOString(teaser.timestamp);
- user.getUserFields(teaser.fromuid, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline'] , next);
+ user.getUserFields(teaser.fromuid, ['uid', 'username', 'userslug', 'picture', 'status', 'lastonline'], next);
},
function (user, next) {
teaser.user = user;
plugins.fireHook('filter:messaging.getTeaser', { teaser: teaser }, function (err, data) {
next(err, data.teaser);
});
- }
+ },
], callback);
};
Messaging.canMessageUser = function (uid, toUid, callback) {
- if (parseInt(meta.config.disableChat) === 1 || !uid || uid === toUid) {
+ if (parseInt(meta.config.disableChat, 10) === 1 || !uid || uid === toUid) {
return callback(new Error('[[error:chat-disabled]]'));
}
@@ -248,7 +248,7 @@ Messaging.canMessageUser = function (uid, toUid, callback) {
async.parallel({
settings: async.apply(user.getSettings, toUid),
isAdmin: async.apply(user.isAdministrator, uid),
- isFollowing: async.apply(user.isFollowing, toUid, uid)
+ isFollowing: async.apply(user.isFollowing, toUid, uid),
}, next);
},
function (results, next) {
@@ -256,13 +256,13 @@ Messaging.canMessageUser = function (uid, toUid, callback) {
return next();
}
- next(new Error('[[error:chat-restricted]]'));
- }
+ next(new Error('[[error:chat-restricted]]'));
+ },
], callback);
};
Messaging.canMessageRoom = function (uid, roomId, callback) {
- if (parseInt(meta.config.disableChat) === 1 || !uid) {
+ if (parseInt(meta.config.disableChat, 10) === 1 || !uid) {
return callback(new Error('[[error:chat-disabled]]'));
}
@@ -294,7 +294,7 @@ Messaging.canMessageRoom = function (uid, roomId, callback) {
}
next();
- }
+ },
], callback);
};
@@ -306,7 +306,7 @@ Messaging.hasPrivateChat = function (uid, withUid, callback) {
function (next) {
async.parallel({
myRooms: async.apply(db.getSortedSetRevRange, 'uid:' + uid + ':chat:rooms', 0, -1),
- theirRooms: async.apply(db.getSortedSetRevRange, 'uid:' + withUid + ':chat:rooms', 0, -1)
+ theirRooms: async.apply(db.getSortedSetRevRange, 'uid:' + withUid + ':chat:rooms', 0, -1),
}, next);
},
function (results, next) {
@@ -331,13 +331,13 @@ Messaging.hasPrivateChat = function (uid, withUid, callback) {
roomId = roomIds[index];
next(null, roomId);
} else {
- ++ index;
+ index += 1;
next();
}
});
}, function (err) {
next(err, roomId);
});
- }
+ },
], callback);
};
diff --git a/src/messaging/create.js b/src/messaging/create.js
index face15f589..2c6ac84ffb 100644
--- a/src/messaging/create.js
+++ b/src/messaging/create.js
@@ -8,7 +8,6 @@ var db = require('../database');
module.exports = function (Messaging) {
-
Messaging.sendMessage = function (uid, roomId, content, timestamp, callback) {
async.waterfall([
function (next) {
@@ -23,7 +22,7 @@ module.exports = function (Messaging) {
}
Messaging.addMessage(uid, roomId, content, timestamp, next);
- }
+ },
], callback);
};
@@ -56,7 +55,7 @@ module.exports = function (Messaging) {
content: content,
timestamp: timestamp,
fromuid: fromuid,
- roomId: roomId
+ roomId: roomId,
};
plugins.fireHook('filter:messaging.save', message, next);
@@ -76,13 +75,13 @@ module.exports = function (Messaging) {
async.apply(Messaging.addRoomToUsers, roomId, uids, timestamp),
async.apply(Messaging.addMessageToUsers, roomId, uids, mid, timestamp),
async.apply(Messaging.markUnread, uids, roomId),
- async.apply(Messaging.addUsersToRoom, fromuid, [fromuid], roomId)
+ async.apply(Messaging.addUsersToRoom, fromuid, [fromuid], roomId),
], next);
},
function (results, next) {
async.parallel({
markRead: async.apply(Messaging.markRead, fromuid, roomId),
- messages: async.apply(Messaging.getMessagesData, [mid], fromuid, roomId, true)
+ messages: async.apply(Messaging.getMessagesData, [mid], fromuid, roomId, true),
}, next);
},
function (results, next) {
@@ -94,7 +93,7 @@ module.exports = function (Messaging) {
results.messages[0].mid = mid;
results.messages[0].roomId = roomId;
next(null, results.messages[0]);
- }
+ },
], callback);
};
@@ -117,4 +116,4 @@ module.exports = function (Messaging) {
});
db.sortedSetsAdd(keys, timestamp, mid, callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/messaging/data.js b/src/messaging/data.js
index d1a00bd8f4..e3cb67fbd8 100644
--- a/src/messaging/data.js
+++ b/src/messaging/data.js
@@ -8,7 +8,6 @@ var user = require('../user');
var utils = require('../../public/src/utils');
module.exports = function (Messaging) {
-
Messaging.getMessageField = function (mid, field, callback) {
Messaging.getMessageFields(mid, [field], function (err, fields) {
callback(err, fields ? fields[field] : null);
@@ -28,7 +27,6 @@ module.exports = function (Messaging) {
};
Messaging.getMessagesData = function (mids, uid, roomId, isNew, callback) {
-
var messages;
async.waterfall([
@@ -110,7 +108,7 @@ module.exports = function (Messaging) {
},
function (mid, next) {
Messaging.getMessageFields(mid, ['fromuid', 'timestamp'], next);
- }
+ },
], function (err, fields) {
if (err) {
return next(err);
@@ -129,8 +127,7 @@ module.exports = function (Messaging) {
} else {
next(null, []);
}
- }
+ },
], callback);
};
-
};
diff --git a/src/messaging/delete.js b/src/messaging/delete.js
index e9f48232d1..6fdf5177ef 100644
--- a/src/messaging/delete.js
+++ b/src/messaging/delete.js
@@ -4,7 +4,6 @@ var async = require('async');
var db = require('../database');
module.exports = function (Messaging) {
-
Messaging.deleteMessage = function (mid, roomId, callback) {
async.waterfall([
function (next) {
@@ -21,7 +20,7 @@ module.exports = function (Messaging) {
},
function (next) {
db.delete('message:' + mid, next);
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/messaging/edit.js b/src/messaging/edit.js
index b472aea261..f9c664d67f 100644
--- a/src/messaging/edit.js
+++ b/src/messaging/edit.js
@@ -9,7 +9,6 @@ var sockets = require('../socket.io');
module.exports = function (Messaging) {
-
Messaging.editMessage = function (uid, mid, roomId, content, callback) {
var uids;
async.waterfall([
@@ -23,7 +22,7 @@ module.exports = function (Messaging) {
Messaging.setMessageFields(mid, {
content: content,
- edited: Date.now()
+ edited: Date.now(),
}, next);
},
function (next) {
@@ -36,11 +35,11 @@ module.exports = function (Messaging) {
function (messages, next) {
uids.forEach(function (uid) {
sockets.in('uid_' + uid).emit('event:chats.edit', {
- messages: messages
+ messages: messages,
});
});
next();
- }
+ },
], callback);
};
@@ -75,8 +74,7 @@ module.exports = function (Messaging) {
},
function (isAdmin, next) {
next(null, isAdmin);
- }
+ },
], callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/messaging/notifications.js b/src/messaging/notifications.js
index 2eeb562b5c..eb7a1a1a74 100644
--- a/src/messaging/notifications.js
+++ b/src/messaging/notifications.js
@@ -11,7 +11,6 @@ var meta = require('../meta');
var sockets = require('../socket.io');
module.exports = function (Messaging) {
-
Messaging.notifyQueue = {}; // Only used to notify a user of a new chat message, see Messaging.notifyUser
Messaging.notificationSendDelay = 1000 * 60;
@@ -25,11 +24,11 @@ module.exports = function (Messaging) {
var data = {
roomId: roomId,
fromUid: fromUid,
- message: messageObj
+ message: messageObj,
};
uids.forEach(function (uid) {
- data.self = parseInt(uid, 10) === parseInt(fromUid) ? 1 : 0;
+ data.self = parseInt(uid, 10) === parseInt(fromUid, 10) ? 1 : 0;
Messaging.pushUnreadCount(uid);
sockets.in('uid_' + uid).emit('event:chats.receive', data);
});
@@ -40,16 +39,17 @@ module.exports = function (Messaging) {
queueObj.message.content += '\n' + messageObj.content;
clearTimeout(queueObj.timeout);
} else {
- queueObj = Messaging.notifyQueue[fromUid + ':' + roomId] = {
- message: messageObj
+ queueObj = {
+ message: messageObj,
};
+ Messaging.notifyQueue[fromUid + ':' + roomId] = queueObj;
}
queueObj.timeout = setTimeout(function () {
sendNotifications(fromUid, uids, roomId, queueObj.message);
}, Messaging.notificationSendDelay);
next();
- }
+ },
]);
};
@@ -72,9 +72,9 @@ module.exports = function (Messaging) {
bodyLong: messageObj.content,
nid: 'chat_' + fromuid + '_' + roomId,
from: fromuid,
- path: '/chats/' + messageObj.roomId
+ path: '/chats/' + messageObj.roomId,
}, next);
- }
+ },
], function (err, notification) {
if (!err) {
delete Messaging.notifyQueue[fromuid + ':' + roomId];
@@ -99,9 +99,10 @@ module.exports = function (Messaging) {
},
userSettings: function (next) {
user.getMultipleUserSettings(uids, next);
- }
+ },
}, next);
},
+
function (results, next) {
results.userData = results.userData.filter(function (userData, index) {
return userData && results.userSettings[index] && results.userSettings[index].sendChatNotifications;
@@ -115,14 +116,14 @@ module.exports = function (Messaging) {
url: nconf.get('url'),
roomId: messageObj.roomId,
username: userData.username,
- userslug: userData.userslug
+ userslug: userData.userslug,
}, next);
}, next);
- }
+ },
], function (err) {
if (err) {
return winston.error(err);
}
});
}
-};
\ No newline at end of file
+};
diff --git a/src/messaging/rooms.js b/src/messaging/rooms.js
index bea909946a..ead62fee4d 100644
--- a/src/messaging/rooms.js
+++ b/src/messaging/rooms.js
@@ -8,7 +8,6 @@ var user = require('../user');
var plugins = require('../plugins');
module.exports = function (Messaging) {
-
Messaging.getRoomData = function (roomId, callback) {
db.getObject('chat:room:' + roomId, function (err, data) {
if (err || !data) {
@@ -55,7 +54,7 @@ module.exports = function (Messaging) {
roomId = _roomId;
var room = {
owner: uid,
- roomId: roomId
+ roomId: roomId,
};
db.setObject('chat:room:' + roomId, room, next);
},
@@ -70,7 +69,7 @@ module.exports = function (Messaging) {
},
function (next) {
next(null, roomId);
- }
+ },
], callback);
};
@@ -80,11 +79,11 @@ module.exports = function (Messaging) {
db.isSortedSetMember('chat:room:' + roomId + ':uids', uid, next);
},
function (inRoom, next) {
- plugins.fireHook('filter:messaging.isUserInRoom', {uid: uid, roomId: roomId, inRoom: inRoom}, next);
+ plugins.fireHook('filter:messaging.isUserInRoom', { uid: uid, roomId: roomId, inRoom: inRoom }, next);
},
function (data, next) {
next(null, data.inRoom);
- }
+ },
], callback);
};
@@ -124,7 +123,7 @@ module.exports = function (Messaging) {
function (next) {
async.parallel({
userCount: async.apply(db.sortedSetCard, 'chat:room:' + roomId + ':uids'),
- roomData: async.apply(db.getObject, 'chat:room:' + roomId)
+ roomData: async.apply(db.getObject, 'chat:room:' + roomId),
}, next);
},
function (results, next) {
@@ -132,7 +131,7 @@ module.exports = function (Messaging) {
return db.setObjectField('chat:room:' + roomId, 'groupChat', 1, next);
}
next();
- }
+ },
], callback);
};
@@ -141,7 +140,7 @@ module.exports = function (Messaging) {
function (next) {
async.parallel({
isOwner: async.apply(Messaging.isRoomOwner, uid, roomId),
- userCount: async.apply(Messaging.getUserCountInRoom, roomId)
+ userCount: async.apply(Messaging.getUserCountInRoom, roomId),
}, next);
},
function (results, next) {
@@ -152,7 +151,7 @@ module.exports = function (Messaging) {
return next(new Error('[[error:cant-remove-last-user]]'));
}
Messaging.leaveRoom(uids, roomId, next);
- }
+ },
], callback);
};
@@ -169,7 +168,7 @@ module.exports = function (Messaging) {
return 'uid:' + uid + ':chat:rooms:unread';
}));
db.sortedSetsRemove(keys, roomId, next);
- }
+ },
], callback);
};
@@ -184,7 +183,7 @@ module.exports = function (Messaging) {
},
function (uids, next) {
user.getUsersFields(uids, ['uid', 'username', 'picture', 'status'], next);
- }
+ },
], callback);
};
@@ -205,7 +204,7 @@ module.exports = function (Messaging) {
return next(new Error('[[error:no-privileges]]'));
}
db.setObjectField('chat:room:' + roomId, 'roomName', newName, next);
- }
+ },
], callback);
};
@@ -215,12 +214,11 @@ module.exports = function (Messaging) {
db.isSortedSetMember('chat:room:' + roomId + ':uids', uid, next);
},
function (inRoom, next) {
- plugins.fireHook('filter:messaging.canReply', {uid: uid, roomId: roomId, inRoom: inRoom, canReply: inRoom}, next);
+ plugins.fireHook('filter:messaging.canReply', { uid: uid, roomId: roomId, inRoom: inRoom, canReply: inRoom }, next);
},
function (data, next) {
next(null, data.canReply);
- }
+ },
], callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/messaging/unread.js b/src/messaging/unread.js
index 91c9a364ac..660eece5ce 100644
--- a/src/messaging/unread.js
+++ b/src/messaging/unread.js
@@ -6,7 +6,6 @@ var db = require('../database');
var sockets = require('../socket.io');
module.exports = function (Messaging) {
-
Messaging.getUnreadCount = function (uid, callback) {
if (!parseInt(uid, 10)) {
return callback(null, 0);
@@ -16,7 +15,7 @@ module.exports = function (Messaging) {
Messaging.pushUnreadCount = function (uid) {
if (!parseInt(uid, 10)) {
- return callback(null, 0);
+ return;
}
Messaging.getUnreadCount(uid, function (err, unreadCount) {
if (err) {
@@ -48,8 +47,7 @@ module.exports = function (Messaging) {
});
db.sortedSetsAdd(keys, Date.now(), roomId, next);
- }
+ },
], callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/meta.js b/src/meta.js
index 2333e54d89..6cbccd70a1 100644
--- a/src/meta.js
+++ b/src/meta.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var winston = require('winston');
@@ -32,7 +32,7 @@ var utils = require('../public/src/utils');
slug = utils.slugify(slug);
async.parallel([
async.apply(user.existsBySlug, slug),
- async.apply(groups.existsBySlug, slug)
+ async.apply(groups.existsBySlug, slug),
], function (err, results) {
callback(err, results ? results.some(function (result) { return result; }) : false);
});
@@ -47,7 +47,7 @@ var utils = require('../public/src/utils');
};
Meta.restart = function () {
- pubsub.publish('meta:restart', {hostname: os.hostname()});
+ pubsub.publish('meta:restart', { hostname: os.hostname() });
restart();
};
@@ -62,7 +62,7 @@ var utils = require('../public/src/utils');
function restart() {
if (process.send) {
process.send({
- action: 'restart'
+ action: 'restart',
});
} else {
winston.error('[meta.restart] Could not restart, are you sure NodeBB was started with `./nodebb start`?');
diff --git a/src/meta/blacklist.js b/src/meta/blacklist.js
index a078b89815..31ce06af8c 100644
--- a/src/meta/blacklist.js
+++ b/src/meta/blacklist.js
@@ -8,14 +8,14 @@ var db = require('../database');
var pubsub = require('../pubsub');
var Blacklist = {
- _rules: []
+ _rules: [],
};
Blacklist.load = function (callback) {
callback = callback || function () {};
async.waterfall([
- async.apply(Blacklist.get),
- async.apply(Blacklist.validate)
+ Blacklist.get,
+ Blacklist.validate,
], function (err, rules) {
if (err) {
return callback(err);
@@ -29,7 +29,7 @@ Blacklist.load = function (callback) {
Blacklist._rules = {
ipv4: rules.ipv4,
ipv6: rules.ipv6,
- cidr: rules.cidr
+ cidr: rules.cidr,
};
callback();
@@ -46,7 +46,7 @@ Blacklist.save = function (rules, callback) {
function (next) {
Blacklist.load(next);
pubsub.publish('blacklist:reload');
- }
+ },
], callback);
};
@@ -107,18 +107,18 @@ Blacklist.validate = function (rules, callback) {
if (ip.isV4Format(rule)) {
ipv4.push(rule);
return true;
- } else if (ip.isV6Format(rule)) {
+ }
+ if (ip.isV6Format(rule)) {
ipv6.push(rule);
return true;
- } else if (isCidrSubnet.test(rule)) {
+ }
+ if (isCidrSubnet.test(rule)) {
cidr.push(rule);
return true;
- } else {
- invalid.push(rule);
- return false;
}
- return true;
+ invalid.push(rule);
+ return false;
});
callback(null, {
@@ -127,8 +127,8 @@ Blacklist.validate = function (rules, callback) {
ipv6: ipv6,
cidr: cidr,
valid: rules,
- invalid: invalid
+ invalid: invalid,
});
};
-module.exports = Blacklist;
\ No newline at end of file
+module.exports = Blacklist;
diff --git a/src/meta/build.js b/src/meta/build.js
index 29cfbc45be..9ba5ec89bf 100644
--- a/src/meta/build.js
+++ b/src/meta/build.js
@@ -31,7 +31,7 @@ exports.build = function build(targets, callback) {
async.series([
async.apply(db.init),
async.apply(meta.themes.setupPaths),
- async.apply(plugins.prepareForBuild)
+ async.apply(plugins.prepareForBuild),
], function (err) {
if (err) {
winston.error('[build] Encountered error preparing for build: ' + err.message);
@@ -52,7 +52,7 @@ exports.buildTargets = function (targets, callback) {
var step = function (startTime, target, next, err) {
if (err) {
- winston.error('Build failed: ' + err.message);
+ winston.error('Build failed: ' + err.stack);
process.exit(1);
}
winston.info('[build] ' + target + ' => Completed in ' + ((Date.now() - startTime) / 1000) + 's');
@@ -74,7 +74,7 @@ exports.buildTargets = function (targets, callback) {
meta.js.buildModules,
meta.js.linkStatics,
async.apply(meta.js.minify, 'nodebb.min.js'),
- async.apply(meta.js.minify, 'acp.min.js')
+ async.apply(meta.js.minify, 'acp.min.js'),
], step.bind(this, startTime, 'js', next));
} else {
setImmediate(next);
@@ -83,47 +83,47 @@ exports.buildTargets = function (targets, callback) {
function (next) {
async.eachSeries(targets, function (target, next) {
var startTime;
- switch(target) {
- case 'js':
- setImmediate(next);
- break;
- case 'clientCSS':
- winston.info('[build] Building client-side CSS');
- startTime = Date.now();
- meta.css.minify('client', step.bind(this, startTime, target, next));
- break;
-
- case 'acpCSS':
- winston.info('[build] Building admin control panel CSS');
- startTime = Date.now();
- meta.css.minify('admin', step.bind(this, startTime, target, next));
- break;
-
- case 'tpl':
- winston.info('[build] Building templates');
- startTime = Date.now();
- meta.templates.compile(step.bind(this, startTime, target, next));
- break;
-
- case 'lang':
- winston.info('[build] Building language files');
- startTime = Date.now();
- meta.languages.build(step.bind(this, startTime, target, next));
- break;
-
- case 'sound':
- winston.info('[build] Linking sound files');
- startTime = Date.now();
- meta.sounds.build(step.bind(this, startTime, target, next));
- break;
-
- default:
- winston.warn('[build] Unknown build target: \'' + target + '\'');
- setImmediate(next);
- break;
+ switch (target) {
+ case 'js':
+ setImmediate(next);
+ break;
+ case 'clientCSS':
+ winston.info('[build] Building client-side CSS');
+ startTime = Date.now();
+ meta.css.minify('client', step.bind(this, startTime, target, next));
+ break;
+
+ case 'acpCSS':
+ winston.info('[build] Building admin control panel CSS');
+ startTime = Date.now();
+ meta.css.minify('admin', step.bind(this, startTime, target, next));
+ break;
+
+ case 'tpl':
+ winston.info('[build] Building templates');
+ startTime = Date.now();
+ meta.templates.compile(step.bind(this, startTime, target, next));
+ break;
+
+ case 'lang':
+ winston.info('[build] Building language files');
+ startTime = Date.now();
+ meta.languages.build(step.bind(this, startTime, target, next));
+ break;
+
+ case 'sound':
+ winston.info('[build] Linking sound files');
+ startTime = Date.now();
+ meta.sounds.build(step.bind(this, startTime, target, next));
+ break;
+
+ default:
+ winston.warn('[build] Unknown build target: \'' + target + '\'');
+ setImmediate(next);
+ break;
}
}, next);
- }
+ },
], function (err) {
if (err) {
winston.error('[build] Encountered error during build step: ' + err.message);
@@ -147,4 +147,4 @@ exports.buildTargets = function (targets, callback) {
}
});
});
-};
\ No newline at end of file
+};
diff --git a/src/meta/configs.js b/src/meta/configs.js
index 907e0ef477..82d8640e4c 100644
--- a/src/meta/configs.js
+++ b/src/meta/configs.js
@@ -9,7 +9,6 @@ var pubsub = require('../pubsub');
var cacheBuster = require('./cacheBuster');
module.exports = function (Meta) {
-
Meta.config = {};
Meta.configs = {};
@@ -25,13 +24,13 @@ module.exports = function (Meta) {
if (err) {
return next(err);
}
-
+
config['cache-buster'] = 'v=' + (buster || Date.now());
Meta.config = config;
next();
});
- }
+ },
], callback);
};
@@ -75,7 +74,7 @@ module.exports = function (Meta) {
function (next) {
updateConfig(data);
setImmediate(next);
- }
+ },
], callback);
};
@@ -91,13 +90,13 @@ module.exports = function (Meta) {
async.waterfall([
function (next) {
less.render(data.customCSS, {
- compress: true
+ compress: true,
}, next);
},
function (lessObject, next) {
data.renderedCustomCSS = lessObject.css;
setImmediate(next);
- }
+ },
], callback);
}
@@ -133,12 +132,11 @@ module.exports = function (Meta) {
} else {
setImmediate(next);
}
- }
+ },
], callback);
};
Meta.configs.remove = function (field, callback) {
db.deleteObjectField('config', field, callback);
};
-
};
diff --git a/src/meta/css.js b/src/meta/css.js
index 53388da57b..33bd0877e0 100644
--- a/src/meta/css.js
+++ b/src/meta/css.js
@@ -16,7 +16,6 @@ var file = require('../file');
var utils = require('../../public/src/utils');
module.exports = function (Meta) {
-
Meta.css = {};
var buildImports = {
@@ -32,7 +31,9 @@ module.exports = function (Meta) {
'@import "../../public/less/generics.less";',
'@import "../../public/less/mixins.less";',
'@import "../../public/less/global.less";',
- ].map(function (str) { return str.replace(/\//g, path.sep); }).join('\n');
+ ].map(function (str) {
+ return str.replace(/\//g, path.sep);
+ }).join('\n');
},
admin: function (source) {
return source + '\n' + [
@@ -42,7 +43,10 @@ module.exports = function (Meta) {
'@import (inline) "../public/vendor/colorpicker/colorpicker.css";',
'@import (inline) "../public/vendor/jquery/css/smoothness/jquery-ui.css";',
'@import (inline) "../public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.css";',
- ].map(function (str) { return str.replace(/\//g, path.sep); }).join('\n');
+ '@import (inline) "../public/vendor/mdl/material.css";',
+ ].map(function (str) {
+ return str.replace(/\//g, path.sep);
+ }).join('\n');
},
};
@@ -60,7 +64,7 @@ module.exports = function (Meta) {
var paths = [
baseThemePath,
path.join(__dirname, '../../node_modules'),
- path.join(__dirname, '../../public/vendor/fontawesome/less')
+ path.join(__dirname, '../../public/vendor/fontawesome/less'),
];
var source = '';
@@ -78,7 +82,7 @@ module.exports = function (Meta) {
function (src, next) {
source += src;
next();
- }
+ },
], function (err) {
if (err) {
return callback(err);
@@ -90,8 +94,8 @@ module.exports = function (Meta) {
};
function getStyleSource(files, prefix, extension, callback) {
- var pluginDirectories = [],
- source = '';
+ var pluginDirectories = [];
+ var source = '';
files.forEach(function (styleFile) {
if (styleFile.endsWith(extension)) {
@@ -136,17 +140,17 @@ module.exports = function (Meta) {
function minify(source, paths, target, callback) {
callback = callback || function () {};
less.render(source, {
- paths: paths
+ paths: paths,
}, function (err, lessOutput) {
if (err) {
winston.error('[meta/css] Could not minify LESS/CSS: ' + err.message);
return callback(err);
}
- postcss(global.env === 'development' ? [ autoprefixer ] : [
+ postcss(global.env === 'development' ? [autoprefixer] : [
autoprefixer,
clean({
- processImportFrom: ['local']
+ processImportFrom: ['local'],
}),
]).process(lessOutput.css).then(function (result) {
result.warnings().forEach(function (warn) {
diff --git a/src/meta/dependencies.js b/src/meta/dependencies.js
index fdfa755198..034061f636 100644
--- a/src/meta/dependencies.js
+++ b/src/meta/dependencies.js
@@ -5,7 +5,7 @@ var fs = require('fs');
var async = require('async');
var semver = require('semver');
var winston = require('winston');
-var colors = require('colors');
+require('colors');
var pkg = require('../../package.json');
@@ -21,7 +21,7 @@ module.exports = function (Meta) {
async.each(modules, function (module, next) {
fs.readFile(path.join(__dirname, '../../node_modules/', module, 'package.json'), {
- encoding: 'utf-8'
+ encoding: 'utf-8',
}, function (err, pkgData) {
if (err) {
// If a bundled plugin/theme is not present, skip the dep check (#3384)
@@ -34,7 +34,7 @@ module.exports = function (Meta) {
try {
pkgData = JSON.parse(pkgData);
- } catch(e) {
+ } catch (e) {
process.stdout.write('[' + 'missing'.red + '] ' + module.bold + ' is a required dependency but could not be found\n');
depsMissing = true;
return next();
@@ -54,7 +54,7 @@ module.exports = function (Meta) {
if (err) {
return callback(err);
}
-
+
if (depsMissing) {
callback(new Error('dependencies-missing'));
} else if (depsOutdated) {
diff --git a/src/meta/errors.js b/src/meta/errors.js
index 58e381e270..085cb84fea 100644
--- a/src/meta/errors.js
+++ b/src/meta/errors.js
@@ -6,7 +6,6 @@ var db = require('../database');
var analytics = require('../analytics');
module.exports = function (Meta) {
-
Meta.errors = {};
Meta.errors.log404 = function (route, callback) {
diff --git a/src/meta/js.js b/src/meta/js.js
index 9af088c2cd..b82aa34d25 100644
--- a/src/meta/js.js
+++ b/src/meta/js.js
@@ -16,7 +16,6 @@ var utils = require('../../public/src/utils');
var minifierPath = path.join(__dirname, 'minifier.js');
module.exports = function (Meta) {
-
Meta.js = {
target: {},
scripts: {
@@ -43,7 +42,7 @@ module.exports = function (Meta) {
'public/src/ajaxify.js',
'public/src/overrides.js',
'public/src/widgets.js',
- "./node_modules/promise-polyfill/promise.js"
+ './node_modules/promise-polyfill/promise.js',
],
// files listed below are only available client-side, or are bundled in to reduce # of network requests on cold load
@@ -79,18 +78,18 @@ module.exports = function (Meta) {
'public/src/modules/helpers.js',
'public/src/modules/sounds.js',
'public/src/modules/string.js',
- 'public/src/modules/flags.js'
+ 'public/src/modules/flags.js',
],
// modules listed below are built (/src/modules) so they can be defined anonymously
modules: {
- "Chart.js": './node_modules/chart.js/dist/Chart.min.js',
- "mousetrap.js": './node_modules/mousetrap/mousetrap.min.js',
- "jqueryui.js": 'public/vendor/jquery/js/jquery-ui.js',
- "buzz.js": 'public/vendor/buzz/buzz.js',
- "cropper.js": './node_modules/cropperjs/dist/cropper.min.js'
- }
- }
+ 'Chart.js': './node_modules/chart.js/dist/Chart.min.js',
+ 'mousetrap.js': './node_modules/mousetrap/mousetrap.min.js',
+ 'jqueryui.js': 'public/vendor/jquery/js/jquery-ui.js',
+ 'buzz.js': 'public/vendor/buzz/buzz.js',
+ 'cropper.js': './node_modules/cropperjs/dist/cropper.min.js',
+ },
+ },
};
function minifyModules(modules, callback) {
@@ -119,7 +118,7 @@ module.exports = function (Meta) {
cb();
});
- }
+ },
], function (err) {
if (err) {
return next(err);
@@ -128,7 +127,7 @@ module.exports = function (Meta) {
fs.writeFile(destPath, minified.code, next);
});
}, callback);
- };
+ }
function linkModules(callback) {
var modules = Meta.js.scripts.modules;
@@ -145,7 +144,7 @@ module.exports = function (Meta) {
file.link(filePath, destPath, next);
});
}, callback);
- };
+ }
var moduleDirs = ['modules', 'admin', 'client'];
@@ -167,12 +166,16 @@ module.exports = function (Meta) {
return next(err);
}
- modules = modules.concat(files.map(function (filePath) {
+ var mods = files.filter(function (filePath) {
+ return path.extname(filePath) === '.js';
+ }).map(function (filePath) {
return {
filePath: filePath,
destPath: path.join(__dirname, '../../build/public/src', path.relative(path.dirname(dir), filePath)),
};
- }));
+ });
+
+ modules = modules.concat(mods);
next();
});
@@ -204,7 +207,7 @@ module.exports = function (Meta) {
},
function (modules, next) {
minifyModules(modules, next);
- }
+ },
], callback);
};
@@ -232,7 +235,8 @@ module.exports = function (Meta) {
winston.verbose('[meta/js] Minifying ' + target);
var forkProcessParams = setupDebugging();
- var minifier = Meta.js.minifierProc = fork(minifierPath, [], forkProcessParams);
+ var minifier = fork(minifierPath, [], forkProcessParams);
+ Meta.js.minifierProc = minifier;
Meta.js.target[target] = {};
@@ -243,12 +247,12 @@ module.exports = function (Meta) {
minifier.send({
action: 'js',
minify: global.env !== 'development',
- scripts: Meta.js.target[target].scripts
+ scripts: Meta.js.target[target].scripts,
});
});
minifier.on('message', function (message) {
- switch(message.type) {
+ switch (message.type) {
case 'end':
Meta.js.target[target].cache = message.minified;
Meta.js.target[target].map = message.sourceMap;
@@ -324,17 +328,17 @@ module.exports = function (Meta) {
* Check if the parent process is running with the debug option --debug (or --debug-brk)
*/
var forkProcessParams = {};
- if(global.v8debug || parseInt(process.execArgv.indexOf('--debug'), 10) !== -1) {
+ if (global.v8debug || parseInt(process.execArgv.indexOf('--debug'), 10) !== -1) {
/**
* use the line below if you want to debug minifier.js script too (or even --debug-brk option, but
* you'll have to setup your debugger and connect to the forked process)
*/
- //forkProcessParams = {execArgv: ['--debug=' + (global.process.debugPort + 1), '--nolazy']};
+ // forkProcessParams = {execArgv: ['--debug=' + (global.process.debugPort + 1), '--nolazy']};
/**
* otherwise, just clean up --debug/--debug-brk options which are set up by default from the parent one
*/
- forkProcessParams = {execArgv: []};
+ forkProcessParams = { execArgv: [] };
}
return forkProcessParams;
diff --git a/src/meta/languages.js b/src/meta/languages.js
index bac7a2ba33..6fd5206381 100644
--- a/src/meta/languages.js
+++ b/src/meta/languages.js
@@ -36,12 +36,13 @@ function getTranslationTree(callback) {
// generate list of languages and namespaces
function (plugins, next) {
- var languages = [], namespaces = [];
+ var languages = [];
+ var namespaces = [];
// pull languages and namespaces from paths
function extrude(languageDir, paths) {
paths.forEach(function (p) {
- var rel = p.split(languageDir)[1].split(/[\/\\]/).slice(1);
+ var rel = p.split(languageDir)[1].split(/[/\\]/).slice(1);
var language = rel.shift().replace('_', '-').replace('@', '-x-');
var namespace = rel.join('/').replace(/\.json$/, '');
diff --git a/src/meta/logs.js b/src/meta/logs.js
index 32f6d7a141..e85c0a5e11 100644
--- a/src/meta/logs.js
+++ b/src/meta/logs.js
@@ -7,12 +7,12 @@ var winston = require('winston');
module.exports = function (Meta) {
Meta.logs = {
- path: path.join(nconf.get('base_dir'), 'logs', 'output.log')
+ path: path.join(nconf.get('base_dir'), 'logs', 'output.log'),
};
Meta.logs.get = function (callback) {
fs.readFile(Meta.logs.path, {
- encoding: 'utf-8'
+ encoding: 'utf-8',
}, function (err, logs) {
if (err) {
winston.error('[meta/logs] Could not retrieve logs: ' + err.message);
@@ -25,5 +25,4 @@ module.exports = function (Meta) {
Meta.logs.clear = function (callback) {
fs.truncate(Meta.logs.path, 0, callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/meta/minifier.js b/src/meta/minifier.js
index 42df8302c9..c3ac1899fb 100644
--- a/src/meta/minifier.js
+++ b/src/meta/minifier.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var uglifyjs = require('uglify-js');
var async = require('async');
@@ -6,12 +6,11 @@ var fs = require('fs');
var file = require('../file');
var Minifier = {
- js: {}
+ js: {},
};
/* Javascript */
Minifier.js.minify = function (scripts, minify, callback) {
-
scripts = scripts.filter(function (file) {
return file && file.endsWith('.js');
});
@@ -41,13 +40,13 @@ Minifier.js.minify = function (scripts, minify, callback) {
};
process.on('message', function (payload) {
- switch(payload.action) {
+ switch (payload.action) {
case 'js':
- Minifier.js.minify(payload.scripts, payload.minify, function (minified/*, sourceMap*/) {
+ Minifier.js.minify(payload.scripts, payload.minify, function (minified/* , sourceMap*/) {
process.send({
type: 'end',
// sourceMap: sourceMap,
- minified: minified
+ minified: minified,
});
});
break;
@@ -59,15 +58,15 @@ function minifyScripts(scripts, callback) {
// Follow along here: https://github.com/mishoo/UglifyJS2/issues/700
try {
var minified = uglifyjs.minify(scripts, {
- // outSourceMap: "nodebb.min.js.map",
- compress: false
- });
+ // outSourceMap: "nodebb.min.js.map",
+ compress: false,
+ });
- callback(minified.code/*, minified.map*/);
- } catch(err) {
+ callback(minified.code/* , minified.map*/);
+ } catch (err) {
process.send({
type: 'error',
- message: err.message
+ message: err.message,
});
}
}
@@ -77,7 +76,7 @@ function concatenateScripts(scripts, callback) {
if (err) {
process.send({
type: 'error',
- message: err.message
+ message: err.message,
});
return;
}
@@ -86,4 +85,4 @@ function concatenateScripts(scripts, callback) {
callback(scripts);
});
-}
\ No newline at end of file
+}
diff --git a/src/meta/settings.js b/src/meta/settings.js
index 785d22961f..a1d13b248d 100644
--- a/src/meta/settings.js
+++ b/src/meta/settings.js
@@ -6,7 +6,6 @@ var db = require('../database');
var plugins = require('../plugins');
module.exports = function (Meta) {
-
Meta.settings = {};
Meta.settings.get = function (hash, callback) {
@@ -27,12 +26,12 @@ module.exports = function (Meta) {
function (next) {
plugins.fireHook('action:settings.set', {
plugin: hash,
- settings: values
+ settings: values,
});
Meta.reloadRequired = true;
next();
- }
+ },
], callback);
};
@@ -59,7 +58,7 @@ module.exports = function (Meta) {
} else {
next();
}
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/meta/sounds.js b/src/meta/sounds.js
index 00bcbc2410..af6cbe3a2a 100644
--- a/src/meta/sounds.js
+++ b/src/meta/sounds.js
@@ -11,6 +11,7 @@ var plugins = require('../plugins');
var user = require('../user');
var db = require('../database');
+
var soundsPath = path.join(__dirname, '../../build/public/sounds');
var uploadsPath = path.join(__dirname, '../../public/uploads/sounds');
@@ -103,7 +104,7 @@ module.exports = function (Meta) {
},
userSettings: function (next) {
user.getSettings(uid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
diff --git a/src/meta/tags.js b/src/meta/tags.js
index 0cd680a70a..56269633ae 100644
--- a/src/meta/tags.js
+++ b/src/meta/tags.js
@@ -14,30 +14,30 @@ module.exports = function (Meta) {
tags: function (next) {
var defaultTags = [{
name: 'viewport',
- content: 'width=device-width, initial-scale=1.0'
+ content: 'width=device-width, initial-scale=1.0',
}, {
name: 'content-type',
content: 'text/html; charset=UTF-8',
- noEscape: true
+ noEscape: true,
}, {
name: 'apple-mobile-web-app-capable',
- content: 'yes'
+ content: 'yes',
}, {
name: 'mobile-web-app-capable',
- content: 'yes'
+ content: 'yes',
}, {
property: 'og:site_name',
- content: Meta.config.title || 'NodeBB'
+ content: Meta.config.title || 'NodeBB',
}, {
name: 'msapplication-badge',
content: 'frequency=30; polling-uri=' + nconf.get('url') + '/sitemap.xml',
- noEscape: true
+ noEscape: true,
}];
if (Meta.config.keywords) {
defaultTags.push({
name: 'keywords',
- content: Meta.config.keywords
+ content: Meta.config.keywords,
});
}
@@ -45,7 +45,7 @@ module.exports = function (Meta) {
defaultTags.push({
name: 'msapplication-square150x150logo',
content: Meta.config['brand:logo'],
- noEscape: true
+ noEscape: true,
});
}
@@ -53,47 +53,47 @@ module.exports = function (Meta) {
},
links: function (next) {
var defaultLinks = [{
- rel: "icon",
- type: "image/x-icon",
- href: nconf.get('relative_path') + '/favicon.ico' + (Meta.config['cache-buster'] ? '?' + Meta.config['cache-buster'] : '')
+ rel: 'icon',
+ type: 'image/x-icon',
+ href: nconf.get('relative_path') + '/favicon.ico' + (Meta.config['cache-buster'] ? '?' + Meta.config['cache-buster'] : ''),
}, {
- rel: "manifest",
- href: nconf.get('relative_path') + '/manifest.json'
+ rel: 'manifest',
+ href: nconf.get('relative_path') + '/manifest.json',
}];
// Touch icons for mobile-devices
if (Meta.config['brand:touchIcon']) {
defaultLinks.push({
rel: 'apple-touch-icon',
- href: nconf.get('relative_path') + '/apple-touch-icon'
+ href: nconf.get('relative_path') + '/apple-touch-icon',
}, {
rel: 'icon',
sizes: '36x36',
- href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-36.png'
+ href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-36.png',
}, {
rel: 'icon',
sizes: '48x48',
- href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-48.png'
+ href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-48.png',
}, {
rel: 'icon',
sizes: '72x72',
- href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-72.png'
+ href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-72.png',
}, {
rel: 'icon',
sizes: '96x96',
- href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-96.png'
+ href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-96.png',
}, {
rel: 'icon',
sizes: '144x144',
- href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-144.png'
+ href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-144.png',
}, {
rel: 'icon',
sizes: '192x192',
- href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-192.png'
+ href: nconf.get('relative_path') + '/assets/uploads/system/touchicon-192.png',
});
}
plugins.fireHook('filter:meta.getLinkTags', defaultLinks, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -118,7 +118,7 @@ module.exports = function (Meta) {
callback(null, {
meta: meta,
- link: link
+ link: link,
});
});
};
@@ -134,7 +134,7 @@ module.exports = function (Meta) {
if (!hasDescription) {
meta.push({
name: 'description',
- content: validator.escape(String(Meta.config.description || ''))
+ content: validator.escape(String(Meta.config.description || '')),
});
}
}
diff --git a/src/meta/templates.js b/src/meta/templates.js
index fd5c1f71e1..4c2a8b1fb9 100644
--- a/src/meta/templates.js
+++ b/src/meta/templates.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var mkdirp = require('mkdirp');
var rimraf = require('rimraf');
@@ -21,8 +21,9 @@ Templates.compile = function (callback) {
function getBaseTemplates(theme) {
- var baseTemplatesPaths = [],
- baseThemePath, baseThemeConfig;
+ var baseTemplatesPaths = [];
+ var baseThemePath;
+ var baseThemeConfig;
while (theme) {
baseThemePath = path.join(nconf.get('themes_path'), theme);
@@ -51,7 +52,7 @@ function preparePaths(baseTemplatesPaths, callback) {
},
function (next) {
plugins.getTemplates(next);
- }
+ },
], function (err, pluginTemplates) {
if (err) {
return callback(err);
@@ -69,18 +70,18 @@ function preparePaths(baseTemplatesPaths, callback) {
paths = paths.map(function (tpl) {
return {
base: baseTemplatePath,
- path: tpl.replace(baseTemplatePath, '')
+ path: tpl.replace(baseTemplatePath, ''),
};
});
next(err, paths);
});
}, next);
- }
+ },
}, function (err, data) {
- var baseThemes = data.baseThemes,
- coreTpls = data.coreTpls,
- paths = {};
+ var baseThemes = data.baseThemes;
+ var coreTpls = data.coreTpls;
+ var paths = {};
coreTpls.forEach(function (el, i) {
paths[coreTpls[i].replace(coreTemplatesPath, '')] = coreTpls[i];
@@ -104,9 +105,9 @@ function preparePaths(baseTemplatesPaths, callback) {
}
function compile(callback) {
- var themeConfig = require(nconf.get('theme_config')),
- baseTemplatesPaths = themeConfig.baseTheme ? getBaseTemplates(themeConfig.baseTheme) : [nconf.get('base_templates_path')],
- viewsPath = nconf.get('views_dir');
+ var themeConfig = require(nconf.get('theme_config'));
+ var baseTemplatesPaths = themeConfig.baseTheme ? getBaseTemplates(themeConfig.baseTheme) : [nconf.get('base_templates_path')];
+ var viewsPath = nconf.get('views_dir');
preparePaths(baseTemplatesPaths, function (err, paths) {
@@ -115,19 +116,20 @@ function compile(callback) {
}
async.each(Object.keys(paths), function (relativePath, next) {
- var file = fs.readFileSync(paths[relativePath]).toString(),
- matches = null,
- regex = /[ \t]*[ \t]*/;
+ var file = fs.readFileSync(paths[relativePath]).toString();
+ var regex = /[ \t]*[ \t]*/;
+ var matches = file.match(regex);
- while((matches = file.match(regex)) !== null) {
- var partial = "/" + matches[1];
+ while (matches !== null) {
+ var partial = '/' + matches[1];
if (paths[partial] && relativePath !== partial) {
file = file.replace(regex, fs.readFileSync(paths[partial]).toString());
} else {
winston.warn('[meta/templates] Partial not loaded: ' + matches[1]);
- file = file.replace(regex, "");
+ file = file.replace(regex, '');
}
+ matches = file.match(regex);
}
mkdirp.sync(path.join(viewsPath, relativePath.split('/').slice(0, -1).join('/')));
@@ -145,4 +147,4 @@ function compile(callback) {
});
}
-module.exports = Templates;
\ No newline at end of file
+module.exports = Templates;
diff --git a/src/meta/themes.js b/src/meta/themes.js
index 2ea294967b..e764010454 100644
--- a/src/meta/themes.js
+++ b/src/meta/themes.js
@@ -66,7 +66,6 @@ module.exports = function (Meta) {
next(null, null);
}
});
-
}, function (err, themes) {
if (err) {
return callback(err);
@@ -85,17 +84,17 @@ module.exports = function (Meta) {
'theme:id': data.id,
'theme:staticDir': '',
'theme:templates': '',
- 'theme:src': ''
+ 'theme:src': '',
};
- switch(data.type) {
+ switch (data.type) {
case 'local':
async.waterfall([
async.apply(Meta.configs.get, 'theme:id'),
function (current, next) {
async.series([
async.apply(db.sortedSetRemove, 'plugins:active', current),
- async.apply(db.sortedSetAdd, 'plugins:active', 0, data.id)
+ async.apply(db.sortedSetAdd, 'plugins:active', 0, data.id),
], function (err) {
next(err);
});
@@ -119,7 +118,7 @@ module.exports = function (Meta) {
// Re-set the themes path (for when NodeBB is reloaded)
Meta.themes.setPath(config);
- }
+ },
], callback);
Meta.reloadRequired = true;
@@ -136,7 +135,7 @@ module.exports = function (Meta) {
themesData: Meta.themes.get,
currentThemeId: function (next) {
db.getObjectField('config', 'theme:id', next);
- }
+ },
}, function (err, data) {
if (err) {
return callback(err);
@@ -145,8 +144,8 @@ module.exports = function (Meta) {
var themeId = data.currentThemeId || 'nodebb-theme-persona';
var themeObj = data.themesData.filter(function (themeObj) {
- return themeObj.id === themeId;
- })[0];
+ return themeObj.id === themeId;
+ })[0];
if (process.env.NODE_ENV === 'development') {
winston.info('[themes] Using theme ' + themeId);
@@ -163,8 +162,8 @@ module.exports = function (Meta) {
Meta.themes.setPath = function (themeObj) {
// Theme's templates path
- var themePath = nconf.get('base_templates_path'),
- fallback = path.join(nconf.get('themes_path'), themeObj.id, 'templates');
+ var themePath = nconf.get('base_templates_path');
+ var fallback = path.join(nconf.get('themes_path'), themeObj.id, 'templates');
if (themeObj.templates) {
themePath = path.join(nconf.get('themes_path'), themeObj.id, themeObj.templates);
@@ -175,4 +174,4 @@ module.exports = function (Meta) {
nconf.set('theme_templates_path', themePath);
nconf.set('theme_config', path.join(nconf.get('themes_path'), themeObj.id, 'theme.json'));
};
-};
\ No newline at end of file
+};
diff --git a/src/middleware/admin.js b/src/middleware/admin.js
index 9d4b43bf25..3e36b74db9 100644
--- a/src/middleware/admin.js
+++ b/src/middleware/admin.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var winston = require('winston');
@@ -8,7 +8,7 @@ var plugins = require('../plugins');
var controllers = {
api: require('../controllers/api'),
- helpers: require('../controllers/helpers')
+ helpers: require('../controllers/helpers'),
};
module.exports = function (middleware) {
@@ -44,8 +44,8 @@ module.exports = function (middleware) {
middleware.admin.renderHeader = function (req, res, data, next) {
var custom_header = {
- 'plugins': [],
- 'authentication': []
+ plugins: [],
+ authentication: [],
};
user.getUserFields(req.uid, ['username', 'userslug', 'email', 'picture', 'email:confirmed'], function (err, userData) {
@@ -64,7 +64,7 @@ module.exports = function (middleware) {
}
var arr = [];
scripts.forEach(function (script) {
- arr.push({src: script});
+ arr.push({ src: script });
});
next(null, arr);
@@ -78,7 +78,7 @@ module.exports = function (middleware) {
},
configs: function (next) {
meta.configs.list(next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -102,12 +102,12 @@ module.exports = function (middleware) {
authentication: results.custom_header.authentication,
scripts: results.scripts,
'cache-buster': meta.config['cache-buster'] || '',
- env: process.env.NODE_ENV ? true : false,
+ env: !!process.env.NODE_ENV,
title: (acpPath || 'Dashboard') + ' | NodeBB Admin Control Panel',
- bodyClass: data.bodyClass
+ bodyClass: data.bodyClass,
};
- templateValues.template = {name: res.locals.template};
+ templateValues.template = { name: res.locals.template };
templateValues.template[res.locals.template] = true;
req.app.render('admin/header', templateValues, next);
diff --git a/src/middleware/header.js b/src/middleware/header.js
index 0c33e621e5..accbbf2fe6 100644
--- a/src/middleware/header.js
+++ b/src/middleware/header.js
@@ -11,11 +11,10 @@ var navigation = require('../navigation');
var controllers = {
api: require('../controllers/api'),
- helpers: require('../controllers/helpers')
+ helpers: require('../controllers/helpers'),
};
module.exports = function (middleware) {
-
middleware.buildHeader = function (req, res, next) {
res.locals.renderHeader = true;
res.locals.isAPI = false;
@@ -29,14 +28,14 @@ module.exports = function (middleware) {
controllers.api.getConfig(req, res, next);
},
plugins: function (next) {
- plugins.fireHook('filter:middleware.buildHeader', {req: req, locals: res.locals}, next);
- }
+ plugins.fireHook('filter:middleware.buildHeader', { req: req, locals: res.locals }, next);
+ },
}, next);
},
function (results, next) {
res.locals.config = results.config;
next();
- }
+ },
], next);
};
@@ -55,10 +54,11 @@ module.exports = function (middleware) {
searchEnabled: plugins.hasListeners('filter:search.query'),
config: res.locals.config,
relative_path: nconf.get('relative_path'),
- bodyClass: data.bodyClass
+ bodyClass: data.bodyClass,
};
templateValues.configJSON = JSON.stringify(res.locals.config);
+
async.waterfall([
function (next) {
async.parallel({
@@ -83,7 +83,7 @@ module.exports = function (middleware) {
picture: meta.config.defaultAvatar,
status: 'offline',
reputation: 0,
- 'email:confirmed': false
+ 'email:confirmed': false,
};
if (req.uid) {
user.getUserFields(req.uid, Object.keys(userData), next);
@@ -100,7 +100,7 @@ module.exports = function (middleware) {
navigation: async.apply(navigation.get),
tags: async.apply(meta.tags.parse, res.locals.metaTags, res.locals.linkTags),
banned: async.apply(user.isBanned, req.uid),
- banReason: async.apply(user.getBannedReason, req.uid)
+ banReason: async.apply(user.getBannedReason, req.uid),
}, next);
},
function (results, next) {
@@ -139,11 +139,11 @@ module.exports = function (middleware) {
templateValues.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1;
templateValues.privateTagListing = parseInt(meta.config.privateTagListing, 10) === 1;
- templateValues.template = {name: res.locals.template};
+ templateValues.template = { name: res.locals.template };
templateValues.template[res.locals.template] = true;
templateValues.scripts = results.scripts.map(function (script) {
- return {src: script};
+ return { src: script };
});
if (req.route && req.route.path === '/') {
@@ -151,14 +151,14 @@ module.exports = function (middleware) {
}
plugins.fireHook('filter:middleware.renderHeader', {
- req: req,
+ req: req,
res: res,
- templateValues: templateValues
- }, next);
+ templateValues: templateValues,
+ }, next);
},
function (data, next) {
req.app.render('header', data.templateValues, next);
- }
+ },
], callback);
};
@@ -168,12 +168,12 @@ module.exports = function (middleware) {
plugins.fireHook('filter:middleware.renderFooter', {
req: req,
res: res,
- templateValues: data,
+ templateValues: data,
}, next);
},
function (data, next) {
req.app.render('footer', data.templateValues, next);
- }
+ },
], callback);
};
@@ -191,8 +191,5 @@ module.exports = function (middleware) {
return title;
}
-
};
-
-
diff --git a/src/middleware/headers.js b/src/middleware/headers.js
index 66f0603b0d..ae63b19124 100644
--- a/src/middleware/headers.js
+++ b/src/middleware/headers.js
@@ -3,14 +3,13 @@
var meta = require('../meta');
module.exports = function (middleware) {
-
middleware.addHeaders = function (req, res, next) {
var headers = {
'X-Powered-By': encodeURI(meta.config['powered-by'] || 'NodeBB'),
'X-Frame-Options': meta.config['allow-from-uri'] ? 'ALLOW-FROM ' + encodeURI(meta.config['allow-from-uri']) : 'SAMEORIGIN',
'Access-Control-Allow-Origin': encodeURI(meta.config['access-control-allow-origin'] || 'null'),
'Access-Control-Allow-Methods': encodeURI(meta.config['access-control-allow-methods'] || ''),
- 'Access-Control-Allow-Headers': encodeURI(meta.config['access-control-allow-headers'] || '')
+ 'Access-Control-Allow-Headers': encodeURI(meta.config['access-control-allow-headers'] || ''),
};
for (var key in headers) {
@@ -24,17 +23,14 @@ module.exports = function (middleware) {
middleware.addExpiresHeaders = function (req, res, next) {
if (req.app.enabled('cache')) {
- res.setHeader("Cache-Control", "public, max-age=5184000");
- res.setHeader("Expires", new Date(Date.now() + 5184000000).toUTCString());
+ res.setHeader('Cache-Control', 'public, max-age=5184000');
+ res.setHeader('Expires', new Date(Date.now() + 5184000000).toUTCString());
} else {
- res.setHeader("Cache-Control", "public, max-age=0");
- res.setHeader("Expires", new Date().toUTCString());
+ res.setHeader('Cache-Control', 'public, max-age=0');
+ res.setHeader('Expires', new Date().toUTCString());
}
next();
};
-
};
-
-
diff --git a/src/middleware/index.js b/src/middleware/index.js
index f1f25b1125..17d365aebb 100644
--- a/src/middleware/index.js
+++ b/src/middleware/index.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var fs = require('fs');
@@ -10,7 +10,6 @@ var ensureLoggedIn = require('connect-ensure-login');
var toobusy = require('toobusy-js');
var plugins = require('../plugins');
-var languages = require('../languages');
var meta = require('../meta');
var user = require('../user');
var groups = require('../groups');
@@ -19,7 +18,7 @@ var analytics = require('../analytics');
var controllers = {
api: require('./../controllers/api'),
- helpers: require('../controllers/helpers')
+ helpers: require('../controllers/helpers'),
};
var middleware = {};
@@ -42,7 +41,7 @@ middleware.authenticate = function (req, res, next) {
return plugins.fireHook('action:middleware.authenticate', {
req: req,
res: res,
- next: next
+ next: next,
});
}
@@ -64,9 +63,8 @@ middleware.ensureSelfOrGlobalPrivilege = function (req, res, next) {
return next(err);
} else if (ok) {
return next();
- } else {
- controllers.helpers.notAllowed(req, res);
}
+ controllers.helpers.notAllowed(req, res);
});
} else {
controllers.helpers.notAllowed(req, res);
@@ -101,10 +99,10 @@ middleware.pageView = function (req, res, next) {
analytics.pageView({
ip: req.ip,
path: req.path,
- uid: req.uid
+ uid: req.uid,
});
- plugins.fireHook('action:middleware.pageView', {req: req});
+ plugins.fireHook('action:middleware.pageView', { req: req });
if (req.user) {
user.updateLastOnlineTime(req.user.uid);
@@ -145,11 +143,10 @@ middleware.prepareAPI = function (req, res, next) {
middleware.routeTouchIcon = function (req, res) {
if (meta.config['brand:touchIcon'] && validator.isURL(meta.config['brand:touchIcon'])) {
return res.redirect(meta.config['brand:touchIcon']);
- } else {
- return res.sendFile(path.join(__dirname, '../../public', meta.config['brand:touchIcon'] || '/logo.png'), {
- maxAge: req.app.enabled('cache') ? 5184000000 : 0
- });
}
+ return res.sendFile(path.join(__dirname, '../../public', meta.config['brand:touchIcon'] || '/logo.png'), {
+ maxAge: req.app.enabled('cache') ? 5184000000 : 0,
+ });
};
middleware.privateTagListing = function (req, res, next) {
@@ -207,24 +204,24 @@ middleware.applyBlacklist = function (req, res, next) {
});
};
-middleware.processTimeagoLocales = function (req, res, next) {
- var fallback = req.path.indexOf('-short') === -1 ? 'jquery.timeago.en.js' : 'jquery.timeago.en-short.js',
- localPath = path.join(__dirname, '../../public/vendor/jquery/timeago/locales', req.path),
- exists;
+middleware.processTimeagoLocales = function (req, res) {
+ var fallback = req.path.indexOf('-short') === -1 ? 'jquery.timeago.en.js' : 'jquery.timeago.en-short.js';
+ var localPath = path.join(__dirname, '../../public/vendor/jquery/timeago/locales', req.path);
+ var exists;
try {
exists = fs.accessSync(localPath, fs.F_OK | fs.R_OK);
- } catch(e) {
+ } catch (e) {
exists = false;
}
if (exists) {
res.status(200).sendFile(localPath, {
- maxAge: req.app.enabled('cache') ? 5184000000 : 0
+ maxAge: req.app.enabled('cache') ? 5184000000 : 0,
});
} else {
res.status(200).sendFile(path.join(__dirname, '../../public/vendor/jquery/timeago/locales', fallback), {
- maxAge: req.app.enabled('cache') ? 5184000000 : 0
+ maxAge: req.app.enabled('cache') ? 5184000000 : 0,
});
}
};
diff --git a/src/middleware/maintenance.js b/src/middleware/maintenance.js
index 3193e820fa..4f4cb03982 100644
--- a/src/middleware/maintenance.js
+++ b/src/middleware/maintenance.js
@@ -5,7 +5,6 @@ var meta = require('../meta');
var user = require('../user');
module.exports = function (middleware) {
-
middleware.maintenanceMode = function (req, res, next) {
if (parseInt(meta.config.maintenanceMode, 10) !== 1) {
return next();
@@ -24,7 +23,7 @@ module.exports = function (middleware) {
res.status(503);
var data = {
site_title: meta.config.title || 'NodeBB',
- message: meta.config.maintenanceModeMessage
+ message: meta.config.maintenanceModeMessage,
};
if (res.locals.isAPI) {
@@ -36,5 +35,4 @@ module.exports = function (middleware) {
});
});
};
-
-};
\ No newline at end of file
+};
diff --git a/src/middleware/ratelimit.js b/src/middleware/ratelimit.js
index f02bf74c3e..504cb0acd7 100644
--- a/src/middleware/ratelimit.js
+++ b/src/middleware/ratelimit.js
@@ -1,6 +1,5 @@
-
-
'use strict';
+
var winston = require('winston');
var ratelimit = module.exports;
@@ -13,7 +12,7 @@ ratelimit.isFlooding = function (socket) {
socket.elapsedTime = socket.elapsedTime || 0;
socket.lastCallTime = socket.lastCallTime || Date.now();
- ++socket.callsPerSecond;
+ socket.callsPerSecond += 1;
var now = Date.now();
socket.elapsedTime += now - socket.lastCallTime;
diff --git a/src/middleware/render.js b/src/middleware/render.js
index ecd0ce8a5d..48d4a0b526 100644
--- a/src/middleware/render.js
+++ b/src/middleware/render.js
@@ -9,7 +9,6 @@ var plugins = require('../plugins');
var translator = require('../../public/src/modules/translator');
module.exports = function (middleware) {
-
middleware.processRender = function (req, res, next) {
// res.render post-processing, modified from here: https://gist.github.com/mrlannigan/5051687
var render = res.render;
@@ -24,11 +23,11 @@ module.exports = function (middleware) {
};
options = options || {};
- if ('function' === typeof options) {
+ if (typeof options === 'function') {
fn = options;
options = {};
}
- if ('function' !== typeof fn) {
+ if (typeof fn !== 'function') {
fn = defaultFn;
}
@@ -37,15 +36,15 @@ module.exports = function (middleware) {
function (next) {
options.loggedIn = !!req.uid;
options.relative_path = nconf.get('relative_path');
- options.template = {name: template};
+ options.template = { name: template };
options.template[template] = true;
options.url = (req.baseUrl + req.path).replace(/^\/api/, '');
options.bodyClass = buildBodyClass(req);
- plugins.fireHook('filter:' + template + '.build', {req: req, res: res, templateData: options}, next);
+ plugins.fireHook('filter:' + template + '.build', { req: req, res: res, templateData: options }, next);
},
function (data, next) {
- plugins.fireHook('filter:middleware.render', {req: res, res: res, templateData: data.templateData}, next);
+ plugins.fireHook('filter:middleware.render', { req: res, res: res, templateData: data.templateData }, next);
},
function (data, next) {
options = data.templateData;
@@ -72,7 +71,7 @@ module.exports = function (middleware) {
},
footer: function (next) {
renderHeaderFooter('renderFooter', req, res, options, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -89,7 +88,7 @@ module.exports = function (middleware) {
return '';
});
next(null, translated);
- }
+ },
], fn);
};
@@ -107,7 +106,7 @@ module.exports = function (middleware) {
}
function translate(str, req, res, next) {
- var language = res.locals.config && res.locals.config.userLang || 'en-GB';
+ var language = (res.locals.config && res.locals.config.userLang) || 'en-GB';
language = req.query.lang ? validator.escape(String(req.query.lang)) : language;
translator.translate(str, language, function (translated) {
next(null, translator.unescape(translated));
@@ -129,5 +128,4 @@ module.exports = function (middleware) {
});
return parts.join(' ');
}
-
};
diff --git a/src/middleware/user.js b/src/middleware/user.js
index c2c3bd9dd6..85b5d6e808 100644
--- a/src/middleware/user.js
+++ b/src/middleware/user.js
@@ -1,18 +1,17 @@
'use strict';
var async = require('async');
-var nconf = require('nconf');
+var nconf = require('nconf');
var meta = require('../meta');
var user = require('../user');
var privileges = require('../privileges');
var controllers = {
- helpers: require('../controllers/helpers')
+ helpers: require('../controllers/helpers'),
};
module.exports = function (middleware) {
-
middleware.checkGlobalPrivacySettings = function (req, res, next) {
if (!req.user && !!parseInt(meta.config.privateUserInfo, 10)) {
return middleware.authenticate(req, res, next);
@@ -44,7 +43,7 @@ module.exports = function (middleware) {
} else {
next(null, false);
}
- }
+ },
], function (err, allowed) {
if (err || allowed) {
return next(err);
@@ -142,20 +141,18 @@ module.exports = function (middleware) {
return next();
}
- res.status(403).render('403', {title: '[[global:403.title]]'});
+ res.status(403).render('403', { title: '[[global:403.title]]' });
};
middleware.registrationComplete = function (req, res, next) {
// If the user's session contains registration data, redirect the user to complete registration
if (!req.session.hasOwnProperty('registration')) {
return next();
+ }
+ if (!req.path.endsWith('/register/complete')) {
+ controllers.helpers.redirect(res, '/register/complete');
} else {
- if (!req.path.endsWith('/register/complete')) {
- controllers.helpers.redirect(res, '/register/complete');
- } else {
- return next();
- }
+ return next();
}
};
-
};
diff --git a/src/navigation/admin.js b/src/navigation/admin.js
index ab1c5aff42..0917e9e524 100644
--- a/src/navigation/admin.js
+++ b/src/navigation/admin.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var plugins = require('../plugins');
@@ -36,14 +36,14 @@ admin.save = function (data, callback) {
},
function (next) {
db.sortedSetAdd('navigation:enabled', order, items, next);
- }
+ },
], callback);
};
admin.getAdmin = function (callback) {
async.parallel({
enabled: admin.get,
- available: getAvailable
+ available: getAvailable,
}, callback);
};
diff --git a/src/navigation/index.js b/src/navigation/index.js
index 5563c44c4b..2cb24f3a9f 100644
--- a/src/navigation/index.js
+++ b/src/navigation/index.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var nconf = require('nconf');
var admin = require('./admin');
@@ -38,4 +38,4 @@ navigation.get = function (callback) {
};
-module.exports = navigation;
\ No newline at end of file
+module.exports = navigation;
diff --git a/src/notifications.js b/src/notifications.js
index 0fb1e1ace3..752915d636 100644
--- a/src/notifications.js
+++ b/src/notifications.js
@@ -16,7 +16,6 @@ var plugins = require('./plugins');
var utils = require('../public/src/utils');
(function (Notifications) {
-
Notifications.init = function () {
winston.verbose('[notifications.init] Registering jobs.');
new cron('*/30 * * * *', Notifications.prune, null, true);
@@ -143,7 +142,7 @@ var utils = require('../public/src/utils');
},
function (next) {
db.setObject('notifications:' + data.nid, data, next);
- }
+ },
], function (err) {
callback(err, data);
});
@@ -172,7 +171,7 @@ var utils = require('../public/src/utils');
setTimeout(function () {
batch.processArray(uids, function (uids, next) {
pushToUids(uids, notification, next);
- }, {interval: 1000}, function (err) {
+ }, { interval: 1000 }, function (err) {
if (err) {
winston.error(err.stack);
}
@@ -189,7 +188,7 @@ var utils = require('../public/src/utils');
async.waterfall([
function (next) {
- plugins.fireHook('filter:notification.push', {notification: notification, uids: uids}, next);
+ plugins.fireHook('filter:notification.push', { notification: notification, uids: uids }, next);
},
function (data, next) {
uids = data.uids;
@@ -219,9 +218,9 @@ var utils = require('../public/src/utils');
});
}
- plugins.fireHook('action:notification.pushed', {notification: notification, uids: uids});
+ plugins.fireHook('action:notification.pushed', { notification: notification, uids: uids });
next();
- }
+ },
], callback);
}
@@ -254,7 +253,7 @@ var utils = require('../public/src/utils');
async.parallel([
async.apply(db.sortedSetRemove, 'notifications', nid),
- async.apply(db.delete, 'notifications:' + nid)
+ async.apply(db.delete, 'notifications:' + nid),
], function (err) {
if (err) {
winston.error('Encountered error rescinding notification (' + nid + '): ' + err.message);
@@ -288,7 +287,7 @@ var utils = require('../public/src/utils');
async.parallel([
async.apply(db.sortedSetRemove, 'uid:' + uid + ':notifications:read', nid),
- async.apply(db.sortedSetAdd, 'uid:' + uid + ':notifications:unread', notification.datetime, nid)
+ async.apply(db.sortedSetAdd, 'uid:' + uid + ':notifications:unread', notification.datetime, nid),
], callback);
});
};
@@ -325,7 +324,7 @@ var utils = require('../public/src/utils');
});
db.getObjectsFields(notificationKeys, ['nid', 'datetime'], next);
- }
+ },
], function (err, notificationData) {
if (err) {
return callback(err);
@@ -351,7 +350,7 @@ var utils = require('../public/src/utils');
},
function (next) {
db.sortedSetAdd('uid:' + uid + ':notifications:read', datetimes, nids, next);
- }
+ },
], function (err) {
callback(err);
});
@@ -373,8 +372,7 @@ var utils = require('../public/src/utils');
};
Notifications.prune = function () {
- var week = 604800000,
- numPruned = 0;
+ var week = 604800000;
var cutoffTime = Date.now() - week;
@@ -391,15 +389,13 @@ var utils = require('../public/src/utils');
return 'notifications:' + nid;
});
- numPruned = nids.length;
-
async.parallel([
function (next) {
db.sortedSetRemove('notifications', nids, next);
},
function (next) {
db.deleteAll(keys, next);
- }
+ },
], function (err) {
if (err) {
return winston.error('Encountered error pruning notifications: ' + err.message);
@@ -411,14 +407,18 @@ var utils = require('../public/src/utils');
Notifications.merge = function (notifications, callback) {
// When passed a set of notification objects, merge any that can be merged
var mergeIds = [
- 'notifications:upvoted_your_post_in',
- 'notifications:user_started_following_you',
- 'notifications:user_posted_to',
- 'notifications:user_flagged_post_in',
- 'notifications:user_flagged_user',
- 'new_register'
- ],
- isolated, differentiators, differentiator, modifyIndex, set;
+ 'notifications:upvoted_your_post_in',
+ 'notifications:user_started_following_you',
+ 'notifications:user_posted_to',
+ 'notifications:user_flagged_post_in',
+ 'notifications:user_flagged_user',
+ 'new_register',
+ ];
+ var isolated;
+ var differentiators;
+ var differentiator;
+ var modifyIndex;
+ var set;
notifications = mergeIds.reduce(function (notifications, mergeId) {
isolated = notifications.filter(function (notifObj) {
@@ -457,36 +457,36 @@ var utils = require('../public/src/utils');
return notifications;
}
- switch(mergeId) {
- // intentional fall-through
- case 'notifications:upvoted_your_post_in':
- case 'notifications:user_started_following_you':
- case 'notifications:user_posted_to':
- case 'notifications:user_flagged_post_in':
- case 'notifications:user_flagged_user':
- var usernames = set.map(function (notifObj) {
- return notifObj && notifObj.user && notifObj.user.username;
- }).filter(function (username, idx, array) {
- return array.indexOf(username) === idx;
- });
- var numUsers = usernames.length;
-
- var title = S(notifications[modifyIndex].topicTitle || '').decodeHTMLEntities().s;
- var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
- titleEscaped = titleEscaped ? (', ' + titleEscaped) : '';
-
- if (numUsers === 2) {
- notifications[modifyIndex].bodyShort = '[[' + mergeId + '_dual, ' + usernames.join(', ') + titleEscaped + ']]';
- } else if (numUsers > 2) {
- notifications[modifyIndex].bodyShort = '[[' + mergeId + '_multiple, ' + usernames[0] + ', ' + (numUsers - 1) + titleEscaped + ']]';
- }
+ switch (mergeId) {
+ // intentional fall-through
+ case 'notifications:upvoted_your_post_in':
+ case 'notifications:user_started_following_you':
+ case 'notifications:user_posted_to':
+ case 'notifications:user_flagged_post_in':
+ case 'notifications:user_flagged_user':
+ var usernames = set.map(function (notifObj) {
+ return notifObj && notifObj.user && notifObj.user.username;
+ }).filter(function (username, idx, array) {
+ return array.indexOf(username) === idx;
+ });
+ var numUsers = usernames.length;
- notifications[modifyIndex].path = set[set.length - 1].path;
- break;
+ var title = S(notifications[modifyIndex].topicTitle || '').decodeHTMLEntities().s;
+ var titleEscaped = title.replace(/%/g, '%').replace(/,/g, ',');
+ titleEscaped = titleEscaped ? (', ' + titleEscaped) : '';
- case 'new_register':
- notifications[modifyIndex].bodyShort = '[[notifications:' + mergeId + '_multiple, ' + set.length + ']]';
- break;
+ if (numUsers === 2) {
+ notifications[modifyIndex].bodyShort = '[[' + mergeId + '_dual, ' + usernames.join(', ') + titleEscaped + ']]';
+ } else if (numUsers > 2) {
+ notifications[modifyIndex].bodyShort = '[[' + mergeId + '_multiple, ' + usernames[0] + ', ' + (numUsers - 1) + titleEscaped + ']]';
+ }
+
+ notifications[modifyIndex].path = set[set.length - 1].path;
+ break;
+
+ case 'new_register':
+ notifications[modifyIndex].bodyShort = '[[notifications:' + mergeId + '_multiple, ' + set.length + ']]';
+ break;
}
// Filter out duplicates
@@ -503,11 +503,10 @@ var utils = require('../public/src/utils');
}, notifications);
plugins.fireHook('filter:notifications.merge', {
- notifications: notifications
+ notifications: notifications,
}, function (err, data) {
callback(err, data.notifications);
});
};
-
}(exports));
diff --git a/src/pagination.js b/src/pagination.js
index ba7dbc8436..3e57c5b201 100644
--- a/src/pagination.js
+++ b/src/pagination.js
@@ -7,12 +7,12 @@ var pagination = {};
pagination.create = function (currentPage, pageCount, queryObj) {
if (pageCount <= 1) {
return {
- prev: {page: 1, active: currentPage > 1},
- next: {page: 1, active: currentPage < pageCount},
+ prev: { page: 1, active: currentPage > 1 },
+ next: { page: 1, active: currentPage < pageCount },
rel: [],
pages: [],
currentPage: 1,
- pageCount: 1
+ pageCount: 1,
};
}
pageCount = parseInt(pageCount, 10);
@@ -26,7 +26,8 @@ pagination.create = function (currentPage, pageCount, queryObj) {
if (startPage > pageCount - 5) {
startPage -= 2 - (pageCount - currentPage);
}
- for(var i = 0; i < 5; ++i) {
+ var i;
+ for (i = 0; i < 5; i += 1) {
pagesToShow.push(startPage + i);
}
@@ -42,38 +43,38 @@ pagination.create = function (currentPage, pageCount, queryObj) {
var pages = pagesToShow.map(function (page) {
queryObj.page = page;
- return {page: page, active: page === currentPage, qs: qs.stringify(queryObj)};
+ return { page: page, active: page === currentPage, qs: qs.stringify(queryObj) };
});
- for (i = pages.length - 1; i > 0; --i) {
+ for (i = pages.length - 1; i > 0; i -= 1) {
if (pages[i].page - 2 === pages[i - 1].page) {
- pages.splice(i, 0, {page: pages[i].page - 1, active: false, qs: qs.stringify(queryObj)});
+ pages.splice(i, 0, { page: pages[i].page - 1, active: false, qs: qs.stringify(queryObj) });
} else if (pages[i].page - 1 !== pages[i - 1].page) {
- pages.splice(i, 0, {separator: true});
+ pages.splice(i, 0, { separator: true });
}
}
- var data = {rel: [], pages: pages, currentPage: currentPage, pageCount: pageCount};
+ var data = { rel: [], pages: pages, currentPage: currentPage, pageCount: pageCount };
queryObj.page = previous;
- data.prev = {page: previous, active: currentPage > 1, qs: qs.stringify(queryObj)};
+ data.prev = { page: previous, active: currentPage > 1, qs: qs.stringify(queryObj) };
queryObj.page = next;
- data.next = {page: next, active: currentPage < pageCount, qs: qs.stringify(queryObj)};
+ data.next = { page: next, active: currentPage < pageCount, qs: qs.stringify(queryObj) };
if (currentPage < pageCount) {
data.rel.push({
rel: 'next',
- href: '?page=' + next
+ href: '?page=' + next,
});
}
if (currentPage > 1) {
data.rel.push({
rel: 'prev',
- href: '?page=' + previous
+ href: '?page=' + previous,
});
}
return data;
};
-module.exports = pagination;
\ No newline at end of file
+module.exports = pagination;
diff --git a/src/password.js b/src/password.js
index 2744cbefba..d4fd1b0f8d 100644
--- a/src/password.js
+++ b/src/password.js
@@ -4,17 +4,17 @@
var fork = require('child_process').fork;
module.hash = function (rounds, password, callback) {
- forkChild({type: 'hash', rounds: rounds, password: password}, callback);
+ forkChild({ type: 'hash', rounds: rounds, password: password }, callback);
};
module.compare = function (password, hash, callback) {
- forkChild({type: 'compare', password: password, hash: hash}, callback);
+ forkChild({ type: 'compare', password: password, hash: hash }, callback);
};
function forkChild(message, callback) {
var forkProcessParams = {};
- if(global.v8debug || parseInt(process.execArgv.indexOf('--debug'), 10) !== -1) {
- forkProcessParams = {execArgv: ['--debug=' + (5859), '--nolazy']};
+ if (global.v8debug || parseInt(process.execArgv.indexOf('--debug'), 10) !== -1) {
+ forkProcessParams = { execArgv: ['--debug=' + (5859), '--nolazy'] };
}
var child = fork('./bcrypt', [], forkProcessParams);
@@ -30,4 +30,4 @@
}
return module;
-}(exports));
\ No newline at end of file
+}(exports));
diff --git a/src/plugins.js b/src/plugins.js
index b2c428f2e6..7d41628d1c 100644
--- a/src/plugins.js
+++ b/src/plugins.js
@@ -108,7 +108,7 @@ var middleware;
if (Plugins.versionWarning.length && nconf.get('isPrimary') === 'true') {
process.stdout.write('\n');
winston.warn('[plugins/load] The following plugins may not be compatible with your version of NodeBB. This may cause unintended behaviour or crashing. In the event of an unresponsive NodeBB caused by this plugin, run `./nodebb reset -p PLUGINNAME` to disable it.');
- for(var x = 0,numPlugins = Plugins.versionWarning.length; x < numPlugins; x++) {
+ for (var x = 0, numPlugins = Plugins.versionWarning.length; x < numPlugins; x += 1) {
process.stdout.write(' * '.yellow + Plugins.versionWarning[x] + '\n');
}
process.stdout.write('\n');
@@ -116,13 +116,13 @@ var middleware;
Object.keys(Plugins.loadedHooks).forEach(function (hook) {
var hooks = Plugins.loadedHooks[hook];
- hooks = hooks.sort(function (a, b) {
+ hooks.sort(function (a, b) {
return a.priority - b.priority;
});
});
next();
- }
+ },
], callback);
};
@@ -136,7 +136,7 @@ var middleware;
};
var controllers = require('./controllers');
- Plugins.fireHook('static:app.load', {app: app, router: router, middleware: middleware, controllers: controllers}, function (err) {
+ Plugins.fireHook('static:app.load', { app: app, router: router, middleware: middleware, controllers: controllers }, function (err) {
if (err) {
return winston.error('[plugins] Encountered error while executing post-router plugins hooks: ' + err.message);
}
@@ -148,8 +148,8 @@ var middleware;
};
Plugins.getTemplates = function (callback) {
- var templates = {},
- tplName;
+ var templates = {};
+ var tplName;
async.waterfall([
async.apply(db.getSortedSetRange, 'plugins:active', 0, -1),
@@ -164,7 +164,7 @@ var middleware;
},
function (paths, next) {
async.map(paths, Plugins.loadPluginInfo, next);
- }
+ },
], function (err, plugins) {
if (err) {
return callback(err);
@@ -178,7 +178,7 @@ var middleware;
if (pluginTemplates) {
pluginTemplates.forEach(function (pluginTemplate) {
if (pluginTemplate.endsWith('.tpl')) {
- tplName = "/" + pluginTemplate.replace(templatesPath, '').substring(1);
+ tplName = '/' + pluginTemplate.replace(templatesPath, '').substring(1);
if (templates.hasOwnProperty(tplName)) {
winston.verbose('[plugins] ' + tplName + ' replaced by ' + plugin.id);
@@ -189,12 +189,10 @@ var middleware;
winston.warn('[plugins] Skipping ' + pluginTemplate + ' by plugin ' + plugin.id);
}
});
+ } else if (err) {
+ winston.error(err);
} else {
- if (err) {
- winston.error(err);
- } else {
- winston.warn('[plugins/' + plugin.id + '] A templates directory was defined for this plugin, but was not found.');
- }
+ winston.warn('[plugins/' + plugin.id + '] A templates directory was defined for this plugin, but was not found.');
}
next(false);
@@ -212,7 +210,7 @@ var middleware;
var url = (nconf.get('registry') || 'https://packages.nodebb.org') + '/api/v1/plugins/' + id;
require('request')(url, {
- json: true
+ json: true,
}, function (err, res, body) {
if (res.statusCode === 404 || !body.payload) {
return callback(err, {});
@@ -236,7 +234,7 @@ var middleware;
var url = (nconf.get('registry') || 'https://packages.nodebb.org') + '/api/v1/plugins' + (matching !== false ? '?version=' + version : '');
require('request')(url, {
- json: true
+ json: true,
}, function (err, res, body) {
if (err) {
winston.error('Error parsing plugins : ' + err.message);
@@ -251,11 +249,11 @@ var middleware;
var pluginMap = {};
var dependencies = require(path.join(nconf.get('base_dir'), 'package.json')).dependencies;
apiReturn = apiReturn || [];
- for(var i = 0; i < apiReturn.length; ++i) {
+ for (var i = 0; i < apiReturn.length; i += 1) {
apiReturn[i].id = apiReturn[i].name;
apiReturn[i].installed = false;
apiReturn[i].active = false;
- apiReturn[i].url = apiReturn[i].url ? apiReturn[i].url : apiReturn[i].repository ? apiReturn[i].repository.url : '';
+ apiReturn[i].url = apiReturn[i].url || (apiReturn[i].repository ? apiReturn[i].repository.url : '');
pluginMap[apiReturn[i].name] = apiReturn[i];
}
@@ -311,13 +309,12 @@ var middleware;
}
pluginArray.sort(function (a, b) {
- if (a.name > b.name ) {
+ if (a.name > b.name) {
return 1;
- } else if (a.name < b.name ) {
+ } else if (a.name < b.name) {
return -1;
- } else {
- return 0;
}
+ return 0;
});
callback(null, pluginArray);
@@ -375,7 +372,7 @@ var middleware;
pluginData.error = false;
next(null, pluginData);
});
- }
+ },
], function (err, pluginData) {
if (err) {
return next(); // Silently fail
@@ -387,8 +384,7 @@ var middleware;
}, function (err) {
next(err, plugins);
});
- }
+ },
], callback);
};
-
}(exports));
diff --git a/src/plugins/hooks.js b/src/plugins/hooks.js
index a6a014e776..f8f5f6bc44 100644
--- a/src/plugins/hooks.js
+++ b/src/plugins/hooks.js
@@ -1,7 +1,7 @@
'use strict';
-var winston = require('winston'),
- async = require('async');
+var winston = require('winston');
+var async = require('async');
module.exports = function (Plugins) {
Plugins.deprecatedHooks = {
@@ -10,7 +10,7 @@ module.exports = function (Plugins) {
'filter:user.profileLinks': 'filter:user.profileMenu',
'action:post.flag': 'action:flag.create',
'action:plugin.activate': null,
- 'action:plugin.install': null
+ 'action:plugin.install': null,
};
/*
`data` is an object consisting of (* is required):
@@ -47,7 +47,7 @@ module.exports = function (Plugins) {
if (parts.length > 2) {
parts.pop();
}
- var hook = parts.join(':');
+ parts.join(':');
}
if (data.hook && data.method) {
@@ -60,10 +60,9 @@ module.exports = function (Plugins) {
method = data.method.split('.').reduce(function (memo, prop) {
if (memo && memo[prop]) {
return memo[prop];
- } else {
- // Couldn't find method by path, aborting
- return null;
}
+ // Couldn't find method by path, aborting
+ return null;
}, Plugins.libraries[data.id]);
// Write the actual method reference to the hookObj
@@ -86,18 +85,18 @@ module.exports = function (Plugins) {
var hookType = hook.split(':')[0];
switch (hookType) {
- case 'filter':
- fireFilterHook(hook, hookList, params, callback);
- break;
- case 'action':
- fireActionHook(hook, hookList, params, callback);
- break;
- case 'static':
- fireStaticHook(hook, hookList, params, callback);
- break;
- default:
- winston.warn('[plugins] Unknown hookType: ' + hookType + ', hook : ' + hook);
- break;
+ case 'filter':
+ fireFilterHook(hook, hookList, params, callback);
+ break;
+ case 'action':
+ fireActionHook(hook, hookList, params, callback);
+ break;
+ case 'static':
+ fireStaticHook(hook, hookList, params, callback);
+ break;
+ default:
+ winston.warn('[plugins] Unknown hookType: ' + hookType + ', hook : ' + hook);
+ break;
}
};
@@ -129,7 +128,6 @@ module.exports = function (Plugins) {
return callback();
}
async.each(hookList, function (hookObj, next) {
-
if (typeof hookObj.method !== 'function') {
if (global.env === 'development') {
winston.warn('[plugins] Expected method for hook \'' + hook + '\' in plugin \'' + hookObj.id + '\' not found, skipping.');
@@ -163,7 +161,7 @@ module.exports = function (Plugins) {
next.apply(null, arguments);
}
});
- } catch(err) {
+ } catch (err) {
winston.error('[plugins] Error executing \'' + hook + '\' in plugin \'' + hookObj.id + '\'');
winston.error(err);
clearTimeout(timeoutId);
diff --git a/src/plugins/install.js b/src/plugins/install.js
index bc93a2eb6c..beb38bf3d9 100644
--- a/src/plugins/install.js
+++ b/src/plugins/install.js
@@ -13,7 +13,6 @@ var pubsub = require('../pubsub');
module.exports = function (Plugins) {
-
if (nconf.get('isPrimary') === 'true') {
pubsub.on('plugins:toggleInstall', function (data) {
if (data.hostname !== os.hostname()) {
@@ -51,22 +50,22 @@ module.exports = function (Plugins) {
function (next) {
meta.reloadRequired = true;
if (isActive) {
- Plugins.fireHook('action:plugin.deactivate', {id: id});
+ Plugins.fireHook('action:plugin.deactivate', { id: id });
}
setImmediate(next);
- }
+ },
], function (err) {
if (err) {
winston.warn('[plugins] Could not toggle active state on plugin \'' + id + '\'');
return callback(err);
}
- callback(null, {id: id, active: !isActive});
+ callback(null, { id: id, active: !isActive });
});
};
Plugins.toggleInstall = function (id, version, callback) {
- pubsub.publish('plugins:toggleInstall', {hostname: os.hostname(), id: id, version: version});
+ pubsub.publish('plugins:toggleInstall', { hostname: os.hostname(), id: id, version: version });
toggleInstall(id, version, callback);
};
@@ -82,7 +81,7 @@ module.exports = function (Plugins) {
},
function (active, next) {
if (active) {
- Plugins.toggleActive(id, function (err, status) {
+ Plugins.toggleActive(id, function (err) {
next(err);
});
return;
@@ -97,11 +96,11 @@ module.exports = function (Plugins) {
},
function (pluginData, next) {
if (installed) {
- Plugins.fireHook('action:plugin.uninstall', {id: id, version: version});
+ Plugins.fireHook('action:plugin.uninstall', { id: id, version: version });
}
setImmediate(next, null, pluginData);
- }
+ },
], callback);
}
@@ -117,7 +116,7 @@ module.exports = function (Plugins) {
}
Plugins.upgrade = function (id, version, callback) {
- pubsub.publish('plugins:upgrade', {hostname: os.hostname(), id: id, version: version});
+ pubsub.publish('plugins:upgrade', { hostname: os.hostname(), id: id, version: version });
upgrade(id, version, callback);
};
@@ -130,7 +129,7 @@ module.exports = function (Plugins) {
function (isActive, next) {
meta.reloadRequired = isActive;
next(null, isActive);
- }
+ },
], callback);
}
@@ -149,4 +148,4 @@ module.exports = function (Plugins) {
Plugins.getActive = function (callback) {
db.getSortedSetRange('plugins:active', 0, -1, callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/plugins/load.js b/src/plugins/load.js
index 4297b6e13c..f4ba868eea 100644
--- a/src/plugins/load.js
+++ b/src/plugins/load.js
@@ -59,7 +59,7 @@ module.exports = function (Plugins) {
async.apply(mapSoundpack, pluginData),
], next);
}, next);
- }
+ },
], callback);
};
@@ -143,7 +143,7 @@ module.exports = function (Plugins) {
} else {
callback();
}
- } catch(err) {
+ } catch (err) {
winston.error(err.stack);
winston.warn('[plugins] Unable to parse library for: ' + pluginData.id);
callback();
@@ -151,6 +151,8 @@ module.exports = function (Plugins) {
}
function mapStaticDirectories(pluginData, pluginPath, callback) {
+ var validMappedPath = /^[\w\-_]+$/;
+
function mapStaticDirs(mappedPath, callback) {
if (Plugins.staticDirs[mappedPath]) {
winston.warn('[plugins/' + pluginData.id + '] Mapped path (' + mappedPath + ') already specified!');
@@ -173,8 +175,6 @@ module.exports = function (Plugins) {
}
}
- var validMappedPath = /^[\w\-_]+$/;
-
pluginData.staticDirs = pluginData.staticDirs || {};
var dirs = Object.keys(pluginData.staticDirs);
@@ -228,7 +228,7 @@ module.exports = function (Plugins) {
pluginData.modules.forEach(function (file) {
if (strip) {
- modules[file.replace(new RegExp('\.?(\/[^\/]+){' + strip + '}\/'), '')] = path.join('./node_modules/', pluginData.id, file);
+ modules[file.replace(new RegExp('.?(/[^/]+){' + strip + '}/'), '')] = path.join('./node_modules/', pluginData.id, file);
} else {
modules[path.basename(file)] = path.join('./node_modules/', pluginData.id, file);
}
@@ -300,11 +300,10 @@ module.exports = function (Plugins) {
if (!atRootLevel && relPath) {
winston.verbose('[plugins/load] File not found: ' + fullPath + ' (Ascending)');
return resolveModulePath(path.join(__dirname, '../..', relPath));
- } else {
- // Already at root level, file was simply not found
- winston.warn('[plugins/load] File not found: ' + fullPath + ' (Ignoring)');
- return null;
}
+ // Already at root level, file was simply not found
+ winston.warn('[plugins/load] File not found: ' + fullPath + ' (Ignoring)');
+ return null;
}
}
@@ -315,7 +314,7 @@ module.exports = function (Plugins) {
},
plugin: function (next) {
fs.readFile(path.join(pluginPath, 'plugin.json'), next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -333,7 +332,7 @@ module.exports = function (Plugins) {
pluginData.repository = packageData.repository;
pluginData.nbbpm = packageData.nbbpm;
pluginData.path = pluginPath;
- } catch(err) {
+ } catch (err) {
var pluginDir = pluginPath.split(path.sep);
pluginDir = pluginDir[pluginDir.length - 1];
diff --git a/src/posts.js b/src/posts.js
index b8eb93fa1a..10f65a5e29 100644
--- a/src/posts.js
+++ b/src/posts.js
@@ -11,7 +11,6 @@ var privileges = require('./privileges');
var plugins = require('./plugins');
(function (Posts) {
-
require('./posts/create')(Posts);
require('./posts/delete')(Posts);
require('./posts/edit')(Posts);
@@ -43,7 +42,7 @@ var plugins = require('./plugins');
var keys = [];
- for (var x = 0, numPids = pids.length; x < numPids; ++x) {
+ for (var x = 0, numPids = pids.length; x < numPids; x += 1) {
keys.push('post:' + pids[x]);
}
@@ -65,7 +64,7 @@ var plugins = require('./plugins');
}, next);
},
function (posts, next) {
- plugins.fireHook('filter:post.getPosts', {posts: posts, uid: uid}, next);
+ plugins.fireHook('filter:post.getPosts', { posts: posts, uid: uid }, next);
},
function (data, next) {
if (!data || !Array.isArray(data.posts)) {
@@ -73,7 +72,7 @@ var plugins = require('./plugins');
}
data.posts = data.posts.filter(Boolean);
next(null, data.posts);
- }
+ },
], callback);
};
@@ -86,11 +85,11 @@ var plugins = require('./plugins');
privileges.posts.filter('read', pids, uid, next);
},
function (pids, next) {
- Posts.getPostSummaryByPids(pids, uid, {stripTags: false}, next);
+ Posts.getPostSummaryByPids(pids, uid, { stripTags: false }, next);
},
function (posts, next) {
- next(null, {posts: posts, nextStart: stop + 1});
- }
+ next(null, { posts: posts, nextStart: stop + 1 });
+ },
], callback);
};
@@ -122,7 +121,7 @@ var plugins = require('./plugins');
data.pid = pid;
- plugins.fireHook('filter:post.getFields', {posts: [data], fields: fields}, function (err, data) {
+ plugins.fireHook('filter:post.getFields', { posts: [data], fields: fields }, function (err, data) {
callback(err, (data && Array.isArray(data.posts) && data.posts.length) ? data.posts[0] : null);
});
});
@@ -141,7 +140,7 @@ var plugins = require('./plugins');
if (err) {
return callback(err);
}
- plugins.fireHook('filter:post.getFields', {posts: posts, fields: fields}, function (err, data) {
+ plugins.fireHook('filter:post.getFields', { posts: posts, fields: fields }, function (err, data) {
callback(err, (data && Array.isArray(data.posts)) ? data.posts : null);
});
});
@@ -153,7 +152,7 @@ var plugins = require('./plugins');
return callback(err);
}
var data = {
- pid: pid
+ pid: pid,
};
data[field] = value;
plugins.fireHook('action:post.setFields', {data: data});
@@ -211,12 +210,12 @@ var plugins = require('./plugins');
db[method](sets, pids, next);
},
function (indices, next) {
- for (var i = 0; i < indices.length; ++i) {
+ for (var i = 0; i < indices.length; i += 1) {
indices[i] = utils.isNumber(indices[i]) ? parseInt(indices[i], 10) + 1 : 0;
}
next(null, indices);
- }
+ },
], callback);
};
@@ -246,12 +245,12 @@ var plugins = require('./plugins');
return next();
}
db.sortedSetAdd('tid:' + postData.tid + ':posts:votes', postData.votes, postData.pid, next);
- }
+ },
], next);
},
function (next) {
- Posts.setPostFields(postData.pid, {upvotes: postData.upvotes, downvotes: postData.downvotes}, next);
- }
+ Posts.setPostFields(postData.pid, { upvotes: postData.upvotes, downvotes: postData.downvotes }, next);
+ },
], function (err) {
callback(err);
});
@@ -265,6 +264,4 @@ var plugins = require('./plugins');
}
}
};
-
-
}(exports));
diff --git a/src/posts/bookmarks.js b/src/posts/bookmarks.js
index b60da91c77..6038a50b54 100644
--- a/src/posts/bookmarks.js
+++ b/src/posts/bookmarks.js
@@ -6,7 +6,6 @@ var db = require('../database');
var plugins = require('../plugins');
module.exports = function (Posts) {
-
Posts.bookmark = function (pid, uid, callback) {
toggleBookmark('bookmark', pid, uid, callback);
};
@@ -30,7 +29,7 @@ module.exports = function (Posts) {
},
hasBookmarked: function (next) {
Posts.hasBookmarked(pid, uid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -61,7 +60,7 @@ module.exports = function (Posts) {
function (count, next) {
results.postData.bookmarks = count;
Posts.setPostField(pid, 'bookmarks', count, next);
- }
+ },
], function (err) {
if (err) {
return callback(err);
@@ -73,12 +72,12 @@ module.exports = function (Posts) {
pid: pid,
uid: uid,
owner: results.owner,
- current: current
+ current: current,
});
callback(null, {
post: results.postData,
- isBookmarked: isBookmarking
+ isBookmarked: isBookmarking,
});
});
});
diff --git a/src/posts/cache.js b/src/posts/cache.js
index 62277c46e3..c73e1c8d92 100644
--- a/src/posts/cache.js
+++ b/src/posts/cache.js
@@ -1,10 +1,12 @@
+'use strict';
+
var LRU = require('lru-cache');
var meta = require('../meta');
var cache = LRU({
max: parseInt(meta.config.postCacheSize, 10) || 1048576,
length: function (n) { return n.length; },
- maxAge: 1000 * 60 * 60
+ maxAge: 1000 * 60 * 60,
});
-module.exports = cache;
\ No newline at end of file
+module.exports = cache;
diff --git a/src/posts/category.js b/src/posts/category.js
index 9c877d91dd..cb9a2566c4 100644
--- a/src/posts/category.js
+++ b/src/posts/category.js
@@ -8,7 +8,6 @@ var db = require('../database');
var topics = require('../topics');
module.exports = function (Posts) {
-
Posts.getCidByPid = function (pid, callback) {
async.waterfall([
function (next) {
@@ -16,7 +15,7 @@ module.exports = function (Posts) {
},
function (tid, next) {
topics.getTopicField(tid, 'cid', next);
- }
+ },
], callback);
};
@@ -49,7 +48,7 @@ module.exports = function (Posts) {
return map[post.tid];
});
next(null, cids);
- }
+ },
], callback);
};
@@ -82,4 +81,4 @@ module.exports = function (Posts) {
});
}
};
-};
\ No newline at end of file
+};
diff --git a/src/posts/create.js b/src/posts/create.js
index 6cb925dc4c..7ea3ef0dbb 100644
--- a/src/posts/create.js
+++ b/src/posts/create.js
@@ -12,7 +12,6 @@ var categories = require('../categories');
var utils = require('../../public/src/utils');
module.exports = function (Posts) {
-
Posts.create = function (data, callback) {
// This is an internal method, consider using Topics.reply instead
var uid = data.uid;
@@ -36,14 +35,13 @@ module.exports = function (Posts) {
db.incrObjectField('global', 'nextPid', next);
},
function (pid, next) {
-
postData = {
- 'pid': pid,
- 'uid': uid,
- 'tid': tid,
- 'content': content,
- 'timestamp': timestamp,
- 'deleted': 0
+ pid: pid,
+ uid: uid,
+ tid: tid,
+ content: content,
+ timestamp: timestamp,
+ deleted: 0,
};
if (data.toPid) {
@@ -61,7 +59,7 @@ module.exports = function (Posts) {
plugins.fireHook('filter:post.save', postData, next);
},
function (postData, next) {
- plugins.fireHook('filter:post.create', {post: postData, data: data}, next);
+ plugins.fireHook('filter:post.create', { post: postData, data: data }, next);
},
function (data, next) {
postData = data.post;
@@ -93,12 +91,12 @@ module.exports = function (Posts) {
}
async.parallel([
async.apply(db.sortedSetAdd, 'pid:' + postData.toPid + ':replies', timestamp, postData.pid),
- async.apply(db.incrObjectField, 'post:' + postData.toPid, 'replies')
+ async.apply(db.incrObjectField, 'post:' + postData.toPid, 'replies'),
], next);
},
function (next) {
db.incrObjectField('global', 'postCount', next);
- }
+ },
], function (err) {
if (err) {
return next(err);
@@ -110,9 +108,8 @@ module.exports = function (Posts) {
postData.isMain = isMain;
plugins.fireHook('action:post.save', {post: _.clone(postData)});
next(null, postData);
- }
+ },
], callback);
};
};
-
diff --git a/src/posts/delete.js b/src/posts/delete.js
index d54846c2fd..af281be698 100644
--- a/src/posts/delete.js
+++ b/src/posts/delete.js
@@ -11,15 +11,14 @@ var plugins = require('../plugins');
var flags = require('../flags');
module.exports = function (Posts) {
-
Posts.delete = function (pid, uid, callback) {
var postData;
async.waterfall([
function (next) {
- plugins.fireHook('filter:post.delete', {pid: pid, uid: uid}, next);
+ plugins.fireHook('filter:post.delete', { pid: pid, uid: uid }, next);
},
function (data, next) {
- Posts.setPostFields(pid, {deleted: 1, deleterUid: uid}, next);
+ Posts.setPostFields(pid, { deleted: 1, deleterUid: uid }, next);
},
function (next) {
Posts.getPostFields(pid, ['pid', 'tid', 'uid', 'timestamp'], next);
@@ -39,13 +38,13 @@ module.exports = function (Posts) {
},
function (next) {
topics.updateTeaser(postData.tid, next);
- }
+ },
], next);
},
function (results, next) {
- plugins.fireHook('action:post.delete', {post: _.clone(postData), uid: uid});
+ plugins.fireHook('action:post.delete', { post: _.clone(postData), uid: uid });
next(null, postData);
- }
+ },
], callback);
};
@@ -53,10 +52,10 @@ module.exports = function (Posts) {
var postData;
async.waterfall([
function (next) {
- plugins.fireHook('filter:post.restore', {pid: pid, uid: uid}, next);
+ plugins.fireHook('filter:post.restore', { pid: pid, uid: uid }, next);
},
function (data, next) {
- Posts.setPostFields(pid, {deleted: 0, deleterUid: 0}, next);
+ Posts.setPostFields(pid, { deleted: 0, deleterUid: 0 }, next);
},
function (next) {
Posts.getPostFields(pid, ['pid', 'tid', 'uid', 'content', 'timestamp'], next);
@@ -76,13 +75,13 @@ module.exports = function (Posts) {
},
function (next) {
topics.updateTeaser(postData.tid, next);
- }
+ },
], next);
},
function (results, next) {
- plugins.fireHook('action:post.restore', {post: _.clone(postData), uid: uid});
+ plugins.fireHook('action:post.restore', { post: _.clone(postData), uid: uid });
next(null, postData);
- }
+ },
], callback);
};
@@ -111,7 +110,7 @@ module.exports = function (Posts) {
} else {
next();
}
- }
+ },
], callback);
}
@@ -124,7 +123,7 @@ module.exports = function (Posts) {
if (!exists) {
return callback();
}
- plugins.fireHook('filter:post.purge', {pid: pid, uid: uid}, next);
+ plugins.fireHook('filter:post.purge', { pid: pid, uid: uid }, next);
},
function (data, next) {
async.parallel([
@@ -145,7 +144,7 @@ module.exports = function (Posts) {
},
function (next) {
db.sortedSetsRemove(['posts:pid', 'posts:flagged'], pid, next);
- }
+ },
], function (err) {
next(err);
});
@@ -154,9 +153,9 @@ module.exports = function (Posts) {
Posts.getPostData(pid, next);
},
function (postData, next) {
- plugins.fireHook('action:post.purge', {post: postData, uid: uid});
+ plugins.fireHook('action:post.purge', { post: postData, uid: uid });
db.delete('post:' + pid, next);
- }
+ },
], callback);
};
@@ -171,7 +170,7 @@ module.exports = function (Posts) {
db.sortedSetsRemove([
'tid:' + postData.tid + ':posts',
'tid:' + postData.tid + ':posts:votes',
- 'uid:' + postData.uid + ':posts'
+ 'uid:' + postData.uid + ':posts',
], pid, next);
},
function (next) {
@@ -205,9 +204,9 @@ module.exports = function (Posts) {
},
function (next) {
notifications.rescind('new_post:tid:' + postData.tid + ':pid:' + pid + ':uid:' + postData.uid, next);
- }
+ },
], next);
- }
+ },
], function (err) {
callback(err);
});
@@ -254,7 +253,7 @@ module.exports = function (Posts) {
},
downvoters: function (next) {
db.getSetMembers('pid:' + pid + ':downvote', next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -277,7 +276,7 @@ module.exports = function (Posts) {
},
function (next) {
db.deleteAll(['pid:' + pid + ':upvote', 'pid:' + pid + ':downvote'], next);
- }
+ },
], callback);
});
}
@@ -292,10 +291,8 @@ module.exports = function (Posts) {
}
async.parallel([
async.apply(db.sortedSetRemove, 'pid:' + toPid + ':replies', pid),
- async.apply(db.decrObjectField, 'post:' + toPid, 'replies')
+ async.apply(db.decrObjectField, 'post:' + toPid, 'replies'),
], callback);
});
}
-
-
};
diff --git a/src/posts/edit.js b/src/posts/edit.js
index a538d3c695..a92d865509 100644
--- a/src/posts/edit.js
+++ b/src/posts/edit.js
@@ -14,7 +14,6 @@ var pubsub = require('../pubsub');
var utils = require('../../public/src/utils');
module.exports = function (Posts) {
-
pubsub.on('post:edit', function (pid) {
cache.del(pid);
});
@@ -45,7 +44,7 @@ module.exports = function (Posts) {
if (data.handle) {
postData.handle = data.handle;
}
- plugins.fireHook('filter:post.edit', {req: data.req, post: postData, data: data, uid: data.uid}, next);
+ plugins.fireHook('filter:post.edit', { req: data.req, post: postData, data: data, uid: data.uid }, next);
},
function (result, next) {
postData = result.post;
@@ -58,7 +57,7 @@ module.exports = function (Posts) {
},
topic: function (next) {
editMainPost(data, postData, next);
- }
+ },
}, next);
},
function (_results, next) {
@@ -76,7 +75,7 @@ module.exports = function (Posts) {
function (postData, next) {
results.post = postData;
next(null, results);
- }
+ },
], callback);
};
@@ -90,7 +89,7 @@ module.exports = function (Posts) {
},
isMain: function (next) {
Posts.isMain(data.pid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -101,7 +100,7 @@ module.exports = function (Posts) {
tid: tid,
cid: results.topic.cid,
isMainPost: false,
- renamed: false
+ renamed: false,
});
}
@@ -109,7 +108,7 @@ module.exports = function (Posts) {
tid: tid,
cid: results.topic.cid,
uid: postData.uid,
- mainPid: data.pid
+ mainPid: data.pid,
};
if (title) {
@@ -123,7 +122,7 @@ module.exports = function (Posts) {
async.waterfall([
function (next) {
- plugins.fireHook('filter:topic.edit', {req: data.req, topic: topicData, data: data}, next);
+ plugins.fireHook('filter:topic.edit', { req: data.req, topic: topicData, data: data }, next);
},
function (results, next) {
db.setObject('topic:' + tid, results.topic, next);
@@ -147,12 +146,10 @@ module.exports = function (Posts) {
slug: topicData.slug,
isMainPost: true,
renamed: title !== results.topic.title,
- tags: tags
+ tags: tags,
});
- }
+ },
], callback);
});
}
-
-
};
diff --git a/src/posts/parse.js b/src/posts/parse.js
index e4b4cc7d3c..946c589056 100644
--- a/src/posts/parse.js
+++ b/src/posts/parse.js
@@ -13,7 +13,6 @@ var translator = require('../../public/src/modules/translator');
var urlRegex = /href="([^"]+)"/g;
module.exports = function (Posts) {
-
Posts.parsePost = function (postData, callback) {
postData.content = postData.content || '';
@@ -27,7 +26,7 @@ module.exports = function (Posts) {
postData.content = postData.content.toString();
}
- plugins.fireHook('filter:parse.post', {postData: postData}, function (err, data) {
+ plugins.fireHook('filter:parse.post', { postData: postData }, function (err, data) {
if (err) {
return callback(err);
}
@@ -44,14 +43,16 @@ module.exports = function (Posts) {
Posts.parseSignature = function (userData, uid, callback) {
userData.signature = sanitizeSignature(userData.signature || '');
- plugins.fireHook('filter:parse.signature', {userData: userData, uid: uid}, callback);
+ plugins.fireHook('filter:parse.signature', { userData: userData, uid: uid }, callback);
};
Posts.relativeToAbsolute = function (content) {
// Turns relative links in post body to absolute urls
- var parsed, current, absolute;
+ var parsed;
+ var current = urlRegex.exec(content);
+ var absolute;
- while ((current = urlRegex.exec(content)) !== null) {
+ while (current !== null) {
if (current[1]) {
try {
parsed = url.parse(current[1]);
@@ -66,18 +67,19 @@ module.exports = function (Posts) {
content = content.slice(0, current.index + 6) + absolute + content.slice(current.index + 6 + current[1].length);
}
- } catch(err) {
+ } catch (err) {
winston.verbose(err.messsage);
}
}
+ current = urlRegex.exec(content);
}
return content;
};
function sanitizeSignature(signature) {
- var string = S(signature),
- tagsToStrip = [];
+ var string = S(signature);
+ var tagsToStrip = [];
if (parseInt(meta.config['signatures:disableLinks'], 10) === 1) {
tagsToStrip.push('a');
diff --git a/src/posts/recent.js b/src/posts/recent.js
index 5cc5cd1fae..320febff19 100644
--- a/src/posts/recent.js
+++ b/src/posts/recent.js
@@ -9,7 +9,7 @@ module.exports = function (Posts) {
var terms = {
day: 86400000,
week: 604800000,
- month: 2592000000
+ month: 2592000000,
};
Posts.getRecentPosts = function (uid, start, stop, term, callback) {
@@ -28,8 +28,8 @@ module.exports = function (Posts) {
privileges.posts.filter('read', pids, uid, next);
},
function (pids, next) {
- Posts.getPostSummaryByPids(pids, uid, {stripTags: true}, next);
- }
+ Posts.getPostSummaryByPids(pids, uid, { stripTags: true }, next);
+ },
], callback);
};
@@ -48,7 +48,7 @@ module.exports = function (Posts) {
return uid && array.indexOf(uid) === index;
});
next(null, uids);
- }
+ },
], callback);
- };
+ };
};
diff --git a/src/posts/summary.js b/src/posts/summary.js
index 2173057e3a..93e322229d 100644
--- a/src/posts/summary.js
+++ b/src/posts/summary.js
@@ -13,7 +13,6 @@ var utils = require('../../public/src/utils');
module.exports = function (Posts) {
-
Posts.getPostSummaryByPids = function (pids, uid, options, callback) {
if (!Array.isArray(pids) || !pids.length) {
return callback(null, []);
@@ -50,7 +49,7 @@ module.exports = function (Posts) {
},
topicsAndCategories: function (next) {
getTopicAndCategories(topicKeys, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -81,11 +80,11 @@ module.exports = function (Posts) {
parsePosts(posts, options, next);
},
function (posts, next) {
- plugins.fireHook('filter:post.getPostSummaryByPids', {posts: posts, uid: uid}, next);
+ plugins.fireHook('filter:post.getPostSummaryByPids', { posts: posts, uid: uid }, next);
},
function (data, next) {
next(null, data.posts);
- }
+ },
], callback);
};
@@ -129,14 +128,14 @@ module.exports = function (Posts) {
});
categories.getCategoriesFields(cids, ['cid', 'name', 'icon', 'slug', 'parentCid', 'bgColor', 'color'], function (err, categories) {
- callback(err, {topics: topics, categories: categories});
+ callback(err, { topics: topics, categories: categories });
});
});
}
function toObject(key, data) {
var obj = {};
- for(var i = 0; i < data.length; ++i) {
+ for (var i = 0; i < data.length; i += 1) {
obj[data[i][key]] = data[i];
}
return obj;
diff --git a/src/posts/tools.js b/src/posts/tools.js
index 82d55b1192..c395eae457 100644
--- a/src/posts/tools.js
+++ b/src/posts/tools.js
@@ -30,7 +30,7 @@ module.exports = function (Posts) {
function (deleted, next) {
if (parseInt(deleted, 10) === 1 && isDelete) {
return next(new Error('[[error:post-already-deleted]]'));
- } else if(parseInt(deleted, 10) !== 1 && !isDelete) {
+ } else if (parseInt(deleted, 10) !== 1 && !isDelete) {
return next(new Error('[[error:post-already-restored]]'));
}
@@ -52,7 +52,7 @@ module.exports = function (Posts) {
Posts.parsePost(postData, next);
});
}
- }
+ },
], callback);
}
@@ -67,9 +67,8 @@ module.exports = function (Posts) {
}
cache.del(pid);
Posts.purge(pid, uid, next);
- }
+ },
], callback);
};
-
};
diff --git a/src/posts/topics.js b/src/posts/topics.js
index 0653c880e6..eca6da493a 100644
--- a/src/posts/topics.js
+++ b/src/posts/topics.js
@@ -7,7 +7,6 @@ var topics = require('../topics');
var utils = require('../../public/src/utils');
module.exports = function (Posts) {
-
Posts.getPostsFromSet = function (set, start, stop, uid, reverse, callback) {
async.waterfall([
function (next) {
@@ -15,7 +14,7 @@ module.exports = function (Posts) {
},
function (pids, next) {
Posts.getPostsByPids(pids, uid, next);
- }
+ },
], callback);
};
@@ -29,7 +28,7 @@ module.exports = function (Posts) {
},
function (mainPid, next) {
next(null, parseInt(pid, 10) === parseInt(mainPid, 10));
- }
+ },
], callback);
};
@@ -40,7 +39,7 @@ module.exports = function (Posts) {
},
function (tid, next) {
topics.getTopicFields(tid, fields, next);
- }
+ },
], callback);
};
@@ -66,7 +65,7 @@ module.exports = function (Posts) {
});
topics.getTopicsFields(tids, ['slug'], next);
- }
+ },
}, next);
},
function (results, next) {
@@ -81,8 +80,7 @@ module.exports = function (Posts) {
});
next(null, paths);
- }
+ },
], callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/posts/user.js b/src/posts/user.js
index 7f387ef894..59906bf2ca 100644
--- a/src/posts/user.js
+++ b/src/posts/user.js
@@ -9,7 +9,6 @@ var meta = require('../meta');
var plugins = require('../plugins');
module.exports = function (Posts) {
-
Posts.getUserInfoForPosts = function (uids, uid, callback) {
var groupsMap = {};
var userData;
@@ -25,7 +24,7 @@ module.exports = function (Posts) {
return groupTitle && array.indexOf(groupTitle) === index;
});
groups.getGroupsData(groupTitles, next);
- }
+ },
], function (err, groupsData) {
if (err) {
return callback(err);
@@ -38,7 +37,7 @@ module.exports = function (Posts) {
slug: group.slug,
labelColor: group.labelColor,
icon: group.icon,
- userTitle: group.userTitle
+ userTitle: group.userTitle,
};
}
});
@@ -72,8 +71,8 @@ module.exports = function (Posts) {
Posts.parseSignature(userData, uid, next);
},
customProfileInfo: function (next) {
- plugins.fireHook('filter:posts.custom_profile_info', {profile: [], uid: userData.uid}, next);
- }
+ plugins.fireHook('filter:posts.custom_profile_info', { profile: [], uid: userData.uid }, next);
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -95,7 +94,7 @@ module.exports = function (Posts) {
uid = parseInt(uid, 10);
if (Array.isArray(pid)) {
if (!uid) {
- return callback(null, pid.map(function () {return false;}));
+ return callback(null, pid.map(function () { return false; }));
}
Posts.getPostsFields(pid, ['uid'], function (err, posts) {
if (err) {
@@ -118,7 +117,7 @@ module.exports = function (Posts) {
Posts.isModerator = function (pids, uid, callback) {
if (!parseInt(uid, 10)) {
- return callback(null, pids.map(function () {return false;}));
+ return callback(null, pids.map(function () { return false; }));
}
Posts.getCidsByPids(pids, function (err, cids) {
if (err) {
@@ -127,4 +126,4 @@ module.exports = function (Posts) {
user.isModerator(uid, cids, callback);
});
};
-};
\ No newline at end of file
+};
diff --git a/src/posts/votes.js b/src/posts/votes.js
index 428685257a..ddc860f5b6 100644
--- a/src/posts/votes.js
+++ b/src/posts/votes.js
@@ -8,7 +8,6 @@ var user = require('../user');
var plugins = require('../plugins');
module.exports = function (Posts) {
-
var votesInProgress = {};
Posts.upvote = function (pid, uid, callback) {
@@ -64,7 +63,7 @@ module.exports = function (Posts) {
Posts.hasVoted = function (pid, uid, callback) {
if (!parseInt(uid, 10)) {
- return callback(null, {upvoted: false, downvoted: false});
+ return callback(null, { upvoted: false, downvoted: false });
}
db.isMemberOfSets(['pid:' + pid + ':upvote', 'pid:' + pid + ':downvote'], uid, function (err, hasVoted) {
@@ -72,19 +71,19 @@ module.exports = function (Posts) {
return callback(err);
}
- callback (null, {upvoted: hasVoted[0], downvoted: hasVoted[1]});
+ callback(null, { upvoted: hasVoted[0], downvoted: hasVoted[1] });
});
};
Posts.getVoteStatusByPostIDs = function (pids, uid, callback) {
if (!parseInt(uid, 10)) {
var data = pids.map(function () { return false; });
- return callback(null, {upvotes: data, downvotes: data});
+ return callback(null, { upvotes: data, downvotes: data });
}
var upvoteSets = [];
var downvoteSets = [];
- for (var i = 0; i < pids.length; ++i) {
+ for (var i = 0; i < pids.length; i += 1) {
upvoteSets.push('pid:' + pids[i] + ':upvote');
downvoteSets.push('pid:' + pids[i] + ':downvote');
}
@@ -95,7 +94,7 @@ module.exports = function (Posts) {
},
downvotes: function (next) {
db.isMemberOfSets(downvoteSets, uid, next);
- }
+ },
}, callback);
};
@@ -144,7 +143,7 @@ module.exports = function (Posts) {
},
reputation: function (next) {
user.getUserField(uid, 'reputation', next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -154,15 +153,15 @@ module.exports = function (Posts) {
return callback(new Error('self-vote'));
}
- if (command === 'downvote' && parseInt(results.reputation) < parseInt(meta.config['privileges:downvote'], 10)) {
+ if (command === 'downvote' && parseInt(results.reputation, 10) < parseInt(meta.config['privileges:downvote'], 10)) {
return callback(new Error('[[error:not-enough-reputation-to-downvote]]'));
}
- var voteStatus = results.voteStatus,
- hook,
- current = voteStatus.upvoted ? 'upvote' : 'downvote';
+ var voteStatus = results.voteStatus;
+ var hook;
+ var current = voteStatus.upvoted ? 'upvote' : 'downvote';
- if (voteStatus.upvoted && command === 'downvote' || voteStatus.downvoted && command === 'upvote') { // e.g. User *has* upvoted, and clicks downvote
+ if ((voteStatus.upvoted && command === 'downvote') || (voteStatus.downvoted && command === 'upvote')) { // e.g. User *has* upvoted, and clicks downvote
hook = command;
} else if (voteStatus.upvoted || voteStatus.downvoted) { // e.g. User *has* upvoted, clicks upvote (so we "unvote")
hook = 'unvote';
@@ -175,7 +174,7 @@ module.exports = function (Posts) {
pid: pid,
uid: uid,
owner: results.owner,
- current: current
+ current: current,
});
if (!voteStatus || (!voteStatus.upvoted && !voteStatus.downvoted)) {
@@ -224,11 +223,11 @@ module.exports = function (Posts) {
adjustPostVotes(postData, uid, type, unvote, function (err) {
callback(err, {
user: {
- reputation: newreputation
+ reputation: newreputation,
},
post: postData,
upvote: type === 'upvote' && !unvote,
- downvote: type === 'downvote' && !unvote
+ downvote: type === 'downvote' && !unvote,
});
});
});
@@ -248,7 +247,7 @@ module.exports = function (Posts) {
},
function (next) {
db.setRemove('pid:' + postData.pid + ':' + notType, uid, next);
- }
+ },
], function (err) {
if (err) {
return callback(err);
@@ -260,7 +259,7 @@ module.exports = function (Posts) {
},
downvotes: function (next) {
db.setCount('pid:' + postData.pid + ':downvote', next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
diff --git a/src/privileges.js b/src/privileges.js
index d933d72877..cccbd089d6 100644
--- a/src/privileges.js
+++ b/src/privileges.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var privileges = module.exports;
@@ -14,7 +14,7 @@ privileges.userPrivilegeList = [
'upload:post:image',
'upload:post:file',
'purge',
- 'mods'
+ 'mods',
];
privileges.groupPrivilegeList = [
@@ -29,7 +29,7 @@ privileges.groupPrivilegeList = [
'groups:upload:post:image',
'groups:upload:post:file',
'groups:purge',
- 'groups:moderate'
+ 'groups:moderate',
];
privileges.privilegeList = privileges.userPrivilegeList.concat(privileges.groupPrivilegeList);
diff --git a/src/privileges/categories.js b/src/privileges/categories.js
index 67b004e19e..ff3d16148f 100644
--- a/src/privileges/categories.js
+++ b/src/privileges/categories.js
@@ -11,32 +11,31 @@ var helpers = require('./helpers');
var plugins = require('../plugins');
module.exports = function (privileges) {
-
privileges.categories = {};
privileges.categories.list = function (cid, callback) {
// Method used in admin/category controller to show all users/groups with privs in that given cid
var privilegeLabels = [
- {name: 'Find Category'},
- {name: 'Access Category'},
- {name: 'Access Topics'},
- {name: 'Create Topics'},
- {name: 'Reply to Topics'},
- {name: 'Edit Posts'},
- {name: 'Delete Posts'},
- {name: 'Delete Topics'},
- {name: 'Upload Images'},
- {name: 'Upload Files'},
- {name: 'Purge'},
- {name: 'Moderate'}
+ { name: 'Find Category' },
+ { name: 'Access Category' },
+ { name: 'Access Topics' },
+ { name: 'Create Topics' },
+ { name: 'Reply to Topics' },
+ { name: 'Edit Posts' },
+ { name: 'Delete Posts' },
+ { name: 'Delete Topics' },
+ { name: 'Upload Images' },
+ { name: 'Upload Files' },
+ { name: 'Purge' },
+ { name: 'Moderate' },
];
async.parallel({
labels: function (next) {
async.parallel({
users: async.apply(plugins.fireHook, 'filter:privileges.list_human', privilegeLabels),
- groups: async.apply(plugins.fireHook, 'filter:privileges.groups.list_human', privilegeLabels)
+ groups: async.apply(plugins.fireHook, 'filter:privileges.groups.list_human', privilegeLabels),
}, next);
},
users: function (next) {
@@ -50,7 +49,6 @@ module.exports = function (privileges) {
}), next);
},
function (memberSets, next) {
-
memberSets = memberSets.map(function (set) {
return set.map(function (uid) {
return parseInt(uid, 10);
@@ -66,14 +64,14 @@ module.exports = function (privileges) {
memberData.forEach(function (member) {
member.privileges = {};
- for(var x = 0,numPrivs = userPrivileges.length; x < numPrivs; x++) {
+ for (var x = 0, numPrivs = userPrivileges.length; x < numPrivs; x += 1) {
member.privileges[userPrivileges[x]] = memberSets[x].indexOf(parseInt(member.uid, 10)) !== -1;
}
});
next(null, memberData);
});
- }
+ },
], next);
},
groups: function (next) {
@@ -87,7 +85,6 @@ module.exports = function (privileges) {
}), next);
},
function (memberSets, next) {
-
var uniqueGroups = _.unique(_.flatten(memberSets));
groups.getGroups('groups:createtime', 0, -1, function (err, groupNames) {
@@ -117,7 +114,7 @@ module.exports = function (privileges) {
var memberData = groupNames.map(function (member) {
memberPrivs = {};
- for(var x = 0,numPrivs = groupPrivileges.length; x < numPrivs; x++) {
+ for (var x = 0, numPrivs = groupPrivileges.length; x < numPrivs; x += 1) {
memberPrivs[groupPrivileges[x]] = memberSets[x].indexOf(member) !== -1;
}
return {
@@ -141,9 +138,9 @@ module.exports = function (privileges) {
next(null, member);
});
}, next);
- }
+ },
], next);
- }
+ },
}, function (err, payload) {
if (err) {
return callback(err);
@@ -167,7 +164,7 @@ module.exports = function (privileges) {
},
isModerator: function (next) {
user.isModerator(uid, cid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -183,7 +180,7 @@ module.exports = function (privileges) {
uid: uid,
editable: isAdminOrMod,
view_deleted: isAdminOrMod,
- isAdminOrMod: isAdminOrMod
+ isAdminOrMod: isAdminOrMod,
}, callback);
});
};
@@ -198,7 +195,7 @@ module.exports = function (privileges) {
},
function (next) {
user.isAdministrator(uid, next);
- }
+ },
], callback);
};
@@ -236,7 +233,7 @@ module.exports = function (privileges) {
},
function (next) {
user.isAdministrator(uid, next);
- }
+ },
], callback);
});
};
@@ -277,7 +274,7 @@ module.exports = function (privileges) {
},
isAdmin: function (next) {
user.isAdministrator(uid, next);
- }
+ },
}, callback);
};
@@ -299,7 +296,7 @@ module.exports = function (privileges) {
},
isAdmin: function (next) {
user.isAdministrator(uids, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -336,7 +333,7 @@ module.exports = function (privileges) {
},
moderatorOfTarget: function (next) {
user.isModerator(uid, targetCid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -372,7 +369,7 @@ module.exports = function (privileges) {
},
mods: function (next) {
user.isModerator(uid, cid, next);
- }
+ },
}, callback);
};
@@ -399,8 +396,7 @@ module.exports = function (privileges) {
},
'groups:topics:read': function (next) {
groups.isMember(groupName, 'cid:' + cid + ':privileges:groups:topics:read', next);
- }
+ },
}, callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/privileges/helpers.js b/src/privileges/helpers.js
index 02e1bed879..9593d60f09 100644
--- a/src/privileges/helpers.js
+++ b/src/privileges/helpers.js
@@ -27,8 +27,9 @@ function isUserAllowedToCids(privilege, uid, cids, callback) {
return isGuestAllowedToCids(privilege, cids, callback);
}
- var userKeys = [], groupKeys = [];
- for (var i = 0; i < cids.length; ++i) {
+ var userKeys = [];
+ var groupKeys = [];
+ for (var i = 0; i < cids.length; i += 1) {
userKeys.push('cid:' + cids[i] + ':privileges:' + privilege);
groupKeys.push('cid:' + cids[i] + ':privileges:groups:' + privilege);
}
@@ -39,14 +40,14 @@ function isUserAllowedToCids(privilege, uid, cids, callback) {
},
hasGroupPrivilege: function (next) {
groups.isMemberOfGroupsList(uid, groupKeys, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
}
var result = [];
- for (var i = 0; i < cids.length; ++i) {
+ for (var i = 0; i < cids.length; i += 1) {
result.push(results.hasUserPrivilege[i] || results.hasGroupPrivilege[i]);
}
@@ -59,8 +60,9 @@ function isUserAllowedToPrivileges(privileges, uid, cid, callback) {
return isGuestAllowedToPrivileges(privileges, cid, callback);
}
- var userKeys = [], groupKeys = [];
- for (var i = 0; i < privileges.length; ++i) {
+ var userKeys = [];
+ var groupKeys = [];
+ for (var i = 0; i < privileges.length; i += 1) {
userKeys.push('cid:' + cid + ':privileges:' + privileges[i]);
groupKeys.push('cid:' + cid + ':privileges:groups:' + privileges[i]);
}
@@ -71,14 +73,14 @@ function isUserAllowedToPrivileges(privileges, uid, cid, callback) {
},
hasGroupPrivilege: function (next) {
groups.isMemberOfGroupsList(uid, groupKeys, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
}
var result = [];
- for (var i = 0; i < privileges.length; ++i) {
+ for (var i = 0; i < privileges.length; i += 1) {
result.push(results.hasUserPrivilege[i] || results.hasGroupPrivilege[i]);
}
@@ -94,14 +96,14 @@ helpers.isUsersAllowedTo = function (privilege, uids, cid, callback) {
},
hasGroupPrivilege: function (next) {
groups.isMembersOfGroupList(uids, 'cid:' + cid + ':privileges:groups:' + privilege, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
}
var result = [];
- for(var i = 0; i < uids.length; ++i) {
+ for (var i = 0; i < uids.length; i += 1) {
result.push(results.hasUserPrivilege[i] || results.hasGroupPrivilege[i]);
}
@@ -111,7 +113,7 @@ helpers.isUsersAllowedTo = function (privilege, uids, cid, callback) {
function isGuestAllowedToCids(privilege, cids, callback) {
var groupKeys = [];
- for (var i = 0; i < cids.length; ++i) {
+ for (var i = 0; i < cids.length; i += 1) {
groupKeys.push('cid:' + cids[i] + ':privileges:groups:' + privilege);
}
@@ -120,11 +122,11 @@ function isGuestAllowedToCids(privilege, cids, callback) {
function isGuestAllowedToPrivileges(privileges, cid, callback) {
var groupKeys = [];
- for (var i = 0; i < privileges.length; ++i) {
+ for (var i = 0; i < privileges.length; i += 1) {
groupKeys.push('cid:' + cid + ':privileges:groups:' + privileges[i]);
}
groups.isMemberOfGroups('guests', groupKeys, callback);
}
-module.exports = helpers;
\ No newline at end of file
+module.exports = helpers;
diff --git a/src/privileges/posts.js b/src/privileges/posts.js
index d68edc6e14..8a31ad4129 100644
--- a/src/privileges/posts.js
+++ b/src/privileges/posts.js
@@ -11,7 +11,6 @@ var helpers = require('./helpers');
var plugins = require('../plugins');
module.exports = function (privileges) {
-
privileges.posts = {};
privileges.posts.get = function (pids, uid, callback) {
@@ -32,7 +31,7 @@ module.exports = function (privileges) {
read: async.apply(helpers.isUserAllowedTo, 'read', uid, cids),
'posts:edit': async.apply(helpers.isUserAllowedTo, 'posts:edit', uid, cids),
}, next);
- }
+ },
], function (err, results) {
if (err) {
return callback(err);
@@ -40,7 +39,7 @@ module.exports = function (privileges) {
var privileges = [];
- for (var i = 0; i < pids.length; ++i) {
+ for (var i = 0; i < pids.length; i += 1) {
var isAdminOrMod = results.isAdmin || results.isModerator[i];
var editable = isAdminOrMod || (results.isOwner[i] && results['posts:edit'][i]);
@@ -50,7 +49,7 @@ module.exports = function (privileges) {
move: isAdminOrMod,
isAdminOrMod: isAdminOrMod,
'topics:read': results['topics:read'][i] || isAdminOrMod,
- read: results.read[i] || isAdminOrMod
+ read: results.read[i] || isAdminOrMod,
});
}
@@ -91,7 +90,6 @@ module.exports = function (privileges) {
topics.getTopicsFields(tids, ['deleted', 'cid'], next);
},
function (topicData, next) {
-
topicData.forEach(function (topic, index) {
if (topic) {
tidToTopic[tids[index]] = topic;
@@ -111,7 +109,6 @@ module.exports = function (privileges) {
privileges.categories.getBase(privilege, cids, uid, next);
},
function (results, next) {
-
var isModOf = {};
cids = cids.filter(function (cid, index) {
isModOf[cid] = results.isModerators[index];
@@ -130,24 +127,24 @@ module.exports = function (privileges) {
plugins.fireHook('filter:privileges.posts.filter', {
privilege: privilege,
uid: uid,
- pids: pids
+ pids: pids,
}, function (err, data) {
next(err, data ? data.pids : null);
});
- }
+ },
], callback);
};
privileges.posts.canEdit = function (pid, uid, callback) {
async.parallel({
isEditable: async.apply(isPostEditable, pid, uid),
- isAdminOrMod: async.apply(isAdminOrMod, pid, uid)
+ isAdminOrMod: async.apply(isAdminOrMod, pid, uid),
}, function (err, results) {
if (err) {
return callback(err);
}
if (results.isAdminOrMod) {
- return callback(null, {flag: true});
+ return callback(null, { flag: true });
}
callback(null, results.isEditable);
@@ -166,33 +163,33 @@ module.exports = function (privileges) {
isAdminOrMod: async.apply(isAdminOrMod, pid, uid),
isLocked: async.apply(topics.isLocked, postData.tid),
isOwner: async.apply(posts.isOwner, pid, uid),
- 'posts:delete': async.apply(privileges.posts.can, 'posts:delete', pid, uid)
+ 'posts:delete': async.apply(privileges.posts.can, 'posts:delete', pid, uid),
}, next);
- }
+ },
], function (err, results) {
if (err) {
return callback(err);
}
if (results.isAdminOrMod) {
- return callback(null, {flag: true});
+ return callback(null, { flag: true });
}
if (results.isLocked) {
- return callback(null, {flag: false, message: '[[error:topic-locked]]'});
+ return callback(null, { flag: false, message: '[[error:topic-locked]]' });
}
if (!results['posts:delete']) {
- return callback(null, {flag: false, message: '[[error:no-privileges]]'});
+ return callback(null, { flag: false, message: '[[error:no-privileges]]' });
}
var postDeleteDuration = parseInt(meta.config.postDeleteDuration, 10);
if (postDeleteDuration && (Date.now() - parseInt(postData.timestamp, 10) > postDeleteDuration * 1000)) {
- return callback(null, {flag: false, message: '[[error:post-delete-duration-expired, ' + meta.config.postDeleteDuration + ']]'});
+ return callback(null, { flag: false, message: '[[error:post-delete-duration-expired, ' + meta.config.postDeleteDuration + ']]' });
}
var deleterUid = parseInt(postData.deleterUid, 10) || 0;
var flag = results.isOwner && (deleterUid === 0 || deleterUid === parseInt(postData.uid, 10));
- callback(null, {flag: flag, message: '[[error:no-privileges]]'});
+ callback(null, { flag: flag, message: '[[error:no-privileges]]' });
});
};
@@ -214,42 +211,40 @@ module.exports = function (privileges) {
async.parallel({
purge: async.apply(privileges.categories.isUserAllowedTo, 'purge', cid, uid),
owner: async.apply(posts.isOwner, pid, uid),
- isAdminOrMod: async.apply(privileges.categories.isAdminOrMod, cid, uid)
+ isAdminOrMod: async.apply(privileges.categories.isAdminOrMod, cid, uid),
}, next);
},
function (results, next) {
next(null, results.isAdminOrMod || (results.purge && results.owner));
- }
+ },
], callback);
};
function isPostEditable(pid, uid, callback) {
- var tid;
async.waterfall([
function (next) {
posts.getPostFields(pid, ['tid', 'timestamp'], next);
},
function (postData, next) {
- tid = postData.tid;
var postEditDuration = parseInt(meta.config.postEditDuration, 10);
if (postEditDuration && Date.now() - parseInt(postData.timestamp, 10) > postEditDuration * 1000) {
- return callback(null, {flag: false, message: '[[error:post-edit-duration-expired, ' + meta.config.postEditDuration + ']]'});
+ return callback(null, { flag: false, message: '[[error:post-edit-duration-expired, ' + meta.config.postEditDuration + ']]' });
}
topics.isLocked(postData.tid, next);
},
function (isLocked, next) {
if (isLocked) {
- return callback(null, {flag: false, message: '[[error:topic-locked]]'});
+ return callback(null, { flag: false, message: '[[error:topic-locked]]' });
}
async.parallel({
owner: async.apply(posts.isOwner, pid, uid),
- edit: async.apply(privileges.posts.can, 'posts:edit', pid, uid)
+ edit: async.apply(privileges.posts.can, 'posts:edit', pid, uid),
}, next);
},
function (result, next) {
- next(null, {flag: result.owner && result.edit, message: '[[error:no-privileges]]'});
- }
+ next(null, { flag: result.owner && result.edit, message: '[[error:no-privileges]]' });
+ },
], callback);
}
@@ -266,7 +261,7 @@ module.exports = function (privileges) {
},
function (next) {
user.isAdministrator(uid, next);
- }
+ },
], callback);
}
-};
\ No newline at end of file
+};
diff --git a/src/privileges/topics.js b/src/privileges/topics.js
index 39ad054462..f44383eed8 100644
--- a/src/privileges/topics.js
+++ b/src/privileges/topics.js
@@ -12,7 +12,6 @@ var categories = require('../categories');
var plugins = require('../plugins');
module.exports = function (privileges) {
-
privileges.topics = {};
privileges.topics.get = function (tid, uid, callback) {
@@ -26,9 +25,9 @@ module.exports = function (privileges) {
privileges: async.apply(helpers.isUserAllowedTo, privs, uid, topic.cid),
isAdministrator: async.apply(user.isAdministrator, uid),
isModerator: async.apply(user.isModerator, uid, topic.cid),
- disabled: async.apply(categories.getCategoryField, topic.cid, 'disabled')
+ disabled: async.apply(categories.getCategoryField, topic.cid, 'disabled'),
}, next);
- }
+ },
], function (err, results) {
if (err) {
return callback(err);
@@ -57,19 +56,20 @@ module.exports = function (privileges) {
isAdminOrMod: isAdminOrMod,
disabled: disabled,
tid: tid,
- uid: uid
+ uid: uid,
}, callback);
});
};
privileges.topics.can = function (privilege, tid, uid, callback) {
- topics.getTopicField(tid, 'cid', function (err, cid) {
- if (err) {
- return callback(err);
- }
-
- privileges.categories.can(privilege, cid, uid, callback);
- });
+ async.waterfall([
+ function (next) {
+ topics.getTopicField(tid, 'cid', next);
+ },
+ function (cid, next) {
+ privileges.categories.can(privilege, cid, uid, next);
+ },
+ ], callback);
};
privileges.topics.filterTids = function (privilege, tids, uid, callback) {
@@ -93,7 +93,6 @@ module.exports = function (privileges) {
privileges.categories.getBase(privilege, cids, uid, next);
},
function (results, next) {
-
var isModOf = {};
cids = cids.filter(function (cid, index) {
isModOf[cid] = results.isModerators[index];
@@ -111,11 +110,11 @@ module.exports = function (privileges) {
plugins.fireHook('filter:privileges.topics.filter', {
privilege: privilege,
uid: uid,
- tids: tids
+ tids: tids,
}, function (err, data) {
next(err, data ? data.tids : null);
});
- }
+ },
], callback);
};
@@ -145,7 +144,7 @@ module.exports = function (privileges) {
},
isAdmins: function (next) {
user.isAdministrator(uids, next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -158,7 +157,7 @@ module.exports = function (privileges) {
next(null, uids);
});
- }
+ },
], callback);
};
@@ -171,12 +170,12 @@ module.exports = function (privileges) {
async.parallel({
purge: async.apply(privileges.categories.isUserAllowedTo, 'purge', cid, uid),
owner: async.apply(topics.isOwner, tid, uid),
- isAdminOrMod: async.apply(privileges.categories.isAdminOrMod, cid, uid)
+ isAdminOrMod: async.apply(privileges.categories.isAdminOrMod, cid, uid),
}, next);
},
function (results, next) {
next(null, results.isAdminOrMod || (results.purge && results.owner));
- }
+ },
], callback);
};
@@ -192,9 +191,9 @@ module.exports = function (privileges) {
isModerator: async.apply(user.isModerator, uid, topicData.cid),
isAdministrator: async.apply(user.isAdministrator, uid),
isOwner: async.apply(topics.isOwner, tid, uid),
- 'topics:delete': async.apply(helpers.isUserAllowedTo, 'topics:delete', uid, [topicData.cid])
+ 'topics:delete': async.apply(helpers.isUserAllowedTo, 'topics:delete', uid, [topicData.cid]),
}, next);
- }
+ },
], function (err, results) {
if (err) {
return callback(err);
@@ -231,7 +230,7 @@ module.exports = function (privileges) {
},
function (next) {
privileges.topics.isAdminOrMod(tid, uid, next);
- }
+ },
], callback);
};
@@ -248,7 +247,7 @@ module.exports = function (privileges) {
},
function (next) {
user.isAdministrator(uid, next);
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/privileges/users.js b/src/privileges/users.js
index 82553647a4..ed72efb147 100644
--- a/src/privileges/users.js
+++ b/src/privileges/users.js
@@ -7,7 +7,6 @@ var groups = require('../groups');
var plugins = require('../plugins');
module.exports = function (privileges) {
-
privileges.users = {};
privileges.users.isAdministrator = function (uid, callback) {
@@ -29,18 +28,16 @@ module.exports = function (privileges) {
privileges.users.isModerator = function (uid, cid, callback) {
if (Array.isArray(cid)) {
isModeratorOfCategories(cid, uid, callback);
+ } else if (Array.isArray(uid)) {
+ isModeratorsOfCategory(cid, uid, callback);
} else {
- if (Array.isArray(uid)) {
- isModeratorsOfCategory(cid, uid, callback);
- } else {
- isModeratorOfCategory(cid, uid, callback);
- }
+ isModeratorOfCategory(cid, uid, callback);
}
};
function isModeratorOfCategories(cids, uid, callback) {
if (!parseInt(uid, 10)) {
- return filterIsModerator(cids, uid, cids.map(function () {return false;}), callback);
+ return filterIsModerator(cids, uid, cids.map(function () { return false; }), callback);
}
privileges.users.isGlobalModerator(uid, function (err, isGlobalModerator) {
@@ -48,7 +45,7 @@ module.exports = function (privileges) {
return callback(err);
}
if (isGlobalModerator) {
- return filterIsModerator(cids, uid, cids.map(function () {return true;}), callback);
+ return filterIsModerator(cids, uid, cids.map(function () { return true; }), callback);
}
@@ -66,16 +63,16 @@ module.exports = function (privileges) {
async.parallel({
user: async.apply(groups.isMemberOfGroups, uid, groupNames),
- group: async.apply(groups.isMemberOfGroupsList, uid, groupListNames)
+ group: async.apply(groups.isMemberOfGroupsList, uid, groupListNames),
}, function (err, checks) {
if (err) {
return callback(err);
}
var isMembers = checks.user.map(function (isMember, idx) {
- return isMember || checks.group[idx];
- }),
- map = {};
+ return isMember || checks.group[idx];
+ });
+ var map = {};
uniqueCids.forEach(function (cid, index) {
map[cid] = isMembers[index];
@@ -94,7 +91,7 @@ module.exports = function (privileges) {
async.parallel([
async.apply(privileges.users.isGlobalModerator, uids),
async.apply(groups.isMembers, uids, 'cid:' + cid + ':privileges:mods'),
- async.apply(groups.isMembersOfGroupList, uids, 'cid:' + cid + ':privileges:groups:moderate')
+ async.apply(groups.isMembersOfGroupList, uids, 'cid:' + cid + ':privileges:groups:moderate'),
], function (err, checks) {
if (err) {
return callback(err);
@@ -112,7 +109,7 @@ module.exports = function (privileges) {
async.parallel([
async.apply(privileges.users.isGlobalModerator, uid),
async.apply(groups.isMember, uid, 'cid:' + cid + ':privileges:mods'),
- async.apply(groups.isMemberOfGroupList, uid, 'cid:' + cid + ':privileges:groups:moderate')
+ async.apply(groups.isMemberOfGroupList, uid, 'cid:' + cid + ':privileges:groups:moderate'),
], function (err, checks) {
if (err) {
return callback(err);
@@ -124,11 +121,11 @@ module.exports = function (privileges) {
}
function filterIsModerator(cid, uid, isModerator, callback) {
- plugins.fireHook('filter:user.isModerator', {uid: uid, cid: cid, isModerator: isModerator}, function (err, data) {
+ plugins.fireHook('filter:user.isModerator', { uid: uid, cid: cid, isModerator: isModerator }, function (err, data) {
if (err) {
return callback(err);
}
- if (Array.isArray(uid) && !Array.isArray(data.isModerator) || Array.isArray(cid) && !Array.isArray(data.isModerator)) {
+ if ((Array.isArray(uid) || Array.isArray(cid)) && !Array.isArray(data.isModerator)) {
return callback(new Error('filter:user.isModerator - i/o mismatch'));
}
@@ -150,7 +147,7 @@ module.exports = function (privileges) {
},
isTargetAdmin: function (next) {
privileges.users.isAdministrator(uid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -160,5 +157,4 @@ module.exports = function (privileges) {
callback(null, canEdit);
});
};
-
-};
\ No newline at end of file
+};
diff --git a/src/pubsub.js b/src/pubsub.js
index f5c6c2f0ed..b33a03b6bf 100644
--- a/src/pubsub.js
+++ b/src/pubsub.js
@@ -26,7 +26,7 @@ var PubSub = function () {
try {
var msg = JSON.parse(message);
self.emit(msg.event, msg.data);
- } catch(err) {
+ } catch (err) {
winston.error(err.stack);
}
});
@@ -37,7 +37,7 @@ util.inherits(PubSub, EventEmitter);
PubSub.prototype.publish = function (event, data) {
if (this.pubClient) {
- this.pubClient.publish(channelName, JSON.stringify({event: event, data: data}));
+ this.pubClient.publish(channelName, JSON.stringify({ event: event, data: data }));
} else {
this.emit(event, data);
}
@@ -45,4 +45,4 @@ PubSub.prototype.publish = function (event, data) {
var pubsub = new PubSub();
-module.exports = pubsub;
\ No newline at end of file
+module.exports = pubsub;
diff --git a/src/reset.js b/src/reset.js
index d237059f8e..f709c4188b 100644
--- a/src/reset.js
+++ b/src/reset.js
@@ -82,15 +82,15 @@ function resetSettings(callback) {
function resetTheme(themeId, callback) {
var meta = require('./meta');
var fs = require('fs');
-
- fs.access('node_modules/' + themeId + '/package.json', function (err, fd) {
+
+ fs.access('node_modules/' + themeId + '/package.json', function (err) {
if (err) {
winston.warn('[reset] Theme `%s` is not installed on this forum', themeId);
callback(new Error('theme-not-found'));
} else {
meta.themes.set({
type: 'local',
- id: themeId
+ id: themeId,
}, function (err) {
if (err) {
winston.warn('[reset] Failed to reset theme to ' + themeId);
@@ -99,7 +99,7 @@ function resetTheme(themeId, callback) {
}
callback();
- });
+ });
}
});
}
@@ -109,7 +109,7 @@ function resetThemes(callback) {
meta.themes.set({
type: 'local',
- id: 'nodebb-theme-persona'
+ id: 'nodebb-theme-persona',
}, function (err) {
winston.info('[reset] Theme reset to Persona');
callback(err);
@@ -129,18 +129,16 @@ function resetPlugin(pluginId, callback) {
} else {
next();
}
- }
+ },
], function (err) {
if (err) {
winston.error('[reset] Could not disable plugin: %s encountered error %s', pluginId, err.message);
+ } else if (active) {
+ winston.info('[reset] Plugin `%s` disabled', pluginId);
} else {
- if (active) {
- winston.info('[reset] Plugin `%s` disabled', pluginId);
- } else {
- winston.warn('[reset] Plugin `%s` was not active on this forum', pluginId);
- winston.info('[reset] No action taken.');
- err = new Error('plugin-not-active');
- }
+ winston.warn('[reset] Plugin `%s` was not active on this forum', pluginId);
+ winston.info('[reset] No action taken.');
+ err = new Error('plugin-not-active');
}
callback(err);
@@ -161,4 +159,4 @@ function resetWidgets(callback) {
});
}
-module.exports = Reset;
\ No newline at end of file
+module.exports = Reset;
diff --git a/src/rewards/admin.js b/src/rewards/admin.js
index ec5a26d5aa..60f335ef86 100644
--- a/src/rewards/admin.js
+++ b/src/rewards/admin.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var plugins = require('../plugins');
@@ -7,9 +7,7 @@ var db = require('../database');
var rewards = module.exports;
rewards.save = function (data, callback) {
-
async.each(data, function save(data, next) {
-
if (!Object.keys(data.rewards).length) {
return next();
}
@@ -26,7 +24,6 @@ rewards.save = function (data, callback) {
}
},
function (rid, next) {
-
data.id = rid;
async.series([
@@ -41,11 +38,10 @@ rewards.save = function (data, callback) {
},
function (next) {
db.setObject('rewards:id:' + data.id + ':rewards', rewardsData, next);
- }
+ },
], next);
- }
+ },
], next);
-
}, function (err) {
if (err) {
return callback(err);
@@ -65,7 +61,7 @@ rewards.delete = function (data, callback) {
},
function (next) {
db.delete('rewards:id:' + data.id + ':rewards', next);
- }
+ },
], callback);
};
@@ -80,7 +76,7 @@ rewards.get = function (callback) {
},
rewards: function (next) {
plugins.fireHook('filter:rewards.rewards', [], next);
- }
+ },
}, callback);
};
@@ -105,7 +101,7 @@ function saveConditions(data, callback) {
async.each(Object.keys(rewardsPerCondition), function (condition, next) {
db.setAdd('condition:' + condition + ':rewards', rewardsPerCondition[condition], next);
}, next);
- }
+ },
], function (err) {
callback(err);
});
@@ -121,7 +117,7 @@ function getActiveRewards(callback) {
},
rewards: function (next) {
db.getObject('rewards:id:' + id + ':rewards', next);
- }
+ },
}, function (err, data) {
if (data.main) {
data.main.disabled = data.main.disabled === 'true';
diff --git a/src/rewards/index.js b/src/rewards/index.js
index 3c09872e67..578ba5af2d 100644
--- a/src/rewards/index.js
+++ b/src/rewards/index.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var db = require('../database');
@@ -46,7 +46,7 @@ rewards.checkConditionAndRewardUser = function (uid, condition, method, callback
giveRewards(uid, eligible, next);
});
- }
+ },
], callback);
};
@@ -102,7 +102,7 @@ function checkCondition(reward, method, callback) {
return callback(err);
}
- plugins.fireHook('filter:rewards.checkConditional:' + reward.conditional, {left: value, right: reward.value}, function (err, bool) {
+ plugins.fireHook('filter:rewards.checkConditional:' + reward.conditional, { left: value, right: reward.value }, function (err, bool) {
callback(err || bool);
});
});
@@ -115,7 +115,7 @@ function giveRewards(uid, rewards, callback) {
}
async.each(rewards, function (reward, next) {
- plugins.fireHook('action:rewards.award:' + reward.rid, {uid: uid, reward: rewardData[rewards.indexOf(reward)]});
+ plugins.fireHook('action:rewards.award:' + reward.rid, { uid: uid, reward: rewardData[rewards.indexOf(reward)] });
db.sortedSetIncrBy('uid:' + uid + ':rewards', 1, reward.id, next);
}, callback);
});
diff --git a/src/routes/accounts.js b/src/routes/accounts.js
index ae80b8aa4a..a462399b40 100644
--- a/src/routes/accounts.js
+++ b/src/routes/accounts.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var helpers = require('./helpers');
var setupPageRoute = helpers.setupPageRoute;
diff --git a/src/routes/admin.js b/src/routes/admin.js
index 53b12fc4b8..42fd935aa7 100644
--- a/src/routes/admin.js
+++ b/src/routes/admin.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var express = require('express');
diff --git a/src/routes/api.js b/src/routes/api.js
index 98c884c237..16ead5c588 100644
--- a/src/routes/api.js
+++ b/src/routes/api.js
@@ -1,11 +1,10 @@
-"use strict";
+'use strict';
var express = require('express');
var uploadsController = require('../controllers/uploads');
-module.exports = function (app, middleware, controllers) {
-
+module.exports = function (app, middleware, controllers) {
var router = express.Router();
app.use('/api', router);
@@ -36,6 +35,5 @@ module.exports = function (app, middleware, controllers) {
router.post('/user/:userslug/uploadcover', middlewares.concat([middleware.authenticate, middleware.checkGlobalPrivacySettings, middleware.checkAccountPermissions]), controllers.accounts.edit.uploadCoverPicture);
router.post('/groups/uploadpicture', middlewares.concat([middleware.authenticate]), controllers.groups.uploadCover);
-
};
diff --git a/src/routes/authentication.js b/src/routes/authentication.js
index c6f1359fc2..0e1d2aa6e2 100644
--- a/src/routes/authentication.js
+++ b/src/routes/authentication.js
@@ -1,17 +1,17 @@
-(function (Auth) {
- "use strict";
+'use strict';
- var passport = require('passport'),
- passportLocal = require('passport-local').Strategy,
- nconf = require('nconf'),
- winston = require('winston'),
- express = require('express'),
+(function (Auth) {
+ var passport = require('passport');
+ var passportLocal = require('passport-local').Strategy;
+ var nconf = require('nconf');
+ var winston = require('winston');
+ var express = require('express');
- controllers = require('../controllers'),
- plugins = require('../plugins'),
- hotswap = require('../hotswap'),
+ var controllers = require('../controllers');
+ var plugins = require('../plugins');
+ var hotswap = require('../hotswap');
- loginStrategies = [];
+ var loginStrategies = [];
Auth.initialize = function (app, middleware) {
app.use(passport.initialize());
@@ -40,7 +40,7 @@
winston.warn('[authentication] Login override detected, skipping local login strategy.');
plugins.fireHook('action:auth.overrideLogin');
} else {
- passport.use(new passportLocal({passReqToCallback: true}, controllers.authentication.localLogin));
+ passport.use(new passportLocal({ passReqToCallback: true }, controllers.authentication.localLogin));
}
plugins.fireHook('filter:auth.init', loginStrategies, function (err) {
@@ -53,13 +53,13 @@
if (strategy.url) {
router.get(strategy.url, passport.authenticate(strategy.name, {
scope: strategy.scope,
- prompt: strategy.prompt || undefined
+ prompt: strategy.prompt || undefined,
}));
}
router.get(strategy.callbackURL, passport.authenticate(strategy.name, {
successReturnToOrRedirect: nconf.get('relative_path') + (strategy.successUrl !== undefined ? strategy.successUrl : '/'),
- failureRedirect: nconf.get('relative_path') + (strategy.failureUrl !== undefined ? strategy.failureUrl : '/login')
+ failureRedirect: nconf.get('relative_path') + (strategy.failureUrl !== undefined ? strategy.failureUrl : '/login'),
}));
});
@@ -82,8 +82,7 @@
passport.deserializeUser(function (uid, done) {
done(null, {
- uid: uid
+ uid: uid,
});
});
-
}(exports));
diff --git a/src/routes/debug.js b/src/routes/debug.js
index 9c5efe6c93..2ec3f23934 100644
--- a/src/routes/debug.js
+++ b/src/routes/debug.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var express = require('express');
var nconf = require('nconf');
@@ -7,9 +7,8 @@ var user = require('../user');
var categories = require('../categories');
var topics = require('../topics');
var posts = require('../posts');
-var db = require('../database');
-module.exports = function (app, middleware, controllers) {
+module.exports = function (app) {
var router = express.Router();
router.get('/uid/:uid', function (req, res) {
@@ -26,7 +25,7 @@ module.exports = function (app, middleware, controllers) {
res.send(data);
} else {
res.status(404).json({
- error: "User doesn't exist!"
+ error: "User doesn't exist!",
});
}
});
diff --git a/src/routes/feeds.js b/src/routes/feeds.js
index 9521e65ce8..5e3d75c34d 100644
--- a/src/routes/feeds.js
+++ b/src/routes/feeds.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var rss = require('rss');
@@ -13,7 +13,7 @@ var meta = require('../meta');
var helpers = require('../controllers/helpers');
var privileges = require('../privileges');
-module.exports = function (app, middleware, controllers) {
+module.exports = function (app, middleware) {
app.get('/topic/:topic_id.rss', middleware.maintenanceMode, generateForTopic);
app.get('/category/:category_id.rss', middleware.maintenanceMode, generateForCategory);
app.get('/recent.rss', middleware.maintenanceMode, generateForRecent);
@@ -41,7 +41,7 @@ function generateForTopic(req, res, callback) {
},
topic: function (next) {
topics.getTopicData(tid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -56,7 +56,7 @@ function generateForTopic(req, res, callback) {
}
userPrivileges = results.privileges;
topics.getTopicWithPosts(results.topic, 'tid:' + tid + ':posts', req.uid, 0, 25, false, next);
- }
+ },
], function (err, topicData) {
if (err) {
return callback(err);
@@ -75,7 +75,7 @@ function generateForTopic(req, res, callback) {
site_url: nconf.get('url') + '/topic/' + topicData.slug,
image_url: image_url,
author: author,
- ttl: 60
+ ttl: 60,
});
var dateStamp;
@@ -92,7 +92,7 @@ function generateForTopic(req, res, callback) {
description: postData.content,
url: nconf.get('url') + '/post/' + postData.pid,
author: postData.user ? postData.user.username : '',
- date: dateStamp
+ date: dateStamp,
});
}
});
@@ -117,7 +117,7 @@ function generateForUserTopics(req, res, callback) {
return callback();
}
user.getUserFields(uid, ['uid', 'username'], next);
- }
+ },
], function (err, userData) {
if (err) {
return callback(err);
@@ -128,7 +128,7 @@ function generateForUserTopics(req, res, callback) {
title: 'Topics by ' + userData.username,
description: 'A list of topics that are posted by ' + userData.username,
feed_url: '/user/' + userslug + '/topics.rss',
- site_url: '/user/' + userslug + '/topics'
+ site_url: '/user/' + userslug + '/topics',
}, 'uid:' + userData.uid + ':topics', req, res, callback);
});
}
@@ -152,9 +152,9 @@ function generateForCategory(req, res, next) {
reverse: true,
start: 0,
stop: 25,
- uid: req.uid
+ uid: req.uid,
}, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -168,7 +168,7 @@ function generateForCategory(req, res, next) {
feed_url: '/category/' + cid + '.rss',
site_url: '/category/' + results.category.cid,
}, results.category.topics, next);
- }
+ },
], function (err, feed) {
if (err) {
return next(err);
@@ -186,7 +186,7 @@ function generateForRecent(req, res, next) {
title: 'Recently Active Topics',
description: 'A list of topics that have been active within the past 24 hours',
feed_url: '/recent.rss',
- site_url: '/recent'
+ site_url: '/recent',
}, 'topics:recent', req, res, next);
}
@@ -198,7 +198,7 @@ function generateForPopular(req, res, next) {
daily: 'day',
weekly: 'week',
monthly: 'month',
- alltime: 'alltime'
+ alltime: 'alltime',
};
var term = terms[req.params.term] || 'day';
@@ -212,9 +212,9 @@ function generateForPopular(req, res, next) {
title: 'Popular Topics',
description: 'A list of topics that are sorted by post count',
feed_url: '/popular/' + (req.params.term || 'daily') + '.rss',
- site_url: '/popular/' + (req.params.term || 'daily')
+ site_url: '/popular/' + (req.params.term || 'daily'),
}, topics, next);
- }
+ },
], function (err, feed) {
if (err) {
return next(err);
@@ -232,7 +232,7 @@ function generateForTopics(options, set, req, res, next) {
},
function (data, next) {
generateTopicsFeed(options, data.topics, next);
- }
+ },
], function (err, feed) {
if (err) {
return next(err);
@@ -242,7 +242,6 @@ function generateForTopics(options, set, req, res, next) {
}
function generateTopicsFeed(feedOptions, feedTopics, callback) {
-
feedOptions.ttl = 60;
feedOptions.feed_url = nconf.get('url') + feedOptions.feed_url;
feedOptions.site_url = nconf.get('url') + feedOptions.site_url;
@@ -259,7 +258,7 @@ function generateTopicsFeed(feedOptions, feedTopics, callback) {
var feedItem = {
title: topicData.title,
url: nconf.get('url') + '/topic/' + topicData.slug,
- date: new Date(parseInt(topicData.lastposttime, 10)).toUTCString()
+ date: new Date(parseInt(topicData.lastposttime, 10)).toUTCString(),
};
if (topicData.teaser && topicData.teaser.user) {
@@ -306,7 +305,7 @@ function generateForRecentPosts(req, res, next) {
title: 'Recent Posts',
description: 'A list of recent posts',
feed_url: '/recentposts.rss',
- site_url: '/recentposts'
+ site_url: '/recentposts',
}, posts);
sendFeed(feed, res);
@@ -328,7 +327,7 @@ function generateForCategoryRecentPosts(req, res, next) {
},
posts: function (next) {
categories.getRecentReplies(cid, req.uid, 20, next);
- }
+ },
}, function (err, results) {
if (err) {
return next(err);
@@ -345,7 +344,7 @@ function generateForCategoryRecentPosts(req, res, next) {
title: results.category.name + ' Recent Posts',
description: 'A list of recent posts from ' + results.category.name,
feed_url: '/category/' + cid + '/recentposts.rss',
- site_url: '/category/' + cid + '/recentposts'
+ site_url: '/category/' + cid + '/recentposts',
}, results.posts);
sendFeed(feed, res);
@@ -369,7 +368,7 @@ function generateForPostsFeed(feedOptions, posts) {
description: postData.content,
url: nconf.get('url') + '/post/' + postData.pid,
author: postData.user ? postData.user.username : '',
- date: new Date(parseInt(postData.timestamp, 10)).toUTCString()
+ date: new Date(parseInt(postData.timestamp, 10)).toUTCString(),
});
});
@@ -392,7 +391,7 @@ function generateForTag(req, res, next) {
feed_url: '/tags/' + tag + '.rss',
site_url: '/tags/' + tag,
start: start,
- stop: stop
+ stop: stop,
}, 'tag:' + tag + ':topics', req, res, next);
}
@@ -401,4 +400,3 @@ function sendFeed(feed, res) {
res.type('xml').set('Content-Length', Buffer.byteLength(xml)).send(xml);
}
-
diff --git a/src/routes/helpers.js b/src/routes/helpers.js
index 0d27f5a3a7..0aae67cbec 100644
--- a/src/routes/helpers.js
+++ b/src/routes/helpers.js
@@ -14,5 +14,4 @@ helpers.setupAdminPageRoute = function (router, name, middleware, middlewares, c
router.get('/api' + name, middlewares, controller);
};
-
-module.exports = helpers;
\ No newline at end of file
+module.exports = helpers;
diff --git a/src/routes/index.js b/src/routes/index.js
index 144bb1263e..f1a833fbf6 100644
--- a/src/routes/index.js
+++ b/src/routes/index.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var nconf = require('nconf');
var winston = require('winston');
@@ -90,7 +90,7 @@ module.exports = function (app, middleware, hotswapIds) {
var routers = [
express.Router(), // plugin router
express.Router(), // main app router
- express.Router() // auth router
+ express.Router(), // auth router
];
var router = routers[1];
var pluginRouter = routers[0];
@@ -98,8 +98,11 @@ module.exports = function (app, middleware, hotswapIds) {
var relativePath = nconf.get('relative_path');
var ensureLoggedIn = require('connect-ensure-login');
+ var idx;
+ var x;
+
if (Array.isArray(hotswapIds) && hotswapIds.length) {
- for(var idx,x = 0; x < hotswapIds.length; x++) {
+ for (x = 0; x < hotswapIds.length; x += 1) {
idx = routers.push(express.Router()) - 1;
routers[idx].hotswapId = hotswapIds[x];
}
@@ -133,7 +136,7 @@ module.exports = function (app, middleware, hotswapIds) {
userRoutes(router, middleware, controllers);
groupRoutes(router, middleware, controllers);
- for(var x = 0; x < routers.length; x++) {
+ for (x = 0; x < routers.length; x += 1) {
app.use(relativePath, routers[x]);
}
@@ -155,7 +158,7 @@ module.exports = function (app, middleware, hotswapIds) {
if (path.resolve(__dirname, '../../public/uploads') !== nconf.get('upload_path')) {
statics.unshift({ route: '/assets/uploads', path: nconf.get('upload_path') });
}
-
+
statics.forEach(function (obj) {
app.use(relativePath + obj.route, express.static(obj.path, staticOptions));
});
@@ -181,7 +184,7 @@ module.exports = function (app, middleware, hotswapIds) {
];
app.use(relativePath, function (req, res, next) {
if (deprecatedPaths.some(function (path) { return req.path.startsWith(path); })) {
- winston.warn('[deprecated] Accessing `' + req.path.slice(1) + '` from `/` is deprecated. ' +
+ winston.warn('[deprecated] Accessing `' + req.path.slice(1) + '` from `/` is deprecated. ' +
'Use `/assets' + req.path + '` to access this file.');
res.redirect(relativePath + '/assets' + req.path + '?' + meta.config['cache-buster']);
} else {
@@ -204,7 +207,7 @@ module.exports = function (app, middleware, hotswapIds) {
async.series([
async.apply(plugins.reloadRoutes),
async.apply(authRoutes.reloadRoutes),
- async.apply(user.addInterstitials)
+ async.apply(user.addInterstitials),
], function (err) {
if (err) {
return winston.error(err);
diff --git a/src/routes/meta.js b/src/routes/meta.js
index cb089f1200..cfeeac5b9b 100644
--- a/src/routes/meta.js
+++ b/src/routes/meta.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
module.exports = function (app, middleware, controllers) {
app.get('/sitemap.xml', controllers.sitemap.render);
diff --git a/src/search.js b/src/search.js
index bd1fde947d..771356c19d 100644
--- a/src/search.js
+++ b/src/search.js
@@ -17,7 +17,6 @@ var search = {};
module.exports = search;
search.search = function (data, callback) {
-
var start = process.hrtime();
var searchIn = data.searchIn || 'titlesposts';
@@ -37,7 +36,7 @@ search.search = function (data, callback) {
result.search_query = validator.escape(String(data.query || ''));
result.time = (process.elapsedTimeSince(start) / 1000).toFixed(2);
next(null, result);
- }
+ },
], callback);
};
@@ -49,7 +48,7 @@ function searchInContent(data, callback) {
},
searchUids: function (next) {
getSearchUids(data, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -69,7 +68,7 @@ function searchInContent(data, callback) {
} else {
next(null, []);
}
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -77,7 +76,7 @@ function searchInContent(data, callback) {
var matchCount = 0;
if (!results || (!results.pids.length && !results.tids.length)) {
- return callback(null, {posts: [], matchCount: matchCount, pageCount: 1});
+ return callback(null, { posts: [], matchCount: matchCount, pageCount: 1 });
}
async.waterfall([
@@ -106,8 +105,8 @@ function searchInContent(data, callback) {
posts.getPostSummaryByPids(pids, data.uid, {}, next);
},
function (posts, next) {
- next(null, {posts: posts, matchCount: matchCount, pageCount: Math.max(1, Math.ceil(parseInt(matchCount, 10) / 10))});
- }
+ next(null, { posts: posts, matchCount: matchCount, pageCount: Math.max(1, Math.ceil(parseInt(matchCount, 10) / 10)) });
+ },
], callback);
});
});
@@ -227,9 +226,9 @@ function getMatchedPosts(pids, data, callback) {
} else {
setImmediate(next);
}
- }
+ },
}, next);
- }
+ },
], function (err, results) {
if (err) {
return next(err);
@@ -249,11 +248,10 @@ function getMatchedPosts(pids, data, callback) {
next(null, topicsData);
});
- }
+ },
}, next);
},
function (results, next) {
-
posts.forEach(function (post, index) {
if (results.topics && results.topics[index]) {
post.topic = results.topics[index];
@@ -275,7 +273,7 @@ function getMatchedPosts(pids, data, callback) {
});
next(null, posts);
- }
+ },
], callback);
}
@@ -296,7 +294,7 @@ function filterByPostcount(posts, postCount, repliesFilter) {
}
function filterByTimerange(posts, timeRange, timeFilter) {
- timeRange = parseInt(timeRange) * 1000;
+ timeRange = parseInt(timeRange, 10) * 1000;
if (timeRange) {
var time = Date.now() - timeRange;
if (timeFilter === 'newer') {
@@ -380,7 +378,7 @@ function getSearchCids(data, callback) {
},
function (cids, next) {
privileges.categories.filterCids('read', cids, data.uid, next);
- }
+ },
], callback);
return;
}
@@ -399,7 +397,7 @@ function getSearchCids(data, callback) {
} else {
next(null, []);
}
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -424,10 +422,10 @@ function getChildrenCids(cids, uid, callback) {
childrenCategories.forEach(function (childrens) {
categories.flattenCategories(allCategories, childrens);
- childrenCids = childrenCids.concat(allCategories.map(function (category) {
- return category && category.cid;
- }));
- });
+ childrenCids = childrenCids.concat(allCategories.map(function (category) {
+ return category && category.cid;
+ }));
+ });
callback(null, childrenCids);
});
@@ -446,7 +444,7 @@ search.searchQuery = function (index, content, cids, uids, callback) {
index: index,
content: content,
cid: cids,
- uid: uids
+ uid: uids,
}, callback);
};
diff --git a/src/settings.js b/src/settings.js
index 6f6cad2854..b9642c0dce 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -1,9 +1,13 @@
-"use strict";
+'use strict';
var meta = require('./meta');
function expandObjBy(obj1, obj2) {
- var key, val1, val2, xorValIsArray, changed = false;
+ var key;
+ var val1;
+ var val2;
+ var xorValIsArray;
+ var changed = false;
for (key in obj2) {
if (obj2.hasOwnProperty(key)) {
val2 = obj2[key];
@@ -23,7 +27,8 @@ function expandObjBy(obj1, obj2) {
}
function trim(obj1, obj2) {
- var key, val1;
+ var key;
+ var val1;
for (key in obj1) {
if (obj1.hasOwnProperty(key)) {
val1 = obj1[key];
@@ -106,8 +111,8 @@ Settings.prototype.sync = function (callback) {
@param callback Gets called when done.
*/
Settings.prototype.persist = function (callback) {
- var conf = this.cfg._,
- _this = this;
+ var conf = this.cfg._;
+ var _this = this;
if (typeof conf === 'object') {
conf = JSON.stringify(conf);
}
@@ -126,19 +131,19 @@ Settings.prototype.persist = function (callback) {
@returns Object The setting to be used.
*/
Settings.prototype.get = function (key, def) {
- var obj = this.cfg._,
- parts = (key || '').split('.'),
- part;
- for (var i = 0; i < parts.length; i++) {
+ var obj = this.cfg._;
+ var parts = (key || '').split('.');
+ var part;
+ for (var i = 0; i < parts.length; i += 1) {
part = parts[i];
if (part && obj != null) {
obj = obj[part];
}
}
- if (obj === void 0) {
- if (def === void 0) {
+ if (obj === undefined) {
+ if (def === undefined) {
def = this.defCfg;
- for (var j = 0; j < parts.length; j++) {
+ for (var j = 0; j < parts.length; j += 1) {
part = parts[j];
if (part && def != null) {
def = def[part];
@@ -165,7 +170,7 @@ Settings.prototype.getWrapper = function () {
Settings.prototype.createWrapper = function (version, settings) {
return {
v: version,
- _: settings
+ _: settings,
};
};
@@ -183,15 +188,18 @@ Settings.prototype.createDefaultWrapper = function () {
@param val The value to set.
*/
Settings.prototype.set = function (key, val) {
- var part, obj, parts;
+ var part;
+ var obj;
+ var parts;
this.cfg.v = this.version;
if (val == null || !key) {
this.cfg._ = val || key;
} else {
obj = this.cfg._;
parts = key.split('.');
- for (var i = 0, _len = parts.length - 1; i < _len; i++) {
- if (part = parts[i]) {
+ for (var i = 0, _len = parts.length - 1; i < _len; i += 1) {
+ part = parts[i];
+ if (part) {
if (!obj.hasOwnProperty(part)) {
obj[part] = {};
}
diff --git a/src/sitemap.js b/src/sitemap.js
index ec068d71d3..d6f6fa39fe 100644
--- a/src/sitemap.js
+++ b/src/sitemap.js
@@ -14,23 +14,23 @@ var utils = require('../public/src/utils');
var sitemap = {
maps: {
- topics: []
- }
+ topics: [],
+ },
};
sitemap.render = function (callback) {
var numTopics = parseInt(meta.config.sitemapTopics, 10) || 500;
var returnData = {
- url: nconf.get('url'),
- topics: []
- };
+ url: nconf.get('url'),
+ topics: [],
+ };
var numPages;
async.waterfall([
async.apply(db.getSortedSetRange, 'topics:recent', 0, -1),
function (tids, next) {
privileges.topics.filterTids('read', tids, 0, next);
- }
+ },
], function (err, tids) {
if (err) {
numPages = 1;
@@ -38,7 +38,7 @@ sitemap.render = function (callback) {
numPages = Math.ceil(tids.length / numTopics);
}
- for(var x = 1; x <= numPages; x++) {
+ for (var x = 1; x <= numPages; x += 1) {
returnData.topics.push(x);
}
@@ -55,31 +55,31 @@ sitemap.getPages = function (callback) {
}
var urls = [{
- url: '',
- changefreq: 'weekly',
- priority: 0.6
- }, {
- url: '/recent',
- changefreq: 'daily',
- priority: 0.4
- }, {
- url: '/users',
- changefreq: 'daily',
- priority: 0.4
- }, {
- url: '/groups',
- changefreq: 'daily',
- priority: 0.4
- }];
-
- plugins.fireHook('filter:sitemap.getPages', {urls: urls}, function (err, data) {
+ url: '',
+ changefreq: 'weekly',
+ priority: 0.6,
+ }, {
+ url: '/recent',
+ changefreq: 'daily',
+ priority: 0.4,
+ }, {
+ url: '/users',
+ changefreq: 'daily',
+ priority: 0.4,
+ }, {
+ url: '/groups',
+ changefreq: 'daily',
+ priority: 0.4,
+ }];
+
+ plugins.fireHook('filter:sitemap.getPages', { urls: urls }, function (err, data) {
if (err) {
return callback(err);
}
sitemap.maps.pages = sm.createSitemap({
hostname: nconf.get('url'),
cacheTime: 1000 * 60 * 60 * 24, // Cached for 24 hours
- urls: data.urls
+ urls: data.urls,
});
sitemap.maps.pages.toXML(callback);
@@ -105,7 +105,7 @@ sitemap.getCategories = function (callback) {
categoryUrls.push({
url: '/category/' + category.slug,
changefreq: 'weekly',
- priority: 0.4
+ priority: 0.4,
});
}
});
@@ -113,7 +113,7 @@ sitemap.getCategories = function (callback) {
sitemap.maps.categories = sm.createSitemap({
hostname: nconf.get('url'),
cacheTime: 1000 * 60 * 60 * 24, // Cached for 24 hours
- urls: categoryUrls
+ urls: categoryUrls,
});
sitemap.maps.categories.toXML(callback);
@@ -147,7 +147,7 @@ sitemap.getTopicPage = function (page, callback) {
},
function (tids, next) {
topics.getTopicsFields(tids, ['tid', 'title', 'slug', 'lastposttime'], next);
- }
+ },
], function (err, topics) {
if (err) {
return callback(err);
@@ -159,7 +159,7 @@ sitemap.getTopicPage = function (page, callback) {
url: '/topic/' + topic.slug,
lastmodISO: utils.toISOString(topic.lastposttime),
changefreq: 'daily',
- priority: 0.6
+ priority: 0.6,
});
}
});
@@ -167,7 +167,7 @@ sitemap.getTopicPage = function (page, callback) {
sitemap.maps.topics[page - 1] = sm.createSitemap({
hostname: nconf.get('url'),
cacheTime: 1000 * 60 * 60, // Cached for 1 hour
- urls: topicUrls
+ urls: topicUrls,
});
sitemap.maps.topics[page - 1].toXML(callback);
diff --git a/src/social.js b/src/social.js
index 0c71daadba..71780b5b81 100644
--- a/src/social.js
+++ b/src/social.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var plugins = require('./plugins');
var db = require('./database');
@@ -15,20 +15,20 @@ social.getPostSharing = function (callback) {
var networks = [
{
- id: "facebook",
- name: "Facebook",
- class: "fa-facebook"
+ id: 'facebook',
+ name: 'Facebook',
+ class: 'fa-facebook',
},
{
- id: "twitter",
- name: "Twitter",
- class: "fa-twitter"
+ id: 'twitter',
+ name: 'Twitter',
+ class: 'fa-twitter',
},
{
- id: "google",
- name: "Google+",
- class: "fa-google-plus"
- }
+ id: 'google',
+ name: 'Google+',
+ class: 'fa-google-plus',
+ },
];
async.waterfall([
@@ -48,7 +48,7 @@ social.getPostSharing = function (callback) {
social.postSharing = networks;
next(null, networks);
});
- }
+ },
], callback);
};
@@ -78,8 +78,8 @@ social.setActivePostSharingNetworks = function (networkIDs, callback) {
function (next) {
social.postSharing = null;
next();
- }
+ },
], callback);
};
-module.exports = social;
\ No newline at end of file
+module.exports = social;
diff --git a/src/socket.io/admin.js b/src/socket.io/admin.js
index 807abe25ef..44a44f28e7 100644
--- a/src/socket.io/admin.js
+++ b/src/socket.io/admin.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var winston = require('winston');
@@ -33,7 +33,7 @@ var SocketAdmin = {
email: {},
analytics: {},
logs: {},
- errors: {}
+ errors: {},
};
SocketAdmin.before = function (socket, method, data, next) {
@@ -50,7 +50,7 @@ SocketAdmin.reload = function (socket, data, callback) {
events.log({
type: 'restart',
uid: socket.uid,
- ip: socket.ip
+ ip: socket.ip,
});
meta.restart();
callback();
@@ -65,13 +65,13 @@ SocketAdmin.restart = function (socket, data, callback) {
events.log({
type: 'build',
uid: socket.uid,
- ip: socket.ip
+ ip: socket.ip,
});
events.log({
type: 'restart',
uid: socket.uid,
- ip: socket.ip
+ ip: socket.ip,
});
meta.restart();
@@ -166,15 +166,15 @@ SocketAdmin.config.setMultiple = function (socket, data, callback) {
if (data.hasOwnProperty(field)) {
setting = {
key: field,
- value: data[field]
+ value: data[field],
};
-
- logger.monitorConfig({io: index.server}, setting);
+ plugins.fireHook('action:config.set', setting);
+ logger.monitorConfig({ io: index.server }, setting);
}
}
- plugins.fireHook('action:config.set', {settings: data});
+ plugins.fireHook('action:config.set', { settings: data });
setImmediate(next);
- }
+ },
], callback);
};
@@ -200,7 +200,7 @@ SocketAdmin.email.test = function (socket, data, callback) {
emailer.send(data.template, socket.uid, {
subject: '[' + site_title + '] Test Email',
site_title: site_title,
- url: nconf.get('url')
+ url: nconf.get('url'),
}, callback);
};
@@ -231,9 +231,9 @@ SocketAdmin.analytics.get = function (socket, data, callback) {
},
monthlyPageViews: function (next) {
analytics.getMonthlyPageViews(next);
- }
+ },
}, function (err, data) {
- data.pastDay = data.pageviews.reduce(function (a, b) {return parseInt(a, 10) + parseInt(b, 10);});
+ data.pastDay = data.pageviews.reduce(function (a, b) { return parseInt(a, 10) + parseInt(b, 10); });
data.pageviews[data.pageviews.length - 1] = parseInt(data.pageviews[data.pageviews.length - 1], 10) + analytics.getUnwrittenPageviews();
callback(err, data);
});
diff --git a/src/socket.io/admin/categories.js b/src/socket.io/admin/categories.js
index e05f6db36e..50c2061038 100644
--- a/src/socket.io/admin/categories.js
+++ b/src/socket.io/admin/categories.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
@@ -22,12 +22,12 @@ Categories.getAll = function (socket, data, callback) {
async.apply(db.getSortedSetRange, 'categories:cid', 0, -1),
async.apply(categories.getCategoriesData),
function (categories, next) {
- //Hook changes, there is no req, and res
- plugins.fireHook('filter:admin.categories.get', {categories: categories}, next);
+ // Hook changes, there is no req, and res
+ plugins.fireHook('filter:admin.categories.get', { categories: categories }, next);
},
function (result, next) {
next(null, categories.getTree(result.categories, 0));
- }
+ },
], function (err, categoriesTree) {
if (err) {
return callback(err);
@@ -103,4 +103,4 @@ Categories.copyPrivilegesFrom = function (socket, data, callback) {
categories.copyPrivilegesFrom(data.fromCid, data.toCid, callback);
};
-module.exports = Categories;
\ No newline at end of file
+module.exports = Categories;
diff --git a/src/socket.io/admin/groups.js b/src/socket.io/admin/groups.js
index 6b9e404ae1..fdb50e0561 100644
--- a/src/socket.io/admin/groups.js
+++ b/src/socket.io/admin/groups.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var groups = require('../../groups');
@@ -15,7 +15,7 @@ Groups.create = function (socket, data, callback) {
groups.create({
name: data.name,
description: data.description,
- ownerUid: socket.uid
+ ownerUid: socket.uid,
}, callback);
};
@@ -33,7 +33,7 @@ Groups.join = function (socket, data, callback) {
return next(new Error('[[error:group-already-member]]'));
}
groups.join(data.groupName, data.uid, next);
- }
+ },
], callback);
};
@@ -55,7 +55,7 @@ Groups.leave = function (socket, data, callback) {
return next(new Error('[[error:group-not-member]]'));
}
groups.leave(data.groupName, data.uid, next);
- }
+ },
], callback);
};
@@ -67,4 +67,4 @@ Groups.update = function (socket, data, callback) {
groups.update(data.groupName, data.values, callback);
};
-module.exports = Groups;
\ No newline at end of file
+module.exports = Groups;
diff --git a/src/socket.io/admin/navigation.js b/src/socket.io/admin/navigation.js
index 2f4d9817b4..807b10ae85 100644
--- a/src/socket.io/admin/navigation.js
+++ b/src/socket.io/admin/navigation.js
@@ -1,10 +1,10 @@
-"use strict";
+'use strict';
-var navigationAdmin = require('../../navigation/admin'),
- SocketNavigation = {};
+var navigationAdmin = require('../../navigation/admin');
+var SocketNavigation = {};
SocketNavigation.save = function (socket, data, callback) {
navigationAdmin.save(data, callback);
};
-module.exports = SocketNavigation;
\ No newline at end of file
+module.exports = SocketNavigation;
diff --git a/src/socket.io/admin/rewards.js b/src/socket.io/admin/rewards.js
index 3d895a5281..8b845a33c1 100644
--- a/src/socket.io/admin/rewards.js
+++ b/src/socket.io/admin/rewards.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var rewardsAdmin = require('../../rewards/admin');
var SocketRewards = module.exports;
diff --git a/src/socket.io/admin/rooms.js b/src/socket.io/admin/rooms.js
index 2f6ab50698..544bdc04da 100644
--- a/src/socket.io/admin/rooms.js
+++ b/src/socket.io/admin/rooms.js
@@ -13,7 +13,7 @@ var stats = {};
var totals = {};
var SocketRooms = {
stats: stats,
- totals: totals
+ totals: totals,
};
@@ -22,7 +22,7 @@ pubsub.on('sync:stats:start', function () {
if (err) {
return winston.error(err);
}
- pubsub.publish('sync:stats:end', {stats: stats, id: os.hostname() + ':' + nconf.get('port')});
+ pubsub.publish('sync:stats:end', { stats: stats, id: os.hostname() + ':' + nconf.get('port') });
});
});
@@ -66,7 +66,7 @@ SocketRooms.getAll = function (socket, data, callback) {
recent: 0,
unread: 0,
topics: 0,
- category: 0
+ category: 0,
};
for (var instance in stats) {
@@ -81,7 +81,7 @@ SocketRooms.getAll = function (socket, data, callback) {
totals.users.category += stats[instance].users.category;
stats[instance].topics.forEach(function (topic) {
- totals.topics[topic.tid] = totals.topics[topic.tid] || {count: 0, tid: topic.tid};
+ totals.topics[topic.tid] = totals.topics[topic.tid] || { count: 0, tid: topic.tid };
totals.topics[topic.tid].count += topic.count;
});
}
@@ -89,7 +89,7 @@ SocketRooms.getAll = function (socket, data, callback) {
var topTenTopics = [];
Object.keys(totals.topics).forEach(function (tid) {
- topTenTopics.push({tid: tid, count: totals.topics[tid].count});
+ topTenTopics.push({ tid: tid, count: totals.topics[tid].count });
});
topTenTopics = topTenTopics.sort(function (a, b) {
@@ -109,11 +109,11 @@ SocketRooms.getAll = function (socket, data, callback) {
topTenTopics.forEach(function (topic, index) {
totals.topics[topic.tid] = {
value: topic.count || 0,
- title: validator.escape(String(titles[index].title))
+ title: validator.escape(String(titles[index].title)),
};
});
next(null, totals);
- }
+ },
], callback);
};
@@ -123,7 +123,7 @@ SocketRooms.getOnlineUserCount = function (io) {
if (io) {
for (var key in io.sockets.adapter.rooms) {
if (io.sockets.adapter.rooms.hasOwnProperty(key) && key.startsWith('uid_')) {
- ++ count;
+ count += 1;
}
}
}
@@ -143,9 +143,9 @@ SocketRooms.getLocalStats = function (callback) {
recent: 0,
unread: 0,
topics: 0,
- category: 0
+ category: 0,
},
- topics: {}
+ topics: {},
};
if (io) {
@@ -165,7 +165,7 @@ SocketRooms.getLocalStats = function (callback) {
tid = room.match(/^topic_(\d+)/);
if (tid) {
socketData.users.topics += roomClients[room].length;
- topTenTopics.push({tid: tid[1], count: roomClients[room].length});
+ topTenTopics.push({ tid: tid[1], count: roomClients[room].length });
} else if (room.match(/^category/)) {
socketData.users.category += roomClients[room].length;
}
@@ -183,4 +183,4 @@ SocketRooms.getLocalStats = function (callback) {
};
-module.exports = SocketRooms;
\ No newline at end of file
+module.exports = SocketRooms;
diff --git a/src/socket.io/admin/social.js b/src/socket.io/admin/social.js
index 77227ea760..5f422eff6b 100644
--- a/src/socket.io/admin/social.js
+++ b/src/socket.io/admin/social.js
@@ -1,10 +1,10 @@
-"use strict";
+'use strict';
-var social = require('../../social'),
- SocketSocial = {};
+var social = require('../../social');
+var SocketSocial = {};
SocketSocial.savePostSharingNetworks = function (socket, data, callback) {
social.setActivePostSharingNetworks(data, callback);
};
-module.exports = SocketSocial;
\ No newline at end of file
+module.exports = SocketSocial;
diff --git a/src/socket.io/admin/tags.js b/src/socket.io/admin/tags.js
index 4362159502..8fe50790eb 100644
--- a/src/socket.io/admin/tags.js
+++ b/src/socket.io/admin/tags.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var topics = require('../../topics');
diff --git a/src/socket.io/admin/user.js b/src/socket.io/admin/user.js
index 480ad6a4d5..cf002001cb 100644
--- a/src/socket.io/admin/user.js
+++ b/src/socket.io/admin/user.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var validator = require('validator');
@@ -13,7 +13,7 @@ var plugins = require('../../plugins');
var User = {};
User.makeAdmins = function (socket, uids, callback) {
- if(!Array.isArray(uids)) {
+ if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
@@ -22,7 +22,7 @@ User.makeAdmins = function (socket, uids, callback) {
return callback(err);
}
- for(var i = 0; i < userData.length; i++) {
+ for (var i = 0; i < userData.length; i += 1) {
if (userData[i] && parseInt(userData[i].banned, 10) === 1) {
return callback(new Error('[[error:cant-make-banned-users-admin]]'));
}
@@ -35,7 +35,7 @@ User.makeAdmins = function (socket, uids, callback) {
};
User.removeAdmins = function (socket, uids, callback) {
- if(!Array.isArray(uids)) {
+ if (!Array.isArray(uids)) {
return callback(new Error('[[error:invalid-data]]'));
}
@@ -109,7 +109,7 @@ User.sendValidationEmail = function (socket, uids, callback) {
next();
}
}, next);
- }
+ },
], callback);
};
@@ -169,17 +169,17 @@ function deleteUsers(socket, uids, method, callback) {
type: 'user-delete',
uid: socket.uid,
targetUid: uid,
- ip: socket.ip
+ ip: socket.ip,
}, next);
},
function (next) {
plugins.fireHook('action:user.delete', {
callerUid: socket.uid,
uid: uid,
- ip: socket.ip
+ ip: socket.ip,
});
next();
- }
+ },
], next);
}, callback);
}
@@ -188,7 +188,7 @@ User.search = function (socket, data, callback) {
var searchData;
async.waterfall([
function (next) {
- user.search({query: data.query, searchBy: data.searchBy, uid: socket.uid}, next);
+ user.search({ query: data.query, searchBy: data.searchBy, uid: socket.uid }, next);
},
function (_searchData, next) {
searchData = _searchData;
@@ -212,7 +212,7 @@ User.search = function (socket, data, callback) {
}
});
next(null, searchData);
- }
+ },
], callback);
};
@@ -230,10 +230,10 @@ User.acceptRegistration = function (socket, data, callback) {
type: 'registration-approved',
uid: socket.uid,
ip: socket.ip,
- targetUid: uid
+ targetUid: uid,
});
next(null, uid);
- }
+ },
], callback);
};
@@ -250,7 +250,7 @@ User.rejectRegistration = function (socket, data, callback) {
username: data.username,
});
next();
- }
+ },
], callback);
};
diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js
index 885af43516..1678b553bf 100644
--- a/src/socket.io/categories.js
+++ b/src/socket.io/categories.js
@@ -22,7 +22,7 @@ SocketCategories.get = function (socket, data, callback) {
async.apply(db.getSortedSetRange, 'categories:cid', 0, -1),
async.apply(categories.getCategoriesData),
], next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -39,12 +39,12 @@ SocketCategories.get = function (socket, data, callback) {
SocketCategories.getWatchedCategories = function (socket, data, callback) {
async.parallel({
categories: async.apply(categories.getCategoriesByPrivilege, 'cid:0:children', socket.uid, 'find'),
- ignoredCids: async.apply(user.getIgnoredCategories, socket.uid)
+ ignoredCids: async.apply(user.getIgnoredCategories, socket.uid),
}, function (err, results) {
if (err) {
return callback(err);
}
- var watchedCategories = results.categories.filter(function (category) {
+ var watchedCategories = results.categories.filter(function (category) {
return category && results.ignoredCids.indexOf(category.cid.toString()) === -1;
});
@@ -70,7 +70,7 @@ SocketCategories.loadMore = function (socket, data, callback) {
} else {
next();
}
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -94,7 +94,7 @@ SocketCategories.loadMore = function (socket, data, callback) {
var start = Math.max(0, parseInt(data.after, 10));
if (data.direction === -1) {
- start = start - (reverse ? infScrollTopicsPerPage : -infScrollTopicsPerPage);
+ start -= reverse ? infScrollTopicsPerPage : -infScrollTopicsPerPage;
}
var stop = start + infScrollTopicsPerPage - 1;
@@ -118,7 +118,7 @@ SocketCategories.loadMore = function (socket, data, callback) {
stop: stop,
uid: socket.uid,
targetUid: results.targetUid,
- settings: results.settings
+ settings: results.settings,
}, function (err, data) {
if (err) {
return callback(err);
@@ -129,7 +129,7 @@ SocketCategories.loadMore = function (socket, data, callback) {
data.privileges = results.privileges;
data.template = {
category: true,
- name: 'category'
+ name: 'category',
};
callback(null, data);
@@ -162,9 +162,9 @@ SocketCategories.getMoveCategories = function (socket, data, callback) {
},
function (cids, next) {
categories.getCategories(cids, socket.uid, next);
- }
+ },
], next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -204,16 +204,15 @@ function ignoreOrWatch(fn, socket, cid, callback) {
// filter to subcategories of cid
- var any = true;
- while (any) {
- any = false;
- categoryData.forEach(function (c) {
- if (cids.indexOf(c.cid) === -1 && cids.indexOf(c.parentCid) !== -1) {
- cids.push(c.cid);
- any = true;
- }
+ var cat;
+ do {
+ cat = categoryData.find(function (c) {
+ return cids.indexOf(c.cid) === -1 && cids.indexOf(c.parentCid) !== -1;
});
- }
+ if (cat) {
+ cids.push(cat.cid);
+ }
+ } while (cat);
async.each(cids, function (cid, next) {
fn(socket.uid, cid, next);
@@ -221,7 +220,7 @@ function ignoreOrWatch(fn, socket, cid, callback) {
},
function (next) {
topics.pushUnreadCount(socket.uid, next);
- }
+ },
], callback);
}
diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js
index 5bff7ba944..ed6cb00180 100644
--- a/src/socket.io/groups.js
+++ b/src/socket.io/groups.js
@@ -1,6 +1,6 @@
-"use strict";
+'use strict';
-var async = require('async');
+var async = require('async');
var groups = require('../groups');
var meta = require('../meta');
@@ -42,7 +42,7 @@ SocketGroups.join = function (socket, data, callback) {
async.parallel({
isAdmin: async.apply(user.isAdministrator, socket.uid),
- groupData: async.apply(groups.getGroupData, data.groupName)
+ groupData: async.apply(groups.getGroupData, data.groupName),
}, next);
},
function (results, next) {
@@ -55,7 +55,7 @@ SocketGroups.join = function (socket, data, callback) {
} else {
groups.requestMembership(data.groupName, socket.uid, next);
}
- }
+ },
], callback);
};
@@ -75,9 +75,9 @@ function isOwner(next) {
return function (socket, data, callback) {
async.parallel({
isAdmin: async.apply(user.isAdministrator, socket.uid),
- isOwner: async.apply(groups.ownership.isOwner, socket.uid, data.groupName)
+ isOwner: async.apply(groups.ownership.isOwner, socket.uid, data.groupName),
}, function (err, results) {
- if (err || (!isOwner && !results.isAdmin)) {
+ if (err || (!results.isOwner && !results.isAdmin)) {
return callback(err || new Error('[[error:no-privileges]]'));
}
next(socket, data, callback);
@@ -129,7 +129,7 @@ function acceptRejectAll(method, socket, data, callback) {
async.each(uids, function (uid, next) {
method(data.groupName, uid, next);
}, next);
- }
+ },
], callback);
}
@@ -141,22 +141,25 @@ SocketGroups.issueMassInvite = isOwner(function (socket, data, callback) {
if (!data || !data.usernames || !data.groupName) {
return callback(new Error('[[error:invalid-data]]'));
}
- var usernames = data.usernames.split(',');
+ var usernames = String(data.usernames).split(',');
usernames = usernames.map(function (username) {
return username && username.trim();
});
- user.getUidsByUsernames(usernames, function (err, uids) {
- if (err) {
- return callback(err);
- }
- uids = uids.filter(function (uid) {
- return !!uid && parseInt(uid, 10);
- });
- async.eachSeries(uids, function (uid, next) {
- groups.invite(data.groupName, uid, next);
- }, callback);
- });
+ async.waterfall([
+ function (next) {
+ user.getUidsByUsernames(usernames, next);
+ },
+ function (uids, next) {
+ uids = uids.filter(function (uid) {
+ return !!uid && parseInt(uid, 10);
+ });
+
+ async.eachSeries(uids, function (uid, next) {
+ groups.invite(data.groupName, uid, next);
+ }, next);
+ },
+ ], callback);
});
SocketGroups.rescindInvite = isOwner(function (socket, data, callback) {
@@ -181,13 +184,14 @@ SocketGroups.kick = isOwner(function (socket, data, callback) {
return callback(new Error('[[error:cant-kick-self]]'));
}
- groups.ownership.isOwner(data.uid, data.groupName, function (err, isOwner) {
- if (err) {
- return callback(err);
- }
- groups.kick(data.uid, data.groupName, isOwner, callback);
- });
-
+ async.waterfall([
+ function (next) {
+ groups.ownership.isOwner(data.uid, data.groupName, next);
+ },
+ function (isOwner, next) {
+ groups.kick(data.uid, data.groupName, isOwner, next);
+ },
+ ], callback);
});
SocketGroups.create = function (socket, data, callback) {
@@ -199,32 +203,19 @@ SocketGroups.create = function (socket, data, callback) {
return callback(new Error('[[error:invalid-group-name]]'));
}
-
data.ownerUid = socket.uid;
groups.create(data, callback);
};
-SocketGroups.delete = function (socket, data, callback) {
+SocketGroups.delete = isOwner(function (socket, data, callback) {
if (data.groupName === 'administrators' ||
data.groupName === 'registered-users' ||
data.groupName === 'Global Moderators') {
return callback(new Error('[[error:not-allowed]]'));
}
- async.parallel({
- isOwner: async.apply(groups.ownership.isOwner, socket.uid, data.groupName),
- isAdmin: async.apply(user.isAdministrator, socket.uid)
- }, function (err, checks) {
- if (err) {
- return callback(err);
- }
- if (!checks.isOwner && !checks.isAdmin) {
- return callback(new Error('[[error:no-privileges]]'));
- }
-
- groups.destroy(data.groupName, callback);
- });
-};
+ groups.destroy(data.groupName, callback);
+});
SocketGroups.search = function (socket, data, callback) {
data.options = data.options || {};
@@ -241,8 +232,8 @@ SocketGroups.search = function (socket, data, callback) {
};
SocketGroups.loadMore = function (socket, data, callback) {
- if (!data.sort || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) {
- return callback();
+ if (!data.sort || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) {
+ return callback(new Error('[[error:invalid-data]]'));
}
var groupsPerPage = 9;
@@ -261,13 +252,17 @@ SocketGroups.loadMoreMembers = function (socket, data, callback) {
return callback(new Error('[[error:invalid-data]]'));
}
data.after = parseInt(data.after, 10);
- user.getUsersFromSet('group:' + data.groupName + ':members', socket.uid, data.after, data.after + 9, function (err, users) {
- if (err) {
- return callback(err);
- }
-
- callback(null, {users: users, nextStart: data.after + 10});
- });
+ async.waterfall([
+ function (next) {
+ user.getUsersFromSet('group:' + data.groupName + ':members', socket.uid, data.after, data.after + 9, next);
+ },
+ function (users, next) {
+ next(null, {
+ users: users,
+ nextStart: data.after + 10,
+ });
+ },
+ ], callback);
};
SocketGroups.cover = {};
@@ -287,7 +282,7 @@ SocketGroups.cover.update = function (socket, data, callback) {
}
groups.updateCover(socket.uid, data, next);
- }
+ },
], callback);
};
@@ -306,7 +301,7 @@ SocketGroups.cover.remove = function (socket, data, callback) {
}
groups.removeCover(data, next);
- }
+ },
], callback);
};
diff --git a/src/socket.io/helpers.js b/src/socket.io/helpers.js
index 54c8152199..ce2ee7b30c 100644
--- a/src/socket.io/helpers.js
+++ b/src/socket.io/helpers.js
@@ -32,8 +32,8 @@ SocketHelpers.notifyNew = function (uid, type, result) {
filterTidCidIgnorers(uids, result.posts[0].topic.tid, result.posts[0].topic.cid, next);
},
function (uids, next) {
- plugins.fireHook('filter:sockets.sendNewPostToUids', {uidsTo: uids, uidFrom: uid, type: type}, next);
- }
+ plugins.fireHook('filter:sockets.sendNewPostToUids', { uidsTo: uids, uidFrom: uid, type: type }, next);
+ },
], function (err, data) {
if (err) {
return winston.error(err.stack);
@@ -64,7 +64,7 @@ function filterTidCidIgnorers(uids, tid, cid, callback) {
},
categoryIgnored: function (next) {
db.sortedSetScores('cid:' + cid + ':ignorers', uids, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -73,7 +73,7 @@ function filterTidCidIgnorers(uids, tid, cid, callback) {
(!results.topicFollowed[index] && !results.topicIgnored[index] && !results.categoryIgnored[index]);
});
next(null, uids);
- }
+ },
], callback);
}
@@ -98,7 +98,7 @@ SocketHelpers.sendNotificationToPostOwner = function (pid, fromuid, command, not
async.parallel({
username: async.apply(user.getUserField, fromuid, 'username'),
topicTitle: async.apply(topics.getTopicField, postData.tid, 'title'),
- postObj: async.apply(posts.parsePost, postData)
+ postObj: async.apply(posts.parsePost, postData),
}, next);
},
function (results, next) {
@@ -113,9 +113,9 @@ SocketHelpers.sendNotificationToPostOwner = function (pid, fromuid, command, not
nid: command + ':post:' + pid + ':uid:' + fromuid,
from: fromuid,
mergeId: notification + '|' + pid,
- topicTitle: results.topicTitle
+ topicTitle: results.topicTitle,
}, next);
- }
+ },
], function (err, notification) {
if (err) {
return winston.error(err);
@@ -154,9 +154,9 @@ SocketHelpers.sendNotificationToTopicOwner = function (tid, fromuid, command, no
bodyShort: '[[' + notification + ', ' + results.username + ', ' + titleEscaped + ']]',
path: '/topic/' + results.topicData.slug,
nid: command + ':tid:' + tid + ':uid:' + fromuid,
- from: fromuid
+ from: fromuid,
}, next);
- }
+ },
], function (err, notification) {
if (err) {
return winston.error(err);
diff --git a/src/socket.io/index.js b/src/socket.io/index.js
index 0097a25950..a52841e57c 100644
--- a/src/socket.io/index.js
+++ b/src/socket.io/index.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var nconf = require('nconf');
@@ -23,7 +23,7 @@ Sockets.init = function (server) {
var SocketIO = require('socket.io');
var socketioWildcard = require('socketio-wildcard')();
io = new SocketIO({
- path: nconf.get('relative_path') + '/socket.io'
+ path: nconf.get('relative_path') + '/socket.io',
});
addRedisAdapter(io);
@@ -56,7 +56,7 @@ Sockets.init = function (server) {
}
io.listen(server, {
- transports: nconf.get('socket.io:transports')
+ transports: nconf.get('socket.io:transports'),
});
Sockets.server = io;
@@ -105,16 +105,15 @@ function onMessage(socket, payload) {
var methodToCall = parts.reduce(function (prev, cur) {
if (prev !== null && prev[cur]) {
return prev[cur];
- } else {
- return null;
}
+ return null;
}, Namespaces);
if (!methodToCall) {
if (process.env.NODE_ENV === 'development') {
winston.warn('[socket.io] Unrecognized message: ' + eventName);
}
- return callback({message: '[[error:invalid-event]]'});
+ return callback({ message: '[[error:invalid-event]]' });
}
socket.previousEvents = socket.previousEvents || [];
@@ -144,15 +143,15 @@ function onMessage(socket, payload) {
},
function (next) {
methodToCall(socket, params, next);
- }
+ },
], function (err, result) {
- callback(err ? {message: err.message} : null, result);
+ callback(err ? { message: err.message } : null, result);
});
}
function requireModules() {
var modules = ['admin', 'categories', 'groups', 'meta', 'modules',
- 'notifications', 'plugins', 'posts', 'topics', 'user', 'blacklist', 'flags'
+ 'notifications', 'plugins', 'posts', 'topics', 'user', 'blacklist', 'flags',
];
modules.forEach(function (module) {
@@ -210,7 +209,7 @@ function authorize(socket, callback) {
}
next();
});
- }
+ },
], callback);
}
@@ -220,7 +219,7 @@ function addRedisAdapter(io) {
var redis = require('../database/redis');
var pub = redis.connect();
var sub = redis.connect();
- io.adapter(redisAdapter({pubClient: pub, subClient: sub}));
+ io.adapter(redisAdapter({ pubClient: pub, subClient: sub }));
} else if (nconf.get('isCluster') === 'true') {
winston.warn('[socket.io] Clustering detected, you are advised to configure Redis as a websocket store.');
}
@@ -262,8 +261,7 @@ Sockets.reqFromSocket = function (socket, payload, event) {
secure: encrypted,
url: referer,
path: referer.substr(referer.indexOf(host) + host.length),
- headers: headers
+ headers: headers,
};
};
-
diff --git a/src/socket.io/meta.js b/src/socket.io/meta.js
index baa0abc0aa..398bf249f5 100644
--- a/src/socket.io/meta.js
+++ b/src/socket.io/meta.js
@@ -5,7 +5,7 @@ var user = require('../user');
var topics = require('../topics');
var SocketMeta = {
- rooms: {}
+ rooms: {},
};
SocketMeta.reconnected = function (socket, data, callback) {
diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js
index 473a32e5d9..f0309e8d30 100644
--- a/src/socket.io/modules.js
+++ b/src/socket.io/modules.js
@@ -1,4 +1,5 @@
-"use strict";
+'use strict';
+
var async = require('async');
var validator = require('validator');
@@ -13,7 +14,7 @@ var user = require('../user');
var SocketModules = {
chats: {},
sounds: {},
- settings: {}
+ settings: {},
};
/* Chat */
@@ -31,7 +32,7 @@ SocketModules.chats.getRaw = function (socket, data, callback) {
return next(new Error('[[error:not-allowed]]'));
}
Messaging.getMessageField(data.mid, 'content', next);
- }
+ },
], callback);
};
@@ -66,7 +67,7 @@ SocketModules.chats.send = function (socket, data, callback) {
function (next) {
plugins.fireHook('filter:messaging.send', {
data: data,
- uid: socket.uid
+ uid: socket.uid,
}, function (err, results) {
data = results.data;
next(err);
@@ -82,7 +83,7 @@ SocketModules.chats.send = function (socket, data, callback) {
Messaging.notifyUsersInRoom(socket.uid, data.roomId, message);
user.updateOnlineUsers(socket.uid);
next(null, message);
- }
+ },
], callback);
};
@@ -92,9 +93,9 @@ function rateLimitExceeded(socket) {
var delay = meta.config.hasOwnProperty('chatMessageDelay') ? parseInt(meta.config.chatMessageDelay, 10) : 200;
if (now - socket.lastChatMessageTime < delay) {
return true;
- } else {
- socket.lastChatMessageTime = now;
}
+ socket.lastChatMessageTime = now;
+
return false;
}
@@ -120,7 +121,7 @@ SocketModules.chats.loadRoom = function (socket, data, callback) {
callerUid: socket.uid,
uid: data.uid || socket.uid,
roomId: data.roomId,
- isNew: false
+ isNew: false,
}),
}, next);
},
@@ -134,7 +135,7 @@ SocketModules.chats.loadRoom = function (socket, data, callback) {
results.roomData.maximumUsersInChatRoom = parseInt(meta.config.maximumUsersInChatRoom, 10) || 0;
results.roomData.showUserInput = !results.roomData.maximumUsersInChatRoom || results.roomData.maximumUsersInChatRoom > 2;
next(null, results.roomData);
- }
+ },
], callback);
};
@@ -168,7 +169,7 @@ SocketModules.chats.addUserToRoom = function (socket, data, callback) {
async.parallel({
settings: async.apply(user.getSettings, uid),
isAdminOrGlobalMod: async.apply(user.isAdminOrGlobalMod, socket.uid),
- isFollowing: async.apply(user.isFollowing, uid, socket.uid)
+ isFollowing: async.apply(user.isFollowing, uid, socket.uid),
}, next);
},
function (results, next) {
@@ -177,7 +178,7 @@ SocketModules.chats.addUserToRoom = function (socket, data, callback) {
}
Messaging.addUsersToRoom(socket.uid, [uid], data.roomId, next);
- }
+ },
], callback);
};
@@ -195,7 +196,7 @@ SocketModules.chats.removeUserFromRoom = function (socket, data, callback) {
}
Messaging.removeUsersFromRoom(socket.uid, [uid], data.roomId, next);
- }
+ },
], callback);
};
@@ -246,14 +247,14 @@ SocketModules.chats.markRead = function (socket, roomId, callback) {
}
async.parallel({
uidsInRoom: async.apply(Messaging.getUidsInRoom, roomId, 0, -1),
- markRead: async.apply(Messaging.markRead, socket.uid, roomId)
+ markRead: async.apply(Messaging.markRead, socket.uid, roomId),
}, function (err, results) {
if (err) {
return callback(err);
}
Messaging.pushUnreadCount(socket.uid);
- server.in('uid_' + socket.uid).emit('event:chats.markedAsRead', {roomId: roomId});
+ server.in('uid_' + socket.uid).emit('event:chats.markedAsRead', { roomId: roomId });
if (results.uidsInRoom.indexOf(socket.uid.toString()) === -1) {
return callback();
@@ -282,7 +283,7 @@ SocketModules.chats.markAllRead = function (socket, data, callback) {
function (next) {
Messaging.pushUnreadCount(socket.uid);
next();
- }
+ },
], callback);
};
@@ -299,12 +300,12 @@ SocketModules.chats.renameRoom = function (socket, data, callback) {
Messaging.getUidsInRoom(data.roomId, 0, -1, next);
},
function (uids, next) {
- var eventData = {roomId: data.roomId, newName: validator.escape(String(data.newName))};
+ var eventData = { roomId: data.roomId, newName: validator.escape(String(data.newName)) };
uids.forEach(function (uid) {
server.in('uid_' + uid).emit('event:chats.roomRename', eventData);
});
next();
- }
+ },
], callback);
};
@@ -334,7 +335,7 @@ SocketModules.chats.getMessages = function (socket, data, callback) {
uid: data.uid,
roomId: data.roomId,
start: parseInt(data.start, 10) || 0,
- count: 50
+ count: 50,
};
Messaging.getMessages(params, callback);
diff --git a/src/socket.io/notifications.js b/src/socket.io/notifications.js
index cc83b0b80b..66e5135ed6 100644
--- a/src/socket.io/notifications.js
+++ b/src/socket.io/notifications.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var user = require('../user');
@@ -29,8 +29,8 @@ SocketNotifs.loadMore = function (socket, data, callback) {
user.notifications.getAll(socket.uid, start, stop, next);
},
function (notifications, next) {
- next(null, {notifications: notifications, nextStart: stop});
- }
+ next(null, { notifications: notifications, nextStart: stop });
+ },
], callback);
};
diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js
index 197d90d7bf..79c19227e9 100644
--- a/src/socket.io/posts.js
+++ b/src/socket.io/posts.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
@@ -48,7 +48,7 @@ SocketPosts.reply = function (socket, data, callback) {
user.updateOnlineUsers(socket.uid);
socketHelpers.notifyNew(socket.uid, 'newPost', result);
- }
+ },
], callback);
};
@@ -68,7 +68,7 @@ SocketPosts.getRawPost = function (socket, pid, callback) {
return next(new Error('[[error:no-post]]'));
}
next(null, postData.content);
- }
+ },
], callback);
};
@@ -134,7 +134,7 @@ SocketPosts.getReplies = function (socket, pid, callback) {
},
privileges: function (next) {
privileges.posts.get(pids, socket.uid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -149,7 +149,7 @@ SocketPosts.getReplies = function (socket, pid, callback) {
posts.modifyPostByPrivilege(postData, postPrivileges.isAdminOrMod);
});
next(null, postData);
- }
+ },
], callback);
};
diff --git a/src/socket.io/posts/bookmarks.js b/src/socket.io/posts/bookmarks.js
index d0bb84256c..b77ce526a1 100644
--- a/src/socket.io/posts/bookmarks.js
+++ b/src/socket.io/posts/bookmarks.js
@@ -4,7 +4,6 @@
var helpers = require('./helpers');
module.exports = function (SocketPosts) {
-
SocketPosts.bookmark = function (socket, data, callback) {
helpers.postCommand(socket, 'bookmark', 'bookmarked', '', data, callback);
};
@@ -12,5 +11,4 @@ module.exports = function (SocketPosts) {
SocketPosts.unbookmark = function (socket, data, callback) {
helpers.postCommand(socket, 'unbookmark', 'bookmarked', '', data, callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/posts/edit.js b/src/socket.io/posts/edit.js
index 54650961f9..4d5602effe 100644
--- a/src/socket.io/posts/edit.js
+++ b/src/socket.io/posts/edit.js
@@ -11,7 +11,6 @@ var meta = require('../../meta');
var websockets = require('../index');
module.exports = function (SocketPosts) {
-
SocketPosts.edit = function (socket, data, callback) {
if (!socket.uid) {
return callback(new Error('[[error:not-logged-in]]'));
@@ -47,11 +46,11 @@ module.exports = function (SocketPosts) {
uid: socket.uid,
ip: socket.ip,
oldTitle: validator.escape(String(result.topic.oldTitle)),
- newTitle: validator.escape(String(result.topic.title))
+ newTitle: validator.escape(String(result.topic.title)),
});
}
- if (parseInt(result.post.deleted) !== 1) {
+ if (parseInt(result.post.deleted, 10) !== 1) {
websockets.in('topic_' + result.topic.tid).emit('event:post_edited', result);
return callback(null, result.post);
}
@@ -60,7 +59,7 @@ module.exports = function (SocketPosts) {
'administrators',
'Global Moderators',
'cid:' + result.topic.cid + ':privileges:mods',
- 'cid:' + result.topic.cid + ':privileges:groups:moderate'
+ 'cid:' + result.topic.cid + ':privileges:groups:moderate',
], next);
},
function (results, next) {
@@ -69,7 +68,7 @@ module.exports = function (SocketPosts) {
websockets.in('uid_' + uid).emit('event:post_edited', editResult);
});
next(null, editResult.post);
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/posts/helpers.js b/src/socket.io/posts/helpers.js
index 4c04f82afc..c7b92488d5 100644
--- a/src/socket.io/posts/helpers.js
+++ b/src/socket.io/posts/helpers.js
@@ -26,7 +26,7 @@ helpers.postCommand = function (socket, command, eventName, notification, data,
},
deleted: function (next) {
posts.getPostField(data.pid, 'deleted', next);
- }
+ },
}, next);
},
function (results, next) {
@@ -46,11 +46,11 @@ helpers.postCommand = function (socket, command, eventName, notification, data,
filter:post.bookmark
filter:post.unbookmark
*/
- plugins.fireHook('filter:post.' + command, {data: data, uid: socket.uid}, next);
+ plugins.fireHook('filter:post.' + command, { data: data, uid: socket.uid }, next);
},
function (filteredData, next) {
executeCommand(socket, command, eventName, notification, filteredData.data, next);
- }
+ },
], callback);
};
@@ -71,6 +71,6 @@ function executeCommand(socket, command, eventName, notification, data, callback
socketHelpers.rescindUpvoteNotification(data.pid, socket.uid);
}
next(null, result);
- }
+ },
], callback);
-}
\ No newline at end of file
+}
diff --git a/src/socket.io/posts/move.js b/src/socket.io/posts/move.js
index 207db2aef5..6ef596c1c2 100644
--- a/src/socket.io/posts/move.js
+++ b/src/socket.io/posts/move.js
@@ -6,7 +6,6 @@ var topics = require('../../topics');
var socketHelpers = require('../helpers');
module.exports = function (SocketPosts) {
-
SocketPosts.movePost = function (socket, data, callback) {
if (!socket.uid) {
return callback(new Error('[[error:not-logged-in]]'));
@@ -30,8 +29,7 @@ module.exports = function (SocketPosts) {
function (next) {
socketHelpers.sendNotificationToPostOwner(data.pid, socket.uid, 'move', 'notifications:moved_your_post');
next();
- }
+ },
], callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/posts/tools.js b/src/socket.io/posts/tools.js
index 571d84175b..ee393a42b9 100644
--- a/src/socket.io/posts/tools.js
+++ b/src/socket.io/posts/tools.js
@@ -13,7 +13,6 @@ var plugins = require('../../plugins');
var social = require('../../social');
module.exports = function (SocketPosts) {
-
SocketPosts.loadPostTools = function (socket, data, callback) {
if (!data || !data.pid || !data.cid) {
return callback(new Error('[[error:invalid-data]]'));
@@ -37,11 +36,11 @@ module.exports = function (SocketPosts) {
posts.hasBookmarked(data.pid, socket.uid, next);
},
tools: function (next) {
- plugins.fireHook('filter:post.tools', {pid: data.pid, uid: socket.uid, tools: []}, next);
+ plugins.fireHook('filter:post.tools', { pid: data.pid, uid: socket.uid, tools: [] }, next);
},
postSharing: function (next) {
social.getActivePostSharing(next);
- }
+ },
}, next);
},
function (results, next) {
@@ -54,7 +53,7 @@ module.exports = function (SocketPosts) {
results.posts.display_moderator_tools = results.posts.display_edit_tools || results.posts.display_delete_tools;
results.posts.display_move_tools = results.isAdminOrMod;
next(null, results);
- }
+ },
], callback);
};
@@ -85,11 +84,11 @@ module.exports = function (SocketPosts) {
type: 'post-delete',
uid: socket.uid,
pid: data.pid,
- ip: socket.ip
+ ip: socket.ip,
});
next();
- }
+ },
], callback);
};
@@ -103,18 +102,17 @@ module.exports = function (SocketPosts) {
posts.tools.restore(socket.uid, data.pid, next);
},
function (postData, next) {
-
websockets.in('topic_' + data.tid).emit('event:post_restored', postData);
events.log({
type: 'post-restore',
uid: socket.uid,
pid: data.pid,
- ip: socket.ip
+ ip: socket.ip,
});
setImmediate(next);
- }
+ },
], callback);
};
@@ -123,7 +121,7 @@ module.exports = function (SocketPosts) {
return callback(new Error('[[error:invalid-data]]'));
}
async.eachSeries(data.pids, function (pid, next) {
- SocketPosts.delete(socket, {pid: pid, tid: data.tid}, next);
+ SocketPosts.delete(socket, { pid: pid, tid: data.tid }, next);
}, callback);
};
@@ -132,7 +130,7 @@ module.exports = function (SocketPosts) {
return callback(new Error('[[error:invalid-data]]'));
}
async.eachSeries(data.pids, function (pid, next) {
- SocketPosts.purge(socket, {pid: pid, tid: data.tid}, next);
+ SocketPosts.purge(socket, { pid: pid, tid: data.tid }, next);
}, callback);
};
@@ -158,7 +156,7 @@ module.exports = function (SocketPosts) {
posts.getPostField(data.pid, 'toPid', next);
},
function (toPid, next) {
- postData = {pid: data.pid, toPid: toPid};
+ postData = { pid: data.pid, toPid: toPid };
posts.tools.purge(socket.uid, data.pid, next);
},
function (next) {
@@ -171,9 +169,9 @@ module.exports = function (SocketPosts) {
uid: socket.uid,
pid: data.pid,
ip: socket.ip,
- title: validator.escape(String(title))
+ title: validator.escape(String(title)),
}, next);
- }
+ },
], callback);
};
@@ -183,8 +181,8 @@ module.exports = function (SocketPosts) {
posts.getTopicFields(pid, ['tid', 'cid'], next);
},
function (topic, next) {
- socketTopics.doTopicAction('delete', 'event:topic_deleted', socket, {tids: [topic.tid], cid: topic.cid}, next);
- }
+ socketTopics.doTopicAction('delete', 'event:topic_deleted', socket, { tids: [topic.tid], cid: topic.cid }, next);
+ },
], callback);
}
@@ -197,8 +195,7 @@ module.exports = function (SocketPosts) {
posts.getTopicFields(pid, ['postcount'], function (err, topic) {
next(err, topic ? parseInt(topic.postcount, 10) === 1 : false);
});
- }
+ },
}, callback);
}
-
};
diff --git a/src/socket.io/posts/votes.js b/src/socket.io/posts/votes.js
index e3a9510aaa..0c12fe262d 100644
--- a/src/socket.io/posts/votes.js
+++ b/src/socket.io/posts/votes.js
@@ -9,7 +9,6 @@ var privileges = require('../../privileges');
var helpers = require('./helpers');
module.exports = function (SocketPosts) {
-
SocketPosts.getVoters = function (socket, data, callback) {
if (!data || !data.pid || !data.cid) {
return callback(new Error('[[error:invalid-data]]'));
@@ -30,7 +29,7 @@ module.exports = function (SocketPosts) {
},
downvoteUids: function (next) {
db.getSetMembers('pid:' + data.pid + ':downvote', next);
- }
+ },
}, next);
},
function (results, next) {
@@ -46,9 +45,9 @@ module.exports = function (SocketPosts) {
},
downvoteCount: function (next) {
next(null, results.downvoteUids.length);
- }
+ },
}, next);
- }
+ },
], callback);
};
@@ -62,7 +61,7 @@ module.exports = function (SocketPosts) {
return callback(err, []);
}
- async.map(data, function (uids, next) {
+ async.map(data, function (uids, next) {
var otherCount = 0;
if (uids.length > 6) {
otherCount = uids.length - 5;
@@ -71,7 +70,7 @@ module.exports = function (SocketPosts) {
user.getUsernamesByUids(uids, function (err, usernames) {
next(err, {
otherCount: otherCount,
- usernames: usernames
+ usernames: usernames,
});
});
}, callback);
@@ -89,4 +88,4 @@ module.exports = function (SocketPosts) {
SocketPosts.unvote = function (socket, data, callback) {
helpers.postCommand(socket, 'unvote', 'voted', '', data, callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js
index 2fdecf550f..5eb9ce61dd 100644
--- a/src/socket.io/topics.js
+++ b/src/socket.io/topics.js
@@ -1,8 +1,5 @@
-
'use strict';
-var async = require('async');
-
var topics = require('../topics');
var websockets = require('./index');
var user = require('../user');
@@ -33,10 +30,10 @@ SocketTopics.post = function (socket, data, callback) {
callback(null, result.topicData);
- socket.emit('event:new_post', {posts: [result.postData]});
+ socket.emit('event:new_post', { posts: [result.postData] });
socket.emit('event:new_topic', result.topicData);
- socketHelpers.notifyNew(socket.uid, 'newTopic', {posts: [result.postData], topic: result.topicData});
+ socketHelpers.notifyNew(socket.uid, 'newTopic', { posts: [result.postData], topic: result.topicData });
});
};
diff --git a/src/socket.io/topics/infinitescroll.js b/src/socket.io/topics/infinitescroll.js
index 3efa621656..71b11ce9e9 100644
--- a/src/socket.io/topics/infinitescroll.js
+++ b/src/socket.io/topics/infinitescroll.js
@@ -9,9 +9,8 @@ var utils = require('../../../public/src/utils');
var social = require('../../social');
module.exports = function (SocketTopics) {
-
SocketTopics.loadMore = function (socket, data, callback) {
- if (!data || !data.tid || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) {
+ if (!data || !data.tid || !utils.isNumber(data.after) || parseInt(data.after, 10) < 0) {
return callback(new Error('[[error:invalid-data]]'));
}
var userPrivileges;
@@ -24,7 +23,7 @@ module.exports = function (SocketTopics) {
},
topic: function (next) {
topics.getTopicFields(data.tid, ['postcount', 'deleted'], next);
- }
+ },
}, next);
},
function (results, next) {
@@ -47,12 +46,10 @@ module.exports = function (SocketTopics) {
if (reverse) {
start = results.topic.postcount - start;
}
+ } else if (reverse) {
+ start = results.topic.postcount - start - infScrollPostsPerPage - 1;
} else {
- if (reverse) {
- start = results.topic.postcount - start - infScrollPostsPerPage - 1;
- } else {
- start = start - infScrollPostsPerPage - 1;
- }
+ start = start - infScrollPostsPerPage - 1;
}
var stop = start + (infScrollPostsPerPage - 1);
@@ -72,7 +69,7 @@ module.exports = function (SocketTopics) {
},
postSharing: function (next) {
social.getActivePostSharing(next);
- }
+ },
}, next);
},
function (topicData, next) {
@@ -86,7 +83,7 @@ module.exports = function (SocketTopics) {
topics.modifyPostsByPrivilege(topicData, userPrivileges);
next(null, topicData);
- }
+ },
], callback);
};
@@ -122,5 +119,4 @@ module.exports = function (SocketTopics) {
topics.getTopicsFromSet(data.set, socket.uid, start, stop, callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/topics/move.js b/src/socket.io/topics/move.js
index 938fe22792..9faffa910b 100644
--- a/src/socket.io/topics/move.js
+++ b/src/socket.io/topics/move.js
@@ -7,7 +7,6 @@ var privileges = require('../../privileges');
var socketHelpers = require('../helpers');
module.exports = function (SocketTopics) {
-
SocketTopics.move = function (socket, data, callback) {
if (!data || !Array.isArray(data.tids) || !data.cid) {
return callback(new Error('[[error:invalid-data]]'));
@@ -30,7 +29,7 @@ module.exports = function (SocketTopics) {
topicData = _topicData;
topicData.tid = tid;
topics.tools.move(tid, data.cid, socket.uid, next);
- }
+ },
], function (err) {
if (err) {
return next(err);
@@ -66,7 +65,7 @@ module.exports = function (SocketTopics) {
async.eachLimit(tids, 50, function (tid, next) {
topics.tools.move(tid, data.cid, socket.uid, next);
}, next);
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/topics/tags.js b/src/socket.io/topics/tags.js
index 8829229ca8..0b7076fa20 100644
--- a/src/socket.io/topics/tags.js
+++ b/src/socket.io/topics/tags.js
@@ -6,7 +6,6 @@ var topics = require('../../topics');
var utils = require('../../../public/src/utils');
module.exports = function (SocketTopics) {
-
SocketTopics.isTagAllowed = function (socket, data, callback) {
if (!data || !data.cid || !data.tag) {
return callback(new Error('[[error:invalid-data]]'));
@@ -20,7 +19,7 @@ module.exports = function (SocketTopics) {
return next(null, true);
}
next(null, tagWhitelist.indexOf(data.tag) !== -1);
- }
+ },
], callback);
};
@@ -49,8 +48,8 @@ module.exports = function (SocketTopics) {
},
function (tags, next) {
tags = tags.filter(Boolean);
- next(null, {tags: tags, nextStart: stop + 1});
- }
+ next(null, { tags: tags, nextStart: stop + 1 });
+ },
], callback);
};
};
diff --git a/src/socket.io/topics/tools.js b/src/socket.io/topics/tools.js
index ede87d2599..74cdb68e7e 100644
--- a/src/socket.io/topics/tools.js
+++ b/src/socket.io/topics/tools.js
@@ -10,7 +10,6 @@ var plugins = require('../../plugins');
var socketHelpers = require('../helpers');
module.exports = function (SocketTopics) {
-
SocketTopics.loadTopicTools = function (socket, data, callback) {
if (!socket.uid) {
return callback(new Error('[[error:no-privileges]]'));
@@ -27,13 +26,13 @@ module.exports = function (SocketTopics) {
},
privileges: function (next) {
privileges.topics.get(data.tid, socket.uid, next);
- }
+ },
}, next);
},
function (results, next) {
topic = results.topic;
topic.privileges = results.privileges;
- plugins.fireHook('filter:topic.thread_tools', {topic: results.topic, uid: socket.uid, tools: []}, next);
+ plugins.fireHook('filter:topic.thread_tools', { topic: results.topic, uid: socket.uid, tools: [] }, next);
},
function (data, next) {
topic.deleted = parseInt(topic.deleted, 10) === 1;
@@ -41,7 +40,7 @@ module.exports = function (SocketTopics) {
topic.pinned = parseInt(topic.pinned, 10) === 1;
topic.thread_tools = data.tools;
next(null, topic);
- }
+ },
], callback);
};
@@ -95,7 +94,7 @@ module.exports = function (SocketTopics) {
function (data, next) {
socketHelpers.emitToTopicAndCategory(event, data);
logTopicAction(action, socket, tid, next);
- }
+ },
], next);
}, callback);
};
@@ -115,9 +114,9 @@ module.exports = function (SocketTopics) {
uid: socket.uid,
ip: socket.ip,
tid: tid,
- title: validator.escape(String(title))
+ title: validator.escape(String(title)),
}, next);
- }
+ },
], callback);
}
@@ -128,5 +127,4 @@ module.exports = function (SocketTopics) {
topics.tools.orderPinnedTopics(socket.uid, data, callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/topics/unread.js b/src/socket.io/topics/unread.js
index d5a010af14..c46aef0a12 100644
--- a/src/socket.io/topics/unread.js
+++ b/src/socket.io/topics/unread.js
@@ -6,7 +6,6 @@ var user = require('../../user');
var topics = require('../../topics');
module.exports = function (SocketTopics) {
-
SocketTopics.markAsRead = function (socket, tids, callback) {
if (!Array.isArray(tids) || !socket.uid) {
return callback(new Error('[[error:invalid-data]]'));
@@ -22,7 +21,7 @@ module.exports = function (SocketTopics) {
topics.markTopicNotificationsRead(tids, socket.uid);
}
next();
- }
+ },
], callback);
};
@@ -44,7 +43,7 @@ module.exports = function (SocketTopics) {
function (next) {
topics.pushUnreadCount(socket.uid);
next();
- }
+ },
], callback);
};
@@ -55,7 +54,7 @@ module.exports = function (SocketTopics) {
},
function (tids, next) {
SocketTopics.markAsRead(socket, tids, next);
- }
+ },
], callback);
};
@@ -70,7 +69,7 @@ module.exports = function (SocketTopics) {
function (next) {
topics.pushUnreadCount(socket.uid);
next();
- }
+ },
], callback);
};
@@ -110,14 +109,14 @@ module.exports = function (SocketTopics) {
},
function (next) {
topics.updateRecent(tid, Date.now(), next);
- }
+ },
], next);
}, next);
},
function (next) {
topics.pushUnreadCount(socket.uid);
next();
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/user.js b/src/socket.io/user.js
index 060c9e7b2e..f7208b116a 100644
--- a/src/socket.io/user.js
+++ b/src/socket.io/user.js
@@ -46,16 +46,16 @@ SocketUser.deleteAccount = function (socket, data, callback) {
user.deleteAccount(socket.uid, next);
},
function (next) {
- require('./index').server.sockets.emit('event:user_status_change', {uid: socket.uid, status: 'offline'});
+ require('./index').server.sockets.emit('event:user_status_change', { uid: socket.uid, status: 'offline' });
events.log({
type: 'user-delete',
uid: socket.uid,
targetUid: socket.uid,
- ip: socket.ip
+ ip: socket.ip,
});
next();
- }
+ },
], callback);
};
@@ -85,7 +85,7 @@ SocketUser.emailConfirm = function (socket, data, callback) {
}
user.email.sendValidationEmail(socket.uid, email, next);
- }
+ },
], callback);
};
@@ -120,7 +120,7 @@ SocketUser.reset.commit = function (socket, data, callback) {
function (next) {
async.parallel({
uid: async.apply(db.getObjectField, 'reset:uid', data.code),
- reset: async.apply(user.reset.commit, data.code, data.password)
+ reset: async.apply(user.reset.commit, data.code, data.password),
}, next);
},
function (results, next) {
@@ -128,7 +128,7 @@ SocketUser.reset.commit = function (socket, data, callback) {
events.log({
type: 'password-reset',
uid: uid,
- ip: socket.ip
+ ip: socket.ip,
});
user.getUserField(uid, 'username', next);
@@ -140,11 +140,11 @@ SocketUser.reset.commit = function (socket, data, callback) {
username: username,
date: parsedDate,
site_title: meta.config.title || 'NodeBB',
- subject: '[[email:reset.notify.subject]]'
+ subject: '[[email:reset.notify.subject]]',
});
next();
- }
+ },
], callback);
};
@@ -175,7 +175,7 @@ SocketUser.follow = function (socket, data, callback) {
nid: 'follow:' + data.uid + ':uid:' + socket.uid,
from: socket.uid,
path: '/uid/' + data.uid + '/followers',
- mergeId: 'notifications:user_started_following_you'
+ mergeId: 'notifications:user_started_following_you',
}, next);
},
function (notification, next) {
@@ -184,7 +184,7 @@ SocketUser.follow = function (socket, data, callback) {
}
notification.user = userData;
notifications.push(notification, [data.uid], next);
- }
+ },
], callback);
};
@@ -203,7 +203,7 @@ function toggleFollow(method, uid, theiruid, callback) {
plugins.fireHook('action:user.' + method, {
fromUid: uid,
- toUid: theiruid
+ toUid: theiruid,
});
callback();
});
@@ -223,7 +223,7 @@ SocketUser.saveSettings = function (socket, data, callback) {
return next(new Error('[[error:no-privileges]]'));
}
user.saveSettings(data.uid, data.settings, next);
- }
+ },
], callback);
};
@@ -257,7 +257,7 @@ SocketUser.getUnreadCounts = function (socket, data, callback) {
unreadTopicCount: async.apply(topics.getTotalUnread, socket.uid),
unreadNewTopicCount: async.apply(topics.getTotalUnread, socket.uid, 'new'),
unreadChatCount: async.apply(messaging.getUnreadCount, socket.uid),
- unreadNotificationCount: async.apply(user.notifications.getUnreadCount, socket.uid)
+ unreadNotificationCount: async.apply(user.notifications.getUnreadCount, socket.uid),
}, callback);
};
@@ -296,9 +296,9 @@ SocketUser.invite = function (socket, email, callback) {
}
user.sendInvitationEmail(socket.uid, email, next);
- }
+ },
], next);
- }
+ },
], callback);
};
@@ -339,7 +339,7 @@ SocketUser.setModerationNote = function (socket, data, callback) {
} else {
db.deleteObjectField('user:' + data.uid, 'moderationNote', next);
}
- }
+ },
], callback);
};
diff --git a/src/socket.io/user/ban.js b/src/socket.io/user/ban.js
index 089720c59e..54ce94fd24 100644
--- a/src/socket.io/user/ban.js
+++ b/src/socket.io/user/ban.js
@@ -8,7 +8,6 @@ var events = require('../../events');
var plugins = require('../../plugins');
module.exports = function (SocketUser) {
-
SocketUser.banUsers = function (socket, data, callback) {
if (!data || !Array.isArray(data.uids)) {
return callback(new Error('[[error:invalid-data]]'));
@@ -24,7 +23,7 @@ module.exports = function (SocketUser) {
type: 'user-ban',
uid: socket.uid,
targetUid: uid,
- ip: socket.ip
+ ip: socket.ip,
}, next);
},
function (next) {
@@ -32,10 +31,10 @@ module.exports = function (SocketUser) {
callerUid: socket.uid,
ip: socket.ip,
uid: uid,
- until: data.until > 0 ? data.until : undefined
+ until: data.until > 0 ? data.until : undefined,
});
next();
- }
+ },
], next);
}, callback);
};
@@ -51,17 +50,17 @@ module.exports = function (SocketUser) {
type: 'user-unban',
uid: socket.uid,
targetUid: uid,
- ip: socket.ip
+ ip: socket.ip,
}, next);
},
function (next) {
plugins.fireHook('action:user.unbanned', {
callerUid: socket.uid,
ip: socket.ip,
- uid: uid
+ uid: uid,
});
next();
- }
+ },
], next);
}, callback);
};
@@ -80,7 +79,7 @@ module.exports = function (SocketUser) {
return next(new Error('[[error:no-privileges]]'));
}
async.each(uids, method, next);
- }
+ },
], callback);
}
@@ -98,7 +97,7 @@ module.exports = function (SocketUser) {
function (next) {
websockets.in('uid_' + uid).emit('event:banned');
next();
- }
+ },
], callback);
}
};
diff --git a/src/socket.io/user/picture.js b/src/socket.io/user/picture.js
index 32be0869f8..3723699461 100644
--- a/src/socket.io/user/picture.js
+++ b/src/socket.io/user/picture.js
@@ -9,7 +9,6 @@ var user = require('../../user');
var plugins = require('../../plugins');
module.exports = function (SocketUser) {
-
SocketUser.changePicture = function (socket, data, callback) {
if (!socket.uid) {
return callback(new Error('[[error:invalid-uid]]'));
@@ -26,31 +25,31 @@ module.exports = function (SocketUser) {
user.isAdminOrGlobalModOrSelf(socket.uid, data.uid, next);
},
function (next) {
- switch(type) {
- case 'default':
- next(null, '');
- break;
- case 'uploaded':
- user.getUserField(data.uid, 'uploadedpicture', next);
- break;
- default:
- plugins.fireHook('filter:user.getPicture', {
- uid: socket.uid,
- type: type,
- picture: undefined
- }, function (err, returnData) {
- if (err) {
- return next(err);
- }
-
- next(null, returnData.picture || '');
- });
- break;
+ switch (type) {
+ case 'default':
+ next(null, '');
+ break;
+ case 'uploaded':
+ user.getUserField(data.uid, 'uploadedpicture', next);
+ break;
+ default:
+ plugins.fireHook('filter:user.getPicture', {
+ uid: socket.uid,
+ type: type,
+ picture: undefined,
+ }, function (err, returnData) {
+ if (err) {
+ return next(err);
+ }
+
+ next(null, returnData.picture || '');
+ });
+ break;
}
},
function (picture, next) {
user.setUserField(data.uid, 'picture', picture, next);
- }
+ },
], callback);
};
@@ -67,7 +66,7 @@ module.exports = function (SocketUser) {
},
function (uploadedImage, next) {
next(null, uploadedImage ? uploadedImage.url : null);
- }
+ },
], callback);
};
@@ -97,12 +96,12 @@ module.exports = function (SocketUser) {
user.setUserFields(data.uid, {
uploadedpicture: '',
- picture: userData.uploadedpicture === userData.picture ? '' : userData.picture // if current picture is uploaded picture, reset to user icon
+ picture: userData.uploadedpicture === userData.picture ? '' : userData.picture, // if current picture is uploaded picture, reset to user icon
}, next);
},
function (next) {
- plugins.fireHook('action:user.removeUploadedPicture', {callerUid: socket.uid, uid: data.uid}, next);
- }
+ plugins.fireHook('action:user.removeUploadedPicture', { callerUid: socket.uid, uid: data.uid }, next);
+ },
], callback);
};
@@ -114,9 +113,9 @@ module.exports = function (SocketUser) {
async.parallel({
list: async.apply(plugins.fireHook, 'filter:user.listPictures', {
uid: data.uid,
- pictures: []
+ pictures: [],
}),
- uploaded: async.apply(user.getUserField, data.uid, 'uploadedpicture')
+ uploaded: async.apply(user.getUserField, data.uid, 'uploadedpicture'),
}, function (err, data) {
if (err) {
return callback(err);
@@ -126,11 +125,11 @@ module.exports = function (SocketUser) {
data.list.pictures.push({
type: 'uploaded',
url: data.uploaded,
- text: '[[user:uploaded_picture]]'
+ text: '[[user:uploaded_picture]]',
});
}
callback(null, data.list.pictures);
});
};
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/user/profile.js b/src/socket.io/user/profile.js
index 0fd793322d..7f6a9de2f9 100644
--- a/src/socket.io/user/profile.js
+++ b/src/socket.io/user/profile.js
@@ -8,7 +8,6 @@ var events = require('../../events');
var privileges = require('../../privileges');
module.exports = function (SocketUser) {
-
SocketUser.changeUsernameEmail = function (socket, data, callback) {
if (!data || !data.uid || !socket.uid) {
return callback(new Error('[[error:invalid-data]]'));
@@ -20,7 +19,7 @@ module.exports = function (SocketUser) {
},
function (next) {
SocketUser.updateProfile(socket, data, next);
- }
+ },
], callback);
};
@@ -34,10 +33,10 @@ module.exports = function (SocketUser) {
},
function (next) {
user.updateCoverPicture(data, next);
- }
+ },
], callback);
};
-
+
SocketUser.uploadCroppedPicture = function (socket, data, callback) {
if (!socket.uid) {
return callback(new Error('[[error:no-privileges]]'));
@@ -48,7 +47,7 @@ module.exports = function (SocketUser) {
},
function (next) {
user.uploadCroppedPicture(data, next);
- }
+ },
], callback);
};
@@ -63,7 +62,7 @@ module.exports = function (SocketUser) {
},
function (next) {
user.removeCoverPicture(data, next);
- }
+ },
], callback);
};
@@ -77,7 +76,7 @@ module.exports = function (SocketUser) {
} else {
next(null, false);
}
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -114,7 +113,7 @@ module.exports = function (SocketUser) {
type: 'password-change',
uid: socket.uid,
targetUid: data.uid,
- ip: socket.ip
+ ip: socket.ip,
});
callback();
});
@@ -146,7 +145,7 @@ module.exports = function (SocketUser) {
},
canEdit: function (next) {
privileges.users.canEdit(socket.uid, data.uid, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -175,17 +174,15 @@ module.exports = function (SocketUser) {
}
if (userData.email !== oldUserData.email) {
- log('email-change', {oldEmail: oldUserData.email, newEmail: userData.email});
+ log('email-change', { oldEmail: oldUserData.email, newEmail: userData.email });
}
if (userData.username !== oldUserData.username) {
- log('username-change', {oldUsername: oldUserData.username, newUsername: userData.username});
+ log('username-change', { oldUsername: oldUserData.username, newUsername: userData.username });
}
next(null, userData);
- }
+ },
], callback);
};
-
-
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/user/search.js b/src/socket.io/user/search.js
index 9c3774089d..7d51ead4cf 100644
--- a/src/socket.io/user/search.js
+++ b/src/socket.io/user/search.js
@@ -5,7 +5,6 @@ var meta = require('../../meta');
var pagination = require('../../pagination');
module.exports = function (SocketUser) {
-
SocketUser.search = function (socket, data, callback) {
if (!data) {
return callback(new Error('[[error:invalid-data]]'));
@@ -21,7 +20,7 @@ module.exports = function (SocketUser) {
onlineOnly: data.onlineOnly,
bannedOnly: data.bannedOnly,
flaggedOnly: data.flaggedOnly,
- uid: socket.uid
+ uid: socket.uid,
}, function (err, result) {
if (err) {
return callback(err);
@@ -31,5 +30,4 @@ module.exports = function (SocketUser) {
callback(null, result);
});
};
-
-};
\ No newline at end of file
+};
diff --git a/src/socket.io/user/status.js b/src/socket.io/user/status.js
index b3530ffc7d..8849f0210e 100644
--- a/src/socket.io/user/status.js
+++ b/src/socket.io/user/status.js
@@ -6,7 +6,6 @@ var user = require('../../user');
var websockets = require('../index');
module.exports = function (SocketUser) {
-
SocketUser.checkStatus = function (socket, uid, callback) {
if (!socket.uid) {
return callback(new Error('[[error:invalid-uid]]'));
@@ -17,7 +16,7 @@ module.exports = function (SocketUser) {
},
function (userData, next) {
next(null, user.getStatus(userData));
- }
+ },
], callback);
};
@@ -31,7 +30,7 @@ module.exports = function (SocketUser) {
return callback(new Error('[[error:invalid-user-status]]'));
}
- var data = {status: status};
+ var data = { status: status };
if (status !== 'offline') {
data.lastonline = Date.now();
}
@@ -43,11 +42,11 @@ module.exports = function (SocketUser) {
function (next) {
var data = {
uid: socket.uid,
- status: status
+ status: status,
};
websockets.server.emit('event:user_status_change', data);
next(null, data);
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/start.js b/src/start.js
index 06ffc93589..87c0d2bf70 100644
--- a/src/start.js
+++ b/src/start.js
@@ -35,7 +35,7 @@ start.start = function () {
},
function (next) {
require('./upgrade').check(next);
- }
+ },
], function (err) {
next(err);
});
@@ -53,25 +53,25 @@ start.start = function () {
}
webserver.listen(next);
- }
+ },
], function (err) {
if (err) {
- switch(err.message) {
- case 'schema-out-of-date':
- winston.warn('Your NodeBB schema is out-of-date. Please run the following command to bring your dataset up to spec:');
- winston.warn(' ./nodebb upgrade');
- break;
- case 'dependencies-out-of-date':
- winston.warn('One or more of NodeBB\'s dependent packages are out-of-date. Please run the following command to update them:');
- winston.warn(' ./nodebb upgrade');
- break;
- case 'dependencies-missing':
- winston.warn('One or more of NodeBB\'s dependent packages are missing. Please run the following command to update them:');
- winston.warn(' ./nodebb upgrade');
- break;
- default:
- winston.error(err);
- break;
+ switch (err.message) {
+ case 'schema-out-of-date':
+ winston.warn('Your NodeBB schema is out-of-date. Please run the following command to bring your dataset up to spec:');
+ winston.warn(' ./nodebb upgrade');
+ break;
+ case 'dependencies-out-of-date':
+ winston.warn('One or more of NodeBB\'s dependent packages are out-of-date. Please run the following command to update them:');
+ winston.warn(' ./nodebb upgrade');
+ break;
+ case 'dependencies-missing':
+ winston.warn('One or more of NodeBB\'s dependent packages are missing. Please run the following command to update them:');
+ winston.warn(' ./nodebb upgrade');
+ break;
+ default:
+ winston.error(err);
+ break;
}
// Either way, bad stuff happened. Abort start.
@@ -80,7 +80,7 @@ start.start = function () {
if (process.send) {
process.send({
- action: 'listening'
+ action: 'listening',
});
}
});
@@ -126,8 +126,8 @@ function addProcessHandlers() {
var meta = require('./meta');
switch (message.action) {
- case 'reload':
- meta.reload();
+ case 'reload':
+ meta.reload();
break;
}
});
@@ -144,7 +144,7 @@ function restart() {
if (process.send) {
winston.info('[app] Restarting...');
process.send({
- action: 'restart'
+ action: 'restart',
});
} else {
winston.error('[app] Could not restart server. Shutting down.');
diff --git a/src/topics.js b/src/topics.js
index 75aeb46564..0eba6545fd 100644
--- a/src/topics.js
+++ b/src/topics.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var _ = require('underscore');
@@ -13,7 +13,6 @@ var privileges = require('./privileges');
var social = require('./social');
(function (Topics) {
-
require('./topics/data')(Topics);
require('./topics/create')(Topics);
require('./topics/delete')(Topics);
@@ -50,7 +49,7 @@ var social = require('./social');
},
function (settings, next) {
next(null, Math.ceil((parseInt(postCount, 10) - 1) / settings.postsPerPage));
- }
+ },
], callback);
};
@@ -68,8 +67,8 @@ var social = require('./social');
Topics.getTopics(tids, uid, next);
},
function (topics, next) {
- next(null, {topics: topics, nextStart: stop + 1});
- }
+ next(null, { topics: topics, nextStart: stop + 1 });
+ },
], callback);
};
@@ -80,7 +79,7 @@ var social = require('./social');
},
function (tids, next) {
Topics.getTopicsByTids(tids, uid, next);
- }
+ },
], callback);
};
@@ -89,7 +88,9 @@ var social = require('./social');
return callback(null, []);
}
- var uids, cids, topics;
+ var uids;
+ var cids;
+ var topics;
async.waterfall([
function (next) {
@@ -129,14 +130,14 @@ var social = require('./social');
},
tags: function (next) {
Topics.getTopicsTagsObjects(tids, next);
- }
+ },
}, next);
},
function (results, next) {
var users = _.object(uids, results.users);
var categories = _.object(cids, results.categories);
- for (var i = 0; i < topics.length; ++i) {
+ for (var i = 0; i < topics.length; i += 1) {
if (topics[i]) {
topics[i].category = categories[topics[i].cid];
topics[i].user = users[topics[i].uid];
@@ -160,11 +161,11 @@ var social = require('./social');
return topic && topic.category && !topic.category.disabled;
});
- plugins.fireHook('filter:topics.get', {topics: topics, uid: uid}, next);
+ plugins.fireHook('filter:topics.get', { topics: topics, uid: uid }, next);
},
function (data, next) {
next(null, data.topics);
- }
+ },
], callback);
};
@@ -174,7 +175,7 @@ var social = require('./social');
async.parallel({
posts: async.apply(getMainPostAndReplies, topicData, set, uid, start, stop, reverse),
category: async.apply(Topics.getCategoryData, topicData.tid),
- threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}),
+ threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', { topic: topicData, uid: uid, tools: [] }),
isFollowing: async.apply(Topics.isFollowing, [topicData.tid], uid),
isIgnoring: async.apply(Topics.isIgnoring, [topicData.tid], uid),
bookmark: async.apply(Topics.getUserBookmark, topicData.tid, uid),
@@ -187,9 +188,9 @@ var social = require('./social');
function (tags, next) {
topicData.tags = tags;
Topics.getRelatedTopics(topicData, uid, next);
- }
+ },
], next);
- }
+ },
}, next);
},
function (results, next) {
@@ -210,11 +211,11 @@ var social = require('./social');
topicData.icons = [];
- plugins.fireHook('filter:topic.get', {topic: topicData, uid: uid}, next);
+ plugins.fireHook('filter:topic.get', { topic: topicData, uid: uid }, next);
},
function (data, next) {
next(null, data.topic);
- }
+ },
], callback);
};
@@ -222,9 +223,9 @@ var social = require('./social');
async.waterfall([
function (next) {
if (stop > 0) {
- stop--;
+ stop -= 1;
if (start > 0) {
- start --;
+ start -= 1;
}
}
@@ -253,7 +254,7 @@ var social = require('./social');
Topics.calculatePostIndices(replies, start, stop, topic.postcount, reverse);
Topics.addPostData(posts, uid, next);
- }
+ },
], callback);
}
@@ -313,11 +314,10 @@ var social = require('./social');
if (plugins.hasListeners('filter:topic.search')) {
plugins.fireHook('filter:topic.search', {
tid: tid,
- term: term
+ term: term,
}, callback);
} else {
callback(new Error('no-plugins-available'), []);
}
};
-
}(exports));
diff --git a/src/topics/bookmarks.js b/src/topics/bookmarks.js
index 8ec80cfdcb..b47d5f2278 100644
--- a/src/topics/bookmarks.js
+++ b/src/topics/bookmarks.js
@@ -7,7 +7,6 @@ var db = require('../database');
var posts = require('../posts');
module.exports = function (Topics) {
-
Topics.getUserBookmark = function (tid, uid, callback) {
db.sortedSetScore('tid:' + tid + ':bookmarks', uid, callback);
};
@@ -44,13 +43,13 @@ module.exports = function (Topics) {
},
function (bookmarks, next) {
var forkedPosts = pids.map(function (pid) {
- return {pid: pid, tid: tid};
+ return { pid: pid, tid: tid };
});
var uidData = bookmarks.map(function (bookmark) {
return {
uid: bookmark.value,
- bookmark: bookmark.score
+ bookmark: bookmark.score,
};
});
@@ -63,8 +62,8 @@ module.exports = function (Topics) {
var bookmark = data.bookmark;
bookmark = bookmark < maxIndex ? bookmark : maxIndex;
- for (var i = 0; i < postIndices.length && postIndices[i] < data.bookmark; ++i) {
- --bookmark;
+ for (var i = 0; i < postIndices.length && postIndices[i] < data.bookmark; i += 1) {
+ bookmark -= 1;
}
if (parseInt(bookmark, 10) !== parseInt(data.bookmark, 10)) {
@@ -74,10 +73,9 @@ module.exports = function (Topics) {
}
});
}, next);
- }
+ },
], function (err) {
callback(err);
});
};
-
};
diff --git a/src/topics/create.js b/src/topics/create.js
index 2026f006da..5cee9e3d7c 100644
--- a/src/topics/create.js
+++ b/src/topics/create.js
@@ -16,7 +16,6 @@ var privileges = require('../privileges');
var categories = require('../categories');
module.exports = function (Topics) {
-
Topics.create = function (data, callback) {
// This is an internal method, consider using Topics.post instead
var timestamp = data.timestamp || Date.now();
@@ -31,26 +30,26 @@ module.exports = function (Topics) {
},
function (tid, next) {
topicData = {
- 'tid': tid,
- 'uid': data.uid,
- 'cid': data.cid,
- 'mainPid': 0,
- 'title': data.title,
- 'slug': tid + '/' + (utils.slugify(data.title) || 'topic'),
- 'timestamp': timestamp,
- 'lastposttime': 0,
- 'postcount': 0,
- 'viewcount': 0,
- 'locked': 0,
- 'deleted': 0,
- 'pinned': 0
+ tid: tid,
+ uid: data.uid,
+ cid: data.cid,
+ mainPid: 0,
+ title: data.title,
+ slug: tid + '/' + (utils.slugify(data.title) || 'topic'),
+ timestamp: timestamp,
+ lastposttime: 0,
+ postcount: 0,
+ viewcount: 0,
+ locked: 0,
+ deleted: 0,
+ pinned: 0,
};
if (data.thumb) {
topicData.thumb = data.thumb;
}
- plugins.fireHook('filter:topic.create', {topic: topicData, data: data}, next);
+ plugins.fireHook('filter:topic.create', { topic: topicData, data: data }, next);
},
function (data, next) {
topicData = data.topic;
@@ -62,7 +61,7 @@ module.exports = function (Topics) {
db.sortedSetsAdd([
'topics:tid',
'cid:' + topicData.cid + ':tids',
- 'cid:' + topicData.cid + ':uid:' + topicData.uid + ':tids'
+ 'cid:' + topicData.cid + ':uid:' + topicData.uid + ':tids',
], timestamp, topicData.tid, next);
},
function (next) {
@@ -79,13 +78,13 @@ module.exports = function (Topics) {
},
function (next) {
Topics.createTags(data.tags, topicData.tid, timestamp, next);
- }
+ },
], next);
},
function (results, next) {
plugins.fireHook('action:topic.save', {topic: _.clone(topicData)});
next(null, topicData.tid);
- }
+ },
], callback);
};
@@ -161,7 +160,7 @@ module.exports = function (Topics) {
},
topicData: function (next) {
Topics.getTopicsByTids([postData.tid], uid, next);
- }
+ },
}, next);
},
function (data, next) {
@@ -183,9 +182,9 @@ module.exports = function (Topics) {
next(null, {
topicData: data.topicData,
- postData: data.postData
+ postData: data.postData,
});
- }
+ },
], callback);
};
@@ -249,7 +248,7 @@ module.exports = function (Topics) {
content: content,
toPid: data.toPid,
timestamp: data.timestamp,
- ip: data.req ? data.req.ip : null
+ ip: data.req ? data.req.ip : null,
}, next);
},
function (_postData, next) {
@@ -273,7 +272,7 @@ module.exports = function (Topics) {
plugins.fireHook('action:topic.reply', {post: _.clone(postData)});
next(null, postData);
- }
+ },
], callback);
};
@@ -300,7 +299,7 @@ module.exports = function (Topics) {
},
content: function (next) {
posts.parsePost(postData, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -324,7 +323,7 @@ module.exports = function (Topics) {
postData.topic.title = validator.escape(String(postData.topic.title));
next(null, postData);
- }
+ },
], callback);
}
@@ -357,5 +356,4 @@ module.exports = function (Topics) {
}
callback();
}
-
};
diff --git a/src/topics/data.js b/src/topics/data.js
index a0196e1508..cf1df2787c 100644
--- a/src/topics/data.js
+++ b/src/topics/data.js
@@ -7,7 +7,6 @@ var categories = require('../categories');
var utils = require('../../public/src/utils');
module.exports = function (Topics) {
-
Topics.getTopicField = function (tid, field, callback) {
db.getObjectField('topic:' + tid, field, callback);
};
@@ -40,7 +39,7 @@ module.exports = function (Topics) {
Topics.getTopicsData = function (tids, callback) {
var keys = [];
- for (var i = 0; i < tids.length; ++i) {
+ for (var i = 0; i < tids.length; i += 1) {
keys.push('topic:' + tids[i]);
}
@@ -87,5 +86,4 @@ module.exports = function (Topics) {
Topics.deleteTopicField = function (tid, field, callback) {
db.deleteObjectField('topic:' + tid, field, callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/topics/delete.js b/src/topics/delete.js
index d7148f55c3..ec9d7f3a42 100644
--- a/src/topics/delete.js
+++ b/src/topics/delete.js
@@ -10,7 +10,6 @@ var batch = require('../batch');
module.exports = function (Topics) {
-
Topics.delete = function (tid, uid, callback) {
Topics.getTopicFields(tid, ['cid'], function (err, topicData) {
if (err) {
@@ -31,7 +30,7 @@ module.exports = function (Topics) {
}
db.sortedSetRemove('cid:' + topicData.cid + ':pids', pids, next);
});
- }
+ },
], function (err) {
callback(err);
});
@@ -70,7 +69,8 @@ module.exports = function (Topics) {
postData = postData.filter(function (post) {
return post && parseInt(post.deleted, 10) !== 1;
});
- var pidsToAdd = [], scores = [];
+ var pidsToAdd = [];
+ var scores = [];
postData.forEach(function (post) {
pidsToAdd.push(post.pid);
scores.push(post.timestamp);
@@ -78,7 +78,7 @@ module.exports = function (Topics) {
db.sortedSetAdd('cid:' + topicData.cid + ':pids', scores, pidsToAdd, next);
});
});
- }
+ },
], function (err) {
callback(err);
});
@@ -97,14 +97,14 @@ module.exports = function (Topics) {
async.eachLimit(pids, 10, function (pid, next) {
posts.purge(pid, uid, next);
}, next);
- }, {alwaysStartAt: 0}, next);
+ }, { alwaysStartAt: 0 }, next);
},
function (next) {
posts.purge(mainPid, uid, next);
},
function (next) {
Topics.purge(tid, uid, next);
- }
+ },
], callback);
};
@@ -122,7 +122,7 @@ module.exports = function (Topics) {
'tid:' + tid + ':posts',
'tid:' + tid + ':posts:votes',
'tid:' + tid + ':bookmarks',
- 'tid:' + tid + ':posters'
+ 'tid:' + tid + ':posters',
], next);
},
function (next) {
@@ -136,7 +136,7 @@ module.exports = function (Topics) {
},
function (next) {
reduceCounters(tid, next);
- }
+ },
], function (err) {
next(err);
});
@@ -145,9 +145,9 @@ module.exports = function (Topics) {
Topics.getTopicData(tid, next);
},
function (topicData, next) {
- plugins.fireHook('action:topic.purge', {topic: topicData, uid: uid});
+ plugins.fireHook('action:topic.purge', { topic: topicData, uid: uid });
db.delete('topic:' + tid, next);
- }
+ },
], callback);
};
@@ -156,7 +156,7 @@ module.exports = function (Topics) {
function (next) {
async.parallel({
followers: async.apply(db.getSetMembers, 'tid:' + tid + ':followers'),
- ignorers: async.apply(db.getSetMembers, 'tid:' + tid + ':ignorers')
+ ignorers: async.apply(db.getSetMembers, 'tid:' + tid + ':ignorers'),
}, next);
},
function (results, next) {
@@ -167,7 +167,7 @@ module.exports = function (Topics) {
return 'uid:' + uid + 'ignored_tids';
});
db.sortedSetsRemove(followerKeys.concat(ignorerKeys), tid, next);
- }
+ },
], callback);
}
@@ -183,12 +183,12 @@ module.exports = function (Topics) {
'cid:' + topicData.cid + ':tids:pinned',
'cid:' + topicData.cid + ':tids:posts',
'cid:' + topicData.cid + ':uid:' + topicData.uid + ':tids',
- 'uid:' + topicData.uid + ':topics'
+ 'uid:' + topicData.uid + ':topics',
], tid, next);
},
function (next) {
user.decrementUserFieldBy(topicData.uid, 'topiccount', 1, next);
- }
+ },
], callback);
});
}
@@ -217,10 +217,10 @@ module.exports = function (Topics) {
},
function (next) {
db.incrObjectFieldBy('category:' + topicData.cid, 'topic_count', incr, next);
- }
+ },
], next);
});
- }
+ },
], callback);
}
};
diff --git a/src/topics/follow.js b/src/topics/follow.js
index 4775cdb9bc..a3b1041b13 100644
--- a/src/topics/follow.js
+++ b/src/topics/follow.js
@@ -16,7 +16,6 @@ var emailer = require('../emailer');
var plugins = require('../plugins');
module.exports = function (Topics) {
-
Topics.toggleFollow = function (tid, uid, callback) {
callback = callback || function () {};
var isFollowing;
@@ -40,7 +39,7 @@ module.exports = function (Topics) {
},
function (next) {
next(null, !isFollowing);
- }
+ },
], callback);
};
@@ -75,9 +74,9 @@ module.exports = function (Topics) {
method2(tid, uid, next);
},
function (next) {
- plugins.fireHook(hook, {uid: uid, tid: tid});
+ plugins.fireHook(hook, { uid: uid, tid: tid });
next();
- }
+ },
], callback);
}
@@ -104,7 +103,7 @@ module.exports = function (Topics) {
},
function (next) {
db.sortedSetAdd(set2, Date.now(), tid, next);
- }
+ },
], callback);
}
@@ -115,7 +114,7 @@ module.exports = function (Topics) {
},
function (next) {
db.sortedSetRemove(set2, tid, next);
- }
+ },
], callback);
}
@@ -158,7 +157,7 @@ module.exports = function (Topics) {
return uid && !isIgnoring[index];
});
next(null, readingUids);
- }
+ },
], callback);
};
@@ -233,7 +232,7 @@ module.exports = function (Topics) {
tid: postData.topic.tid,
from: exceptUid,
mergeId: 'notifications:user_posted_to|' + postData.topic.tid,
- topicTitle: title
+ topicTitle: title,
}, next);
},
function (notification, next) {
@@ -248,7 +247,7 @@ module.exports = function (Topics) {
async.eachLimit(followers, 3, function (toUid, next) {
async.parallel({
userData: async.apply(user.getUserFields, toUid, ['username', 'userslug']),
- userSettings: async.apply(user.getSettings, toUid)
+ userSettings: async.apply(user.getSettings, toUid),
}, function (err, data) {
if (err) {
return next(err);
@@ -266,7 +265,7 @@ module.exports = function (Topics) {
url: nconf.get('url') + '/topic/' + postData.topic.tid,
topicSlug: postData.topic.slug,
postCount: postData.topic.postcount,
- base_url: nconf.get('url')
+ base_url: nconf.get('url'),
}, next);
} else {
winston.debug('[topics.notifyFollowers] uid ' + toUid + ' does not have post notifications enabled, skipping.');
@@ -275,7 +274,7 @@ module.exports = function (Topics) {
});
});
next();
- }
+ },
], callback);
};
};
diff --git a/src/topics/fork.js b/src/topics/fork.js
index 403331f902..5edd9f55f4 100644
--- a/src/topics/fork.js
+++ b/src/topics/fork.js
@@ -10,7 +10,6 @@ var plugins = require('../plugins');
var meta = require('../meta');
module.exports = function (Topics) {
-
Topics.createTopicFromPosts = function (uid, title, pids, fromTid, callback) {
if (title) {
title = title.trim();
@@ -44,19 +43,17 @@ module.exports = function (Topics) {
},
isAdminOrMod: function (next) {
privileges.categories.isAdminOrMod(cid, uid, next);
- }
+ },
}, next);
},
function (results, next) {
if (!results.isAdminOrMod) {
return next(new Error('[[error:no-privileges]]'));
}
- Topics.create({uid: results.postData.uid, title: title, cid: cid}, next);
+ Topics.create({ uid: results.postData.uid, title: title, cid: cid }, next);
},
- function (_tid, next) {
- Topics.updateTopicBookmarks(fromTid, pids, function (err) {
- next(err, _tid);
- });
+ function (results, next) {
+ Topics.updateTopicBookmarks(fromTid, pids, function () { next(null, results); });
},
function (_tid, next) {
tid = _tid;
@@ -74,9 +71,9 @@ module.exports = function (Topics) {
Topics.updateTimestamp(tid, Date.now(), next);
},
function (next) {
- plugins.fireHook('action:topic.fork', {tid: tid, fromTid: fromTid, uid: uid});
+ plugins.fireHook('action:topic.fork', { tid: tid, fromTid: fromTid, uid: uid });
Topics.getTopicData(tid, next);
- }
+ },
], callback);
};
@@ -122,20 +119,20 @@ module.exports = function (Topics) {
},
function (next) {
Topics.addPostToTopic(tid, postData, next);
- }
+ },
], next);
},
function (results, next) {
async.parallel([
async.apply(updateRecentTopic, tid),
- async.apply(updateRecentTopic, postData.tid)
+ async.apply(updateRecentTopic, postData.tid),
], next);
- }
+ },
], function (err) {
if (err) {
return callback(err);
}
- plugins.fireHook('action:post.move', {post: postData, tid: tid});
+ plugins.fireHook('action:post.move', { post: postData, tid: tid });
callback();
});
};
@@ -153,7 +150,7 @@ module.exports = function (Topics) {
}
async.parallel([
async.apply(db.incrObjectFieldBy, 'category:' + topicData[0].cid, 'post_count', -1),
- async.apply(db.incrObjectFieldBy, 'category:' + topicData[1].cid, 'post_count', 1)
+ async.apply(db.incrObjectFieldBy, 'category:' + topicData[1].cid, 'post_count', 1),
], callback);
});
}
@@ -171,9 +168,7 @@ module.exports = function (Topics) {
},
function (timestamp, next) {
Topics.updateTimestamp(tid, timestamp, next);
- }
+ },
], callback);
}
-
-
};
diff --git a/src/topics/popular.js b/src/topics/popular.js
index 452f897581..e6d78ad4b4 100644
--- a/src/topics/popular.js
+++ b/src/topics/popular.js
@@ -5,7 +5,6 @@ var async = require('async');
var privileges = require('../privileges');
module.exports = function (Topics) {
-
Topics.getPopular = function (term, uid, count, callback) {
count = parseInt(count, 10) || 20;
@@ -19,7 +18,7 @@ module.exports = function (Topics) {
},
function (tids, next) {
getTopics(tids, uid, count, next);
- }
+ },
], callback);
};
@@ -46,7 +45,7 @@ module.exports = function (Topics) {
},
function (tids, next) {
Topics.getTopicsByTids(tids, uid, next);
- }
+ },
], callback);
}
};
diff --git a/src/topics/posts.js b/src/topics/posts.js
index 37ea83b2cf..909de0caa4 100644
--- a/src/topics/posts.js
+++ b/src/topics/posts.js
@@ -10,10 +10,8 @@ var user = require('../user');
var posts = require('../posts');
var meta = require('../meta');
var plugins = require('../plugins');
-var utils = require('../../public/src/utils');
module.exports = function (Topics) {
-
Topics.onNewPostMade = function (postData, callback) {
async.series([
function (next) {
@@ -24,28 +22,28 @@ module.exports = function (Topics) {
},
function (next) {
Topics.addPostToTopic(postData.tid, postData, next);
- }
+ },
], callback);
};
Topics.getTopicPosts = function (tid, set, start, stop, uid, reverse, callback) {
- callback = callback || function () {};
- async.parallel({
- posts: function (next) {
- posts.getPostsFromSet(set, start, stop, uid, reverse, next);
+ async.waterfall([
+ function (next) {
+ async.parallel({
+ posts: function (next) {
+ posts.getPostsFromSet(set, start, stop, uid, reverse, next);
+ },
+ postCount: function (next) {
+ Topics.getTopicField(tid, 'postcount', next);
+ },
+ }, next);
},
- postCount: function (next) {
- Topics.getTopicField(tid, 'postcount', next);
- }
- }, function (err, results) {
- if (err) {
- return callback(err);
- }
-
- Topics.calculatePostIndices(results.posts, start, stop, results.postCount, reverse);
+ function (results, next) {
+ Topics.calculatePostIndices(results.posts, start, stop, results.postCount, reverse);
- Topics.addPostData(results.posts, uid, callback);
- });
+ Topics.addPostData(results.posts, uid, next);
+ },
+ ], callback);
};
Topics.addPostData = function (postData, uid, callback) {
@@ -60,91 +58,81 @@ module.exports = function (Topics) {
return callback(null, []);
}
- async.parallel({
- bookmarks: function (next) {
- posts.hasBookmarked(pids, uid, next);
- },
- voteData: function (next) {
- posts.getVoteStatusByPostIDs(pids, uid, next);
- },
- userData: function (next) {
- var uids = [];
+ function getPostUserData(field, method, callback) {
+ var uids = [];
- for(var i = 0; i < postData.length; ++i) {
- if (postData[i] && uids.indexOf(postData[i].uid) === -1) {
- uids.push(postData[i].uid);
- }
+ postData.forEach(function (postData) {
+ if (postData && postData[field] && uids.indexOf(postData[field]) === -1) {
+ uids.push(postData[field]);
}
+ });
- posts.getUserInfoForPosts(uids, uid, function (err, users) {
- if (err) {
- return next(err);
- }
-
+ async.waterfall([
+ function (next) {
+ method(uids, next);
+ },
+ function (users, next) {
var userData = {};
users.forEach(function (user, index) {
userData[uids[index]] = user;
});
-
next(null, userData);
- });
- },
- editors: function (next) {
- var editors = [];
- for(var i = 0; i < postData.length; ++i) {
- if (postData[i] && postData[i].editor && editors.indexOf(postData[i].editor) === -1) {
- editors.push(postData[i].editor);
- }
- }
+ },
+ ], callback);
+ }
- user.getUsersFields(editors, ['uid', 'username', 'userslug'], function (err, editors) {
- if (err) {
- return next(err);
+ async.waterfall([
+ function (next) {
+ async.parallel({
+ bookmarks: function (next) {
+ posts.hasBookmarked(pids, uid, next);
+ },
+ voteData: function (next) {
+ posts.getVoteStatusByPostIDs(pids, uid, next);
+ },
+ userData: function (next) {
+ getPostUserData('uid', function (uids, next) {
+ posts.getUserInfoForPosts(uids, uid, next);
+ }, next);
+ },
+ editors: function (next) {
+ getPostUserData('editor', function (uids, next) {
+ user.getUsersFields(uids, ['uid', 'username', 'userslug'], next);
+ }, next);
+ },
+ parents: function (next) {
+ Topics.addParentPosts(postData, next);
+ },
+ }, next);
+ },
+ function (results, next) {
+ postData.forEach(function (postObj, i) {
+ if (postObj) {
+ postObj.deleted = parseInt(postObj.deleted, 10) === 1;
+ postObj.user = parseInt(postObj.uid, 10) ? results.userData[postObj.uid] : _.clone(results.userData[postObj.uid]);
+ postObj.editor = postObj.editor ? results.editors[postObj.editor] : null;
+ postObj.bookmarked = results.bookmarks[i];
+ postObj.upvoted = results.voteData.upvotes[i];
+ postObj.downvoted = results.voteData.downvotes[i];
+ postObj.votes = postObj.votes || 0;
+ postObj.replies = postObj.replies || 0;
+ postObj.selfPost = !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(postObj.uid, 10);
+
+ // Username override for guests, if enabled
+ if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(postObj.uid, 10) === 0 && postObj.handle) {
+ postObj.user.username = validator.escape(String(postObj.handle));
+ }
}
- var editorData = {};
- editors.forEach(function (editor) {
- editorData[editor.uid] = editor;
- });
- next(null, editorData);
});
+ plugins.fireHook('filter:topics.addPostData', {
+ posts: postData,
+ uid: uid,
+ }, next);
},
- parents: function (next) {
- Topics.addParentPosts(postData, next);
+ function (data, next) {
+ next(null, data.posts);
},
- replies: function (next) {
- getPostReplies(pids, uid, next);
- }
- }, function (err, results) {
- if (err) {
- return callback(err);
- }
-
- postData.forEach(function (postObj, i) {
- if (postObj) {
- postObj.deleted = parseInt(postObj.deleted, 10) === 1;
- postObj.user = parseInt(postObj.uid, 10) ? results.userData[postObj.uid] : _.clone(results.userData[postObj.uid]);
- postObj.editor = postObj.editor ? results.editors[postObj.editor] : null;
- postObj.bookmarked = results.bookmarks[i];
- postObj.upvoted = results.voteData.upvotes[i];
- postObj.downvoted = results.voteData.downvotes[i];
- postObj.replies = results.replies[i];
- postObj.votes = postObj.votes || 0;
- postObj.selfPost = !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(postObj.uid, 10);
-
- // Username override for guests, if enabled
- if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(postObj.uid, 10) === 0 && postObj.handle) {
- postObj.user.username = validator.escape(String(postObj.handle));
- }
- }
- });
-
- plugins.fireHook('filter:topics.addPostData', {
- posts: postData,
- uid: uid
- }, function (err, data) {
- callback(err, data ? data.posts : null);
- });
- });
+ ], callback);
};
Topics.modifyPostsByPrivilege = function (topicData, topicPrivileges) {
@@ -177,7 +165,9 @@ module.exports = function (Topics) {
async.apply(posts.getPostsFields, parentPids, ['uid']),
function (_parentPosts, next) {
parentPosts = _parentPosts;
- var parentUids = parentPosts.map(function (postObj) { return parseInt(postObj.uid, 10); }).filter(function (uid, idx, users) {
+ var parentUids = parentPosts.map(function (postObj) {
+ return parseInt(postObj.uid, 10);
+ }).filter(function (uid, idx, users) {
return users.indexOf(uid) === idx;
});
@@ -190,14 +180,14 @@ module.exports = function (Topics) {
});
var parents = {};
parentPosts.forEach(function (post, i) {
- parents[parentPids[i]] = {username: usersMap[post.uid]};
+ parents[parentPids[i]] = { username: usersMap[post.uid] };
});
postData.forEach(function (post) {
post.parent = parents[post.toPid];
});
next();
- }
+ },
], callback);
};
@@ -227,7 +217,7 @@ module.exports = function (Topics) {
},
function (mainPost, next) {
next(null, parseInt(mainPost.pid, 10) && parseInt(mainPost.deleted, 10) !== 1 ? mainPost.pid.toString() : null);
- }
+ },
], callback);
};
@@ -236,31 +226,31 @@ module.exports = function (Topics) {
var done = false;
var latestPid = null;
var index = 0;
+ var pids;
async.doWhilst(
function (next) {
- db.getSortedSetRevRange('tid:' + tid + ':posts', index, index, function (err, pids) {
- if (err) {
- return next(err);
- }
-
- if (!Array.isArray(pids) || !pids.length) {
- done = true;
- return next();
- }
-
- posts.getPostField(pids[0], 'deleted', function (err, deleted) {
- if (err) {
- return next(err);
+ async.waterfall([
+ function (_next) {
+ db.getSortedSetRevRange('tid:' + tid + ':posts', index, index, _next);
+ },
+ function (_pids, _next) {
+ pids = _pids;
+ if (!Array.isArray(pids) || !pids.length) {
+ done = true;
+ return next();
}
+ posts.getPostField(pids[0], 'deleted', _next);
+ },
+ function (deleted, _next) {
isDeleted = parseInt(deleted, 10) === 1;
if (!isDeleted) {
latestPid = pids[0];
}
- ++index;
- next();
- });
- });
+ index += 1;
+ _next();
+ },
+ ], next);
},
function () {
return isDeleted && !done;
@@ -289,7 +279,7 @@ module.exports = function (Topics) {
var downvotes = parseInt(postData.downvotes, 10) || 0;
var votes = upvotes - downvotes;
db.sortedSetAdd('tid:' + tid + ':posts:votes', votes, postData.pid, next);
- }
+ },
], function (err) {
next(err);
});
@@ -300,7 +290,7 @@ module.exports = function (Topics) {
},
function (count, next) {
Topics.updateTeaser(tid, next);
- }
+ },
], callback);
};
@@ -309,7 +299,7 @@ module.exports = function (Topics) {
function (next) {
db.sortedSetsRemove([
'tid:' + tid + ':posts',
- 'tid:' + tid + ':posts:votes'
+ 'tid:' + tid + ':posts:votes',
], postData.pid, next);
},
function (next) {
@@ -317,27 +307,29 @@ module.exports = function (Topics) {
},
function (count, next) {
Topics.updateTeaser(tid, next);
- }
+ },
], callback);
};
Topics.getPids = function (tid, callback) {
- async.parallel({
- mainPid: function (next) {
- Topics.getTopicField(tid, 'mainPid', next);
+ async.waterfall([
+ function (next) {
+ async.parallel({
+ mainPid: function (next) {
+ Topics.getTopicField(tid, 'mainPid', next);
+ },
+ pids: function (next) {
+ db.getSortedSetRange('tid:' + tid + ':posts', 0, -1, next);
+ },
+ }, next);
},
- pids: function (next) {
- db.getSortedSetRange('tid:' + tid + ':posts', 0, -1, next);
- }
- }, function (err, results) {
- if (err) {
- return callback(err);
- }
- if (results.mainPid) {
- results.pids = [results.mainPid].concat(results.pids);
- }
- callback(null, results.pids);
- });
+ function (results, next) {
+ if (results.mainPid) {
+ results.pids = [results.mainPid].concat(results.pids);
+ }
+ next(null, results.pids);
+ },
+ ], callback);
};
Topics.increasePostCount = function (tid, callback) {
@@ -354,12 +346,14 @@ module.exports = function (Topics) {
function incrementFieldAndUpdateSortedSet(tid, field, by, set, callback) {
callback = callback || function () {};
- db.incrObjectFieldBy('topic:' + tid, field, by, function (err, value) {
- if (err) {
- return callback(err);
- }
- db.sortedSetAdd(set, value, tid, callback);
- });
+ async.waterfall([
+ function (next) {
+ db.incrObjectFieldBy('topic:' + tid, field, by, next);
+ },
+ function (value, next) {
+ db.sortedSetAdd(set, value, tid, next);
+ },
+ ], callback);
}
Topics.getTitleByPid = function (pid, callback) {
@@ -367,79 +361,28 @@ module.exports = function (Topics) {
};
Topics.getTopicFieldByPid = function (field, pid, callback) {
- posts.getPostField(pid, 'tid', function (err, tid) {
- if (err) {
- return callback(err);
- }
- Topics.getTopicField(tid, field, callback);
- });
+ async.waterfall([
+ function (next) {
+ posts.getPostField(pid, 'tid', next);
+ },
+ function (tid, next) {
+ Topics.getTopicField(tid, field, next);
+ },
+ ], callback);
};
Topics.getTopicDataByPid = function (pid, callback) {
- posts.getPostField(pid, 'tid', function (err, tid) {
- if (err) {
- return callback(err);
- }
- Topics.getTopicData(tid, callback);
- });
+ async.waterfall([
+ function (next) {
+ posts.getPostField(pid, 'tid', next);
+ },
+ function (tid, next) {
+ Topics.getTopicData(tid, next);
+ },
+ ], callback);
};
Topics.getPostCount = function (tid, callback) {
db.getObjectField('topic:' + tid, 'postcount', callback);
};
-
- function getPostReplies(pids, callerUid, callback) {
- async.map(pids, function (pid, _next) {
- var replyPids;
- var uids = [];
- var count = 0;
- async.waterfall([
- function (next) {
- db.getSortedSetRange('pid:' + pid + ':replies', 0, -1, next);
- },
- function (_replyPids, next) {
- replyPids = _replyPids;
- if (!replyPids.length) {
- return _next(null, {count: 0});
- }
- async.until(function () {
- return count === replyPids.length || uids.length === 6;
- }, function (next) {
- posts.getPostField(replyPids[count], 'uid', function (err, uid) {
- if (err) {
- return next(err);
- }
- uid = parseInt(uid, 10);
- if (uids.indexOf(uid) === -1) {
- uids.push(uid);
- }
- count++;
- next();
- });
- }, next);
- },
- function (next) {
- async.parallel({
- users: function (next) {
- user.getUsersWithFields(uids, ['uid', 'username', 'userslug', 'picture'], callerUid, next);
- },
- timestampISO: function (next) {
- posts.getPostField(replyPids[replyPids.length - 1], 'timestamp', next);
- }
- }, next);
- },
- function (replies, next) {
- if (replies.users.length > 5) {
- replies.users.shift();
- replies.hasMore = true;
- }
-
- replies.count = replyPids.length;
- replies.timestampISO = utils.toISOString(replies.timestampISO);
-
- next(null, replies);
- }
- ], _next);
- }, callback);
- }
};
diff --git a/src/topics/recent.js b/src/topics/recent.js
index 23ca9ff5ba..dbecd035b4 100644
--- a/src/topics/recent.js
+++ b/src/topics/recent.js
@@ -7,20 +7,20 @@ var db = require('../database');
var plugins = require('../plugins');
var privileges = require('../privileges');
var user = require('../user');
-var categories = require('../categories');
+var categories = require('../categories');
module.exports = function (Topics) {
var terms = {
day: 86400000,
week: 604800000,
month: 2592000000,
- year: 31104000000
+ year: 31104000000,
};
Topics.getRecentTopics = function (cid, uid, start, stop, filter, callback) {
var recentTopics = {
- nextStart : 0,
- topics: []
+ nextStart: 0,
+ topics: [],
};
async.waterfall([
@@ -43,7 +43,7 @@ module.exports = function (Topics) {
recentTopics.topics = topicData;
recentTopics.nextStart = stop + 1;
next(null, recentTopics);
- }
+ },
], callback);
};
@@ -72,21 +72,20 @@ module.exports = function (Topics) {
},
topicData: function (next) {
Topics.getTopicsFields(tids, ['tid', 'cid'], next);
- }
+ },
}, next);
},
function (results, next) {
tids = results.topicData.filter(function (topic) {
if (topic) {
return results.ignoredCids.indexOf(topic.cid.toString()) === -1;
- } else {
- return false;
}
+ return false;
}).map(function (topic) {
return topic.tid;
});
next(null, tids);
- }
+ },
], callback);
}
@@ -100,8 +99,8 @@ module.exports = function (Topics) {
Topics.getTopics(tids, uid, next);
},
function (topics, next) {
- next(null, {topics: topics, nextStart: stop + 1});
- }
+ next(null, { topics: topics, nextStart: stop + 1 });
+ },
], callback);
};
@@ -128,12 +127,12 @@ module.exports = function (Topics) {
return next();
}
Topics.updateRecent(tid, timestamp, next);
- }
+ },
], next);
},
function (next) {
Topics.setTopicField(tid, 'lastposttime', timestamp, next);
- }
+ },
], function (err) {
callback(err);
});
@@ -142,7 +141,7 @@ module.exports = function (Topics) {
Topics.updateRecent = function (tid, timestamp, callback) {
callback = callback || function () {};
if (plugins.hasListeners('filter:topics.updateRecent')) {
- plugins.fireHook('filter:topics.updateRecent', {tid: tid, timestamp: timestamp}, function (err, data) {
+ plugins.fireHook('filter:topics.updateRecent', { tid: tid, timestamp: timestamp }, function (err, data) {
if (err) {
return callback(err);
}
diff --git a/src/topics/suggested.js b/src/topics/suggested.js
index d51d51827b..d69471744f 100644
--- a/src/topics/suggested.js
+++ b/src/topics/suggested.js
@@ -8,7 +8,6 @@ var categories = require('../categories');
var search = require('../search');
module.exports = function (Topics) {
-
Topics.getSuggestedTopics = function (tid, uid, start, stop, callback) {
async.parallel({
tagTids: function (next) {
@@ -19,7 +18,7 @@ module.exports = function (Topics) {
},
categoryTids: function (next) {
getCategoryTids(tid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -51,7 +50,7 @@ module.exports = function (Topics) {
},
function (data, next) {
next(null, _.unique(_.flatten(data)));
- }
+ },
], callback);
}
@@ -62,7 +61,7 @@ module.exports = function (Topics) {
},
function (title, next) {
search.searchQuery('topic', title, [], [], next);
- }
+ },
], callback);
}
@@ -73,8 +72,7 @@ module.exports = function (Topics) {
},
function (cid, next) {
categories.getTopicIds(cid, 'cid:' + cid + ':tids', true, 0, 9, next);
- }
+ },
], callback);
}
-
-};
\ No newline at end of file
+};
diff --git a/src/topics/tags.js b/src/topics/tags.js
index a360de290e..d10c127ac0 100644
--- a/src/topics/tags.js
+++ b/src/topics/tags.js
@@ -11,7 +11,6 @@ var utils = require('../../public/src/utils');
module.exports = function (Topics) {
-
Topics.createTags = function (tags, tid, timestamp, callback) {
callback = callback || function () {};
@@ -21,7 +20,7 @@ module.exports = function (Topics) {
async.waterfall([
function (next) {
- plugins.fireHook('filter:tags.filter', {tags: tags, tid: tid}, next);
+ plugins.fireHook('filter:tags.filter', { tags: tags, tid: tid }, next);
},
function (data, next) {
tags = data.tags.slice(0, meta.config.maximumTagsPerTopic || 5);
@@ -41,14 +40,14 @@ module.exports = function (Topics) {
async.parallel([
async.apply(db.setAdd, 'topic:' + tid + ':tags', tags),
- async.apply(db.sortedSetsAdd, keys, timestamp, tid)
+ async.apply(db.sortedSetsAdd, keys, timestamp, tid),
], function (err) {
next(err);
});
},
function (next) {
async.each(tags, updateTagCount, next);
- }
+ },
], callback);
};
@@ -68,7 +67,7 @@ module.exports = function (Topics) {
return tagWhitelist.indexOf(tag) !== -1;
});
next(null, tags);
- }
+ },
], callback);
}
@@ -91,7 +90,7 @@ module.exports = function (Topics) {
return next();
}
db.sortedSetAdd('tags:topic:count', 0, tag, next);
- }
+ },
], callback);
};
@@ -112,7 +111,7 @@ module.exports = function (Topics) {
count = count || 0;
db.sortedSetAdd('tags:topic:count', count, tag, next);
- }
+ },
], callback);
}
@@ -146,7 +145,7 @@ module.exports = function (Topics) {
db.deleteAll(tags.map(function (tag) {
return 'tag:' + tag;
}), next);
- }
+ },
], callback);
};
@@ -176,7 +175,7 @@ module.exports = function (Topics) {
},
function (tags, next) {
Topics.getTagData(tags, next);
- }
+ },
], callback);
};
@@ -195,7 +194,7 @@ module.exports = function (Topics) {
tag.bgColor = tagData[index] ? tagData[index].bgColor : '';
});
next(null, tags);
- }
+ },
], callback);
};
@@ -231,7 +230,7 @@ module.exports = function (Topics) {
uniqueTopicTags = _.uniq(_.flatten(topicTags));
var tags = uniqueTopicTags.map(function (tag) {
- return {value: tag};
+ return { value: tag };
});
async.parallel({
@@ -240,7 +239,7 @@ module.exports = function (Topics) {
},
counts: function (next) {
db.sortedSetScores('tags:topic:count', uniqueTopicTags, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -252,12 +251,12 @@ module.exports = function (Topics) {
topicTags.forEach(function (tags, index) {
if (Array.isArray(tags)) {
- topicTags[index] = tags.map(function (tag) {return tagData[tag];});
+ topicTags[index] = tags.map(function (tag) { return tagData[tag]; });
}
});
next(null, topicTags);
- }
+ },
], callback);
};
@@ -272,7 +271,7 @@ module.exports = function (Topics) {
},
function (timestamp, next) {
Topics.createTags(tags, tid, timestamp, next);
- }
+ },
], callback);
};
@@ -297,9 +296,9 @@ module.exports = function (Topics) {
async.each(tags, function (tag, next) {
updateTagCount(tag, next);
}, next);
- }
+ },
], next);
- }
+ },
], function (err) {
callback(err);
});
@@ -313,17 +312,17 @@ module.exports = function (Topics) {
async.waterfall([
function (next) {
if (plugins.hasListeners('filter:topics.searchTags')) {
- plugins.fireHook('filter:topics.searchTags', {data: data}, next);
+ plugins.fireHook('filter:topics.searchTags', { data: data }, next);
} else {
findMatches(data.query, 0, next);
}
},
function (result, next) {
- plugins.fireHook('filter:tags.search', {data: data, matches: result.matches}, next);
+ plugins.fireHook('filter:tags.search', { data: data, matches: result.matches }, next);
},
function (result, next) {
next(null, result.matches);
- }
+ },
], callback);
};
@@ -335,14 +334,14 @@ module.exports = function (Topics) {
async.waterfall([
function (next) {
if (plugins.hasListeners('filter:topics.autocompleteTags')) {
- plugins.fireHook('filter:topics.autocompleteTags', {data: data}, next);
+ plugins.fireHook('filter:topics.autocompleteTags', { data: data }, next);
} else {
findMatches(data.query, data.cid, next);
}
},
function (result, next) {
next(null, result.matches);
- }
+ },
], callback);
};
@@ -366,7 +365,7 @@ module.exports = function (Topics) {
query = query.toLowerCase();
var matches = [];
- for(var i = 0; i < tags.length; ++i) {
+ for (var i = 0; i < tags.length; i += 1) {
if (tags[i].toLowerCase().startsWith(query)) {
matches.push(tags[i]);
if (matches.length > 19) {
@@ -378,8 +377,8 @@ module.exports = function (Topics) {
matches = matches.sort(function (a, b) {
return a > b;
});
- next(null, {matches: matches});
- }
+ next(null, { matches: matches });
+ },
], callback);
}
@@ -387,7 +386,7 @@ module.exports = function (Topics) {
var searchResult = {
tags: [],
matchCount: 0,
- pageCount: 1
+ pageCount: 1,
};
if (!data || !data.query || !data.query.length) {
@@ -404,11 +403,11 @@ module.exports = function (Topics) {
},
tagData: function (next) {
tags = tags.map(function (tag) {
- return {value: tag};
+ return { value: tag };
});
Topics.getTagData(tags, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -422,13 +421,13 @@ module.exports = function (Topics) {
searchResult.matchCount = results.tagData.length;
searchResult.pageCount = 1;
next(null, searchResult);
- }
+ },
], callback);
};
Topics.getRelatedTopics = function (topicData, uid, callback) {
if (plugins.hasListeners('filter:topic.getRelatedTopics')) {
- return plugins.fireHook('filter:topic.getRelatedTopics', {topic: topicData, uid: uid}, callback);
+ return plugins.fireHook('filter:topic.getRelatedTopics', { topic: topicData, uid: uid }, callback);
}
var maximumTopics = parseInt(meta.config.maximumRelatedTopics, 10) || 0;
@@ -453,7 +452,7 @@ module.exports = function (Topics) {
return topic && !topic.deleted && parseInt(topic.uid, 10) !== parseInt(uid, 10);
});
next(null, topics);
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/topics/teaser.js b/src/topics/teaser.js
index 1467dd194f..aa64d7780f 100644
--- a/src/topics/teaser.js
+++ b/src/topics/teaser.js
@@ -12,7 +12,6 @@ var plugins = require('../plugins');
var utils = require('../../public/src/utils');
module.exports = function (Topics) {
-
Topics.getTeasers = function (topics, callback) {
if (!Array.isArray(topics) || !topics.length) {
return callback(null, []);
@@ -30,19 +29,19 @@ module.exports = function (Topics) {
delete topic.teaserPid;
}
- switch(meta.config.teaserPost) {
- case 'first':
- teaserPids.push(topic.mainPid);
- break;
+ switch (meta.config.teaserPost) {
+ case 'first':
+ teaserPids.push(topic.mainPid);
+ break;
- case 'last-post':
- teaserPids.push(topic.teaserPid || topic.mainPid);
- break;
+ case 'last-post':
+ teaserPids.push(topic.teaserPid || topic.mainPid);
+ break;
- case 'last-reply': // intentional fall-through
- default:
- teaserPids.push(topic.teaserPid);
- break;
+ case 'last-reply': // intentional fall-through
+ default:
+ teaserPids.push(topic.teaserPid);
+ break;
}
}
});
@@ -95,11 +94,11 @@ module.exports = function (Topics) {
return tidToPost[topic.tid];
});
- plugins.fireHook('filter:teasers.get', {teasers: teasers}, next);
+ plugins.fireHook('filter:teasers.get', { teasers: teasers }, next);
},
function (data, next) {
next(null, data.teasers);
- }
+ },
], callback);
};
@@ -113,7 +112,7 @@ module.exports = function (Topics) {
},
function (topics, next) {
Topics.getTeasers(topics, next);
- }
+ },
], callback);
};
@@ -137,4 +136,4 @@ module.exports = function (Topics) {
}
});
};
-};
\ No newline at end of file
+};
diff --git a/src/topics/thumb.js b/src/topics/thumb.js
index a5ca38ed3e..574ca302ad 100644
--- a/src/topics/thumb.js
+++ b/src/topics/thumb.js
@@ -16,7 +16,6 @@ var file = require('../file');
var plugins = require('../plugins');
module.exports = function (Topics) {
-
Topics.resizeAndUploadThumb = function (data, callback) {
if (!data.thumb || !validator.isURL(data.thumb)) {
return callback();
@@ -30,7 +29,6 @@ module.exports = function (Topics) {
request.head(data.thumb, next);
},
function (res, body, next) {
-
var type = res.headers['content-type'];
if (!type.match(/image./)) {
return next(new Error('[[error:invalid-file]]'));
@@ -54,7 +52,7 @@ module.exports = function (Topics) {
path: pathToUpload,
extension: path.extname(pathToUpload),
width: size,
- height: size
+ height: size,
}, next);
},
function (next) {
@@ -63,13 +61,13 @@ module.exports = function (Topics) {
return callback();
}
- plugins.fireHook('filter:uploadImage', {image: {path: pathToUpload, name: ''}, uid: data.uid}, next);
+ plugins.fireHook('filter:uploadImage', { image: { path: pathToUpload, name: '' }, uid: data.uid }, next);
},
function (uploadedFile, next) {
deleteFile(pathToUpload);
data.thumb = uploadedFile.url;
next();
- }
+ },
], function (err) {
if (err) {
deleteFile(pathToUpload);
@@ -87,5 +85,4 @@ module.exports = function (Topics) {
});
}
}
-
};
diff --git a/src/topics/tools.js b/src/topics/tools.js
index 295e2a028b..d44f259ba7 100644
--- a/src/topics/tools.js
+++ b/src/topics/tools.js
@@ -10,7 +10,6 @@ var privileges = require('../privileges');
module.exports = function (Topics) {
-
var topicTools = {};
Topics.tools = topicTools;
@@ -46,7 +45,7 @@ module.exports = function (Topics) {
if (parseInt(topicData.deleted, 10) === 1 && isDelete) {
return callback(new Error('[[error:topic-already-deleted]]'));
- } else if(parseInt(topicData.deleted, 10) !== 1 && !isDelete) {
+ } else if (parseInt(topicData.deleted, 10) !== 1 && !isDelete) {
return callback(new Error('[[error:topic-already-restored]]'));
}
@@ -56,20 +55,20 @@ module.exports = function (Topics) {
topicData.deleted = isDelete ? 1 : 0;
if (isDelete) {
- plugins.fireHook('action:topic.delete', {topic: topicData, uid: uid});
+ plugins.fireHook('action:topic.delete', { topic: topicData, uid: uid });
} else {
- plugins.fireHook('action:topic.restore', {topic: topicData, uid: uid});
+ plugins.fireHook('action:topic.restore', { topic: topicData, uid: uid });
}
var data = {
tid: tid,
cid: topicData.cid,
isDelete: isDelete,
- uid: uid
+ uid: uid,
};
next(null, data);
- }
+ },
], callback);
}
@@ -98,8 +97,8 @@ module.exports = function (Topics) {
Topics.purgePostsAndTopic(tid, uid, next);
},
function (next) {
- next(null, {tid: tid, cid: cid, uid: uid});
- }
+ next(null, { tid: tid, cid: cid, uid: uid });
+ },
], callback);
};
@@ -137,10 +136,10 @@ module.exports = function (Topics) {
function (next) {
topicData.isLocked = lock;
- plugins.fireHook('action:topic.lock', {topic: _.clone(topicData), uid: uid});
+ plugins.fireHook('action:topic.lock', { topic: _.clone(topicData), uid: uid });
next(null, topicData);
- }
+ },
], callback);
}
@@ -180,26 +179,25 @@ module.exports = function (Topics) {
async.parallel([
async.apply(db.sortedSetAdd, 'cid:' + topicData.cid + ':tids:pinned', Date.now(), tid),
async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids', tid),
- async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids:posts', tid)
+ async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids:posts', tid),
], next);
} else {
async.parallel([
async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids:pinned', tid),
async.apply(db.sortedSetAdd, 'cid:' + topicData.cid + ':tids', topicData.lastposttime, tid),
- async.apply(db.sortedSetAdd, 'cid:' + topicData.cid + ':tids:posts', topicData.postcount, tid)
+ async.apply(db.sortedSetAdd, 'cid:' + topicData.cid + ':tids:posts', topicData.postcount, tid),
], next);
}
- }
+ },
], next);
},
function (results, next) {
-
topicData.isPinned = pin;
- plugins.fireHook('action:topic.pin', {topic: _.clone(topicData), uid: uid});
+ plugins.fireHook('action:topic.pin', { topic: _.clone(topicData), uid: uid });
next(null, topicData);
- }
+ },
], callback);
}
@@ -239,10 +237,10 @@ module.exports = function (Topics) {
} else {
setImmediate(next);
}
- }
+ },
], next);
}, next);
- }
+ },
], callback);
};
@@ -263,7 +261,7 @@ module.exports = function (Topics) {
db.sortedSetsRemove([
'cid:' + topicData.cid + ':tids',
'cid:' + topicData.cid + ':tids:pinned',
- 'cid:' + topicData.cid + ':tids:posts' // post count
+ 'cid:' + topicData.cid + ':tids:posts', // post count
], tid, next);
},
function (next) {
@@ -277,10 +275,10 @@ module.exports = function (Topics) {
function (next) {
topic.postcount = topic.postcount || 0;
db.sortedSetAdd('cid:' + cid + ':tids:posts', topic.postcount, tid, next);
- }
+ },
], next);
}
- }
+ },
], function (err) {
if (err) {
return callback(err);
@@ -298,9 +296,9 @@ module.exports = function (Topics) {
function (next) {
Topics.setTopicFields(tid, {
cid: cid,
- oldCid: oldCid
+ oldCid: oldCid,
}, next);
- }
+ },
], function (err) {
if (err) {
return callback(err);
@@ -309,12 +307,10 @@ module.exports = function (Topics) {
tid: tid,
fromCid: oldCid,
toCid: cid,
- uid: uid
+ uid: uid,
});
callback();
});
});
};
-
-
};
diff --git a/src/topics/unread.js b/src/topics/unread.js
index a754fa0f99..3e8fb55da9 100644
--- a/src/topics/unread.js
+++ b/src/topics/unread.js
@@ -12,13 +12,12 @@ var meta = require('../meta');
var utils = require('../../public/src/utils');
module.exports = function (Topics) {
-
Topics.getTotalUnread = function (uid, filter, callback) {
if (!callback) {
callback = filter;
filter = '';
}
- Topics.getUnreadTids({cid: 0, uid: uid, filter: filter}, function (err, tids) {
+ Topics.getUnreadTids({ cid: 0, uid: uid, filter: filter }, function (err, tids) {
callback(err, Array.isArray(tids) ? tids.length : 0);
});
};
@@ -27,8 +26,8 @@ module.exports = function (Topics) {
Topics.getUnreadTopics = function (params, callback) {
var unreadTopics = {
showSelect: true,
- nextStart : 0,
- topics: []
+ nextStart: 0,
+ topics: [],
};
async.waterfall([
@@ -58,12 +57,13 @@ module.exports = function (Topics) {
unreadTopics.topics = topicData;
unreadTopics.nextStart = params.stop + 1;
next(null, unreadTopics);
- }
+ },
], callback);
};
Topics.unreadCutoff = function () {
- return Date.now() - (parseInt(meta.config.unreadCutoff, 10) || 2) * 86400000;
+ var cutoff = parseInt(meta.config.unreadCutoff, 10) || 2;
+ return Date.now() - (cutoff * 86400000);
};
Topics.getUnreadTids = function (params, callback) {
@@ -94,7 +94,7 @@ module.exports = function (Topics) {
},
tids_unread: function (next) {
db.getSortedSetRevRangeWithScores('uid:' + uid + ':tids_unread', 0, -1, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -119,10 +119,10 @@ module.exports = function (Topics) {
return false;
}
switch (params.filter) {
- case 'new':
- return !userRead[recentTopic.value];
- default:
- return !userRead[recentTopic.value] || recentTopic.score > userRead[recentTopic.value];
+ case 'new':
+ return !userRead[recentTopic.value];
+ default:
+ return !userRead[recentTopic.value] || recentTopic.score > userRead[recentTopic.value];
}
}).map(function (topic) {
return topic.value;
@@ -137,11 +137,10 @@ module.exports = function (Topics) {
}
},
function (tids, next) {
-
tids = tids.slice(0, 200);
filterTopics(uid, tids, params.cid, ignoredCids, params.filter, next);
- }
+ },
], callback);
};
@@ -165,7 +164,7 @@ module.exports = function (Topics) {
return next(null, []);
}
db.sortedSetScores('uid:' + uid + ':followed_tids', tids, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -178,7 +177,7 @@ module.exports = function (Topics) {
return topic.tid;
});
next(null, tids);
- }
+ },
], callback);
}
@@ -220,7 +219,7 @@ module.exports = function (Topics) {
function (next) {
async.parallel({
topicScores: async.apply(db.sortedSetScores, 'topics:recent', tids),
- userScores: async.apply(db.sortedSetScores, 'uid:' + uid + ':tids_read', tids)
+ userScores: async.apply(db.sortedSetScores, 'uid:' + uid + ':tids_read', tids),
}, next);
},
function (results, next) {
@@ -240,7 +239,7 @@ module.exports = function (Topics) {
async.parallel({
markRead: async.apply(db.sortedSetAdd, 'uid:' + uid + ':tids_read', scores, tids),
markUnread: async.apply(db.sortedSetRemove, 'uid:' + uid + ':tids_unread', tids),
- topicData: async.apply(Topics.getTopicsFields, tids, ['cid'])
+ topicData: async.apply(Topics.getTopicsFields, tids, ['cid']),
}, next);
},
function (results, next) {
@@ -254,7 +253,7 @@ module.exports = function (Topics) {
},
function (next) {
next(null, true);
- }
+ },
], callback);
};
@@ -269,7 +268,7 @@ module.exports = function (Topics) {
},
function (markedRead, next) {
db.delete('uid:' + uid + ':tids_unread', next);
- }
+ },
], callback);
};
@@ -289,7 +288,7 @@ module.exports = function (Topics) {
function (next) {
user.notifications.pushCount(uid);
next();
- }
+ },
], callback);
};
@@ -300,7 +299,7 @@ module.exports = function (Topics) {
},
function (cid, next) {
categories.markAsUnreadForAll(cid, next);
- }
+ },
], callback);
};
@@ -320,7 +319,7 @@ module.exports = function (Topics) {
},
tids_unread: function (next) {
db.sortedSetScores('uid:' + uid + ':tids_unread', tids, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -356,7 +355,7 @@ module.exports = function (Topics) {
},
function (next) {
db.sortedSetAdd('uid:' + uid + ':tids_unread', Date.now(), tid, next);
- }
+ },
], callback);
};
@@ -371,5 +370,4 @@ module.exports = function (Topics) {
callback(null, tids);
});
};
-
};
diff --git a/src/topics/user.js b/src/topics/user.js
index ab56a5f778..d0a8d21426 100644
--- a/src/topics/user.js
+++ b/src/topics/user.js
@@ -1,13 +1,8 @@
-
-
'use strict';
-var async = require('async');
var db = require('../database');
-var posts = require('../posts');
module.exports = function (Topics) {
-
Topics.isOwner = function (tid, uid, callback) {
uid = parseInt(uid, 10);
if (!uid) {
@@ -21,4 +16,4 @@ module.exports = function (Topics) {
Topics.getUids = function (tid, callback) {
db.getSortedSetRevRangeByScore('tid:' + tid + ':posters', 0, -1, '+inf', 1, callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/upgrade.js b/src/upgrade.js
index 12939ad99d..e345448bda 100644
--- a/src/upgrade.js
+++ b/src/upgrade.js
@@ -1,6 +1,5 @@
-"use strict";
+'use strict';
-/* globals console, require */
var db = require('./database');
var async = require('async');
@@ -53,7 +52,7 @@ Upgrade.upgrade = function (callback) {
return next(err);
}
- if(!value) {
+ if (!value) {
db.set('schemaDate', latestSchema, function () {
next();
});
@@ -131,7 +130,7 @@ Upgrade.upgrade = function (callback) {
},
function (next) {
db.deleteObjectField('post:' + id, 'reputation', next);
- }
+ },
], next);
}, next);
}, {}, next);
@@ -187,7 +186,7 @@ Upgrade.upgrade = function (callback) {
console.log('processing pid: ' + postData.pid + ' toPid: ' + postData.toPid);
async.parallel([
async.apply(db.sortedSetAdd, 'pid:' + postData.toPid + ':replies', postData.timestamp, postData.pid),
- async.apply(db.incrObjectField, 'post:' + postData.toPid, 'replies')
+ async.apply(db.incrObjectField, 'post:' + postData.toPid, 'replies'),
], next);
}, next);
});
@@ -242,23 +241,23 @@ Upgrade.upgrade = function (callback) {
async.waterfall([
async.apply(db.getObjectField, 'user:' + uid + ':settings', 'userLang'),
function (language, next) {
- ++i;
+ i += 1;
if (!language) {
return setImmediate(next);
}
newLanguage = language.replace('_', '-').replace('@', '-x-');
if (newLanguage !== language) {
- ++j;
+ j += 1;
user.setSetting(uid, 'userLang', newLanguage, next);
} else {
setImmediate(next);
}
- }
+ },
], next);
}, next);
}, next);
- }
+ },
], function (err) {
if (err) {
return next(err);
@@ -297,7 +296,7 @@ Upgrade.upgrade = function (callback) {
async.parallel([
async.apply(db.sortedSetAdd, 'cid:' + topicData.cid + ':tids:pinned', Date.now(), topicData.tid),
async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids', topicData.tid),
- async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids:posts', topicData.tid)
+ async.apply(db.sortedSetRemove, 'cid:' + topicData.cid + ':tids:posts', topicData.tid),
], next);
}, next);
});
@@ -413,13 +412,13 @@ Upgrade.upgrade = function (callback) {
// IMPORTANT: REMEMBER TO UPDATE VALUE OF latestSchema IN LINE 24!!!
], function (err) {
if (!err) {
- if(updatesMade) {
+ if (updatesMade) {
winston.info('[upgrade] Schema update complete!');
} else {
winston.info('[upgrade] Schema already up to date!');
}
} else {
- switch(err.message) {
+ switch (err.message) {
case 'upgrade-not-possible':
winston.error('[upgrade] NodeBB upgrade could not complete, as your database schema is too far out of date.');
winston.error('[upgrade] Please ensure that you did not skip any minor version upgrades.');
diff --git a/src/user.js b/src/user.js
index 2ae5a4baf5..ccaea5a9c6 100644
--- a/src/user.js
+++ b/src/user.js
@@ -11,7 +11,6 @@ var privileges = require('./privileges');
var meta = require('./meta');
(function (User) {
-
User.email = require('./user/email');
User.notifications = require('./user/notifications');
User.reset = require('./user/reset');
@@ -64,9 +63,9 @@ var meta = require('./meta');
},
function (next) {
topics.pushUnreadCount(uid);
- plugins.fireHook('action:user.online', {uid: uid, timestamp: now});
+ plugins.fireHook('action:user.online', { uid: uid, timestamp: now });
next();
- }
+ },
], callback);
};
@@ -87,14 +86,14 @@ var meta = require('./meta');
},
function (uids, next) {
User.getUsers(uids, uid, next);
- }
+ },
], callback);
};
User.getUsersWithFields = function (uids, fields, uid, callback) {
async.waterfall([
function (next) {
- plugins.fireHook('filter:users.addFields', {fields: fields}, next);
+ plugins.fireHook('filter:users.addFields', { fields: fields }, next);
},
function (data, next) {
data.fields = data.fields.filter(function (field, index, array) {
@@ -107,7 +106,7 @@ var meta = require('./meta');
},
isAdmin: function (next) {
User.isAdministrator(uids, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -121,11 +120,11 @@ var meta = require('./meta');
user['email:confirmed'] = parseInt(user['email:confirmed'], 10) === 1;
}
});
- plugins.fireHook('filter:userlist.get', {users: results.userData, uid: uid}, next);
+ plugins.fireHook('filter:userlist.get', { users: results.userData, uid: uid }, next);
},
function (data, next) {
next(null, data.users);
- }
+ },
], callback);
};
@@ -162,7 +161,6 @@ var meta = require('./meta');
callback(null, isOnline);
});
}
-
};
User.exists = function (uid, callback) {
@@ -171,7 +169,7 @@ var meta = require('./meta');
User.existsBySlug = function (userslug, callback) {
User.getUidByUserslug(userslug, function (err, exists) {
- callback(err, !! exists);
+ callback(err, !!exists);
});
};
@@ -214,7 +212,7 @@ var meta = require('./meta');
},
function (uid, next) {
User.getUserField(uid, 'username', next);
- }
+ },
], callback);
};
@@ -269,7 +267,7 @@ var meta = require('./meta');
User.isAdminOrGlobalMod = function (uid, callback) {
async.parallel({
isAdmin: async.apply(User.isAdministrator, uid),
- isGlobalMod: async.apply(User.isGlobalModerator, uid)
+ isGlobalMod: async.apply(User.isGlobalModerator, uid),
}, function (err, results) {
callback(err, results ? (results.isAdmin || results.isGlobalMod) : false);
});
@@ -286,7 +284,7 @@ var meta = require('./meta');
callback();
});
};
-
+
User.isAdminOrGlobalModOrSelf = function (callerUid, uid, callback) {
if (parseInt(callerUid, 10) === parseInt(uid, 10)) {
return callback();
@@ -302,7 +300,7 @@ var meta = require('./meta');
User.getAdminsandGlobalMods = function (callback) {
async.parallel({
admins: async.apply(groups.getMembers, 'administrators', 0, -1),
- mods: async.apply(groups.getMembers, 'Global Moderators', 0, -1)
+ mods: async.apply(groups.getMembers, 'Global Moderators', 0, -1),
}, function (err, results) {
if (err) {
return callback(err);
@@ -318,7 +316,7 @@ var meta = require('./meta');
async.parallel([
async.apply(groups.getMembers, 'administrators', 0, -1),
async.apply(groups.getMembers, 'Global Moderators', 0, -1),
- async.apply(User.getModeratorUids)
+ async.apply(User.getModeratorUids),
], function (err, results) {
if (err) {
return callback(err);
@@ -343,7 +341,7 @@ var meta = require('./meta');
next(null, _.union.apply(_, memberSets));
});
- }
+ },
], callback);
};
@@ -362,7 +360,7 @@ var meta = require('./meta');
return cid && isMods[index];
});
next(null, cids);
- }
+ },
], callback);
};
@@ -374,7 +372,7 @@ var meta = require('./meta');
data.interstitials.push({
template: 'partials/acceptTos',
data: {
- termsOfUse: meta.config.termsOfUse
+ termsOfUse: meta.config.termsOfUse,
},
callback: function (userData, formData, next) {
if (formData['agree-terms'] === 'on') {
@@ -382,16 +380,14 @@ var meta = require('./meta');
}
next(userData.acceptTos ? null : new Error('[[register:terms_of_use_error]]'));
- }
+ },
});
}
callback(null, data);
- }
+ },
});
callback();
};
-
-
}(exports));
diff --git a/src/user/admin.js b/src/user/admin.js
index 4f7ecf66fb..cf3a2004db 100644
--- a/src/user/admin.js
+++ b/src/user/admin.js
@@ -9,7 +9,6 @@ var winston = require('winston');
var flags = require('../flags');
module.exports = function (User) {
-
User.logIP = function (uid, ip) {
var now = Date.now();
db.sortedSetAdd('uid:' + uid + ':ip', now, ip || 'Unknown');
@@ -40,7 +39,7 @@ module.exports = function (User) {
uids = users.map(function (user) {
return user.score;
});
- plugins.fireHook('filter:user.csvFields', {fields: ['uid', 'email', 'username']}, next);
+ plugins.fireHook('filter:user.csvFields', { fields: ['uid', 'email', 'username'] }, next);
},
function (data, next) {
User.getUsersFields(uids, data.fields, next);
@@ -53,7 +52,7 @@ module.exports = function (User) {
});
next(null, csvContent);
- }
+ },
], callback);
};
};
diff --git a/src/user/approval.js b/src/user/approval.js
index 2f9d9f847a..cbb1ba08b4 100644
--- a/src/user/approval.js
+++ b/src/user/approval.js
@@ -14,7 +14,6 @@ var utils = require('../../public/src/utils');
var plugins = require('../plugins');
module.exports = function (User) {
-
User.addToApprovalQueue = function (userData, callback) {
userData.userslug = utils.slugify(userData.username);
async.waterfall([
@@ -29,9 +28,9 @@ module.exports = function (User) {
username: userData.username,
email: userData.email,
ip: userData.ip,
- hashedPassword: hashedPassword
+ hashedPassword: hashedPassword,
};
- plugins.fireHook('filter:user.addToApprovalQueue', {data: data, userData: userData}, next);
+ plugins.fireHook('filter:user.addToApprovalQueue', { data: data, userData: userData }, next);
},
function (results, next) {
db.setObject('registration:queue:name:' + userData.username, results.data, next);
@@ -41,7 +40,7 @@ module.exports = function (User) {
},
function (next) {
sendNotificationToAdmins(userData.username, next);
- }
+ },
], callback);
};
@@ -52,12 +51,12 @@ module.exports = function (User) {
bodyShort: '[[notifications:new_register, ' + username + ']]',
nid: 'new_register:' + username,
path: '/admin/manage/registration',
- mergeId: 'new_register'
+ mergeId: 'new_register',
}, next);
},
function (notification, next) {
notifications.pushGroup(notification, 'administrators', next);
- }
+ },
], callback);
}
@@ -93,7 +92,7 @@ module.exports = function (User) {
username: username,
subject: subject,
template: 'registration_accepted',
- uid: uid
+ uid: uid,
};
emailer.send('registration_accepted', uid, data, next);
@@ -101,7 +100,7 @@ module.exports = function (User) {
},
function (next) {
next(null, uid);
- }
+ },
], callback);
};
@@ -115,7 +114,7 @@ module.exports = function (User) {
async.each(uids, function (uid, next) {
notifications.markRead(nid, uid, next);
}, next);
- }
+ },
], callback);
}
@@ -126,14 +125,14 @@ module.exports = function (User) {
},
function (next) {
markNotificationRead(username, next);
- }
+ },
], callback);
};
function removeFromQueue(username, callback) {
async.parallel([
async.apply(db.sortedSetRemove, 'registration:queue', username),
- async.apply(db.delete, 'registration:queue:name:' + username)
+ async.apply(db.delete, 'registration:queue:name:' + username),
], function (err) {
callback(err);
});
@@ -191,7 +190,7 @@ module.exports = function (User) {
'&email=' + encodeURIComponent(user.email) +
'&username=' + encodeURIComponent(user.username) +
'&f=json',
- json: true
+ json: true,
}, function (err, response, body) {
if (err) {
return next();
@@ -205,20 +204,18 @@ module.exports = function (User) {
next();
});
- }
+ },
], function (err) {
next(err, user);
});
}, next);
},
function (users, next) {
- plugins.fireHook('filter:user.getRegistrationQueue', {users: users}, next);
+ plugins.fireHook('filter:user.getRegistrationQueue', { users: users }, next);
},
function (results, next) {
next(null, results.users);
- }
+ },
], callback);
};
-
-
};
diff --git a/src/user/auth.js b/src/user/auth.js
index 219c468304..29a79f39c4 100644
--- a/src/user/auth.js
+++ b/src/user/auth.js
@@ -37,10 +37,10 @@ module.exports = function (User) {
events.log({
type: 'account-locked',
uid: uid,
- ip: ip
+ ip: ip,
});
next(new Error('[[error:account-locked]]'));
- }
+ },
], callback);
};
@@ -51,7 +51,7 @@ module.exports = function (User) {
User.auth.resetLockout = function (uid, callback) {
async.parallel([
async.apply(db.delete, 'loginAttempts:' + uid),
- async.apply(db.delete, 'lockout:' + uid)
+ async.apply(db.delete, 'lockout:' + uid),
], callback);
};
@@ -78,8 +78,8 @@ module.exports = function (User) {
});
// Revoke any sessions that have expired, return filtered list
- var expiredSids = [],
- expired;
+ var expiredSids = [];
+ var expired;
sessions = sessions.filter(function (sessionObj, idx) {
expired = !sessionObj || !sessionObj.hasOwnProperty('passport') ||
@@ -98,7 +98,7 @@ module.exports = function (User) {
}, function (err) {
next(err, sessions);
});
- }
+ },
], function (err, sessions) {
callback(err, sessions ? sessions.map(function (sessObj) {
sessObj.meta.datetimeISO = new Date(sessObj.meta.datetime).toISOString();
@@ -128,7 +128,7 @@ module.exports = function (User) {
}
},
async.apply(db.sortedSetRemove, 'uid:' + uid + ':sessions', sessionId),
- async.apply(db.sessionStore.destroy.bind(db.sessionStore), sessionId)
+ async.apply(db.sessionStore.destroy.bind(db.sessionStore), sessionId),
], callback);
});
};
@@ -140,14 +140,13 @@ module.exports = function (User) {
async.each(sids, function (sid, next) {
User.auth.revokeSession(sid, uid, next);
}, next);
- }
+ },
], callback);
};
User.auth.deleteAllSessions = function (callback) {
var _ = require('underscore');
batch.processSortedSet('users:joindate', function (uids, next) {
-
var sessionKeys = uids.map(function (uid) {
return 'uid:' + uid + ':sessions';
});
@@ -169,10 +168,10 @@ module.exports = function (User) {
async.each(sids, function (sid, next) {
db.sessionStore.destroy(sid, next);
}, next);
- }
+ },
], next);
- }
+ },
], next);
- }, {batch: 1000}, callback);
+ }, { batch: 1000 }, callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/user/bans.js b/src/user/bans.js
index 8667641c46..dc70d012dd 100644
--- a/src/user/bans.js
+++ b/src/user/bans.js
@@ -1,8 +1,8 @@
'use strict';
var async = require('async');
+
var db = require('../database');
-var plugins = require('../plugins');
module.exports = function (User) {
User.ban = function (uid, until, reason, callback) {
@@ -27,7 +27,7 @@ module.exports = function (User) {
var tasks = [
async.apply(User.setUserField, uid, 'banned', 1),
async.apply(db.sortedSetAdd, 'users:banned', now, uid),
- async.apply(db.sortedSetAdd, 'uid:' + uid + ':bans', now, until)
+ async.apply(db.sortedSetAdd, 'uid:' + uid + ':bans', now, until),
];
if (until > 0 && now < until) {
@@ -49,11 +49,11 @@ module.exports = function (User) {
User.unban = function (uid, callback) {
async.waterfall([
function (next) {
- User.setUserFields(uid, {banned: 0, 'banned:expire': 0}, next);
+ User.setUserFields(uid, { banned: 0, 'banned:expire': 0 }, next);
},
function (next) {
db.sortedSetsRemove(['users:banned', 'users:banned:expire'], uid, next);
- }
+ },
], callback);
};
@@ -75,11 +75,11 @@ module.exports = function (User) {
async.parallel([
async.apply(db.sortedSetRemove.bind(db), 'users:banned:expire', uid),
async.apply(db.sortedSetRemove.bind(db), 'users:banned', uid),
- async.apply(User.setUserFields, uid, {banned:0, 'banned:expire': 0})
+ async.apply(User.setUserFields, uid, { banned: 0, 'banned:expire': 0 }),
], function (err) {
next(err, false);
});
- }
+ },
], callback);
};
diff --git a/src/user/categories.js b/src/user/categories.js
index fee8fc8bb0..8a4b26199f 100644
--- a/src/user/categories.js
+++ b/src/user/categories.js
@@ -6,7 +6,6 @@ var db = require('../database');
var categories = require('../categories');
module.exports = function (User) {
-
User.getIgnoredCategories = function (uid, callback) {
db.getSortedSetRange('uid:' + uid + ':ignored:cids', 0, -1, callback);
};
@@ -18,7 +17,7 @@ module.exports = function (User) {
},
all: function (next) {
db.getSortedSetRange('categories:cid', 0, -1, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -48,7 +47,7 @@ module.exports = function (User) {
},
function (next) {
db.sortedSetAdd('cid:' + cid + ':ignorers', Date.now(), uid, next);
- }
+ },
], callback);
};
@@ -69,7 +68,7 @@ module.exports = function (User) {
},
function (next) {
db.sortedSetRemove('cid:' + cid + ':ignorers', uid, next);
- }
+ },
], callback);
};
-};
\ No newline at end of file
+};
diff --git a/src/user/create.js b/src/user/create.js
index c6cd92460a..40ba2d5540 100644
--- a/src/user/create.js
+++ b/src/user/create.js
@@ -9,7 +9,6 @@ var groups = require('../groups');
var meta = require('../meta');
module.exports = function (User) {
-
User.create = function (data, callback) {
data.username = data.username.trim();
data.userslug = utils.slugify(data.username);
@@ -18,31 +17,31 @@ module.exports = function (User) {
}
User.isDataValid(data, function (err) {
- if (err) {
+ if (err) {
return callback(err);
}
var timestamp = data.timestamp || Date.now();
var userData = {
- 'username': data.username,
- 'userslug': data.userslug,
- 'email': data.email || '',
- 'joindate': timestamp,
- 'lastonline': timestamp,
- 'picture': '',
- 'fullname': data.fullname || '',
- 'location': '',
- 'birthday': '',
- 'website': '',
- 'signature': '',
- 'uploadedpicture': '',
- 'profileviews': 0,
- 'reputation': 0,
- 'postcount': 0,
- 'topiccount': 0,
- 'lastposttime': 0,
- 'banned': 0,
- 'status': 'online'
+ username: data.username,
+ userslug: data.userslug,
+ email: data.email || '',
+ joindate: timestamp,
+ lastonline: timestamp,
+ picture: '',
+ fullname: data.fullname || '',
+ location: '',
+ birthday: '',
+ website: '',
+ signature: '',
+ uploadedpicture: '',
+ profileviews: 0,
+ reputation: 0,
+ postcount: 0,
+ topiccount: 0,
+ lastposttime: 0,
+ banned: 0,
+ status: 'online',
};
async.parallel({
@@ -50,8 +49,8 @@ module.exports = function (User) {
renameUsername(userData, next);
},
userData: function (next) {
- plugins.fireHook('filter:user.create', {user: userData, data: data}, next);
- }
+ plugins.fireHook('filter:user.create', { user: userData, data: data }, next);
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -106,7 +105,7 @@ module.exports = function (User) {
if (userData.email) {
async.parallel([
async.apply(db.sortedSetAdd, 'email:uid', userData.uid, userData.email.toLowerCase()),
- async.apply(db.sortedSetAdd, 'email:sorted', 0, userData.email.toLowerCase() + ':' + userData.uid)
+ async.apply(db.sortedSetAdd, 'email:sorted', 0, userData.email.toLowerCase() + ':' + userData.uid),
], next);
if (parseInt(userData.uid, 10) !== 1 && parseInt(meta.config.requireEmailConfirmation, 10) === 1) {
@@ -128,13 +127,13 @@ module.exports = function (User) {
async.parallel([
async.apply(User.setUserField, userData.uid, 'password', hash),
- async.apply(User.reset.updateExpiry, userData.uid)
+ async.apply(User.reset.updateExpiry, userData.uid),
], next);
});
},
function (next) {
User.updateDigestSetting(userData.uid, meta.config.dailyDigestFreq, next);
- }
+ },
], next);
},
function (results, next) {
@@ -143,7 +142,7 @@ module.exports = function (User) {
}
plugins.fireHook('action:user.create', {user: userData});
next(null, userData.uid);
- }
+ },
], callback);
});
});
@@ -179,7 +178,7 @@ module.exports = function (User) {
} else {
next();
}
- }
+ },
}, function (err) {
callback(err);
});
@@ -225,5 +224,4 @@ module.exports = function (User) {
});
});
}
-
};
diff --git a/src/user/data.js b/src/user/data.js
index 5716208ae5..2dca1b4143 100644
--- a/src/user/data.js
+++ b/src/user/data.js
@@ -9,7 +9,6 @@ var plugins = require('../plugins');
var utils = require('../../public/src/utils');
module.exports = function (User) {
-
var iconBackgrounds = ['#f44336', '#e91e63', '#9c27b0', '#673ab7', '#3f51b5', '#2196f3',
'#009688', '#1b5e20', '#33691e', '#827717', '#e65100', '#ff5722', '#795548', '#607d8b'];
@@ -143,7 +142,8 @@ module.exports = function (User) {
}
if (user.picture && user.picture === user.uploadedpicture) {
- user.picture = user.uploadedpicture = user.picture.startsWith('http') ? user.picture : nconf.get('relative_path') + user.picture;
+ user.uploadedpicture = user.picture.startsWith('http') ? user.picture : nconf.get('relative_path') + user.picture;
+ user.picture = user.uploadedpicture;
} else if (user.uploadedpicture) {
user.uploadedpicture = user.uploadedpicture.startsWith('http') ? user.uploadedpicture : nconf.get('relative_path') + user.uploadedpicture;
}
@@ -152,7 +152,7 @@ module.exports = function (User) {
user.status = User.getStatus(user);
}
- for(var i = 0; i < fieldsToRemove.length; ++i) {
+ for (var i = 0; i < fieldsToRemove.length; i += 1) {
user[fieldsToRemove[i]] = undefined;
}
@@ -182,7 +182,7 @@ module.exports = function (User) {
if (err) {
return callback(err);
}
- plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'set'});
+ plugins.fireHook('action:user.set', { uid: uid, field: field, value: value, type: 'set' });
callback();
});
};
@@ -195,7 +195,7 @@ module.exports = function (User) {
}
for (var field in data) {
if (data.hasOwnProperty(field)) {
- plugins.fireHook('action:user.set', {uid: uid, field: field, value: data[field], type: 'set'});
+ plugins.fireHook('action:user.set', { uid: uid, field: field, value: data[field], type: 'set' });
}
}
callback();
@@ -208,7 +208,7 @@ module.exports = function (User) {
if (err) {
return callback(err);
}
- plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'increment'});
+ plugins.fireHook('action:user.set', { uid: uid, field: field, value: value, type: 'increment' });
callback(null, value);
});
@@ -220,10 +220,9 @@ module.exports = function (User) {
if (err) {
return callback(err);
}
- plugins.fireHook('action:user.set', {uid: uid, field: field, value: value, type: 'decrement'});
+ plugins.fireHook('action:user.set', { uid: uid, field: field, value: value, type: 'decrement' });
callback(null, value);
});
};
-
};
diff --git a/src/user/delete.js b/src/user/delete.js
index e648c5dfb0..7392192c8b 100644
--- a/src/user/delete.js
+++ b/src/user/delete.js
@@ -10,7 +10,6 @@ var plugins = require('../plugins');
var batch = require('../batch');
module.exports = function (User) {
-
User.delete = function (callerUid, uid, callback) {
if (!parseInt(uid, 10)) {
return callback(new Error('[[error:invalid-uid]]'));
@@ -25,7 +24,7 @@ module.exports = function (User) {
},
function (next) {
User.deleteAccount(uid, next);
- }
+ },
], callback);
};
@@ -34,7 +33,7 @@ module.exports = function (User) {
async.eachSeries(ids, function (pid, next) {
posts.purge(pid, callerUid, next);
}, next);
- }, {alwaysStartAt: 0}, callback);
+ }, { alwaysStartAt: 0 }, callback);
}
function deleteTopics(callerUid, uid, callback) {
@@ -42,7 +41,7 @@ module.exports = function (User) {
async.eachSeries(ids, function (tid, next) {
topics.purge(tid, callerUid, next);
}, next);
- }, {alwaysStartAt: 0}, callback);
+ }, { alwaysStartAt: 0 }, callback);
}
User.deleteAccount = function (uid, callback) {
@@ -57,9 +56,9 @@ module.exports = function (User) {
}
User.getUserFields(uid, ['username', 'userslug', 'fullname', 'email'], next);
},
- function (_userData, next) {
+ function (_userData, next) {
userData = _userData;
- plugins.fireHook('static:user.delete', {uid: uid}, next);
+ plugins.fireHook('static:user.delete', { uid: uid }, next);
},
function (next) {
deleteVotes(uid, next);
@@ -88,7 +87,7 @@ module.exports = function (User) {
if (userData.email) {
async.parallel([
async.apply(db.sortedSetRemove, 'email:uid', userData.email.toLowerCase()),
- async.apply(db.sortedSetRemove, 'email:sorted', userData.email.toLowerCase() + ':' + uid)
+ async.apply(db.sortedSetRemove, 'email:sorted', userData.email.toLowerCase() + ':' + uid),
], next);
} else {
next();
@@ -104,7 +103,7 @@ module.exports = function (User) {
'users:notvalidated',
'digest:day:uids',
'digest:week:uids',
- 'digest:month:uids'
+ 'digest:month:uids',
], uid, next);
},
function (next) {
@@ -123,7 +122,7 @@ module.exports = function (User) {
'uid:' + uid + ':chat:rooms', 'uid:' + uid + ':chat:rooms:unread',
'uid:' + uid + ':upvote', 'uid:' + uid + ':downvote',
'uid:' + uid + ':ignored:cids', 'uid:' + uid + ':flag:pids',
- 'uid:' + uid + ':sessions', 'uid:' + uid + ':sessionUUID:sessionId'
+ 'uid:' + uid + ':sessions', 'uid:' + uid + ':sessionUUID:sessionId',
];
db.deleteAll(keys, next);
},
@@ -135,12 +134,12 @@ module.exports = function (User) {
},
function (next) {
groups.leaveAllGroups(uid, next);
- }
+ },
], next);
},
function (results, next) {
db.deleteAll(['followers:' + uid, 'following:' + uid, 'user:' + uid], next);
- }
+ },
], callback);
};
@@ -149,7 +148,7 @@ module.exports = function (User) {
function (next) {
async.parallel({
upvotedPids: async.apply(db.getSortedSetRange, 'uid:' + uid + ':upvote', 0, -1),
- downvotedPids: async.apply(db.getSortedSetRange, 'uid:' + uid + ':downvote', 0, -1)
+ downvotedPids: async.apply(db.getSortedSetRange, 'uid:' + uid + ':downvote', 0, -1),
}, next);
},
function (pids, next) {
@@ -160,7 +159,7 @@ module.exports = function (User) {
async.eachSeries(pids, function (pid, next) {
posts.unvote(pid, uid, next);
}, next);
- }
+ },
], function (err) {
callback(err);
});
@@ -181,9 +180,9 @@ module.exports = function (User) {
async.parallel([
async.apply(db.sortedSetsRemove, roomKeys, uid),
- async.apply(db.deleteAll, userKeys)
+ async.apply(db.deleteAll, userKeys),
], next);
- }
+ },
], function (err) {
callback(err);
});
@@ -202,14 +201,14 @@ module.exports = function (User) {
},
function (next) {
db.delete('uid:' + uid + ':ip', next);
- }
+ },
], callback);
}
function deleteUserFromFollowers(uid, callback) {
async.parallel({
followers: async.apply(db.getSortedSetRange, 'followers:' + uid, 0, -1),
- following: async.apply(db.getSortedSetRange, 'following:' + uid, 0, -1)
+ following: async.apply(db.getSortedSetRange, 'following:' + uid, 0, -1),
}, function (err, results) {
function updateCount(uids, name, fieldName, next) {
async.each(uids, function (uid, next) {
@@ -238,7 +237,7 @@ module.exports = function (User) {
async.parallel([
async.apply(db.sortedSetsRemove, followerSets.concat(followingSets), uid),
async.apply(updateCount, results.following, 'followers:', 'followerCount'),
- async.apply(updateCount, results.followers, 'following:', 'followingCount')
+ async.apply(updateCount, results.followers, 'following:', 'followingCount'),
], callback);
});
}
diff --git a/src/user/digest.js b/src/user/digest.js
index 9c86aca26d..73cd773713 100644
--- a/src/user/digest.js
+++ b/src/user/digest.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var winston = require('winston');
@@ -31,7 +31,7 @@ var utils = require('../../public/src/utils');
function (next) {
async.parallel({
topics: async.apply(topics.getLatestTopics, 0, 0, 9, interval),
- subscribers: async.apply(Digest.getSubscribers, interval)
+ subscribers: async.apply(Digest.getSubscribers, interval),
}, next);
},
function (data, next) {
@@ -52,7 +52,7 @@ var utils = require('../../public/src/utils');
data.interval = interval;
Digest.send(data, next);
- }
+ },
], function (err) {
if (err) {
winston.error('[user/jobs] Could not send digests (' + interval + '): ' + err.message);
@@ -72,12 +72,12 @@ var utils = require('../../public/src/utils');
function (subscribers, next) {
plugins.fireHook('filter:digest.subscribers', {
interval: interval,
- subscribers: subscribers
+ subscribers: subscribers,
}, next);
},
function (results, next) {
next(null, results.subscribers);
- }
+ },
], callback);
};
@@ -118,16 +118,15 @@ var utils = require('../../public/src/utils');
site_title: meta.config.title || meta.config.browserTitle || 'NodeBB',
notifications: notifications,
recent: data.topics.topics,
- interval: data.interval
+ interval: data.interval,
});
next();
- }
+ },
], next);
}, next);
- }
+ },
], function (err) {
callback(err);
});
};
-
}(module.exports));
diff --git a/src/user/email.js b/src/user/email.js
index 99d2d9693d..f75ff9cf9b 100644
--- a/src/user/email.js
+++ b/src/user/email.js
@@ -13,7 +13,6 @@ var meta = require('../meta');
var emailer = require('../emailer');
(function (UserEmail) {
-
UserEmail.exists = function (email, callback) {
user.getUidByEmail(email.toLowerCase(), function (err, exists) {
callback(err, !!exists);
@@ -53,11 +52,11 @@ var emailer = require('../emailer');
confirm_code = _confirm_code;
db.setObject('confirm:' + confirm_code, {
email: email.toLowerCase(),
- uid: uid
+ uid: uid,
}, next);
},
function (next) {
- db.expireAt('confirm:' + confirm_code, Math.floor(Date.now() / 1000 + 60 * 60 * 24), next);
+ db.expireAt('confirm:' + confirm_code, Math.floor((Date.now() / 1000) + (60 * 60 * 24)), next);
},
function (next) {
user.getUserField(uid, 'username', next);
@@ -73,17 +72,17 @@ var emailer = require('../emailer');
subject: subject,
template: 'welcome',
- uid: uid
+ uid: uid,
};
if (plugins.hasListeners('action:user.verify')) {
- plugins.fireHook('action:user.verify', {uid: uid, data: data});
+ plugins.fireHook('action:user.verify', { uid: uid, data: data });
next();
} else {
emailer.send('welcome', uid, data, next);
}
});
- }
+ },
], callback);
};
@@ -102,8 +101,8 @@ var emailer = require('../emailer');
db.sortedSetRemove('users:notvalidated', confirmObj.uid, next);
},
function (next) {
- plugins.fireHook('action:user.email.confirmed', {uid: confirmObj.uid, email: confirmObj.email}, next);
- }
+ plugins.fireHook('action:user.email.confirmed', { uid: confirmObj.uid, email: confirmObj.email }, next);
+ },
], function (err) {
callback(err ? new Error('[[error:email-confirm-failed]]') : null);
});
@@ -112,5 +111,4 @@ var emailer = require('../emailer');
}
});
};
-
}(exports));
diff --git a/src/user/follow.js b/src/user/follow.js
index e6c9624018..fe3dc0931d 100644
--- a/src/user/follow.js
+++ b/src/user/follow.js
@@ -6,7 +6,6 @@ var plugins = require('../plugins');
var db = require('../database');
module.exports = function (User) {
-
User.follow = function (uid, followuid, callback) {
toggleFollow('follow', uid, followuid, callback);
};
@@ -44,7 +43,7 @@ module.exports = function (User) {
async.apply(db.sortedSetAdd, 'following:' + uid, now, theiruid),
async.apply(db.sortedSetAdd, 'followers:' + theiruid, now, uid),
async.apply(User.incrementUserFieldBy, uid, 'followingCount', 1),
- async.apply(User.incrementUserFieldBy, theiruid, 'followerCount', 1)
+ async.apply(User.incrementUserFieldBy, theiruid, 'followerCount', 1),
], next);
} else {
if (!isFollowing) {
@@ -54,10 +53,10 @@ module.exports = function (User) {
async.apply(db.sortedSetRemove, 'following:' + uid, theiruid),
async.apply(db.sortedSetRemove, 'followers:' + theiruid, uid),
async.apply(User.decrementUserFieldBy, uid, 'followingCount', 1),
- async.apply(User.decrementUserFieldBy, theiruid, 'followerCount', 1)
+ async.apply(User.decrementUserFieldBy, theiruid, 'followerCount', 1),
], next);
}
- }
+ },
], callback);
}
@@ -82,12 +81,12 @@ module.exports = function (User) {
uids: uids,
uid: uid,
start: start,
- stop: stop
+ stop: stop,
}, next);
},
function (data, next) {
User.getUsers(data.uids, uid, next);
- }
+ },
], callback);
}
@@ -97,5 +96,4 @@ module.exports = function (User) {
}
db.isSortedSetMember('following:' + uid, theirid, callback);
};
-
};
diff --git a/src/user/info.js b/src/user/info.js
index 296dd9a723..4af1b77f35 100644
--- a/src/user/info.js
+++ b/src/user/info.js
@@ -11,7 +11,9 @@ var topics = require('../topics');
module.exports = function (User) {
User.getLatestBanInfo = function (uid, callback) {
// Simply retrieves the last record of the user's ban, even if they've been unbanned since then.
- var timestamp, expiry, reason;
+ var timestamp;
+ var expiry;
+ var reason;
async.waterfall([
async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':bans', 0, 0),
@@ -28,7 +30,7 @@ module.exports = function (User) {
function (_reason, next) {
reason = _reason && _reason.length ? _reason[0] : '';
next();
- }
+ },
], function (err) {
if (err) {
return callback(err);
@@ -39,7 +41,7 @@ module.exports = function (User) {
timestamp: timestamp,
expiry: parseInt(expiry, 10),
expiry_readable: new Date(parseInt(expiry, 10)).toString().replace(/:/g, '%3A'),
- reason: validator.escape(String(reason))
+ reason: validator.escape(String(reason)),
});
});
};
@@ -50,12 +52,12 @@ module.exports = function (User) {
async.parallel({
flags: async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':flag:pids', 0, 19),
bans: async.apply(db.getSortedSetRevRangeWithScores, 'uid:' + uid + ':bans', 0, 19),
- reasons: async.apply(db.getSortedSetRevRangeWithScores, 'banned:' + uid + ':reasons', 0, 19)
+ reasons: async.apply(db.getSortedSetRevRangeWithScores, 'banned:' + uid + ':reasons', 0, 19),
}, next);
},
function (data, next) {
getFlagMetadata(data, next);
- }
+ },
], function (err, data) {
if (err) {
return callback(err);
@@ -117,9 +119,9 @@ module.exports = function (User) {
function formatBanData(data) {
var reasons = data.reasons.reduce(function (memo, cur) {
- memo[cur.score] = cur.value;
- return memo;
- }, {});
+ memo[cur.score] = cur.value;
+ return memo;
+ }, {});
data.bans = data.bans.map(function (banObj) {
banObj.until = parseInt(banObj.value, 10);
diff --git a/src/user/invite.js b/src/user/invite.js
index 043bf62a7b..4e41b824a5 100644
--- a/src/user/invite.js
+++ b/src/user/invite.js
@@ -12,7 +12,6 @@ var utils = require('../../public/src/utils');
module.exports = function (User) {
-
User.getInvites = function (uid, callback) {
db.getSetMembers('invitation:uid:' + uid, callback);
};
@@ -37,11 +36,11 @@ module.exports = function (User) {
invitations = invitations.map(function (invites, index) {
return {
uid: uids[index],
- invitations: invites
+ invitations: invites,
};
});
next(null, invitations);
- }
+ },
], callback);
};
@@ -68,7 +67,7 @@ module.exports = function (User) {
},
function (next) {
db.setAdd('invitation:uids', uid, next);
- }
+ },
], function (err) {
next(err);
});
@@ -90,12 +89,12 @@ module.exports = function (User) {
registerLink: registerLink,
subject: subject,
username: username,
- template: 'invitation'
+ template: 'invitation',
};
emailer.sendToEmail('invitation', email, meta.config.defaultLang, data, next);
});
- }
+ },
], callback);
};
@@ -114,7 +113,7 @@ module.exports = function (User) {
}
next();
- }
+ },
], callback);
};
@@ -134,11 +133,11 @@ module.exports = function (User) {
},
function (next) {
db.delete('invitation:email:' + email, next);
- }
+ },
], function (err) {
next(err);
});
- }
+ },
], callback);
};
@@ -156,7 +155,7 @@ module.exports = function (User) {
},
function (next) {
db.delete('invitation:email:' + email, next);
- }
+ },
], callback);
};
@@ -173,8 +172,7 @@ module.exports = function (User) {
return db.setRemove('invitation:uids', uid, next);
}
setImmediate(next);
- }
+ },
], callback);
}
-
};
diff --git a/src/user/jobs.js b/src/user/jobs.js
index c01f2c613c..1eeeb5650e 100644
--- a/src/user/jobs.js
+++ b/src/user/jobs.js
@@ -22,12 +22,12 @@ module.exports = function (User) {
}
// Terminate any active cron jobs
- for(var jobId in jobs) {
+ for (var jobId in jobs) {
if (jobs.hasOwnProperty(jobId)) {
winston.verbose('[user/jobs] Terminating job (' + jobId + ')');
jobs[jobId].stop();
delete jobs[jobId];
- ++terminated;
+ terminated += 1;
}
}
winston.verbose('[user/jobs] ' + terminated + ' jobs terminated');
@@ -37,33 +37,31 @@ module.exports = function (User) {
User.digest.execute('day');
}, null, true);
winston.verbose('[user/jobs] Starting job (digest.daily)');
- ++started;
+ started += 1;
jobs['digest.weekly'] = new cronJob('0 ' + digestHour + ' * * 0', function () {
winston.verbose('[user/jobs] Digest job (weekly) started.');
User.digest.execute('week');
}, null, true);
winston.verbose('[user/jobs] Starting job (digest.weekly)');
- ++started;
+ started += 1;
jobs['digest.monthly'] = new cronJob('0 ' + digestHour + ' 1 * *', function () {
winston.verbose('[user/jobs] Digest job (monthly) started.');
User.digest.execute('month');
}, null, true);
winston.verbose('[user/jobs] Starting job (digest.monthly)');
- ++started;
+ started += 1;
jobs['reset.clean'] = new cronJob('0 0 * * *', User.reset.clean, null, true);
winston.verbose('[user/jobs] Starting job (reset.clean)');
- ++started;
+ started += 1;
winston.verbose('[user/jobs] ' + started + ' jobs started');
if (typeof callback === 'function') {
callback();
}
-
- return;
};
};
diff --git a/src/user/notifications.js b/src/user/notifications.js
index 7182c1a223..f830092b07 100644
--- a/src/user/notifications.js
+++ b/src/user/notifications.js
@@ -11,10 +11,9 @@ var notifications = require('../notifications');
var privileges = require('../privileges');
(function (UserNotifications) {
-
UserNotifications.get = function (uid, callback) {
if (!parseInt(uid, 10)) {
- return callback(null , {read: [], unread: []});
+ return callback(null, { read: [], unread: [] });
}
getNotifications(uid, 0, 9, function (err, notifications) {
if (err) {
@@ -54,7 +53,7 @@ var privileges = require('../privileges');
},
read: function (next) {
getNotificationsFromSet('uid:' + uid + ':notifications:read', true, uid, start, stop, next);
- }
+ },
}, callback);
}
@@ -64,7 +63,7 @@ var privileges = require('../privileges');
async.waterfall([
async.apply(db.getSortedSetRevRange, set, start, stop),
function (nids, next) {
- if(!Array.isArray(nids) || !nids.length) {
+ if (!Array.isArray(nids) || !nids.length) {
return callback(null, []);
}
@@ -89,7 +88,7 @@ var privileges = require('../privileges');
}
notifications.merge(notifs, next);
- }
+ },
], callback);
}
@@ -137,7 +136,7 @@ var privileges = require('../privileges');
});
db.getObjectsFields(keys, ['mergeId'], next);
- }
+ },
], function (err, mergeIds) {
// A missing (null) mergeId means that notification is counted separately.
mergeIds = mergeIds.map(function (set) {
@@ -146,7 +145,7 @@ var privileges = require('../privileges');
callback(err, mergeIds.reduce(function (count, cur, idx, arr) {
if (cur === null || idx === arr.indexOf(cur)) {
- ++count;
+ count += 1;
}
return count;
@@ -195,7 +194,7 @@ var privileges = require('../privileges');
},
function (next) {
db.delete('uid:' + uid + ':notifications:read', next);
- }
+ },
], callback);
};
@@ -229,9 +228,9 @@ var privileges = require('../privileges');
path: '/post/' + postData.pid,
nid: 'tid:' + postData.tid + ':uid:' + uid,
tid: postData.tid,
- from: uid
+ from: uid,
}, next);
- }
+ },
], function (err, notification) {
if (err) {
return winston.error(err);
@@ -254,7 +253,7 @@ var privileges = require('../privileges');
notifications.create({
bodyShort: meta.config.welcomeNotification,
path: path,
- nid: 'welcome_' + uid
+ nid: 'welcome_' + uid,
}, function (err, notification) {
if (err || !notification) {
return callback(err);
@@ -269,7 +268,7 @@ var privileges = require('../privileges');
bodyShort: '[[user:username_taken_workaround, ' + username + ']]',
image: 'brand:logo',
nid: 'username_taken:' + uid,
- datetime: Date.now()
+ datetime: Date.now(),
}, function (err, notification) {
if (!err && notification) {
notifications.push(notification, uid);
@@ -287,5 +286,4 @@ var privileges = require('../privileges');
websockets.in('uid_' + uid).emit('event:notifications.updateCount', count);
});
};
-
}(exports));
diff --git a/src/user/password.js b/src/user/password.js
index 8e9b7780e3..6cf5d8e5d5 100644
--- a/src/user/password.js
+++ b/src/user/password.js
@@ -7,7 +7,6 @@ var db = require('../database');
var Password = require('../password');
module.exports = function (User) {
-
User.hashPassword = function (password, callback) {
if (!password) {
return callback(null, password);
@@ -34,7 +33,7 @@ module.exports = function (User) {
Password.compare(password, hashedPassword, next);
});
- }
+ },
], callback);
};
@@ -43,5 +42,4 @@ module.exports = function (User) {
callback(err, !!hashedPassword);
});
};
-
-};
\ No newline at end of file
+};
diff --git a/src/user/picture.js b/src/user/picture.js
index 09b7d636e8..be489364b9 100644
--- a/src/user/picture.js
+++ b/src/user/picture.js
@@ -14,9 +14,8 @@ var meta = require('../meta');
var db = require('../database');
module.exports = function (User) {
-
User.uploadPicture = function (uid, picture, callback) {
- User.uploadCroppedPicture({uid: uid, file: picture}, callback);
+ User.uploadCroppedPicture({ uid: uid, file: picture }, callback);
};
User.uploadFromUrl = function (uid, url, callback) {
@@ -46,18 +45,18 @@ module.exports = function (User) {
uid: uid,
image: {
url: url,
- name: ''
- }
+ name: '',
+ },
}, next);
},
function (image, next) {
User.setUserFields(uid, {
uploadedpicture: image.url,
- picture: image.url
+ picture: image.url,
}, function (err) {
next(err, image);
});
- }
+ },
], callback);
};
@@ -66,11 +65,10 @@ module.exports = function (User) {
};
User.updateCoverPicture = function (data, callback) {
-
var url;
var picture = {
name: 'profileCover',
- uid: data.uid
+ uid: data.uid,
};
if (!data.imageData && data.position) {
@@ -112,18 +110,17 @@ module.exports = function (User) {
} else {
setImmediate(next);
}
- }
+ },
], function (err) {
deleteFile(picture.path);
callback(err, {
- url: url
+ url: url,
});
});
};
User.uploadCroppedPicture = function (data, callback) {
-
- if (parseInt(meta.config.allowProfileImageUploads) !== 1) {
+ if (parseInt(meta.config.allowProfileImageUploads, 10) !== 1) {
return callback(new Error('[[error:profile-image-uploads-disabled]]'));
}
@@ -147,7 +144,7 @@ module.exports = function (User) {
var picture = {
name: 'profileAvatar',
- uid: data.uid
+ uid: data.uid,
};
async.waterfall([
@@ -168,7 +165,7 @@ module.exports = function (User) {
path: picture.path,
extension: extension,
width: imageDimension,
- height: imageDimension
+ height: imageDimension,
}, next);
},
function (next) {
@@ -180,9 +177,9 @@ module.exports = function (User) {
User.setUserFields(data.uid, {
uploadedpicture: uploadedImage.url,
- picture: uploadedImage.url
+ picture: uploadedImage.url,
}, next);
- }
+ },
], function (err) {
deleteFile(picture.path);
callback(err, uploadedImage);
@@ -208,7 +205,7 @@ module.exports = function (User) {
if (plugins.hasListeners('filter:uploadImage')) {
return plugins.fireHook('filter:uploadImage', {
image: image,
- uid: image.uid
+ uid: image.uid,
}, callback);
}
@@ -233,9 +230,9 @@ module.exports = function (User) {
next(null, {
url: nconf.get('relative_path') + upload.url,
path: upload.path,
- name: image.name
+ name: image.name,
});
- }
+ },
], callback);
}
diff --git a/src/user/posts.js b/src/user/posts.js
index 37b5e92b16..3f2d608ee1 100644
--- a/src/user/posts.js
+++ b/src/user/posts.js
@@ -6,7 +6,6 @@ var meta = require('../meta');
var privileges = require('../privileges');
module.exports = function (User) {
-
User.isReadyToPost = function (uid, cid, callback) {
if (parseInt(uid, 10) === 0) {
return callback();
@@ -21,7 +20,7 @@ module.exports = function (User) {
},
isAdminOrMod: function (next) {
privileges.categories.isAdminOrMod(cid, uid, next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -75,7 +74,7 @@ module.exports = function (User) {
},
function (next) {
User.updateLastOnlineTime(postData.uid, next);
- }
+ },
], callback);
};
@@ -101,5 +100,4 @@ module.exports = function (User) {
callback(err, Array.isArray(pids) ? pids : []);
});
};
-
-};
\ No newline at end of file
+};
diff --git a/src/user/profile.js b/src/user/profile.js
index c25dd3bf83..84c142f35b 100644
--- a/src/user/profile.js
+++ b/src/user/profile.js
@@ -11,7 +11,6 @@ var groups = require('../groups');
var plugins = require('../plugins');
module.exports = function (User) {
-
User.updateProfile = function (uid, data, callback) {
var fields = ['username', 'email', 'fullname', 'website', 'location',
'groupTitle', 'birthday', 'signature', 'aboutme'];
@@ -21,7 +20,7 @@ module.exports = function (User) {
async.waterfall([
function (next) {
- plugins.fireHook('filter:user.updateProfile', {uid: uid, data: data, fields: fields}, next);
+ plugins.fireHook('filter:user.updateProfile', { uid: uid, data: data, fields: fields }, next);
},
function (data, next) {
fields = data.fields;
@@ -32,7 +31,7 @@ module.exports = function (User) {
async.apply(isSignatureValid, data),
async.apply(isEmailAvailable, data, updateUid),
async.apply(isUsernameAvailable, data, updateUid),
- async.apply(isGroupTitleValid, data)
+ async.apply(isGroupTitleValid, data),
], function (err) {
next(err);
});
@@ -63,9 +62,9 @@ module.exports = function (User) {
}, next);
},
function (next) {
- plugins.fireHook('action:user.updateProfile', {uid: uid, data: data, fields: fields, oldData: oldData});
+ plugins.fireHook('action:user.updateProfile', { uid: uid, data: data, fields: fields, oldData: oldData });
User.getUserFields(updateUid, ['email', 'username', 'userslug', 'picture', 'icon:text', 'icon:bgColor'], next);
- }
+ },
], callback);
};
@@ -106,7 +105,7 @@ module.exports = function (User) {
},
function (available, next) {
next(!available ? new Error('[[error:email-taken]]') : null);
- }
+ },
], callback);
}
@@ -141,7 +140,7 @@ module.exports = function (User) {
},
function (exists, next) {
next(exists ? new Error('[[error:username-taken]]') : null);
- }
+ },
], callback);
}
@@ -166,7 +165,7 @@ module.exports = function (User) {
}
async.series([
async.apply(db.sortedSetRemove, 'email:uid', oldEmail.toLowerCase()),
- async.apply(db.sortedSetRemove, 'email:sorted', oldEmail.toLowerCase() + ':' + uid)
+ async.apply(db.sortedSetRemove, 'email:sorted', oldEmail.toLowerCase() + ':' + uid),
], function (err) {
next(err);
});
@@ -177,7 +176,7 @@ module.exports = function (User) {
db.sortedSetAdd('email:uid', uid, newEmail.toLowerCase(), next);
},
function (next) {
- db.sortedSetAdd('email:sorted', 0, newEmail.toLowerCase() + ':' + uid, next);
+ db.sortedSetAdd('email:sorted', 0, newEmail.toLowerCase() + ':' + uid, next);
},
function (next) {
db.sortedSetAdd('user:' + uid + ':emails', Date.now(), newEmail + ':' + Date.now(), next);
@@ -193,11 +192,11 @@ module.exports = function (User) {
},
function (next) {
db.sortedSetAdd('users:notvalidated', Date.now(), uid, next);
- }
+ },
], function (err) {
next(err);
});
- }
+ },
], callback);
}
@@ -223,7 +222,7 @@ module.exports = function (User) {
async.series([
async.apply(db.sortedSetRemove, 'username:sorted', userData.username.toLowerCase() + ':' + uid),
async.apply(db.sortedSetAdd, 'username:sorted', 0, newUsername.toLowerCase() + ':' + uid),
- async.apply(db.sortedSetAdd, 'user:' + uid + ':usernames', Date.now(), newUsername + ':' + Date.now())
+ async.apply(db.sortedSetAdd, 'user:' + uid + ':usernames', Date.now(), newUsername + ':' + Date.now()),
], next);
},
], callback);
@@ -248,7 +247,7 @@ module.exports = function (User) {
} else {
next();
}
- }
+ },
], callback);
}
@@ -259,7 +258,7 @@ module.exports = function (User) {
},
function (fullname, next) {
updateUidMapping('fullname', uid, newFullname, fullname, next);
- }
+ },
], callback);
}
@@ -289,11 +288,11 @@ module.exports = function (User) {
function (hashedPassword, next) {
async.parallel([
async.apply(User.setUserField, data.uid, 'password', hashedPassword),
- async.apply(User.reset.updateExpiry, data.uid)
+ async.apply(User.reset.updateExpiry, data.uid),
], function (err) {
next(err);
});
- }
+ },
], callback);
};
};
diff --git a/src/user/reset.js b/src/user/reset.js
index 39bf1f0e07..ba0e18b513 100644
--- a/src/user/reset.js
+++ b/src/user/reset.js
@@ -1,16 +1,16 @@
'use strict';
-var async = require('async'),
- nconf = require('nconf'),
- winston = require('winston'),
+var async = require('async');
+var nconf = require('nconf');
+var winston = require('winston');
- user = require('../user'),
- utils = require('../../public/src/utils'),
- translator = require('../../public/src/modules/translator'),
+var user = require('../user');
+var utils = require('../../public/src/utils');
+var translator = require('../../public/src/modules/translator');
- db = require('../database'),
- meta = require('../meta'),
- emailer = require('../emailer');
+var db = require('../database');
+var meta = require('../meta');
+var emailer = require('../emailer');
(function (UserReset) {
var twoHours = 7200000;
@@ -28,7 +28,7 @@ var async = require('async'),
},
function (issueDate, next) {
next(null, parseInt(issueDate, 10) > Date.now() - twoHours);
- }
+ },
], callback);
};
@@ -36,7 +36,7 @@ var async = require('async'),
var code = utils.generateUUID();
async.parallel([
async.apply(db.setObjectField, 'reset:uid', code, uid),
- async.apply(db.sortedSetAdd, 'reset:issueDate', Date.now(), code)
+ async.apply(db.sortedSetAdd, 'reset:issueDate', Date.now(), code),
], function (err) {
callback(err, code);
});
@@ -48,11 +48,11 @@ var async = require('async'),
db.sortedSetScore('reset:issueDate:uid', uid, next);
},
function (score, next) {
- if (score > Date.now() - 1000 * 60) {
+ if (score > Date.now() - (1000 * 60)) {
return next(new Error('[[error:cant-reset-password-more-than-once-a-minute]]'));
}
next();
- }
+ },
], callback);
}
@@ -88,9 +88,9 @@ var async = require('async'),
reset_link: reset_link,
subject: subject,
template: 'reset',
- uid: uid
+ uid: uid,
}, next);
- }
+ },
], callback);
};
@@ -124,9 +124,9 @@ var async = require('async'),
async.apply(db.sortedSetRemove, 'reset:issueDate', code),
async.apply(db.sortedSetRemove, 'reset:issueDate:uid', uid),
async.apply(user.reset.updateExpiry, uid),
- async.apply(user.auth.resetLockout, uid)
+ async.apply(user.auth.resetLockout, uid),
], next);
- }
+ },
], callback);
};
@@ -148,7 +148,7 @@ var async = require('async'),
},
uids: function (next) {
db.getSortedSetRangeByScore('reset:issueDate:uid', 0, -1, '-inf', Date.now() - twoHours, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -160,10 +160,9 @@ var async = require('async'),
async.parallel([
async.apply(db.deleteObjectFields, 'reset:uid', results.tokens),
async.apply(db.sortedSetRemove, 'reset:issueDate', results.tokens),
- async.apply(db.sortedSetRemove, 'reset:issueDate:uid', results.uids)
+ async.apply(db.sortedSetRemove, 'reset:issueDate:uid', results.uids),
], next);
- }
+ },
], callback);
};
-
}(exports));
diff --git a/src/user/search.js b/src/user/search.js
index 65d0e41a6a..4583e0e28f 100644
--- a/src/user/search.js
+++ b/src/user/search.js
@@ -7,7 +7,6 @@ var plugins = require('../plugins');
var db = require('../database');
module.exports = function (User) {
-
User.search = function (data, callback) {
var query = data.query || '';
var searchBy = data.searchBy || 'username';
@@ -34,7 +33,7 @@ module.exports = function (User) {
filterAndSortUids(uids, data, next);
},
function (uids, next) {
- plugins.fireHook('filter:users.search', {uids: uids, uid: uid}, next);
+ plugins.fireHook('filter:users.search', { uids: uids, uid: uid }, next);
},
function (data, next) {
var uids = data.uids;
@@ -54,7 +53,7 @@ module.exports = function (User) {
searchResult.timing = (process.elapsedTimeSince(startTime) / 1000).toFixed(2);
searchResult.users = userData;
next(null, searchResult);
- }
+ },
], callback);
};
@@ -135,9 +134,9 @@ module.exports = function (User) {
});
} else {
userData.sort(function (u1, u2) {
- if(u1[sortBy] < u2[sortBy]) {
+ if (u1[sortBy] < u2[sortBy]) {
return -1;
- } else if(u1[sortBy] > u2[sortBy]) {
+ } else if (u1[sortBy] > u2[sortBy]) {
return 1;
}
return 0;
@@ -156,9 +155,9 @@ module.exports = function (User) {
},
function (users, next) {
var diff = process.hrtime(start);
- var timing = (diff[0] * 1e3 + diff[1] / 1e6).toFixed(1);
- next(null, {timing: timing, users: users});
- }
+ var timing = ((diff[0] * 1e3) + (diff[1] / 1e6)).toFixed(1);
+ next(null, { timing: timing, users: users });
+ },
], callback);
}
};
diff --git a/src/user/settings.js b/src/user/settings.js
index 3d93a9724a..870dd2e59c 100644
--- a/src/user/settings.js
+++ b/src/user/settings.js
@@ -7,7 +7,6 @@ var db = require('../database');
var plugins = require('../plugins');
module.exports = function (User) {
-
User.getSettings = function (uid, callback) {
if (!parseInt(uid, 10)) {
return onSettingsLoaded(0, {}, callback);
@@ -18,7 +17,7 @@ module.exports = function (User) {
return callback(err);
}
- onSettingsLoaded(uid, settings ? settings : {}, callback);
+ onSettingsLoaded(uid, settings || {}, callback);
});
};
@@ -36,7 +35,7 @@ module.exports = function (User) {
return callback(err);
}
- for (var i = 0; i < settings.length; ++i) {
+ for (var i = 0; i < settings.length; i += 1) {
settings[i] = settings[i] || {};
settings[i].uid = uids[i];
}
@@ -48,7 +47,7 @@ module.exports = function (User) {
};
function onSettingsLoaded(uid, settings, callback) {
- plugins.fireHook('filter:user.getSettings', {uid: uid, settings: settings}, function (err, data) {
+ plugins.fireHook('filter:user.getSettings', { uid: uid, settings: settings }, function (err, data) {
if (err) {
return callback(err);
}
@@ -102,7 +101,7 @@ module.exports = function (User) {
data.userLang = data.userLang || meta.config.defaultLang;
- plugins.fireHook('action:user.saveSettings', {uid: uid, settings: data});
+ plugins.fireHook('action:user.saveSettings', { uid: uid, settings: data });
var settings = {
showemail: data.showemail,
@@ -120,11 +119,11 @@ module.exports = function (User) {
restrictChat: data.restrictChat,
topicSearchEnabled: data.topicSearchEnabled,
delayImageLoading: data.delayImageLoading,
- homePageRoute : ((data.homePageRoute === 'custom' ? data.homePageCustom : data.homePageRoute) || '').replace(/^\//, ''),
+ homePageRoute: ((data.homePageRoute === 'custom' ? data.homePageCustom : data.homePageRoute) || '').replace(/^\//, ''),
scrollToMyPost: data.scrollToMyPost,
notificationSound: data.notificationSound,
incomingChatSound: data.incomingChatSound,
- outgoingChatSound: data.outgoingChatSound
+ outgoingChatSound: data.outgoingChatSound,
};
if (data.bootswatchSkin) {
@@ -140,7 +139,7 @@ module.exports = function (User) {
},
function (next) {
User.getSettings(uid, next);
- }
+ },
], callback);
};
@@ -155,7 +154,7 @@ module.exports = function (User) {
} else {
next();
}
- }
+ },
], callback);
};
diff --git a/src/user/topics.js b/src/user/topics.js
index 53dade36e9..bd69e66e6f 100644
--- a/src/user/topics.js
+++ b/src/user/topics.js
@@ -4,7 +4,6 @@ var async = require('async');
var db = require('../database');
module.exports = function (User) {
-
User.getIgnoredTids = function (uid, start, stop, callback) {
db.getSortedSetRevRange('uid:' + uid + ':ignored_tids', start, stop, callback);
};
@@ -12,8 +11,7 @@ module.exports = function (User) {
User.addTopicIdToUser = function (uid, tid, timestamp, callback) {
async.parallel([
async.apply(db.sortedSetAdd, 'uid:' + uid + ':topics', timestamp, tid),
- async.apply(User.incrementUserFieldBy, uid, 'topiccount', 1)
+ async.apply(User.incrementUserFieldBy, uid, 'topiccount', 1),
], callback);
};
-
-};
\ No newline at end of file
+};
diff --git a/src/views/admin/header.tpl b/src/views/admin/header.tpl
index 23ce1e2c02..b293436106 100644
--- a/src/views/admin/header.tpl
+++ b/src/views/admin/header.tpl
@@ -3,11 +3,10 @@
{title}
-
+
-
-
+
-
+
diff --git a/src/views/admin/manage/tags.tpl b/src/views/admin/manage/tags.tpl
index 41851df893..8fa01a1200 100644
--- a/src/views/admin/manage/tags.tpl
+++ b/src/views/admin/manage/tags.tpl
@@ -10,12 +10,11 @@
-
{tags.value}
-
- {tags.score}
+ background-color: {tags.bgColor};">
+ {tags.score}
+ {tags.value}
diff --git a/src/webserver.js b/src/webserver.js
index cefcb3fb38..d816a861a2 100644
--- a/src/webserver.js
+++ b/src/webserver.js
@@ -33,7 +33,7 @@ var helpers = require('../public/src/modules/helpers');
if (nconf.get('ssl')) {
server = require('https').createServer({
key: fs.readFileSync(nconf.get('ssl').key),
- cert: fs.readFileSync(nconf.get('ssl').cert)
+ cert: fs.readFileSync(nconf.get('ssl').cert),
}, app);
} else {
server = require('http').createServer(app);
@@ -69,7 +69,7 @@ module.exports.listen = function (callback) {
winston.info('NodeBB Ready');
require('./socket.io').server.emit('event:nodebb.ready', {
- 'cache-buster': meta.config['cache-buster']
+ 'cache-buster': meta.config['cache-buster'],
});
plugins.fireHook('action:nodebb.ready');
@@ -91,7 +91,7 @@ function initializeNodeBB(callback) {
function (next) {
plugins.fireHook('static:app.preload', {
app: app,
- middleware: middleware
+ middleware: middleware,
}, next);
},
function (next) {
@@ -107,7 +107,7 @@ function initializeNodeBB(callback) {
languages.init,
meta.blacklist.load,
], next);
- }
+ },
], callback);
}
@@ -146,7 +146,7 @@ function setupExpressApp(app) {
key: nconf.get('sessionKey'),
cookie: setupCookie(),
resave: true,
- saveUninitialized: true
+ saveUninitialized: true,
}));
app.use(middleware.addHeaders);
@@ -159,7 +159,8 @@ function setupExpressApp(app) {
}
function setupFavicon(app) {
- var faviconPath = path.join(nconf.get('base_dir'), 'public', meta.config['brand:favicon'] ? meta.config['brand:favicon'] : 'favicon.ico');
+ var faviconPath = meta.config['brand:favicon'] || 'favicon.ico';
+ faviconPath = path.join(nconf.get('base_dir'), 'public', faviconPath.replace(/assets\/uploads/, 'uploads'));
if (file.existsSync(faviconPath)) {
app.use(nconf.get('relative_path'), favicon(faviconPath));
}
@@ -171,7 +172,7 @@ function setupCookie() {
var ttl = ttlSeconds || ttlDays || 1209600000; // Default to 14 days
var cookie = {
- maxAge: ttl
+ maxAge: ttl,
};
if (nconf.get('cookieDomain') || meta.config.cookieDomain) {
@@ -220,7 +221,7 @@ function listen(callback) {
winston.info('Using ports 80 and 443 is not recommend; use a proxy instead. See README.md');
}
- var bind_address = ((nconf.get('bind_address') === "0.0.0.0" || !nconf.get('bind_address')) ? '0.0.0.0' : nconf.get('bind_address'));
+ var bind_address = ((nconf.get('bind_address') === '0.0.0.0' || !nconf.get('bind_address')) ? '0.0.0.0' : nconf.get('bind_address'));
var args = isSocket ? [socketPath] : [port, bind_address];
var oldUmask;
@@ -284,4 +285,3 @@ module.exports.testSocket = function (socketPath, callback) {
], callback);
};
-
diff --git a/src/widgets/admin.js b/src/widgets/admin.js
index ecfd73b750..dde3aca43d 100644
--- a/src/widgets/admin.js
+++ b/src/widgets/admin.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var fs = require('fs');
var path = require('path');
@@ -16,8 +16,8 @@ admin.get = function (callback) {
{ name: 'Global Header', template: 'global', location: 'header' },
{ name: 'Global Footer', template: 'global', location: 'footer' },
- { name: 'Group Page (Left)', template: 'groups/details.tpl', location: 'left'},
- { name: 'Group Page (Right)', template: 'groups/details.tpl', location: 'right'}
+ { name: 'Group Page (Left)', template: 'groups/details.tpl', location: 'left' },
+ { name: 'Group Page (Right)', template: 'groups/details.tpl', location: 'right' },
];
plugins.fireHook('filter:widgets.getAreas', defaultAreas, next);
@@ -27,7 +27,7 @@ admin.get = function (callback) {
},
adminTemplate: function (next) {
fs.readFile(path.resolve(nconf.get('views_dir'), 'admin/partials/widget-settings.tpl'), 'utf8', next);
- }
+ },
}, function (err, widgetData) {
if (err) {
return callback(err);
@@ -48,33 +48,34 @@ admin.get = function (callback) {
w.content += widgetData.adminTemplate;
});
- var templates = [],
- list = {}, index = 0;
+ var templates = [];
+ var list = {};
+ var index = 0;
widgetData.areas.forEach(function (area) {
if (typeof list[area.template] === 'undefined') {
list[area.template] = index;
templates.push({
template: area.template,
- areas: []
+ areas: [],
});
- index++;
+ index += 1;
}
templates[list[area.template]].areas.push({
name: area.name,
- location: area.location
+ location: area.location,
});
});
callback(false, {
templates: templates,
areas: widgetData.areas,
- widgets: widgetData.widgets
+ widgets: widgetData.widgets,
});
});
});
};
-module.exports = admin;
\ No newline at end of file
+module.exports = admin;
diff --git a/src/widgets/index.js b/src/widgets/index.js
index eac58e46e3..7ea6727a1e 100644
--- a/src/widgets/index.js
+++ b/src/widgets/index.js
@@ -1,4 +1,4 @@
-"use strict";
+'use strict';
var async = require('async');
var winston = require('winston');
@@ -26,7 +26,7 @@ widgets.render = function (uid, area, req, res, callback) {
widgetsByLocation[location] = data.global[location].concat(data[area.template][location]);
if (!widgetsByLocation[location].length) {
- return done(null, {location: location, widgets: []});
+ return done(null, { location: location, widgets: [] });
}
async.map(widgetsByLocation[location], function (widget, next) {
@@ -42,7 +42,7 @@ widgets.render = function (uid, area, req, res, callback) {
area: area,
data: widget.data,
req: req,
- res: res
+ res: res,
}, function (err, html) {
if (err || html === null) {
return next(err);
@@ -56,17 +56,17 @@ widgets.render = function (uid, area, req, res, callback) {
translator.translate(widget.data.title, function (title) {
html = templates.parse(widget.data.container, {
title: title,
- body: html
+ body: html,
});
- next(null, {html: html});
+ next(null, { html: html });
});
} else {
- next(null, {html: html});
+ next(null, { html: html });
}
});
}, function (err, result) {
- done(err, {location: location, widgets: result.filter(Boolean)});
+ done(err, { location: location, widgets: result.filter(Boolean) });
});
}, callback);
});
@@ -89,7 +89,7 @@ widgets.getAreas = function (templates, locations, callback) {
if (data && data[index] && data[index][location]) {
try {
returnData[template][location] = JSON.parse(data[index][location]);
- } catch(err) {
+ } catch (err) {
winston.error('can not parse widget data. template: ' + template + ' location: ' + location);
returnData[template][location] = [];
}
@@ -113,7 +113,7 @@ widgets.getArea = function (template, location, callback) {
}
try {
result = JSON.parse(result);
- } catch(err) {
+ } catch (err) {
return callback(err);
}
@@ -133,7 +133,7 @@ widgets.reset = function (callback) {
var defaultAreas = [
{ name: 'Draft Zone', template: 'global', location: 'header' },
{ name: 'Draft Zone', template: 'global', location: 'footer' },
- { name: 'Draft Zone', template: 'global', location: 'sidebar' }
+ { name: 'Draft Zone', template: 'global', location: 'sidebar' },
];
async.parallel({
@@ -142,7 +142,7 @@ widgets.reset = function (callback) {
},
drafts: function (next) {
widgets.getArea('global', 'drafts', next);
- }
+ },
}, function (err, results) {
if (err) {
return callback(err);
@@ -167,7 +167,7 @@ widgets.reset = function (callback) {
widgets.setArea({
template: 'global',
location: 'drafts',
- widgets: drafts
+ widgets: drafts,
}, callback);
});
});
diff --git a/test/.eslintrc b/test/.eslintrc
new file mode 100644
index 0000000000..4dea92c4c9
--- /dev/null
+++ b/test/.eslintrc
@@ -0,0 +1,8 @@
+{
+ "env": {
+ "mocha": true
+ },
+ "rules": {
+ "no-unused-vars": "off"
+ }
+}
diff --git a/test/authentication.js b/test/authentication.js
index fb26e0bfbf..7b49f69efa 100644
--- a/test/authentication.js
+++ b/test/authentication.js
@@ -1,5 +1,5 @@
'use strict';
-/*global require, before*/
+
var assert = require('assert');
var nconf = require('nconf');
@@ -12,7 +12,7 @@ describe('authentication', function () {
var jar = request.jar();
var regularUid;
before(function (done) {
- user.create({username: 'regular', password: 'regularpwd', email: 'regular@nodebb.org' }, function (err, uid) {
+ user.create({ username: 'regular', password: 'regularpwd', email: 'regular@nodebb.org' }, function (err, uid) {
assert.ifError(err);
regularUid = uid;
done();
@@ -23,7 +23,7 @@ describe('authentication', function () {
request({
url: nconf.get('url') + '/api/config',
json: true,
- jar: jar
+ jar: jar,
}, function (err, response, body) {
assert.ifError(err);
@@ -36,8 +36,8 @@ describe('authentication', function () {
json: true,
jar: jar,
headers: {
- 'x-csrf-token': body.csrf_token
- }
+ 'x-csrf-token': body.csrf_token,
+ },
}, function (err, response, body) {
assert.ifError(err);
assert(body);
@@ -45,7 +45,7 @@ describe('authentication', function () {
request({
url: nconf.get('url') + '/api/me',
json: true,
- jar: jar
+ jar: jar,
}, function (err, response, body) {
assert.ifError(err);
assert(body);
@@ -61,7 +61,7 @@ describe('authentication', function () {
request({
url: nconf.get('url') + '/api/config',
json: true,
- jar: jar
+ jar: jar,
}, function (err, response, body) {
assert.ifError(err);
@@ -70,15 +70,15 @@ describe('authentication', function () {
json: true,
jar: jar,
headers: {
- 'x-csrf-token': body.csrf_token
- }
+ 'x-csrf-token': body.csrf_token,
+ },
}, function (err) {
assert.ifError(err);
request({
url: nconf.get('url') + '/api/me',
json: true,
- jar: jar
+ jar: jar,
}, function (err, response, body) {
assert.ifError(err);
assert.equal(body, 'not-authorized');
@@ -93,7 +93,7 @@ describe('authentication', function () {
request({
url: nconf.get('url') + '/api/config',
json: true,
- jar: jar
+ jar: jar,
}, function (err, response, body) {
assert.ifError(err);
@@ -105,8 +105,8 @@ describe('authentication', function () {
json: true,
jar: jar,
headers: {
- 'x-csrf-token': body.csrf_token
- }
+ 'x-csrf-token': body.csrf_token,
+ },
}, function (err, response, body) {
assert.ifError(err);
assert(body);
@@ -114,7 +114,7 @@ describe('authentication', function () {
request({
url: nconf.get('url') + '/api/me',
json: true,
- jar: jar
+ jar: jar,
}, function (err, response, body) {
assert.ifError(err);
assert(body);
@@ -136,7 +136,7 @@ describe('authentication', function () {
db.sortedSetCard('uid:' + regularUid + ':sessions', function (err, count) {
assert.ifError(err);
assert(count);
- socketAdmin.deleteAllSessions({uid: 1}, {}, function (err) {
+ socketAdmin.deleteAllSessions({ uid: 1 }, {}, function (err) {
assert.ifError(err);
db.sortedSetCard('uid:' + regularUid + ':sessions', function (err, count) {
assert.ifError(err);
@@ -145,13 +145,11 @@ describe('authentication', function () {
});
});
});
-
});
after(function (done) {
db.emptydb(done);
});
-
});
diff --git a/test/blacklist.js b/test/blacklist.js
index 0ffc0f78a1..72f5e1e813 100644
--- a/test/blacklist.js
+++ b/test/blacklist.js
@@ -1,5 +1,6 @@
'use strict';
-/*global require, after, before*/
+
+/* global require, after, before*/
var async = require('async');
@@ -11,12 +12,11 @@ var user = require('../src/user');
var blacklist = require('../src/meta/blacklist');
describe('blacklist', function () {
-
var adminUid;
before(function (done) {
groups.resetCache();
- user.create({username: 'admin'}, function (err, uid) {
+ user.create({ username: 'admin' }, function (err, uid) {
assert.ifError(err);
adminUid = uid;
groups.join('administrators', adminUid, done);
@@ -27,8 +27,8 @@ describe('blacklist', function () {
var rules = '1.1.1.1\n2.2.2.2\n::ffff:0:2.2.2.2\n127.0.0.1\n192.168.100.0/22';
it('should validate blacklist', function (done) {
- socketBlacklist.validate({uid: adminUid}, {
- rules: rules
+ socketBlacklist.validate({ uid: adminUid }, {
+ rules: rules,
}, function (err, data) {
assert.ifError(err);
done();
@@ -36,14 +36,14 @@ describe('blacklist', function () {
});
it('should error if not admin', function (done) {
- socketBlacklist.save({uid: 0}, rules, function (err) {
+ socketBlacklist.save({ uid: 0 }, rules, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should save blacklist', function (done) {
- socketBlacklist.save({uid: adminUid}, rules, function (err) {
+ socketBlacklist.save({ uid: adminUid }, rules, function (err) {
assert.ifError(err);
done();
});
diff --git a/test/build.js b/test/build.js
index 5fe95561ba..3b6890ebe6 100644
--- a/test/build.js
+++ b/test/build.js
@@ -5,7 +5,6 @@ var assert = require('assert');
var db = require('./mocks/databasemock');
describe('Build', function () {
-
it('should build all assets', function (done) {
this.timeout(50000);
var build = require('../src/meta/build');
diff --git a/test/categories.js b/test/categories.js
index e0e035410b..bdd91602de 100644
--- a/test/categories.js
+++ b/test/categories.js
@@ -1,5 +1,4 @@
'use strict';
-/*global require, after, before*/
var async = require('async');
@@ -23,11 +22,11 @@ describe('Categories', function () {
groups.resetCache();
async.parallel({
posterUid: function (next) {
- User.create({username: 'poster'}, next);
+ User.create({ username: 'poster' }, next);
},
adminUid: function (next) {
- User.create({username: 'admin'}, next);
- }
+ User.create({ username: 'admin' }, next);
+ },
}, function (err, results) {
assert.ifError(err);
posterUid = results.posterUid;
@@ -38,13 +37,12 @@ describe('Categories', function () {
it('should create a new category', function (done) {
-
Categories.create({
name: 'Test Category',
description: 'Test category created by testing script',
icon: 'fa-check',
blockclass: 'category-blue',
- order: '5'
+ order: '5',
}, function (err, category) {
assert.ifError(err);
@@ -60,7 +58,7 @@ describe('Categories', function () {
reverse: true,
start: 0,
stop: -1,
- uid: 0
+ uid: 0,
}, function (err, categoryData) {
assert.equal(err, null);
@@ -90,7 +88,7 @@ describe('Categories', function () {
reverse: true,
start: 0,
stop: -1,
- uid: 0
+ uid: 0,
}, function (err, categoryData) {
assert.ifError(err);
Categories.getRecentTopicReplies(categoryData, 0, function (err) {
@@ -109,7 +107,7 @@ describe('Categories', function () {
reverse: true,
start: 0,
stop: 10,
- uid: 0
+ uid: 0,
}, function (err, result) {
assert.equal(err, null);
@@ -130,7 +128,7 @@ describe('Categories', function () {
start: 0,
stop: 10,
uid: 0,
- targetUid: 1
+ targetUid: 1,
}, function (err, result) {
assert.equal(err, null);
assert(Array.isArray(result.topics));
@@ -151,7 +149,7 @@ describe('Categories', function () {
category: function (next) {
Categories.create({
name: 'Test Category 2',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, next);
},
topic: function (next) {
@@ -159,16 +157,16 @@ describe('Categories', function () {
uid: posterUid,
cid: categoryObj.cid,
title: 'Test Topic Title',
- content: 'The content of test topic'
+ content: 'The content of test topic',
}, next);
- }
+ },
}, function (err, results) {
if (err) {
return done(err);
}
moveCid = results.category.cid;
moveTid = results.topic.topicData.tid;
- Topics.reply({uid: posterUid, content: 'test post', tid: moveTid}, function (err) {
+ Topics.reply({ uid: posterUid, content: 'test post', tid: moveTid }, function (err) {
done(err);
});
});
@@ -199,12 +197,12 @@ describe('Categories', function () {
cid: categoryObj.cid,
title: 'Test Topic Title',
content: 'The content of test topic',
- tags: ['nodebb']
+ tags: ['nodebb'],
}, done);
});
it('should get recent replies in category', function (done) {
- socketCategories.getRecentReplies({uid: posterUid}, categoryObj.cid, function (err, data) {
+ socketCategories.getRecentReplies({ uid: posterUid }, categoryObj.cid, function (err, data) {
assert.ifError(err);
assert(Array.isArray(data));
done();
@@ -212,7 +210,7 @@ describe('Categories', function () {
});
it('should get categories', function (done) {
- socketCategories.get({uid: posterUid}, {}, function (err, data) {
+ socketCategories.get({ uid: posterUid }, {}, function (err, data) {
assert.ifError(err);
assert(Array.isArray(data));
done();
@@ -220,7 +218,7 @@ describe('Categories', function () {
});
it('should get watched categories', function (done) {
- socketCategories.getWatchedCategories({uid: posterUid}, {}, function (err, data) {
+ socketCategories.getWatchedCategories({ uid: posterUid }, {}, function (err, data) {
assert.ifError(err);
assert(Array.isArray(data));
done();
@@ -228,7 +226,7 @@ describe('Categories', function () {
});
it('should load more topics', function (done) {
- socketCategories.loadMore({uid: posterUid}, {cid: categoryObj.cid, after: 0, author: 'poster', tag: 'nodebb'}, function (err, data) {
+ socketCategories.loadMore({ uid: posterUid }, { cid: categoryObj.cid, after: 0, author: 'poster', tag: 'nodebb' }, function (err, data) {
assert.ifError(err);
assert(Array.isArray(data.topics));
assert.equal(data.topics[0].user.username, 'poster');
@@ -239,7 +237,7 @@ describe('Categories', function () {
});
it('should load page count', function (done) {
- socketCategories.getPageCount({uid: posterUid}, categoryObj.cid, function (err, pageCount) {
+ socketCategories.getPageCount({ uid: posterUid }, categoryObj.cid, function (err, pageCount) {
assert.ifError(err);
assert.equal(pageCount, 1);
done();
@@ -247,7 +245,7 @@ describe('Categories', function () {
});
it('should load page count', function (done) {
- socketCategories.getTopicCount({uid: posterUid}, categoryObj.cid, function (err, topicCount) {
+ socketCategories.getTopicCount({ uid: posterUid }, categoryObj.cid, function (err, topicCount) {
assert.ifError(err);
assert.equal(topicCount, 2);
done();
@@ -255,7 +253,7 @@ describe('Categories', function () {
});
it('should load category by privilege', function (done) {
- socketCategories.getCategoriesByPrivilege({uid: posterUid}, 'find', function (err, data) {
+ socketCategories.getCategoriesByPrivilege({ uid: posterUid }, 'find', function (err, data) {
assert.ifError(err);
assert(Array.isArray(data));
done();
@@ -263,7 +261,7 @@ describe('Categories', function () {
});
it('should get move categories', function (done) {
- socketCategories.getMoveCategories({uid: posterUid}, {}, function (err, data) {
+ socketCategories.getMoveCategories({ uid: posterUid }, {}, function (err, data) {
assert.ifError(err);
assert(Array.isArray(data));
done();
@@ -271,7 +269,7 @@ describe('Categories', function () {
});
it('should ignore category', function (done) {
- socketCategories.ignore({uid: posterUid}, categoryObj.cid, function (err) {
+ socketCategories.ignore({ uid: posterUid }, categoryObj.cid, function (err) {
assert.ifError(err);
Categories.isIgnored([categoryObj.cid], posterUid, function (err, isIgnored) {
assert.ifError(err);
@@ -282,7 +280,7 @@ describe('Categories', function () {
});
it('should watch category', function (done) {
- socketCategories.watch({uid: posterUid}, categoryObj.cid, function (err) {
+ socketCategories.watch({ uid: posterUid }, categoryObj.cid, function (err) {
assert.ifError(err);
Categories.isIgnored([categoryObj.cid], posterUid, function (err, isIgnored) {
assert.ifError(err);
@@ -293,15 +291,15 @@ describe('Categories', function () {
});
it('should check if user is moderator', function (done) {
- socketCategories.isModerator({uid: posterUid}, {}, function (err, isModerator) {
+ socketCategories.isModerator({ uid: posterUid }, {}, function (err, isModerator) {
assert.ifError(err);
assert(!isModerator);
done();
});
});
- it('should get category data' , function (done) {
- socketCategories.getCategory({uid: posterUid}, categoryObj.cid, function (err, data) {
+ it('should get category data', function (done) {
+ socketCategories.getCategory({ uid: posterUid }, categoryObj.cid, function (err, data) {
assert.ifError(err);
assert.equal(categoryObj.cid, data.cid);
done();
@@ -313,12 +311,12 @@ describe('Categories', function () {
var socketCategories = require('../src/socket.io/admin/categories');
var cid;
before(function (done) {
- socketCategories.create({uid: adminUid}, {
+ socketCategories.create({ uid: adminUid }, {
name: 'update name',
description: 'update description',
parentCid: categoryObj.cid,
icon: 'fa-check',
- order: '5'
+ order: '5',
}, function (err, category) {
assert.ifError(err);
@@ -328,7 +326,7 @@ describe('Categories', function () {
});
it('should return error with invalid data', function (done) {
- socketCategories.update({uid: adminUid}, null, function (err) {
+ socketCategories.update({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -337,9 +335,9 @@ describe('Categories', function () {
it('should error if you try to set parent as self', function (done) {
var updateData = {};
updateData[cid] = {
- parentCid: cid
+ parentCid: cid,
};
- socketCategories.update({uid: adminUid}, updateData, function (err) {
+ socketCategories.update({ uid: adminUid }, updateData, function (err) {
assert.equal(err.message, '[[error:cant-set-self-as-parent]]');
done();
});
@@ -352,9 +350,9 @@ describe('Categories', function () {
description: 'new description',
parentCid: 0,
order: 3,
- icon: 'fa-hammer'
+ icon: 'fa-hammer',
};
- socketCategories.update({uid: adminUid}, updateData, function (err) {
+ socketCategories.update({ uid: adminUid }, updateData, function (err) {
assert.ifError(err);
Categories.getCategoryData(cid, function (err, data) {
assert.ifError(err);
@@ -371,34 +369,33 @@ describe('Categories', function () {
it('should purge category', function (done) {
Categories.create({
name: 'purge me',
- description: 'update description'
+ description: 'update description',
}, function (err, category) {
assert.ifError(err);
Topics.post({
uid: posterUid,
cid: category.cid,
title: 'Test Topic Title',
- content: 'The content of test topic'
+ content: 'The content of test topic',
}, function (err) {
assert.ifError(err);
- socketCategories.purge({uid: adminUid}, category.cid, function (err) {
+ socketCategories.purge({ uid: adminUid }, category.cid, function (err) {
assert.ifError(err);
done();
});
});
-
});
});
it('should get all categories', function (done) {
- socketCategories.getAll({uid: adminUid}, {}, function (err, data) {
+ socketCategories.getAll({ uid: adminUid }, {}, function (err, data) {
assert.ifError(err);
done();
});
});
it('should get all category names', function (done) {
- socketCategories.getNames({uid: adminUid}, {}, function (err, data) {
+ socketCategories.getNames({ uid: adminUid }, {}, function (err, data) {
assert.ifError(err);
assert(Array.isArray(data));
done();
@@ -406,7 +403,7 @@ describe('Categories', function () {
});
it('should give privilege', function (done) {
- socketCategories.setPrivilege({uid: adminUid}, {cid: categoryObj.cid, privilege: ['groups:topics:delete'], set: true, member: 'registered-users'}, function (err) {
+ socketCategories.setPrivilege({ uid: adminUid }, { cid: categoryObj.cid, privilege: ['groups:topics:delete'], set: true, member: 'registered-users' }, function (err) {
assert.ifError(err);
privileges.categories.can('topics:delete', categoryObj.cid, posterUid, function (err, canDeleteTopcis) {
assert.ifError(err);
@@ -417,7 +414,7 @@ describe('Categories', function () {
});
it('should remove privilege', function (done) {
- socketCategories.setPrivilege({uid: adminUid}, {cid: categoryObj.cid, privilege: 'groups:topics:delete', set: false, member: 'registered-users'}, function (err) {
+ socketCategories.setPrivilege({ uid: adminUid }, { cid: categoryObj.cid, privilege: 'groups:topics:delete', set: false, member: 'registered-users' }, function (err) {
assert.ifError(err);
privileges.categories.can('topics:delete', categoryObj.cid, posterUid, function (err, canDeleteTopcis) {
assert.ifError(err);
@@ -428,7 +425,7 @@ describe('Categories', function () {
});
it('should get privilege settings', function (done) {
- socketCategories.getPrivilegeSettings({uid: adminUid}, categoryObj.cid, function (err, data) {
+ socketCategories.getPrivilegeSettings({ uid: adminUid }, categoryObj.cid, function (err, data) {
assert.ifError(err);
assert(data);
done();
@@ -441,22 +438,22 @@ describe('Categories', function () {
var child2Cid;
async.waterfall([
function (next) {
- Categories.create({name: 'parent'}, next);
+ Categories.create({ name: 'parent' }, next);
},
function (category, next) {
parentCid = category.cid;
- Categories.create({name: 'child1', parentCid: parentCid}, next);
+ Categories.create({ name: 'child1', parentCid: parentCid }, next);
},
function (category, next) {
child1Cid = category.cid;
- Categories.create({name: 'child2', parentCid: child1Cid}, next);
+ Categories.create({ name: 'child2', parentCid: child1Cid }, next);
},
function (category, next) {
child2Cid = category.cid;
- socketCategories.setPrivilege({uid: adminUid}, {cid: parentCid, privilege: 'groups:topics:delete', set: true, member: 'registered-users'}, next);
+ socketCategories.setPrivilege({ uid: adminUid }, { cid: parentCid, privilege: 'groups:topics:delete', set: true, member: 'registered-users' }, next);
},
function (next) {
- socketCategories.copyPrivilegesToChildren({uid: adminUid}, parentCid, next);
+ socketCategories.copyPrivilegesToChildren({ uid: adminUid }, parentCid, next);
},
function (next) {
privileges.categories.can('topics:delete', child2Cid, posterUid, next);
@@ -464,7 +461,7 @@ describe('Categories', function () {
function (canDelete, next) {
assert(canDelete);
next();
- }
+ },
], done);
});
@@ -473,15 +470,15 @@ describe('Categories', function () {
var parentCid;
async.waterfall([
function (next) {
- Categories.create({name: 'parent', description: 'copy me'}, next);
+ Categories.create({ name: 'parent', description: 'copy me' }, next);
},
function (category, next) {
parentCid = category.cid;
- Categories.create({name: 'child1'}, next);
+ Categories.create({ name: 'child1' }, next);
},
function (category, next) {
child1Cid = category.cid;
- socketCategories.copySettingsFrom({uid: adminUid}, {fromCid: parentCid, toCid: child1Cid}, next);
+ socketCategories.copySettingsFrom({ uid: adminUid }, { fromCid: parentCid, toCid: child1Cid }, next);
},
function (canDelete, next) {
Categories.getCategoryField(child1Cid, 'description', next);
@@ -489,7 +486,7 @@ describe('Categories', function () {
function (description, next) {
assert.equal(description, 'copy me');
next();
- }
+ },
], done);
});
@@ -498,18 +495,18 @@ describe('Categories', function () {
var parentCid;
async.waterfall([
function (next) {
- Categories.create({name: 'parent', description: 'copy me'}, next);
+ Categories.create({ name: 'parent', description: 'copy me' }, next);
},
function (category, next) {
parentCid = category.cid;
- Categories.create({name: 'child1'}, next);
+ Categories.create({ name: 'child1' }, next);
},
function (category, next) {
child1Cid = category.cid;
- socketCategories.setPrivilege({uid: adminUid}, {cid: parentCid, privilege: 'groups:topics:delete', set: true, member: 'registered-users'}, next);
+ socketCategories.setPrivilege({ uid: adminUid }, { cid: parentCid, privilege: 'groups:topics:delete', set: true, member: 'registered-users' }, next);
},
function (next) {
- socketCategories.copyPrivilegesFrom({uid: adminUid}, {fromCid: parentCid, toCid: child1Cid}, next);
+ socketCategories.copyPrivilegesFrom({ uid: adminUid }, { fromCid: parentCid, toCid: child1Cid }, next);
},
function (next) {
privileges.categories.can('topics:delete', child1Cid, posterUid, next);
@@ -517,21 +514,21 @@ describe('Categories', function () {
function (canDelete, next) {
assert(canDelete);
next();
- }
+ },
], done);
});
});
it('should get active users', function (done) {
Categories.create({
- name: 'test'
+ name: 'test',
}, function (err, category) {
assert.ifError(err);
Topics.post({
uid: posterUid,
cid: category.cid,
title: 'Test Topic Title',
- content: 'The content of test topic'
+ content: 'The content of test topic',
}, function (err) {
assert.ifError(err);
Categories.getActiveUsers(category.cid, function (err, uids) {
@@ -548,7 +545,7 @@ describe('Categories', function () {
var socketTopics = require('../src/socket.io/topics');
before(function (done) {
Categories.create({
- name: 'test'
+ name: 'test',
}, function (err, category) {
assert.ifError(err);
cid = category.cid;
@@ -557,14 +554,14 @@ describe('Categories', function () {
});
it('should error if data is invalid', function (done) {
- socketTopics.isTagAllowed({uid: posterUid}, null, function (err) {
+ socketTopics.isTagAllowed({ uid: posterUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should return true if category whitelist is empty', function (done) {
- socketTopics.isTagAllowed({uid: posterUid}, {tag: 'notallowed', cid: cid}, function (err, allowed) {
+ socketTopics.isTagAllowed({ uid: posterUid }, { tag: 'notallowed', cid: cid }, function (err, allowed) {
assert.ifError(err);
assert(allowed);
done();
@@ -574,7 +571,7 @@ describe('Categories', function () {
it('should add tags to category whitelist', function (done) {
var data = {};
data[cid] = {
- tagWhitelist: 'nodebb,jquery,javascript'
+ tagWhitelist: 'nodebb,jquery,javascript',
};
Categories.update(data, function (err) {
assert.ifError(err);
@@ -587,7 +584,7 @@ describe('Categories', function () {
});
it('should return false if category whitelist does not have tag', function (done) {
- socketTopics.isTagAllowed({uid: posterUid}, {tag: 'notallowed', cid: cid}, function (err, allowed) {
+ socketTopics.isTagAllowed({ uid: posterUid }, { tag: 'notallowed', cid: cid }, function (err, allowed) {
assert.ifError(err);
assert(!allowed);
done();
@@ -595,7 +592,7 @@ describe('Categories', function () {
});
it('should return true if category whitelist has tag', function (done) {
- socketTopics.isTagAllowed({uid: posterUid}, {tag: 'nodebb', cid: cid}, function (err, allowed) {
+ socketTopics.isTagAllowed({ uid: posterUid }, { tag: 'nodebb', cid: cid }, function (err, allowed) {
assert.ifError(err);
assert(allowed);
done();
@@ -608,7 +605,7 @@ describe('Categories', function () {
cid: cid,
title: 'Test Topic Title',
content: 'The content of test topic',
- tags: ['nodebb', 'jquery', 'notallowed']
+ tags: ['nodebb', 'jquery', 'notallowed'],
}, function (err, data) {
assert.ifError(err);
assert.equal(data.topicData.tags.length, 2);
diff --git a/test/controllers-admin.js b/test/controllers-admin.js
index 41ffacca29..ad59b4705d 100644
--- a/test/controllers-admin.js
+++ b/test/controllers-admin.js
@@ -13,7 +13,6 @@ var groups = require('../src/groups');
var helpers = require('./helpers');
describe('Admin Controllers', function () {
-
var tid;
var cid;
var pid;
@@ -26,15 +25,15 @@ describe('Admin Controllers', function () {
category: function (next) {
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, next);
},
adminUid: function (next) {
- user.create({username: 'admin', password: 'barbar'}, next);
+ user.create({ username: 'admin', password: 'barbar' }, next);
},
regularUid: function (next) {
- user.create({username: 'regular'}, next);
- }
+ user.create({ username: 'regular' }, next);
+ },
}, function (err, results) {
if (err) {
return done(err);
@@ -43,7 +42,7 @@ describe('Admin Controllers', function () {
regularUid = results.regularUid;
cid = results.category.cid;
- topics.post({uid: adminUid, title: 'test topic title', content: 'test topic content', cid: results.category.cid}, function (err, result) {
+ topics.post({ uid: adminUid, title: 'test topic title', content: 'test topic content', cid: results.category.cid }, function (err, result) {
tid = result.topicData.tid;
pid = result.postData.pid;
done(err);
@@ -55,7 +54,7 @@ describe('Admin Controllers', function () {
helpers.loginUser('admin', 'barbar', function (err, _jar) {
assert.ifError(err);
jar = _jar;
- request(nconf.get('url') + '/admin', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/admin', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 403);
assert(body);
@@ -67,7 +66,7 @@ describe('Admin Controllers', function () {
it('should load admin dashboard', function (done) {
groups.join('administrators', adminUid, function (err) {
assert.ifError(err);
- request(nconf.get('url') + '/admin', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/admin', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -77,7 +76,7 @@ describe('Admin Controllers', function () {
});
it('should load groups page', function (done) {
- request(nconf.get('url') + '/admin/manage/groups', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/admin/manage/groups', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -86,7 +85,7 @@ describe('Admin Controllers', function () {
});
it('should load groups detail page', function (done) {
- request(nconf.get('url') + '/admin/manage/groups/administrators', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/admin/manage/groups/administrators', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -96,7 +95,7 @@ describe('Admin Controllers', function () {
it('should load general settings page', function (done) {
- request(nconf.get('url') + '/admin/settings', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/admin/settings', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -105,7 +104,7 @@ describe('Admin Controllers', function () {
});
it('should load email settings page', function (done) {
- request(nconf.get('url') + '/admin/settings/email', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/admin/settings/email', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -114,7 +113,7 @@ describe('Admin Controllers', function () {
});
it('should load info page for a user', function (done) {
- request(nconf.get('url') + '/api/user/regular/info', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/regular/info', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body.history);
@@ -127,7 +126,7 @@ describe('Admin Controllers', function () {
});
it('should 404 for edit/email page if user does not exist', function (done) {
- request(nconf.get('url') + '/api/user/doesnotexist/edit/email', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/doesnotexist/edit/email', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 404);
done();
@@ -135,7 +134,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/general/homepage', function (done) {
- request(nconf.get('url') + '/api/admin/general/homepage', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/general/homepage', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body.routes);
@@ -144,7 +143,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/advanced/database', function (done) {
- request(nconf.get('url') + '/api/admin/advanced/database', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/advanced/database', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
@@ -158,7 +157,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/extend/plugins', function (done) {
- request(nconf.get('url') + '/api/admin/extend/plugins', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/extend/plugins', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body.hasOwnProperty('installed'));
assert(body.hasOwnProperty('upgradeCount'));
@@ -169,7 +168,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -177,7 +176,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users/search', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users/search', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users/search', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body.users);
done();
@@ -185,7 +184,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users/not-validated', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users/not-validated', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users/not-validated', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -193,7 +192,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users/no-posts', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users/no-posts', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users/no-posts', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -201,7 +200,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users/top-posters', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users/top-posters', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users/top-posters', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -209,7 +208,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users/most-reputation', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users/most-reputation', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users/most-reputation', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -217,7 +216,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users/inactive', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users/inactive', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users/inactive', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -225,7 +224,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users/flagged', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users/flagged', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users/flagged', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -233,7 +232,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/users/banned', function (done) {
- request(nconf.get('url') + '/api/admin/manage/users/banned', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/users/banned', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -241,7 +240,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/registration', function (done) {
- request(nconf.get('url') + '/api/admin/manage/registration', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/registration', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -249,7 +248,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/users/csv', function (done) {
- request(nconf.get('url') + '/api/admin/users/csv', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/users/csv', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -257,7 +256,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/flags', function (done) {
- request(nconf.get('url') + '/api/admin/manage/flags', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/flags', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -265,7 +264,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/advanced/cache', function (done) {
- request(nconf.get('url') + '/api/admin/advanced/cache', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/advanced/cache', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -273,7 +272,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/advanced/errors', function (done) {
- request(nconf.get('url') + '/api/admin/advanced/errors', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/advanced/errors', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -281,7 +280,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/advanced/errors/export', function (done) {
- request(nconf.get('url') + '/api/admin/advanced/errors/export', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/advanced/errors/export', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -289,7 +288,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/advanced/logs', function (done) {
- request(nconf.get('url') + '/api/admin/advanced/logs', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/advanced/logs', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -297,7 +296,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/general/navigation', function (done) {
- request(nconf.get('url') + '/api/admin/general/navigation', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/general/navigation', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -305,7 +304,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/development/info', function (done) {
- request(nconf.get('url') + '/api/admin/development/info', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/development/info', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -313,7 +312,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/development/logger', function (done) {
- request(nconf.get('url') + '/api/admin/development/logger', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/development/logger', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -321,7 +320,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/advanced/events', function (done) {
- request(nconf.get('url') + '/api/admin/advanced/events', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/advanced/events', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -329,7 +328,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/general/sounds', function (done) {
- request(nconf.get('url') + '/api/admin/general/sounds', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/general/sounds', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -337,7 +336,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/categories', function (done) {
- request(nconf.get('url') + '/api/admin/manage/categories', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/categories', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -345,7 +344,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/categories/1', function (done) {
- request(nconf.get('url') + '/api/admin/manage/categories/1', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/categories/1', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -353,7 +352,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/categories/1/analytics', function (done) {
- request(nconf.get('url') + '/api/admin/manage/categories/1/analytics', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/categories/1/analytics', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -361,7 +360,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/extend/rewards', function (done) {
- request(nconf.get('url') + '/api/admin/extend/rewards', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/extend/rewards', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -369,7 +368,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/extend/widgets', function (done) {
- request(nconf.get('url') + '/api/admin/extend/widgets', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/extend/widgets', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -377,7 +376,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/general/languages', function (done) {
- request(nconf.get('url') + '/api/admin/general/languages', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/general/languages', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -385,7 +384,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/general/social', function (done) {
- request(nconf.get('url') + '/api/admin/general/social', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/general/social', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -393,7 +392,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/tags', function (done) {
- request(nconf.get('url') + '/api/admin/manage/tags', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/tags', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -401,7 +400,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/manage/ip-blacklist', function (done) {
- request(nconf.get('url') + '/api/admin/manage/ip-blacklist', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/ip-blacklist', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -409,7 +408,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/appearance/themes', function (done) {
- request(nconf.get('url') + '/api/admin/appearance/themes', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/appearance/themes', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -417,7 +416,7 @@ describe('Admin Controllers', function () {
});
it('should load /admin/appearance/customise', function (done) {
- request(nconf.get('url') + '/api/admin/appearance/customise', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/appearance/customise', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
@@ -427,7 +426,7 @@ describe('Admin Controllers', function () {
it('should load /recent in maintenance mode', function (done) {
var meta = require('../src/meta');
meta.config.maintenanceMode = 1;
- request(nconf.get('url') + '/api/recent', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/recent', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -438,7 +437,7 @@ describe('Admin Controllers', function () {
it('should load /posts/flags', function (done) {
- request(nconf.get('url') + '/api/posts/flags', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/posts/flags', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert(body);
done();
diff --git a/test/controllers.js b/test/controllers.js
index 42070e4c36..c456d3fd69 100644
--- a/test/controllers.js
+++ b/test/controllers.js
@@ -13,7 +13,6 @@ var meta = require('../src/meta');
describe('Controllers', function () {
-
var tid;
var cid;
var pid;
@@ -24,18 +23,18 @@ describe('Controllers', function () {
category: function (next) {
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, next);
},
user: function (next) {
- user.create({username: 'foo', password: 'barbar'}, next);
+ user.create({ username: 'foo', password: 'barbar' }, next);
},
navigation: function (next) {
var navigation = require('../src/navigation/admin');
var data = require('../install/data/navigation.json');
navigation.save(data, next);
- }
+ },
}, function (err, results) {
if (err) {
return done(err);
@@ -43,7 +42,7 @@ describe('Controllers', function () {
cid = results.category.cid;
fooUid = results.user;
- topics.post({uid: results.user, title: 'test topic title', content: 'test topic content', cid: results.category.cid}, function (err, result) {
+ topics.post({ uid: results.user, title: 'test topic title', content: 'test topic content', cid: results.category.cid }, function (err, result) {
tid = result.topicData.tid;
pid = result.postData.pid;
done(err);
@@ -52,7 +51,6 @@ describe('Controllers', function () {
});
-
it('should load default home route', function (done) {
request(nconf.get('url'), function (err, res, body) {
assert.ifError(err);
@@ -444,7 +442,7 @@ describe('Controllers', function () {
groups.create({
name: 'group-details',
description: 'Foobar!',
- hidden: 0
+ hidden: 0,
}, function (err) {
assert.ifError(err);
request(nconf.get('url') + '/groups/group-details', function (err, res, body) {
@@ -470,7 +468,7 @@ describe('Controllers', function () {
groups.create({
name: 'hidden-group',
description: 'Foobar!',
- hidden: 1
+ hidden: 1,
}, function (err) {
assert.ifError(err);
request(nconf.get('url') + '/groups/hidden-group/members', function (err, res, body) {
@@ -515,7 +513,7 @@ describe('Controllers', function () {
var csrf_token;
var helpers = require('./helpers');
before(function (done) {
- user.create({username: 'revokeme', password: 'barbar'}, function (err, _uid) {
+ user.create({ username: 'revokeme', password: 'barbar' }, function (err, _uid) {
assert.ifError(err);
uid = _uid;
helpers.loginUser('revokeme', 'barbar', function (err, _jar, io, _csrf_token) {
@@ -531,8 +529,8 @@ describe('Controllers', function () {
request.del(nconf.get('url') + '/api/user/revokeme/session', {
jar: jar,
headers: {
- 'x-csrf-token': csrf_token
- }
+ 'x-csrf-token': csrf_token,
+ },
}, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 404);
@@ -544,8 +542,8 @@ describe('Controllers', function () {
request.del(nconf.get('url') + '/api/user/doesnotexist/session/1112233', {
jar: jar,
headers: {
- 'x-csrf-token': csrf_token
- }
+ 'x-csrf-token': csrf_token,
+ },
}, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 403);
@@ -564,8 +562,8 @@ describe('Controllers', function () {
request.del(nconf.get('url') + '/api/user/revokeme/session/' + sessionObj.meta.uuid, {
jar: jar,
headers: {
- 'x-csrf-token': csrf_token
- }
+ 'x-csrf-token': csrf_token,
+ },
}, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
@@ -592,25 +590,25 @@ describe('Controllers', function () {
widgets: [
{
widget: 'html',
- data: [ {
+ data: [{
widget: 'html',
data: {
html: 'test',
title: '',
- container: ''
- }
- } ]
- }
- ]
+ container: '',
+ },
+ }],
+ },
+ ],
};
widgets.setArea(data, next);
- }
+ },
], done);
});
it('should return {} if there is no template or locations', function (done) {
- request(nconf.get('url') + '/api/widgets/render', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/widgets/render', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -621,7 +619,7 @@ describe('Controllers', function () {
it('should render templates', function (done) {
var url = nconf.get('url') + '/api/widgets/render?template=categories.tpl&url=&isMobile=false&locations%5B%5D=sidebar&locations%5B%5D=footer&locations%5B%5D=header';
- request(url, {json: true}, function (err, res, body) {
+ request(url, { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -638,7 +636,7 @@ describe('Controllers', function () {
title: 'topic title',
content: 'test topic content',
cid: cid,
- tags: ['nodebb', 'bug', 'test']
+ tags: ['nodebb', 'bug', 'test'],
}, function (err, result) {
assert.ifError(err);
tid = result.topicData.tid;
@@ -647,7 +645,7 @@ describe('Controllers', function () {
});
it('should render tags page', function (done) {
- request(nconf.get('url') + '/api/tags', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/tags', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -657,7 +655,7 @@ describe('Controllers', function () {
});
it('should render tag page with no topics', function (done) {
- request(nconf.get('url') + '/api/tags/notag', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/tags/notag', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -668,7 +666,7 @@ describe('Controllers', function () {
});
it('should render tag page with 1 topic', function (done) {
- request(nconf.get('url') + '/api/tags/nodebb', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/tags/nodebb', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -681,7 +679,6 @@ describe('Controllers', function () {
describe('maintenance mode', function () {
-
before(function (done) {
meta.config.maintenanceMode = 1;
done();
@@ -692,7 +689,7 @@ describe('Controllers', function () {
});
it('should return 503 in maintenance mode', function (done) {
- request(nconf.get('url') + '/recent', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/recent', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 503);
done();
@@ -700,7 +697,7 @@ describe('Controllers', function () {
});
it('should return 503 in maintenance mode', function (done) {
- request(nconf.get('url') + '/api/recent', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/recent', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 503);
assert(body);
@@ -709,7 +706,7 @@ describe('Controllers', function () {
});
it('should return 200 in maintenance mode', function (done) {
- request(nconf.get('url') + '/api/login', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/login', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -748,7 +745,7 @@ describe('Controllers', function () {
});
it('should load /user/foo/bookmarks', function (done) {
- request(nconf.get('url') + '/api/user/foo/bookmarks', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/foo/bookmarks', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -757,7 +754,7 @@ describe('Controllers', function () {
});
it('should load /user/foo/upvoted', function (done) {
- request(nconf.get('url') + '/api/user/foo/upvoted', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/foo/upvoted', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -766,7 +763,7 @@ describe('Controllers', function () {
});
it('should load /user/foo/downvoted', function (done) {
- request(nconf.get('url') + '/api/user/foo/downvoted', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/foo/downvoted', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -784,7 +781,7 @@ describe('Controllers', function () {
});
it('should load /user/foo/watched', function (done) {
- request(nconf.get('url') + '/api/user/foo/watched', {jar: jar}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/foo/watched', { jar: jar }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -812,7 +809,7 @@ describe('Controllers', function () {
tid: 1,
from: fooUid,
mergeId: 'notifications:user_posted_to|' + 1,
- topicTitle: 'topic title'
+ topicTitle: 'topic title',
};
async.waterfall([
function (next) {
@@ -825,7 +822,7 @@ describe('Controllers', function () {
setTimeout(next, 2500);
},
function (next) {
- request(nconf.get('url') + '/api/notifications', {jar: jar, json: true}, next);
+ request(nconf.get('url') + '/api/notifications', { jar: jar, json: true }, next);
},
function (res, body, next) {
assert.equal(res.statusCode, 200);
@@ -837,7 +834,7 @@ describe('Controllers', function () {
assert.equal(notif.path, notifData.path);
assert.equal(notif.nid, notifData.nid);
next();
- }
+ },
], done);
});
});
@@ -846,12 +843,12 @@ describe('Controllers', function () {
var socketUser = require('../src/socket.io/user');
var uid;
before(function (done) {
- user.create({username: 'follower'}, function (err, _uid) {
+ user.create({ username: 'follower' }, function (err, _uid) {
assert.ifError(err);
uid = _uid;
- socketUser.follow({uid: uid}, {uid: fooUid}, function (err) {
+ socketUser.follow({ uid: uid }, { uid: fooUid }, function (err) {
assert.ifError(err);
- socketUser.isFollowing({uid: uid}, {uid: fooUid}, function (err, isFollowing) {
+ socketUser.isFollowing({ uid: uid }, { uid: fooUid }, function (err, isFollowing) {
assert.ifError(err);
assert(isFollowing);
done();
@@ -861,7 +858,7 @@ describe('Controllers', function () {
});
it('should get followers page', function (done) {
- request(nconf.get('url') + '/api/user/foo/followers', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/foo/followers', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert.equal(body.users[0].username, 'follower');
@@ -870,7 +867,7 @@ describe('Controllers', function () {
});
it('should get following page', function (done) {
- request(nconf.get('url') + '/api/user/follower/following', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/follower/following', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert.equal(body.users[0].username, 'foo');
@@ -878,10 +875,10 @@ describe('Controllers', function () {
});
});
- it('should return empty after unfollow', function (done ) {
- socketUser.unfollow({uid: uid}, {uid: fooUid}, function (err) {
+ it('should return empty after unfollow', function (done) {
+ socketUser.unfollow({ uid: uid }, { uid: fooUid }, function (err) {
assert.ifError(err);
- request(nconf.get('url') + '/api/user/foo/followers', {json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/foo/followers', { json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert.equal(body.users.length, 0);
diff --git a/test/database.js b/test/database.js
index 36b2ef932d..f55bf78edb 100644
--- a/test/database.js
+++ b/test/database.js
@@ -1,5 +1,5 @@
'use strict';
-/*global require*/
+
var assert = require('assert');
var db = require('./mocks/databasemock');
@@ -25,5 +25,4 @@ describe('Test database', function () {
require('./database/sets');
require('./database/hash');
require('./database/sorted');
-
});
diff --git a/test/database/hash.js b/test/database/hash.js
index 811f5254e7..4da340b960 100644
--- a/test/database/hash.js
+++ b/test/database/hash.js
@@ -1,15 +1,15 @@
'use strict';
-/*global require, after, before*/
-var async = require('async'),
- assert = require('assert'),
- db = require('../mocks/databasemock');
+
+var async = require('async');
+var assert = require('assert');
+var db = require('../mocks/databasemock');
describe('Hash methods', function () {
var testData = {
name: 'baris',
lastname: 'usakli',
- age: 99
+ age: 99,
};
beforeEach(function (done) {
@@ -18,7 +18,7 @@ describe('Hash methods', function () {
describe('setObject()', function () {
it('should create a object', function (done) {
- db.setObject('testObject1', {foo: 'baris', bar: 99}, function (err) {
+ db.setObject('testObject1', { foo: 'baris', bar: 99 }, function (err) {
assert.equal(err, null);
assert.equal(arguments.length, 1);
done();
@@ -26,7 +26,7 @@ describe('Hash methods', function () {
});
it('should do nothing if key is falsy', function (done) {
- db.setObject('', {foo: 1, derp: 2}, function (err) {
+ db.setObject('', { foo: 1, derp: 2 }, function (err) {
assert.ifError(err);
done();
});
@@ -86,8 +86,8 @@ describe('Hash methods', function () {
describe('getObjects()', function () {
before(function (done) {
async.parallel([
- async.apply(db.setObject, 'testObject4', {name: 'baris'}),
- async.apply(db.setObjectField, 'testObject5', 'name', 'ginger')
+ async.apply(db.setObject, 'testObject4', { name: 'baris' }),
+ async.apply(db.setObjectField, 'testObject5', 'name', 'ginger'),
], done);
});
@@ -161,8 +161,8 @@ describe('Hash methods', function () {
describe('getObjectsFields()', function () {
before(function (done) {
async.parallel([
- async.apply(db.setObject, 'testObject8', {name: 'baris', age:99}),
- async.apply(db.setObject, 'testObject9', {name: 'ginger', age: 3})
+ async.apply(db.setObject, 'testObject8', { name: 'baris', age: 99 }),
+ async.apply(db.setObject, 'testObject9', { name: 'ginger', age: 3 }),
], done);
});
@@ -278,7 +278,7 @@ describe('Hash methods', function () {
describe('deleteObjectField()', function () {
before(function (done) {
- db.setObject('testObject10', {foo: 'bar', delete: 'this', delete1: 'this', delete2: 'this'}, done);
+ db.setObject('testObject10', { foo: 'bar', delete: 'this', delete1: 'this', delete2: 'this' }, done);
});
it('should delete an objects field', function (done) {
@@ -299,7 +299,7 @@ describe('Hash methods', function () {
assert.equal(arguments.length, 1);
async.parallel({
delete1: async.apply(db.isObjectField, 'testObject10', 'delete1'),
- delete2: async.apply(db.isObjectField, 'testObject10', 'delete2')
+ delete2: async.apply(db.isObjectField, 'testObject10', 'delete2'),
}, function (err, results) {
assert.ifError(err);
assert.equal(results.delete1, false);
@@ -312,7 +312,7 @@ describe('Hash methods', function () {
describe('incrObjectField()', function () {
before(function (done) {
- db.setObject('testObject11', {age: 99}, done);
+ db.setObject('testObject11', { age: 99 }, done);
});
it('should set an objects field to 1 if object does not exist', function (done) {
@@ -336,7 +336,7 @@ describe('Hash methods', function () {
describe('decrObjectField()', function () {
before(function (done) {
- db.setObject('testObject13', {age: 99}, done);
+ db.setObject('testObject13', { age: 99 }, done);
});
it('should set an objects field to -1 if object does not exist', function (done) {
@@ -360,7 +360,7 @@ describe('Hash methods', function () {
describe('incrObjectFieldBy()', function () {
before(function (done) {
- db.setObject('testObject15', {age: 100}, done);
+ db.setObject('testObject15', { age: 100 }, done);
});
it('should set an objects field to 5 if object does not exist', function (done) {
@@ -391,7 +391,6 @@ describe('Hash methods', function () {
});
-
after(function (done) {
db.emptydb(done);
});
diff --git a/test/database/keys.js b/test/database/keys.js
index 430ceebdb5..157cc2ca97 100644
--- a/test/database/keys.js
+++ b/test/database/keys.js
@@ -1,12 +1,11 @@
'use strict';
-/*global require, after*/
-var async = require('async'),
- assert = require('assert'),
- db = require('../mocks/databasemock');
-describe('Key methods', function () {
+var async = require('async');
+var assert = require('assert');
+var db = require('../mocks/databasemock');
+describe('Key methods', function () {
beforeEach(function (done) {
db.set('testKey', 'testValue', done);
});
@@ -78,7 +77,7 @@ describe('Key methods', function () {
},
function (next) {
db.set('key2', 'value2', next);
- }
+ },
], function (err) {
if (err) {
return done(err);
@@ -92,7 +91,7 @@ describe('Key methods', function () {
},
key2exists: function (next) {
db.exists('key2', next);
- }
+ },
}, function (err, results) {
assert.equal(err, null);
assert.equal(results.key1exists, false);
diff --git a/test/database/list.js b/test/database/list.js
index cbac21984f..8475ad2f52 100644
--- a/test/database/list.js
+++ b/test/database/list.js
@@ -1,12 +1,11 @@
'use strict';
-/*global require, after, before*/
-var async = require('async'),
- assert = require('assert'),
- db = require('../mocks/databasemock');
-describe('List methods', function () {
+var async = require('async');
+var assert = require('assert');
+var db = require('../mocks/databasemock');
+describe('List methods', function () {
describe('listAppend()', function () {
it('should append to a list', function (done) {
db.listAppend('testList1', 5, function (err) {
@@ -33,7 +32,7 @@ describe('List methods', function () {
},
function (next) {
db.listPrepend('testList2', 1, next);
- }
+ },
], function (err) {
assert.equal(err, null);
done();
@@ -52,7 +51,7 @@ describe('List methods', function () {
},
function (next) {
db.listAppend('testList4', 5, next);
- }
+ },
], done);
});
@@ -94,7 +93,7 @@ describe('List methods', function () {
},
function (next) {
db.listPrepend('testList4', 9, next);
- }
+ },
], done);
});
@@ -115,7 +114,7 @@ describe('List methods', function () {
async.apply(db.listAppend, 'testList5', 1),
async.apply(db.listAppend, 'testList5', 1),
async.apply(db.listAppend, 'testList5', 2),
- async.apply(db.listAppend, 'testList5', 5)
+ async.apply(db.listAppend, 'testList5', 5),
], done);
});
diff --git a/test/database/sets.js b/test/database/sets.js
index aa3eda0c3d..a3e79df81c 100644
--- a/test/database/sets.js
+++ b/test/database/sets.js
@@ -1,12 +1,11 @@
'use strict';
-/*global require, after, before*/
-var async = require('async'),
- assert = require('assert'),
- db = require('../mocks/databasemock');
-describe('Set methods', function () {
+var async = require('async');
+var assert = require('assert');
+var db = require('../mocks/databasemock');
+describe('Set methods', function () {
describe('setAdd()', function () {
it('should add to a set', function (done) {
db.setAdd('testSet1', 5, function (err) {
@@ -27,7 +26,7 @@ describe('Set methods', function () {
describe('getSetMembers()', function () {
before(function (done) {
- db.setAdd('testSet2', [1,2,3,4,5], done);
+ db.setAdd('testSet2', [1, 2, 3, 4, 5], done);
});
it('should return an empty set', function (done) {
@@ -139,7 +138,7 @@ describe('Set methods', function () {
describe('setCount()', function () {
before(function (done) {
- db.setAdd('testSet5', [1,2,3,4,5], done);
+ db.setAdd('testSet5', [1, 2, 3, 4, 5], done);
});
it('should return the element count of set', function (done) {
@@ -155,9 +154,9 @@ describe('Set methods', function () {
describe('setsCount()', function () {
before(function (done) {
async.parallel([
- async.apply(db.setAdd, 'set5', [1,2,3,4,5]),
+ async.apply(db.setAdd, 'set5', [1, 2, 3, 4, 5]),
async.apply(db.setAdd, 'set6', 1),
- async.apply(db.setAdd, 'set7', 2)
+ async.apply(db.setAdd, 'set7', 2),
], done);
});
@@ -211,7 +210,7 @@ describe('Set methods', function () {
describe('setRemoveRandom()', function () {
before(function (done) {
- db.setAdd('testSet7', [1,2,3,4,5], done);
+ db.setAdd('testSet7', [1, 2, 3, 4, 5], done);
});
it('should remove a random element from set', function (done) {
diff --git a/test/database/sorted.js b/test/database/sorted.js
index ac95fcbe09..939f4b259e 100644
--- a/test/database/sorted.js
+++ b/test/database/sorted.js
@@ -1,12 +1,11 @@
'use strict';
-/*global require, after, before*/
-var async = require('async'),
- assert = require('assert'),
- db = require('../mocks/databasemock');
-describe('Sorted Set methods', function () {
+var async = require('async');
+var assert = require('assert');
+var db = require('../mocks/databasemock');
+describe('Sorted Set methods', function () {
before(function (done) {
async.parallel([
function (next) {
@@ -20,7 +19,7 @@ describe('Sorted Set methods', function () {
},
function (next) {
db.sortedSetAdd('sortedSetLex', [0, 0, 0, 0], ['a', 'b', 'c', 'd'], next);
- }
+ },
], done);
});
@@ -97,7 +96,7 @@ describe('Sorted Set methods', function () {
db.getSortedSetRangeWithScores('sortedSetTest1', 0, -1, function (err, values) {
assert.equal(err, null);
assert.equal(arguments.length, 2);
- assert.deepEqual(values, [{value: 'value1', score: 1.1}, {value: 'value2', score: 1.2}, {value: 'value3', score: 1.3}]);
+ assert.deepEqual(values, [{ value: 'value1', score: 1.1 }, { value: 'value2', score: 1.2 }, { value: 'value3', score: 1.3 }]);
done();
});
});
@@ -108,7 +107,7 @@ describe('Sorted Set methods', function () {
db.getSortedSetRevRangeWithScores('sortedSetTest1', 0, -1, function (err, values) {
assert.equal(err, null);
assert.equal(arguments.length, 2);
- assert.deepEqual(values, [{value: 'value3', score: 1.3}, {value: 'value2', score: 1.2}, {value: 'value1', score: 1.1}]);
+ assert.deepEqual(values, [{ value: 'value3', score: 1.3 }, { value: 'value2', score: 1.2 }, { value: 'value1', score: 1.1 }]);
done();
});
});
@@ -141,7 +140,7 @@ describe('Sorted Set methods', function () {
db.getSortedSetRangeByScoreWithScores('sortedSetTest1', 0, -1, '-inf', 1.2, function (err, values) {
assert.equal(err, null);
assert.equal(arguments.length, 2);
- assert.deepEqual(values, [{value: 'value1', score: 1.1}, {value: 'value2', score: 1.2}]);
+ assert.deepEqual(values, [{ value: 'value1', score: 1.1 }, { value: 'value2', score: 1.2 }]);
done();
});
});
@@ -152,7 +151,7 @@ describe('Sorted Set methods', function () {
db.getSortedSetRevRangeByScoreWithScores('sortedSetTest1', 0, -1, '+inf', 1.2, function (err, values) {
assert.equal(err, null);
assert.equal(arguments.length, 2);
- assert.deepEqual(values, [{value: 'value3', score: 1.3}, {value: 'value2', score: 1.2}]);
+ assert.deepEqual(values, [{ value: 'value3', score: 1.3 }, { value: 'value2', score: 1.2 }]);
done();
});
});
@@ -451,7 +450,7 @@ describe('Sorted Set methods', function () {
describe('getSortedSetUnion()', function () {
it('should return an array of values from both sorted sets sorted by scores lowest to highest', function (done) {
- db.getSortedSetUnion({sets: ['sortedSetTest2', 'sortedSetTest3'], start: 0, stop: -1}, function (err, values) {
+ db.getSortedSetUnion({ sets: ['sortedSetTest2', 'sortedSetTest3'], start: 0, stop: -1 }, function (err, values) {
assert.equal(err, null);
assert.equal(arguments.length, 2);
assert.deepEqual(values, ['value1', 'value2', 'value4']);
@@ -462,7 +461,7 @@ describe('Sorted Set methods', function () {
describe('getSortedSetRevUnion()', function () {
it('should return an array of values from both sorted sets sorted by scores highest to lowest', function (done) {
- db.getSortedSetRevUnion({sets: ['sortedSetTest2', 'sortedSetTest3'], start: 0, stop: -1}, function (err, values) {
+ db.getSortedSetRevUnion({ sets: ['sortedSetTest2', 'sortedSetTest3'], start: 0, stop: -1 }, function (err, values) {
assert.equal(err, null);
assert.equal(arguments.length, 2);
assert.deepEqual(values, ['value4', 'value2', 'value1']);
@@ -521,8 +520,8 @@ describe('Sorted Set methods', function () {
describe('sortedSetsRemove()', function () {
before(function (done) {
async.parallel([
- async.apply(db.sortedSetAdd, 'sorted4', [1,2], ['value1', 'value2']),
- async.apply(db.sortedSetAdd, 'sorted5', [1,2], ['value1', 'value3']),
+ async.apply(db.sortedSetAdd, 'sorted4', [1, 2], ['value1', 'value2']),
+ async.apply(db.sortedSetAdd, 'sorted5', [1, 2], ['value1', 'value3']),
], done);
});
@@ -541,7 +540,7 @@ describe('Sorted Set methods', function () {
describe('sortedSetsRemoveRangeByScore()', function () {
before(function (done) {
- db.sortedSetAdd('sorted6', [1,2,3,4,5], ['value1','value2','value3','value4','value5'], done);
+ db.sortedSetAdd('sorted6', [1, 2, 3, 4, 5], ['value1', 'value2', 'value3', 'value4', 'value5'], done);
});
it('should remove elements with scores between min max inclusive', function (done) {
@@ -561,11 +560,11 @@ describe('Sorted Set methods', function () {
before(function (done) {
async.parallel([
function (next) {
- db.sortedSetAdd('interSet1', [1,2,3], ['value1', 'value2', 'value3'], next);
+ db.sortedSetAdd('interSet1', [1, 2, 3], ['value1', 'value2', 'value3'], next);
},
function (next) {
- db.sortedSetAdd('interSet2', [4,5,6], ['value2', 'value3', 'value5'], next);
- }
+ db.sortedSetAdd('interSet2', [4, 5, 6], ['value2', 'value3', 'value5'], next);
+ },
], done);
});
@@ -573,7 +572,7 @@ describe('Sorted Set methods', function () {
db.getSortedSetIntersect({
sets: ['interSet1', 'interSet2'],
start: 0,
- stop: -1
+ stop: -1,
}, function (err, data) {
assert.ifError(err);
assert.deepEqual(['value2', 'value3'], data);
@@ -586,10 +585,10 @@ describe('Sorted Set methods', function () {
sets: ['interSet1', 'interSet2'],
start: 0,
stop: -1,
- withScores: true
+ withScores: true,
}, function (err, data) {
assert.ifError(err);
- assert.deepEqual([{value: 'value2', score: 6}, {value: 'value3', score: 8}], data);
+ assert.deepEqual([{ value: 'value2', score: 6 }, { value: 'value3', score: 8 }], data);
done();
});
});
@@ -600,10 +599,10 @@ describe('Sorted Set methods', function () {
start: 0,
stop: -1,
withScores: true,
- aggregate: 'MIN'
+ aggregate: 'MIN',
}, function (err, data) {
assert.ifError(err);
- assert.deepEqual([{value: 'value2', score: 2}, {value: 'value3', score: 3}], data);
+ assert.deepEqual([{ value: 'value2', score: 2 }, { value: 'value3', score: 3 }], data);
done();
});
});
@@ -614,10 +613,10 @@ describe('Sorted Set methods', function () {
start: 0,
stop: -1,
withScores: true,
- aggregate: 'MAX'
+ aggregate: 'MAX',
}, function (err, data) {
assert.ifError(err);
- assert.deepEqual([{value: 'value2', score: 4}, {value: 'value3', score: 5}], data);
+ assert.deepEqual([{ value: 'value2', score: 4 }, { value: 'value3', score: 5 }], data);
done();
});
});
@@ -628,10 +627,10 @@ describe('Sorted Set methods', function () {
start: 0,
stop: -1,
withScores: true,
- weights: [1, 0.5]
+ weights: [1, 0.5],
}, function (err, data) {
assert.ifError(err);
- assert.deepEqual([{value: 'value2', score: 4}, {value: 'value3', score: 5.5}], data);
+ assert.deepEqual([{ value: 'value2', score: 4 }, { value: 'value3', score: 5.5 }], data);
done();
});
});
@@ -640,7 +639,7 @@ describe('Sorted Set methods', function () {
db.getSortedSetIntersect({
sets: ['interSet10', 'interSet12'],
start: 0,
- stop: -1
+ stop: -1,
}, function (err, data) {
assert.ifError(err);
assert.equal(data.length, 0);
@@ -652,14 +651,13 @@ describe('Sorted Set methods', function () {
db.getSortedSetIntersect({
sets: ['interSet1', 'interSet12'],
start: 0,
- stop: -1
+ stop: -1,
}, function (err, data) {
assert.ifError(err);
assert.equal(data.length, 0);
done();
});
});
-
});
describe('sortedSetIntersectCard', function () {
@@ -676,7 +674,7 @@ describe('Sorted Set methods', function () {
},
function (next) {
db.sortedSetAdd('interCard4', [0, 0, 0], ['value4', 'value5', 'value6'], next);
- }
+ },
], done);
});
diff --git a/test/groups.js b/test/groups.js
index ff9ad3b013..4d587b3aad 100644
--- a/test/groups.js
+++ b/test/groups.js
@@ -20,7 +20,7 @@ describe('Groups', function () {
// Create a group to play around with
Groups.create({
name: 'Test',
- description: 'Foobar!'
+ description: 'Foobar!',
}, next);
},
function (next) {
@@ -28,7 +28,7 @@ describe('Groups', function () {
name: 'PrivateNoJoin',
description: 'Private group',
private: 1,
- disableJoinRequests: 1
+ disableJoinRequests: 1,
}, next);
},
function (next) {
@@ -36,27 +36,27 @@ describe('Groups', function () {
name: 'PrivateCanJoin',
description: 'Private group',
private: 1,
- disableJoinRequests: 0
+ disableJoinRequests: 0,
}, next);
},
function (next) {
// Create a new user
User.create({
username: 'testuser',
- email: 'b@c.com'
+ email: 'b@c.com',
}, next);
},
function (next) {
User.create({
username: 'admin',
email: 'admin@admin.com',
- password: '123456'
+ password: '123456',
}, next);
},
function (next) {
// Also create a hidden group
Groups.join('Hidden', 'Test', next);
- }
+ },
], function (err, results) {
assert.ifError(err);
testUid = results[3];
@@ -99,7 +99,7 @@ describe('Groups', function () {
var socketGroups = require('../src/socket.io/groups');
it('should return the groups when search query is empty', function (done) {
- socketGroups.search({uid: adminUid}, {query: ''}, function (err, groups) {
+ socketGroups.search({ uid: adminUid }, { query: '' }, function (err, groups) {
assert.ifError(err);
assert.equal(3, groups.length);
done();
@@ -107,7 +107,7 @@ describe('Groups', function () {
});
it('should return the "Test" group when searched for', function (done) {
- socketGroups.search({uid: adminUid}, {query: 'test'}, function (err, groups) {
+ socketGroups.search({ uid: adminUid }, { query: 'test' }, function (err, groups) {
assert.ifError(err);
assert.equal(1, groups.length);
assert.strictEqual('Test', groups[0].name);
@@ -116,7 +116,7 @@ describe('Groups', function () {
});
it('should return the "Test" group when searched for and sort by member count', function (done) {
- Groups.search('test', {filterHidden: true, sort: 'count'}, function (err, groups) {
+ Groups.search('test', { filterHidden: true, sort: 'count' }, function (err, groups) {
assert.ifError(err);
assert.equal(1, groups.length);
assert.strictEqual('Test', groups[0].name);
@@ -125,7 +125,7 @@ describe('Groups', function () {
});
it('should return the "Test" group when searched for and sort by creation time', function (done) {
- Groups.search('test', {filterHidden: true, sort: 'date'}, function (err, groups) {
+ Groups.search('test', { filterHidden: true, sort: 'date' }, function (err, groups) {
assert.ifError(err);
assert.equal(1, groups.length);
assert.strictEqual('Test', groups[0].name);
@@ -136,12 +136,12 @@ describe('Groups', function () {
it('should return all users if no query', function (done) {
User.create({
username: 'newuser',
- email: 'newuser@b.com'
+ email: 'newuser@b.com',
}, function (err, uid) {
assert.ifError(err);
Groups.join('Test', uid, function (err) {
assert.ifError(err);
- socketGroups.searchMembers({uid: adminUid}, {groupName: 'Test', query: ''}, function (err, data) {
+ socketGroups.searchMembers({ uid: adminUid }, { groupName: 'Test', query: '' }, function (err, data) {
assert.ifError(err);
assert.equal(data.users.length, 2);
done();
@@ -151,13 +151,12 @@ describe('Groups', function () {
});
it('should search group members', function (done) {
- socketGroups.searchMembers({uid: adminUid}, {groupName: 'Test', query: 'test'}, function (err, data) {
+ socketGroups.searchMembers({ uid: adminUid }, { groupName: 'Test', query: 'test' }, function (err, data) {
assert.ifError(err);
assert.strictEqual('testuser', data.users[0].username);
done();
});
});
-
});
describe('.isMember()', function () {
@@ -227,7 +226,7 @@ describe('Groups', function () {
it('should create another group', function (done) {
Groups.create({
name: 'foo',
- description: 'bar'
+ description: 'bar',
}, function (err) {
assert.ifError(err);
Groups.get('foo', {}, done);
@@ -235,7 +234,7 @@ describe('Groups', function () {
});
it('should fail to create group with duplicate group name', function (done) {
- Groups.create({name: 'foo'}, function (err) {
+ Groups.create({ name: 'foo' }, function (err) {
assert(err);
assert.equal(err.message, '[[error:group-already-exists]]');
done();
@@ -243,21 +242,21 @@ describe('Groups', function () {
});
it('should fail to create group if slug is empty', function (done) {
- Groups.create({name: '>>>>'}, function (err) {
+ Groups.create({ name: '>>>>' }, function (err) {
assert.equal(err.message, '[[error:invalid-group-name]]');
done();
});
});
it('should fail if group name is invalid', function (done) {
- Groups.create({name: 'not/valid'}, function (err) {
+ Groups.create({ name: 'not/valid' }, function (err) {
assert.equal(err.message, '[[error:invalid-group-name]]');
done();
});
});
it('should fail if group name is invalid', function (done) {
- Groups.create({name: 'not:valid'}, function (err) {
+ Groups.create({ name: 'not:valid' }, function (err) {
assert.equal(err.message, '[[error:invalid-group-name]]');
done();
});
@@ -284,13 +283,13 @@ describe('Groups', function () {
name: 'updateTestGroup',
description: 'bar',
system: 0,
- hidden: 0
+ hidden: 0,
}, done);
});
it('should change an aspect of a group', function (done) {
Groups.update('updateTestGroup', {
- description: 'baz'
+ description: 'baz',
}, function (err) {
assert.ifError(err);
@@ -304,7 +303,7 @@ describe('Groups', function () {
it('should rename a group if the name was updated', function (done) {
Groups.update('updateTestGroup', {
- name: 'updateTestGroup?'
+ name: 'updateTestGroup?',
}, function (err) {
assert.ifError(err);
@@ -433,37 +432,36 @@ describe('Groups', function () {
var socketGroups = require('../src/socket.io/groups');
var meta = require('../src/meta');
-
it('should error if data is null', function (done) {
- socketGroups.before({uid: 0}, 'groups.join', null, function (err) {
+ socketGroups.before({ uid: 0 }, 'groups.join', null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should not error if data is valid', function (done) {
- socketGroups.before({uid: 0}, 'groups.join', {}, function (err) {
+ socketGroups.before({ uid: 0 }, 'groups.join', {}, function (err) {
assert.ifError(err);
done();
});
});
it('should return error if not logged in', function (done) {
- socketGroups.join({uid: 0}, {}, function (err) {
+ socketGroups.join({ uid: 0 }, {}, function (err) {
assert.equal(err.message, '[[error:invalid-uid]]');
done();
});
});
it('should return error if group name is special', function (done) {
- socketGroups.join({uid: adminUid}, {groupName: 'administrators'}, function (err) {
+ socketGroups.join({ uid: adminUid }, { groupName: 'administrators' }, function (err) {
assert.equal(err.message, '[[error:not-allowed]]');
done();
});
});
it('should error if group does not exist', function (done) {
- socketGroups.join({uid: adminUid}, {groupName: 'doesnotexist'}, function (err) {
+ socketGroups.join({ uid: adminUid }, { groupName: 'doesnotexist' }, function (err) {
assert.equal(err.message, '[[error:no-group]]');
done();
});
@@ -471,7 +469,7 @@ describe('Groups', function () {
it('should join test group', function (done) {
meta.config.allowPrivateGroups = 0;
- socketGroups.join({uid: adminUid}, {groupName: 'Test'}, function (err) {
+ socketGroups.join({ uid: adminUid }, { groupName: 'Test' }, function (err) {
assert.ifError(err);
Groups.isMember(adminUid, 'Test', function (err, isMember) {
assert.ifError(err);
@@ -482,21 +480,21 @@ describe('Groups', function () {
});
it('should error if not logged in', function (done) {
- socketGroups.leave({uid: 0}, {}, function (err) {
+ socketGroups.leave({ uid: 0 }, {}, function (err) {
assert.equal(err.message, '[[error:invalid-uid]]');
done();
});
});
it('should return error if group name is special', function (done) {
- socketGroups.leave({uid: adminUid}, {groupName: 'administrators'}, function (err) {
+ socketGroups.leave({ uid: adminUid }, { groupName: 'administrators' }, function (err) {
assert.equal(err.message, '[[error:cant-remove-self-as-admin]]');
done();
});
});
it('should leave test group', function (done) {
- socketGroups.leave({uid: adminUid}, {groupName: 'Test'}, function (err) {
+ socketGroups.leave({ uid: adminUid }, { groupName: 'Test' }, function (err) {
assert.ifError(err);
Groups.isMember('Test', adminUid, function (err, isMember) {
assert.ifError(err);
@@ -508,14 +506,14 @@ describe('Groups', function () {
it('should fail to join if group is private and join requests are disabled', function (done) {
meta.config.allowPrivateGroups = 1;
- socketGroups.join({uid: testUid}, {groupName: 'PrivateNoJoin'}, function (err) {
+ socketGroups.join({ uid: testUid }, { groupName: 'PrivateNoJoin' }, function (err) {
assert.equal(err.message, '[[error:join-requests-disabled]]');
done();
});
});
it('should join if user is admin', function (done) {
- socketGroups.join({uid: adminUid}, {groupName: 'PrivateCanJoin'}, function (err) {
+ socketGroups.join({ uid: adminUid }, { groupName: 'PrivateCanJoin' }, function (err) {
assert.ifError(err);
Groups.isMember(adminUid, 'PrivateCanJoin', function (err, isMember) {
assert.ifError(err);
@@ -526,7 +524,7 @@ describe('Groups', function () {
});
it('should request membership for regular user', function (done) {
- socketGroups.join({uid: testUid}, {groupName: 'PrivateCanJoin'}, function (err) {
+ socketGroups.join({ uid: testUid }, { groupName: 'PrivateCanJoin' }, function (err) {
assert.ifError(err);
Groups.isPending(testUid, 'PrivateCanJoin', function (err, isPending) {
assert.ifError(err);
@@ -536,19 +534,188 @@ describe('Groups', function () {
});
});
- it('should accept membership of user', function (done) {
- socketGroups.accept({uid: adminUid}, {groupName: 'PrivateCanJoin', toUid: testUid}, function (err) {
+ it('should reject membership of user', function (done) {
+ socketGroups.reject({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: testUid }, function (err) {
assert.ifError(err);
- Groups.isMember(testUid, 'PrivateCanJoin', function (err, isMember) {
+ Groups.isInvited(testUid, 'PrivateCanJoin', function (err, invited) {
assert.ifError(err);
- assert(isMember);
+ assert.equal(invited, false);
done();
});
});
});
+ it('should error if not owner or admin', function (done) {
+ socketGroups.accept({ uid: 0 }, { groupName: 'PrivateCanJoin', toUid: testUid }, function (err) {
+ assert.equal(err.message, '[[error:no-privileges]]');
+ done();
+ });
+ });
+
+ it('should accept membership of user', function (done) {
+ socketGroups.join({ uid: testUid }, { groupName: 'PrivateCanJoin' }, function (err) {
+ assert.ifError(err);
+ socketGroups.accept({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: testUid }, function (err) {
+ assert.ifError(err);
+ Groups.isMember(testUid, 'PrivateCanJoin', function (err, isMember) {
+ assert.ifError(err);
+ assert(isMember);
+ done();
+ });
+ });
+ });
+ });
+
+ it('should reject/accept all memberships requests', function (done) {
+ function requestMembership(uids, callback) {
+ async.series([
+ function (next) {
+ socketGroups.join({ uid: uids.uid1 }, { groupName: 'PrivateCanJoin' }, next);
+ },
+ function (next) {
+ socketGroups.join({ uid: uids.uid2 }, { groupName: 'PrivateCanJoin' }, next);
+ },
+ ], function (err) {
+ callback(err);
+ });
+ }
+ var uids;
+ async.waterfall([
+ function (next) {
+ async.parallel({
+ uid1: function (next) {
+ User.create({ username: 'groupuser1' }, next);
+ },
+ uid2: function (next) {
+ User.create({ username: 'groupuser2' }, next);
+ },
+ }, next);
+ },
+ function (results, next) {
+ uids = results;
+ requestMembership(results, next);
+ },
+ function (next) {
+ socketGroups.rejectAll({ uid: adminUid }, { groupName: 'PrivateCanJoin' }, next);
+ },
+ function (next) {
+ Groups.getPending('PrivateCanJoin', next);
+ },
+ function (pending, next) {
+ assert.equal(pending.length, 0);
+ requestMembership(uids, next);
+ },
+ function (next) {
+ socketGroups.acceptAll({ uid: adminUid }, { groupName: 'PrivateCanJoin' }, next);
+ },
+ function (next) {
+ Groups.isMembers([uids.uid1, uids.uid2], 'PrivateCanJoin', next);
+ },
+ function (isMembers, next) {
+ assert(isMembers[0]);
+ assert(isMembers[1]);
+ next();
+ },
+ ], function (err) {
+ done(err);
+ });
+ });
+
+ it('should issue invite to user', function (done) {
+ User.create({ username: 'invite1' }, function (err, uid) {
+ assert.ifError(err);
+ socketGroups.issueInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: uid }, function (err) {
+ assert.ifError(err);
+ Groups.isInvited(uid, 'PrivateCanJoin', function (err, isInvited) {
+ assert.ifError(err);
+ assert(isInvited);
+ done();
+ });
+ });
+ });
+ });
+
+ it('should fail with invalid data', function (done) {
+ socketGroups.issueMassInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', usernames: null }, function (err) {
+ assert.equal(err.message, '[[error:invalid-data]]');
+ done();
+ });
+ });
+
+ it('should issue mass invite to users', function (done) {
+ User.create({ username: 'invite2' }, function (err, uid) {
+ assert.ifError(err);
+ socketGroups.issueMassInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', usernames: 'invite1, invite2' }, function (err) {
+ assert.ifError(err);
+ Groups.isInvited(uid, 'PrivateCanJoin', function (err, isInvited) {
+ assert.ifError(err);
+ assert(isInvited);
+ done();
+ });
+ });
+ });
+ });
+
+ it('should rescind invite', function (done) {
+ User.create({ username: 'invite3' }, function (err, uid) {
+ assert.ifError(err);
+ socketGroups.issueInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: uid }, function (err) {
+ assert.ifError(err);
+ socketGroups.rescindInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: uid }, function (err) {
+ assert.ifError(err);
+ Groups.isInvited(uid, 'PrivateCanJoin', function (err, isInvited) {
+ assert.ifError(err);
+ assert(!isInvited);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ it('should error if user is not invited', function (done) {
+ socketGroups.acceptInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin' }, function (err) {
+ assert.equal(err.message, '[[error:not-invited]]');
+ done();
+ });
+ });
+
+ it('should accept invite', function (done) {
+ User.create({ username: 'invite4' }, function (err, uid) {
+ assert.ifError(err);
+ socketGroups.issueInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: uid }, function (err) {
+ assert.ifError(err);
+ socketGroups.acceptInvite({ uid: uid }, { groupName: 'PrivateCanJoin' }, function (err) {
+ assert.ifError(err);
+ Groups.isMember(uid, 'PrivateCanJoin', function (err, isMember) {
+ assert.ifError(err);
+ assert(isMember);
+ done();
+ });
+ });
+ });
+ });
+ });
+
+ it('should reject invite', function (done) {
+ User.create({ username: 'invite5' }, function (err, uid) {
+ assert.ifError(err);
+ socketGroups.issueInvite({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: uid }, function (err) {
+ assert.ifError(err);
+ socketGroups.rejectInvite({ uid: uid }, { groupName: 'PrivateCanJoin' }, function (err) {
+ assert.ifError(err);
+ Groups.isInvited(uid, 'PrivateCanJoin', function (err, isInvited) {
+ assert.ifError(err);
+ assert(!isInvited);
+ done();
+ });
+ });
+ });
+ });
+ });
+
it('should grant ownership to user', function (done) {
- socketGroups.grant({uid: adminUid}, {groupName: 'PrivateCanJoin', toUid: testUid}, function (err) {
+ socketGroups.grant({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: testUid }, function (err) {
assert.ifError(err);
Groups.ownership.isOwner(testUid, 'PrivateCanJoin', function (err, isOwner) {
assert.ifError(err);
@@ -559,7 +726,7 @@ describe('Groups', function () {
});
it('should rescind ownership from user', function (done) {
- socketGroups.rescind({uid: adminUid}, {groupName: 'PrivateCanJoin', toUid: testUid}, function (err) {
+ socketGroups.rescind({ uid: adminUid }, { groupName: 'PrivateCanJoin', toUid: testUid }, function (err) {
assert.ifError(err);
Groups.ownership.isOwner(testUid, 'PrivateCanJoin', function (err, isOwner) {
assert.ifError(err);
@@ -569,8 +736,15 @@ describe('Groups', function () {
});
});
+ it('should fail to kick user with invalid data', function (done) {
+ socketGroups.kick({ uid: adminUid }, { groupName: 'PrivateCanJoin', uid: adminUid }, function (err) {
+ assert.equal(err.message, '[[error:cant-kick-self]]');
+ done();
+ });
+ });
+
it('should kick user from group', function (done) {
- socketGroups.kick({uid: adminUid}, {groupName: 'PrivateCanJoin', uid: testUid}, function (err) {
+ socketGroups.kick({ uid: adminUid }, { groupName: 'PrivateCanJoin', uid: testUid }, function (err) {
assert.ifError(err);
Groups.isMember(testUid, 'PrivateCanJoin', function (err, isMember) {
assert.ifError(err);
@@ -580,27 +754,151 @@ describe('Groups', function () {
});
});
+ it('should fail to create group with invalid data', function (done) {
+ socketGroups.create({ uid: 0 }, {}, function (err) {
+ assert.equal(err.message, '[[error:no-privileges]]');
+ done();
+ });
+ });
+
+ it('should fail to create group if group creation is disabled', function (done) {
+ var oldValue = meta.config.allowGroupCreation;
+ meta.config.allowGroupCreation = 0;
+ socketGroups.create({ uid: 1 }, {}, function (err) {
+ assert.equal(err.message, '[[error:group-creation-disabled]]');
+ meta.config.allowGroupCreation = oldValue;
+ done();
+ });
+ });
+
+ it('should fail to create group if name is privilege group', function (done) {
+ var oldValue = meta.config.allowGroupCreation;
+ meta.config.allowGroupCreation = 1;
+ socketGroups.create({ uid: 1 }, { name: 'cid:1:privileges:groups:find' }, function (err) {
+ assert.equal(err.message, '[[error:invalid-group-name]]');
+ meta.config.allowGroupCreation = oldValue;
+ done();
+ });
+ });
+
+
+ it('should create/update group', function (done) {
+ var oldValue = meta.config.allowGroupCreation;
+ meta.config.allowGroupCreation = 1;
+ socketGroups.create({ uid: adminUid }, { name: 'createupdategroup' }, function (err, groupData) {
+ meta.config.allowGroupCreation = oldValue;
+ assert.ifError(err);
+ assert(groupData);
+ var data = {
+ groupName: 'createupdategroup',
+ values: {
+ name: 'renamedupdategroup',
+ description: 'cat group',
+ userTitle: 'cats',
+ userTitleEnabled: 1,
+ disableJoinRequests: 1,
+ hidden: 1,
+ private: 0,
+ },
+ };
+ socketGroups.update({ uid: adminUid }, data, function (err) {
+ assert.ifError(err);
+ Groups.get('renamedupdategroup', {}, function (err, groupData) {
+ assert.ifError(err);
+ assert.equal(groupData.name, 'renamedupdategroup');
+ assert.equal(groupData.userTitle, 'cats');
+ assert.equal(groupData.description, 'cat group');
+ assert.equal(groupData.hidden, true);
+ assert.equal(groupData.disableJoinRequests, true);
+ assert.equal(groupData.private, false);
+ done();
+ });
+ });
+ });
+ });
+
+ it('should delete group', function (done) {
+ socketGroups.delete({ uid: adminUid }, { groupName: 'renamedupdategroup' }, function (err) {
+ assert.ifError(err);
+ Groups.exists('renamedupdategroup', function (err, exists) {
+ assert.ifError(err);
+ assert(!exists);
+ done();
+ });
+ });
+ });
+
+ it('should fail to delete group if name is special', function (done) {
+ socketGroups.delete({ uid: adminUid }, { groupName: 'administrators' }, function (err) {
+ assert.equal(err.message, '[[error:not-allowed]]');
+ done();
+ });
+ });
+
+ it('should fail to delete group if name is special', function (done) {
+ socketGroups.delete({ uid: adminUid }, { groupName: 'registered-users' }, function (err) {
+ assert.equal(err.message, '[[error:not-allowed]]');
+ done();
+ });
+ });
+
+ it('should fail to delete group if name is special', function (done) {
+ socketGroups.delete({ uid: adminUid }, { groupName: 'Global Moderators' }, function (err) {
+ assert.equal(err.message, '[[error:not-allowed]]');
+ done();
+ });
+ });
+
+ it('should fail to load more groups with invalid data', function (done) {
+ socketGroups.loadMore({ uid: adminUid }, {}, function (err) {
+ assert.equal(err.message, '[[error:invalid-data]]');
+ done();
+ });
+ });
+
+ it('should load more groups', function (done) {
+ socketGroups.loadMore({ uid: adminUid }, { after: 0, sort: 'count' }, function (err, data) {
+ assert.ifError(err);
+ assert(Array.isArray(data.groups));
+ done();
+ });
+ });
+
+ it('should fail to load more members with invalid data', function (done) {
+ socketGroups.loadMoreMembers({ uid: adminUid }, {}, function (err) {
+ assert.equal(err.message, '[[error:invalid-data]]');
+ done();
+ });
+ });
+
+ it('should load more members', function (done) {
+ socketGroups.loadMoreMembers({ uid: adminUid }, { after: 0, groupName: 'PrivateCanJoin' }, function (err, data) {
+ assert.ifError(err);
+ assert(Array.isArray(data.users));
+ done();
+ });
+ });
});
describe('admin socket methods', function () {
var socketGroups = require('../src/socket.io/admin/groups');
it('should fail to create group with invalid data', function (done) {
- socketGroups.create({uid: adminUid}, null, function (err) {
+ socketGroups.create({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should fail to create group if group name is privilege group', function (done) {
- socketGroups.create({uid: adminUid}, {name: 'cid:1:privileges:read'}, function (err) {
+ socketGroups.create({ uid: adminUid }, { name: 'cid:1:privileges:read' }, function (err) {
assert.equal(err.message, '[[error:invalid-group-name]]');
done();
});
});
it('should create a group', function (done) {
- socketGroups.create({uid: adminUid}, {name: 'newgroup', description: 'group created by admin'}, function (err, groupData) {
+ socketGroups.create({ uid: adminUid }, { name: 'newgroup', description: 'group created by admin' }, function (err, groupData) {
assert.ifError(err);
assert.equal(groupData.name, 'newgroup');
assert.equal(groupData.description, 'group created by admin');
@@ -612,14 +910,14 @@ describe('Groups', function () {
});
it('should fail to join with invalid data', function (done) {
- socketGroups.join({uid: adminUid}, null, function (err) {
+ socketGroups.join({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should add user to group', function (done) {
- socketGroups.join({uid: adminUid}, {uid: testUid, groupName: 'newgroup'}, function (err) {
+ socketGroups.join({ uid: adminUid }, { uid: testUid, groupName: 'newgroup' }, function (err) {
assert.ifError(err);
Groups.isMember(testUid, 'newgroup', function (err, isMember) {
assert.ifError(err);
@@ -630,35 +928,35 @@ describe('Groups', function () {
});
it('should fail to if user is already member', function (done) {
- socketGroups.join({uid: adminUid}, {uid: testUid, groupName: 'newgroup'}, function (err) {
+ socketGroups.join({ uid: adminUid }, { uid: testUid, groupName: 'newgroup' }, function (err) {
assert.equal(err.message, '[[error:group-already-member]]');
done();
});
});
it('it should fail with invalid data', function (done) {
- socketGroups.leave({uid: adminUid}, null, function (err) {
+ socketGroups.leave({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('it should fail if admin tries to remove self', function (done) {
- socketGroups.leave({uid: adminUid}, {uid: adminUid, groupName: 'administrators'}, function (err) {
+ socketGroups.leave({ uid: adminUid }, { uid: adminUid, groupName: 'administrators' }, function (err) {
assert.equal(err.message, '[[error:cant-remove-self-as-admin]]');
done();
});
});
it('should fail if user is not member', function (done) {
- socketGroups.leave({uid: adminUid}, {uid: 3, groupName: 'newgroup'}, function (err) {
+ socketGroups.leave({ uid: adminUid }, { uid: 3, groupName: 'newgroup' }, function (err) {
assert.equal(err.message, '[[error:group-not-member]]');
done();
});
});
it('should remove user from group', function (done) {
- socketGroups.leave({uid: adminUid}, {uid: testUid, groupName: 'newgroup'}, function (err) {
+ socketGroups.leave({ uid: adminUid }, { uid: testUid, groupName: 'newgroup' }, function (err) {
assert.ifError(err);
Groups.isMember(testUid, 'newgroup', function (err, isMember) {
assert.ifError(err);
@@ -669,7 +967,7 @@ describe('Groups', function () {
});
it('should fail with invalid data', function (done) {
- socketGroups.update({uid: adminUid}, null, function (err) {
+ socketGroups.update({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -685,10 +983,10 @@ describe('Groups', function () {
userTitleEnabled: 1,
disableJoinRequests: 1,
hidden: 1,
- private: 0
- }
+ private: 0,
+ },
};
- socketGroups.update({uid: adminUid}, data, function (err) {
+ socketGroups.update({ uid: adminUid }, data, function (err) {
assert.ifError(err);
Groups.get('renamedgroup', {}, function (err, groupData) {
assert.ifError(err);
@@ -710,7 +1008,7 @@ describe('Groups', function () {
var logoPath = path.join(__dirname, '../test/files/test.png');
var imagePath = path.join(__dirname, '../test/files/groupcover.png');
before(function (done) {
- User.create({username: 'regularuser', password: '123456'}, function (err, uid) {
+ User.create({ username: 'regularuser', password: '123456' }, function (err, uid) {
assert.ifError(err);
regularUid = uid;
async.series([
@@ -722,15 +1020,15 @@ describe('Groups', function () {
},
function (next) {
helpers.copyFile(logoPath, imagePath, next);
- }
+ },
], done);
});
});
it('should fail if user is not logged in or not owner', function (done) {
- socketGroups.cover.update({uid: 0}, {}, function (err) {
+ socketGroups.cover.update({ uid: 0 }, {}, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
- socketGroups.cover.update({uid: regularUid}, {}, function (err) {
+ socketGroups.cover.update({ uid: regularUid }, {}, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
@@ -740,9 +1038,9 @@ describe('Groups', function () {
it('should upload group cover image from file', function (done) {
var data = {
groupName: 'Test',
- file: imagePath
+ file: imagePath,
};
- socketGroups.cover.update({uid: adminUid}, data, function (err, data) {
+ socketGroups.cover.update({ uid: adminUid }, data, function (err, data) {
assert.ifError(err);
Groups.getGroupFields('Test', ['cover:url'], function (err, groupData) {
assert.ifError(err);
@@ -756,9 +1054,9 @@ describe('Groups', function () {
it('should upload group cover image from data', function (done) {
var data = {
groupName: 'Test',
- imageData: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAACXBIWXMAAC4jAAAuIwF4pT92AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACcJJREFUeNqMl9tvnNV6xn/f+s5z8DCeg88Zj+NYdhJH4KShFoJAIkzVphLVJnsDaiV6gUKaC2qQUFVATbnoValAakuQYKMqBKUUJCgI9XBBSmOROMqGoCStHbA9sWM7nrFn/I3n9B17kcwoabfarj9gvet53+d9nmdJAwMDAAgh8DyPtbU1XNfFMAwkScK2bTzPw/M8dF1/SAhxKAiCxxVF2aeqqqTr+q+Af+7o6Ch0d3f/69TU1KwkSRiGwbFjx3jmmWd47rnn+OGHH1BVFYX/5QRBkPQ87xeSJP22YRi/oapqStM0PM/D931kWSYIgnHf98cXFxepVqtomjZt2/Zf2bb990EQ4Pv+PXfeU1CSpGYhfN9/TgjxQTQaJQgCwuEwQRBQKpUwDAPTNPF9n0ajAYDv+8zPzzM+Pr6/Wq2eqdVqfxOJRA6Zpnn57hrivyEC0IQQZ4Mg+MAwDCKRCJIkUa/XEUIQi8XQNI1QKIQkSQghUBQFIQSmaTI7OwtAuVxOTE9Pfzc9Pf27lUqlBUgulUoUi0VKpRKqqg4EQfAfiqLsDIfDAC0E4XCYaDSKEALXdalUKvfM1/d9hBBYlkUul2N4eJi3335bcl33mW+++aaUz+cvSJKE8uKLL6JpGo7j8Omnn/7d+vp6sr+/HyEEjuMgyzKu6yJJEsViEVVV8TyPjY2NVisV5fZkTNMkkUhw8+ZN6vU6Kysr7Nmzh9OnT7/12GOPDS8sLByT7rQR4A9XV1d/+cILLzA9PU0kEmF4eBhFUTh//jyWZaHrOkII0uk0jUaDWq1GJpOhWCyysrLC1tYWnuehqir79+9H13W6urp48803+f7773n++ef/4G7S/H4ikUCSJNbX11trcuvWLcrlMrIs4zgODzzwABMTE/i+T7lcpq2tjUqlwubmJrZts7y8jBCCkZERGo0G2WyWkydPkkql6Onp+eMmwihwc3JyMvrWW2+RTCYBcF0XWZbRdZ3l5WX27NnD008/TSwWQ1VVyuVy63GhUIhEIkEqlcJxHCzLIhaLMTQ0xJkzZ7Btm3379lmS53kIIczZ2dnFsbGxRK1Wo729HQDP8zAMg5WVFXp7e5mcnKSzs5N8Po/rutTrdVzXbQmHrutEo1FM00RVVXp7e0kkEgRBwMWLF9F1vaxUq1UikUjtlVdeuV6pVBJ9fX3Ytn2bwrLMysoKXV1dTE5OkslksCwLTdMwDANVVdnY2CAIApLJJJFIBMdxiMfj7Nq1C1VViUajLQCvvvrqkhKJRJiZmfmdb7/99jeTySSyLLfWodFoEAqFOH78OLt37yaXy2GaJoqisLy8zNTUFFevXiUIAtrb29m5cyePPPJIa+cymQz1eh2A0dFRCoXCsgIwNTW1J5/P093dTbFYRJZlJEmiWq1y4MABxsbGqNVqhEIh6vU6QRBQLpcxDIPh4WE8z2NxcZFTp05x7tw5Xn755ZY6dXZ2tliZzWa/EwD1ev3RsbExxsfHSafTVCoVGo0Gqqqya9cuIpEIQgh832dtbY3FxUUA+vr62LZtG2NjYxw5coTDhw+ztLTEyZMnuXr1KoVC4R4d3bt375R84sQJEY/H/2Jubq7N9326urqwbZt6vY5pmhw5coS+vr4W9YvFIrdu3WJqagohBFeuXOHcuXOtue7evRtN01rtfO+991haWmJkZGQrkUi8JIC9iqL0BkFAIpFACMETTzxBV1cXiUSC7u5uHMfB8zyCIMA0TeLxONlsFlmW8X2fwcFBHMdhfn6eer1Oe3s7Dz30EBMTE1y6dImjR49y6tSppR07dqwrjuM8+OWXXzI0NMTly5e5du0aQ0NDTExMkMvlCIKAIAhaIh2LxQiHw0QiEfL5POl0mlqtRq1Wo6OjA8uykGWZdDrN0tISvb29vPPOOzz++OPk83lELpf7rXfffRfDMOjo6MBxHEqlEocOHWLHjh00Gg0kSULTNIS4bS6qqhKPxxkaGmJ4eJjR0VH279/PwMAA27dvJ5vN4vs+X331FR9//DGzs7OEQiE++eQTlPb29keuX7/OtWvXOH78ONVqlZs3b9LW1kYmk8F13dZeCiGQJAnXdRFCYBgGsiwjhMC2bQqFAkEQoOs6P/74Iw8++CCDg4Pous6xY8f47LPPkIIguDo2Nrbzxo0bfPjhh9i2zczMTHNvcF2XpsZalkWj0cB1Xe4o1O3YoCisra3x008/EY/H6erqAuDAgQNEIhGCIODQoUP/ubCwMCKAjx599FHW19f56KOP6OjooFgsks/niUajKIqCbds4joMQAiFESxxs226xd2Zmhng8Tl9fH67r0mg0sG2bbDZLpVIhl8vd5gHwtysrKy8Dcdd1mZubo6enh1gsRrVabZlrk6VND/R9n3q9TqVSQdd1QqEQi4uLnD9/nlKpxODgIHv37gXAcRyCICiFQiHEzp07i1988cUfKYpCIpHANE22b9/eUhNFUVotDIKghc7zPCzLolKpsLW1RVtbG0EQ4DgOmqbR09NDM1qUSiWAPwdQ7ujjmf7+/kQymfxrSZJQVZWtra2WG+i63iKH53m4rku1WqVcLmNZFu3t7S2x7+/vJ51O89prr7VYfenSpcPAP1UqFeSHH36YeDxOKpW6eP/9988Bv9d09nw+T7VapVKptJjZnE2tVmNtbY1cLke5XGZra4vNzU16enp49tlnGRgYaD7iTxqNxgexWIzDhw+jNEPQHV87NT8/f+PChQtnR0ZGqFarrUVuOsDds2u2b2FhgVQqRSQSYWFhgStXrtDf308ymcwBf3nw4EEOHjx4O5c2lURVVRzHYXp6+t8uX7785IULFz7LZDLous59991HOBy+h31N9xgdHSWTyVCtVhkaGmLfvn1MT08zPz/PzMzM6c8//9xr+uE9QViWZer1OhsbGxiG8fns7OzPc7ncx729vXR3d1OpVNi2bRuhUAhZljEMA9/3sW0bVVVZWlri4sWLjI+P8/rrr/P111/z5JNPXrIs69cn76ZeGoaBpmm0tbX9Q6FQeHhubu7fC4UCkUiE1dVVstks8Xgc0zSRZZlGo9ESAdM02djYoNFo8MYbb2BZ1mYoFOKuZPjr/xZBEHCHred83x/b3Nz8l/X19aRlWWxsbNDZ2cnw8DDhcBjf96lWq/T09HD06FGeeuopXnrpJc6ePUs6nb4hhPi/C959ZFn+TtO0lG3bJ0ql0p85jsPW1haFQoG2tjYkSWpF/Uwmw9raGu+//z7A977vX2+GrP93wSZiTdNOGIbxy3K5/DPHcfYXCoVe27Yzpmm2m6bppVKp/Orqqnv69OmoZVn/mEwm/9TzvP9x138NAMpJ4VFTBr6SAAAAAElFTkSuQmCC'
+ imageData: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAACXBIWXMAAC4jAAAuIwF4pT92AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACcJJREFUeNqMl9tvnNV6xn/f+s5z8DCeg88Zj+NYdhJH4KShFoJAIkzVphLVJnsDaiV6gUKaC2qQUFVATbnoValAakuQYKMqBKUUJCgI9XBBSmOROMqGoCStHbA9sWM7nrFn/I3n9B17kcwoabfarj9gvet53+d9nmdJAwMDAAgh8DyPtbU1XNfFMAwkScK2bTzPw/M8dF1/SAhxKAiCxxVF2aeqqqTr+q+Af+7o6Ch0d3f/69TU1KwkSRiGwbFjx3jmmWd47rnn+OGHH1BVFYX/5QRBkPQ87xeSJP22YRi/oapqStM0PM/D931kWSYIgnHf98cXFxepVqtomjZt2/Zf2bb990EQ4Pv+PXfeU1CSpGYhfN9/TgjxQTQaJQgCwuEwQRBQKpUwDAPTNPF9n0ajAYDv+8zPzzM+Pr6/Wq2eqdVqfxOJRA6Zpnn57hrivyEC0IQQZ4Mg+MAwDCKRCJIkUa/XEUIQi8XQNI1QKIQkSQghUBQFIQSmaTI7OwtAuVxOTE9Pfzc9Pf27lUqlBUgulUoUi0VKpRKqqg4EQfAfiqLsDIfDAC0E4XCYaDSKEALXdalUKvfM1/d9hBBYlkUul2N4eJi3335bcl33mW+++aaUz+cvSJKE8uKLL6JpGo7j8Omnn/7d+vp6sr+/HyEEjuMgyzKu6yJJEsViEVVV8TyPjY2NVisV5fZkTNMkkUhw8+ZN6vU6Kysr7Nmzh9OnT7/12GOPDS8sLByT7rQR4A9XV1d/+cILLzA9PU0kEmF4eBhFUTh//jyWZaHrOkII0uk0jUaDWq1GJpOhWCyysrLC1tYWnuehqir79+9H13W6urp48803+f7773n++ef/4G7S/H4ikUCSJNbX11trcuvWLcrlMrIs4zgODzzwABMTE/i+T7lcpq2tjUqlwubmJrZts7y8jBCCkZERGo0G2WyWkydPkkql6Onp+eMmwihwc3JyMvrWW2+RTCYBcF0XWZbRdZ3l5WX27NnD008/TSwWQ1VVyuVy63GhUIhEIkEqlcJxHCzLIhaLMTQ0xJkzZ7Btm3379lmS53kIIczZ2dnFsbGxRK1Wo729HQDP8zAMg5WVFXp7e5mcnKSzs5N8Po/rutTrdVzXbQmHrutEo1FM00RVVXp7e0kkEgRBwMWLF9F1vaxUq1UikUjtlVdeuV6pVBJ9fX3Ytn2bwrLMysoKXV1dTE5OkslksCwLTdMwDANVVdnY2CAIApLJJJFIBMdxiMfj7Nq1C1VViUajLQCvvvrqkhKJRJiZmfmdb7/99jeTySSyLLfWodFoEAqFOH78OLt37yaXy2GaJoqisLy8zNTUFFevXiUIAtrb29m5cyePPPJIa+cymQz1eh2A0dFRCoXCsgIwNTW1J5/P093dTbFYRJZlJEmiWq1y4MABxsbGqNVqhEIh6vU6QRBQLpcxDIPh4WE8z2NxcZFTp05x7tw5Xn755ZY6dXZ2tliZzWa/EwD1ev3RsbExxsfHSafTVCoVGo0Gqqqya9cuIpEIQgh832dtbY3FxUUA+vr62LZtG2NjYxw5coTDhw+ztLTEyZMnuXr1KoVC4R4d3bt375R84sQJEY/H/2Jubq7N9326urqwbZt6vY5pmhw5coS+vr4W9YvFIrdu3WJqagohBFeuXOHcuXOtue7evRtN01rtfO+991haWmJkZGQrkUi8JIC9iqL0BkFAIpFACMETTzxBV1cXiUSC7u5uHMfB8zyCIMA0TeLxONlsFlmW8X2fwcFBHMdhfn6eer1Oe3s7Dz30EBMTE1y6dImjR49y6tSppR07dqwrjuM8+OWXXzI0NMTly5e5du0aQ0NDTExMkMvlCIKAIAhaIh2LxQiHw0QiEfL5POl0mlqtRq1Wo6OjA8uykGWZdDrN0tISvb29vPPOOzz++OPk83lELpf7rXfffRfDMOjo6MBxHEqlEocOHWLHjh00Gg0kSULTNIS4bS6qqhKPxxkaGmJ4eJjR0VH279/PwMAA27dvJ5vN4vs+X331FR9//DGzs7OEQiE++eQTlPb29keuX7/OtWvXOH78ONVqlZs3b9LW1kYmk8F13dZeCiGQJAnXdRFCYBgGsiwjhMC2bQqFAkEQoOs6P/74Iw8++CCDg4Pous6xY8f47LPPkIIguDo2Nrbzxo0bfPjhh9i2zczMTHNvcF2XpsZalkWj0cB1Xe4o1O3YoCisra3x008/EY/H6erqAuDAgQNEIhGCIODQoUP/ubCwMCKAjx599FHW19f56KOP6OjooFgsks/niUajKIqCbds4joMQAiFESxxs226xd2Zmhng8Tl9fH67r0mg0sG2bbDZLpVIhl8vd5gHwtysrKy8Dcdd1mZubo6enh1gsRrVabZlrk6VND/R9n3q9TqVSQdd1QqEQi4uLnD9/nlKpxODgIHv37gXAcRyCICiFQiHEzp07i1988cUfKYpCIpHANE22b9/eUhNFUVotDIKghc7zPCzLolKpsLW1RVtbG0EQ4DgOmqbR09NDM1qUSiWAPwdQ7ujjmf7+/kQymfxrSZJQVZWtra2WG+i63iKH53m4rku1WqVcLmNZFu3t7S2x7+/vJ51O89prr7VYfenSpcPAP1UqFeSHH36YeDxOKpW6eP/9988Bv9d09nw+T7VapVKptJjZnE2tVmNtbY1cLke5XGZra4vNzU16enp49tlnGRgYaD7iTxqNxgexWIzDhw+jNEPQHV87NT8/f+PChQtnR0ZGqFarrUVuOsDds2u2b2FhgVQqRSQSYWFhgStXrtDf308ymcwBf3nw4EEOHjx4O5c2lURVVRzHYXp6+t8uX7785IULFz7LZDLous59991HOBy+h31N9xgdHSWTyVCtVhkaGmLfvn1MT08zPz/PzMzM6c8//9xr+uE9QViWZer1OhsbGxiG8fns7OzPc7ncx729vXR3d1OpVNi2bRuhUAhZljEMA9/3sW0bVVVZWlri4sWLjI+P8/rrr/P111/z5JNPXrIs69cn76ZeGoaBpmm0tbX9Q6FQeHhubu7fC4UCkUiE1dVVstks8Xgc0zSRZZlGo9ESAdM02djYoNFo8MYbb2BZ1mYoFOKuZPjr/xZBEHCHred83x/b3Nz8l/X19aRlWWxsbNDZ2cnw8DDhcBjf96lWq/T09HD06FGeeuopXnrpJc6ePUs6nb4hhPi/C959ZFn+TtO0lG3bJ0ql0p85jsPW1haFQoG2tjYkSWpF/Uwmw9raGu+//z7A977vX2+GrP93wSZiTdNOGIbxy3K5/DPHcfYXCoVe27Yzpmm2m6bppVKp/Orqqnv69OmoZVn/mEwm/9TzvP9x138NAMpJ4VFTBr6SAAAAAElFTkSuQmCC',
};
- socketGroups.cover.update({uid: adminUid}, data, function (err, data) {
+ socketGroups.cover.update({ uid: adminUid }, data, function (err, data) {
assert.ifError(err);
Groups.getGroupFields('Test', ['cover:url'], function (err, groupData) {
assert.ifError(err);
@@ -771,9 +1069,9 @@ describe('Groups', function () {
it('should update group cover position', function (done) {
var data = {
groupName: 'Test',
- position: '50% 50%'
+ position: '50% 50%',
};
- socketGroups.cover.update({uid: adminUid}, data, function (err) {
+ socketGroups.cover.update({ uid: adminUid }, data, function (err) {
assert.ifError(err);
Groups.getGroupFields('Test', ['cover:position'], function (err, groupData) {
assert.ifError(err);
@@ -793,7 +1091,7 @@ describe('Groups', function () {
it('should error if user is not owner of group', function (done) {
helpers.loginUser('regularuser', '123456', function (err, jar, io, csrf_token) {
assert.ifError(err);
- helpers.uploadFile(nconf.get('url') + '/api/groups/uploadpicture', logoPath, {params: JSON.stringify({groupName: 'Test'})}, jar, csrf_token, function (err, res, body) {
+ helpers.uploadFile(nconf.get('url') + '/api/groups/uploadpicture', logoPath, { params: JSON.stringify({ groupName: 'Test' }) }, jar, csrf_token, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 500);
assert.equal(body.error, '[[error:no-privileges]]');
@@ -805,7 +1103,7 @@ describe('Groups', function () {
it('should upload group cover with api route', function (done) {
helpers.loginUser('admin', '123456', function (err, jar, io, csrf_token) {
assert.ifError(err);
- helpers.uploadFile(nconf.get('url') + '/api/groups/uploadpicture', logoPath, {params: JSON.stringify({groupName: 'Test'})}, jar, csrf_token, function (err, res, body) {
+ helpers.uploadFile(nconf.get('url') + '/api/groups/uploadpicture', logoPath, { params: JSON.stringify({ groupName: 'Test' }) }, jar, csrf_token, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
Groups.getGroupFields('Test', ['cover:url'], function (err, groupData) {
@@ -817,15 +1115,22 @@ describe('Groups', function () {
});
});
+ it('should fail to remove cover if not logged in', function (done) {
+ socketGroups.cover.remove({ uid: 0 }, { groupName: 'Test' }, function (err) {
+ assert.equal(err.message, '[[error:no-privileges]]');
+ done();
+ });
+ });
+
it('should fail to remove cover if not owner', function (done) {
- socketGroups.cover.remove({uid: regularUid}, {groupName: 'Test'}, function (err) {
+ socketGroups.cover.remove({ uid: regularUid }, { groupName: 'Test' }, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should remove cover', function (done) {
- socketGroups.cover.remove({uid: adminUid}, {groupName: 'Test'}, function (err) {
+ socketGroups.cover.remove({ uid: adminUid }, { groupName: 'Test' }, function (err) {
assert.ifError(err);
Groups.getGroupFields('Test', ['cover:url'], function (err, groupData) {
assert.ifError(err);
diff --git a/test/helpers/index.js b/test/helpers/index.js
index a0624a69d6..30aab3c11f 100644
--- a/test/helpers/index.js
+++ b/test/helpers/index.js
@@ -14,7 +14,7 @@ helpers.loginUser = function (username, password, callback) {
request({
url: nconf.get('url') + '/api/config',
json: true,
- jar: jar
+ jar: jar,
}, function (err, res, body) {
if (err || res.statusCode !== 200) {
return callback(err || new Error('[[error:invalid-response]]'));
@@ -28,8 +28,8 @@ helpers.loginUser = function (username, password, callback) {
json: true,
jar: jar,
headers: {
- 'x-csrf-token': body.csrf_token
- }
+ 'x-csrf-token': body.csrf_token,
+ },
}, function (err, res) {
if (err || res.statusCode !== 200) {
return callback(err || new Error('[[error:invalid-response]]'));
@@ -46,7 +46,7 @@ helpers.loginUser = function (username, password, callback) {
var socketClient = require('socket.io-client');
- var io = socketClient.connect(nconf.get('url'), {forceNew: true, multiplex: false});
+ var io = socketClient.connect(nconf.get('url'), { forceNew: true, multiplex: false });
io.on('connect', function () {
callback(null, jar, io, body.csrf_token);
});
@@ -63,7 +63,7 @@ helpers.initSocketIO = function (callback) {
request.get({
url: nconf.get('url') + '/api/config',
jar: jar,
- json: true
+ json: true,
}, function (err, res, body) {
if (err) {
return callback(err);
@@ -79,7 +79,7 @@ helpers.initSocketIO = function (callback) {
};
};
- var io = require('socket.io-client')(nconf.get('url'), {forceNew: true});
+ var io = require('socket.io-client')(nconf.get('url'), { forceNew: true });
io.on('connect', function () {
callback(null, jar, io);
@@ -96,8 +96,8 @@ helpers.uploadFile = function (uploadEndPoint, filePath, body, jar, csrf_token,
var formData = {
files: [
fs.createReadStream(filePath),
- fs.createReadStream(filePath) // see https://github.com/request/request/issues/2445
- ]
+ fs.createReadStream(filePath), // see https://github.com/request/request/issues/2445
+ ],
};
formData = utils.merge(formData, body);
request.post({
@@ -106,8 +106,8 @@ helpers.uploadFile = function (uploadEndPoint, filePath, body, jar, csrf_token,
json: true,
jar: jar,
headers: {
- 'x-csrf-token': csrf_token
- }
+ 'x-csrf-token': csrf_token,
+ },
}, function (err, res, body) {
if (err) {
return callback(err);
@@ -121,7 +121,7 @@ helpers.registerUser = function (data, callback) {
request({
url: nconf.get('url') + '/api/config',
json: true,
- jar: jar
+ jar: jar,
}, function (err, response, body) {
if (err) {
return callback(err);
@@ -132,8 +132,8 @@ helpers.registerUser = function (data, callback) {
json: true,
jar: jar,
headers: {
- 'x-csrf-token': body.csrf_token
- }
+ 'x-csrf-token': body.csrf_token,
+ },
}, function (err, res, body) {
if (err) {
return callback(err);
@@ -144,20 +144,19 @@ helpers.registerUser = function (data, callback) {
});
};
-//http://stackoverflow.com/a/14387791/583363
+// http://stackoverflow.com/a/14387791/583363
helpers.copyFile = function (source, target, callback) {
-
var cbCalled = false;
var rd = fs.createReadStream(source);
- rd.on("error", function (err) {
+ rd.on('error', function (err) {
done(err);
});
var wr = fs.createWriteStream(target);
- wr.on("error", function (err) {
+ wr.on('error', function (err) {
done(err);
});
- wr.on("close", function () {
+ wr.on('close', function () {
done();
});
rd.pipe(wr);
@@ -168,4 +167,4 @@ helpers.copyFile = function (source, target, callback) {
cbCalled = true;
}
}
-};
\ No newline at end of file
+};
diff --git a/test/messaging.js b/test/messaging.js
index 12922f9e1d..4fbaad717f 100644
--- a/test/messaging.js
+++ b/test/messaging.js
@@ -25,7 +25,7 @@ describe('Messaging Library', function () {
async.series([
async.apply(User.create, { username: 'foo', password: 'barbar' }), // admin
async.apply(User.create, { username: 'baz', password: 'quuxquux' }), // restricted user
- async.apply(User.create, { username: 'herp', password: 'derpderp' }) // regular user
+ async.apply(User.create, { username: 'herp', password: 'derpderp' }), // regular user
], function (err, uids) {
if (err) {
return done(err);
@@ -37,7 +37,7 @@ describe('Messaging Library', function () {
async.parallel([
async.apply(Groups.join, 'administrators', fooUid),
- async.apply(User.setSetting, bazUid, 'restrictChat', '1')
+ async.apply(User.setSetting, bazUid, 'restrictChat', '1'),
], done);
});
});
@@ -80,7 +80,7 @@ describe('Messaging Library', function () {
describe('rooms', function () {
var socketModules = require('../src/socket.io/modules');
it('should create a new chat room', function (done) {
- socketModules.chats.newRoom({uid: fooUid}, {touid: bazUid}, function (err, _roomId) {
+ socketModules.chats.newRoom({ uid: fooUid }, { touid: bazUid }, function (err, _roomId) {
roomId = _roomId;
assert.ifError(err);
assert(roomId);
@@ -89,14 +89,14 @@ describe('Messaging Library', function () {
});
it('should add a user to room', function (done) {
- socketModules.chats.addUserToRoom({uid: fooUid}, {roomId: roomId, username: 'herp'}, function (err) {
+ socketModules.chats.addUserToRoom({ uid: fooUid }, { roomId: roomId, username: 'herp' }, function (err) {
assert.ifError(err);
done();
});
});
it('should leave the chat room', function (done) {
- socketModules.chats.leave({uid: bazUid}, roomId, function (err) {
+ socketModules.chats.leave({ uid: bazUid }, roomId, function (err) {
assert.ifError(err);
Messaging.isUserInRoom(bazUid, roomId, function (err, isUserInRoom) {
assert.ifError(err);
@@ -107,13 +107,13 @@ describe('Messaging Library', function () {
});
it('should send a message to a room', function (done) {
- socketModules.chats.send({uid: fooUid}, {roomId: roomId, message: 'first chat message'}, function (err, messageData) {
+ socketModules.chats.send({ uid: fooUid }, { roomId: roomId, message: 'first chat message' }, function (err, messageData) {
assert.ifError(err);
assert(messageData);
assert.equal(messageData.content, 'first chat message');
assert(messageData.fromUser);
assert(messageData.roomId, roomId);
- socketModules.chats.getRaw({uid: fooUid}, {roomId: roomId, mid: messageData.mid}, function (err, raw) {
+ socketModules.chats.getRaw({ uid: fooUid }, { roomId: roomId, mid: messageData.mid }, function (err, raw) {
assert.ifError(err);
assert.equal(raw, 'first chat message');
done();
@@ -126,7 +126,7 @@ describe('Messaging Library', function () {
db.sortedSetAdd('users:online', Date.now() - 350000, herpUid, function (err) {
assert.ifError(err);
- socketModules.chats.send({uid: fooUid}, {roomId: roomId, message: 'second chat message'}, function (err) {
+ socketModules.chats.send({ uid: fooUid }, { roomId: roomId, message: 'second chat message' }, function (err) {
assert.ifError(err);
setTimeout(function () {
User.notifications.get(herpUid, function (err, data) {
@@ -144,10 +144,10 @@ describe('Messaging Library', function () {
});
it('should get messages from room', function (done) {
- socketModules.chats.getMessages({uid: fooUid}, {
+ socketModules.chats.getMessages({ uid: fooUid }, {
uid: fooUid,
roomId: roomId,
- start: 0
+ start: 0,
}, function (err, messages) {
assert.ifError(err);
assert(Array.isArray(messages));
@@ -158,21 +158,21 @@ describe('Messaging Library', function () {
});
it('should mark room read', function (done) {
- socketModules.chats.markRead({uid: fooUid}, roomId, function (err) {
+ socketModules.chats.markRead({ uid: fooUid }, roomId, function (err) {
assert.ifError(err);
done();
});
});
it('should mark all rooms read', function (done) {
- socketModules.chats.markAllRead({uid: fooUid}, {}, function (err) {
+ socketModules.chats.markAllRead({ uid: fooUid }, {}, function (err) {
assert.ifError(err);
done();
});
});
it('should rename room', function (done) {
- socketModules.chats.renameRoom({uid: fooUid}, {roomId: roomId, newName: 'new room name'}, function (err) {
+ socketModules.chats.renameRoom({ uid: fooUid }, { roomId: roomId, newName: 'new room name' }, function (err) {
assert.ifError(err);
done();
@@ -180,7 +180,7 @@ describe('Messaging Library', function () {
});
it('should load chat room', function (done) {
- socketModules.chats.loadRoom({uid: fooUid}, {roomId: roomId}, function (err, data) {
+ socketModules.chats.loadRoom({ uid: fooUid }, { roomId: roomId }, function (err, data) {
assert.ifError(err);
assert(data);
assert.equal(data.roomName, 'new room name');
@@ -193,7 +193,7 @@ describe('Messaging Library', function () {
var socketModules = require('../src/socket.io/modules');
var mid;
before(function (done) {
- socketModules.chats.send({uid: fooUid}, {roomId: roomId, message: 'first chat message'}, function (err, messageData) {
+ socketModules.chats.send({ uid: fooUid }, { roomId: roomId, message: 'first chat message' }, function (err, messageData) {
assert.ifError(err);
mid = messageData.mid;
done();
@@ -201,9 +201,9 @@ describe('Messaging Library', function () {
});
it('should edit message', function (done) {
- socketModules.chats.edit({uid: fooUid}, {mid: mid, roomId: roomId, message: 'message edited'}, function (err) {
+ socketModules.chats.edit({ uid: fooUid }, { mid: mid, roomId: roomId, message: 'message edited' }, function (err) {
assert.ifError(err);
- socketModules.chats.getRaw({uid: fooUid}, {roomId: roomId, mid: mid}, function (err, raw) {
+ socketModules.chats.getRaw({ uid: fooUid }, { roomId: roomId, mid: mid }, function (err, raw) {
assert.ifError(err);
assert.equal(raw, 'message edited');
done();
@@ -212,7 +212,7 @@ describe('Messaging Library', function () {
});
it('should delete message', function (done) {
- socketModules.chats.delete({uid: fooUid}, {messageId: mid, roomId: roomId}, function (err) {
+ socketModules.chats.delete({ uid: fooUid }, { messageId: mid, roomId: roomId }, function (err) {
assert.ifError(err);
db.exists('message:' + mid, function (err, exists) {
assert.ifError(err);
@@ -249,7 +249,6 @@ describe('Messaging Library', function () {
done();
});
});
-
});
describe('logged in chat controller', function () {
@@ -263,7 +262,7 @@ describe('Messaging Library', function () {
});
it('should return chats page data', function (done) {
- request(nconf.get('url') + '/api/user/herp/chats', {json: true, jar: jar}, function (err, response, body) {
+ request(nconf.get('url') + '/api/user/herp/chats', { json: true, jar: jar }, function (err, response, body) {
assert.ifError(err);
assert.equal(response.statusCode, 200);
assert(Array.isArray(body.rooms));
@@ -274,7 +273,7 @@ describe('Messaging Library', function () {
});
it('should return room data', function (done) {
- request(nconf.get('url') + '/api/user/herp/chats/' + roomId, {json: true, jar: jar}, function (err, response, body) {
+ request(nconf.get('url') + '/api/user/herp/chats/' + roomId, { json: true, jar: jar }, function (err, response, body) {
assert.ifError(err);
assert.equal(response.statusCode, 200);
assert.equal(body.roomId, roomId);
@@ -284,7 +283,7 @@ describe('Messaging Library', function () {
});
it('should redirect to chats page', function (done) {
- request(nconf.get('url') + '/api/chats', {jar: jar}, function (err, response, body) {
+ request(nconf.get('url') + '/api/chats', { jar: jar }, function (err, response, body) {
assert.ifError(err);
assert.equal(body, '"/user/herp/chats"');
assert.equal(response.statusCode, 308);
@@ -295,7 +294,7 @@ describe('Messaging Library', function () {
it('should return 404 if user is not in room', function (done) {
helpers.loginUser('baz', 'quuxquux', function (err, jar) {
assert.ifError(err);
- request(nconf.get('url') + '/api/user/baz/chats/' + roomId, {json: true, jar: jar}, function (err, response, body) {
+ request(nconf.get('url') + '/api/user/baz/chats/' + roomId, { json: true, jar: jar }, function (err, response, body) {
assert.ifError(err);
assert.equal(response.statusCode, 404);
done();
diff --git a/test/meta.js b/test/meta.js
index 6f27de6a8e..9d1a69b00c 100644
--- a/test/meta.js
+++ b/test/meta.js
@@ -19,7 +19,7 @@ describe('meta', function () {
async.series([
async.apply(User.create, { username: 'foo', password: 'barbar' }), // admin
async.apply(User.create, { username: 'baz', password: 'quuxquux' }), // restricted user
- async.apply(User.create, { username: 'herp', password: 'derpderp' }) // regular user
+ async.apply(User.create, { username: 'herp', password: 'derpderp' }), // regular user
], function (err, uids) {
if (err) {
return done(err);
@@ -36,7 +36,7 @@ describe('meta', function () {
describe('settings', function () {
var socketAdmin = require('../src/socket.io/admin');
it('it should set setting', function (done) {
- socketAdmin.settings.set({uid: fooUid}, {hash: 'some:hash', values: {foo: '1', derp: 'value'}}, function (err) {
+ socketAdmin.settings.set({ uid: fooUid }, { hash: 'some:hash', values: { foo: '1', derp: 'value' } }, function (err) {
assert.ifError(err);
db.getObject('settings:some:hash', function (err, data) {
assert.ifError(err);
@@ -48,7 +48,7 @@ describe('meta', function () {
});
it('it should get setting', function (done) {
- socketAdmin.settings.get({uid: fooUid}, {hash: 'some:hash'}, function (err, data) {
+ socketAdmin.settings.get({ uid: fooUid }, { hash: 'some:hash' }, function (err, data) {
assert.ifError(err);
assert.equal(data.foo, '1');
assert.equal(data.derp, 'value');
@@ -57,7 +57,7 @@ describe('meta', function () {
});
it('should not set setting if not empty', function (done) {
- meta.settings.setOnEmpty('some:hash', {foo: 2}, function (err) {
+ meta.settings.setOnEmpty('some:hash', { foo: 2 }, function (err) {
assert.ifError(err);
db.getObject('settings:some:hash', function (err, data) {
assert.ifError(err);
@@ -69,7 +69,7 @@ describe('meta', function () {
});
it('should set setting if empty', function (done) {
- meta.settings.setOnEmpty('some:hash', {empty: '2'}, function (err) {
+ meta.settings.setOnEmpty('some:hash', { empty: '2' }, function (err) {
assert.ifError(err);
db.getObject('settings:some:hash', function (err, data) {
assert.ifError(err);
@@ -91,14 +91,13 @@ describe('meta', function () {
});
});
});
-
});
describe('config', function () {
var socketAdmin = require('../src/socket.io/admin');
before(function (done) {
- db.setObject('config', {minimumTagLength: 3, maximumTagLength: 15}, done);
+ db.setObject('config', { minimumTagLength: 3, maximumTagLength: 15 }, done);
});
it('should get config fields', function (done) {
@@ -118,7 +117,7 @@ describe('meta', function () {
});
it('should fail if data is invalid', function (done) {
- socketAdmin.config.set({uid: fooUid}, null, function (err) {
+ socketAdmin.config.set({ uid: fooUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -136,17 +135,17 @@ describe('meta', function () {
});
it('should fail if data is invalid', function (done) {
- socketAdmin.config.setMultiple({uid: fooUid}, null, function (err) {
+ socketAdmin.config.setMultiple({ uid: fooUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
- it('should set multiple values', function (done ) {
- socketAdmin.config.setMultiple({uid: fooUid}, {
+ it('should set multiple values', function (done) {
+ socketAdmin.config.setMultiple({ uid: fooUid }, {
someField1: 'someValue1',
someField2: 'someValue2',
- customCSS: '.derp{color:#00ff00;}'
+ customCSS: '.derp{color:#00ff00;}',
}, function (err) {
assert.ifError(err);
meta.configs.getFields(['someField1', 'someField2'], function (err, data) {
@@ -159,7 +158,7 @@ describe('meta', function () {
});
it('should not set config if not empty', function (done) {
- meta.configs.setOnEmpty({someField1: 'foo'}, function (err) {
+ meta.configs.setOnEmpty({ someField1: 'foo' }, function (err) {
assert.ifError(err);
db.getObjectField('config', 'someField1', function (err, value) {
assert.ifError(err);
@@ -170,7 +169,7 @@ describe('meta', function () {
});
it('should remove config field', function (done) {
- socketAdmin.config.remove({uid: fooUid}, 'someField1', function (err) {
+ socketAdmin.config.remove({ uid: fooUid }, 'someField1', function (err) {
assert.ifError(err);
db.isObjectField('config', 'someField1', function (err, isObjectField) {
assert.ifError(err);
@@ -179,11 +178,9 @@ describe('meta', function () {
});
});
});
-
});
-
after(function (done) {
db.emptydb(done);
});
diff --git a/test/mocks/databasemock.js b/test/mocks/databasemock.js
index db28b8025c..412a255dc6 100644
--- a/test/mocks/databasemock.js
+++ b/test/mocks/databasemock.js
@@ -1,15 +1,14 @@
+'use strict';
+
/**
* Database Mock - wrapper for database.js, makes system use separate test db, instead of production
* ATTENTION: testing db is flushed before every use!
*/
(function (module) {
- 'use strict';
- /*global require, before, __dirname*/
-
var async = require('async');
var winston = require('winston');
- var path = require('path');
+ var path = require('path');
var nconf = require('nconf');
var url = require('url');
var errorText;
@@ -17,11 +16,11 @@
nconf.file({ file: path.join(__dirname, '../../config.json') });
nconf.defaults({
- base_dir: path.join(__dirname,'../..'),
+ base_dir: path.join(__dirname, '../..'),
themes_path: path.join(__dirname, '../../node_modules'),
upload_path: 'public/uploads',
views_dir: path.join(__dirname, '../../build/public/templates'),
- relative_path: ''
+ relative_path: '',
});
if (!nconf.get('isCluster')) {
@@ -39,27 +38,27 @@
'\n===========================================================\n' +
'Please, add parameters for test database in config.json\n' +
'For example (redis):\n' +
- '"test_database": {' + '\n' +
- ' "host": "127.0.0.1",' + '\n' +
- ' "port": "6379",' + '\n' +
- ' "password": "",' + '\n' +
- ' "database": "1"' + '\n' +
+ '"test_database": {\n' +
+ ' "host": "127.0.0.1",\n' +
+ ' "port": "6379",\n' +
+ ' "password": "",\n' +
+ ' "database": "1"\n' +
'}\n' +
' or (mongo):\n' +
- '"test_database": {' + '\n' +
- ' "host": "127.0.0.1",' + '\n' +
- ' "port": "27017",' + '\n' +
- ' "password": "",' + '\n' +
- ' "database": "1"' + '\n' +
+ '"test_database": {\n' +
+ ' "host": "127.0.0.1",\n' +
+ ' "port": "27017",\n' +
+ ' "password": "",\n' +
+ ' "database": "1\n' +
+ '}\n' +
+ ' or (mongo) in a replicaset\n' +
+ '"test_database": {\n' +
+ ' "host": "127.0.0.1,127.0.0.1,127.0.0.1",\n' +
+ ' "port": "27017,27018,27019",\n' +
+ ' "username": "",\n' +
+ ' "password": "",\n' +
+ ' "database": "nodebb_test"\n' +
'}\n' +
- ' or (mongo) in a replicaset' + '\n' +
- '"test_database": {' + '\n' +
- ' "host": "127.0.0.1,127.0.0.1,127.0.0.1",' + '\n' +
- ' "port": "27017,27018,27019",' + '\n' +
- ' "username": "",' + '\n' +
- ' "password": "",' + '\n' +
- ' "database": "nodebb_test"' + '\n' +
- '}\n' +
'==========================================================='
);
winston.error(errorText);
@@ -116,7 +115,7 @@
function (next) {
meta.themes.set({
type: 'local',
- id: 'nodebb-theme-persona'
+ id: 'nodebb-theme-persona',
}, next);
},
function (next) {
@@ -151,7 +150,7 @@
require('../../src/user').startJobs();
webserver.listen(next);
- }
+ },
], done);
});
@@ -167,7 +166,7 @@
winston.info('Enabling default plugins\n');
var defaultEnabled = [
- 'nodebb-plugin-dbsearch'
+ 'nodebb-plugin-dbsearch',
];
winston.info('[install/enableDefaultPlugins] activating default plugins', defaultEnabled);
@@ -176,5 +175,4 @@
}
module.exports = db;
-
}(module));
diff --git a/test/mocks/newXhr.js b/test/mocks/newXhr.js
index a523d77617..5631b68cae 100644
--- a/test/mocks/newXhr.js
+++ b/test/mocks/newXhr.js
@@ -1,3 +1,5 @@
+'use strict';
+
// see https://gist.github.com/jfromaniello/4087861#gistcomment-1447029
// XMLHttpRequest to override.
@@ -35,7 +37,7 @@ var callbacks = {};
var newXhr = function () {
stdXhr.apply(this, arguments);
for (var method in callbacks) {
- if (typeof callbacks[method] == "function") {
+ if (typeof callbacks[method] === 'function') {
callbacks[method].apply(this, arguments);
}
}
@@ -45,4 +47,4 @@ newXhr.XMLHttpRequest = newXhr;
cachedXhr.exports = newXhr;
module.exports = newXhr;
-module.exports.callbacks = callbacks;
\ No newline at end of file
+module.exports.callbacks = callbacks;
diff --git a/test/notifications.js b/test/notifications.js
index c36c8008e4..f21d46cf32 100644
--- a/test/notifications.js
+++ b/test/notifications.js
@@ -1,5 +1,4 @@
'use strict';
-/*global require, after, before*/
var assert = require('assert');
@@ -15,7 +14,7 @@ describe('Notifications', function () {
var notification;
before(function (done) {
- user.create({username: 'poster'}, function (err, _uid) {
+ user.create({ username: 'poster' }, function (err, _uid) {
if (err) {
return done(err);
}
@@ -29,7 +28,7 @@ describe('Notifications', function () {
notifications.create({
bodyShort: 'bodyShort',
nid: 'notification_id',
- path: '/notification/path'
+ path: '/notification/path',
}, function (err, _notification) {
notification = _notification;
assert.ifError(err);
@@ -96,7 +95,7 @@ describe('Notifications', function () {
});
it('should mark a notification read', function (done) {
- socketNotifications.markRead({uid: uid}, notification.nid, function (err) {
+ socketNotifications.markRead({ uid: uid }, notification.nid, function (err) {
assert.ifError(err);
db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) {
assert.ifError(err);
@@ -111,7 +110,7 @@ describe('Notifications', function () {
});
it('should mark a notification unread', function (done) {
- socketNotifications.markUnread({uid: uid}, notification.nid, function (err) {
+ socketNotifications.markUnread({ uid: uid }, notification.nid, function (err) {
assert.ifError(err);
db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) {
assert.ifError(err);
@@ -119,7 +118,7 @@ describe('Notifications', function () {
db.isSortedSetMember('uid:' + uid + ':notifications:read', notification.nid, function (err, isMember) {
assert.ifError(err);
assert.equal(isMember, false);
- socketNotifications.getCount({uid: uid}, null, function (err, count) {
+ socketNotifications.getCount({ uid: uid }, null, function (err, count) {
assert.ifError(err);
assert.equal(count, 1);
done();
@@ -130,7 +129,7 @@ describe('Notifications', function () {
});
it('should mark all notifications read', function (done) {
- socketNotifications.markAllRead({uid: uid}, null, function (err) {
+ socketNotifications.markAllRead({ uid: uid }, null, function (err) {
assert.ifError(err);
db.isSortedSetMember('uid:' + uid + ':notifications:unread', notification.nid, function (err, isMember) {
assert.ifError(err);
@@ -155,14 +154,14 @@ describe('Notifications', function () {
async.waterfall([
function (next) {
- user.create({username: 'watcher'}, next);
+ user.create({ username: 'watcher' }, next);
},
function (_watcherUid, next) {
watcherUid = _watcherUid;
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, next);
},
function (category, next) {
@@ -172,7 +171,7 @@ describe('Notifications', function () {
uid: watcherUid,
cid: cid,
title: 'Test Topic Title',
- content: 'The content of test topic'
+ content: 'The content of test topic',
}, next);
},
function (topic, next) {
@@ -184,7 +183,7 @@ describe('Notifications', function () {
topics.reply({
uid: uid,
content: 'This is the first reply.',
- tid: tid
+ tid: tid,
}, next);
},
function (post, next) {
@@ -193,7 +192,7 @@ describe('Notifications', function () {
topics.reply({
uid: uid,
content: 'This is the second reply.',
- tid: tid
+ tid: tid,
}, next);
},
function (post, next) {
@@ -207,7 +206,7 @@ describe('Notifications', function () {
assert.equal(notifications.unread.length, 1, 'there should be 1 unread notification');
assert.equal('/post/' + pid, notifications.unread[0].path, 'the notification should link to the first unread post');
next();
- }
+ },
], function (err) {
assert.ifError(err);
done();
@@ -215,7 +214,7 @@ describe('Notifications', function () {
});
it('should get notification by nid', function (done) {
- socketNotifications.get({uid: uid}, {nids: [notification.nid]}, function (err, data) {
+ socketNotifications.get({ uid: uid }, { nids: [notification.nid] }, function (err, data) {
assert.ifError(err);
assert.equal(data[0].bodyShort, 'bodyShort');
assert.equal(data[0].nid, 'notification_id');
@@ -225,7 +224,7 @@ describe('Notifications', function () {
});
it('should get user\'s notifications', function (done) {
- socketNotifications.get({uid: uid}, {}, function (err, data) {
+ socketNotifications.get({ uid: uid }, {}, function (err, data) {
assert.ifError(err);
assert.equal(data.unread.length, 0);
assert.equal(data.read[0].nid, 'notification_id');
@@ -234,21 +233,21 @@ describe('Notifications', function () {
});
it('should error with invalid data', function (done) {
- socketNotifications.loadMore({uid: uid}, {after: 'test'}, function (err) {
+ socketNotifications.loadMore({ uid: uid }, { after: 'test' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error if not logged in', function (done) {
- socketNotifications.loadMore({uid: 0}, {after: 10}, function (err) {
+ socketNotifications.loadMore({ uid: 0 }, { after: 10 }, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should load more notifications', function (done) {
- socketNotifications.loadMore({uid: uid}, {after: 0}, function (err, data) {
+ socketNotifications.loadMore({ uid: uid }, { after: 0 }, function (err, data) {
assert.ifError(err);
assert.equal(data.notifications[0].bodyShort, 'bodyShort');
assert.equal(data.notifications[0].nid, 'notification_id');
@@ -259,16 +258,16 @@ describe('Notifications', function () {
it('should error if not logged in', function (done) {
- socketNotifications.deleteAll({uid: 0}, null, function (err) {
+ socketNotifications.deleteAll({ uid: 0 }, null, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should delete all user notifications', function (done) {
- socketNotifications.deleteAll({uid: uid}, null, function (err) {
+ socketNotifications.deleteAll({ uid: uid }, null, function (err) {
assert.ifError(err);
- socketNotifications.get({uid: uid}, {}, function (err, data) {
+ socketNotifications.get({ uid: uid }, {}, function (err, data) {
assert.ifError(err);
assert.equal(data.unread.length, 0);
assert.equal(data.read.length, 0);
diff --git a/test/pagination.js b/test/pagination.js
index b3c50e57f2..30f79a718e 100644
--- a/test/pagination.js
+++ b/test/pagination.js
@@ -1,11 +1,10 @@
'use strict';
-/*global require*/
+
var assert = require('assert');
var pagination = require('../src/pagination');
describe('Pagination', function () {
-
it('should create empty pagination for 1 page', function (done) {
var data = pagination.create(1, 1);
assert.equal(data.pages.length, 0);
@@ -28,7 +27,7 @@ describe('Pagination', function () {
});
it('should create pagination for 3 pages with query params', function (done) {
- var data = pagination.create(1, 3, {key: 'value'});
+ var data = pagination.create(1, 3, { key: 'value' });
assert.equal(data.pages.length, 3);
assert.equal(data.rel.length, 1);
assert.equal(data.pageCount, 3);
diff --git a/test/plugins.js b/test/plugins.js
index 09537d8990..97a9c1908b 100644
--- a/test/plugins.js
+++ b/test/plugins.js
@@ -1,5 +1,5 @@
'use strict';
-/*global require*/
+
var assert = require('assert');
var path = require('path');
@@ -10,7 +10,6 @@ var db = require('./mocks/databasemock');
var plugins = require('../src/plugins');
describe('Plugins', function () {
-
it('should load plugin data', function (done) {
var pluginId = 'nodebb-plugin-markdown';
plugins.loadPlugin(path.join(nconf.get('base_dir'), 'node_modules/' + pluginId), function (err) {
@@ -30,7 +29,7 @@ describe('Plugins', function () {
it('should register and fire a filter hook', function (done) {
function filterMethod1(data, callback) {
- data.foo ++;
+ data.foo += 1;
callback(null, data);
}
function filterMethod2(data, callback) {
@@ -38,15 +37,14 @@ describe('Plugins', function () {
callback(null, data);
}
- plugins.registerHook('test-plugin', {hook: 'filter:test.hook', method: filterMethod1});
- plugins.registerHook('test-plugin', {hook: 'filter:test.hook', method: filterMethod2});
+ plugins.registerHook('test-plugin', { hook: 'filter:test.hook', method: filterMethod1 });
+ plugins.registerHook('test-plugin', { hook: 'filter:test.hook', method: filterMethod2 });
- plugins.fireHook('filter:test.hook', {foo: 1}, function (err, data) {
+ plugins.fireHook('filter:test.hook', { foo: 1 }, function (err, data) {
assert.ifError(err);
assert.equal(data.foo, 7);
done();
});
-
});
it('should register and fire an action hook', function (done) {
@@ -55,8 +53,8 @@ describe('Plugins', function () {
done();
}
- plugins.registerHook('test-plugin', {hook: 'action:test.hook', method: actionMethod});
- plugins.fireHook('action:test.hook', {bar: 'test'});
+ plugins.registerHook('test-plugin', { hook: 'action:test.hook', method: actionMethod });
+ plugins.fireHook('action:test.hook', { bar: 'test' });
});
it('should register and fire a static hook', function (done) {
@@ -65,8 +63,8 @@ describe('Plugins', function () {
callback();
}
- plugins.registerHook('test-plugin', {hook: 'static:test.hook', method: actionMethod});
- plugins.fireHook('static:test.hook', {bar: 'test'}, function (err) {
+ plugins.registerHook('test-plugin', { hook: 'static:test.hook', method: actionMethod });
+ plugins.fireHook('static:test.hook', { bar: 'test' }, function (err) {
assert.ifError(err);
done();
});
@@ -179,8 +177,5 @@ describe('Plugins', function () {
});
});
});
-
-
-
});
diff --git a/test/posts.js b/test/posts.js
index dda72be14e..39c66701eb 100644
--- a/test/posts.js
+++ b/test/posts.js
@@ -1,5 +1,5 @@
'use strict';
-/*global require, before, after*/
+
var assert = require('assert');
var async = require('async');
@@ -24,20 +24,20 @@ describe('Post\'s', function () {
groups.resetCache();
async.series({
voterUid: function (next) {
- user.create({username: 'upvoter'}, next);
+ user.create({ username: 'upvoter' }, next);
},
voteeUid: function (next) {
- user.create({username: 'upvotee'}, next);
+ user.create({ username: 'upvotee' }, next);
},
globalModUid: function (next) {
- user.create({username: 'globalmod'}, next);
+ user.create({ username: 'globalmod' }, next);
},
category: function (next) {
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, next);
- }
+ },
}, function (err, results) {
if (err) {
return done(err);
@@ -52,7 +52,7 @@ describe('Post\'s', function () {
uid: results.voteeUid,
cid: results.category.cid,
title: 'Test Topic Title',
- content: 'The content of test topic'
+ content: 'The content of test topic',
}, function (err, data) {
if (err) {
return done(err);
@@ -68,7 +68,7 @@ describe('Post\'s', function () {
describe('voting', function () {
var socketPosts = require('../src/socket.io/posts');
it('should upvote a post', function (done) {
- socketPosts.upvote({uid: voterUid}, {pid: postData.pid, room_id: 'topic_1'}, function (err, result) {
+ socketPosts.upvote({ uid: voterUid }, { pid: postData.pid, room_id: 'topic_1' }, function (err, result) {
assert.ifError(err);
assert.equal(result.post.upvotes, 1);
assert.equal(result.post.downvotes, 0);
@@ -84,7 +84,7 @@ describe('Post\'s', function () {
});
it('should get voters', function (done) {
- socketPosts.getVoters({uid: globalModUid}, {pid: postData.pid, cid: cid}, function (err, data) {
+ socketPosts.getVoters({ uid: globalModUid }, { pid: postData.pid, cid: cid }, function (err, data) {
assert.ifError(err);
assert.equal(data.upvoteCount, 1);
assert.equal(data.downvoteCount, 0);
@@ -95,7 +95,7 @@ describe('Post\'s', function () {
});
it('should get upvoters', function (done) {
- socketPosts.getUpvoters({uid: globalModUid}, [postData.pid], function (err, data) {
+ socketPosts.getUpvoters({ uid: globalModUid }, [postData.pid], function (err, data) {
assert.ifError(err);
assert.equal(data[0].otherCount, 0);
assert.equal(data[0].usernames, 'upvoter');
@@ -104,7 +104,7 @@ describe('Post\'s', function () {
});
it('should unvote a post', function (done) {
- socketPosts.unvote({uid: voterUid}, {pid: postData.pid, room_id: 'topic_1'}, function (err, result) {
+ socketPosts.unvote({ uid: voterUid }, { pid: postData.pid, room_id: 'topic_1' }, function (err, result) {
assert.ifError(err);
assert.equal(result.post.upvotes, 0);
assert.equal(result.post.downvotes, 0);
@@ -120,7 +120,7 @@ describe('Post\'s', function () {
});
it('should downvote a post', function (done) {
- socketPosts.downvote({uid: voterUid}, {pid: postData.pid, room_id: 'topic_1'}, function (err, result) {
+ socketPosts.downvote({ uid: voterUid }, { pid: postData.pid, room_id: 'topic_1' }, function (err, result) {
assert.ifError(err);
assert.equal(result.post.upvotes, 0);
assert.equal(result.post.downvotes, 1);
@@ -166,14 +166,14 @@ describe('Post\'s', function () {
var socketPosts = require('../src/socket.io/posts');
it('should error if data is invalid', function (done) {
- socketPosts.loadPostTools({uid: globalModUid}, null, function (err) {
+ socketPosts.loadPostTools({ uid: globalModUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should load post tools', function (done) {
- socketPosts.loadPostTools({uid: globalModUid}, {pid: postData.pid, cid: cid}, function (err, data) {
+ socketPosts.loadPostTools({ uid: globalModUid }, { pid: postData.pid, cid: cid }, function (err, data) {
assert.ifError(err);
assert(data.posts.display_edit_tools);
assert(data.posts.display_delete_tools);
@@ -190,14 +190,14 @@ describe('Post\'s', function () {
uid: voterUid,
cid: cid,
title: 'topic to delete/restore/purge',
- content: 'A post to delete/restore/purge'
+ content: 'A post to delete/restore/purge',
}, function (err, topicPostData) {
assert.ifError(err);
topics.reply({
uid: voterUid,
tid: topicPostData.topicData.tid,
timestamp: Date.now(),
- content: 'A post to delete/restore and purge'
+ content: 'A post to delete/restore and purge',
}, function (err, replyData) {
assert.ifError(err);
callback(topicPostData, replyData);
@@ -220,14 +220,14 @@ describe('Post\'s', function () {
});
it('should error with invalid data', function (done) {
- socketPosts.delete({uid: voterUid}, null, function (err) {
+ socketPosts.delete({ uid: voterUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should delete a post', function (done) {
- socketPosts.delete({uid: voterUid}, {pid: replyPid, tid: tid}, function (err) {
+ socketPosts.delete({ uid: voterUid }, { pid: replyPid, tid: tid }, function (err) {
assert.ifError(err);
posts.getPostField(replyPid, 'deleted', function (err, isDeleted) {
assert.ifError(err);
@@ -238,7 +238,7 @@ describe('Post\'s', function () {
});
it('should restore a post', function (done) {
- socketPosts.restore({uid: voterUid}, {pid: replyPid, tid: tid}, function (err) {
+ socketPosts.restore({ uid: voterUid }, { pid: replyPid, tid: tid }, function (err) {
assert.ifError(err);
posts.getPostField(replyPid, 'deleted', function (err, isDeleted) {
assert.ifError(err);
@@ -249,7 +249,7 @@ describe('Post\'s', function () {
});
it('should delete posts', function (done) {
- socketPosts.deletePosts({uid: globalModUid}, {pids: [replyPid, mainPid], tid: tid}, function (err) {
+ socketPosts.deletePosts({ uid: globalModUid }, { pids: [replyPid, mainPid], tid: tid }, function (err) {
assert.ifError(err);
posts.getPostField(replyPid, 'deleted', function (err, deleted) {
assert.ifError(err);
@@ -264,9 +264,9 @@ describe('Post\'s', function () {
});
it('should delete topic if last main post is deleted', function (done) {
- topics.post({uid: voterUid, cid: cid, title: 'test topic', content: 'test topic'}, function (err, data) {
+ topics.post({ uid: voterUid, cid: cid, title: 'test topic', content: 'test topic' }, function (err, data) {
assert.ifError(err);
- socketPosts.deletePosts({uid: globalModUid}, {pids: [data.postData.pid], tid: data.topicData.tid}, function (err) {
+ socketPosts.deletePosts({ uid: globalModUid }, { pids: [data.postData.pid], tid: data.topicData.tid }, function (err) {
assert.ifError(err);
topics.getTopicField(data.topicData.tid, 'deleted', function (err, deleted) {
assert.ifError(err);
@@ -278,9 +278,8 @@ describe('Post\'s', function () {
});
it('should purge posts and delete topic', function (done) {
-
createTopicWithReply(function (topicPostData, replyData) {
- socketPosts.purgePosts({uid: voterUid}, {pids: [replyData.pid, topicPostData.postData.pid], tid: topicPostData.topicData.tid}, function (err) {
+ socketPosts.purgePosts({ uid: voterUid }, { pids: [replyData.pid, topicPostData.postData.pid], tid: topicPostData.topicData.tid }, function (err) {
assert.ifError(err);
posts.exists('post:' + replyData.pid, function (err, exists) {
assert.ifError(err);
@@ -307,7 +306,7 @@ describe('Post\'s', function () {
uid: voterUid,
cid: cid,
title: 'topic to edit',
- content: 'A post to edit'
+ content: 'A post to edit',
}, function (err, data) {
assert.ifError(err);
pid = data.postData.pid;
@@ -316,7 +315,7 @@ describe('Post\'s', function () {
uid: voterUid,
tid: tid,
timestamp: Date.now(),
- content: 'A reply to edit'
+ content: 'A reply to edit',
}, function (err, data) {
assert.ifError(err);
replyPid = data.pid;
@@ -326,21 +325,21 @@ describe('Post\'s', function () {
});
it('should error if user is not logged in', function (done) {
- socketPosts.edit({uid: 0}, {}, function (err) {
+ socketPosts.edit({ uid: 0 }, {}, function (err) {
assert.equal(err.message, '[[error:not-logged-in]]');
done();
});
});
it('should error if data is invalid or missing', function (done) {
- socketPosts.edit({uid: voterUid}, {}, function (err) {
+ socketPosts.edit({ uid: voterUid }, {}, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error if title is too short', function (done) {
- socketPosts.edit({uid: voterUid}, {pid: pid, content: 'edited post content', title: 'a'}, function (err) {
+ socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', title: 'a' }, function (err) {
assert.equal(err.message, '[[error:title-too-short, ' + meta.config.minimumTitleLength + ']]');
done();
});
@@ -348,7 +347,7 @@ describe('Post\'s', function () {
it('should error if title is too long', function (done) {
var longTitle = new Array(parseInt(meta.config.maximumTitleLength, 10) + 2).join('a');
- socketPosts.edit({uid: voterUid}, {pid: pid, content: 'edited post content', title: longTitle}, function (err) {
+ socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', title: longTitle }, function (err) {
assert.equal(err.message, '[[error:title-too-long, ' + meta.config.maximumTitleLength + ']]');
done();
});
@@ -357,7 +356,7 @@ describe('Post\'s', function () {
it('should error with too few tags', function (done) {
var oldValue = meta.config.minimumTagsPerTopic;
meta.config.minimumTagsPerTopic = 1;
- socketPosts.edit({uid: voterUid}, {pid: pid, content: 'edited post content', tags: []}, function (err) {
+ socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', tags: [] }, function (err) {
assert.equal(err.message, '[[error:not-enough-tags, ' + meta.config.minimumTagsPerTopic + ']]');
meta.config.minimumTagsPerTopic = oldValue;
done();
@@ -366,17 +365,17 @@ describe('Post\'s', function () {
it('should error with too many tags', function (done) {
var tags = [];
- for(var i = 0; i < meta.config.maximumTagsPerTopic + 1; ++i) {
+ for (var i = 0; i < meta.config.maximumTagsPerTopic + 1; i += 1) {
tags.push('tag' + i);
}
- socketPosts.edit({uid: voterUid}, {pid: pid, content: 'edited post content', tags: tags}, function (err) {
+ socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', tags: tags }, function (err) {
assert.equal(err.message, '[[error:too-many-tags, ' + meta.config.maximumTagsPerTopic + ']]');
done();
});
});
it('should error if content is too short', function (done) {
- socketPosts.edit({uid: voterUid}, {pid: pid, content: 'e'}, function (err) {
+ socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'e' }, function (err) {
assert.equal(err.message, '[[error:content-too-short, ' + meta.config.minimumPostLength + ']]');
done();
});
@@ -384,14 +383,14 @@ describe('Post\'s', function () {
it('should error if content is too long', function (done) {
var longContent = new Array(parseInt(meta.config.maximumPostLength, 10) + 2).join('a');
- socketPosts.edit({uid: voterUid}, {pid: pid, content: longContent}, function (err) {
+ socketPosts.edit({ uid: voterUid }, { pid: pid, content: longContent }, function (err) {
assert.equal(err.message, '[[error:content-too-long, ' + meta.config.maximumPostLength + ']]');
done();
});
});
it('should edit post', function (done) {
- socketPosts.edit({uid: voterUid}, {pid: pid, content: 'edited post content', title: 'edited title', tags: ['edited']}, function (err, data) {
+ socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited post content', title: 'edited title', tags: ['edited'] }, function (err, data) {
assert.ifError(err);
assert.equal(data.content, 'edited post content');
assert.equal(data.editor, voterUid);
@@ -402,9 +401,9 @@ describe('Post\'s', function () {
});
it('should edit a deleted post', function (done) {
- socketPosts.delete({uid: voterUid}, {pid: pid, tid: tid}, function (err) {
+ socketPosts.delete({ uid: voterUid }, { pid: pid, tid: tid }, function (err) {
assert.ifError(err);
- socketPosts.edit({uid: voterUid}, {pid: pid, content: 'edited deleted content', title: 'edited deleted title', tags: ['deleted']}, function (err, data) {
+ socketPosts.edit({ uid: voterUid }, { pid: pid, content: 'edited deleted content', title: 'edited deleted title', tags: ['deleted'] }, function (err, data) {
assert.ifError(err);
assert.equal(data.content, 'edited deleted content');
assert.equal(data.editor, voterUid);
@@ -416,7 +415,7 @@ describe('Post\'s', function () {
});
it('should edit a reply post', function (done) {
- socketPosts.edit({uid: voterUid}, {pid: replyPid, content: 'edited reply'}, function (err, data) {
+ socketPosts.edit({ uid: voterUid }, { pid: replyPid, content: 'edited reply' }, function (err, data) {
assert.ifError(err);
assert.equal(data.content, 'edited reply');
assert.equal(data.editor, voterUid);
@@ -440,7 +439,7 @@ describe('Post\'s', function () {
uid: voterUid,
cid: cid,
title: 'topic 1',
- content: 'some content'
+ content: 'some content',
}, next);
},
function (data, next) {
@@ -449,7 +448,7 @@ describe('Post\'s', function () {
uid: voterUid,
cid: cid,
title: 'topic 2',
- content: 'some content'
+ content: 'some content',
}, next);
},
function (data, next) {
@@ -458,32 +457,32 @@ describe('Post\'s', function () {
uid: voterUid,
tid: tid,
timestamp: Date.now(),
- content: 'A reply to move'
+ content: 'A reply to move',
}, function (err, data) {
assert.ifError(err);
replyPid = data.pid;
next();
});
- }
+ },
], done);
});
it('should error if uid is not logged in', function (done) {
- socketPosts.movePost({uid: 0}, {}, function (err) {
+ socketPosts.movePost({ uid: 0 }, {}, function (err) {
assert.equal(err.message, '[[error:not-logged-in]]');
done();
});
});
it('should error if data is invalid', function (done) {
- socketPosts.movePost({uid: globalModUid}, {}, function (err) {
+ socketPosts.movePost({ uid: globalModUid }, {}, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error if user does not have move privilege', function (done) {
- socketPosts.movePost({uid: voterUid}, {pid: replyPid, tid: moveTid}, function (err) {
+ socketPosts.movePost({ uid: voterUid }, { pid: replyPid, tid: moveTid }, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
@@ -491,7 +490,7 @@ describe('Post\'s', function () {
it('should move a post', function (done) {
- socketPosts.movePost({uid: globalModUid}, {pid: replyPid, tid: moveTid}, function (err) {
+ socketPosts.movePost({ uid: globalModUid }, { pid: replyPid, tid: moveTid }, function (err) {
assert.ifError(err);
posts.getPostField(replyPid, 'tid', function (err, tid) {
assert.ifError(err);
@@ -502,6 +501,221 @@ describe('Post\'s', function () {
});
});
+ describe('flagging a post', function () {
+ var meta = require('../src/meta');
+ var socketPosts = require('../src/socket.io/posts');
+ it('should fail to flag a post due to low reputation', function (done) {
+ meta.config['privileges:flag'] = 10;
+ flagPost(function (err) {
+ assert.equal(err.message, '[[error:not-enough-reputation-to-flag]]');
+ done();
+ });
+ });
+
+ it('should flag a post', function (done) {
+ meta.config['privileges:flag'] = -1;
+ flagPost(function (err) {
+ assert.ifError(err);
+ done();
+ });
+ });
+
+ it('should return nothing without a uid or a reason', function (done) {
+ socketPosts.flag({ uid: 0 }, { pid: postData.pid, reason: 'reason' }, function (err) {
+ assert.equal(err.message, '[[error:not-logged-in]]');
+ socketPosts.flag({ uid: voteeUid }, {}, function (err) {
+ assert.equal(err.message, '[[error:invalid-data]]');
+ done();
+ });
+ });
+ });
+
+ it('should return an error without an existing post', function (done) {
+ socketPosts.flag({ uid: voteeUid }, { pid: 12312312, reason: 'reason' }, function (err) {
+ assert.equal(err.message, '[[error:no-post]]');
+ done();
+ });
+ });
+
+ it('should return an error if the flag already exists', function (done) {
+ socketPosts.flag({ uid: voteeUid }, { pid: postData.pid, reason: 'reason' }, function (err) {
+ assert.equal(err.message, '[[error:already-flagged]]');
+ done();
+ });
+ });
+ });
+
+ function flagPost(next) {
+ var socketPosts = require('../src/socket.io/posts');
+ socketPosts.flag({ uid: voteeUid }, { pid: postData.pid, reason: 'reason' }, next);
+ }
+
+ describe('get flag data', function () {
+ it('should see the flagged post', function (done) {
+ posts.isFlaggedByUser(postData.pid, voteeUid, function (err, hasFlagged) {
+ assert.ifError(err);
+ assert(hasFlagged);
+ done();
+ });
+ });
+
+ it('should return the flagged post data', function (done) {
+ posts.getFlags('posts:flagged', cid, voteeUid, 0, -1, function (err, flagData) {
+ assert.ifError(err);
+ assert(flagData.posts);
+ assert(flagData.count);
+ assert.equal(flagData.count, 1);
+ assert.equal(flagData.posts.length, 1);
+ assert(flagData.posts[0].flagReasons);
+ assert.equal(flagData.posts[0].flagReasons.length, 1);
+ assert.strictEqual(flagData.posts[0].flagReasons[0].reason, 'reason');
+ assert(flagData.posts[0].flagData);
+ assert.strictEqual(flagData.posts[0].flagData.state, 'open');
+ done();
+ });
+ });
+ });
+
+ describe('updating a flag', function () {
+ var socketPosts = require('../src/socket.io/posts');
+
+ it('should update a flag', function (done) {
+ async.waterfall([
+ function (next) {
+ socketPosts.updateFlag({ uid: globalModUid }, {
+ pid: postData.pid,
+ data: [
+ { name: 'assignee', value: `${globalModUid}` },
+ { name: 'notes', value: 'notes' },
+ ],
+ }, function (err) {
+ assert.ifError(err);
+ posts.getFlags('posts:flagged', cid, globalModUid, 0, -1, function (err, flagData) {
+ assert.ifError(err);
+ assert(flagData.posts);
+ assert.equal(flagData.posts.length, 1);
+ assert.deepEqual({
+ assignee: flagData.posts[0].flagData.assignee,
+ notes: flagData.posts[0].flagData.notes,
+ state: flagData.posts[0].flagData.state,
+ labelClass: flagData.posts[0].flagData.labelClass,
+ }, {
+ assignee: `${globalModUid}`,
+ notes: 'notes',
+ state: 'open',
+ labelClass: 'info',
+ });
+ next();
+ });
+ });
+ }, function (next) {
+ posts.updateFlagData(globalModUid, postData.pid, {
+ state: 'rejected',
+ }, function (err) {
+ assert.ifError(err);
+ posts.getFlags('posts:flagged', cid, globalModUid, 0, -1, function (err, flagData) {
+ assert.ifError(err);
+ assert(flagData.posts);
+ assert.equal(flagData.posts.length, 1);
+ assert.deepEqual({
+ state: flagData.posts[0].flagData.state,
+ labelClass: flagData.posts[0].flagData.labelClass,
+ }, {
+ state: 'rejected',
+ labelClass: 'danger',
+ });
+ next();
+ });
+ });
+ }, function (next) {
+ posts.updateFlagData(globalModUid, postData.pid, {
+ state: 'wip',
+ }, function (err) {
+ assert.ifError(err);
+ posts.getFlags('posts:flagged', cid, globalModUid, 0, -1, function (err, flagData) {
+ assert.ifError(err);
+ assert(flagData.posts);
+ assert.equal(flagData.posts.length, 1);
+ assert.deepEqual({
+ state: flagData.posts[0].flagData.state,
+ labelClass: flagData.posts[0].flagData.labelClass,
+ }, {
+ state: 'wip',
+ labelClass: 'warning',
+ });
+ next();
+ });
+ });
+ }, function (next) {
+ posts.updateFlagData(globalModUid, postData.pid, {
+ state: 'resolved',
+ }, function (err) {
+ assert.ifError(err);
+ posts.getFlags('posts:flagged', cid, globalModUid, 0, -1, function (err, flagData) {
+ assert.ifError(err);
+ assert(flagData.posts);
+ assert.equal(flagData.posts.length, 1);
+ assert.deepEqual({
+ state: flagData.posts[0].flagData.state,
+ labelClass: flagData.posts[0].flagData.labelClass,
+ }, {
+ state: 'resolved',
+ labelClass: 'success',
+ });
+ next();
+ });
+ });
+ },
+ ], done);
+ });
+ });
+
+ describe('dismissing a flag', function () {
+ var socketPosts = require('../src/socket.io/posts');
+
+ it('should dismiss a flag', function (done) {
+ socketPosts.dismissFlag({ uid: globalModUid }, postData.pid, function (err) {
+ assert.ifError(err);
+ posts.isFlaggedByUser(postData.pid, voteeUid, function (err, hasFlagged) {
+ assert.ifError(err);
+ assert(!hasFlagged);
+ flagPost(function (err) {
+ assert.ifError(err);
+ done();
+ });
+ });
+ });
+ });
+
+ it('should dismiss all of a user\'s flags', function (done) {
+ posts.dismissUserFlags(voteeUid, function (err) {
+ assert.ifError(err);
+ posts.isFlaggedByUser(postData.pid, voteeUid, function (err, hasFlagged) {
+ assert.ifError(err);
+ assert(!hasFlagged);
+ flagPost(function (err) {
+ assert.ifError(err);
+ done();
+ });
+ });
+ });
+ });
+
+ it('should dismiss all flags', function (done) {
+ socketPosts.dismissAllFlags({ uid: globalModUid }, {}, function (err) {
+ assert.ifError(err);
+ posts.isFlaggedByUser(postData.pid, voteeUid, function (err, hasFlagged) {
+ assert.ifError(err);
+ assert(!hasFlagged);
+ flagPost(function (err) {
+ assert.ifError(err);
+ done();
+ });
+ });
+ });
+ });
+ });
+
describe('getPostSummaryByPids', function () {
it('should return empty array for empty pids', function (done) {
posts.getPostSummaryByPids([], 0, {}, function (err, data) {
@@ -527,7 +741,7 @@ describe('Post\'s', function () {
uid: voterUid,
tid: topicData.tid,
timestamp: Date.now(),
- content: 'some content'
+ content: 'some content',
}, function (err) {
assert.ifError(err);
posts.getRecentPosterUids(0, 1, function (err, uids) {
@@ -541,14 +755,13 @@ describe('Post\'s', function () {
});
describe('socket methods', function () {
-
var pid;
before(function (done) {
topics.reply({
uid: voterUid,
tid: topicData.tid,
timestamp: Date.now(),
- content: 'raw content'
+ content: 'raw content',
}, function (err, postData) {
assert.ifError(err);
pid = postData.pid;
@@ -558,21 +771,21 @@ describe('Post\'s', function () {
var socketPosts = require('../src/socket.io/posts');
it('should error with invalid data', function (done) {
- socketPosts.reply({uid: 0}, null, function (err) {
+ socketPosts.reply({ uid: 0 }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error with invalid tid', function (done) {
- socketPosts.reply({uid: 0}, {tid: 0, content: 'derp'}, function (err) {
+ socketPosts.reply({ uid: 0 }, { tid: 0, content: 'derp' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should fail to get raw post because of privilege', function (done) {
- socketPosts.getRawPost({uid: 0}, pid, function (err) {
+ socketPosts.getRawPost({ uid: 0 }, pid, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
@@ -581,7 +794,7 @@ describe('Post\'s', function () {
it('should fail to get raw post because post is deleted', function (done) {
posts.setPostField(pid, 'deleted', 1, function (err) {
assert.ifError(err);
- socketPosts.getRawPost({uid: voterUid}, pid, function (err) {
+ socketPosts.getRawPost({ uid: voterUid }, pid, function (err) {
assert.equal(err.message, '[[error:no-post]]');
done();
});
@@ -591,7 +804,7 @@ describe('Post\'s', function () {
it('should get raw post content', function (done) {
posts.setPostField(pid, 'deleted', 0, function (err) {
assert.ifError(err);
- socketPosts.getRawPost({uid: voterUid}, pid, function (err, postContent) {
+ socketPosts.getRawPost({ uid: voterUid }, pid, function (err, postContent) {
assert.ifError(err);
assert.equal(postContent, 'raw content');
done();
@@ -600,7 +813,7 @@ describe('Post\'s', function () {
});
it('should get post', function (done) {
- socketPosts.getPost({uid: voterUid}, pid, function (err, postData) {
+ socketPosts.getPost({ uid: voterUid }, pid, function (err, postData) {
assert.ifError(err);
assert(postData);
done();
@@ -608,14 +821,14 @@ describe('Post\'s', function () {
});
it('shold error with invalid data', function (done) {
- socketPosts.loadMoreBookmarks({uid: voterUid}, {uid: voterUid, after: null}, function (err, postData) {
+ socketPosts.loadMoreBookmarks({ uid: voterUid }, { uid: voterUid, after: null }, function (err, postData) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should load more bookmarks', function (done) {
- socketPosts.loadMoreBookmarks({uid: voterUid}, {uid: voterUid, after: 0}, function (err, data) {
+ socketPosts.loadMoreBookmarks({ uid: voterUid }, { uid: voterUid, after: 0 }, function (err, data) {
assert.ifError(err);
assert(data);
done();
@@ -623,7 +836,7 @@ describe('Post\'s', function () {
});
it('should load more user posts', function (done) {
- socketPosts.loadMoreUserPosts({uid: voterUid}, {uid: voterUid, after: 0}, function (err, data) {
+ socketPosts.loadMoreUserPosts({ uid: voterUid }, { uid: voterUid, after: 0 }, function (err, data) {
assert.ifError(err);
assert(data);
done();
@@ -631,7 +844,7 @@ describe('Post\'s', function () {
});
it('should load more best posts', function (done) {
- socketPosts.loadMoreBestPosts({uid: voterUid}, {uid: voterUid, after: 0}, function (err, data) {
+ socketPosts.loadMoreBestPosts({ uid: voterUid }, { uid: voterUid, after: 0 }, function (err, data) {
assert.ifError(err);
assert(data);
done();
@@ -639,7 +852,7 @@ describe('Post\'s', function () {
});
it('should load more up voted posts', function (done) {
- socketPosts.loadMoreUpVotedPosts({uid: voterUid}, {uid: voterUid, after: 0}, function (err, data) {
+ socketPosts.loadMoreUpVotedPosts({ uid: voterUid }, { uid: voterUid, after: 0 }, function (err, data) {
assert.ifError(err);
assert(data);
done();
@@ -647,7 +860,7 @@ describe('Post\'s', function () {
});
it('should load more down voted posts', function (done) {
- socketPosts.loadMoreDownVotedPosts({uid: voterUid}, {uid: voterUid, after: 0}, function (err, data) {
+ socketPosts.loadMoreDownVotedPosts({ uid: voterUid }, { uid: voterUid, after: 0 }, function (err, data) {
assert.ifError(err);
assert(data);
done();
@@ -655,7 +868,7 @@ describe('Post\'s', function () {
});
it('should get post category', function (done) {
- socketPosts.getCategory({uid: voterUid}, pid, function (err, postCid) {
+ socketPosts.getCategory({ uid: voterUid }, pid, function (err, postCid) {
assert.ifError(err);
assert.equal(cid, postCid);
done();
@@ -663,14 +876,14 @@ describe('Post\'s', function () {
});
it('should error with invalid data', function (done) {
- socketPosts.getPidIndex({uid: voterUid}, null, function (err) {
+ socketPosts.getPidIndex({ uid: voterUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should get pid index', function (done) {
- socketPosts.getPidIndex({uid: voterUid}, {pid: pid, tid: topicData.tid, topicPostSort: 'oldest-to-newest'}, function (err, index) {
+ socketPosts.getPidIndex({ uid: voterUid }, { pid: pid, tid: topicData.tid, topicPostSort: 'oldest-to-newest' }, function (err, index) {
assert.ifError(err);
assert.equal(index, 2);
done();
diff --git a/test/rewards.js b/test/rewards.js
index 5804465ef7..965df4770f 100644
--- a/test/rewards.js
+++ b/test/rewards.js
@@ -19,7 +19,7 @@ describe('rewards', function () {
async.series([
async.apply(User.create, { username: 'foo', password: 'barbar' }),
async.apply(User.create, { username: 'baz', password: 'quuxquux' }),
- async.apply(User.create, { username: 'herp', password: 'derpderp' })
+ async.apply(User.create, { username: 'herp', password: 'derpderp' }),
], function (err, uids) {
if (err) {
return done(err);
@@ -31,11 +31,11 @@ describe('rewards', function () {
async.series([
function (next) {
- Groups.join('administrators', adminUid, done);
+ Groups.join('administrators', adminUid, next);
},
function (next) {
- Groups.join('rewardGroup', adminUid, done);
- }
+ Groups.join('rewardGroup', adminUid, next);
+ },
], done);
});
});
@@ -53,11 +53,11 @@ describe('rewards', function () {
rid: 'essentials/add-to-group',
claimable: '1',
id: '',
- disabled: false
- }
+ disabled: false,
+ },
];
- socketAdmin.rewards.save({uid: adminUid}, data, function (err) {
+ socketAdmin.rewards.save({ uid: adminUid }, data, function (err) {
assert.ifError(err);
done();
});
@@ -72,14 +72,9 @@ describe('rewards', function () {
done();
});
});
-
});
-
-
-
-
after(function (done) {
db.emptydb(done);
});
diff --git a/test/search-admin.js b/test/search-admin.js
index 216d26d35f..0d52c8db75 100644
--- a/test/search-admin.js
+++ b/test/search-admin.js
@@ -1,63 +1,63 @@
'use strict';
-/*global require*/
+
var assert = require('assert');
var search = require('../src/admin/search');
describe('admin search', function () {
- describe('filterDirectories', function () {
- it('should resolve all paths to relative paths', function (done) {
- assert.deepEqual(search.filterDirectories([
- 'hfjksfd/fdsgagag/admin/gdhgfsdg/sggag.tpl',
- ]), [
- 'admin/gdhgfsdg/sggag',
- ]);
- done();
- });
- it('should exclude partials', function (done) {
- assert.deepEqual(search.filterDirectories([
- 'hfjksfd/fdsgagag/admin/gdhgfsdg/sggag.tpl',
- 'dfahdfsgf/admin/partials/hgkfds/fdhsdfh.tpl',
- ]), [
- 'admin/gdhgfsdg/sggag',
- ]);
- done();
- });
- it('should exclude files in the admin directory', function (done) {
- assert.deepEqual(search.filterDirectories([
- 'hfjksfd/fdsgagag/admin/gdhgfsdg/sggag.tpl',
- 'dfdasg/admin/hjkdfsk.tpl',
- ]), [
- 'admin/gdhgfsdg/sggag',
- ]);
- done();
- });
- });
+ describe('filterDirectories', function () {
+ it('should resolve all paths to relative paths', function (done) {
+ assert.deepEqual(search.filterDirectories([
+ 'hfjksfd/fdsgagag/admin/gdhgfsdg/sggag.tpl',
+ ]), [
+ 'admin/gdhgfsdg/sggag',
+ ]);
+ done();
+ });
+ it('should exclude partials', function (done) {
+ assert.deepEqual(search.filterDirectories([
+ 'hfjksfd/fdsgagag/admin/gdhgfsdg/sggag.tpl',
+ 'dfahdfsgf/admin/partials/hgkfds/fdhsdfh.tpl',
+ ]), [
+ 'admin/gdhgfsdg/sggag',
+ ]);
+ done();
+ });
+ it('should exclude files in the admin directory', function (done) {
+ assert.deepEqual(search.filterDirectories([
+ 'hfjksfd/fdsgagag/admin/gdhgfsdg/sggag.tpl',
+ 'dfdasg/admin/hjkdfsk.tpl',
+ ]), [
+ 'admin/gdhgfsdg/sggag',
+ ]);
+ done();
+ });
+ });
- describe('sanitize', function () {
- it('should strip out scripts', function (done) {
- assert.equal(
+ describe('sanitize', function () {
+ it('should strip out scripts', function (done) {
+ assert.equal(
search.sanitize('Pellentesque tristique senectus' +
' habitant morbi'),
'Pellentesque tristique senectus' +
' habitant morbi'
);
- done();
- });
- it('should remove all tags', function (done) {
- assert.equal(
+ done();
+ });
+ it('should remove all tags', function (done) {
+ assert.equal(
search.sanitize('
Pellentesque habitant morbi tristique senectus' +
'Aenean vitae est.Mauris eleifend leo.
'),
'Pellentesque habitant morbi tristique senectus' +
'Aenean vitae est.Mauris eleifend leo.'
);
- done();
- });
- });
+ done();
+ });
+ });
- describe('simplify', function () {
- it('should remove all mustaches', function (done) {
- assert.equal(
+ describe('simplify', function () {
+ it('should remove all mustaches', function (done) {
+ assert.equal(
search.simplify(
'Pellentesque tristique {{senectus}}habitant morbi' +
'liquam tincidunt {mauris.eu}risus'
@@ -65,10 +65,10 @@ describe('admin search', function () {
'Pellentesque tristique habitant morbi' +
'liquam tincidunt risus'
);
- done();
- });
- it('should collapse all whitespace', function (done) {
- assert.equal(
+ done();
+ });
+ it('should collapse all whitespace', function (done) {
+ assert.equal(
search.simplify(
'Pellentesque tristique habitant morbi' +
' \n\n liquam tincidunt mauris eu risus.'
@@ -76,7 +76,7 @@ describe('admin search', function () {
'Pellentesque tristique habitant morbi' +
'\nliquam tincidunt mauris eu risus.'
);
- done();
- });
- });
-});
\ No newline at end of file
+ done();
+ });
+ });
+});
diff --git a/test/search.js b/test/search.js
index 7c619d0b6c..a18f6b3b41 100644
--- a/test/search.js
+++ b/test/search.js
@@ -1,5 +1,5 @@
'use strict';
-/*global require, before, after*/
+
var assert = require('assert');
var async = require('async');
@@ -29,23 +29,23 @@ describe('Search', function () {
function (next) {
async.series({
phoebe: function (next) {
- user.create({username: 'phoebe'}, next);
+ user.create({ username: 'phoebe' }, next);
},
ginger: function (next) {
- user.create({username: 'ginger'}, next);
+ user.create({ username: 'ginger' }, next);
},
category1: function (next) {
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, next);
},
category2: function (next) {
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, next);
- }
+ },
}, next);
},
function (results, next) {
@@ -61,7 +61,7 @@ describe('Search', function () {
cid: cid1,
title: 'nodebb mongodb bugs',
content: 'avocado cucumber apple orange fox',
- tags: ['nodebb', 'bug', 'plugin', 'nodebb-plugin', 'jquery']
+ tags: ['nodebb', 'bug', 'plugin', 'nodebb-plugin', 'jquery'],
}, next);
},
function (results, next) {
@@ -73,7 +73,7 @@ describe('Search', function () {
cid: cid2,
title: 'java mongodb redis',
content: 'avocado cucumber carrot armadillo',
- tags: ['nodebb', 'bug', 'plugin', 'nodebb-plugin', 'javascript']
+ tags: ['nodebb', 'bug', 'plugin', 'nodebb-plugin', 'javascript'],
}, next);
},
function (results, next) {
@@ -82,27 +82,26 @@ describe('Search', function () {
topics.reply({
uid: phoebeUid,
content: 'reply post apple',
- tid: topic2Data.tid
+ tid: topic2Data.tid,
}, next);
},
function (_post3Data, next) {
post3Data = _post3Data;
setTimeout(next, 500);
- }
+ },
], next);
- }
+ },
], done);
});
it('should search term in titles and posts', function (done) {
-
var meta = require('../src/meta');
meta.config.allowGuestSearching = 1;
var qs = '/api/search?term=cucumber&in=titlesposts&categories[]=' + cid1 + '&by=phoebe&replies=1&repliesFilter=atleast&sortBy=timestamp&sortDirection=desc&showAs=posts';
request({
url: nconf.get('url') + qs,
- json: true
+ json: true,
}, function (err, response, body) {
assert.ifError(err);
assert(body);
@@ -118,7 +117,7 @@ describe('Search', function () {
it('should search for a user', function (done) {
search.search({
query: 'gin',
- searchIn: 'users'
+ searchIn: 'users',
}, function (err, data) {
assert.ifError(err);
assert(data);
@@ -133,7 +132,7 @@ describe('Search', function () {
it('should search for a tag', function (done) {
search.search({
query: 'plug',
- searchIn: 'tags'
+ searchIn: 'tags',
}, function (err, data) {
assert.ifError(err);
assert(data);
@@ -148,7 +147,7 @@ describe('Search', function () {
it('should fail if searchIn is wrong', function (done) {
search.search({
query: 'plug',
- searchIn: 'invalidfilter'
+ searchIn: 'invalidfilter',
}, function (err) {
assert.equal(err.message, '[[error:unknown-search-filter]]');
done();
@@ -159,7 +158,7 @@ describe('Search', function () {
search.search({
query: 'mongodb',
searchIn: 'titles',
- hasTags: ['nodebb', 'javascript']
+ hasTags: ['nodebb', 'javascript'],
}, function (err, data) {
assert.ifError(err);
assert.equal(data.posts[0].tid, topic2Data.tid);
diff --git a/test/socket.io.js b/test/socket.io.js
index 24ae578718..a94aad8551 100644
--- a/test/socket.io.js
+++ b/test/socket.io.js
@@ -2,9 +2,8 @@
// see https://gist.github.com/jfromaniello/4087861#gistcomment-1447029
-/* global process, require, before, after*/
-process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
+process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
var assert = require('assert');
var async = require('async');
@@ -20,7 +19,6 @@ var categories = require('../src/categories');
describe('socket.io', function () {
-
var io;
var cid;
var tid;
@@ -30,11 +28,11 @@ describe('socket.io', function () {
before(function (done) {
async.series([
async.apply(user.create, { username: 'admin', password: 'adminpwd' }),
- async.apply(user.create, { username: 'regular', password: 'regularpwd', email: 'regular@test.com'}),
+ async.apply(user.create, { username: 'regular', password: 'regularpwd', email: 'regular@test.com' }),
async.apply(categories.create, {
name: 'Test Category',
- description: 'Test category created by testing script'
- })
+ description: 'Test category created by testing script',
+ }),
], function (err, data) {
if (err) {
return done(err);
@@ -52,7 +50,7 @@ describe('socket.io', function () {
request.get({
url: nconf.get('url') + '/api/config',
jar: cookies,
- json: true
+ json: true,
}, function (err, res, body) {
assert.ifError(err);
@@ -60,12 +58,12 @@ describe('socket.io', function () {
jar: cookies,
form: {
username: 'admin',
- password: 'adminpwd'
+ password: 'adminpwd',
},
headers: {
- 'x-csrf-token': body.csrf_token
+ 'x-csrf-token': body.csrf_token,
},
- json: true
+ json: true,
}, function (err, res, body) {
assert.ifError(err);
@@ -79,7 +77,7 @@ describe('socket.io', function () {
};
};
- io = require('socket.io-client')(nconf.get('url'), {forceNew: true});
+ io = require('socket.io-client')(nconf.get('url'), { forceNew: true });
io.on('connect', function () {
done();
@@ -116,7 +114,7 @@ describe('socket.io', function () {
});
it('should post a topic', function (done) {
- io.emit('topics.post', {title: 'test topic title', content: 'test topic main post content', uid: adminUid, cid: cid}, function (err, result) {
+ io.emit('topics.post', { title: 'test topic title', content: 'test topic main post content', uid: adminUid, cid: cid }, function (err, result) {
assert.ifError(err);
assert.equal(result.user.username, 'admin');
assert.equal(result.category.cid, cid);
@@ -127,7 +125,7 @@ describe('socket.io', function () {
});
it('should reply to topic', function (done) {
- io.emit('posts.reply', {tid: tid, uid: adminUid, content: 'test post content'}, function (err, result) {
+ io.emit('posts.reply', { tid: tid, uid: adminUid, content: 'test post content' }, function (err, result) {
assert.ifError(err);
assert.equal(result.uid, adminUid);
assert.equal(result.user.username, 'admin');
@@ -138,7 +136,7 @@ describe('socket.io', function () {
it('should ban a user', function (done) {
var socketUser = require('../src/socket.io/user');
- socketUser.banUsers({uid: adminUid}, {uids: [regularUid], reason: 'spammer'}, function (err) {
+ socketUser.banUsers({ uid: adminUid }, { uids: [regularUid], reason: 'spammer' }, function (err) {
assert.ifError(err);
user.getLatestBanInfo(regularUid, function (err, data) {
assert.ifError(err);
@@ -162,7 +160,7 @@ describe('socket.io', function () {
it('should unban a user', function (done) {
var socketUser = require('../src/socket.io/user');
- socketUser.unbanUsers({uid: adminUid}, [regularUid], function (err) {
+ socketUser.unbanUsers({ uid: adminUid }, [regularUid], function (err) {
assert.ifError(err);
user.isBanned(regularUid, function (err, isBanned) {
assert.ifError(err);
@@ -174,7 +172,7 @@ describe('socket.io', function () {
it('should make user admin', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.user.makeAdmins({uid: adminUid}, [regularUid], function (err) {
+ socketAdmin.user.makeAdmins({ uid: adminUid }, [regularUid], function (err) {
assert.ifError(err);
groups.isMember(regularUid, 'administrators', function (err, isMember) {
assert.ifError(err);
@@ -186,7 +184,7 @@ describe('socket.io', function () {
it('should make user non-admin', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.user.removeAdmins({uid: adminUid}, [regularUid], function (err) {
+ socketAdmin.user.removeAdmins({ uid: adminUid }, [regularUid], function (err) {
assert.ifError(err);
groups.isMember(regularUid, 'administrators', function (err, isMember) {
assert.ifError(err);
@@ -200,7 +198,7 @@ describe('socket.io', function () {
var socketAdmin = require('../src/socket.io/admin');
var uid;
it('should create a user', function (done) {
- socketAdmin.user.createUser({uid: adminUid}, {username: 'foo1'}, function (err, _uid) {
+ socketAdmin.user.createUser({ uid: adminUid }, { username: 'foo1' }, function (err, _uid) {
assert.ifError(err);
uid = _uid;
groups.isMember(uid, 'registered-users', function (err, isMember) {
@@ -212,7 +210,7 @@ describe('socket.io', function () {
});
it('should delete users', function (done) {
- socketAdmin.user.deleteUsers({uid: adminUid}, [uid], function (err) {
+ socketAdmin.user.deleteUsers({ uid: adminUid }, [uid], function (err) {
assert.ifError(err);
groups.isMember(uid, 'registered-users', function (err, isMember) {
assert.ifError(err);
@@ -223,7 +221,7 @@ describe('socket.io', function () {
});
it('should delete users and their content', function (done) {
- socketAdmin.user.deleteUsersAndContent({uid: adminUid}, [uid], function (err) {
+ socketAdmin.user.deleteUsersAndContent({ uid: adminUid }, [uid], function (err) {
assert.ifError(err);
done();
});
@@ -232,7 +230,7 @@ describe('socket.io', function () {
it('should error with invalid data', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.user.createUser({uid: adminUid}, null, function (err) {
+ socketAdmin.user.createUser({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -240,7 +238,15 @@ describe('socket.io', function () {
it('should reset lockouts', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.user.resetLockouts({uid: adminUid}, [regularUid], function (err) {
+ socketAdmin.user.resetLockouts({ uid: adminUid }, [regularUid], function (err) {
+ assert.ifError(err);
+ done();
+ });
+ });
+
+ it('should reset flags', function (done) {
+ var socketAdmin = require('../src/socket.io/admin');
+ socketAdmin.user.resetFlags({ uid: adminUid }, [regularUid], function (err) {
assert.ifError(err);
done();
});
@@ -251,7 +257,7 @@ describe('socket.io', function () {
var meta = require('../src/meta');
it('should validate emails', function (done) {
- socketAdmin.user.validateEmail({uid: adminUid}, [regularUid], function (err) {
+ socketAdmin.user.validateEmail({ uid: adminUid }, [regularUid], function (err) {
assert.ifError(err);
user.getUserField(regularUid, 'email:confirmed', function (err, emailConfirmed) {
assert.ifError(err);
@@ -263,7 +269,7 @@ describe('socket.io', function () {
it('should error with invalid uids', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.user.sendValidationEmail({uid: adminUid}, null, function (err) {
+ socketAdmin.user.sendValidationEmail({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -271,7 +277,7 @@ describe('socket.io', function () {
it('should error if email validation is not required', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.user.sendValidationEmail({uid: adminUid}, [regularUid], function (err) {
+ socketAdmin.user.sendValidationEmail({ uid: adminUid }, [regularUid], function (err) {
assert.equal(err.message, '[[error:email-confirmations-are-disabled]]');
done();
});
@@ -280,7 +286,7 @@ describe('socket.io', function () {
it('should send validation email', function (done) {
var socketAdmin = require('../src/socket.io/admin');
meta.config.requireEmailConfirmation = 1;
- socketAdmin.user.sendValidationEmail({uid: adminUid}, [regularUid], function (err) {
+ socketAdmin.user.sendValidationEmail({ uid: adminUid }, [regularUid], function (err) {
assert.ifError(err);
meta.config.requireEmailConfirmation = 0;
done();
@@ -290,7 +296,7 @@ describe('socket.io', function () {
it('should search users', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.user.search({uid: adminUid}, {query: 'reg', searchBy: 'username'}, function (err, data) {
+ socketAdmin.user.search({ uid: adminUid }, { query: 'reg', searchBy: 'username' }, function (err, data) {
assert.ifError(err);
assert.equal(data.matchCount, 1);
assert.equal(data.users[0].username, 'regular');
@@ -300,7 +306,7 @@ describe('socket.io', function () {
it('should push unread notifications on reconnect', function (done) {
var socketMeta = require('../src/socket.io/meta');
- socketMeta.reconnected({uid: 1}, {}, function (err) {
+ socketMeta.reconnected({ uid: 1 }, {}, function (err) {
assert.ifError(err);
done();
});
@@ -316,14 +322,14 @@ describe('socket.io', function () {
it('should return if uid is 0', function (done) {
var socketMeta = require('../src/socket.io/meta');
- socketMeta.rooms.enter({uid: 0}, null, function (err) {
+ socketMeta.rooms.enter({ uid: 0 }, null, function (err) {
assert.ifError(err);
done();
});
});
it('should join a room', function (done) {
- io.emit('meta.rooms.enter', {enter: 'recent_topics'}, function (err) {
+ io.emit('meta.rooms.enter', { enter: 'recent_topics' }, function (err) {
assert.ifError(err);
done();
});
@@ -338,7 +344,7 @@ describe('socket.io', function () {
it('should get server time', function (done) {
var socketMeta = require('../src/socket.io/meta');
- socketMeta.getServerTime({uid: 1}, null, function (err, time) {
+ socketMeta.getServerTime({ uid: 1 }, null, function (err, time) {
assert.ifError(err);
assert(time);
done();
@@ -346,7 +352,7 @@ describe('socket.io', function () {
});
it('should get daily analytics', function (done) {
- io.emit('admin.analytics.get', {graph: 'traffic', units: 'days'}, function (err, data) {
+ io.emit('admin.analytics.get', { graph: 'traffic', units: 'days' }, function (err, data) {
assert.ifError(err);
assert(data);
assert(data.monthlyPageViews);
@@ -355,7 +361,7 @@ describe('socket.io', function () {
});
it('should get hourly analytics', function (done) {
- io.emit('admin.analytics.get', {graph: 'traffic', units: 'hours'}, function (err, data) {
+ io.emit('admin.analytics.get', { graph: 'traffic', units: 'hours' }, function (err, data) {
assert.ifError(err);
assert(data);
assert(data.monthlyPageViews);
@@ -365,7 +371,7 @@ describe('socket.io', function () {
it('should return error', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.before({uid: 10}, 'someMethod', {}, function (err) {
+ socketAdmin.before({ uid: 10 }, 'someMethod', {}, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
@@ -374,12 +380,12 @@ describe('socket.io', function () {
it('should get room stats', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- io.emit('meta.rooms.enter', {enter: 'topic_1'}, function (err) {
+ io.emit('meta.rooms.enter', { enter: 'topic_1' }, function (err) {
assert.ifError(err);
- socketAdmin.rooms.getAll({uid: 10}, {}, function (err) {
+ socketAdmin.rooms.getAll({ uid: 10 }, {}, function (err) {
assert.ifError(err);
setTimeout(function () {
- socketAdmin.rooms.getAll({uid: 10}, {}, function (err, data) {
+ socketAdmin.rooms.getAll({ uid: 10 }, {}, function (err, data) {
assert.ifError(err);
assert(data.hasOwnProperty('onlineGuestCount'));
assert(data.hasOwnProperty('onlineRegisteredCount'));
@@ -397,12 +403,12 @@ describe('socket.io', function () {
it('should get room stats', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- io.emit('meta.rooms.enter', {enter: 'category_1'}, function (err) {
+ io.emit('meta.rooms.enter', { enter: 'category_1' }, function (err) {
assert.ifError(err);
- socketAdmin.rooms.getAll({uid: 10}, {}, function (err) {
+ socketAdmin.rooms.getAll({ uid: 10 }, {}, function (err) {
assert.ifError(err);
setTimeout(function () {
- socketAdmin.rooms.getAll({uid: 10}, {}, function (err, data) {
+ socketAdmin.rooms.getAll({ uid: 10 }, {}, function (err, data) {
assert.ifError(err);
assert.equal(data.users.category, 1);
done();
@@ -414,7 +420,7 @@ describe('socket.io', function () {
it('should get admin search dictionary', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.getSearchDict({uid: adminUid}, {}, function (err, data) {
+ socketAdmin.getSearchDict({ uid: adminUid }, {}, function (err, data) {
assert.ifError(err);
assert(Array.isArray(data));
assert(data[0].namespace);
@@ -428,6 +434,5 @@ describe('socket.io', function () {
after(function (done) {
db.emptydb(done);
});
-
});
diff --git a/test/template-helpers.js b/test/template-helpers.js
new file mode 100644
index 0000000000..b5921b81c9
--- /dev/null
+++ b/test/template-helpers.js
@@ -0,0 +1,52 @@
+'use strict';
+
+var async = require('async');
+var assert = require('assert');
+
+var db = require('./mocks/databasemock');
+var helpers = require('../public/src/modules/helpers');
+
+describe('helpers', function () {
+ it('should return false if item doesn\'t exist', function (done) {
+ var flag = helpers.displayMenuItem({ navigation: [] }, 0);
+ assert(!flag);
+ done();
+ });
+
+
+ it('should return false if route is /users and privateUserInfo is on and user is not logged in', function (done) {
+ var flag = helpers.displayMenuItem({
+ navigation: [{ route: '/users' }],
+ privateUserInfo: true,
+ config: {
+ loggedIn: false,
+ },
+ }, 0);
+ assert(!flag);
+ done();
+ });
+
+ it('should return false if route is /tags and privateTagListing is on and user is not logged in', function (done) {
+ var flag = helpers.displayMenuItem({
+ navigation: [{ route: '/tags' }],
+ privateTagListing: true,
+ config: {
+ loggedIn: false,
+ },
+ }, 0);
+ assert(!flag);
+ done();
+ });
+
+ it('should stringify object', function (done) {
+ var str = helpers.stringify({ a: 'herp < derp > and & quote "' });
+ assert.equal(str, '{"a":"herp < derp > and & quote \\""}');
+ done();
+ });
+
+ it('should escape html', function (done) {
+ var str = helpers.escape('gdkfhgk < some > and &');
+ assert.equal(str, 'gdkfhgk < some > and &');
+ done();
+ });
+});
diff --git a/test/topics.js b/test/topics.js
index 42701a6d93..3c6e7efe71 100644
--- a/test/topics.js
+++ b/test/topics.js
@@ -10,6 +10,7 @@ var topics = require('../src/topics');
var categories = require('../src/categories');
var User = require('../src/user');
var groups = require('../src/groups');
+var helpers = require('./helpers');
var socketPosts = require('../src/socket.io/posts');
describe('Topic\'s', function () {
@@ -19,7 +20,7 @@ describe('Topic\'s', function () {
before(function (done) {
groups.resetCache();
- User.create({username: 'admin'}, function (err, uid) {
+ User.create({ username: 'admin', password: '123456' }, function (err, uid) {
if (err) {
return done(err);
}
@@ -28,7 +29,7 @@ describe('Topic\'s', function () {
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, function (err, category) {
if (err) {
return done(err);
@@ -40,7 +41,7 @@ describe('Topic\'s', function () {
userId: uid,
categoryId: categoryObj.cid,
title: 'Test Topic Title',
- content: 'The content of test topic'
+ content: 'The content of test topic',
};
done();
});
@@ -48,9 +49,8 @@ describe('Topic\'s', function () {
});
describe('.post', function () {
-
it('should create a new topic with proper parameters', function (done) {
- topics.post({uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId}, function (err, result) {
+ topics.post({ uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId }, function (err, result) {
assert.equal(err, null, 'was created with error');
assert.ok(result);
@@ -59,28 +59,28 @@ describe('Topic\'s', function () {
});
it('should fail to create new topic with invalid user id', function (done) {
- topics.post({uid: null, title: topic.title, content: topic.content, cid: topic.categoryId}, function (err) {
+ topics.post({ uid: null, title: topic.title, content: topic.content, cid: topic.categoryId }, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should fail to create new topic with empty title', function (done) {
- topics.post({uid: topic.userId, title: '', content: topic.content, cid: topic.categoryId}, function (err) {
+ topics.post({ uid: topic.userId, title: '', content: topic.content, cid: topic.categoryId }, function (err) {
assert.ok(err);
done();
});
});
it('should fail to create new topic with empty content', function (done) {
- topics.post({uid: topic.userId, title: topic.title, content: '', cid: topic.categoryId}, function (err) {
+ topics.post({ uid: topic.userId, title: topic.title, content: '', cid: topic.categoryId }, function (err) {
assert.ok(err);
done();
});
});
it('should fail to create new topic with non-existant category id', function (done) {
- topics.post({uid: topic.userId, title: topic.title, content: topic.content, cid: 99}, function (err) {
+ topics.post({ uid: topic.userId, title: topic.title, content: topic.content, cid: 99 }, function (err) {
assert.equal(err.message, '[[error:no-category]]', 'received no error');
done();
});
@@ -92,7 +92,7 @@ describe('Topic\'s', function () {
var newPost;
before(function (done) {
- topics.post({uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId}, function (err, result) {
+ topics.post({ uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId }, function (err, result) {
if (err) {
return done(err);
}
@@ -104,7 +104,7 @@ describe('Topic\'s', function () {
});
it('should create a new reply with proper parameters', function (done) {
- topics.reply({uid: topic.userId, content: 'test post', tid: newTopic.tid}, function (err, result) {
+ topics.reply({ uid: topic.userId, content: 'test post', tid: newTopic.tid }, function (err, result) {
assert.equal(err, null, 'was created with error');
assert.ok(result);
@@ -113,11 +113,11 @@ describe('Topic\'s', function () {
});
it('should handle direct replies', function (done) {
- topics.reply({uid: topic.userId, content: 'test reply', tid: newTopic.tid, toPid: newPost.pid}, function (err, result) {
+ topics.reply({ uid: topic.userId, content: 'test reply', tid: newTopic.tid, toPid: newPost.pid }, function (err, result) {
assert.equal(err, null, 'was created with error');
assert.ok(result);
- socketPosts.getReplies({uid: 0}, newPost.pid, function (err, postData) {
+ socketPosts.getReplies({ uid: 0 }, newPost.pid, function (err, postData) {
assert.equal(err, null, 'posts.getReplies returned error');
assert.ok(postData);
@@ -131,35 +131,35 @@ describe('Topic\'s', function () {
});
it('should error if pid is not a number', function (done) {
- socketPosts.getReplies({uid: 0}, 'abc', function (err) {
+ socketPosts.getReplies({ uid: 0 }, 'abc', function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should fail to create new reply with invalid user id', function (done) {
- topics.reply({uid: null, content: 'test post', tid: newTopic.tid}, function (err) {
+ topics.reply({ uid: null, content: 'test post', tid: newTopic.tid }, function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should fail to create new reply with empty content', function (done) {
- topics.reply({uid: topic.userId, content: '', tid: newTopic.tid}, function (err) {
+ topics.reply({ uid: topic.userId, content: '', tid: newTopic.tid }, function (err) {
assert.ok(err);
done();
});
});
it('should fail to create new reply with invalid topic id', function (done) {
- topics.reply({uid: null, content: 'test post', tid: 99}, function (err) {
+ topics.reply({ uid: null, content: 'test post', tid: 99 }, function (err) {
assert.equal(err.message, '[[error:no-topic]]');
done();
});
});
it('should fail to create new reply with invalid toPid', function (done) {
- topics.reply({uid: topic.userId, content: 'test post', tid: newTopic.tid, toPid: '"onmouseover=alert(1);//'}, function (err) {
+ topics.reply({ uid: topic.userId, content: 'test post', tid: newTopic.tid, toPid: '"onmouseover=alert(1);//' }, function (err) {
assert.equal(err.message, '[[error:invalid-pid]]');
done();
});
@@ -171,7 +171,7 @@ describe('Topic\'s', function () {
var newPost;
before(function (done) {
- topics.post({uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId}, function (err, result) {
+ topics.post({ uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId }, function (err, result) {
if (err) {
return done(err);
}
@@ -182,9 +182,24 @@ describe('Topic\'s', function () {
});
});
- describe('.getTopicData', function () {
- it('should not receive errors', function (done) {
- topics.getTopicData(newTopic.tid, done);
+
+ it('should not receive errors', function (done) {
+ topics.getTopicData(newTopic.tid, done);
+ });
+
+ it('should get topic title by pid', function (done) {
+ topics.getTitleByPid(newPost.pid, function (err, title) {
+ assert.ifError(err);
+ assert.equal(title, topic.title);
+ done();
+ });
+ });
+
+ it('should get topic data by pid', function (done) {
+ topics.getTopicDataByPid(newPost.pid, function (err, data) {
+ assert.ifError(err);
+ assert.equal(data.tid, newTopic.tid);
+ done();
});
});
@@ -212,11 +227,10 @@ describe('Topic\'s', function () {
});
describe('Title escaping', function () {
-
it('should properly escape topic title', function (done) {
var title = '" new topic test';
var titleEscaped = validator.escape(title);
- topics.post({uid: topic.userId, title: title, content: topic.content, cid: topic.categoryId}, function (err, result) {
+ topics.post({ uid: topic.userId, title: title, content: topic.content, cid: topic.categoryId }, function (err, result) {
assert.ifError(err);
topics.getTopicData(result.topicData.tid, function (err, topicData) {
assert.ifError(err);
@@ -239,14 +253,14 @@ describe('Topic\'s', function () {
groups.join('administrators', adminUid, next);
},
function (next) {
- topics.post({uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId}, function (err, result) {
+ topics.post({ uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId }, function (err, result) {
assert.ifError(err);
newTopic = result.topicData;
next();
});
},
function (next) {
- User.create({username: 'topicFollower', password: '123456'}, next);
+ User.create({ username: 'topicFollower', password: '123456' }, next);
},
function (_uid, next) {
followerUid = _uid;
@@ -255,7 +269,7 @@ describe('Topic\'s', function () {
function (next) {
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, function (err, category) {
if (err) {
return next(err);
@@ -263,12 +277,12 @@ describe('Topic\'s', function () {
moveCid = category.cid;
next();
});
- }
+ },
], done);
});
it('should load topic tools', function (done) {
- socketTopics.loadTopicTools({uid: 1}, {tid: newTopic.tid}, function (err, data) {
+ socketTopics.loadTopicTools({ uid: 1 }, { tid: newTopic.tid }, function (err, data) {
assert.ifError(err);
assert(data);
done();
@@ -276,21 +290,21 @@ describe('Topic\'s', function () {
});
it('should delete the topic', function (done) {
- socketTopics.delete({uid: 1}, {tids: [newTopic.tid], cid: categoryObj.cid}, function (err) {
+ socketTopics.delete({ uid: 1 }, { tids: [newTopic.tid], cid: categoryObj.cid }, function (err) {
assert.ifError(err);
done();
});
});
it('should restore the topic', function (done) {
- socketTopics.restore({uid: 1}, {tids: [newTopic.tid], cid: categoryObj.cid}, function (err) {
+ socketTopics.restore({ uid: 1 }, { tids: [newTopic.tid], cid: categoryObj.cid }, function (err) {
assert.ifError(err);
done();
});
});
it('should lock topic', function (done) {
- socketTopics.lock({uid: 1}, {tids: [newTopic.tid], cid: categoryObj.cid}, function (err) {
+ socketTopics.lock({ uid: 1 }, { tids: [newTopic.tid], cid: categoryObj.cid }, function (err) {
assert.ifError(err);
topics.isLocked(newTopic.tid, function (err, isLocked) {
assert.ifError(err);
@@ -301,7 +315,7 @@ describe('Topic\'s', function () {
});
it('should unlock topic', function (done) {
- socketTopics.unlock({uid: 1}, {tids: [newTopic.tid], cid: categoryObj.cid}, function (err) {
+ socketTopics.unlock({ uid: 1 }, { tids: [newTopic.tid], cid: categoryObj.cid }, function (err) {
assert.ifError(err);
topics.isLocked(newTopic.tid, function (err, isLocked) {
assert.ifError(err);
@@ -312,7 +326,7 @@ describe('Topic\'s', function () {
});
it('should pin topic', function (done) {
- socketTopics.pin({uid: 1}, {tids: [newTopic.tid], cid: categoryObj.cid}, function (err) {
+ socketTopics.pin({ uid: 1 }, { tids: [newTopic.tid], cid: categoryObj.cid }, function (err) {
assert.ifError(err);
db.getObjectField('topic:' + newTopic.tid, 'pinned', function (err, pinned) {
assert.ifError(err);
@@ -323,7 +337,7 @@ describe('Topic\'s', function () {
});
it('should unpin topic', function (done) {
- socketTopics.unpin({uid: 1}, {tids: [newTopic.tid], cid: categoryObj.cid}, function (err) {
+ socketTopics.unpin({ uid: 1 }, { tids: [newTopic.tid], cid: categoryObj.cid }, function (err) {
assert.ifError(err);
db.getObjectField('topic:' + newTopic.tid, 'pinned', function (err, pinned) {
assert.ifError(err);
@@ -334,7 +348,7 @@ describe('Topic\'s', function () {
});
it('should move all topics', function (done) {
- socketTopics.moveAll({uid: 1}, {cid: moveCid, currentCid: categoryObj.cid}, function (err) {
+ socketTopics.moveAll({ uid: 1 }, { cid: moveCid, currentCid: categoryObj.cid }, function (err) {
assert.ifError(err);
topics.getTopicField(newTopic.tid, 'cid', function (err, cid) {
assert.ifError(err);
@@ -345,7 +359,7 @@ describe('Topic\'s', function () {
});
it('should move a topic', function (done) {
- socketTopics.move({uid: 1}, {cid: categoryObj.cid, tids: [newTopic.tid]}, function (err) {
+ socketTopics.move({ uid: 1 }, { cid: categoryObj.cid, tids: [newTopic.tid] }, function (err) {
assert.ifError(err);
topics.getTopicField(newTopic.tid, 'cid', function (err, cid) {
assert.ifError(err);
@@ -356,7 +370,7 @@ describe('Topic\'s', function () {
});
it('should purge the topic', function (done) {
- socketTopics.purge({uid: 1}, {tids: [newTopic.tid], cid: categoryObj.cid}, function (err) {
+ socketTopics.purge({ uid: 1 }, { tids: [newTopic.tid], cid: categoryObj.cid }, function (err) {
assert.ifError(err);
db.isSortedSetMember('uid:' + followerUid + ':followed_tids', newTopic.tid, function (err, isMember) {
assert.ifError(err);
@@ -377,7 +391,7 @@ describe('Topic\'s', function () {
uid: topic.userId,
title: 'topic for test',
content: 'topic content',
- cid: topic.categoryId
+ cid: topic.categoryId,
}, callback);
}
async.series({
@@ -389,7 +403,7 @@ describe('Topic\'s', function () {
},
topic3: function (next) {
createTopic(next);
- }
+ },
}, function (err, results) {
assert.ifError(err);
tid1 = results.topic1.topicData.tid;
@@ -401,35 +415,35 @@ describe('Topic\'s', function () {
},
function (next) {
topics.tools.pin(tid2, adminUid, next);
- }
+ },
], done);
});
});
var socketTopics = require('../src/socket.io/topics');
it('should error with invalid data', function (done) {
- socketTopics.orderPinnedTopics({uid: adminUid}, null, function (err) {
+ socketTopics.orderPinnedTopics({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error with invalid data', function (done) {
- socketTopics.orderPinnedTopics({uid: adminUid}, [null, null], function (err) {
+ socketTopics.orderPinnedTopics({ uid: adminUid }, [null, null], function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error with unprivileged user', function (done) {
- socketTopics.orderPinnedTopics({uid: 0}, [{tid: tid1}, {tid: tid2}], function (err) {
+ socketTopics.orderPinnedTopics({ uid: 0 }, [{ tid: tid1 }, { tid: tid2 }], function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should not do anything if topics are not pinned', function (done) {
- socketTopics.orderPinnedTopics({uid: adminUid}, [{tid: tid3}], function (err) {
+ socketTopics.orderPinnedTopics({ uid: adminUid }, [{ tid: tid3 }], function (err) {
assert.ifError(err);
db.isSortedSetMember('cid:' + topic.categoryId + ':tids:pinned', tid3, function (err, isMember) {
assert.ifError(err);
@@ -444,7 +458,7 @@ describe('Topic\'s', function () {
assert.ifError(err);
assert.equal(pinnedTids[0], tid2);
assert.equal(pinnedTids[1], tid1);
- socketTopics.orderPinnedTopics({uid: adminUid}, [{tid: tid1, order: 1}, {tid: tid2, order: 0}], function (err) {
+ socketTopics.orderPinnedTopics({ uid: adminUid }, [{ tid: tid1, order: 1 }, { tid: tid2, order: 0 }], function (err) {
assert.ifError(err);
db.getSortedSetRevRange('cid:' + topic.categoryId + ':tids:pinned', 0, -1, function (err, pinnedTids) {
assert.ifError(err);
@@ -455,7 +469,6 @@ describe('Topic\'s', function () {
});
});
});
-
});
@@ -467,7 +480,7 @@ describe('Topic\'s', function () {
uid = topic.userId;
async.waterfall([
function (done) {
- topics.post({uid: topic.userId, title: 'Topic to be ignored', content: 'Just ignore me, please!', cid: topic.categoryId}, function (err, result) {
+ topics.post({ uid: topic.userId, title: 'Topic to be ignored', content: 'Just ignore me, please!', cid: topic.categoryId }, function (err, result) {
if (err) {
return done(err);
}
@@ -478,41 +491,41 @@ describe('Topic\'s', function () {
});
},
function (done) {
- topics.markUnread( newTid, uid, done );
- }
- ],done);
+ topics.markUnread(newTid, uid, done);
+ },
+ ], done);
});
it('should not appear in the unread list', function (done) {
async.waterfall([
function (done) {
- topics.ignore( newTid, uid, done );
+ topics.ignore(newTid, uid, done);
},
function (done) {
- topics.getUnreadTopics({cid: 0, uid: uid, start: 0, stop: -1, filter: ''}, done );
+ topics.getUnreadTopics({ cid: 0, uid: uid, start: 0, stop: -1, filter: '' }, done);
},
function (results, done) {
var topics = results.topics;
- var tids = topics.map( function (topic) { return topic.tid; } );
+ var tids = topics.map(function (topic) { return topic.tid; });
assert.equal(tids.indexOf(newTid), -1, 'The topic appeared in the unread list.');
done();
- }
+ },
], done);
});
it('should not appear as unread in the recent list', function (done) {
async.waterfall([
function (done) {
- topics.ignore( newTid, uid, done );
+ topics.ignore(newTid, uid, done);
},
function (done) {
- topics.getLatestTopics( uid, 0, -1, 'year', done );
+ topics.getLatestTopics(uid, 0, -1, 'year', done);
},
function (results, done) {
var topics = results.topics;
var topic;
var i;
- for(i = 0; i < topics.length; ++i) {
+ for (i = 0; i < topics.length; i += 1) {
if (parseInt(topics[i].tid, 10) === parseInt(newTid, 10)) {
assert.equal(false, topics[i].unread, 'ignored topic was marked as unread in recent list');
return done();
@@ -520,47 +533,47 @@ describe('Topic\'s', function () {
}
assert.ok(topic, 'topic didn\'t appear in the recent list');
done();
- }
+ },
], done);
});
it('should appear as unread again when marked as reading', function (done) {
async.waterfall([
function (done) {
- topics.ignore( newTid, uid, done );
+ topics.ignore(newTid, uid, done);
},
function (done) {
- topics.follow( newTid, uid, done );
+ topics.follow(newTid, uid, done);
},
function (done) {
- topics.getUnreadTopics({cid: 0, uid: uid, start: 0, stop: -1, filter: ''}, done );
+ topics.getUnreadTopics({ cid: 0, uid: uid, start: 0, stop: -1, filter: '' }, done);
},
function (results, done) {
var topics = results.topics;
- var tids = topics.map( function (topic) { return topic.tid; } );
+ var tids = topics.map(function (topic) { return topic.tid; });
assert.notEqual(tids.indexOf(newTid), -1, 'The topic did not appear in the unread list.');
done();
- }
+ },
], done);
});
it('should appear as unread again when marked as following', function (done) {
async.waterfall([
function (done) {
- topics.ignore( newTid, uid, done );
+ topics.ignore(newTid, uid, done);
},
function (done) {
- topics.follow( newTid, uid, done );
+ topics.follow(newTid, uid, done);
},
function (done) {
- topics.getUnreadTopics({cid: 0, uid: uid, start: 0, stop: -1, filter: ''}, done );
+ topics.getUnreadTopics({ cid: 0, uid: uid, start: 0, stop: -1, filter: '' }, done);
},
function (results, done) {
var topics = results.topics;
- var tids = topics.map( function (topic) { return topic.tid; } );
+ var tids = topics.map(function (topic) { return topic.tid; });
assert.notEqual(tids.indexOf(newTid), -1, 'The topic did not appear in the unread list.');
done();
- }
+ },
], done);
});
});
@@ -571,12 +584,12 @@ describe('Topic\'s', function () {
var topicPids;
var originalBookmark = 5;
function postReply(next) {
- topics.reply({uid: topic.userId, content: 'test post ' + replies.length, tid: newTopic.tid}, function (err, result) {
- assert.equal(err, null, 'was created with error');
- assert.ok(result);
- replies.push(result);
- next();
- }
+ topics.reply({ uid: topic.userId, content: 'test post ' + replies.length, tid: newTopic.tid }, function (err, result) {
+ assert.equal(err, null, 'was created with error');
+ assert.ok(result);
+ replies.push(result);
+ next();
+ }
);
}
@@ -585,34 +598,34 @@ describe('Topic\'s', function () {
function (next) {
groups.join('administrators', topic.userId, next);
},
- function ( next ) {
- topics.post({uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId}, function (err, result) {
- assert.ifError( err );
+ function (next) {
+ topics.post({ uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId }, function (err, result) {
+ assert.ifError(err);
newTopic = result.topicData;
next();
});
},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) { postReply( next );},
- function ( next ) {
- topicPids = replies.map( function ( reply ) { return reply.pid; } );
- topics.setUserBookmark( newTopic.tid, topic.userId, originalBookmark, next );
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) { postReply(next); },
+ function (next) {
+ topicPids = replies.map(function (reply) { return reply.pid; });
+ topics.setUserBookmark(newTopic.tid, topic.userId, originalBookmark, next);
}],
- done );
+ done);
});
it('should have 12 replies', function (done) {
- assert.equal( 12, replies.length );
+ assert.equal(12, replies.length);
done();
});
@@ -622,18 +635,18 @@ describe('Topic\'s', function () {
topics.createTopicFromPosts(
topic.userId,
'Fork test, no bookmark update',
- topicPids.slice( -2 ),
+ topicPids.slice(-2),
newTopic.tid,
- next );
+ next);
},
- function ( forkedTopicData, next) {
- topics.getUserBookmark( newTopic.tid, topic.userId, next );
+ function (forkedTopicData, next) {
+ topics.getUserBookmark(newTopic.tid, topic.userId, next);
},
- function ( bookmark, next ) {
- assert.equal( originalBookmark, bookmark );
+ function (bookmark, next) {
+ assert.equal(originalBookmark, bookmark);
next();
- }
- ],done);
+ },
+ ], done);
});
it('should update the user\'s bookmark ', function (done) {
@@ -642,46 +655,196 @@ describe('Topic\'s', function () {
topics.createTopicFromPosts(
topic.userId,
'Fork test, no bookmark update',
- topicPids.slice( 1, 3 ),
+ topicPids.slice(1, 3),
newTopic.tid,
- next );
+ next);
},
- function ( forkedTopicData, next) {
- topics.getUserBookmark( newTopic.tid, topic.userId, next );
+ function (forkedTopicData, next) {
+ topics.getUserBookmark(newTopic.tid, topic.userId, next);
},
- function ( bookmark, next ) {
- assert.equal( originalBookmark - 2, bookmark );
+ function (bookmark, next) {
+ assert.equal(originalBookmark - 2, bookmark);
next();
- }
- ],done);
+ },
+ ], done);
});
});
- it('should load topic', function (done) {
- topics.post({
- uid: topic.userId,
- title: 'topic for controller test',
- content: 'topic content',
- cid: topic.categoryId,
- thumb: 'http://i.imgur.com/64iBdBD.jpg'
- }, function (err, result) {
- assert.ifError(err);
- assert.ok(result);
- var request = require('request');
- request(nconf.get('url') + '/topic/' + result.topicData.slug, function (err, response, body) {
+ describe('controller', function () {
+ var request = require('request');
+ var topicData;
+
+ before(function (done) {
+ topics.post({
+ uid: topic.userId,
+ title: 'topic for controller test',
+ content: 'topic content',
+ cid: topic.categoryId,
+ thumb: 'http://i.imgur.com/64iBdBD.jpg',
+ }, function (err, result) {
+ assert.ifError(err);
+ assert.ok(result);
+ topicData = result.topicData;
+ done();
+ });
+ });
+
+ it('should load topic', function (done) {
+ request(nconf.get('url') + '/topic/' + topicData.slug, function (err, response, body) {
assert.ifError(err);
assert.equal(response.statusCode, 200);
assert(body);
done();
});
});
+
+ it('should 404 if post index is invalid', function (done) {
+ request(nconf.get('url') + '/topic/' + topicData.slug + '/derp', function (err, response) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 404);
+ done();
+ });
+ });
+
+ it('should 404 if topic does not exist', function (done) {
+ request(nconf.get('url') + '/topic/123123/does-not-exist', function (err, response) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 404);
+ done();
+ });
+ });
+
+ it('should 401 if not allowed to read as guest', function (done) {
+ var privileges = require('../src/privileges');
+ privileges.categories.rescind(['read'], topicData.cid, 'guests', function (err) {
+ assert.ifError(err);
+ request(nconf.get('url') + '/api/topic/' + topicData.slug, function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 401);
+ assert(body);
+ privileges.categories.give(['read'], topicData.cid, 'guests', done);
+ });
+ });
+ });
+
+ it('should redirect to correct topic if slug is missing', function (done) {
+ request(nconf.get('url') + '/topic/' + topicData.tid + '/herpderp/1?page=2', function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 200);
+ assert(body);
+ done();
+ });
+ });
+
+ it('should redirect if post index is out of range', function (done) {
+ request(nconf.get('url') + '/api/topic/' + topicData.slug + '/-1', function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 308);
+ assert.equal(body, '"/topic/13/topic-for-controller-test"');
+ done();
+ });
+ });
+
+ it('should 404 if page is out of bounds', function (done) {
+ var meta = require('../src/meta');
+ meta.config.usePagination = 1;
+ request(nconf.get('url') + '/topic/' + topicData.slug + '?page=100', function (err, response) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 404);
+ done();
+ });
+ });
+
+ it('should mark topic read', function (done) {
+ helpers.loginUser('admin', '123456', function (err, jar) {
+ assert.ifError(err);
+ request(nconf.get('url') + '/topic/' + topicData.slug, {
+ jar: jar,
+ }, function (err, res) {
+ assert.ifError(err);
+ assert.equal(res.statusCode, 200);
+ topics.hasReadTopics([topicData.tid], adminUid, function (err, hasRead) {
+ assert.ifError(err);
+ assert.equal(hasRead[0], true);
+ done();
+ });
+ });
+ });
+ });
+
+ it('should 404 if tid is not a number', function (done) {
+ request(nconf.get('url') + '/api/topic/teaser/nan', { json: true }, function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 404);
+ done();
+ });
+ });
+
+ it('should 403 if cant read', function (done) {
+ request(nconf.get('url') + '/api/topic/teaser/' + 123123, { json: true }, function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 403);
+ assert.equal(body, '[[error:no-privileges]]');
+
+ done();
+ });
+ });
+
+ it('should load topic teaser', function (done) {
+ request(nconf.get('url') + '/api/topic/teaser/' + topicData.tid, { json: true }, function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 200);
+ assert(body);
+ assert.equal(body.tid, topicData.tid);
+ assert.equal(body.content, 'topic content');
+ assert(body.user);
+ assert(body.topic);
+ assert(body.category);
+ done();
+ });
+ });
+
+
+ it('should 404 if tid is not a number', function (done) {
+ request(nconf.get('url') + '/api/topic/pagination/nan', { json: true }, function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 404);
+ done();
+ });
+ });
+
+ it('should 404 if tid does not exist', function (done) {
+ request(nconf.get('url') + '/api/topic/pagination/1231231', { json: true }, function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 404);
+ done();
+ });
+ });
+
+ it('should load pagination', function (done) {
+ request(nconf.get('url') + '/api/topic/pagination/' + topicData.tid, { json: true }, function (err, response, body) {
+ assert.ifError(err);
+ assert.equal(response.statusCode, 200);
+ assert(body);
+ assert.deepEqual(body, {
+ prev: { page: 1, active: false },
+ next: { page: 1, active: false },
+ rel: [],
+ pages: [],
+ currentPage: 1,
+ pageCount: 1,
+ });
+ done();
+ });
+ });
});
+
describe('infinitescroll', function () {
var socketTopics = require('../src/socket.io/topics');
var tid;
before(function (done) {
- topics.post({uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId}, function (err, result) {
+ topics.post({ uid: topic.userId, title: topic.title, content: topic.content, cid: topic.categoryId }, function (err, result) {
assert.ifError(err);
tid = result.topicData.tid;
done();
@@ -689,14 +852,14 @@ describe('Topic\'s', function () {
});
it('should error with invalid data', function (done) {
- socketTopics.loadMore({uid: adminUid}, {}, function (err) {
+ socketTopics.loadMore({ uid: adminUid }, {}, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should infinite load topic posts', function (done) {
- socketTopics.loadMore({uid: adminUid}, {tid: tid, after: 0}, function (err, data) {
+ socketTopics.loadMore({ uid: adminUid }, { tid: tid, after: 0 }, function (err, data) {
assert.ifError(err);
assert(data.mainPost);
assert(data.posts);
@@ -706,16 +869,16 @@ describe('Topic\'s', function () {
});
it('should error with invalid data', function (done) {
- socketTopics.loadMoreUnreadTopics({uid: adminUid}, {after: 'invalid'}, function (err) {
+ socketTopics.loadMoreUnreadTopics({ uid: adminUid }, { after: 'invalid' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should load more unread topics', function (done) {
- socketTopics.markUnread({uid: adminUid}, tid, function (err) {
+ socketTopics.markUnread({ uid: adminUid }, tid, function (err) {
assert.ifError(err);
- socketTopics.loadMoreUnreadTopics({uid: adminUid}, {cid: topic.categoryId, after: 0}, function (err, data) {
+ socketTopics.loadMoreUnreadTopics({ uid: adminUid }, { cid: topic.categoryId, after: 0 }, function (err, data) {
assert.ifError(err);
assert(data);
assert(Array.isArray(data.topics));
@@ -725,7 +888,7 @@ describe('Topic\'s', function () {
});
it('should error with invalid data', function (done) {
- socketTopics.loadMoreRecentTopics({uid: adminUid}, {after: 'invalid'}, function (err) {
+ socketTopics.loadMoreRecentTopics({ uid: adminUid }, { after: 'invalid' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -733,7 +896,7 @@ describe('Topic\'s', function () {
it('should load more recent topics', function (done) {
- socketTopics.loadMoreRecentTopics({uid: adminUid}, {cid: topic.categoryId, after: 0}, function (err, data) {
+ socketTopics.loadMoreRecentTopics({ uid: adminUid }, { cid: topic.categoryId, after: 0 }, function (err, data) {
assert.ifError(err);
assert(data);
assert(Array.isArray(data.topics));
@@ -742,21 +905,20 @@ describe('Topic\'s', function () {
});
it('should error with invalid data', function (done) {
- socketTopics.loadMoreFromSet({uid: adminUid}, {after: 'invalid'}, function (err) {
+ socketTopics.loadMoreFromSet({ uid: adminUid }, { after: 'invalid' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should load more from custom set', function (done) {
- socketTopics.loadMoreFromSet({uid: adminUid}, {set: 'uid:' + adminUid + ':topics', after: 0}, function (err, data) {
+ socketTopics.loadMoreFromSet({ uid: adminUid }, { set: 'uid:' + adminUid + ':topics', after: 0 }, function (err, data) {
assert.ifError(err);
assert(data);
assert(Array.isArray(data.topics));
done();
});
});
-
});
describe('suggested topics', function () {
@@ -765,11 +927,11 @@ describe('Topic\'s', function () {
before(function (done) {
async.parallel({
topic1: function (next) {
- topics.post({uid: adminUid, tags: ['nodebb'], title: 'topic title 1', content: 'topic 1 content', cid: topic.categoryId}, next);
+ topics.post({ uid: adminUid, tags: ['nodebb'], title: 'topic title 1', content: 'topic 1 content', cid: topic.categoryId }, next);
},
topic2: function (next) {
- topics.post({uid: adminUid, tags: ['nodebb'], title: 'topic title 2', content: 'topic 2 content', cid: topic.categoryId}, next);
- }
+ topics.post({ uid: adminUid, tags: ['nodebb'], title: 'topic title 2', content: 'topic 2 content', cid: topic.categoryId }, next);
+ },
}, function (err, results) {
assert.ifError(err);
tid1 = results.topic1.topicData.tid;
@@ -795,11 +957,11 @@ describe('Topic\'s', function () {
before(function (done) {
async.parallel({
topic: function (next) {
- topics.post({uid: topic.userId, title: 'unread topic', content: 'unread topic content', cid: topic.categoryId}, next);
+ topics.post({ uid: topic.userId, title: 'unread topic', content: 'unread topic content', cid: topic.categoryId }, next);
},
user: function (next) {
- User.create({username: 'regularJoe'}, next);
- }
+ User.create({ username: 'regularJoe' }, next);
+ },
}, function (err, results) {
assert.ifError(err);
tid = results.topic.topicData.tid;
@@ -810,21 +972,21 @@ describe('Topic\'s', function () {
});
it('should fail with invalid data', function (done) {
- socketTopics.markUnread({uid: adminUid}, null, function (err) {
+ socketTopics.markUnread({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should fail if topic does not exist', function (done) {
- socketTopics.markUnread({uid: adminUid}, 1231082, function (err) {
+ socketTopics.markUnread({ uid: adminUid }, 1231082, function (err) {
assert.equal(err.message, '[[error:no-topic]]');
done();
});
});
it('should mark topic unread', function (done) {
- socketTopics.markUnread({uid: adminUid}, tid, function (err) {
+ socketTopics.markUnread({ uid: adminUid }, tid, function (err) {
assert.ifError(err);
topics.hasReadTopic(tid, adminUid, function (err, hasRead) {
assert.ifError(err);
@@ -836,7 +998,7 @@ describe('Topic\'s', function () {
it('should fail with invalid data', function (done) {
- socketTopics.markAsRead({uid: 0}, null, function (err) {
+ socketTopics.markAsRead({ uid: 0 }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -844,7 +1006,7 @@ describe('Topic\'s', function () {
it('should mark topic read', function (done) {
- socketTopics.markAsRead({uid: adminUid}, [tid], function (err) {
+ socketTopics.markAsRead({ uid: adminUid }, [tid], function (err) {
assert.ifError(err);
topics.hasReadTopic(tid, adminUid, function (err, hasRead) {
assert.ifError(err);
@@ -855,7 +1017,7 @@ describe('Topic\'s', function () {
});
it('should fail with invalid data', function (done) {
- socketTopics.markTopicNotificationsRead({uid: 0}, null, function (err) {
+ socketTopics.markTopicNotificationsRead({ uid: 0 }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -866,10 +1028,10 @@ describe('Topic\'s', function () {
async.waterfall([
function (next) {
- socketTopics.follow({uid: adminUid}, tid, next);
+ socketTopics.follow({ uid: adminUid }, tid, next);
},
function (next) {
- socketPosts.reply({uid: uid}, {content: 'some content', tid: tid}, next);
+ socketPosts.reply({ uid: uid }, { content: 'some content', tid: tid }, next);
},
function (data, next) {
setTimeout(next, 2500);
@@ -879,7 +1041,7 @@ describe('Topic\'s', function () {
},
function (count, next) {
assert.equal(count, 1);
- socketTopics.markTopicNotificationsRead({uid: adminUid}, [tid], next);
+ socketTopics.markTopicNotificationsRead({ uid: adminUid }, [tid], next);
},
function (next) {
User.notifications.getUnreadCount(adminUid, next);
@@ -887,7 +1049,7 @@ describe('Topic\'s', function () {
function (count, next) {
assert.equal(count, 0);
next();
- }
+ },
], function (err) {
assert.ifError(err);
done();
@@ -895,16 +1057,16 @@ describe('Topic\'s', function () {
});
it('should fail with invalid data', function (done) {
- socketTopics.markAllRead({uid: 0}, null, function (err) {
+ socketTopics.markAllRead({ uid: 0 }, null, function (err) {
assert.equal(err.message, '[[error:invalid-uid]]');
done();
});
});
it('should mark all read', function (done) {
- socketTopics.markUnread({uid: adminUid}, tid, function (err) {
+ socketTopics.markUnread({ uid: adminUid }, tid, function (err) {
assert.ifError(err);
- socketTopics.markAllRead({uid: adminUid}, {}, function (err) {
+ socketTopics.markAllRead({ uid: adminUid }, {}, function (err) {
assert.ifError(err);
topics.hasReadTopic(tid, adminUid, function (err, hasRead) {
assert.ifError(err);
@@ -916,9 +1078,9 @@ describe('Topic\'s', function () {
});
it('should mark all read', function (done) {
- socketTopics.markUnread({uid: adminUid}, tid, function (err) {
+ socketTopics.markUnread({ uid: adminUid }, tid, function (err) {
assert.ifError(err);
- socketTopics.markCategoryTopicsRead({uid: adminUid}, topic.categoryId, function (err) {
+ socketTopics.markCategoryTopicsRead({ uid: adminUid }, topic.categoryId, function (err) {
assert.ifError(err);
topics.hasReadTopic(tid, adminUid, function (err, hasRead) {
assert.ifError(err);
@@ -931,35 +1093,35 @@ describe('Topic\'s', function () {
it('should fail with invalid data', function (done) {
- socketTopics.markAsUnreadForAll({uid: adminUid}, null, function (err) {
+ socketTopics.markAsUnreadForAll({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-tid]]');
done();
});
});
it('should fail with invalid data', function (done) {
- socketTopics.markAsUnreadForAll({uid: 0}, [tid], function (err) {
+ socketTopics.markAsUnreadForAll({ uid: 0 }, [tid], function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should fail if user is not admin', function (done) {
- socketTopics.markAsUnreadForAll({uid: uid}, [tid], function (err) {
+ socketTopics.markAsUnreadForAll({ uid: uid }, [tid], function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
});
it('should fail if topic does not exist', function (done) {
- socketTopics.markAsUnreadForAll({uid: uid}, [12312313], function (err) {
+ socketTopics.markAsUnreadForAll({ uid: uid }, [12312313], function (err) {
assert.equal(err.message, '[[error:no-topic]]');
done();
});
});
it('should mark topic unread for everyone', function (done) {
- socketTopics.markAsUnreadForAll({uid: adminUid}, [tid], function (err) {
+ socketTopics.markAsUnreadForAll({ uid: adminUid }, [tid], function (err) {
assert.ifError(err);
async.parallel({
adminRead: function (next) {
@@ -967,7 +1129,7 @@ describe('Topic\'s', function () {
},
regularRead: function (next) {
topics.hasReadTopic(tid, uid, next);
- }
+ },
}, function (err, results) {
assert.ifError(err);
assert.equal(results.adminRead, false);
@@ -985,11 +1147,11 @@ describe('Topic\'s', function () {
before(function (done) {
async.parallel({
topic1: function (next) {
- topics.post({uid: adminUid, tags: ['php', 'nosql', 'psql', 'nodebb'], title: 'topic title 1', content: 'topic 1 content', cid: topic.categoryId}, next);
+ topics.post({ uid: adminUid, tags: ['php', 'nosql', 'psql', 'nodebb'], title: 'topic title 1', content: 'topic 1 content', cid: topic.categoryId }, next);
},
topic2: function (next) {
- topics.post({uid: adminUid, tags: ['javascript', 'mysql', 'python', 'nodejs'], title: 'topic title 2', content: 'topic 2 content', cid: topic.categoryId}, next);
- }
+ topics.post({ uid: adminUid, tags: ['javascript', 'mysql', 'python', 'nodejs'], title: 'topic title 2', content: 'topic 2 content', cid: topic.categoryId }, next);
+ },
}, function (err) {
assert.ifError(err);
done();
@@ -997,7 +1159,7 @@ describe('Topic\'s', function () {
});
it('should return empty array if query is falsy', function (done) {
- socketTopics.autocompleteTags({uid: adminUid}, {query: ''}, function (err, data) {
+ socketTopics.autocompleteTags({ uid: adminUid }, { query: '' }, function (err, data) {
assert.ifError(err);
assert.deepEqual([], data);
done();
@@ -1005,7 +1167,7 @@ describe('Topic\'s', function () {
});
it('should autocomplete tags', function (done) {
- socketTopics.autocompleteTags({uid: adminUid}, {query: 'p'}, function (err, data) {
+ socketTopics.autocompleteTags({ uid: adminUid }, { query: 'p' }, function (err, data) {
assert.ifError(err);
['php', 'psql', 'python'].forEach(function (tag) {
assert.notEqual(data.indexOf(tag), -1);
@@ -1015,7 +1177,7 @@ describe('Topic\'s', function () {
});
it('should return empty array if query is falsy', function (done) {
- socketTopics.searchTags({uid: adminUid}, {query: ''}, function (err, data) {
+ socketTopics.searchTags({ uid: adminUid }, { query: '' }, function (err, data) {
assert.ifError(err);
assert.deepEqual([], data);
done();
@@ -1023,7 +1185,7 @@ describe('Topic\'s', function () {
});
it('should search tags', function (done) {
- socketTopics.searchTags({uid: adminUid}, {query: 'no'}, function (err, data) {
+ socketTopics.searchTags({ uid: adminUid }, { query: 'no' }, function (err, data) {
assert.ifError(err);
['nodebb', 'nodejs', 'nosql'].forEach(function (tag) {
assert.notEqual(data.indexOf(tag), -1);
@@ -1033,7 +1195,7 @@ describe('Topic\'s', function () {
});
it('should return empty array if query is falsy', function (done) {
- socketTopics.searchAndLoadTags({uid: adminUid}, {query: ''}, function (err, data) {
+ socketTopics.searchAndLoadTags({ uid: adminUid }, { query: '' }, function (err, data) {
assert.ifError(err);
assert.equal(data.matchCount, 0);
assert.equal(data.pageCount, 1);
@@ -1043,14 +1205,14 @@ describe('Topic\'s', function () {
});
it('should search and load tags', function (done) {
- socketTopics.searchAndLoadTags({uid: adminUid}, {query: 'no'}, function (err, data) {
+ socketTopics.searchAndLoadTags({ uid: adminUid }, { query: 'no' }, function (err, data) {
assert.ifError(err);
assert.equal(data.matchCount, 3);
assert.equal(data.pageCount, 1);
var tagData = [
{ value: 'nodebb', color: '', bgColor: '', score: 3 },
{ value: 'nodejs', color: '', bgColor: '', score: 1 },
- { value: 'nosql', color: '', bgColor: '', score: 1 }
+ { value: 'nosql', color: '', bgColor: '', score: 1 },
];
assert.deepEqual(data.tags, tagData);
@@ -1059,14 +1221,14 @@ describe('Topic\'s', function () {
});
it('should return error if data is invalid', function (done) {
- socketTopics.loadMoreTags({uid: adminUid}, {after: 'asd'}, function (err) {
+ socketTopics.loadMoreTags({ uid: adminUid }, { after: 'asd' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should load more tags', function (done) {
- socketTopics.loadMoreTags({uid: adminUid}, {after: 0}, function (err, data) {
+ socketTopics.loadMoreTags({ uid: adminUid }, { after: 0 }, function (err, data) {
assert.ifError(err);
assert(Array.isArray(data.tags));
assert.equal(data.nextStart, 100);
@@ -1075,28 +1237,28 @@ describe('Topic\'s', function () {
});
it('should error if data is invalid', function (done) {
- socketAdmin.tags.create({uid: adminUid}, null, function (err) {
+ socketAdmin.tags.create({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error if tag is invalid', function (done) {
- socketAdmin.tags.create({uid: adminUid}, {tag: ''}, function (err) {
+ socketAdmin.tags.create({ uid: adminUid }, { tag: '' }, function (err) {
assert.equal(err.message, '[[error:invalid-tag]]');
done();
});
});
it('should error if tag is too short', function (done) {
- socketAdmin.tags.create({uid: adminUid}, {tag: 'as'}, function (err) {
+ socketAdmin.tags.create({ uid: adminUid }, { tag: 'as' }, function (err) {
assert.equal(err.message, '[[error:tag-too-short]]');
done();
});
});
it('should create empty tag', function (done) {
- socketAdmin.tags.create({uid: adminUid}, {tag: 'emptytag'}, function (err) {
+ socketAdmin.tags.create({ uid: adminUid }, { tag: 'emptytag' }, function (err) {
assert.ifError(err);
db.sortedSetScore('tags:topic:count', 'emptytag', function (err, score) {
assert.ifError(err);
@@ -1107,7 +1269,7 @@ describe('Topic\'s', function () {
});
it('should do nothing if tag exists', function (done) {
- socketAdmin.tags.create({uid: adminUid}, {tag: 'emptytag'}, function (err) {
+ socketAdmin.tags.create({ uid: adminUid }, { tag: 'emptytag' }, function (err) {
assert.ifError(err);
db.sortedSetScore('tags:topic:count', 'emptytag', function (err, score) {
assert.ifError(err);
@@ -1118,16 +1280,16 @@ describe('Topic\'s', function () {
});
it('should error if data is invalid', function (done) {
- socketAdmin.tags.update({uid: adminUid}, null, function (err) {
+ socketAdmin.tags.update({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error if data.tag is invalid', function (done) {
- socketAdmin.tags.update({uid: adminUid}, {
+ socketAdmin.tags.update({ uid: adminUid }, {
bgColor: '#ff0000',
- color: '#00ff00'
+ color: '#00ff00',
}, function (err) {
assert.equal(err.message, '[[error:invalid-tag]]');
done();
@@ -1135,10 +1297,10 @@ describe('Topic\'s', function () {
});
it('should update tag', function (done) {
- socketAdmin.tags.update({uid: adminUid}, {
+ socketAdmin.tags.update({ uid: adminUid }, {
tag: 'emptytag',
bgColor: '#ff0000',
- color: '#00ff00'
+ color: '#00ff00',
}, function (err) {
assert.ifError(err);
db.getObject('tag:emptytag', function (err, data) {
@@ -1154,7 +1316,7 @@ describe('Topic\'s', function () {
var meta = require('../src/meta');
meta.config.maximumRelatedTopics = 2;
var topicData = {
- tags: [{value: 'javascript'}]
+ tags: [{ value: 'javascript' }],
};
topics.getRelatedTopics(topicData, 0, function (err, data) {
assert.ifError(err);
@@ -1166,23 +1328,23 @@ describe('Topic\'s', function () {
});
it('should return error with invalid data', function (done) {
- socketAdmin.tags.deleteTags({uid: adminUid}, null, function (err) {
+ socketAdmin.tags.deleteTags({ uid: adminUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should do nothing if arrays is empty', function (done) {
- socketAdmin.tags.deleteTags({uid: adminUid}, {tags: []}, function (err) {
+ socketAdmin.tags.deleteTags({ uid: adminUid }, { tags: [] }, function (err) {
assert.ifError(err);
done();
});
});
it('should delete tags', function (done) {
- socketAdmin.tags.create({uid: adminUid}, {tag: 'emptytag2'}, function (err) {
+ socketAdmin.tags.create({ uid: adminUid }, { tag: 'emptytag2' }, function (err) {
assert.ifError(err);
- socketAdmin.tags.deleteTags({uid: adminUid}, {tags: ['emptytag', 'emptytag2', 'nodebb', 'nodejs']}, function (err) {
+ socketAdmin.tags.deleteTags({ uid: adminUid }, { tags: ['emptytag', 'emptytag2', 'nodebb', 'nodejs'] }, function (err) {
assert.ifError(err);
db.getObjects(['tag:emptytag', 'tag:emptytag2'], function (err, data) {
assert.ifError(err);
@@ -1211,12 +1373,12 @@ describe('Topic\'s', function () {
var tid;
var followerUid;
before(function (done) {
- User.create({username: 'follower'}, function (err, uid) {
+ User.create({ username: 'follower' }, function (err, uid) {
if (err) {
return done(err);
}
followerUid = uid;
- topics.post({uid: adminUid, title: 'topic title', content: 'some content', cid: topic.categoryId}, function (err, result) {
+ topics.post({ uid: adminUid, title: 'topic title', content: 'some content', cid: topic.categoryId }, function (err, result) {
if (err) {
return done(err);
}
@@ -1227,7 +1389,7 @@ describe('Topic\'s', function () {
});
it('should filter ignoring uids', function (done) {
- socketTopics.changeWatching({uid: followerUid}, {tid: tid, type: 'ignore'}, function (err) {
+ socketTopics.changeWatching({ uid: followerUid }, { tid: tid, type: 'ignore' }, function (err) {
assert.ifError(err);
topics.filterIgnoringUids(tid, [adminUid, followerUid], function (err, uids) {
assert.ifError(err);
@@ -1239,14 +1401,14 @@ describe('Topic\'s', function () {
});
it('should error with invalid data', function (done) {
- socketTopics.changeWatching({uid: followerUid}, {}, function (err) {
+ socketTopics.changeWatching({ uid: followerUid }, {}, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should error with invalid type', function (done) {
- socketTopics.changeWatching({uid: followerUid}, {tid: tid, type: 'derp'}, function (err) {
+ socketTopics.changeWatching({ uid: followerUid }, { tid: tid, type: 'derp' }, function (err) {
assert.equal(err.message, '[[error:invalid-command]]');
done();
});
diff --git a/test/translator.js b/test/translator.js
index 17affe1700..6411d01992 100644
--- a/test/translator.js
+++ b/test/translator.js
@@ -1,5 +1,5 @@
'use strict';
-/*global require*/
+
var assert = require('assert');
var shim = require('../public/src/modules/translator.js');
@@ -120,7 +120,7 @@ describe('new Translator(language)', function () {
var translator = Translator.create('en-GB');
var title = 'Test 1\\, 2\\, 3 %2 salmon';
- var key = "[[topic:composer.replying_to, " + title + "]]";
+ var key = '[[topic:composer.replying_to, ' + title + ']]';
return translator.translate(key).then(function (translated) {
assert.strictEqual(translated, 'Replying to Test 1, 2, 3 %2 salmon');
});
@@ -130,7 +130,7 @@ describe('new Translator(language)', function () {
var translator = Translator.create('en-GB');
var title = '3 % salmon';
- var key = "[[topic:composer.replying_to, " + title + "]]";
+ var key = '[[topic:composer.replying_to, ' + title + ']]';
return translator.translate(key).then(function (translated) {
assert.strictEqual(translated, 'Replying to 3 % salmon');
});
diff --git a/test/uploads.js b/test/uploads.js
index f8a3738c8f..0c4ca8d1d6 100644
--- a/test/uploads.js
+++ b/test/uploads.js
@@ -16,7 +16,6 @@ var helpers = require('./helpers');
describe('Upload Controllers', function () {
-
var tid;
var cid;
var pid;
@@ -28,15 +27,15 @@ describe('Upload Controllers', function () {
category: function (next) {
categories.create({
name: 'Test Category',
- description: 'Test category created by testing script'
+ description: 'Test category created by testing script',
}, next);
},
adminUid: function (next) {
- user.create({username: 'admin', password: 'barbar'}, next);
+ user.create({ username: 'admin', password: 'barbar' }, next);
},
regularUid: function (next) {
- user.create({username: 'regular', password: 'zugzug'}, next);
- }
+ user.create({ username: 'regular', password: 'zugzug' }, next);
+ },
}, function (err, results) {
if (err) {
return done(err);
@@ -45,7 +44,7 @@ describe('Upload Controllers', function () {
regularUid = results.regularUid;
cid = results.category.cid;
- topics.post({uid: adminUid, title: 'test topic title', content: 'test topic content', cid: results.category.cid}, function (err, result) {
+ topics.post({ uid: adminUid, title: 'test topic title', content: 'test topic content', cid: results.category.cid }, function (err, result) {
tid = result.topicData.tid;
pid = result.postData.pid;
done(err);
@@ -78,12 +77,26 @@ describe('Upload Controllers', function () {
});
it('should upload an image to a post', function (done) {
- helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/test.png'), {cid: cid}, jar, csrf_token, function (err, res, body) {
+ helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/test.png'), { cid: cid }, jar, csrf_token, function (err, res, body) {
+ assert.ifError(err);
+ assert.equal(res.statusCode, 200);
+ assert(Array.isArray(body));
+ assert(body[0].path);
+ assert(body[0].url);
+ done();
+ });
+ });
+
+ it('should resize and upload an image to a post', function (done) {
+ var oldValue = meta.config.maximumImageWidth;
+ meta.config.maximumImageWidth = 10;
+ helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/test.png'), { cid: cid }, jar, csrf_token, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(Array.isArray(body));
assert(body[0].path);
assert(body[0].url);
+ meta.config.maximumImageWidth = oldValue;
done();
});
});
@@ -91,7 +104,7 @@ describe('Upload Controllers', function () {
it('should upload a file to a post', function (done) {
meta.config.allowFileUploads = 1;
- helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/503.html'), {cid: cid}, jar, csrf_token, function (err, res, body) {
+ helpers.uploadFile(nconf.get('url') + '/api/post/upload', path.join(__dirname, '../test/files/503.html'), { cid: cid }, jar, csrf_token, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(Array.isArray(body));
@@ -101,6 +114,36 @@ describe('Upload Controllers', function () {
});
});
+ it('should fail if topic thumbs are disabled', function (done) {
+ helpers.uploadFile(nconf.get('url') + '/api/topic/thumb/upload', path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) {
+ assert.ifError(err);
+ assert.equal(res.statusCode, 500);
+ assert.equal(body.error, '[[error:topic-thumbnails-are-disabled]]');
+ done();
+ });
+ });
+
+ it('should fail if file is not image', function (done) {
+ meta.config.allowTopicsThumbnail = 1;
+ helpers.uploadFile(nconf.get('url') + '/api/topic/thumb/upload', path.join(__dirname, '../test/files/503.html'), {}, jar, csrf_token, function (err, res, body) {
+ assert.ifError(err);
+ assert.equal(res.statusCode, 500);
+ assert.equal(body.error, '[[error:invalid-file]]');
+ done();
+ });
+ });
+
+ it('should upload topic thumb', function (done) {
+ meta.config.allowTopicsThumbnail = 1;
+ helpers.uploadFile(nconf.get('url') + '/api/topic/thumb/upload', path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token, function (err, res, body) {
+ assert.ifError(err);
+ assert.equal(res.statusCode, 200);
+ assert(Array.isArray(body));
+ assert(body[0].path);
+ assert(body[0].url);
+ done();
+ });
+ });
});
@@ -128,7 +171,7 @@ describe('Upload Controllers', function () {
});
it('should upload category image', function (done) {
- helpers.uploadFile(nconf.get('url') + '/api/admin/category/uploadpicture', path.join(__dirname, '../test/files/test.png'), {params: JSON.stringify({cid: cid})}, jar, csrf_token, function (err, res, body) {
+ helpers.uploadFile(nconf.get('url') + '/api/admin/category/uploadpicture', path.join(__dirname, '../test/files/test.png'), { params: JSON.stringify({ cid: cid }) }, jar, csrf_token, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(Array.isArray(body));
@@ -159,8 +202,6 @@ describe('Upload Controllers', function () {
});
-
-
after(function (done) {
db.emptydb(done);
});
diff --git a/test/user.js b/test/user.js
index 70334d04e1..00794b3d0e 100644
--- a/test/user.js
+++ b/test/user.js
@@ -23,13 +23,12 @@ describe('User', function () {
var testCid;
before(function (done) {
-
groups.resetCache();
Categories.create({
name: 'Test Category',
description: 'A test',
- order: 1
+ order: 1,
}, function (err, categoryObj) {
if (err) {
return done(err);
@@ -46,14 +45,14 @@ describe('User', function () {
fullname: 'John Smith McNamara',
password: 'swordfish',
email: 'john@example.com',
- callback: undefined
+ callback: undefined,
};
});
describe('.create(), when created', function () {
it('should be created properly', function (done) {
- User.create({username: userData.username, password: userData.password, email: userData.email}, function (error,userId) {
+ User.create({ username: userData.username, password: userData.password, email: userData.email }, function (error, userId) {
assert.equal(error, null, 'was created with error');
assert.ok(userId);
@@ -63,7 +62,7 @@ describe('User', function () {
});
it('should have a valid email, if using an email', function (done) {
- User.create({username: userData.username, password: userData.password, email: 'fakeMail'},function (err) {
+ User.create({ username: userData.username, password: userData.password, email: 'fakeMail' }, function (err) {
assert(err);
assert.equal(err.message, '[[error:invalid-email]]');
done();
@@ -109,14 +108,14 @@ describe('User', function () {
uid: testUid,
title: 'Topic 1',
content: 'lorem ipsum',
- cid: testCid
+ cid: testCid,
}),
async.apply(Topics.post, {
uid: testUid,
title: 'Topic 2',
content: 'lorem ipsum',
- cid: testCid
- })
+ cid: testCid,
+ }),
], function (err) {
assert(err);
done();
@@ -129,7 +128,7 @@ describe('User', function () {
uid: testUid,
title: 'Topic 3',
content: 'lorem ipsum',
- cid: testCid
+ cid: testCid,
}, function (err) {
assert.ifError(err);
done();
@@ -146,7 +145,7 @@ describe('User', function () {
uid: testUid,
title: 'Topic 4',
content: 'lorem ipsum',
- cid: testCid
+ cid: testCid,
}, function (err) {
assert(err);
done();
@@ -156,14 +155,14 @@ describe('User', function () {
it('should not error if a non-newbie user posts if the last post time is 10 < 30 seconds', function (done) {
User.setUserFields(testUid, {
- lastposttime: +new Date() - (20 * 1000),
- reputation: 10
+ lastposttime: +new Date() - (20 * 1000),
+ reputation: 10,
}, function () {
Topics.post({
uid: testUid,
title: 'Topic 5',
content: 'lorem ipsum',
- cid: testCid
+ cid: testCid,
}, function (err) {
assert.ifError(err);
done();
@@ -175,7 +174,7 @@ describe('User', function () {
describe('.search()', function () {
var socketUser = require('../src/socket.io/user');
it('should return an object containing an array of matching users', function (done) {
- User.search({query: 'john'}, function (err, searchData) {
+ User.search({ query: 'john' }, function (err, searchData) {
assert.ifError(err);
assert.equal(Array.isArray(searchData.users) && searchData.users.length > 0, true);
assert.equal(searchData.users[0].username, 'John Smith');
@@ -184,7 +183,7 @@ describe('User', function () {
});
it('should search user', function (done) {
- socketUser.search({uid: testUid}, {query: 'john'}, function (err, searchData) {
+ socketUser.search({ uid: testUid }, { query: 'john' }, function (err, searchData) {
assert.ifError(err);
assert.equal(searchData.users[0].username, 'John Smith');
done();
@@ -193,7 +192,7 @@ describe('User', function () {
it('should error for guest', function (done) {
Meta.config.allowGuestUserSearching = 0;
- socketUser.search({uid: 0}, {query: 'john'}, function (err) {
+ socketUser.search({ uid: 0 }, { query: 'john' }, function (err) {
assert.equal(err.message, '[[error:not-logged-in]]');
Meta.config.allowGuestUserSearching = 1;
done();
@@ -201,7 +200,7 @@ describe('User', function () {
});
it('should error with invalid data', function (done) {
- socketUser.search({uid: testUid}, null, function (err) {
+ socketUser.search({ uid: testUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -211,7 +210,7 @@ describe('User', function () {
describe('.delete()', function () {
var uid;
before(function (done) {
- User.create({username: 'usertodelete', password: '123456', email: 'delete@me.com'}, function (err, newUid) {
+ User.create({ username: 'usertodelete', password: '123456', email: 'delete@me.com' }, function (err, newUid) {
assert.ifError(err);
uid = newUid;
done();
@@ -231,10 +230,10 @@ describe('User', function () {
});
describe('passwordReset', function () {
- var uid,
- code;
+ var uid;
+ var code;
before(function (done) {
- User.create({username: 'resetuser', password: '123456', email: 'reset@me.com'}, function (err, newUid) {
+ User.create({ username: 'resetuser', password: '123456', email: 'reset@me.com' }, function (err, newUid) {
assert.ifError(err);
uid = newUid;
done();
@@ -293,7 +292,6 @@ describe('User', function () {
});
describe('hash methods', function () {
-
it('should return uid from email', function (done) {
User.getUidByEmail('john@example.com', function (err, uid) {
assert.ifError(err);
@@ -345,7 +343,7 @@ describe('User', function () {
var io;
before(function (done) {
- User.create({username: 'updateprofile', email: 'update@me.com', password: '123456'}, function (err, newUid) {
+ User.create({ username: 'updateprofile', email: 'update@me.com', password: '123456' }, function (err, newUid) {
assert.ifError(err);
uid = newUid;
helpers.loginUser('updateprofile', '123456', function (err, _jar, _io) {
@@ -365,7 +363,7 @@ describe('User', function () {
});
it('should return error if data is missing uid', function (done) {
- io.emit('user.updateProfile', {username: 'bip', email: 'bop'}, function (err) {
+ io.emit('user.updateProfile', { username: 'bip', email: 'bop' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -381,14 +379,14 @@ describe('User', function () {
location: 'izmir',
groupTitle: 'testGroup',
birthday: '01/01/1980',
- signature: 'nodebb is good'
+ signature: 'nodebb is good',
};
io.emit('user.updateProfile', data, function (err, result) {
assert.ifError(err);
- assert.equal(result.username, 'updatedUserName');
- assert.equal(result.userslug, 'updatedusername');
- assert.equal(result.email, 'updatedEmail@me.com');
+ assert.equal(result.username, 'updatedUserName');
+ assert.equal(result.userslug, 'updatedusername');
+ assert.equal(result.email, 'updatedEmail@me.com');
db.getObject('user:' + uid, function (err, userData) {
assert.ifError(err);
@@ -402,7 +400,7 @@ describe('User', function () {
it('should change a user\'s password', function (done) {
this.timeout(20000);
- io.emit('user.changePassword', {uid: uid, newPassword: '654321', currentPassword: '123456'}, function (err) {
+ io.emit('user.changePassword', { uid: uid, newPassword: '654321', currentPassword: '123456' }, function (err) {
assert.ifError(err);
User.isPasswordCorrect(uid, '654321', function (err, correct) {
assert.ifError(err);
@@ -413,7 +411,7 @@ describe('User', function () {
});
it('should change username', function (done) {
- io.emit('user.changeUsernameEmail', {uid: uid, username: 'updatedAgain', password: '654321'}, function (err) {
+ io.emit('user.changeUsernameEmail', { uid: uid, username: 'updatedAgain', password: '654321' }, function (err) {
assert.ifError(err);
db.getObjectField('user:' + uid, 'username', function (err, username) {
assert.ifError(err);
@@ -424,7 +422,7 @@ describe('User', function () {
});
it('should change email', function (done) {
- io.emit('user.changeUsernameEmail', {uid: uid, email: 'updatedAgain@me.com', password: '654321'}, function (err) {
+ io.emit('user.changeUsernameEmail', { uid: uid, email: 'updatedAgain@me.com', password: '654321' }, function (err) {
assert.ifError(err);
db.getObjectField('user:' + uid, 'email', function (err, email) {
assert.ifError(err);
@@ -437,7 +435,7 @@ describe('User', function () {
it('should update cover image', function (done) {
var imageData = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAACXBIWXMAAC4jAAAuIwF4pT92AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACcJJREFUeNqMl9tvnNV6xn/f+s5z8DCeg88Zj+NYdhJH4KShFoJAIkzVphLVJnsDaiV6gUKaC2qQUFVATbnoValAakuQYKMqBKUUJCgI9XBBSmOROMqGoCStHbA9sWM7nrFn/I3n9B17kcwoabfarj9gvet53+d9nmdJAwMDAAgh8DyPtbU1XNfFMAwkScK2bTzPw/M8dF1/SAhxKAiCxxVF2aeqqqTr+q+Af+7o6Ch0d3f/69TU1KwkSRiGwbFjx3jmmWd47rnn+OGHH1BVFYX/5QRBkPQ87xeSJP22YRi/oapqStM0PM/D931kWSYIgnHf98cXFxepVqtomjZt2/Zf2bb990EQ4Pv+PXfeU1CSpGYhfN9/TgjxQTQaJQgCwuEwQRBQKpUwDAPTNPF9n0ajAYDv+8zPzzM+Pr6/Wq2eqdVqfxOJRA6Zpnn57hrivyEC0IQQZ4Mg+MAwDCKRCJIkUa/XEUIQi8XQNI1QKIQkSQghUBQFIQSmaTI7OwtAuVxOTE9Pfzc9Pf27lUqlBUgulUoUi0VKpRKqqg4EQfAfiqLsDIfDAC0E4XCYaDSKEALXdalUKvfM1/d9hBBYlkUul2N4eJi3335bcl33mW+++aaUz+cvSJKE8uKLL6JpGo7j8Omnn/7d+vp6sr+/HyEEjuMgyzKu6yJJEsViEVVV8TyPjY2NVisV5fZkTNMkkUhw8+ZN6vU6Kysr7Nmzh9OnT7/12GOPDS8sLByT7rQR4A9XV1d/+cILLzA9PU0kEmF4eBhFUTh//jyWZaHrOkII0uk0jUaDWq1GJpOhWCyysrLC1tYWnuehqir79+9H13W6urp48803+f7773n++ef/4G7S/H4ikUCSJNbX11trcuvWLcrlMrIs4zgODzzwABMTE/i+T7lcpq2tjUqlwubmJrZts7y8jBCCkZERGo0G2WyWkydPkkql6Onp+eMmwihwc3JyMvrWW2+RTCYBcF0XWZbRdZ3l5WX27NnD008/TSwWQ1VVyuVy63GhUIhEIkEqlcJxHCzLIhaLMTQ0xJkzZ7Btm3379lmS53kIIczZ2dnFsbGxRK1Wo729HQDP8zAMg5WVFXp7e5mcnKSzs5N8Po/rutTrdVzXbQmHrutEo1FM00RVVXp7e0kkEgRBwMWLF9F1vaxUq1UikUjtlVdeuV6pVBJ9fX3Ytn2bwrLMysoKXV1dTE5OkslksCwLTdMwDANVVdnY2CAIApLJJJFIBMdxiMfj7Nq1C1VViUajLQCvvvrqkhKJRJiZmfmdb7/99jeTySSyLLfWodFoEAqFOH78OLt37yaXy2GaJoqisLy8zNTUFFevXiUIAtrb29m5cyePPPJIa+cymQz1eh2A0dFRCoXCsgIwNTW1J5/P093dTbFYRJZlJEmiWq1y4MABxsbGqNVqhEIh6vU6QRBQLpcxDIPh4WE8z2NxcZFTp05x7tw5Xn755ZY6dXZ2tliZzWa/EwD1ev3RsbExxsfHSafTVCoVGo0Gqqqya9cuIpEIQgh832dtbY3FxUUA+vr62LZtG2NjYxw5coTDhw+ztLTEyZMnuXr1KoVC4R4d3bt375R84sQJEY/H/2Jubq7N9326urqwbZt6vY5pmhw5coS+vr4W9YvFIrdu3WJqagohBFeuXOHcuXOtue7evRtN01rtfO+991haWmJkZGQrkUi8JIC9iqL0BkFAIpFACMETTzxBV1cXiUSC7u5uHMfB8zyCIMA0TeLxONlsFlmW8X2fwcFBHMdhfn6eer1Oe3s7Dz30EBMTE1y6dImjR49y6tSppR07dqwrjuM8+OWXXzI0NMTly5e5du0aQ0NDTExMkMvlCIKAIAhaIh2LxQiHw0QiEfL5POl0mlqtRq1Wo6OjA8uykGWZdDrN0tISvb29vPPOOzz++OPk83lELpf7rXfffRfDMOjo6MBxHEqlEocOHWLHjh00Gg0kSULTNIS4bS6qqhKPxxkaGmJ4eJjR0VH279/PwMAA27dvJ5vN4vs+X331FR9//DGzs7OEQiE++eQTlPb29keuX7/OtWvXOH78ONVqlZs3b9LW1kYmk8F13dZeCiGQJAnXdRFCYBgGsiwjhMC2bQqFAkEQoOs6P/74Iw8++CCDg4Pous6xY8f47LPPkIIguDo2Nrbzxo0bfPjhh9i2zczMTHNvcF2XpsZalkWj0cB1Xe4o1O3YoCisra3x008/EY/H6erqAuDAgQNEIhGCIODQoUP/ubCwMCKAjx599FHW19f56KOP6OjooFgsks/niUajKIqCbds4joMQAiFESxxs226xd2Zmhng8Tl9fH67r0mg0sG2bbDZLpVIhl8vd5gHwtysrKy8Dcdd1mZubo6enh1gsRrVabZlrk6VND/R9n3q9TqVSQdd1QqEQi4uLnD9/nlKpxODgIHv37gXAcRyCICiFQiHEzp07i1988cUfKYpCIpHANE22b9/eUhNFUVotDIKghc7zPCzLolKpsLW1RVtbG0EQ4DgOmqbR09NDM1qUSiWAPwdQ7ujjmf7+/kQymfxrSZJQVZWtra2WG+i63iKH53m4rku1WqVcLmNZFu3t7S2x7+/vJ51O89prr7VYfenSpcPAP1UqFeSHH36YeDxOKpW6eP/9988Bv9d09nw+T7VapVKptJjZnE2tVmNtbY1cLke5XGZra4vNzU16enp49tlnGRgYaD7iTxqNxgexWIzDhw+jNEPQHV87NT8/f+PChQtnR0ZGqFarrUVuOsDds2u2b2FhgVQqRSQSYWFhgStXrtDf308ymcwBf3nw4EEOHjx4O5c2lURVVRzHYXp6+t8uX7785IULFz7LZDLous59991HOBy+h31N9xgdHSWTyVCtVhkaGmLfvn1MT08zPz/PzMzM6c8//9xr+uE9QViWZer1OhsbGxiG8fns7OzPc7ncx729vXR3d1OpVNi2bRuhUAhZljEMA9/3sW0bVVVZWlri4sWLjI+P8/rrr/P111/z5JNPXrIs69cn76ZeGoaBpmm0tbX9Q6FQeHhubu7fC4UCkUiE1dVVstks8Xgc0zSRZZlGo9ESAdM02djYoNFo8MYbb2BZ1mYoFOKuZPjr/xZBEHCHred83x/b3Nz8l/X19aRlWWxsbNDZ2cnw8DDhcBjf96lWq/T09HD06FGeeuopXnrpJc6ePUs6nb4hhPi/C959ZFn+TtO0lG3bJ0ql0p85jsPW1haFQoG2tjYkSWpF/Uwmw9raGu+//z7A977vX2+GrP93wSZiTdNOGIbxy3K5/DPHcfYXCoVe27Yzpmm2m6bppVKp/Orqqnv69OmoZVn/mEwm/9TzvP9x138NAMpJ4VFTBr6SAAAAAElFTkSuQmCC';
var position = '50.0301% 19.2464%';
- io.emit('user.updateCover', {uid: uid, imageData: imageData, position: position}, function (err, result) {
+ io.emit('user.updateCover', { uid: uid, imageData: imageData, position: position }, function (err, result) {
assert.ifError(err);
assert(result.url);
db.getObjectFields('user:' + uid, ['cover:url', 'cover:position'], function (err, data) {
@@ -452,7 +450,7 @@ describe('User', function () {
it('should upload cropped profile picture', function (done) {
var imageData = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAACXBIWXMAAC4jAAAuIwF4pT92AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACcJJREFUeNqMl9tvnNV6xn/f+s5z8DCeg88Zj+NYdhJH4KShFoJAIkzVphLVJnsDaiV6gUKaC2qQUFVATbnoValAakuQYKMqBKUUJCgI9XBBSmOROMqGoCStHbA9sWM7nrFn/I3n9B17kcwoabfarj9gvet53+d9nmdJAwMDAAgh8DyPtbU1XNfFMAwkScK2bTzPw/M8dF1/SAhxKAiCxxVF2aeqqqTr+q+Af+7o6Ch0d3f/69TU1KwkSRiGwbFjx3jmmWd47rnn+OGHH1BVFYX/5QRBkPQ87xeSJP22YRi/oapqStM0PM/D931kWSYIgnHf98cXFxepVqtomjZt2/Zf2bb990EQ4Pv+PXfeU1CSpGYhfN9/TgjxQTQaJQgCwuEwQRBQKpUwDAPTNPF9n0ajAYDv+8zPzzM+Pr6/Wq2eqdVqfxOJRA6Zpnn57hrivyEC0IQQZ4Mg+MAwDCKRCJIkUa/XEUIQi8XQNI1QKIQkSQghUBQFIQSmaTI7OwtAuVxOTE9Pfzc9Pf27lUqlBUgulUoUi0VKpRKqqg4EQfAfiqLsDIfDAC0E4XCYaDSKEALXdalUKvfM1/d9hBBYlkUul2N4eJi3335bcl33mW+++aaUz+cvSJKE8uKLL6JpGo7j8Omnn/7d+vp6sr+/HyEEjuMgyzKu6yJJEsViEVVV8TyPjY2NVisV5fZkTNMkkUhw8+ZN6vU6Kysr7Nmzh9OnT7/12GOPDS8sLByT7rQR4A9XV1d/+cILLzA9PU0kEmF4eBhFUTh//jyWZaHrOkII0uk0jUaDWq1GJpOhWCyysrLC1tYWnuehqir79+9H13W6urp48803+f7773n++ef/4G7S/H4ikUCSJNbX11trcuvWLcrlMrIs4zgODzzwABMTE/i+T7lcpq2tjUqlwubmJrZts7y8jBCCkZERGo0G2WyWkydPkkql6Onp+eMmwihwc3JyMvrWW2+RTCYBcF0XWZbRdZ3l5WX27NnD008/TSwWQ1VVyuVy63GhUIhEIkEqlcJxHCzLIhaLMTQ0xJkzZ7Btm3379lmS53kIIczZ2dnFsbGxRK1Wo729HQDP8zAMg5WVFXp7e5mcnKSzs5N8Po/rutTrdVzXbQmHrutEo1FM00RVVXp7e0kkEgRBwMWLF9F1vaxUq1UikUjtlVdeuV6pVBJ9fX3Ytn2bwrLMysoKXV1dTE5OkslksCwLTdMwDANVVdnY2CAIApLJJJFIBMdxiMfj7Nq1C1VViUajLQCvvvrqkhKJRJiZmfmdb7/99jeTySSyLLfWodFoEAqFOH78OLt37yaXy2GaJoqisLy8zNTUFFevXiUIAtrb29m5cyePPPJIa+cymQz1eh2A0dFRCoXCsgIwNTW1J5/P093dTbFYRJZlJEmiWq1y4MABxsbGqNVqhEIh6vU6QRBQLpcxDIPh4WE8z2NxcZFTp05x7tw5Xn755ZY6dXZ2tliZzWa/EwD1ev3RsbExxsfHSafTVCoVGo0Gqqqya9cuIpEIQgh832dtbY3FxUUA+vr62LZtG2NjYxw5coTDhw+ztLTEyZMnuXr1KoVC4R4d3bt375R84sQJEY/H/2Jubq7N9326urqwbZt6vY5pmhw5coS+vr4W9YvFIrdu3WJqagohBFeuXOHcuXOtue7evRtN01rtfO+991haWmJkZGQrkUi8JIC9iqL0BkFAIpFACMETTzxBV1cXiUSC7u5uHMfB8zyCIMA0TeLxONlsFlmW8X2fwcFBHMdhfn6eer1Oe3s7Dz30EBMTE1y6dImjR49y6tSppR07dqwrjuM8+OWXXzI0NMTly5e5du0aQ0NDTExMkMvlCIKAIAhaIh2LxQiHw0QiEfL5POl0mlqtRq1Wo6OjA8uykGWZdDrN0tISvb29vPPOOzz++OPk83lELpf7rXfffRfDMOjo6MBxHEqlEocOHWLHjh00Gg0kSULTNIS4bS6qqhKPxxkaGmJ4eJjR0VH279/PwMAA27dvJ5vN4vs+X331FR9//DGzs7OEQiE++eQTlPb29keuX7/OtWvXOH78ONVqlZs3b9LW1kYmk8F13dZeCiGQJAnXdRFCYBgGsiwjhMC2bQqFAkEQoOs6P/74Iw8++CCDg4Pous6xY8f47LPPkIIguDo2Nrbzxo0bfPjhh9i2zczMTHNvcF2XpsZalkWj0cB1Xe4o1O3YoCisra3x008/EY/H6erqAuDAgQNEIhGCIODQoUP/ubCwMCKAjx599FHW19f56KOP6OjooFgsks/niUajKIqCbds4joMQAiFESxxs226xd2Zmhng8Tl9fH67r0mg0sG2bbDZLpVIhl8vd5gHwtysrKy8Dcdd1mZubo6enh1gsRrVabZlrk6VND/R9n3q9TqVSQdd1QqEQi4uLnD9/nlKpxODgIHv37gXAcRyCICiFQiHEzp07i1988cUfKYpCIpHANE22b9/eUhNFUVotDIKghc7zPCzLolKpsLW1RVtbG0EQ4DgOmqbR09NDM1qUSiWAPwdQ7ujjmf7+/kQymfxrSZJQVZWtra2WG+i63iKH53m4rku1WqVcLmNZFu3t7S2x7+/vJ51O89prr7VYfenSpcPAP1UqFeSHH36YeDxOKpW6eP/9988Bv9d09nw+T7VapVKptJjZnE2tVmNtbY1cLke5XGZra4vNzU16enp49tlnGRgYaD7iTxqNxgexWIzDhw+jNEPQHV87NT8/f+PChQtnR0ZGqFarrUVuOsDds2u2b2FhgVQqRSQSYWFhgStXrtDf308ymcwBf3nw4EEOHjx4O5c2lURVVRzHYXp6+t8uX7785IULFz7LZDLous59991HOBy+h31N9xgdHSWTyVCtVhkaGmLfvn1MT08zPz/PzMzM6c8//9xr+uE9QViWZer1OhsbGxiG8fns7OzPc7ncx729vXR3d1OpVNi2bRuhUAhZljEMA9/3sW0bVVVZWlri4sWLjI+P8/rrr/P111/z5JNPXrIs69cn76ZeGoaBpmm0tbX9Q6FQeHhubu7fC4UCkUiE1dVVstks8Xgc0zSRZZlGo9ESAdM02djYoNFo8MYbb2BZ1mYoFOKuZPjr/xZBEHCHred83x/b3Nz8l/X19aRlWWxsbNDZ2cnw8DDhcBjf96lWq/T09HD06FGeeuopXnrpJc6ePUs6nb4hhPi/C959ZFn+TtO0lG3bJ0ql0p85jsPW1haFQoG2tjYkSWpF/Uwmw9raGu+//z7A977vX2+GrP93wSZiTdNOGIbxy3K5/DPHcfYXCoVe27Yzpmm2m6bppVKp/Orqqnv69OmoZVn/mEwm/9TzvP9x138NAMpJ4VFTBr6SAAAAAElFTkSuQmCC';
var socketUser = require('../src/socket.io/user');
- socketUser.uploadCroppedPicture({uid: uid}, {uid: uid, imageData: imageData}, function (err, result) {
+ socketUser.uploadCroppedPicture({ uid: uid }, { uid: uid, imageData: imageData }, function (err, result) {
assert.ifError(err);
assert(result.url);
db.getObjectFields('user:' + uid, ['uploadedpicture', 'picture'], function (err, data) {
@@ -465,7 +463,7 @@ describe('User', function () {
});
it('should remove cover image', function (done) {
- io.emit('user.removeCover', {uid: uid}, function (err) {
+ io.emit('user.removeCover', { uid: uid }, function (err) {
assert.ifError(err);
db.getObjectField('user:' + uid, 'cover:url', function (err, url) {
assert.ifError(err);
@@ -500,7 +498,7 @@ describe('User', function () {
});
it('should change user picture', function (done) {
- io.emit('user.changePicture', {type: 'default', uid: uid}, function (err) {
+ io.emit('user.changePicture', { type: 'default', uid: uid }, function (err) {
assert.ifError(err);
User.getUserField(uid, 'picture', function (err, picture) {
assert.ifError(err);
@@ -513,21 +511,23 @@ describe('User', function () {
it('should upload profile picture', function (done) {
helpers.copyFile(
path.join(nconf.get('base_dir'), 'test/files/test.png'),
- path.join(nconf.get('base_dir'), 'test/files/test_copy.png'), function (err) {
- assert.ifError(err);
- var picture = {
- path: path.join(nconf.get('base_dir'), 'test/files/test_copy.png'),
- size: 7189,
- name: 'test_copy.png',
- type: 'image/png'
- };
- User.uploadPicture(uid, picture, function (err, uploadedPicture) {
+ path.join(nconf.get('base_dir'), 'test/files/test_copy.png'),
+ function (err) {
assert.ifError(err);
- assert.equal(uploadedPicture.url, '/assets/uploads/profile/' + uid + '-profileavatar.png');
- assert.equal(uploadedPicture.path, path.join(nconf.get('base_dir'), 'public', 'uploads', 'profile', uid + '-profileavatar.png'));
- done();
- });
- });
+ var picture = {
+ path: path.join(nconf.get('base_dir'), 'test/files/test_copy.png'),
+ size: 7189,
+ name: 'test_copy.png',
+ type: 'image/png',
+ };
+ User.uploadPicture(uid, picture, function (err, uploadedPicture) {
+ assert.ifError(err);
+ assert.equal(uploadedPicture.url, '/assets/uploads/profile/' + uid + '-profileavatar.png');
+ assert.equal(uploadedPicture.path, path.join(nconf.get('base_dir'), 'public', 'uploads', 'profile', uid + '-profileavatar.png'));
+ done();
+ });
+ }
+ );
});
it('should return error if profile image uploads disabled', function (done) {
@@ -536,7 +536,7 @@ describe('User', function () {
path: path.join(nconf.get('base_dir'), 'test/files/test.png'),
size: 7189,
name: 'test.png',
- type: 'image/png'
+ type: 'image/png',
};
User.uploadPicture(uid, picture, function (err) {
assert.equal(err.message, '[[error:profile-image-uploads-disabled]]');
@@ -550,7 +550,7 @@ describe('User', function () {
path: path.join(nconf.get('base_dir'), 'test/files/test.png'),
size: 265000,
name: 'test.png',
- type: 'image/png'
+ type: 'image/png',
};
User.uploadPicture(uid, picture, function (err) {
assert.equal(err.message, '[[error:file-too-big, 256]]');
@@ -562,7 +562,7 @@ describe('User', function () {
var picture = {
path: path.join(nconf.get('base_dir'), 'test/files/test.png'),
size: 7189,
- name: 'test'
+ name: 'test',
};
User.uploadPicture(uid, picture, function (err) {
assert.equal(err.message, '[[error:invalid-image-extension]]');
@@ -585,7 +585,7 @@ describe('User', function () {
callback(null, data);
}
- plugins.registerHook('test-plugin', {hook: 'filter:uploadImage', method: filterMethod});
+ plugins.registerHook('test-plugin', { hook: 'filter:uploadImage', method: filterMethod });
User.uploadFromUrl(uid, url, function (err) {
assert.equal(err.message, '[[error:invalid-image-extension]]');
@@ -601,7 +601,7 @@ describe('User', function () {
callback(null, data);
}
- plugins.registerHook('test-plugin', {hook: 'filter:uploadImage', method: filterMethod});
+ plugins.registerHook('test-plugin', { hook: 'filter:uploadImage', method: filterMethod });
User.uploadFromUrl(uid, url, function (err) {
assert.equal(err.message, '[[error:file-too-big, ' + meta.config.maximumProfileImageSize + ']]');
@@ -612,7 +612,7 @@ describe('User', function () {
it('should error with invalid data', function (done) {
var socketUser = require('../src/socket.io/user');
- socketUser.uploadProfileImageFromUrl({uid: uid}, {uid: uid, url: ''}, function (err) {
+ socketUser.uploadProfileImageFromUrl({ uid: uid }, { uid: uid, url: '' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
@@ -624,12 +624,12 @@ describe('User', function () {
meta.config.maximumProfileImageSize = '';
function filterMethod(data, callback) {
- callback(null, {url: url});
+ callback(null, { url: url });
}
- plugins.registerHook('test-plugin', {hook: 'filter:uploadImage', method: filterMethod});
+ plugins.registerHook('test-plugin', { hook: 'filter:uploadImage', method: filterMethod });
- socketUser.uploadProfileImageFromUrl({uid: uid}, {uid: uid, url: url}, function (err, uploadedPicture) {
+ socketUser.uploadProfileImageFromUrl({ uid: uid }, { uid: uid, url: url }, function (err, uploadedPicture) {
assert.ifError(err);
assert.equal(uploadedPicture, url);
done();
@@ -637,7 +637,7 @@ describe('User', function () {
});
it('should get profile pictures', function (done) {
- io.emit('user.getProfilePictures', {uid: uid}, function (err, data) {
+ io.emit('user.getProfilePictures', { uid: uid }, function (err, data) {
assert.ifError(err);
assert(data);
assert(Array.isArray(data));
@@ -648,7 +648,7 @@ describe('User', function () {
});
it('should remove uploaded picture', function (done) {
- io.emit('user.removeUploadedPicture', {uid: uid}, function (err) {
+ io.emit('user.removeUploadedPicture', { uid: uid }, function (err) {
assert.ifError(err);
User.getUserField(uid, 'uploadedpicture', function (err, uploadedpicture) {
assert.ifError(err);
@@ -659,7 +659,7 @@ describe('User', function () {
});
it('should load profile page', function (done) {
- request(nconf.get('url') + '/api/user/updatedagain', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/updatedagain', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -668,7 +668,7 @@ describe('User', function () {
});
it('should load settings page', function (done) {
- request(nconf.get('url') + '/api/user/updatedagain/settings', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/updatedagain/settings', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body.settings);
@@ -679,7 +679,7 @@ describe('User', function () {
});
it('should load edit page', function (done) {
- request(nconf.get('url') + '/api/user/updatedagain/edit', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/updatedagain/edit', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -688,7 +688,7 @@ describe('User', function () {
});
it('should load edit/email page', function (done) {
- request(nconf.get('url') + '/api/user/updatedagain/edit/email', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/updatedagain/edit/email', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(body);
@@ -699,12 +699,12 @@ describe('User', function () {
it('should load user\'s groups page', function (done) {
groups.create({
name: 'Test',
- description: 'Foobar!'
+ description: 'Foobar!',
}, function (err) {
assert.ifError(err);
groups.join('Test', uid, function (err) {
assert.ifError(err);
- request(nconf.get('url') + '/api/user/updatedagain/groups', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/user/updatedagain/groups', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(res.statusCode, 200);
assert(Array.isArray(body.groups));
@@ -713,7 +713,6 @@ describe('User', function () {
});
});
});
-
});
});
@@ -734,7 +733,7 @@ describe('User', function () {
next(err);
});
- }
+ },
], function (err) {
assert.ifError(err);
User.unban(testUid, function (err) {
@@ -748,7 +747,7 @@ describe('User', function () {
describe('digests', function () {
var uid;
before(function (done) {
- User.create({username: 'digestuser', email: 'test@example.com'}, function (err, _uid) {
+ User.create({ username: 'digestuser', email: 'test@example.com' }, function (err, _uid) {
assert.ifError(err);
uid = _uid;
done();
@@ -758,7 +757,7 @@ describe('User', function () {
it('should send digests', function (done) {
User.updateDigestSetting(uid, 'day', function (err) {
assert.ifError(err);
- User.digest.execute('day', function (err) {
+ User.digest.execute('day', function (err) {
assert.ifError(err);
done();
});
@@ -770,14 +769,14 @@ describe('User', function () {
var socketUser = require('../src/socket.io/user');
it('should fail with invalid data', function (done) {
- socketUser.exists({uid: testUid}, null, function (err) {
+ socketUser.exists({ uid: testUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should return true if user/group exists', function (done) {
- socketUser.exists({uid: testUid}, {username: 'registered-users'}, function (err, exists) {
+ socketUser.exists({ uid: testUid }, { username: 'registered-users' }, function (err, exists) {
assert.ifError(err);
assert(exists);
done();
@@ -785,7 +784,7 @@ describe('User', function () {
});
it('should return true if user/group exists', function (done) {
- socketUser.exists({uid: testUid}, {username: 'John Smith'}, function (err, exists) {
+ socketUser.exists({ uid: testUid }, { username: 'John Smith' }, function (err, exists) {
assert.ifError(err);
assert(exists);
done();
@@ -793,7 +792,7 @@ describe('User', function () {
});
it('should return false if user/group does not exists', function (done) {
- socketUser.exists({uid: testUid}, {username: 'doesnot exist'}, function (err, exists) {
+ socketUser.exists({ uid: testUid }, { username: 'doesnot exist' }, function (err, exists) {
assert.ifError(err);
assert(!exists);
done();
@@ -801,11 +800,11 @@ describe('User', function () {
});
it('should delete user', function (done) {
- User.create({username: 'tobedeleted'}, function (err, _uid) {
+ User.create({ username: 'tobedeleted' }, function (err, _uid) {
assert.ifError(err);
- socketUser.deleteAccount({uid: _uid}, {}, function (err) {
+ socketUser.deleteAccount({ uid: _uid }, {}, function (err) {
assert.ifError(err);
- socketUser.exists({uid: testUid}, {username: 'doesnot exist'}, function (err, exists) {
+ socketUser.exists({ uid: testUid }, { username: 'doesnot exist' }, function (err, exists) {
assert.ifError(err);
assert(!exists);
done();
@@ -815,14 +814,14 @@ describe('User', function () {
});
it('should fail if data is invalid', function (done) {
- socketUser.emailExists({uid: testUid}, null, function (err) {
+ socketUser.emailExists({ uid: testUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should return true if email exists', function (done) {
- socketUser.emailExists({uid: testUid}, {email: 'john@example.com'}, function (err, exists) {
+ socketUser.emailExists({ uid: testUid }, { email: 'john@example.com' }, function (err, exists) {
assert.ifError(err);
assert(exists);
done();
@@ -830,7 +829,7 @@ describe('User', function () {
});
it('should return false if email does not exist', function (done) {
- socketUser.emailExists({uid: testUid}, {email: 'does@not.exist'}, function (err, exists) {
+ socketUser.emailExists({ uid: testUid }, { email: 'does@not.exist' }, function (err, exists) {
assert.ifError(err);
assert(!exists);
done();
@@ -838,7 +837,7 @@ describe('User', function () {
});
it('should error if requireEmailConfirmation is disabled', function (done) {
- socketUser.emailConfirm({uid: testUid}, {}, function (err) {
+ socketUser.emailConfirm({ uid: testUid }, {}, function (err) {
assert.equal(err.message, '[[error:email-confirmations-are-disabled]]');
done();
});
@@ -846,7 +845,7 @@ describe('User', function () {
it('should send email confirm', function (done) {
Meta.config.requireEmailConfirmation = 1;
- socketUser.emailConfirm({uid: testUid}, {}, function (err) {
+ socketUser.emailConfirm({ uid: testUid }, {}, function (err) {
assert.ifError(err);
Meta.config.requireEmailConfirmation = 0;
done();
@@ -854,21 +853,21 @@ describe('User', function () {
});
it('should send reset email', function (done) {
- socketUser.reset.send({uid: 0}, 'john@example.com', function (err) {
+ socketUser.reset.send({ uid: 0 }, 'john@example.com', function (err) {
assert.ifError(err);
done();
});
});
it('should return invalid-data error', function (done) {
- socketUser.reset.send({uid: 0}, null, function (err) {
+ socketUser.reset.send({ uid: 0 }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should not error', function (done) {
- socketUser.reset.send({uid: 0}, 'doestnot@exist.com', function (err) {
+ socketUser.reset.send({ uid: 0 }, 'doestnot@exist.com', function (err) {
assert.ifError(err);
done();
});
@@ -878,7 +877,7 @@ describe('User', function () {
db.getObject('reset:uid', function (err, data) {
assert.ifError(err);
var code = Object.keys(data)[0];
- socketUser.reset.commit({uid: 0}, {code: code, password: 'swordfish'}, function (err) {
+ socketUser.reset.commit({ uid: 0 }, { code: code, password: 'swordfish' }, function (err) {
assert.ifError(err);
done();
});
@@ -906,21 +905,21 @@ describe('User', function () {
followTopicsOnReply: 1,
notificationSound: '',
incomingChatSound: '',
- outgoingChatSound: ''
- }
+ outgoingChatSound: '',
+ },
};
- socketUser.saveSettings({uid: testUid}, data, function (err) {
+ socketUser.saveSettings({ uid: testUid }, data, function (err) {
assert.ifError(err);
done();
});
});
it('should set moderation note', function (done) {
- User.create({username: 'noteadmin'}, function (err, adminUid) {
+ User.create({ username: 'noteadmin' }, function (err, adminUid) {
assert.ifError(err);
groups.join('administrators', adminUid, function (err) {
assert.ifError(err);
- socketUser.setModerationNote({uid: adminUid}, {uid: testUid, note: 'this is a test user'}, function (err) {
+ socketUser.setModerationNote({ uid: adminUid }, { uid: testUid, note: 'this is a test user' }, function (err) {
assert.ifError(err);
User.getUserField(testUid, 'moderationNote', function (err, note) {
assert.ifError(err);
@@ -930,7 +929,6 @@ describe('User', function () {
});
});
});
-
});
});
@@ -942,7 +940,7 @@ describe('User', function () {
before(function (done) {
oldRegistrationType = Meta.config.registrationType;
Meta.config.registrationType = 'admin-approval';
- User.create({username: 'admin', password: '123456'}, function (err, uid) {
+ User.create({ username: 'admin', password: '123456' }, function (err, uid) {
assert.ifError(err);
adminUid = uid;
groups.join('administrators', uid, done);
@@ -958,12 +956,12 @@ describe('User', function () {
helpers.registerUser({
username: 'rejectme',
password: '123456',
- email: 'reject@me.com'
+ email: 'reject@me.com',
}, function (err) {
assert.ifError(err);
helpers.loginUser('admin', '123456', function (err, jar) {
assert.ifError(err);
- request(nconf.get('url') + '/api/admin/manage/registration', {jar: jar, json: true}, function (err, res, body) {
+ request(nconf.get('url') + '/api/admin/manage/registration', { jar: jar, json: true }, function (err, res, body) {
assert.ifError(err);
assert.equal(body.users[0].username, 'rejectme');
assert.equal(body.users[0].email, 'reject@me.com');
@@ -974,7 +972,7 @@ describe('User', function () {
});
it('should reject user registration', function (done) {
- socketAdmin.user.rejectRegistration({uid: adminUid}, {username: 'rejectme'}, function (err) {
+ socketAdmin.user.rejectRegistration({ uid: adminUid }, { username: 'rejectme' }, function (err) {
assert.ifError(err);
User.getRegistrationQueue(0, -1, function (err, users) {
assert.ifError(err);
@@ -988,10 +986,10 @@ describe('User', function () {
helpers.registerUser({
username: 'acceptme',
password: '123456',
- email: 'accept@me.com'
+ email: 'accept@me.com',
}, function (err) {
assert.ifError(err);
- socketAdmin.user.acceptRegistration({uid: adminUid}, {username: 'acceptme'}, function (err, uid) {
+ socketAdmin.user.acceptRegistration({ uid: adminUid }, { username: 'acceptme' }, function (err, uid) {
assert.ifError(err);
User.exists(uid, function (err, exists) {
assert.ifError(err);
@@ -1014,7 +1012,7 @@ describe('User', function () {
before(function (done) {
User.create({
username: 'inviter',
- email: 'inviter@nodebb.org'
+ email: 'inviter@nodebb.org',
}, function (err, uid) {
assert.ifError(err);
inviterUid = uid;
@@ -1023,14 +1021,14 @@ describe('User', function () {
});
it('should error with invalid data', function (done) {
- socketUser.invite({uid: inviterUid}, null, function (err) {
+ socketUser.invite({ uid: inviterUid }, null, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should eror if forum is not invite only', function (done) {
- socketUser.invite({uid: inviterUid}, 'invite1@test.com', function (err) {
+ socketUser.invite({ uid: inviterUid }, 'invite1@test.com', function (err) {
assert.equal(err.message, '[[error:forum-not-invite-only]]');
done();
});
@@ -1038,7 +1036,7 @@ describe('User', function () {
it('should error if user is not admin and type is admin-invite-only', function (done) {
meta.config.registrationType = 'admin-invite-only';
- socketUser.invite({uid: inviterUid}, 'invite1@test.com', function (err) {
+ socketUser.invite({ uid: inviterUid }, 'invite1@test.com', function (err) {
assert.equal(err.message, '[[error:no-privileges]]');
done();
});
@@ -1046,7 +1044,7 @@ describe('User', function () {
it('should send invitation email', function (done) {
meta.config.registrationType = 'invite-only';
- socketUser.invite({uid: inviterUid}, 'invite1@test.com', function (err) {
+ socketUser.invite({ uid: inviterUid }, 'invite1@test.com', function (err) {
assert.ifError(err);
done();
});
@@ -1054,7 +1052,7 @@ describe('User', function () {
it('should error if ouf of invitations', function (done) {
meta.config.maximumInvites = 1;
- socketUser.invite({uid: inviterUid}, 'invite2@test.com', function (err) {
+ socketUser.invite({ uid: inviterUid }, 'invite2@test.com', function (err) {
assert.equal(err.message, '[[error:invite-maximum-met, ' + 1 + ', ' + 1 + ']]');
meta.config.maximumInvites = 5;
done();
@@ -1062,14 +1060,14 @@ describe('User', function () {
});
it('should error if email exists', function (done) {
- socketUser.invite({uid: inviterUid}, 'inviter@nodebb.org', function (err) {
+ socketUser.invite({ uid: inviterUid }, 'inviter@nodebb.org', function (err) {
assert.equal(err.message, '[[error:email-taken]]');
done();
});
});
it('should send invitation email', function (done) {
- socketUser.invite({uid: inviterUid}, 'invite2@test.com', function (err) {
+ socketUser.invite({ uid: inviterUid }, 'invite2@test.com', function (err) {
assert.ifError(err);
done();
});
@@ -1095,23 +1093,24 @@ describe('User', function () {
});
it('should fail to verify invitation with invalid data', function (done) {
- User.verifyInvitation({token: '', email: ''}, function (err) {
+ User.verifyInvitation({ token: '', email: '' }, function (err) {
assert.equal(err.message, '[[error:invalid-data]]');
done();
});
});
it('should fail to verify invitation with invalid email', function (done) {
- User.verifyInvitation({token: 'test', email: 'doesnotexist@test.com'}, function (err) {
+ User.verifyInvitation({ token: 'test', email: 'doesnotexist@test.com' }, function (err) {
assert.equal(err.message, '[[error:invalid-token]]');
done();
});
});
it('should verify installation with no errors', function (done) {
- db.get('invitation:email:' + 'invite1@test.com', function (err, token) {
+ var email = 'invite1@test.com';
+ db.get('invitation:email:' + email, function (err, token) {
assert.ifError(err);
- User.verifyInvitation({token: token, email: 'invite1@test.com'}, function (err) {
+ User.verifyInvitation({ token: token, email: 'invite1@test.com' }, function (err) {
assert.ifError(err);
done();
});
@@ -1127,7 +1126,7 @@ describe('User', function () {
it('should delete invitation', function (done) {
var socketAdmin = require('../src/socket.io/admin');
- socketAdmin.user.deleteInvitation({uid: inviterUid}, {invitedBy: 'inviter', email: 'invite1@test.com'}, function (err) {
+ socketAdmin.user.deleteInvitation({ uid: inviterUid }, { invitedBy: 'inviter', email: 'invite1@test.com' }, function (err) {
assert.ifError(err);
db.isSetMember('invitation:uid:' + inviterUid, 'invite1@test.com', function (err, isMember) {
assert.ifError(err);
@@ -1151,7 +1150,6 @@ describe('User', function () {
});
});
});
-
});
diff --git a/test/utils.js b/test/utils.js
index 95f3040df4..2beedcf3eb 100644
--- a/test/utils.js
+++ b/test/utils.js
@@ -1,5 +1,5 @@
'use strict';
-/*global require*/
+
var assert = require('assert');
var utils = require('./../public/src/utils.js');
@@ -30,15 +30,15 @@ describe('Utility Methods', function () {
describe('UUID generation', function () {
it('return unique random value every time', function () {
- var uuid1 = utils.generateUUID(),
- uuid2 = utils.generateUUID();
+ var uuid1 = utils.generateUUID();
+ var uuid2 = utils.generateUUID();
assert.notEqual(uuid1, uuid2, 'matches');
});
});
describe('cleanUpTag', function () {
it('should cleanUp a tag', function (done) {
- var cleanedTag = utils.cleanUpTag(',\/#!$%\^\*;TaG1:{}=_`<>\'"~()?\|');
+ var cleanedTag = utils.cleanUpTag(',/#!$%^*;TaG1:{}=_`<>\'"~()?|');
assert.equal(cleanedTag, 'tag1');
done();
});
@@ -70,8 +70,8 @@ describe('Utility Methods', function () {
});
it('should shallow merge two objects', function (done) {
- var a = {foo: 1, cat1: 'ginger'};
- var b = {baz: 2, cat2: 'phoebe'};
+ var a = { foo: 1, cat1: 'ginger' };
+ var b = { baz: 2, cat2: 'phoebe' };
var obj = utils.merge(a, b);
assert.strictEqual(obj.foo, 1);
assert.strictEqual(obj.baz, 2);
@@ -151,10 +151,10 @@ describe('Utility Methods', function () {
var currentHour = new Date().getHours();
var hours = utils.getHoursArray();
var index = hours.length - 1;
- for (var i = currentHour, ii = currentHour - 24; i > ii; i--) {
+ for (var i = currentHour, ii = currentHour - 24; i > ii; i -= 1) {
var hour = i < 0 ? 24 + i : i;
assert.equal(hours[index], hour + ':00');
- -- index;
+ index -= 1;
}
done();
});
@@ -164,12 +164,11 @@ describe('Utility Methods', function () {
var days = utils.getDaysArray();
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var index = 0;
- for(var x = 29; x >= 0; x--) {
+ for (var x = 29; x >= 0; x -= 1) {
var tmpDate = new Date(currentDay - (1000 * 60 * 60 * 24 * x));
- assert.equal(months[tmpDate.getMonth()] + ' ' + tmpDate.getDate(), days[index]);
- ++ index;
+ assert.equal(months[tmpDate.getMonth()] + ' ' + tmpDate.getDate(), days[index]);
+ index += 1;
}
done();
});
-
});