diff --git a/layouts/v7/modules/Mobile/simple/Vtiger/js/Detail.js b/layouts/v7/modules/Mobile/simple/Vtiger/js/Detail.js index 697d9b84f9a57df9a8247c829afd574b4d01c7ac..02fbed0c106d857cb0b10d33a287b7704648cfda 100644 --- a/layouts/v7/modules/Mobile/simple/Vtiger/js/Detail.js +++ b/layouts/v7/modules/Mobile/simple/Vtiger/js/Detail.js @@ -22,22 +22,105 @@ mobileapp.controller('VtigerDetailController', function ($scope, $api) { window.history.back(); }; + var _VTIGER_RESTRICTIONS = { + 'Vtiger' : { + 'View': { + 'Detail': { + 'Fields': { + 'Ignore_Fields': [ + 'modifiedby', + 'last_contacted_via', + 'last_contacted_on', + 'reassign_count', + 'from_portal', + 'prev_sales_stage', + 'txtAdjustment', + 'hdnGrandTotal', + 'hdnTaxType', + 'hdnSubTotal', + 'currency_id', + 'conversion_rate', + 'pre_tax_total', + 'received', + 'balance', + 'hdnS_H_Amount', + 'paid', + 'tags', + 'shipping_&_handling', + 'shipping_&_handling_shtax1', + 'shipping_&_handling_shtax2', + 'shipping_&_handling_shtax3', + 'starred', + 'hdnS_H_Percent', + 'tax1', + 'tax2', + 'tax3', + + ] + } + } + } + } + }; + $scope.lineitems = []; + $scope.lineItemsSummary = {}; + + $scope.prepareLineItems = function(response){ + $scope.lineitems = response.record['LineItems']; + var processedLineItems = []; + for(var index in $scope.lineitems) { + var item = $scope.lineitems[index]; + processedLineItems.push(item); + } + + var lineItemFinalDetails = response.record['LineItems_FinalDetails'][1]['final_details']; + for(var index in response.record['LineItems_FinalDetails']) { + var final_detail = response.record['LineItems_FinalDetails'][index]; + processedLineItems[index - 1]['netPrice'] = final_detail["netPrice"+index]; + } + $scope.lineitems = processedLineItems; + $scope.lineItemsSummary['pre_tax_total'] = response.record.pre_tax_total; + $scope.lineItemsSummary['sub_total'] = response.record.hdnSubTotal; + $scope.lineItemsSummary['grand_total'] = response.record.hdnGrandTotal; + $scope.lineItemsSummary['group_discount'] = response.record.hdnDiscountAmount; + $scope.lineItemsSummary['total_tax'] = lineItemFinalDetails['tax_totalamount']; + $scope.lineItemsSummary['totalAfterDiscount'] = lineItemFinalDetails['totalAfterDiscount']; + $scope.lineItemsSummary['adjustment'] = lineItemFinalDetails['adjustment']; + }; + $scope.loadRecord = function () { - $api('fetchRecord', {module:$scope.module, record:$scope.record}, function(e,r) { - + $api('fetchRecord', {module:$scope.module, record:$scope.record, view_mode:'web'}, function(e,r) { + $scope.record_label = r.record.label; + $scope.recordId = r.record.id; + if($scope.module == 'Invoice' || $scope.module == 'Quotes' || $scope.module == 'PurchaceOrder' || $scope.module == 'SalesOrder'){ + $scope.prepareLineItems(r); + } var processedData = []; + var ignoreFields = _VTIGER_RESTRICTIONS['Vtiger']['View']['Detail']['Fields']['Ignore_Fields']; for(var index in $scope.fields) { - var value = r.record[$scope.fields[index].name]; - if(typeof value === 'object') { - processedData.push({label:$scope.fields[index].label, value:value.label}); + if(ignoreFields.indexOf($scope.fields[index].name) === -1) { + var value = r.record[$scope.fields[index].name]; + if(typeof value === 'object') { + processedData.push({label:$scope.fields[index].label, value:value.label, type:$scope.fields[index].type.name}); - } else { - processedData.push({label:$scope.fields[index].label, value:value}); + } else { + processedData.push({label:$scope.fields[index].label, value:value, type:$scope.fields[index].type.name}); + } } } - + $scope.pageTitle = r.record.label; $scope.recordData = processedData; }); + //related tab + + $api('fetchRecord', {mode:'getRelatedRecordCount', module:$scope.module, record:$scope.record}, function(er, re) { + if(re){ + $scope.relatedModules = {}; + for(var key in re){ + $scope.relatedModules[key] = re[key].count; + } + } + }); }; $scope.detailViewEditEvent = function(id){ @@ -51,6 +134,9 @@ mobileapp.controller('VtigerDetailController', function ($scope, $api) { $scope.isDeleteable = function() { return ($scope.deleteable)? true : false; }; + $scope.showRelatedList = function(module){ + window.location.href = "index.php?module="+module+"&view=List&app="+$scope.selectedApp; + }; }); @@ -79,4 +165,4 @@ mobileapp.controller('InlineEditorController', function($scope){ e.stopPropagation(); $scope.showtooltip = !$scope.showtooltip; }; -}); \ No newline at end of file +}); diff --git a/layouts/v7/modules/Mobile/simple/Vtiger/js/Edit.js b/layouts/v7/modules/Mobile/simple/Vtiger/js/Edit.js index 9710ca8122b43869ab2fdc6a2307155f1def684a..80762def7b14ad293f84b36b8860acac018c1f0e 100644 --- a/layouts/v7/modules/Mobile/simple/Vtiger/js/Edit.js +++ b/layouts/v7/modules/Mobile/simple/Vtiger/js/Edit.js @@ -4,7 +4,7 @@ * and open the template in the editor. */ -mobileapp.controller('VtigerEditController', function ($scope, $api, $mdToast, $animate) { +mobileapp.controller('VtigerEditController', function ($scope, $api, $mdToast, $filter, $q) { var url = jQuery.url(); $scope.module = url.param('module'); $scope.record = url.param('record'); @@ -15,47 +15,179 @@ mobileapp.controller('VtigerEditController', function ($scope, $api, $mdToast, $ $scope.deleteable = null; $scope.fieldsData = null; $scope.editdata = []; + + + + var _processFields = function(field, newrecord, value){ + if(newrecord){ + field.raw = field.type.defaultValue; + } + if(!newrecord && value){ + field.raw = value; + } + if($scope.module == 'Calendar' && field.name == 'activitytype'){ + field.raw = 'Task'; + } + switch(field.type.name) { + case 'date': + if(value){ + field.raw = new Date(value); + } + else{ + field.raw = new Date(); + } + break; + case 'time': + if(value){ + field.raw = new Date(value); + } + else{ + field.raw = new Date(); + } + break; + case 'reference': + if(value){ + field.raw = value.value; + field.valueLabel = value.label; + } + break; + case 'owner': + if(value){ + field.raw = value.value; + field.display = value.label; + } + break; + case 'boolean': + if(value){ + field.raw = value == '1' ? true : false; + } + break; + } + return field; + }; + var ignorefields = ['duration_hours','duration_minutes','notime','starred','tags','modifiedby','reminder_time','imagename','taxclass','isconvertedfromlead','donotcall']; + + //Function to prepare create data. + var prepareCreateData = function(newRecord, record){ + var fields = $scope.fields; + var processedData = {}; + for(var i=0; i < fields.length; i++) { + var field = fields[i]; + if(ignorefields.indexOf(field.name) !== -1){ + continue; + } + if(field.editable) { + //salutationtype type is not picklist + if(field.name == 'salutationtype'){ + field.type.name = 'picklist'; + } + if(newRecord){ + //set default value + if(field.default){ + field.raw = field.default; + } + //set today date as default date. + if(!field.default && (field.type.name == 'date' || field.type.name == 'time')){ + field.raw = new Date(); + } + } + else{ + field.raw = record.record[field.name]; + } + //Process the field data + if(newRecord){ + field = _processFields(field, true); + } + else{ + field = _processFields(field, false, record.record[field.name]); + } + processedData[field.name] = field; + } + } + $scope.fieldsData = processedData; + }; + $api('describe', {module: $scope.module}, function (e, r) { $scope.describeObject = r.describe; $scope.fields = $scope.describeObject.fields; $scope.createable = $scope.describeObject.createable; $scope.updateable = $scope.describeObject.updateable; $scope.deleteable = $scope.describeObject.deleteable; - $scope.loadFields(); + if($scope.record){ + $scope.loadFields(); + } + else{ + prepareCreateData(true); + } }); - + $scope.gobacktoUrl = function () { window.history.back(); }; + $scope.loadFields = function () { - $api('fetchRecord', {module: $scope.module, record: $scope.record}, function (e, r) { - - var processedData = []; - for (var index in $scope.fields) { - var value = r.record[$scope.fields[index].name]; - if (typeof value === 'object') { - processedData.push({label: $scope.fields[index].label, value: value.label, name: $scope.fields[index].name, editable: $scope.fields[index].editable, mandatory: $scope.fields[index].mandatory}); - - } else { - processedData.push({label: $scope.fields[index].label, value: value, name: $scope.fields[index].name, editable: $scope.fields[index].editable, mandatory: $scope.fields[index].mandatory}); - } + $api('fetchRecord', {module: $scope.module, record: $scope.record, view_mode:'web'}, function (e, r) { + if(r){ + prepareCreateData(false, r); } - $scope.fieldsData = processedData; }); + }; + $scope.editdata = {}; + $scope.processEditData = function(fieldsData) { + for (var index in fieldsData) { + var field = fieldsData[index]; + var value = field.raw; + if(!value) value=''; + switch (field.type.name){ + //Should convert date time to utc. + case 'date' : + value = field.raw; + value = moment.utc(value).format('MM-DD-YYYY'); + break; + + case 'time' : + value = field.raw; + value = moment.utc(value).format('HH:mm:ss'); + break; + + case 'reference' : + if(value && field.editable){ + value = field.raw; + var webservice_value = value.split('x'); + value = webservice_value[1]; + } + break; + + case 'owner' : + if(value && field.editable){ + value = field.raw; + var webservice_value = value.split('x'); + value = webservice_value[1]; + console.log(value); + } + break; + } + if(field.editable){ + $scope.editdata[field.name] = value; + } + } }; + $scope.saveThisRecord = function () { - $scope.editdata = {}; - for (var index in $scope.fieldsData) { - $scope.editdata[$scope.fieldsData[index].name] = $scope.fieldsData[index].value; - } + $scope.processEditData($scope.fieldsData); $api('saveRecord', {module: $scope.module, record: $scope.record, values: $scope.editdata}, function (e, r) { - console.log(r); - var toast = $mdToast.simple().content('Record Saved Successfully!'). position($scope.getToastPosition()).hideDelay(1000); - $mdToast.show(toast); + if (r) { + var toast = $mdToast.simple().content('Record Saved Successfully!').position($scope.getToastPosition()).hideDelay(1000); + $mdToast.show(toast); + window.location.href = "index.php?module="+$scope.module+"&view=Detail&record="+r.id+"&app="+$scope.selectedApp; + } else { + var toast = $mdToast.simple().content('Some thing went wrong ! \n Save is not Succesfull.').position($scope.getToastPosition()).hideDelay(1000); + $mdToast.show(toast); + window.location.href = "index.php?module="+$scope.module+"&view=List&app="+$scope.selectedApp; + } }); - }; $scope.toastPosition = { @@ -64,11 +196,38 @@ mobileapp.controller('VtigerEditController', function ($scope, $api, $mdToast, $ left: false, right: true }; + $scope.getToastPosition = function () { return Object.keys($scope.toastPosition) .filter(function (pos) { return $scope.toastPosition[pos]; - }) - .join(' '); + }).join(''); + }; + + //Search reference records + $scope.getMatchedReferenceFields = function (query, field) { + var deferred = $q.defer(); + var refModule = field.type.refersTo[0]; + if(query) { + $api('fetchReferenceRecords', {module: refModule, searchValue: query}, function (error, response) { + if(response) { + var result = []; + angular.forEach(response, function (item, key) { + item['valueLabel'] = item.label; + result.push(item) + }); + return deferred.resolve(result); + } + }); + } + return deferred.promise; + }; + + $scope.setReferenceFieldValue = function(item, field){ + if(item){ + field.raw = item.value; + field.display = item.label; + field.selectedItem = {
'id' : item.id,
 'label' : item.label
}; + } }; -}); +}); \ No newline at end of file diff --git a/layouts/v7/modules/Mobile/simple/Vtiger/js/List.js b/layouts/v7/modules/Mobile/simple/Vtiger/js/List.js index 61db9f443dd255babb2579ad20c139b67cfac604..ebc2a504c5f71c7907d55e4243882c2d45413e71 100644 --- a/layouts/v7/modules/Mobile/simple/Vtiger/js/List.js +++ b/layouts/v7/modules/Mobile/simple/Vtiger/js/List.js @@ -29,6 +29,7 @@ mobileapp.controller('VtigerListController', function ($scope, $api, $mdDialog) // To fetch data from service with the given params $scope.loadRecords = function () { + $scope.pageTitle = $scope.module; $api('listModuleRecords', {module: $scope.module, filterid: $scope.selectedFilter, page: $scope.page, orderBy: $scope.orderBy, sortOrder: $scope.sortOrder}, function (e, r) { $scope.records = r.records; $scope.selectedFilter = r.selectedFilter; @@ -59,6 +60,9 @@ mobileapp.controller('VtigerListController', function ($scope, $api, $mdDialog) } }); }; + $scope.listViewCreateEvent = function(){ + window.location.href = "index.php?module=" + $scope.module + "&view=Edit&app=" + $scope.selectedApp; + }; // Method to Reorder records in Asc / Desc $scope.sortRecords = function () { @@ -87,7 +91,7 @@ mobileapp.controller('VtigerListController', function ($scope, $api, $mdDialog) .targetEvent(ev); $mdDialog.show(confirm).then(function() { $api('deleteRecords', {record:id}, function(e,r) { - console.log(ev.currentTarget) +// console.log(ev.currentTarget) }); }); }; diff --git a/layouts/v7/modules/Mobile/simple/Vtiger/js/Vtiger.js b/layouts/v7/modules/Mobile/simple/Vtiger/js/Vtiger.js index b49b729678940a9c7a036b2034b3587f8a94dd01..4506734f4bc2532a4d17bec624921093ed55a7aa 100644 --- a/layouts/v7/modules/Mobile/simple/Vtiger/js/Vtiger.js +++ b/layouts/v7/modules/Mobile/simple/Vtiger/js/Vtiger.js @@ -13,23 +13,27 @@ mobileapp.controller('VtigerBodyController', function ($scope, $api, $mdUtil, $m $scope.defaultApp = null; $scope.dynamicTheme = null; $scope.modules = null; - $scope.pageTitle = "Dashboard"; - + /* Use this function when you aren't sure to $apply or $digest */ function scopeApply(fn) { $scope.$$phase ? fn() : $scope.$apply(fn); } + + $scope.setSelectedApp = function (selectedApp) { + $scope.selectedApp = selectedApp.toUpperCase(); + } $scope.init = function () { $api('userInfo', function (e, r) { if (r) { + var currentApp = jQuery.url().param('app'); scopeApply(function () { $scope.userinfo = r.userinfo; $scope.apps = r.apps; $scope.menus = r.menus; $scope.edition = r.edition; - $scope.selectedApp = r.defaultApp.toUpperCase(); - $scope.dynamicTheme = r.defaultApp.toUpperCase(); + $scope.selectedApp = currentApp.toUpperCase(); + $scope.dynamicTheme = currentApp.toUpperCase(); $scope.$root.$emit('UserInfo.Changed'); }); } diff --git a/layouts/v7/modules/Mobile/simple/Vtiger/js/application.js b/layouts/v7/modules/Mobile/simple/Vtiger/js/application.js index 23882c5dae4376719faefd5c1728c1e07af2905f..aa3a1f59423a196a0ee8551f793ec0238c9b7a66 100644 --- a/layouts/v7/modules/Mobile/simple/Vtiger/js/application.js +++ b/layouts/v7/modules/Mobile/simple/Vtiger/js/application.js @@ -7,10 +7,11 @@ * All Rights Reserved. * **************************************************************************************/ -window.mobileapp = angular.module('mobileapp', ['ngMaterial', 'ngTouch', 'ngAnimate']); -mobileapp.factory('$api', function ($http) { +window.mobileapp = angular.module('mobileapp', ['ngMaterial', 'ngTouch', 'ngAnimate','ngMaterialDatePicker']); +mobileapp.factory('$api', function ($http, $mdDialog) { var APIBASE = 'api.php', APIVERSION = 'v2'; - + this.progressDialog = null; + return function (operation, params, next) { if (typeof params == 'function') { next = params; @@ -26,12 +27,29 @@ mobileapp.factory('$api', function ($http) { options.url = APIBASE; options.data = params; options.headers = {'X-API-VERSION': APIVERSION}; - + if(!this.progressDialog){ + var parentEl = angular.element(document.body); + var alert = $mdDialog.alert({ + parent: parentEl, + fullscreen: false, + clickOutsideToClose: false, + template: '<md-dialog aria-label="Loading Bar">'+ + '<md-dialog-content>'+ + '<md-progress-linear md-mode="indeterminate"></md-progress-linear>'+ + '<div layout="row" style="margin: 20px;">'+ + '<span style="margin:15px 10px; opacity: 0.5;"><i class="mdi mdi-clock"></i> in progress...</span>'+ + '</div>'+ + '</md-dialog-content>'+ + '</md-dialog>' + }); + this.progressDialog = $mdDialog.show(alert); + } $http(options).success(function (data, status, headers, config) { + $mdDialog.hide(); if (next) { next(!data.success ? new Error(data.error.message) : null, data.success ? data.result : null); } }); }; -}); +}); \ No newline at end of file