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><c:PageHeader title="My Race Traker" ></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>