Thursday, 29 October 2015

AngularJS Providers

Provider Singleton Instantiable Configurable
Constant
Value
Service
Factory
Decorator
Provider

Constant

A constant can be injected everywhere. A constant can not be intercepted by a decorator, that means that the value of a constant should never be changed (though it is still possible to change it programmatically in Angular 1.x).

 angular.module('app', []);

 app.constant('MOVIE_TITLE', 'The Matrix');

 .controller('MyController', function (MOVIE_TITLE) {
   expect(MOVIE_TITLE).toEqual('The Matrix');
 });
    

Value

A value is nothing more than a simple injectable value. The value can be a string, number but also a function. Value differs from constant in that value can not be injected into configurations, but it can be intercepted by decorators.

 angular.module('app', []);

 .value('movieTitle', 'The Matrix');

 .controller('MyController', function (movieTitle) {
   expect(movieTitle).toEqual('The Matrix');
 })
    

Service

Use Service when you need just a simple object such as a Hash, for example {foo:1, bar:2} It's easy to code, but you cannot instantiate it. A service is an injectable constructor. If you want you can specify the dependencies that you need in the function. A service is a singleton and will only be created once by AngularJS. Services are a great way for communicating between controllers like sharing data.

 angular.module('app' ,[]);

 .service('movie', function () {
   this.title = 'The Matrix';
 });

 .controller('MyController', function (movie) {
   expect(movie.title).toEqual('The Matrix');
 });
    

Factory

A factory is an injectable function. A factory is a lot like a service in the sense that it is a singleton and dependencies can be specified in the function. The difference between a factory and a service is that a factory injects a plain function so AngularJS will call the function and a service injects a constructor. A constructor creates a new object so new is called on a service and with a factory you can let the function return anything you want. As you will see later on, a factory is a provider with only a $get method.

 angular.module('app', []);

 .factory('movie', function () {
   return {
     title: 'The Matrix';
   }
 });
 .controller('MyController', function (movie) {
   expect(movie.title).toEqual('The Matrix');
 });
 .factory('catalogueService', function($rootScope, $http) {
   // We first define a private API for our service.

   // Private vars.
   var items = [];

   // Private methods.
   function add( id ) {
     $http.put( $rootScope.apiURL, {id:id} )
     .success(function(data,status,headers,config) { items.push(data); })
     .then(function(response) { console.log(response.data); });
   }

   function store( obj ) {
     // do stuff
   }

   function remove( obj ) {
     // do stuff
   }

   // We now return a public API for our service.
   return {
     add: add,
     store: store,
     rm: remove
   };
 };
    

Decorator

A decorator can modify or encapsulate other providers. There is one exception and that a constant cannot be decorated.

 var app = angular.module('app', []);

 app.value('movieTitle', 'The Matrix');

 app.config(function ($provide) {
   $provide.decorator('movieTitle', function ($delegate) {
     return $delegate + ' - starring Keanu Reeves';
   });
 });

 app.controller('MyController', function (movieTitle) {
   expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
 });
    

Provider

A provider is the most sophisticated method of all the providers. It allows you to have a complex creation function and configuration options. A provider is actually a configurable factory. The provider accepts an object or a constructor.

 var app = angular.module('app', []);

 app.provider('movie', function () {
   var version;
   return {
     setVersion: function (value) {
       version = value;
     },
     $get: function () {
       return {
           title: 'The Matrix' + ' ' + version
       }
     }
   }
 });

 app.config(function (movieProvider) {
   movieProvider.setVersion('Reloaded');
 });

 app.controller('MyController', function (movie) {
   expect(movie.title).toEqual('The Matrix Reloaded');
 });
    

Summary

  • All the providers are instantiated only once. That means that they are all singletons.
  • All the providers except constant can be decorated.
  • A constant is a value that can be injected everywhere. The value of a constant can never be changed.
  • A value is just a simple injectable value.
  • A service is an injectable constructor.
  • A factory is an injectable function.
  • A decorator can modify or encapsulate other providers except a constant.
  • A provider is a configurable factory.

Wednesday, 21 October 2015

Android vs. iOS vs. Windows Phone: Which is Best for Business?

The best business smartphones have sharp displays, high-quality builds and long battery life. But there's a lot more to a smartphone than hardware.

But, what makes a phone great for business is the software it runs on.

There are three major OS today

  • iOS from Apple
  • Android from Google
  • Windows Phone from Microsoft

Lets see comparision between them.

Andriod iOS Windows
Apps Android app store (Google Play store) rivals the iOS App Store, with more than 1 million apps available. It can match almost every offering and Android and Windows Phone. The Windows Phone Store has about 100,000, Apps compared to selections of more than 1 million on Android and iOS.
Features Offers Google Now, an intelligent personal assistant.

The service works by monitoring your activity within the Google ecosystem and pushing relevant notifications to you as they're detected.

The service can notify you weather, traffic delay, appointmemnt and much more
The iWork for iOS apps are fully integrated with Apple's desktop iWork applications, letting users view and edit documents seamlessly on multiple devices.

It has similar notification features as andriod has.
Live Tiles, which update in real time to display relevant information right on your home screen, ensuring you never miss a message or meeting.
Security It's easy to side-load an unapproved app on an Android phone by downloading and installing the application from a source other than the Google Play store. Apple's iOS is a highly secure mobile operating system. It's virtually impossible to install apps from unofficial sources Windows Phone platform is comparable to iOS. All apps are reviewed and approved by Microsoft, and unlike on Android there's no need to consider dedicated anti-virus and anti-malware software - See more at: http://www.businessnewsdaily.com/5759-android-vs-ios-vs-windows-phone-small-business.html#sthash.oGqedQTx.dpuf

Tuesday, 13 October 2015

Toggle class with ng-click on several elements

There is one liner code for Toggle class in jquery
   $('#page-wrapper').toggleClass('nav-small');

But what if we want to do it in a angular way

So I made simple directive for same:

module.directive('toggleClass', function() {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            element.bind('click', function() {
                element.toggleClass(attrs.toggleClass);
            });
        }
    };
});

so you can make any element toggle class you need

<button id="btn" toggle-class="active">Change Class</button>
<div toggle-class="whatever"></div>



Hey, if there's anybody I can help out there, just let me know. Thanks ;)

Are hashbang URLs a recommended practice?

No, hashbang URLs are not a recommended practice. But it's important to be absolutely clear about what this means, so read on.

http://example.com/#foo is a hash URL. The #foo portion of the URL is never sent to the server, and will cause the page to automatically scroll to the first element with an id of "foo" (or the first <a> element with a name of "foo"). This is a perfectly good thing, and is a recommended practice for linking to specific sections within a page.

However, http://example.com/#foo could also be interpreted by JavaScript to indicate a particular state. Perhaps the "foo" state means "make an Ajax request to get the dictionary definition of the word 'foo' so we can display it to the user".

Now you've got a problem, because while this logic will work just fine as long as the JS runs, nothing at all will happen if the JS doesn't run. Furthermore, if you ever decide to change your URL structure to use a real URL like http://example.com/foo instead, then you'll either have to break all existing hash URLs that link to your site, or you'll need to keep that hash-handling JavaScript on your page forever so it can redirect users to the new URL.

In addition, search bots always ignore the hash portion of a URL when indexing a page. Always, with one exception: that one exception is that the GoogleBot (and only the GoogleBot) has some special and convoluted logic that allows to it recognize hashbang URLs like http://example.com/#!foo.

But there's a massive, massive caveat: the hashbang itself doesn't do a damn thing for you. All it does is tell the GoogleBot "hey, this website claims to support the Google Ajax Crawling Scheme". But the Ajax Crawling Scheme requires some pretty complicated server-side logic as well. You don't get it for free just by changing a # to a #!. So unless you've actually implemented the server-side logic necessary to support the Ajax Crawling Scheme, that #! in your URL is quite possibly damaging your Google rankings instead of helping them.

Furthermore, since Google is the only search engine that currently supports the Google Ajax Crawling Scheme (hint: the "Google" in the name of the scheme means "we just came up with this nonsense ourselves and didn't bother actually asking any other search engines if they thought it was a good idea"), your hashbang URLs will only be indexed by Google, even if you jump through all the hoops required to make this work properly.

So, to sum up:

  • "Hash" URLs and "hashbang" URLs aren't the same thing, although "hashbang" has unfortunately become the generic name for "hash URLs that trigger JavaScript-based logic".
  • Hash URLs are never sent to the server, so they're useless without JavaScript if you depend on them to trigger application logic.
  • Since hash URLs require JS, you're doomed to either break all existing URLs or maintain a JS URL handler forever if you ever decide to change your URL scheme.
  • "Hashbang" URLs don't automatically make your page indexable by search engines. You still need to do a lot of server-side work to make that happen. Even if you support the full Google Ajax Crawling Scheme correctly, that only helps you with Google. You're still screwed with the other search engines.

In short: relying on hash URLs for application logic should be an absolute last resort. If at all possible, you should avoid it.

Hey, if there's anybody I can help out there, just let me know. Thanks ;)

Monday, 5 October 2015

Standard function to check for null, undefined, or blank variables in JavaScript?

Question

Is there a universal JavaScript function that checks that a variable has a value and ensures that it's not undefined or null? I've got this code, but I'm not sure if it covers all cases:

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}

Answer

You can just check if the variable has a truthy value or not. That means

if( value ) {
}

will evaluate to true if value is not:

  • null
  • undefined
  • NaN
  • empty string ("")
  • 0
  • false

Sunday, 4 October 2015

What is “upstream” and “downstream”

Question

I've started playing with Git and have come across the terms "upstream" and "downstream". I've seen these before but never understand them fully. What do these terms mean in the context of SCMs and source code?

Answer (Simple)

In terms of source control, you're "downstream" when you copy (clone, checkout, etc) from a repository. Information flowed "downstream" to you.

When you make changes, you usually want to send them back "upstream" so they make it into that repository so that everyone pulling from the same source is working with all the same changes. This is mostly a social issue of how everyone can coordinate their work rather than a technical requirement of source control. You want to get your changes into the main project so you're not tracking divergent lines of development.

Answer (Git)

There are two different contexts for upstream/downstream in git: remotes, and time/history. Upstream/downstream with respect to remotes is, the downstream repo will be pulling from the upstream repo (changes will flow downstream naturally). Upstream/downstream with respect to time/history can be confusing, because upstream in time means downstream in history, and vice-versa (genealogy terminology works much better here - parent/ancestor/child/descendant).

Saturday, 3 October 2015

Angular CRUD operation helper service for sharepoint

Here we have some beautiful Angular Factory class Which help's us in any crud operation For Rest API in sharepoint

    "use strict";
    (function () {
        angular.module("docapp")
            .factory("baseSvc", ["$http", "$q", function ($http, $q) {
                var baseUrl = _spPageContextInfo.siteAbsoluteUrl;
                var getRequest = function (query) {
                    var deferred = $q.defer();
                    $http({
                        url: baseUrl + query,
                        method: "GET",
                        headers: {
                            "accept": "application/json;odata=verbose",
                            "content-Type": "application/json;odata=verbose"
                        }
                    })
                        .success(function (result) {
                            deferred.resolve(result);
                        })
                        .error(function (result, status) {
                            deferred.reject(status);
                        });
                    return deferred.promise;
                };
                var postRequest = function (data, url) {
                    var deferred = $q.defer();
                    $http({
                        url: baseUrl + url,
                        method: "POST",
                        headers: {
                            "accept": "application/json;odata=verbose",
                            "X-RequestDigest": document.getElementById("__REQUESTDIGEST").value,
                            "content-Type": "application/json;odata=verbose"
                        },
                        data: JSON.stringify(data)
                    })
                        .success(function (result) {
                            deferred.resolve(result);
                        })
                        .error(function (result, status) {
                            deferred.reject(status);
                        });
                    return deferred.promise;
                };
                var updateRequest = function (data, url) {
                    var deferred = $q.defer();
                    $http({
                        url: baseUrl + url,
                        method: "PATCH",
                        headers: {
                            "accept": "application/json;odata=verbose",
                            "X-RequestDigest": document.getElementById("__REQUESTDIGEST").value,
                            "content-Type": "application/json;odata=verbose",
                            "X-Http-Method": "PATCH",
                            "If-Match": "*"
                        },
                        data: JSON.stringify(data)
                    })
                        .success(function (result) {
                            deferred.resolve(result);
                        })
                        .error(function (result, status) {
                            deferred.reject(status);
                        });
                    return deferred.promise;
                };
                var deleteRequest = function (url) {
                    var deferred = $q.defer();
                    $http({
                        url: baseUrl + url,
                        method: "DELETE",
                        headers: {
                            "accept": "application/json;odata=verbose",
                            "X-RequestDigest": document.getElementById("__REQUESTDIGEST").value,
                            "IF-MATCH": "*"
                        }
                    })
                        .success(function (result) {
                            deferred.resolve(result);
                        })
                        .error(function (result, status) {
                            deferred.reject(status);
                        });
                    return deferred.promise;
                };
                return {
                    getRequest: getRequest,
                    postRequest: postRequest,
                    updateRequest: updateRequest,
                    deleteRequest: deleteRequest
                };
            }]);
    })();

Ok How do we use it then ?

Answer is very simple. Just make another factory class accoding to your business logic
    (function () {
        'use strict';
        var app = angular.module('docapp');
        app.factory("taskSvc", ["baseSvc", function (baseService) {
            var listEndPoint = '/_api/web/lists/';
            var getAll = function () {
                var query = listEndPoint + "GetByTitle('Asana2')/Items?$select=Title,Category,ID,PriorityCod,Desc2,AssignedTo&$filter=Status ne 'compleated'";
                return baseService.getRequest(query);
            };

            var getTaskByUser = function (userID) {
                var query = listEndPoint + "GetByTitle('Asana2')/Items?$select=Title,Category,ID,PriorityCod,Desc2,AssignedTo&$filter=Status ne 'compleated' and AssignedTo eq '"+userID+"'";
                return baseService.getRequest(query);
            };

            var getCommentsById = function (ID) {
                var query = listEndPoint + "GetByTitle('Activities')/Items?$select=TaskID,ActivityType,Cmnt,ID,EntryDate,UserCmnt,ProfilePic&$filter=ActivityType eq '2' and TaskID eq " + ID + "";

                return baseService.getRequest(query);
            }
            var addNewTask = function (tsk) {
                var data = {
                    __metadata: { 'type': 'SP.Data.Asana2ListItem' },
                    Title: tsk.Title,
                    PriorityCod: tsk.PriorityCod.toString(),
                    Category:  tsk.CategoryCode.toString(),
                    Desc2: tsk.Description,
                    AssignedTo: tsk.AssignedUserId.toString()
                };

                //console.log(tsk.AssignedUserId);
                var url = listEndPoint + "GetByTitle('Asana2')/Items";
                return baseService.postRequest(data, url);
            };
            var updatePriority = function (updatePriorityTsk) {
                var data = {
                    __metadata: { 'type': 'SP.Data.Asana2ListItem' },
                    PriorityCod: updatePriorityTsk.PriorityCod.toString(),
                };
                var url = listEndPoint + "/GetByTitle('Asana2')/GetItemById(" + updatePriorityTsk.ID + ")";
                return baseService.updateRequest(data, url);
            };

            var updateUser = function (updateUserTsk) {
                var data = {
                    __metadata: { 'type': 'SP.Data.Asana2ListItem' },
                    AssignedTo: updateUserTsk.AssignedTo,
                };
                var url = listEndPoint + "/GetByTitle('Asana2')/GetItemById(" + updateUserTsk.ID + ")";
                return baseService.updateRequest(data, url);
            };

            //var updatePriority = function (updatePriorityTsk) {
            //    var data = {
            //        __metadata: { 'type': 'SP.Data.Asana2ListItem' },
            //        PriorityCod: updatePriorityTsk.PriorityCod.toString(),
            //    };
            //    var url = listEndPoint + "/GetByTitle('Asana2')/GetItemById(" + updatePriorityTsk.ID + ")";
            //    return baseService.updateRequest(data, url);
            //};

            var updateCategory = function (updateCategoryTsk) {
                var data = {
                    __metadata: { 'type': 'SP.Data.Asana2ListItem' },
                    Category: updateCategoryTsk.Category.toString(),
                };
                var url = listEndPoint + "/GetByTitle('Asana2')/GetItemById(" + updateCategoryTsk.ID + ")";
                return baseService.updateRequest(data, url);
            };

            var updateDesc = function (updateDescTsk) {
                var data = {
                    __metadata: { 'type': 'SP.Data.Asana2ListItem' },
                    Desc2: updateDescTsk.Desc2.toString(),
                };
                var url = listEndPoint + "/GetByTitle('Asana2')/GetItemById(" + updateDescTsk.ID + ")";
                return baseService.updateRequest(data, url);
            };

            var updateTitle = function (updateTitleTsk) {
                var data = {
                    __metadata: { 'type': 'SP.Data.Asana2ListItem' },
                    Title: updateTitleTsk.Title.toString(),
                };
                var url = listEndPoint + "/GetByTitle('Asana2')/GetItemById(" + updateTitleTsk.ID + ")";
                return baseService.updateRequest(data, url);
            };

            var compleateTask = function (ID) {
                var data = {
                    __metadata: { 'type': 'SP.Data.Asana2ListItem' },
                    Status: 'compleated',
                };
                var url = listEndPoint + "/GetByTitle('Asana2')/GetItemById(" + ID + ")";
                return baseService.updateRequest(data, url);
            };


            var addNewActivities = function (comment) {
                var data = {
                    __metadata: { 'type': 'SP.Data.ActivitiesListItem' },
                   // Title:'title',
                    ActivityType: '2',
                    Cmnt: comment.Cmnt,
                    UserCmnt: comment.User,
                    ProfilePic: 'img/Users/ryan-301.jpg',
                    TaskID: comment.tskid.toString(),


                };
                var url = listEndPoint + "GetByTitle('Activities')/Items";
                return baseService.postRequest(data, url);
            };
        

            return {
                getAll: getAll,
                getCommentsById: getCommentsById,
                addNewTask: addNewTask,
                addNewActivities: addNewActivities,
                updatePriority: updatePriority,
                updateCategory: updateCategory,
                updateDesc: updateDesc,
                updateTitle: updateTitle,
                compleateTask: compleateTask,
                updateUser: updateUser,
                getTaskByUser: getTaskByUser
            };


        }]);

    })();

And now use like this below.

        $scope.GetContractMaster = function () {
            clauseSvc.getAll()
              .then(function (response) {
                  $scope.ContractMst.rowData = response.d.results;
                 
              });
        };

        $scope.updateUser = function () {
            $scope.updateUserTsk = {
                ID: $scope.comment.tskid,
                AssignedTo: $scope.TaskDtl.AllUsers,
            };

            taskSvc.updateUser($scope.updateUserTsk)
            .then(function (response) {
                $scope.getMyTask();
            });
        };

and so on ;) Cheers ;)

Friday, 2 October 2015

Windows Task Scheduler SharePoint Backup Script

Create Windows PowerShell script

    Add-PSSnapin Microsoft.SharePoint.PowerShell 
    backup-spsite -identity $args[0] -path $args[1] -force

Create Batch Script to execute PowerShell script

    @echo off
    SET SOURCE_SITE=http://SPFarm:20045/ 
    SET DEST=C:\backup\Backup_site.bak
    echo "backup Started at" %DATE% >> C:\ backup\Log.txt
    powershell -command C:\Scripts\BackupSPSite.ps1  %SOURCE_SITE% %DEST%
    echo "Backup completed successfully at %DEST%" on %DATE% >> C:\ backup\Log.txt
    @echo on

Run Batch Script to execute PowerShell script

  • Run batch script to check successful backup and log creation at c:\backup.
  • Now run it from the Windows Task Scheduler. :)

Restore Sharepoint Site

EXAMPLE

    Restore-SPSite http://server_name/sites/site_name -Path C:\Backup\site_name.bak
This example restores a site collection from the backup file C:\Backup\site_name.bak to the site collection URL http://server_name/sites/site_name.

EXAMPLE

    Restore-SPSite http://server_name/sites/site_name -Path C:\Backup\site_name.bak -Force -DatabaseServer SQLBE1 -DatabaseName SQLDB1
This example restores a site collection backup from the backup file C:\Backup\site_name.bak, but overwrites the existing site collection at http://server_name/sites/site_name while specifying that the site collection must be stored in a specific content database.

EXAMPLE

    Restore-SPSite http://www.example.com -Path \\file_server\share\site_name.bak -HostHeaderWebApplication http://server_name
This example restores a site collection backup from the backup file \\file_server\share\site_name.bak to the host-named site collection http://www.example.com on the Web application http://server_name.

Backup Sharepoint Site

EXAMPLE

    Backup-SPSite http://server_name/sites/site_name -Path C:\Backup\site_name.bak
This example backs up a site collection at http://server_name/sites/site_name to the C:\Backup\site_name.bak file.

EXAMPLE

    Get-SPSiteAdministration http://server_name/sites/site_name | Backup-SPSite -Path C:\Backup\site_name.bak
This example backs up a site collection at http://server_name/sites/site_name to the C:\Backup\site_name.bak file. Same result as Example 1, but a different way of performing the operation.

EXAMPLE

    Backup-SPSite http://server_name/sites/site_name -Path C:\Backup\site_name.bak -UseSqlSnapshot
This example backs up a site collection using database snapshots to ensure backup integrity.

Build JSON Hierarchy from Structured Data

After a troublesome fight i almost figured how to convert a flat json file to a Hierarchical one.
  list = [
    {
      id: 1,
      title: 'home',
      parent: null
    },
    {
      id: 2,
      title: 'about',
      parent: null
    },
    {
      id: 3,
      title: 'team',
      parent: 2
    },
    {
      id: 4,
      title: 'company',
      parent: 2
    }
  ]

  function treeify(list, idAttr, parentAttr, childrenAttr) {
      if (!idAttr) idAttr = 'id';
      if (!parentAttr) parentAttr = 'parent';
      if (!childrenAttr) childrenAttr = 'children';
      var treeList = [];
      var lookup = {};
      list.forEach(function(obj) {
          lookup[obj[idAttr]] = obj;
          obj[childrenAttr] = [];
      });
      list.forEach(function(obj) {
          if (obj[parentAttr] != null) {
              lookup[obj[parentAttr]][childrenAttr].push(obj);
          } else {
              treeList.push(obj);
          }
      });
      return treeList;
  };

  console.log(JSON.stringify(treeify(list)));