Showing posts with label Download. Show all posts
Showing posts with label Download. Show all posts

Wednesday, 13 January 2016

Download JSZip.js, Filesaver.js, JQuery.js

          Sometimes JavaScript files are much important files in order to download anything from saleforce. I see many people searching for these files separately. So, I decided to give a download link for all of these important JavaScript files in one post.
You can find your needed file and download.

File 1: FileSaver.js  click here to Download
           
            FileSaver - This file is used to save the contents. Without saving to document or attachment                                    you can save the file to filesaver.js using saveAs() method.

File 2: JSZip.js   click here to Download

File 2: JQuery.js click here to Download

Friday, 8 January 2016

DOWNLOAD PDF'S AS ZIP FILE FROM LIST VIEW OF THE OBJECT



                 When salesforce is as easy as telling 1, 2, 3 it is also as tough as cooking Biryani(tough for bachelor's). I found it difficult when I want to download Selected Records PDF(Invoice PDF) from List view of the Object. Hopefully I solved so I thought it would be nice to help others for the same scenario. so,

HOW TO DOWNLOAD PDF'S AS ZIP FILE FROM LIST VIEW OF THE OBJECT

Here am using INVOICE object, api name is Invoice__c.
  1. First create visualforce page that render as pdf for help refer Create PDF with Salesforce
  2. (Optional) Add visualforce custom button to detail page of the record for help refer How to add Detail Page Visualforce button.
  3. Create Apex class that  returns a error messages as JSON Format
     public class DownloadInvoiceResponse {
         //Normal Status Code
          private static String API_STATUS_NORMAL = '200';
         //Error Status Code
          private static String API_STATUS_ERROR  = '400';
          // Normal JSON Response
         public static string normalJson( Object respData ) {
                Map<String, Object> response = new Map<String, Object>();
                response.put('status', API_STATUS_NORMAL);
                if( respData != null )
                response.put('data', respData);
                return json.serialize( response );
     
          }
          // Error JSON Response
         Public static String errorJson( String message ) {
                Map<String, Object> response = new Map<String, Object>();
                response.put('status', API_STATUS_ERROR );
                if( message != null )
                response.put('error', message);
                return json.serialize( response );
         }
    }

     
      4. Create a Apex class with WEBSERVICE Method to return List of pdf's as JSON format

global class DownloadInvoice
{
   private static String API_STATUS_NORMAL = '200';

   webService static string getAttachmentByParentId(string sfdcId)
    {      
         List<id> ids = new List<id>();
         if(string.isempty(sfdcId))  {
            return DownloadInvoiceResponse.errorJson('Parameter sfdcId is required.');
        }
   
        string[] idsArray = sfdcId.split(',');
        for(integer i=0; i<idsArray.size();i++)
        {
           ids.add(idsArray[i]);
        }
     
        List<Invoice__c> invList = New List<Invoice__c>();
        invList = [Select id, name, Print_Invoice__c,Account__r.name from Invoice__c where ID IN: ids];
        List<Attachment> attInsert = new List<Attachment>();
        if(invList.size() > 0){
         
            for(Invoice__c invc : invList){

//pdf file
                PageReference pdf = new PageReference('/apex/InvoicePDF?id='+invc.id);
                Attachment attach = new Attachment();
                if (attach == null) attach = new Attachment();
                Blob body;
                try {                  
                        body = pdf.getContentAsPDF();                    
                 }
                catch (VisualforceException e) {
                    String msg2 = e.getMessage();
                    return DownloadInvoiceResponse.errorJson( msg2 );
                 }
                attach.Body = body;
                attach.name= invc.name+'.PDF';
                attach.IsPrivate = false;
                attach.ParentId = invc.id;
                attach.contentType = 'application/pdf';
                attInsert.add(attach);
            }          
        }
     
        Insert attInsert;

        set<String> remainingsIdsSet=new set<String>();
        List<attachment> attachmentList = new List<attachment>();
   
          for(attachment att: attInsert) {                      
                String parentId=att.ParentId;
                remainingsIdsSet.add(parentId);                
           }
             String remainingIds=null;
             List<String> remainingIdList=new List<String>(remainingsIdsSet);
             for(integer i=0;i<remainingIdList.size();i++){
                 if(i==0){
                     remainingIds=remainingIdList.get(i);
                 }else{
                     remainingIds=remainingIds+','+remainingIdList.get(i);
                  }              
             }
           
             List<Object> dataList = new List<Object>();
             for(Attachment at :attachmentList)
             {
                Map<StringString> atMap = new Map<StringString>();
                atMap.put( 'Name', at.Name );
                atMap.put( 'Body', EncodingUtil.base64Encode( at.body ));
                datalist.add( atMap );
           
             }
             
                 Map<String, Object> response = new Map<String, Object>();
                 response.put('status', API_STATUS_NORMAL);
                 if( datalist != null ){
                     response.put('data',datalist);
                     response.put('id', remainingIds);
                 }
                 return json.serialize( response );
     }

     5. Add webservice method to save the file to Document

   webService static String saveToDocument( String zipFileData, String fileName ){
        try{
            String userId = UserInfo.getUserId();
            List<Document> docList = [SELECT Id, Name, FolderId, Body FROM Document WHERE                                                              Name = :fileName AND FolderId = :userId];
            Document doc = new Document();
            if( docList == null || docList.size() == 0 ) {
                doc.Name = fileName;
                doc.FolderId = UserInfo.getUserId();
                doc.Body = EncodingUtil.base64Decode( zipFileData );
                insert doc;
               }
            else {
                doc = docList.get(0);
                doc.Body = EncodingUtil.base64Decode( zipFileData );
                update doc;
            }
            return DownloadInvoiceResponse.normalJson( doc.Id );
        } catch ( Exception ex ) {
            return DownloadInvoiceResponse.errorJson( ex.getMessage() );
        }
    }

    5. Now Goto,

  1. View fields of the object.
  2. Scroll down to Custom Buttons, Links and Actions.
  3. Click on New.
  4. Create a new List Button. 
  5. Select Onclick Javascrip from DropDown.
  6. Now Place below Javascript that calls the webservice methods.



   {!REQUIRESCRIPT("/resource/jqueryInvoice")}
   {!REQUIRESCRIPT("/resource/JSzipfileInvoice")}
   {!REQUIRESCRIPT("/soap/ajax/30.0/connection.js")}
   {!REQUIRESCRIPT("/soap/ajax/30.0/apex.js")}

   var records = {!GetRecordIds($ObjectType.Invoice__c)};
   var newRecords = [];

   var SelectedIds='';
   var fileDatafinal;
   for(var i=0;i < records.length; i++)
   {
   SelectedIds+=records[i]+",";
   }
   SelectedIds=SelectedIds.substring(0,SelectedIds.length - 1);

   if(SelectedIds.length > 0){

   alert(' Please wait until end of the process ');
   var response = sforce.apex.execute("DownloadInvoice","getAttachmentByParentId",                                                  {sfdcId:SelectedIds});

   var respObj = JSON.parse(response);
   if( respObj['status'] != '200' )
   {
   alert( respObj['error'] );
   }
   else
   {
   var fileData = respObj['data'];
   SelectedIds=respObj['id'];
   downloadZip(fileData);
   }
   }
   else
   {
   alert('Please select atleast one record');
   }

   function downloadZip( fileData) {

   var fileName = 'Attachments.zip';
   var zip = new JSZip();
   for( var k in fileData ) {
   zip.file(fileData[k]['Name'], fileData[k]['Body'].toString(),{base64: true});
   }
   content = zip.generate();
   response = sforce.apex.execute("DownloadInvoice","saveToDocument",{zipFileData:content,                               fileName:fileName});

   var fileObj = JSON.parse(response);
   if( fileObj['status'] != '200' ) {
   alert( fileObj['error'] );
   return;
   }
   var docId = fileObj['data'];
   alert('Please confirm to download Zip file');
   window.location = '/servlet/servlet.FileDownload?file=' + docId;
   try {
   for (var n=0; n<records.length; n++){
   var sv = new sforce.SObject("Invoice__c");
   sv.id = records[n];
   newRecords.push(sv);
   }
   result = sforce.connection.update(newRecords);
   }
   catch (e) {
   alert(e);
   }
   }


   That's it Happy Downloading.
   You can download the jqueryInvoice and JSzipfileInvoice here. Click On Download


   Hope this helps you.

   See you next time. Thanks!!.