diff --git a/src/controllers/api/v1/tickets.js b/src/controllers/api/v1/tickets.js
index 356eef146..c167948fe 100644
--- a/src/controllers/api/v1/tickets.js
+++ b/src/controllers/api/v1/tickets.js
@@ -45,8 +45,8 @@ function buildGraphData(arr, days, callback) {
if (_.isFunction(callback))
return callback(graphData);
- else
- return graphData;
+
+ return graphData;
}
function buildAvgResponse(ticketArray, callback) {
@@ -71,8 +71,8 @@ function buildAvgResponse(ticketArray, callback) {
if (_.isFunction(callback))
return callback(cbObj);
- else
- return cbObj;
+
+ return cbObj;
}
/**
@@ -420,8 +420,8 @@ apiTickets.createPublicTicket = function(req, res) {
if (defaultType.value)
return next(null, defaultType.value, group, savedUser);
- else
- return next('Failed: Invalid Default Ticket Type.');
+
+ return next('Failed: Invalid Default Ticket Type.');
});
},
diff --git a/src/controllers/api/v1/users.js b/src/controllers/api/v1/users.js
index a51dfc753..9efb65358 100644
--- a/src/controllers/api/v1/users.js
+++ b/src/controllers/api/v1/users.js
@@ -866,8 +866,10 @@ apiUsers.checkEmail = function(req, res) {
UserSchema.getUserByEmail(email, function(err, users) {
if (err) return res.status(400).json({success: false, error: err.message});
- if (!_.isNull(users)) return res.json({success: true, exist: true});
- else return res.json({success: true, exist: false});
+ if (!_.isNull(users))
+ return res.json({success: true, exist: true});
+
+ return res.json({success: true, exist: false});
});
};
diff --git a/src/controllers/settings.js b/src/controllers/settings.js
index 811c3b3bf..4a97eaa8e 100644
--- a/src/controllers/settings.js
+++ b/src/controllers/settings.js
@@ -24,7 +24,7 @@ var settingsController = {};
settingsController.content = {};
-function initViewContant(view, req) {
+function initViewContent(view, req) {
var content = {};
content.title = 'Settings';
content.nav = 'settings';
@@ -69,7 +69,7 @@ function renderView(res, content) {
settingsController.general = function(req, res) {
if (!checkPerms(req, 'settings:view')) return res.redirect('/');
- var content = initViewContant('general', req);
+ var content = initViewContent('general', req);
renderView(res, content);
};
@@ -77,7 +77,7 @@ settingsController.general = function(req, res) {
settingsController.appearance = function(req, res) {
if (!checkPerms(req, 'settings:view')) return res.redirect('/');
- var content = initViewContant('appearance', req);
+ var content = initViewContent('appearance', req);
renderView(res, content);
};
@@ -85,7 +85,7 @@ settingsController.appearance = function(req, res) {
settingsController.ticketSettings = function(req, res) {
if (!checkPerms(req, 'settings:tickets')) return res.redirect('/settings');
- var content = initViewContant('tickets', req);
+ var content = initViewContent('tickets', req);
renderView(res, content);
};
@@ -93,7 +93,7 @@ settingsController.ticketSettings = function(req, res) {
settingsController.mailerSettings = function(req, res) {
if (!checkPerms(req, 'settings:mailer')) return res.redirect('/settings');
- var content = initViewContant('mailer', req);
+ var content = initViewContent('mailer', req);
renderView(res, content);
};
@@ -101,7 +101,7 @@ settingsController.mailerSettings = function(req, res) {
settingsController.notificationsSettings = function(req, res) {
if (!checkPerms(req, 'settings:notifications')) return res.redirect('/settings');
- var content = initViewContant('notifications', req);
+ var content = initViewContent('notifications', req);
renderView(res, content);
};
@@ -109,7 +109,7 @@ settingsController.notificationsSettings = function(req, res) {
settingsController.tpsSettings = function(req, res) {
if (!checkPerms(req, 'settings:tps')) return res.redirect('/settings');
- var content = initViewContant('tps', req);
+ var content = initViewContent('tps', req);
renderView(res, content);
};
@@ -117,7 +117,7 @@ settingsController.tpsSettings = function(req, res) {
settingsController.backupSettings = function(req, res) {
if (!checkPerms(req, 'settings:backup')) return res.redirect('/settings');
- var content = initViewContant('backup', req);
+ var content = initViewContent('backup', req);
renderView(res, content);
};
@@ -125,7 +125,7 @@ settingsController.backupSettings = function(req, res) {
settingsController.legal = function(req, res) {
if (!checkPerms(req, 'settings:legal')) return res.redirect('/settings');
- var content = initViewContant('legal', req);
+ var content = initViewContent('legal', req);
renderView(res, content);
};
@@ -133,7 +133,7 @@ settingsController.legal = function(req, res) {
settingsController.logs = function(req, res) {
if (!checkPerms(req, 'settings:logs')) return res.redirect('/settings');
- var content = initViewContant('logs', req);
+ var content = initViewContent('logs', req);
var fs = require('fs'),
path = require('path'),
diff --git a/src/helpers/hbs/helpers.js b/src/helpers/hbs/helpers.js
index 27657c6eb..fada606a1 100644
--- a/src/helpers/hbs/helpers.js
+++ b/src/helpers/hbs/helpers.js
@@ -27,6 +27,15 @@ require('moment-duration-format');
// The module to be exported
var helpers = {
+ concat: function(a, b, space, comma) {
+ if (space && (comma === false || _.isObject(comma)))
+ return a.toString() + ' ' + b.toString();
+ else if (comma === true)
+ return a.toString() + ', ' + b.toString();
+ else
+ return a.toString() + b.toString();
+ },
+
contains: function (str, pattern, options) {
if (str.indexOf(pattern) !== -1)
return options.fn(this);
@@ -481,7 +490,9 @@ var helpers = {
return moment.duration(duration, parseFormat).format('Y [year], M [month], d [day], h [hour], m [min]', { trim: 'both'});
},
- calendarDate: function(date) {
+ calendarDate: function(date, fallback) {
+ if (_.isObject(fallback))
+ fallback = 'll [at] LT';
moment.updateLocale('en', {
calendar: {
sameDay: '[Today at] LT',
@@ -489,7 +500,7 @@ var helpers = {
nextDay: '[Tomorrow at] LT',
lastWeek: '[Last] ddd [at] LT',
nextWeek: 'ddd [at] LT',
- sameElse: 'L'
+ sameElse: fallback
}
});
return moment.utc(date).tz(global.timezone).calendar();
diff --git a/src/helpers/viewdata/index.js b/src/helpers/viewdata/index.js
index e3d4340c0..5703c3af8 100644
--- a/src/helpers/viewdata/index.js
+++ b/src/helpers/viewdata/index.js
@@ -33,14 +33,38 @@ viewController.getData = function(request, cb) {
return callback();
},
function(callback) {
- settingSchema.getSetting('gen:shortDateFormat', function(err, setting) {
- if (!err && setting && setting.value)
- viewdata.shortDateFormat = setting.value;
- else
- viewdata.shortDateFormat = 'MM/DD/YYYY';
-
- return callback();
- });
+ async.parallel([
+ function(done) {
+ settingSchema.getSetting('gen:timeFormat', function(err, setting) {
+ if (!err && setting && setting.value)
+ viewdata.timeFormat = setting.value;
+ else
+ viewdata.timeFormat = 'hh:mma';
+
+ return done();
+ });
+ },
+ function(done) {
+ settingSchema.getSetting('gen:shortDateFormat', function(err, setting) {
+ if (!err && setting && setting.value)
+ viewdata.shortDateFormat = setting.value;
+ else
+ viewdata.shortDateFormat = 'MM/DD/YYYY';
+
+ return done();
+ });
+ },
+ function(done) {
+ settingSchema.getSetting('gen:longDateFormat', function(err, setting) {
+ if (!err && setting && setting.value)
+ viewdata.longDateFormat = setting.value;
+ else
+ viewdata.longDateFormat = 'MM/DD/YYYY h:mma';
+
+ return done();
+ });
+ }
+ ], callback);
},
function(callback) {
viewdata.ticketSettings = {};
@@ -151,16 +175,16 @@ viewController.getData = function(request, cb) {
if (!viewdata.hasCustomFavicon) {
viewdata.favicon = '/img/favicon.ico';
return callback();
- } else {
- settingSchema.getSetting('gen:customfaviconfilename', function(err, faviconFilename) {
- if (!err && faviconFilename && !_.isUndefined(faviconFilename.value))
- viewdata.favicon = '/assets/' + faviconFilename.value;
- else
- viewdata.favicon = '/img/favicon.ico';
-
- return callback();
- });
}
+
+ settingSchema.getSetting('gen:customfaviconfilename', function(err, faviconFilename) {
+ if (!err && faviconFilename && !_.isUndefined(faviconFilename.value))
+ viewdata.favicon = '/assets/' + faviconFilename.value;
+ else
+ viewdata.favicon = '/img/favicon.ico';
+
+ return callback();
+ });
});
},
function(callback) {
diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js
index 446f0caf6..043639a6a 100644
--- a/src/middleware/middleware.js
+++ b/src/middleware/middleware.js
@@ -92,12 +92,12 @@ middleware.redirectIfUser = function(req, res, next) {
middleware.ensurel2Auth = function(req, res, next) {
if (req.session.l2auth === 'totp') {
- if (req.user)
- {if (req.user.role !== 'user')
+ if (req.user) {
+ if (req.user.role !== 'user')
return res.redirect('/dashboard');
- else
- return res.redirect('/tickets');}
- else
+
+ return res.redirect('/tickets');
+ } else
return next();
} else
return res.redirect('/l2auth');
diff --git a/src/public/js/angularjs/controllers/settings.js b/src/public/js/angularjs/controllers/settings.js
index 7d15c385b..91f4b485c 100644
--- a/src/public/js/angularjs/controllers/settings.js
+++ b/src/public/js/angularjs/controllers/settings.js
@@ -23,9 +23,10 @@ define([
'moment',
'moment_timezone',
'velocity',
- 'history'],
+ 'history',
+ 'angularjs/services'],
function(angular, _, $, helpers, ui, UIkit, EasyMDE, moment) {
- return angular.module('trudesk.controllers.settings', ['ngSanitize'])
+ return angular.module('trudesk.controllers.settings', ['ngSanitize', 'trudesk.services.settings'])
.directive('selectize', function($timeout) {
return {
restrict: 'A',
@@ -44,7 +45,7 @@ define([
}
};
})
- .controller('settingsCtrl', function($scope, $http, $timeout, $log, $window) {
+ .controller('settingsCtrl', function(SettingsService, $scope, $http, $timeout, $log, $window) {
var mdeToolbarItems = [
{
name: 'bold',
@@ -108,6 +109,11 @@ define([
var privacyPolicyMDE = null;
$scope.init = function() {
+ // Set using Service due to handlebars escaping backslashes
+ $scope.timeFormat = SettingsService.getSettings().timeFormat.value;
+ $scope.shortDateFormat = SettingsService.getSettings().shortDateFormat.value;
+ $scope.longDateFormat = SettingsService.getSettings().longDateFormat.value;
+
var $uploadButton = $('#logo-upload-select').parent();
var uploadLogoSettings = {
action: '/settings/general/uploadlogo',
@@ -540,6 +546,23 @@ define([
});
};
+ $scope.saveTimeFormatClicked = function() {
+ $http.put('/api/v1/settings', {
+ name: 'gen:timeFormat',
+ value: $scope.timeFormat
+ }, {
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }).then(function successCallback() {
+ SettingsService.getSettings().timeFormat.value = $scope.timeFormat;
+ helpers.UI.showSnackbar('Setting Saved.', false);
+ }, function errorCallback(err) {
+ helpers.showSnackbar('Error: ' + err, true);
+ $log.error(err);
+ });
+ };
+
$scope.saveShortDateFormatClicked = function() {
$http.put('/api/v1/settings', {
name: 'gen:shortDateFormat',
@@ -549,6 +572,24 @@ define([
'Content-Type': 'application/json'
}
}).then(function successCallback() {
+ SettingsService.getSettings().shortDateFormat.value = $scope.shortDateFormat;
+ helpers.UI.showSnackbar('Setting Saved.', false);
+ }, function errorCallback(err) {
+ helpers.showSnackbar('Error: ' + err, true);
+ $log.error(err);
+ });
+ };
+
+ $scope.saveLongDateFormatClicked = function() {
+ $http.put('/api/v1/settings', {
+ name: 'gen:longDateFormat',
+ value: $scope.longDateFormat
+ }, {
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }).then(function successCallback() {
+ SettingsService.getSettings().longDateFormat.value = $scope.longDateFormat;
helpers.UI.showSnackbar('Setting Saved.', false);
}, function errorCallback(err) {
helpers.showSnackbar('Error: ' + err, true);
diff --git a/src/public/js/modules/chat.js b/src/public/js/modules/chat.js
index ff72822f0..758628b59 100644
--- a/src/public/js/modules/chat.js
+++ b/src/public/js/modules/chat.js
@@ -528,7 +528,7 @@ define('modules/chat',[
html += '';
html += '
' + item.comment + '