From ad481206483afbb3c2688479c350f6bed64d273c Mon Sep 17 00:00:00 2001 From: resicovenba Date: Sat, 9 Dec 2017 17:18:27 +0530 Subject: [PATCH] branch logo upload --- .../controllers/Branch_Controller.php | 30 +- .../api/application/models/Branch_model.php | 39 ++- Apollo/assets/js/controllers/branchCtrl.js | 301 +++++++++++++---- Apollo/assets/views/branchDetails.html | 309 +++++++++--------- Apollo/assets/views/editBranchDetails.html | 68 +++- Apollo/assets/views/partials/nav.html | 13 + Apollo/images/employee/Dri_9jwuh7dZD2na.jpeg | Bin 0 -> 15072 bytes 7 files changed, 533 insertions(+), 227 deletions(-) create mode 100644 Apollo/images/employee/Dri_9jwuh7dZD2na.jpeg diff --git a/Apollo/api/application/controllers/Branch_Controller.php b/Apollo/api/application/controllers/Branch_Controller.php index fff50bd3..60c6758f 100755 --- a/Apollo/api/application/controllers/Branch_Controller.php +++ b/Apollo/api/application/controllers/Branch_Controller.php @@ -49,17 +49,25 @@ class Branch_Controller extends REST_Controller { public function addBranchDetails_post() { + $details['BranchCode'] = $this->post('branchCode'); $details['BranchName'] = $this->post('branchName'); - $details['LogoPath'] = $this->post('logo'); + // $details['LogoPath'] = $this->post('logo'); $details['MobileNumber'] = $this->post('primaryPhone'); $details['AlternateNumber'] = $this->post('secondaryPhone'); $details['LandlineNumber'] = $this->post('landLine'); $details['Address'] = $this->post('address'); $details['EmailID'] = $this->post('email'); $details['CreatedBy'] = $this->post('createdBy'); - $details['IsActive'] = $this->post('status'); - $branchDetails = $this->branch_model->addBranch($details);// Check if the users data store contains users (in case the database result returns NULL) + $details['IsActive'] = $this->post('status') == true ? 1 : 0; + + $imageStat = $this->post('imageStatus'); + + $imagename = $imageStat == 1 ? $_FILES['logo']['name'] : ''; + $size = $imageStat == 1 ? $_FILES['logo']['size'] : ''; + $imageSource = $imageStat == 1 ? $_FILES['logo']['tmp_name'] : ''; + + $branchDetails = $this->branch_model->addBranch($details, $imageSource);// Check if the users data store contains users (in case the database result returns NULL) if ($branchDetails) { $branchDetails['status'] = REST_Controller::HTTP_OK; @@ -117,10 +125,18 @@ class Branch_Controller extends REST_Controller { $details['LandlineNumber'] = $this->post('landLine'); $details['Address'] = $this->post('address'); $details['EmailID'] = $this->post('email'); - $details['IsActive'] = $this->post('status'); - $details['UpdatedBy'] = $this->post('updatedBy'); - $details['UpdatedOn'] = date("Y-m-d", time()); - $updateDetails = $this->branch_model->updateBranch($details,$branchCode);// Check if the users data store contains users (in case the database result returns NULL) + $details['IsActive'] = $this->post('status') == true ? 1 : 0; + $details['UpdatedBy'] = $this->post('createdBy'); + $date = date('Y-m-d H:i:s'); + $details['UpdatedOn'] = $date; + + $imageStat = $this->post('imageStatus'); + + $imagename = $imageStat == 1 ? $_FILES['logoEdit']['name'] : ''; + $size = $imageStat == 1 ? $_FILES['logoEdit']['size'] : ''; + $imageSource = $imageStat == 1 ? $_FILES['logoEdit']['tmp_name'] : ''; + + $updateDetails = $this->branch_model->updateBranch($details,$branchCode, $imageSource, $imageStat );// Check if the users data store contains users (in case the database result returns NULL) if ($updateDetails) { $updateDetails['status'] = REST_Controller::HTTP_OK; diff --git a/Apollo/api/application/models/Branch_model.php b/Apollo/api/application/models/Branch_model.php index e124c222..97976bc7 100755 --- a/Apollo/api/application/models/Branch_model.php +++ b/Apollo/api/application/models/Branch_model.php @@ -15,9 +15,14 @@ class Branch_model extends CI_Model { * created by kms * */ - public function addBranch($arrayDetails=null) + public function addBranch($arrayDetails=null, $imageSource) { - + + $target = "../images/logo/"; + $getUploadStatus = $this-> upload_image($imageSource, $target); + $imageNameDb = $getUploadStatus['imageName']; + $arrayDetails['LogoPath'] = $getUploadStatus == true ? "logo/".$imageNameDb : ''; +// print_r($arrayDetails['IsActive']);exit(); $this->db->select('BranchCode'); $this->db->where('BranchCode', $arrayDetails['BranchCode']); if($this->db->get(BRANCH)->first_row()){ @@ -80,12 +85,22 @@ class Branch_model extends CI_Model { * created by kms * */ - public function updateBranch($arrayDetails=null,$branchCode=null) + public function updateBranch($arrayDetails=null,$branchCode=null, $imageSource, $imageStat) { + if( $imageStat == 1 ) { + $target = "../images/logo/"; + $getUploadStatus = $this-> upload_image($imageSource, $target); + $imageNameDb = $getUploadStatus['imageName']; + $arrayDetails['LogoPath'] = $getUploadStatus == true ? "logo/".$imageNameDb : null; + } else { + + } + +// print_r($arrayDetails['IsActive']);exit(); + $this->db->where('BranchCode',$branchCode); $upateStatus=$this->db->update(BRANCH, $arrayDetails); if($upateStatus){ - $result['branchStatus'] = true; $result['message'] = "Successfully branch details updated"; } @@ -101,5 +116,21 @@ class Branch_model extends CI_Model { } + // image upload in taget path + public function upload_image( $imageSource, $target ) { + $key2 = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'), 0, 12); + $new_regNo = "Dri_" . $key2 . "." . 'jpeg'; + $targetPlace = $target . $new_regNo; + // echo $targetPlace;exit(); + if(!move_uploaded_file($imageSource , $targetPlace)) + { + return $result['status'] = false; + } else { + $result['status'] = true; + $result['imageName'] = $new_regNo; + return $result; + } + } + } \ No newline at end of file diff --git a/Apollo/assets/js/controllers/branchCtrl.js b/Apollo/assets/js/controllers/branchCtrl.js index 597a85a7..2075a734 100755 --- a/Apollo/assets/js/controllers/branchCtrl.js +++ b/Apollo/assets/js/controllers/branchCtrl.js @@ -49,6 +49,51 @@ app.controller('branchCtrl', ["$scope","toaster", "$filter", "ngTableParams", "A $scope.viewId = pid; $scope.editId = -1; };*/ + + + //--------------------------------------------------------------> + // getting for image to show + //--------------------------------------------------------------> + + $scope.stepsModel = []; + $scope.imageUpload = function (event) { + var files = event.target.files; //FileList object + + for (var i = 0; i < files.length; i++) { + var file = files[i]; + var reader = new FileReader(); + reader.onload = $scope.imageIsLoaded; + reader.readAsDataURL(file); + } + } + + $scope.imageIsLoaded = function (e) { + $scope.$apply(function () { + // $scope.stepsModel.push(e.target.result); + $scope.stepsModel[0] = e.target.result; + }); + } + + + //an array of files selected + $scope.files = []; + + //listen for the file selected event + $scope.$on("fileSelected", function (event, args) { + $scope.$apply(function () { + //add the file object to the scope's files collection + $scope.files[0] = args.file; + }); + }); + + + // reset image + $scope.resetImage = function () { + $scope.files.length = 0; + $scope.stepsModel.length = 0; + } + + /* * Submit,update and reset branch details * @params myModel @@ -72,41 +117,70 @@ app.controller('branchCtrl', ["$scope","toaster", "$filter", "ngTableParams", "A angular.element('.ng-invalid[name=' + firstError + ']').focus(); // swal("The form cannot be submitted because it contains validation errors!", "Errors are marked with a red, dashed border!", "error"); } else { - $scope.ldloading1 = {}; + $scope.ldloading1[loading.replace('-', '_')] = true; + + var formData = new FormData(); + var logo = $scope.files[0]; - $scope.ldloading1[loading.replace('-', '_')] = true; + formData.append("branchCode", myModel.branchCode); + formData.append("branchName", myModel.branchName); + formData.append("email", myModel.email); + formData.append("primaryPhone", myModel.primaryPhone); + formData.append("secondaryPhone", myModel.secondaryPhone); + formData.append("landLine", myModel.landLine); + formData.append("address", myModel.address); + formData.append("status", myModel.switchsetting); + var checkImg = logo == undefined ? 0 : 1; + formData.append("imageStatus", checkImg); + + formData.append("createdBy", JSON.parse(localStorage.getItem('localObj')).localUserID); + formData.append('logo', logo); - var addBranch = { - method: 'POST', - url: apiPoint.url + 'addBranchDetails/', - headers: { - 'Content-Type': 'application/json' - }, - data: { - branchCode: myModel.branchCode, - branchName: myModel.branchName, - email: myModel.email, - primaryPhone: myModel.primaryPhone, - secondaryPhone: myModel.secondaryPhone, - landLine: myModel.landLine, - address: myModel.address, - logo: myModel.logo, - status: myModel.switchsetting, - createdBy: JSON.parse(localStorage.getItem('localObj')).localUserID + $http.post(apiPoint.url + 'addBranchDetails/', formData, { + transformRequest: angular.identity, + headers: { 'Content-Type': undefined, 'Process-Data': false }, + }).success(function (data) { + if (data.status==200 && data.branchStatus) { + $scope.ldloading1[loading.replace('-', '_')] = false; + swal("Success!", data.message, "success"); + $state.go($state.current, {}, {reload: true}); + } else { + $scope.ldloading1[loading.replace('-', '_')] = false; + swal("Failed!", data.message, "error"); } - }; - $http(addBranch).then(function (response) { - if (response.data.status==200 && response.data.branchStatus) { - $scope.ldloading1[loading.replace('-', '_')] = false; - swal("Success!", response.data.message, "success"); - $state.go($state.current, {}, {reload: true}); - } else { - $scope.ldloading1[loading.replace('-', '_')] = false; - swal("Failed!", response.data.message, "error"); - } - }); + }); + + // var addBranch = { + // method: 'POST', + // url: apiPoint.url + 'addBranchDetails/', + // headers: { + // 'Content-Type': 'application/json' + // }, + // data: { + // branchCode: myModel.branchCode, + // branchName: myModel.branchName, + // email: myModel.email, + // primaryPhone: myModel.primaryPhone, + // secondaryPhone: myModel.secondaryPhone, + // landLine: myModel.landLine, + // address: myModel.address, + // logo: myModel.logo, + // status: myModel.switchsetting, + // createdBy: JSON.parse(localStorage.getItem('localObj')).localUserID + // } + // }; + // $http(addBranch).then(function (response) { + // if (response.data.status==200 && response.data.branchStatus) { + // $scope.ldloading1[loading.replace('-', '_')] = false; + // swal("Success!", response.data.message, "success"); + // $state.go($state.current, {}, {reload: true}); + // } else { + // $scope.ldloading1[loading.replace('-', '_')] = false; + // swal("Failed!", response.data.message, "error"); + // } + // }); } @@ -130,6 +204,46 @@ app.controller('branchCtrl', ["$scope","toaster", "$filter", "ngTableParams", "A } }; + + + + + $scope.stepsModelEdit = []; + $scope.imageUploadEdit = function (event) { + var files = event.target.files; //FileList object + + for (var i = 0; i < files.length; i++) { + var file = files[i]; + var reader = new FileReader(); + reader.onload = $scope.imageIsLoadedEdit; + reader.readAsDataURL(file); + } + } + + $scope.imageIsLoadedEdit = function (e) { + $scope.$apply(function () { + // $scope.stepsModel.push(e.target.result); + $scope.stepsModelEdit[0] = e.target.result; + }); + } + + //an array of files selected + $scope.filesEdit = []; + //listen for the file selected event + $scope.$on("fileSelectedEdit", function (event, args) { + $scope.$apply(function () { + //add the file object to the scope's files collection + $scope.filesEdit[0] = args.file; + }); + }); + + + // reset image for Edit + $scope.resetImageEdit = function () { + $scope.filesEdit.length = 0; + $scope.stepsModelEdit.length = 0; + } + /* * update the branch details * created by kms @@ -155,39 +269,72 @@ app.controller('branchCtrl', ["$scope","toaster", "$filter", "ngTableParams", "A $scope.ldloading = {}; $scope.ldloading[loading.replace('-', '_')] = true; + + var formData = new FormData(); + var logoEdit = $scope.filesEdit[0]; + formData.append("branchCode", myModel.BranchCode); + formData.append("branchName", myModel.BranchName); + formData.append("email", myModel.EmailID); + formData.append("primaryPhone", myModel.MobileNumber); + formData.append("secondaryPhone", myModel.AlternateNumber); + formData.append("landLine", myModel.LandlineNumber); + formData.append("address", myModel.Address); + formData.append("status", myModel.IsActive); + formData.append("logo", myModel.LogoPath); - var update = { - method: 'POST', - url: apiPoint.url + 'updateBranchDetails/', - headers: { - 'Content-Type': 'application/json' - }, - data: { - branchCode: myModel.BranchCode, - branchName: myModel.BranchName, - email: myModel.EmailID, - primaryPhone: myModel.MobileNumber, - secondaryPhone: myModel.AlternateNumber, - landLine: myModel.LandlineNumber, - address: myModel.Address, - logo: myModel.LogoPath, - status: myModel.IsActive, - createdBy: JSON.parse(localStorage.getItem('localObj')).localUserID - } - }; - $http(update).then(function (response) { - if (response.data.status==200 && response.data.branchStatus) { - $scope.ldloading[loading.replace('-', '_')] = false; - swal("Success!", response.data.message, "success"); - $scope.editId = -1; - $scope.init(); + var checkImg = logoEdit == undefined ? 0 : 1; + formData.append("imageStatus", checkImg); + + formData.append("createdBy", JSON.parse(localStorage.getItem('localObj')).localUserID); + formData.append('logoEdit', logoEdit); - } else { - $scope.ldloading[loading.replace('-', '_')] = false; - swal("Failed!", response.data.message, "error"); - } - }); + $http.post(apiPoint.url + 'updateBranchDetails/', formData, { + transformRequest: angular.identity, + headers: { 'Content-Type': undefined, 'Process-Data': false }, + }).success(function (data) { + if (data.status==200 && data.branchStatus) { + $scope.ldloading[loading.replace('-', '_')] = false; + swal("Success!", data.message, "success"); + $scope.editId = -1; + $scope.init(); + } else { + $scope.ldloading1[loading.replace('-', '_')] = false; + swal("Failed!", data.message, "error"); + } + }); + + // var update = { + // method: 'POST', + // url: apiPoint.url + 'updateBranchDetails/', + // headers: { + // 'Content-Type': 'application/json' + // }, + // data: { + // branchCode: myModel.BranchCode, + // branchName: myModel.BranchName, + // email: myModel.EmailID, + // primaryPhone: myModel.MobileNumber, + // secondaryPhone: myModel.AlternateNumber, + // landLine: myModel.LandlineNumber, + // address: myModel.Address, + // logo: myModel.LogoPath, + // status: myModel.IsActive, + // createdBy: JSON.parse(localStorage.getItem('localObj')).localUserID + // } + // }; + // $http(update).then(function (response) { + // if (response.data.status==200 && response.data.branchStatus) { + // $scope.ldloading[loading.replace('-', '_')] = false; + // swal("Success!", response.data.message, "success"); + // $scope.editId = -1; + // $scope.init(); + + // } else { + // $scope.ldloading[loading.replace('-', '_')] = false; + // swal("Failed!", response.data.message, "error"); + // } + // }); } }; /* @@ -243,3 +390,37 @@ app.controller('branchCtrl', ["$scope","toaster", "$filter", "ngTableParams", "A }; }]); + +// file upload directive +app.directive('fileUpload', function () { + return { + scope: true, //create a new scope + link: function (scope, el, attrs) { + el.bind('change', function (event) { + var files = event.target.files; + //iterate files since 'multiple' may be specified on the element + for (var i = 0; i < files.length; i++) { + //emit event upward + scope.$emit("fileSelected", { file: files[i] }); + } + }); + } + }; +}); + +// file upload directive +app.directive('fileUploadEdit', function () { + return { + scope: true, //create a new scope + link: function (scope, el, attrs) { + el.bind('change', function (event) { + var files = event.target.files; + //iterate files since 'multiple' may be specified on the element + for (var i = 0; i < files.length; i++) { + //emit event upward + scope.$emit("fileSelectedEdit", { file: files[i] }); + } + }); + } + }; +}); diff --git a/Apollo/assets/views/branchDetails.html b/Apollo/assets/views/branchDetails.html index 1c4c5a5e..affc222c 100755 --- a/Apollo/assets/views/branchDetails.html +++ b/Apollo/assets/views/branchDetails.html @@ -4,8 +4,6 @@ border-radius: 60px; box-shadow: 0px 0px 2px #007AFF; padding: 0.5em 0.6em; - - } @@ -30,8 +28,14 @@
-
Please Wait...
-
+ +
+
+
+
+
+
Please Wait...
+
@@ -39,80 +43,77 @@ records found...

-
- -
- -

-
+
+
+ +

-
-
+ +
+
+ +
- - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + -
Branch Code - - Branch Name - - Address - - Email Id - - Mobile Number - - Alternate Mobile - - Landline Number - - -
{{p.BranchCode}}{{p.BranchName}}{{p.Address}}{{p.EmailID}}{{p.MobileNumber}}{{p.AlternateNumber}}{{p.LandlineNumber}} - +
Branch Code + + Branch Name + + Address + + Email Id + + Mobile Number + + Alternate Mobile + + Landline Number + + +
{{p.BranchCode}}{{p.BranchName}}{{p.Address}}{{p.EmailID}}{{p.MobileNumber}}{{p.AlternateNumber}}{{p.LandlineNumber}} +
-
+ + -
+
@@ -148,128 +149,89 @@
-
+
- - Branch code is required - Invalid branch code + + Branch code is required + Invalid branch code
-
+
- - Branch name is required - Invalid branch name + + Branch name is required + Invalid branch name
-
+
- - Email is required. - Please, enter a valid email address. + + Email is required. + Please, enter a valid email address.
-
+
- - Phone number is required. - Enter a valid phone number + + Phone number is required. + Enter a valid phone number
-
+
- - Enter a valid phone number + + Enter a valid phone number
-
-
-
-
+
+
+
+
+
+ +
+
+
Branch Logo
+
+ +
+
+ +
+
+ + +
+
+ +
+
+
+
+ + +
+
+
+
+
+
- - -
- -
@@ -320,9 +324,4 @@
- - - - - - + \ No newline at end of file diff --git a/Apollo/assets/views/editBranchDetails.html b/Apollo/assets/views/editBranchDetails.html index b34472d9..e5257f33 100755 --- a/Apollo/assets/views/editBranchDetails.html +++ b/Apollo/assets/views/editBranchDetails.html @@ -132,7 +132,7 @@
-
+
@@ -147,6 +147,72 @@
+
+ + +
+
+
+
+
+
+
Update Logo
+
+ +
+ +
+
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ +
+
+
+
+
+
diff --git a/Apollo/assets/views/partials/nav.html b/Apollo/assets/views/partials/nav.html index baaa7acb..e96b00b6 100755 --- a/Apollo/assets/views/partials/nav.html +++ b/Apollo/assets/views/partials/nav.html @@ -285,6 +285,19 @@ +
  • + +
    +
    + +
    +
    + MY PROFILE +
    +
    +
    + +
  • diff --git a/Apollo/images/employee/Dri_9jwuh7dZD2na.jpeg b/Apollo/images/employee/Dri_9jwuh7dZD2na.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b12de588cffe7878301a8638f0215615fc06158e GIT binary patch literal 15072 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≧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 S4}d?wv=Al(HT(Q``F{YAywZjM literal 0 HcmV?d00001