nonlogos
5/28/2017 - 6:13 PM

Salesforce-Lightning

Salesforce-Lightning

public with sharing class PartnerService {
  @AuraEnabled
  public static void createProject(Id oppId, Decimal amt) {
    Opportunity opp;
    
    //Serialize the data defined in our wrapper class as JSON
    String reqBody = JSON.serialize(new OppData(oppId, amt));
    
    // use a Named Credential named ProjectService to pass in the
    // necessary authorization credentials
    http http = new http();
    httpRequest req = new HttpRequest();
    req.setEndpoint('callout:ProjectService');
    req.setMethod('POST');
    req.setHeader('Content-Type', 'application/json');
    
    // get the stored security token from the serviceTokens custom setting
    List<ServiceTokens__c> tokens = ServiceTokens__c.getAll().values();
    ServiceTokens__c svcToken = ServiceTokens__c.getValues('ProjectServiceToken');
    String token = svcToken.Token__c;
    req.setHeader('Token', token);
    req.setBody(reqBody);
    
    System.debug('about to initiate request')
    //Initiate the request and update the opportunity stage accordingly
    
    opp = [SELECT id, StageName FROM Opportunity WHERE ID = :oppId LIMIT1];
    
    try {
      HTTPResponse res = http.send(req);
      opp.StageName = "Submitted Project";
    } catch(exception ex) {
      System.debug('Error encountered: ' + ex);
      opp.StageName = 'Resubmit Project';
    }
    
    try {
      upsert opp;
    } catch(Exception ex) {
      System.debug('Error encountered: ' + ex);
    }
  }
  
  //helper class
  Public class OppData {
    public String opportunityId;
    public String opportunityName;
    public String accountName;
    public String closeDate;
    public Decimal amount;
    
    public OppData(Id oppId, Decimal amt) {
      Opportunity opp = [SELECT Id, Name, Account.Name, Amount, CloseDate
                         FROM Opportunity
                         WHERE Id = :oppId LIMIT 1];
      if (opp != null) {
        opportunityId = opp.Id;
        opportunityName = opp.Name;
        closeDate = String.valueOf(opp.CloseDate);
        amount = amt;
      }
    }
  }

}
// Aura Component

<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes" controller="ListRacesController">
  <aura:attribute name="races" type="Race__c[]" />
  <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
  <aura:handler event="c:AddToRaceList" action="{!c.handleAddToRaces}" />
  <div class="slds">
    <div class="slds-m-around--small slds-p-top--large">
      <div class="slds-card">
        <aura:iteration items="{!v.races}" var="race">
          // reference the nested component
          <c:Race race="{!race}" />
        </aura:iteration>
      </div>
    </div>
  </div>
</aura:component>

// Aura nested component: file name: Race.cmp

<aura:component controller="RaceController">
  <aura:attribute name="race" type="Race__c" />
  <header class="slds-card__header">
     <ui:outPutText class="slds-text-heading--label" value="{!v.race.Name}" />
  </header>
  <section class="slds-card__body">
    <div class="slds-tile slds-hint-parent">
      <p class="slds-tile__title slds-truncate">Race Type:
        <ui:outputText value={!v.race.Type__c} />
      </p>
      <p class="slds-truncate">Lcation:
        <ui:outputText value={!v.race.Location__c} />
      </p>
      <p class="slds-truncate">Date/Time:
        <ui:outputText value={!v.race.DateTime__c} />
      </p>
      <p class="slds-truncate">Attended?
        <ui:inputCheckbox change="{!c.handleUpdate}" value={!v.race.Attended__c} />
      </p>
      <p class="slds-truncate">Results:
        <ui:inputTextArea change="{!c.handleUpdate}" value={!v.race.Results__c} />
      </p>
    </div>
  </section>
</aura:component>

// Nested Component controller
({
  handleUpdate : function(component, event, helper) {
    helper.updateRace(component);
  }
  
// Nested helper function
({
  updateRace : function(component) {
    var race = component.get('v.race');
    console.log('calling update race' + race);
    var action = component.get("c.updateRaceDB");
    action.setParams({ "race" : race });
    action.setCallback(this, function(response) {
      var state = response.getState();
      if (component.isValid() && state === "SUCCESS") {
        console.log("Race successfully updated");
      } else if (state === "ERROR") {
        var errors = response.getError();
        if (errors) {
          if (errors[0] && errors[0].message) {
            console.log('error message: ' + errors[0].message);
          } else {
            console.log("undefined error")
          }
        } else {
          console.log("Action state returned was: " + state);
        }
      }
    })
    $A.enqueueAction(action);
  }
})

// Apex class controller: RaceApexController

public with sharing class RaceController {
  @AuraEnabled
  public static Race__c updateRaceDB(Race__c race) {
    
    update race;
    return race;
  }
}
1. New
2. Error
3. Running
4. Incomplete
5. Success
6. Aborted
// Aura code Main Component
<aura:component controller="OpenCasesApexController" implements="force:appHostable"> //only work for mobile1
  <aura:attribute name="cases" type="case[]" />
  <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
  
  <aura:iteration items="{!v.cases}" var="case">
    <c:CaseList case="{!case}" />
  </aura:iteration>
  
</aura:component>

// Aura code Nested Component - to utilize the go to action 
<aura:component>
  <aura:attribute name="case" type="Case" />
  <div onclick="{!c.goToRecord}">
    <force:recordView recordId="{!v.case.id}" type="MINI" /> // or use output element
  </div>
</aura:component>


// Controller - main component
({
  doInit : function(cmp, event, helper) {
    var action = cmp.get("c.getCaseDB");
    console.log('calling doInit');
    action.setCallback(this, function(response) {
      var state = response.getState();
      if (cmp.isValid() && state === 'SUCCESS') {
        console.log('getting cases');
        cmp.set("v.cases", response.getReturnValue());
      }
    });
      $A.enqueueAction(action);
  }
})

// Controller - nested component
({
   goToRecord : function(cmp, event, helper) {
     console.log('calling goToRecord');
     var sObjectEvent = $A.get("e.force:navigateToSObject"); //only work with mobile1 - need to refactor
     sObjectEvent.setParams({
       "recordId": cmp.get("v.case.Id"),
       "slideDevName": "detail" // to determine the view to display the result (detail, chatter, or related)
     })
     sObjectEvent.fire(); // only work with mobile1 - need to refactor for web view
  }
})

// Apex Controller
public with sharing class OpenCasesApexController {
  @AuraEnabled
  public static List<Case> getCasesDB() {
   // check accesibility - if all passed the query will perform. Should be rewritten 
    Map<String, Schema.SObjectField> caseMap = 
    	Schema.SObjectType.Case.fields.getMap();
	
    for (String field: caseMap.keySet()) {
    	for (!caseMap.get(field).getDescribe().isAccessible()) {
	  System.debug('this field was not accessible ' + caseMap.get(field));
	  return null;
	}
    }
    return [SELECT Id, Type, Reason, Origin FROM Case 
             WHERE isClosed = false 
	       AND OwnerId = :UserInfo.getUserId()];
  }
}
// visualforce page
window.open('https://c.cs8.visual.force.com/apex/Mobiles?id={!Campaign.Id}','_blank');


<aura:application>
  <c:NameOfTheComponent />
</aura:application>
// aura component
<aura:component controller="CreatePartnerProjectApexController" implements="force:lightningQuickAction,force:hasRecordId">
  <aura:attribute name="recordId" type="Id" />
  <aura:attribute name="amount" type="String" />
  <aura:attribute name="hasErrors" type="Boolean" />  
  
  <aura:handler name="init" value="{!this}" action="{!c.doinit}" />
  
  <aura:if isTrue="{!v.hasErrors}">
    <div class="recordSaveError">
      <ui:message title="Error" severity="error" closable="true">
        An error was encountered trying to create the partner project
      </ui:message>
    </div>
  </aura:if>
  
  <lightning:layout horizontalAlign="center">
    <lightning:layoutItem padding="around-small">
      <lightning:input type="input" 
                       aura:id="amount"
                       label="Please enter a project amount"
                       value="{!v.amount}" />
      <br />
      <lightning:button variant="brand" 
                        label="Create Partner Project"
                        onClick="{!c.createProject}"
    </lightning:layoutItem>
  </lightning:layout>
</aura:component>

// component controller
({
  doInit : function(component, event, helper) {
    var action = component.get("c.getOppAmount");
    action.setParams({ "oppId": component.get('v.recordId')});
    action.setCallback(this, function(response) {
      var state = response.getState();
      if(component.isValid() && state === "SUCCESS") {
        component.set('v.amount', response.getReturnValue());
      } else {
        console.log('error trying to get opportunity amount');
      }
    });
    $A.enqueueAction(action);
  },
  createProject : function(component, event, helper) {
    var action = component.get("c.createProject");
    action.setParams({
      "oppId": component.get("v.recordId"),
      "amt": component.get("v.amount")
    });
    action.setCallback(this, function(response) {
      var state = response.getSate();
      if (component.isValid() && state === "SUCCESS") {
        console.log("Success");
        // refresh view and close quick action modal window
        $A.get('e.force:refreshView').fire();
        $A.get('e.force:closeQuickAction').fire();
      } else {
        console.log("Error trying to get opportunity amount");
      }
    });
    $A.enqueueAction(action);
  }
})

// Apex controller class: CreatePartnerProjectApexController
public with sharing class CreatePartnerProjectApexController {
  @AuraEnabled
  public static String getOppAmount(Id, oppId) {
    //need to add isAccessible check
    Opportunity opp = [SELECT amount FROM Opportunity WHERE Id = :oppId];
    return String.valueOf(opp.amount);
  }

}
// ===========================================================
// Browser event
// Aura Code - expose to all pages
<aura:component implements="flexipage:availableForAllPageTypes,force:appHostable,forceCommunity:availableForAllPageTypes" access="global">
  <h1 class="title">Hello World!</h1>
</aura:component>

// add dynamic attribute

// basic
<aura:component>
  <aura:attribute name="whom" type="String" default="World!" />
  <h1 class="title">Hello {!v.whom}</h1> // v is view
</aura:component>

// user input
<aura:component implements="flexipage:availableForAllPageTypes" access="global">
  <aura:attribute name="whom" type="String" default="World!" access="global" />
  <h1 class="title">Hello {!v.whom}</h1>
  <ui:inputSelect class="single" aura:id="InputSelectSingle" change="{!c.onSingleSelectChange}">
      <ui:inputSelectOption text="Any"/>
      <ui:inputSelectOption text="Open" value="true"/>
      <ui:inputSelectOption text="Closed"/>
  </ui:inputSelect>
</aura:component>

// =========================================
// Controller code example
({
    doInit : function(cmp) {
    	// Initialize input select options
        var opts = [
            { "class": "optionClass", label: "Option1", value: "opt1", selected: "true" },
            { "class": "optionClass", label: "Option2", value: "opt2" },
            { "class": "optionClass", label: "Option3", value: "opt3" }

        ];
        cmp.find("InputSelectDynamic").set("v.options", opts);
        
    },

	 onSingleSelectChange: function(cmp) {
     var selectCmp = cmp.find("InputSelectSingle");
     cmp.set("v.whom", electCmp.get("v.value")); //accepts string to hold the key and value
	 }
	 
})

// ==========================================
// Design
<design:component label="Hello World">
  <design:attribute name="whom" label="Whom" description="who to say hello to" />
</design:component>

// ==========================================
// CSS
// component global
.THIS {
}

// top level elements
h1.THIS {
  color: red;
}

ul.THIS {
  list-style-type: circle;
}
// nested elements
.THIS li {
  color: blue;
}
// class
.THIS.title
// file name: AddToRaceList.evt
<aura:event type="APPLICATION" description="event is fired when a new race is entered">
  <aura:attribute name="race" type="Race__c" />
</aura:event>

//Receiver component

<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes" controller="ListRacesController">
  <aura:attribute name="races" type="Race__c[]" />
  <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
  <aura:handler event="c:AddToRaceList" action="{!c.handleAddToRaces}" />
  <div class="slds">
    <div class="slds-m-around--small slds-p-top--large">
      <div class="slds-card">
        <aura:iteration items="{!v.races}" var="race">
          <header class="slds-card__header">
             <ui:outPutText class="slds-text-heading--label" value="{!race.Name}" />
          </header>
          <section class="slds-card__body">
            <div class="slds-tile slds-hint-parent">
              <p class="slds-tile__title slds-truncate">Race Type:
                <ui:outputText value={!race.Type__c} />
              </p>
              <p class="slds-truncate">Lcation:
                <ui:outputText value={!race.Location__c} />
              </p>
              <p class="slds-truncate">Date/Time:
                <ui:outputText value={!race.DateTime__c} />
              </p>
              <p class="slds-truncate">Attended?
                <ui:inputCheckbox value={!race.Attended__c} />
              </p>
              <p class="slds-truncate">Results:
                <ui:outputTextArea value={!race.Results__c} />
              </p>
            </div>
          </section>
         
        </aura:iteration>
      </div>
    </div>
  </div>
</aura:component>

// Receiver component controller

({
  handleAddToRaces : function(component, event, helper) {
    helper.addToRaces(component, event);
  }
})

// Receiver helper function

({
  addToRaces : function(component, event) {
    var race = event.getParam('race');
    var races = component.get("v.races");
    races.unshift(race);
    component.set('v.races', races);
  }
})

// Sender Component

<aura:component controller="NewRaceController" implements="...">
  <aura:attribute name="newRace" type="Race__c"
    default="{
      'sobjectType': 'Race__c',
      'Name': 'New Race',
      'Type__c': '',
      'DateTime__c': '',
      'Location': '',
      'Attended__c': false,
      'Result__c': ''
    }" />
  <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
  // add sender handler
  <aura:registerEvent name="appEvent" type="c:AddToRaceList" />
  
  <div class="slds-form-stacked">
    <h1 class="slds-text-heading--label slds-p-bottom--large"
        title="Enter New Race"> Enter New Race</h1>
        
    <div class="slds-form-element">
      <div class="slds-form-element__control">
        <ui:inputText label="name"
                      aura:id="name"
                      class="slds-input"
                      labelClass="slds-form-element__label"
                      value="{!v.newRace.Name}"
      </div>
    </div>
    
    <div class="slds-element">
      <ui:button press="{!c.newRace}"
                 label="Submit"
                 class="slds-button slds-button--neutral" />
    </div>
    
  </div>
</aura:component>

// sender helper function

// helper function
({
  loadOptions : function(component) {
    var types = [{class: "optionClass", label: "5k", value: "5k"},
    {class:"optionClass", label: "10k", value: "10k"}];
    
    component.find("Type").set("v.options", types);
  },
  createNewRace: function(component) {
    var action = component.get("c.newRaceDB");
    action.setParams({ "race" : component.get("v.newRace") }); // setting input params
    action.setCallback(this, function(response) {
      var state = response.getState();
      if (component.isValid() && state === "SUCCESS") {
        console.log("Race successfully saved");
        // add event fire
        var appEvent = $A.get("e.c:AddToRaceList");
        appEvent.setParams({ "race": response.getReturnValue() });
        appEvent.fire();
        
      } else if (state === "ERROR") {
        var errors = response.getError();
        if (errors) {
          if (errors[0] && errors[0].message) {
            console.log("Error message:" + errors[0].message);
          }
        } else {
          console.log("Unknown error");
        }
      } else {
        console.log("Action state returned was: " + state);
      }
    });
    $A.enqueueAction(action);
  }
})
<div class="slds-form-element">
  <div class="slds-form-element-control">
    <ui:inputDateTime label="Date/Time"
                      aura:id="DateTime"
                      class="slds-input"
                      labelClass="slds-form-element__label"
                      displayDatePicker="true" />
  </div>
</div>

// css hacks
.This .uiInputDateTime .datePicker-openIcon {
  position: absolute;
  left: 45%;
  top: 45%;
}

.This .uiInputDateTime .timePicker-openIcon {
  position: absolute;
  left: 95%;
  top: 45%;
}
<design:component label="Page Header">
  <design:attribute name="title" label="title" description="Ttile to replace the header" />
</design:component>
<aura:documentation>
  <aura:description>
    <p>
      Allows you to include a Page Header for the Race Traker app
      and specify what should be displayed in the title
    </p>
    <p><pre>&lt;c:PageHeader title="My Race Traker" &gt;</pre>
  </aura:description>
  <aura:example name="pageHeaderExample" ref="c:PageHeader" label="Using the page header">
    <p>
      This example shows you waht the <code>c:PageHeader</code> looks like.
    </p>
  </aura:example>
</aura:documentation>
// Apex Controller
public with sharing class NewRaceController {
  @AuraEnabled
  public static Race__c newRaceDB(Race__c race) {
    
    insert race;
    return race;
  }
}

// Component code
<aura:component controller="NewRaceController" implements="...">
  <aura:attribute name="newRace" type="Race__c"
    default="{
      'sobjectType': 'Race__c',
      'Name': 'New Race',
      'Type__c': '',
      'DateTime__c': '',
      'Location': '',
      'Attended__c': false,
      'Result__c': ''
    }" />
  <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
  <div class="slds-form-stacked">
    <h1 class="slds-text-heading--label slds-p-bottom--large"
        title="Enter New Race"> Enter New Race</h1>
        
    <div class="slds-form-element">
      <div class="slds-form-element__control">
        <ui:inputText label="name"
                      aura:id="name"
                      class="slds-input"
                      labelClass="slds-form-element__label"
                      value="{!v.newRace.Name}"
      </div>
    </div>
    
    <div class="slds-element">
      <ui:button press="{!c.newRace}"
                 label="Submit"
                 class="slds-button slds-button--neutral" />
    </div>
    
  </div>
</aura:component>

// component controller

({
  doInit : function(component, event, helper) {
    helper.loadOptioins(component);
  },
  newRace : function(component, event, helper) {
    helper.createNewRace(component);
  }
})

// helper function
({
  loadOptions : function(component) {
    var types = [{class: "optionClass", label: "5k", value: "5k"},
    {class:"optionClass", label: "10k", value: "10k"}];
    
    component.find("Type").set("v.options", types);
  },
  createNewRace: function(component) {
    var action = component.get("c.newRaceDB");
    action.setParams({ "race" : component.get("v.newRace") }); // setting input params
    action.setCallback(this, function(response) {
      var state = response.getState();
      if (component.isValid() && state === "SUCCESS") {
        console.log("Race successfully saved");
      } else if (state === "ERROR") {
        var errors = response.getError();
        if (errors) {
          if (errors[0] && errors[0].message) {
            console.log("Error message:" + errors[0].message);
          }
        } else {
          console.log("Unknown error");
        }
      } else {
        console.log("Action state returned was: " + state);
      }
    });
    $A.enqueueAction(action);
  }
})
// Apex controller
public with sharing class ListRacesController {
  @AuraEnabled
  public static List<Race__c> getRacesDB() {
    return [SELECT Id, Name, DateTime__c FROM Race__c];
  }
}

// helper function
({
  getRaces: function(component) {
    // 1. get the action from the component
    var action = component.get("c.getRaceDB");
   
    // 2. set it's parameters (optional)
    action.setParams({ "race" : newRace });

    // 3. define the callback
    action.setCallback(this, function(response) {
      // code to handle response
      var state = response.getState();
      if (component.isValid() && state === "SUCCESS") {
        component.set("v.races", response.getReturnValue());
      }
    })
    
    // 4. enqueue the action because it's always async
    $A.enqueueAction(action);

  }
})

// javascript component controller
({
  doInit: function(component, event, helper) {
    helper.getRaces(component);
  }
})

// Aura component
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes" controller="ListRacesController">
  <aura:attribute name="races" type="Race__c[]" />
  <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
  <div class="slds">
    <div class="slds-m-around--small slds-p-top--large">
      <div class="slds-card">
        <aura:iteration items="{!v.races}" var="race">
          <header class="slds-card__header">
             <ui:outPutText class="slds-text-heading--label" value="{!race.Name}" />
          </header>
          <section class="slds-card__body">
            <div class="slds-tile slds-hint-parent">
              <p class="slds-tile__title slds-truncate">Race Type:
                <ui:outputText value={!race.Type__c} />
              </p>
              <p class="slds-truncate">Lcation:
                <ui:outputText value={!race.Location__c} />
              </p>
              <p class="slds-truncate">Date/Time:
                <ui:outputText value={!race.DateTime__c} />
              </p>
              <p class="slds-truncate">Attended?
                <ui:inputCheckbox value={!race.Attended__c} />
              </p>
              <p class="slds-truncate">Results:
                <ui:outputTextArea value={!race.Results__c} />
              </p>
            </div>
          </section>
         
        </aura:iteration>
      </div>
    </div>
  </div>
</aura:component>