diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 00000000..0c734f21 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,6 @@ +{ + "evil": true, + "laxcomma": true, + "multistr": true, + "sub": true +} \ No newline at end of file diff --git a/client/app/dashboard/model/list/ModelList.js b/client/app/dashboard/model/list/ModelList.js index 96733e88..e7e59afb 100644 --- a/client/app/dashboard/model/list/ModelList.js +++ b/client/app/dashboard/model/list/ModelList.js @@ -166,15 +166,16 @@ angular.module('dashboard.Dashboard.Model.List', [ //Setup Columns in Grid var columnRef = $scope.action.options.columnRef; var columns = $scope.action.options.columns; + var subnav; if (columnRef && typeof columnRef === 'object' && columnRef.label) { if (columnRef.path) { //reference to another main-nav's sub-nav's columns :) var section = _.find(Config.serverParams.nav, { path: columnRef.path }); - var subnav = _.find(section.subnav, { label: columnRef.label }); + subnav = _.find(section.subnav, { label: columnRef.label }); columns = subnav.options.columns; } else { //reference to another subnav's columns in the same section - var subnav = _.find($scope.section.subnav, { label: columnRef.label }); + subnav = _.find($scope.section.subnav, { label: columnRef.label }); columns = subnav.options.columns; } @@ -292,6 +293,8 @@ angular.module('dashboard.Dashboard.Model.List', [ function setupPagination() { //make a copy of config params var params = angular.copy($scope.action.options.params); + var field; + var direction; if (params && params.filter && params.filter.length > 0) { //use of filter JSON string @@ -302,8 +305,8 @@ angular.module('dashboard.Dashboard.Model.List', [ if ($scope.sortInfo.fields.length > 0) { filter.order = ""; for (var i in $scope.sortInfo.fields) { - var field = $scope.sortInfo.fields[i]; - var direction = $scope.sortInfo.directions[i]; + field = $scope.sortInfo.fields[i]; + direction = $scope.sortInfo.directions[i]; if (!direction) direction = "ASC"; if (parseInt(i) > 0) filter.order += ", "; filter.order += field + " " + direction; @@ -323,11 +326,11 @@ angular.module('dashboard.Dashboard.Model.List', [ if ($scope.sortInfo.fields.length > 0) { var sortOrder = ""; - for (var i in $scope.sortInfo.fields) { - var field = $scope.sortInfo.fields[i]; - var direction = $scope.sortInfo.directions[i]; + for (var j in $scope.sortInfo.fields) { + field = $scope.sortInfo.fields[j]; + direction = $scope.sortInfo.directions[j]; if (!direction) direction = "ASC"; - if (parseInt(i) > 0) sortOrder += ", "; + if (parseInt(j) > 0) sortOrder += ", "; sortOrder += field + " " + direction; } @@ -424,8 +427,7 @@ angular.module('dashboard.Dashboard.Model.List', [ GeneralModelService.list($scope.apiPath, params).then( function(response) { if (!response) return; //in case http request was cancelled - if( $scope.action.options.resultField !== undefined - && response[$scope.action.options.resultField] !== undefined ) + if($scope.action.options.resultField !== undefined && response[$scope.action.options.resultField] !== undefined) $scope.list = response[$scope.action.options.resultField]; else $scope.list = response; @@ -440,7 +442,7 @@ angular.module('dashboard.Dashboard.Model.List', [ function(error) { $scope.errorMessage = 'There was an error while loading...'; console.error(error); - }) + }); }; /** @@ -558,18 +560,18 @@ angular.module('dashboard.Dashboard.Model.List', [ //Remove all relationships to prevent upserting on the server side var rowKeys = Object.keys(newRow); - for (var i in rowKeys) { - var key = rowKeys[i]; - if (newRow[key] && typeof newRow[key] === 'object') { - delete newRow[key]; + for (var j in rowKeys) { + var rowKey = rowKeys[j]; + if (newRow[rowKey] && typeof newRow[rowKey] === 'object') { + delete newRow[rowKey]; } } //insert defaults as specified in config.json if ($scope.action.options.defaults) { var keys = Object.keys($scope.action.options.defaults); - for (var i in keys) { - var key = keys[i]; + for (var k in keys) { + var key = keys[k]; var property = $scope.action.options.defaults[key]; if (property && (property.foreceDefaultOnSave || !newRow[key])) { //set the default value (i.e. lastUpdated or lastUpdatedBy) @@ -584,8 +586,8 @@ angular.module('dashboard.Dashboard.Model.List', [ //check if all required fields are filled in if ($scope.action.options.columns) { - for (var i in $scope.action.options.columns) { - var column = $scope.action.options.columns[i]; + for (var l in $scope.action.options.columns) { + var column = $scope.action.options.columns[l]; if (column.required && !newRow[column.field]) { alert("Please fill in all required fields: " + column.displayName); return; @@ -764,7 +766,7 @@ angular.module('dashboard.Dashboard.Model.List', [ if (direction < 0) { //scrolling down - var scrollY = $viewport.scrollTop(); + scrollY = $viewport.scrollTop(); if (scrollY == 0) scrollY = -direction; if ($scope.gridContainerTopMargin-scrollY > 0) { $scope.gridContainerTopMargin -= scrollY; @@ -792,8 +794,7 @@ angular.module('dashboard.Dashboard.Model.List', [ } } $scope.$digest(); //Make sure to refresh UI - - } + }; //For Mobile let entire page scroll if (/(iPad|iPhone|iPod|Android)/g.test( navigator.userAgent ) || $scope.action.options.flexibleHeight) { diff --git a/client/app/register/Register.js b/client/app/register/Register.js index ca1f448a..33c7b335 100644 --- a/client/app/register/Register.js +++ b/client/app/register/Register.js @@ -41,7 +41,7 @@ angular.module('dashboard.Register', [ .catch(function(response) { alert("Error registering"); }); - } + }; init(); }) diff --git a/client/common/directives/DateTimePicker/DateTimePicker.js b/client/common/directives/DateTimePicker/DateTimePicker.js index 4308f714..bc21b957 100644 --- a/client/common/directives/DateTimePicker/DateTimePicker.js +++ b/client/common/directives/DateTimePicker/DateTimePicker.js @@ -43,7 +43,7 @@ angular.module('dashboard.directive.DateTimePicker', [ defaultDate: scope.defaultDate ? moment(scope.defaultDate).toDate() : undefined, viewMode: scope.viewMode, widgetPositioning: { horizontal: scope.horizontal ? scope.horizontal : 'auto' } - } + }; if (scope.minDate) options.minDate = scope.minDate; if (scope.maxDate) options.maxDate = scope.maxDate; elem.datetimepicker(options); diff --git a/client/common/directives/ModelField/ModelField.js b/client/common/directives/ModelField/ModelField.js index 35cac79a..4758a702 100644 --- a/client/common/directives/ModelField/ModelField.js +++ b/client/common/directives/ModelField/ModelField.js @@ -156,7 +156,7 @@ angular.module('dashboard.directives.ModelField', [ if (scope.property.display.options instanceof Array) { //Handle when options is array of objects containing key/value pair if (typeof scope.property.display.options[0] === 'object' && !Array.isArray(scope.property.display.options[0])) { - ngOptions = 'item.key as item.value disable when item.disabled for item in display.options' + ngOptions = 'item.key as item.value disable when item.disabled for item in display.options'; } else { //Handle when options is a an array vs key/value pair object ngOptions = 'value as value for value in display.options'; @@ -175,7 +175,7 @@ angular.module('dashboard.directives.ModelField', [ if (scope.property.display.options instanceof Array) { //Handle when options is array of objects containing key/value pair if (typeof scope.property.display.options[0] === 'object' && !Array.isArray(scope.property.display.options[0])) { - ngRepeat = 'item in display.options' + ngRepeat = 'item in display.options'; } else { //Handle when options is a an array vs key/value pair ngRepeat = 'text in display.options'; @@ -280,6 +280,7 @@ angular.module('dashboard.directives.ModelField', [ '; break; case 'text': + /* falls through */ default: template = '\
\ @@ -408,12 +409,12 @@ angular.module('dashboard.directives.ModelField', [ delete scope.display.error; delete scope.display.errorCode; if (scope.ngError) scope.ngError({error: null}); - return + return; } else if (e.target.value.length === 0 && property.display.isRequired) { scope.display.error = "This is a required field."; if (scope.ngError) scope.ngError({error: new Error(scope.display.error)}); } - } + }; } if (property.display.type == 'file' && scope.data[scope.key]) { @@ -452,7 +453,7 @@ angular.module('dashboard.directives.ModelField', [ if (value == undefined || value == null) return property.display.default; data[key] = value == '1' || value == 1; //Fixes a bug where data[key] changes from bool to string can cause checkbox to get unchecked return data[key]; - } + }; //Make sure boolean (checkbox) values are numeric (below only gets called on init and not when state changes) if (typeof scope.data[scope.key] === "string") scope.data[scope.key] = parseInt(scope.data[scope.key]); } diff --git a/client/common/directives/ModelFieldImage/ModelFieldImage.js b/client/common/directives/ModelFieldImage/ModelFieldImage.js index 499013fa..ed7545ba 100644 --- a/client/common/directives/ModelFieldImage/ModelFieldImage.js +++ b/client/common/directives/ModelFieldImage/ModelFieldImage.js @@ -230,9 +230,10 @@ angular.module('dashboard.directives.ModelFieldImage', [ $modal.append($container); $("body").append($modal); + var scale; if (scope.options.isLightbox) { //Lightbox only - var scale = Math.min($container.width() / image.width, $container.height() / image.height); + scale = Math.min($container.width() / image.width, $container.height() / image.height); var width = image.width * scale; var height = image.height * scale; $container.css({ @@ -245,7 +246,7 @@ angular.module('dashboard.directives.ModelFieldImage', [ var $zoom = $('
'); $container.append($thumbnail); $container.append($zoom); - var scale = Math.min($thumbnail.width() / image.width, $thumbnail.height() / image.height); + scale = Math.min($thumbnail.width() / image.width, $thumbnail.height() / image.height); var thumbnailWidth = image.width * scale; var thumbnailHeight = image.height * scale; $thumbnail.css({ diff --git a/client/common/directives/ModelFieldLocation/ModelFieldLocation.js b/client/common/directives/ModelFieldLocation/ModelFieldLocation.js index 225cde43..737ea86f 100644 --- a/client/common/directives/ModelFieldLocation/ModelFieldLocation.js +++ b/client/common/directives/ModelFieldLocation/ModelFieldLocation.js @@ -155,7 +155,7 @@ angular.module('dashboard.directives.ModelFieldLocation', [ }); }, function () { - console.error("Error loading Google Maps") + console.error("Error loading Google Maps"); }); function initMap() { @@ -201,7 +201,7 @@ angular.module('dashboard.directives.ModelFieldLocation', [ } }); } - } + }; function initSelectedMarker() { //update marker @@ -229,7 +229,7 @@ angular.module('dashboard.directives.ModelFieldLocation', [ } else { var LatLng = new google.maps.LatLng(scope.data.lat,scope.data.lng); selectedMarker.setPosition(LatLng); - selectedMarker.setMap(map) + selectedMarker.setMap(map); map.setCenter(LatLng); } } @@ -237,11 +237,11 @@ angular.module('dashboard.directives.ModelFieldLocation', [ scope.clearSearch = function() { scope.hasSearched = false; - } + }; scope.revertValue = function() { if( originalValue ) scope.data = originalValue; - } + }; } }; }) diff --git a/client/common/directives/ModelFieldMultiSelect/ModelFieldMultiSelect.js b/client/common/directives/ModelFieldMultiSelect/ModelFieldMultiSelect.js index 0ab04272..1d202abb 100644 --- a/client/common/directives/ModelFieldMultiSelect/ModelFieldMultiSelect.js +++ b/client/common/directives/ModelFieldMultiSelect/ModelFieldMultiSelect.js @@ -52,6 +52,8 @@ angular.module('dashboard.directives.ModelFieldMultiSelect', []) */ function initOptions() { var options = scope.options || property.display.options; + var option; + var key; if (typeof options === 'string') { //Check if options on new line if (options.indexOf('\n') > -1) { @@ -71,12 +73,12 @@ angular.module('dashboard.directives.ModelFieldMultiSelect', []) var item = options[i]; if (typeof item === 'string') { //string option - var option = {key: item, value: item}; + option = { key: item, value: item }; scope.multiSelectOptions.push(option); } else if (item && typeof item === 'object') { //Objects (key/value pair) - var key = item[keyOverride] || i; //fallback to index if no key - var option = { key: key, value: item[valueOverride], item: item }; + key = item[keyOverride] || i; //fallback to index if no key + option = { key: key, value: item[valueOverride], item: item }; scope.multiSelectOptions.push(option); } } @@ -85,8 +87,8 @@ angular.module('dashboard.directives.ModelFieldMultiSelect', []) //Assume object containing key/value pair var keys = Object.keys(options); for (var k in keys) { - var key = keys[k]; - var option = { key: key, value: options[key] }; + key = keys[k]; + option = { key: key, value: options[key] }; scope.multiSelectOptions.push(option); } } @@ -96,6 +98,7 @@ angular.module('dashboard.directives.ModelFieldMultiSelect', []) * Initial data load by checking desired output as comma, array, or object */ function initData() { + var index; if (typeof property.display.output === 'undefined') { var options = scope.options || property.display.options; property.display.output = options instanceof Array ? "comma" : "object"; @@ -107,14 +110,14 @@ angular.module('dashboard.directives.ModelFieldMultiSelect', []) var item = items[i]; if (item[0] == '"') item = item.substring(1, item.length); if (item[item.length-1] == '"') item = item.substring(0, item.length-1); - var index = _.findIndex(scope.multiSelectOptions, {key: item}); + index = _.findIndex(scope.multiSelectOptions, { key: item }); if (index > -1) scope.selected[index] = true; } } else if (Array.isArray(scope.data)) { if (!scope.data) scope.data = []; - for (var i in scope.data) { - var value = scope.data[i]; - var index = _.findIndex(scope.multiSelectOptions, {key: value}); + for (var j in scope.data) { + var value = scope.data[j]; + index = _.findIndex(scope.multiSelectOptions, { key: value }); if (index > -1) scope.selected[index] = true; } } else if (scope.data && typeof scope.data === 'object') { @@ -122,7 +125,7 @@ angular.module('dashboard.directives.ModelFieldMultiSelect', []) var keys = Object.keys(scope.data); for (var k in keys) { var key = keys[k]; - var index = _.findIndex(scope.multiSelectOptions, {key: key}); + index = _.findIndex(scope.multiSelectOptions, { key: key }); if (index > -1) scope.selected[index] = true; } } diff --git a/client/common/directives/ModelFieldNumber/ModelFieldNumber.js b/client/common/directives/ModelFieldNumber/ModelFieldNumber.js index ad5d2a9f..d3343ed2 100644 --- a/client/common/directives/ModelFieldNumber/ModelFieldNumber.js +++ b/client/common/directives/ModelFieldNumber/ModelFieldNumber.js @@ -83,40 +83,40 @@ angular.module('dashboard.directives.ModelFieldNumber', []) } else if (scope.ngError) { scope.ngError({error: null}); } - return + return; } if (property.display.allowDecimal === true) { var decimalString = $filter('decimalWithScale')(e.target.value, property.display.scaleValue); if (isNaN(decimalString) && scope.ngError) { scope.ngError({error: new Error('Please enter a valid number')}); - return + return; } else { scope.data = decimalString; /*scope.data.scale is to handle parsing the field while scale data is being entered - formEdit */ } if (property.display.minValue !== undefined && isFirstDecLarger(property.display.minValue, e.target.value)) { if (scope.ngError) scope.ngError({error: new Error('Value is less than the minimum allowed value (' + property.display.minValue + ').')}); - return + return; } if (property.display.maxValue !== undefined && isFirstDecLarger(e.target.value, property.display.maxValue)) { if (scope.ngError) scope.ngError({error: new Error('Value is greater than the maximum allowed value (' + property.display.maxValue + ').')}); - return + return; } if (scope.ngError) scope.ngError({error: null}); } else if (property.display.allowDecimal === false) { /*handle when don't allow decimals - needs to be explicitly implied*/ if (isNaN(_.round(e.target.value)) || isNaN(parseInt(e.target.value))) { if (scope.ngError) scope.ngError({error: new Error('Please enter a valid number')}); - return + return; } var roundedValue = _.round(e.target.value, 0); scope.data = roundedValue; if (property.display.minValue !== undefined && property.display.minValue > parseFloat(e.target.value)) { if (scope.ngError) scope.ngError({error: new Error('Value is less than the minimum allowed value (' + property.display.minValue + ').')}); - return + return; } if (property.display.maxValue !== undefined && property.display.maxValue < parseFloat(e.target.value)) { if (scope.ngError) scope.ngError({error: new Error('Value is greater than the maximum allowed value (' + property.display.maxValue + ').')}); - return + return; } if (scope.ngError) scope.ngError({error: null}); } @@ -134,11 +134,11 @@ angular.module('dashboard.directives.ModelFieldNumber', []) var dec1Components = dec1.split('.'); var dec2Components = dec2.split('.'); if (parseInt(dec1Components[0]) > parseInt(dec2Components[0])) { - return true + return true; } else if (parseInt(dec1Components[0]) < parseInt(dec2Components[0])) { - return false + return false; } else { /*equal so look at decimal spots */ - var areBothPositive = (parseInt(dec1Components[0]) >= 0 && parseInt(dec2Components[0]) >= 0) + var areBothPositive = (parseInt(dec1Components[0]) >= 0 && parseInt(dec2Components[0]) >= 0); for (var i = 0; i < Math.max(dec1Components[1].length, dec2Components[1].length); i++) { if (dec1Components[1].charAt(i) === '') dec1Components[1] += '0'; if (dec2Components[1].charAt(i) === '') dec2Components[1] += '0'; @@ -149,7 +149,7 @@ angular.module('dashboard.directives.ModelFieldNumber', []) } } } - }; + } init(); } diff --git a/client/common/directives/ModelFieldPointsOfInterest/ModelFieldPointsOfInterest.js b/client/common/directives/ModelFieldPointsOfInterest/ModelFieldPointsOfInterest.js index 01433028..203cc4eb 100644 --- a/client/common/directives/ModelFieldPointsOfInterest/ModelFieldPointsOfInterest.js +++ b/client/common/directives/ModelFieldPointsOfInterest/ModelFieldPointsOfInterest.js @@ -193,7 +193,7 @@ angular.module('dashboard.directives.ModelFieldPointsOfInterest', [ scope.doSearch(); }, function () { - console.error("Error loading Google Maps") + console.error("Error loading Google Maps"); }); function initMap() { @@ -298,16 +298,19 @@ angular.module('dashboard.directives.ModelFieldPointsOfInterest', [ var text = "Location: " + results[i].name; var marker = new google.maps.Marker({ map: map, - position: results[i].geometry.location, + position: results[i].geometry.location }); + /* jshint ignore: start */ google.maps.event.addListener(marker, 'click', (function(marker, text) { return function() { markerLocation = marker.getPosition(); infowindow.setContent(text); infowindow.open(map, marker); scope.getClickedMarker(markerLocation); - } + }; })(marker, text)); + /* jshint ignore:end */ + scope.markers.push(marker); } } @@ -412,7 +415,7 @@ angular.module('dashboard.directives.ModelFieldPointsOfInterest', [ } else { console.log('The selection made does not exist'); } - }) + }); }; scope.getSelectResultData = function (item) { diff --git a/client/common/directives/ModelFieldReference/ModelFieldReference.js b/client/common/directives/ModelFieldReference/ModelFieldReference.js index 13377340..41f91016 100644 --- a/client/common/directives/ModelFieldReference/ModelFieldReference.js +++ b/client/common/directives/ModelFieldReference/ModelFieldReference.js @@ -73,8 +73,9 @@ angular.module('dashboard.directives.ModelFieldReference', [ var session = JSON.parse($cookies.get('session')); //needed for eval() below var searchString = "{session."; var startPos = string.indexOf(searchString); + var endPos; while (startPos > -1) { - var endPos = string.indexOf("}", startPos); + endPos = string.indexOf("}", startPos); if (endPos == -1) { console.error("ModelList session parsing malformed for string"); break; @@ -87,7 +88,7 @@ angular.module('dashboard.directives.ModelFieldReference', [ searchString = "{"; startPos = string.indexOf(searchString); while (startPos > -1) { - var endPos = string.indexOf("}", startPos); + endPos = string.indexOf("}", startPos); if (endPos == -1) { console.error("ModelList session parsing malformed for string"); break; @@ -119,33 +120,36 @@ angular.module('dashboard.directives.ModelFieldReference', [ var model = Config.serverParams.models[scope.options.model]; var params = { 'filter[limit]': 100 }; //limit only 100 items in drop down list params['filter[where]['+scope.options.searchField+'][like]'] = "%" + search + "%"; + var keys; + var key; if (scope.options.where) { //Add additional filtering on reference results - var keys = Object.keys(scope.options.where); + keys = Object.keys(scope.options.where); for (var i in keys) { - var key = keys[i]; + key = keys[i]; params['filter[where][' + key + ']'] = replaceSessionVariables(scope.options.where[key]); } } if (scope.options.filters) { - var keys = Object.keys(scope.options.filters); - for (var i in keys) { - var key = keys[i]; + keys = Object.keys(scope.options.filters); + for (var j in keys) { + key = keys[j]; params[key] = replaceSessionVariables(scope.options.filters[key]); } } var apiPath = model.plural; + var addNewItem; if (scope.options.api) apiPath = replaceSessionVariables(scope.options.api); GeneralModelService.list(apiPath, params, {preventCancel: true}).then(function(response) { if (!response) return; //in case http request was cancelled by newer request scope.list = response; if (scope.options.allowInsert) { - var addNewItem = {}; + addNewItem = {}; addNewItem[scope.options.searchField] = "[Add New Item]"; scope.list.push(addNewItem); } if (scope.options.allowClear) { - var addNewItem = {}; + addNewItem = {}; addNewItem[scope.options.searchField] = "[clear]"; scope.list.unshift(addNewItem); @@ -281,11 +285,11 @@ angular.module('dashboard.directives.ModelFieldReference', [ var textValue = item[scope.options.searchField]; if (item && item[scope.options.searchField] == "[Add New Item]") { //console.log("should add " + $select.search); - var value = element.find("input.ui-select-search").val(); - scope.data = value; + var input = element.find("input.ui-select-search").val(); + scope.data = input; var newItem = {}; - newItem[scope.options.key] = value; - newItem[scope.options.searchField] = value; + newItem[scope.options.key] = input; + newItem[scope.options.searchField] = input; scope.selected.item = newItem; scope.list.push(newItem); } else if (item && item[scope.options.searchField] == "[clear]") { @@ -334,11 +338,11 @@ angular.module('dashboard.directives.ModelFieldReference', [ //Remove item previously loaded using object key var where = {}; where[scope.options.key] = item[scope.options.key]; - var index = _.findIndex(scope.modelData[scope.options.relationship], where); + index = _.findIndex(scope.modelData[scope.options.relationship], where); if (index > -1) scope.modelData[scope.options.relationship].splice(index, 1); } //Look for direct reference match - var index = scope.modelData[scope.options.relationship].indexOf(item); + index = scope.modelData[scope.options.relationship].indexOf(item); if (index > -1) scope.modelData[scope.options.relationship].splice(index, 1); mergeArray(scope.selected.items, scope.modelData[scope.options.relationship]); //make sure to merge in any items previously selected } else { diff --git a/client/common/directives/ModelFieldReference/ModelFieldReferenceSort.js b/client/common/directives/ModelFieldReference/ModelFieldReferenceSort.js index b408c3b6..ce695043 100644 --- a/client/common/directives/ModelFieldReference/ModelFieldReferenceSort.js +++ b/client/common/directives/ModelFieldReference/ModelFieldReferenceSort.js @@ -63,7 +63,7 @@ angular.module('dashboard.directives.ModelFieldReferenceSort', [ scope.sortableOptions = { placeholder: 'sortable-placeholder', disabled: scope.disabled - } + }; function replaceSessionVariables(string) { if (typeof string !== 'string') return string; @@ -72,8 +72,9 @@ angular.module('dashboard.directives.ModelFieldReferenceSort', [ var session = JSON.parse($cookies.get('session')); //needed for eval() below var searchString = "{session."; var startPos = string.indexOf(searchString); + var endPos; while (startPos > -1) { - var endPos = string.indexOf("}", startPos); + endPos = string.indexOf("}", startPos); if (endPos == -1) { console.error("ModelList session parsing malformed for string"); break; @@ -86,7 +87,7 @@ angular.module('dashboard.directives.ModelFieldReferenceSort', [ searchString = "{"; startPos = string.indexOf(searchString); while (startPos > -1) { - var endPos = string.indexOf("}", startPos); + endPos = string.indexOf("}", startPos); if (endPos == -1) { console.error("ModelList session parsing malformed for string"); break; @@ -105,18 +106,20 @@ angular.module('dashboard.directives.ModelFieldReferenceSort', [ var model = Config.serverParams.models[scope.options.model]; var params = { 'filter[limit]': 100 }; //limit only 100 items in drop down list params['filter[where]['+scope.options.searchField+'][like]'] = "%" + search + "%"; + var keys; + var key; if (scope.options.where) { //Add additional filtering on reference results - var keys = Object.keys(scope.options.where); + keys = Object.keys(scope.options.where); for (var i in keys) { - var key = keys[i]; + key = keys[i]; params['filter[where][' + key + ']'] = replaceSessionVariables(scope.options.where[key]); } } if (scope.options.filters) { - var keys = Object.keys(scope.options.filters); - for (var i in keys) { - var key = keys[i]; + keys = Object.keys(scope.options.filters); + for (var j in keys) { + key = keys[j]; params[key] = replaceSessionVariables(scope.options.filters[key]); } } diff --git a/client/common/directives/ModelFieldWYSIWYG/ModelFieldWYSIWYG.js b/client/common/directives/ModelFieldWYSIWYG/ModelFieldWYSIWYG.js index 7c35d7ef..250c0586 100644 --- a/client/common/directives/ModelFieldWYSIWYG/ModelFieldWYSIWYG.js +++ b/client/common/directives/ModelFieldWYSIWYG/ModelFieldWYSIWYG.js @@ -156,7 +156,7 @@ angular.module('dashboard.directives.ModelFieldWYSIWYG', [ function initWysiwygEditor() { // check for multiple instances var instances = $('.wysiwyg-editor'); - var instanceIdx = 0 + var instanceIdx = 0; if(instances && instances.length > 0) { instanceIdx = instances.length; } diff --git a/client/common/filters/filters.js b/client/common/filters/filters.js index 84016690..5a995355 100644 --- a/client/common/filters/filters.js +++ b/client/common/filters/filters.js @@ -26,7 +26,7 @@ angular.module('dashboard.filters', [ value = parseInt(valueComponents[0]) + '.'; } if (valueComponents[1].match(/[\D]/) !== null) { - return NaN + return NaN; } else if (valueComponents[1].length > scale) { //Truncate value value += valueComponents[1].substring(0, scale); diff --git a/client/common/services/CacheService.js b/client/common/services/CacheService.js index b22f74a1..53f3dcdf 100644 --- a/client/common/services/CacheService.js +++ b/client/common/services/CacheService.js @@ -37,11 +37,11 @@ angular.module('dashboard.services.Cache', [ if (action.options.api) key = action.options.api; if(params) key += this.KEY_DELIMITER + JSON.stringify(params); return key; - } + }; this.clear = function(model) { var key = model; - var regex = new RegExp('^'+key) + var regex = new RegExp('^'+key); for(var k in localStorage) { if(regex.test(k)) @@ -51,10 +51,9 @@ angular.module('dashboard.services.Cache', [ } }; - this.reset = function() - { + this.reset = function() { localStorage.clear(); - } + }; }) ; diff --git a/client/common/services/FileUploadService.js b/client/common/services/FileUploadService.js index 51fad01f..f4b1f9c8 100644 --- a/client/common/services/FileUploadService.js +++ b/client/common/services/FileUploadService.js @@ -110,7 +110,9 @@ angular.module('dashboard.services.FileUpload', [ if (!deferred) deferred = $q.defer(); var fileKey = null; //the file key represents the model (table) column key used for reference var exportKey = null; //the export key represents the various sizes of the image + var exportKeys = null; var file = null; + var imageFile = null; var currentUploadedSize = 0; var totalUploadSize = 0; @@ -135,7 +137,7 @@ angular.module('dashboard.services.FileUpload', [ if (!imageUploadResults) imageUploadResults = []; //initialize results object //Calculate File Size for (var i = 0; i < imageFiles.length; i++) { - var imageFile = imageFiles[i].file ? imageFiles[i].file : imageFiles[i]; + imageFile = imageFiles[i].file ? imageFiles[i].file : imageFiles[i]; if (i < fileIndex) currentUploadedSize += imageFile.size; totalUploadSize += imageFile.size; } @@ -157,7 +159,7 @@ angular.module('dashboard.services.FileUpload', [ file = exports; //the case where no exports are specified in options } else { //exports contains various export file objects - var exportKeys = Object.keys(exports); + exportKeys = Object.keys(exports); if (exportIndex >= exportKeys.length) { //Processed all export keys so move to next file fileIndex++; @@ -177,19 +179,19 @@ angular.module('dashboard.services.FileUpload', [ if (!imageUploadResults) imageUploadResults = {}; //initialize results object //Calculate File Size - for (var i = 0; i < fileKeys.length; i++) { - var fkey = fileKeys[i]; - var exports = imageFiles[fkey]; + for (var j = 0; j < fileKeys.length; j++) { + var fkey = fileKeys[j]; + exports = imageFiles[fkey]; if (exports && exports.type && exports.size) { //exports is a file object - var imageFile = exports; - if (i < fileIndex) { + imageFile = exports; + if (j < fileIndex) { currentUploadedSize += imageFile.size; } totalUploadSize += imageFile.size; } else if (exports && exports.file) { - var imageFile = exports.file; - if (i < fileIndex) { + imageFile = exports.file; + if (j < fileIndex) { currentUploadedSize += imageFile.size; } totalUploadSize += imageFile.size; @@ -197,8 +199,8 @@ angular.module('dashboard.services.FileUpload', [ //exports contains various export file objects for (var k = 0; k < exportKeys.length; k++) { var ekey = exportKeys[k]; - var imageFile = exports[ekey].file ? exports[ekey].file : exports[ekey]; - if (i < fileIndex || (i == fileIndex && k < exportIndex)) { + imageFile = exports[ekey].file ? exports[ekey].file : exports[ekey]; + if (j < fileIndex || (j == fileIndex && k < exportIndex)) { currentUploadedSize += imageFile.size; } totalUploadSize += imageFile.size; @@ -752,6 +754,6 @@ angular.module('dashboard.services.FileUpload', [ } return ''; - } + }; }); diff --git a/client/common/services/GeneralModelService.js b/client/common/services/GeneralModelService.js index 55b4ffdd..32862e8e 100644 --- a/client/common/services/GeneralModelService.js +++ b/client/common/services/GeneralModelService.js @@ -13,8 +13,8 @@ angular.module('dashboard.services.GeneralModel', [ /** * Returns a list of models given filter params (see loopback.io filters) */ - this.list = function(apiPath, params, options) { - var apiPath = apiPath + (apiPath.indexOf('?')>-1 ? '&' : '?') + 'access_token=' + $cookies.get('accessToken'); + this.list = function(path, params, options) { + var apiPath = path + (path.indexOf('?')>-1 ? '&' : '?') + 'access_token=' + $cookies.get('accessToken'); if (!options || !options.preventCancel) Utils.apiCancel('GET', apiPath); //cancels any prior calls to method + path return Utils.apiHelper('GET', apiPath, params); }; diff --git a/client/common/services/ImageService.js b/client/common/services/ImageService.js index 284e7aab..e6e490a9 100644 --- a/client/common/services/ImageService.js +++ b/client/common/services/ImageService.js @@ -26,6 +26,7 @@ angular.module('dashboard.services.Image', []) var width = options.width ? options.width : image.width; var height = options.height ? options.height : image.height; var aspect = options.aspect ? options.aspect : 'fit'; + var scale; switch(aspect) { case "stretch": canvas.width = width; @@ -34,13 +35,14 @@ angular.module('dashboard.services.Image', []) case "fill": canvas.width = width; canvas.height = height; - var scale = Math.max(width / image.width, height / image.height); + scale = Math.max(width / image.width, height / image.height); width = image.width * scale; height = image.height * scale; break; case "fit": + /* falls through */ default: - var scale = Math.min(width / image.width, height / image.height); + scale = Math.min(width / image.width, height / image.height); if (scale > 1.0) scale = 1.0; //don't enlarge the image width = image.width * scale; height = image.height * scale; diff --git a/client/common/services/SessionService.js b/client/common/services/SessionService.js index c0ea5f0b..1149b31a 100644 --- a/client/common/services/SessionService.js +++ b/client/common/services/SessionService.js @@ -90,9 +90,10 @@ angular.module('dashboard.services.Session', [ var path = toParams.model; // model = config.nav[].path var label = toParams.action;// action = config.nav[].label var roles = angular.fromJson($cookies.get('roles')); + var found; if(!_.isEmpty(path)) { //check subnavs - var found = _.find(nav, { path: path }); + found = _.find(nav, { path: path }); if(found) { if(!DashboardService.hasAccess(roles, found)) return false; if(_.isArray(found.subnav) && !_.isEmpty(label)) { @@ -101,7 +102,7 @@ angular.module('dashboard.services.Session', [ } } } else { // check top nav using state - var found = _.find(nav, { state: state }); + found = _.find(nav, { state: state }); if(found) return DashboardService.hasAccess(roles, found); } diff --git a/index.js b/index.js index 44c20628..377c6e67 100644 --- a/index.js +++ b/index.js @@ -38,7 +38,6 @@ var express = require('express') , customSort = require('./server/sort') , aws = require('./server/aws.js') , package = require('./package.json'); - ; var environment = process.env.NODE_ENV || 'development' @@ -273,7 +272,7 @@ function cms(loopbackApplication, options) { //force browser cache refresh on custom UI modules after deployment (when service restarts) if (config.public.customModules) { - var version = Math.ceil((new Date).getTime()/300000)*300000; //unique code within 5min window (for multi-web server instances) + var version = Math.ceil((new Date()).getTime()/300000)*300000; //unique code within 5min window (for multi-web server instances) for (var i in config.public.customModules) { var customModule = config.public.customModules[i]; if (!customModule.files) continue; diff --git a/server/aws.js b/server/aws.js index 1600a5ce..cae8b02b 100644 --- a/server/aws.js +++ b/server/aws.js @@ -81,7 +81,7 @@ function getS3Credentials(path, fileType, callback) { signature: signature }; callback(null, credentials); -}; +} module.exports = { setConfig: function(config) { diff --git a/server/relational-upsert.js b/server/relational-upsert.js index f3ad90b2..5e567bba 100644 --- a/server/relational-upsert.js +++ b/server/relational-upsert.js @@ -191,8 +191,9 @@ function next(processRelationshipType, model, data, index, callback) { * @param callback */ function upsertManyToMany(model, data, relationshipKey, relationshipData, relationSettings, callback) { + var message = ""; if (!relationSettings.through) { - var message = "upsertManyToMany cannot proceed as no relations." + relationshipKey + ".through exists in " + model.name + " JSON definition"; + message = "upsertManyToMany cannot proceed as no relations." + relationshipKey + ".through exists in " + model.name + " JSON definition"; console.error("ERROR: " + message); //callback({ error: message }); callback(); @@ -202,7 +203,7 @@ function upsertManyToMany(model, data, relationshipKey, relationshipData, relati var junctionSettings = model.settings.relations[relationSettings.through]; if (!junctionSettings) junctionSettings = model.settings.relations[inflection.pluralize(relationSettings.through)]; if (!junctionSettings) { - var message = "upsertManyToMany cannot proceed as no model.settings.relations." + relationSettings.through + " or "+ inflection.pluralize(relationSettings.through) +" exists in " + model.name + " JSON definition"; + message = "upsertManyToMany cannot proceed as no model.settings.relations." + relationSettings.through + " or "+ inflection.pluralize(relationSettings.through) +" exists in " + model.name + " JSON definition"; console.error("ERROR: " + message); //callback({ error: message }); callback(); @@ -214,8 +215,9 @@ function upsertManyToMany(model, data, relationshipKey, relationshipData, relati var junctionRelations = junctionModel.settings.relations; var junctionRelationIdKey = null; var keys = Object.keys(junctionRelations); + var key; for (var i in keys) { - var key = keys[i]; + key = keys[i]; var junctionRelationshipSettings = junctionRelations[key]; if (junctionRelationshipSettings.model == relationSettings.model) { junctionRelationIdKey = junctionRelationshipSettings.foreignKey; @@ -224,7 +226,7 @@ function upsertManyToMany(model, data, relationshipKey, relationshipData, relati } if (!junctionRelationIdKey) { - var message = "upsertManyToMany cannot proceed as no relation named '" + relationSettings.model + "' exists in " + junctionSettings.model + " JSON definition"; + message = "upsertManyToMany cannot proceed as no relation named '" + relationSettings.model + "' exists in " + junctionSettings.model + " JSON definition"; console.error("ERROR: " + message); callback({ error: message }); return; @@ -236,7 +238,7 @@ function upsertManyToMany(model, data, relationshipKey, relationshipData, relati var modelId = data[modelIdKey]; if (!modelId) { - var message = "upsertManyToMany cannot proceed as no data[modelIdKey] found for modelIdKey = '" + modelIdKey + "'"; + message = "upsertManyToMany cannot proceed as no data[modelIdKey] found for modelIdKey = '" + modelIdKey + "'"; console.error("ERROR: " + message); callback({ error: message }); return; @@ -249,15 +251,15 @@ function upsertManyToMany(model, data, relationshipKey, relationshipData, relati //FIRST Delete Any existing Primary Model's records from junction table var where = {}; where[junctionModelIdKey] = modelId; - for (var i in relationshipData) { - var junctionData = relationshipData[i]; + for (var j in relationshipData) { + var junctionData = relationshipData[j]; if (junctionData && junctionData[relationIdKey]) { //delete only the junction table records matching the junction meta (this is import as not to delete records //that should not be deleted (i.e. when 2 ModelFieldReference fields exists with different junctionMeta values) if (junctionData.junctionMeta) { - var keys = Object.keys(junctionData.junctionMeta); - for (var i in keys) { - var key = keys[i]; + keys = Object.keys(junctionData.junctionMeta); + for (var k in keys) { + key = keys[k]; if (typeof where[key] !== 'undefined' && where[key] != junctionData.junctionMeta[key]) { if (typeof where[key] === 'string' || typeof where[key] === 'number') { where[key] = {inq: [where[key]]};