How to make attachment mandatory in Lightning (I have a requirement like : Attachment should be mandatory for below application types i) Suport-User Creation ii) Support-User Termination iii) Support-User Update Permissions)
Naveen1425 opened this issue · 2 comments
Component code: Please suggest me how to achieve this.
<aura:component controller="ctssupportform" implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction">
<aura:attribute name="pageHeading" type="string" default="CEP Helpdesk"/>
<aura:attribute name="userCreation" type="boolean" default="false"/>
<aura:attribute name="UserTermination" type="boolean" default="false"/>
<aura:attribute name="updatePermission" type="boolean" default="false"/>
<aura:attribute name="isDataSubmitted" type="Boolean" default="true" />
<aura:attribute name="Isforsecond" type="Boolean" default="false"/>
<aura:attribute name="radioSelect" type="String" default=""/>
<aura:attribute name="fileName" type="String" default="No File Selected.." />
<aura:attribute name="Nxtbuttonvalidate" type="boolean" default="false"/>
<aura:attribute name="frameWidth" type="String" default="200" /><!--250-->
<aura:attribute name="frameHeight" type="String" default="80" /><!--30-->
<aura:attribute name="recordId" type="Id" default="'sobjectType':'attachment','Id':''"/>
<!-- Needed to send messages to VF page. But we will get it from VF itself -->
<aura:attribute name="vfHost" type="String" default="" />
<!-- Domain of LC for VF to send message -->
<aura:attribute name="lcHost" type="String" />
<aura:attribute name="body" type="string" default=""/>
<aura:handler name="init" value="{!this}" action="{!c.doInit}" />
<aura:attribute name="frameSrc" type="String" />
<aura:attribute name="applicationdata" type="string[]" default="--None--,Please select an application,
CTS,
Support-ECOs,
Knowledge Base,
Lithium(Community),
Support-LMS,
My net,
Support Site,
Yapper,
Support-IVR or dial tone call Routing,
Support-Telco line Issue,
Support-Others,
Support-User Creation,
Support-User Termination,
Support-User Update Permissions,Chat"/>
<aura:attribute name="urgdata" type="string[]" default="Low,Medium,High"/>
<aura:attribute name="Impactdata" type="string[]" default="Low,Medium,High"/>
<aura:attribute name="casedata" type="Case" default="{'sobjectType':'Case'}"/>
<aura:attribute name="options" type="List" default="[
{'label': 'I want to report a down time with an application', 'value': 'I want to report a down time with an application'},
{'label': 'I want to request a new user account / update permissions to an existing account/terminate an existing account', 'value': 'I want to request a new user account / update permissions to an existing account/terminate an existing account'},
{'label': 'I want to report a bug / issue', 'value': 'I want to report a bug / issue'},
{'label': 'I want to request a new report', 'value': 'I want to request a new report'},
{'label': 'I want to request a new functionality / project', 'value': 'I want to request a new functionality / project'},
{'label': 'I want to report a telco issue', 'value': 'I want to report a telco issue'},
{'label': 'I want to request technical assistance', 'value': 'I want to request technical assistance'}]"
/>
<aura:handler event="aura:waiting" action="{!c.waiting}"/>
<aura:handler event="aura:doneWaiting" action="{!c.doneWaiting}"/>
<div class="slds-m-top--xx-large">
<div class="slds-page-header">
<div class="slds-align--absolute-center">
<div class="slds-text-heading--large">
<div class="slds-media">
<div class="slds-media__figure">
<span class="slds-icon_container slds-icon-standard-opportunity" title="Description of icon when needed">
</span>
</div>
<div class="slds-media__body">
<h1 class="slds-page-header__title slds-truncate slds-align-middle" title="Rohde Corp - 80,000 Widgets">{!v.pageHeading}</h1>
</div>
</div>
</div>
</div>
<br/><br/>
<div class="slds-align--absolute-center">
<div class="slds-size--3-of-8">
<!-- <lightning:accordion activeSectionName="Page1">
<lightning:accordionSection name="page1" label="Select the type of ticket:">-->
<lightning:radioGroup aura:id="mygroup" name="radioButtonGroup" label="" options="{! v.options }" value="{! v.casedata.Type_Of_Ticket__c}" onchange="{!c.handleChange }"> </lightning:radioGroup><br/>
<div class="setcolorwhite">
<lightning:select label="Please select one Applications" name="mySelect" value="{!v.casedata.Applications__c}" aura:id="mySelect" class="labelcolor" onchange="{!c.toggle}">
<aura:iteration items="{!v.applicationdata}" var="appl" >
<option value="{!appl}" text="{!appl}"/>
</aura:iteration>
</lightning:select>
</div>
//Excel form will display based on the picklist value
<aura:if isTrue="{!and(v.options, v.userCreation)}">
<div aura:id="Support-User Creation" class="slds-grid slds-wrap slds-p-vertical_medium">
<span class="excel_format" style="display:inline;">
<a href='https://help.net-support.com/User_Management_template_version1.0.xlsx' target="_blank">Download sample and attach to ticket</a>
</span>
</div>
</aura:if>
<aura:if isTrue="{!and(v.options, v.UserTermination)}">
<div aura:id="Support-User Termination" class="demo-only demo-only--sizing slds-grid slds-wrap slds-p-vertical_medium">
<span class="excel_format" style="display:inline;">
<a href='https://help.net-support.com/User_Management_template_version1.0.xlsx' target="_blank">Download sample and attach to ticket</a>
</span>
</div>
</aura:if>
<aura:if isTrue="{!and(v.options, v.updatePermission)}">
<div aura:id="Support-User Update Permissions" class="demo-only demo-only--sizing slds-grid slds-wrap slds-p-vertical_medium">
<span class="excel_format" style="display:inline;">
<a href='https://help.net-support.com/User_Management_template_version1.0.xlsx' target="_blank">Download sample and attach to ticket</a>
</span>
</div>
</aura:if>
<div class="slds-m-top_large">
<lightning:button type="button" class="slds-button slds-button_brand" label="NEXT" onclick="{!c.nextButtonClickHandler}"/>
</div>
<!--<lightning:accordionSection name="page2" label="Please fill out the following form :">-->
<aura:if isTrue="{!v.Isforsecond}">
<lightning:input label="Subject" name="myname" value="{!v.casedata.Subject}"/>
<lightning:select label="Urgency" name="urgency" value="{!v.casedata.Urgency__c}">
<aura:iteration items="{!v.urgdata}" var="urg">
<option value="{!urg}" text="{!urg}"/>
</aura:iteration>
</lightning:select>
<lightning:select label="Impact" name="impact" value="{!v.casedata.Impact__c}">
<aura:iteration items="{!v.Impactdata}" var="imd">
<option value="{!imd}" text="{!imd}"/>
</aura:iteration>
</lightning:select>
<lightning:input label="Description" name="string" value="{!v.casedata.Description}"/>
<lightning:input label="Justification" name="justify" value="{!v.casedata.Justification__c}"/><br/>
<lightning:input aura:id="fileId" onchange="{!c.handleFilesChange}" type="file" name="file" label="Upload Attachment" multiple="false"/>
<div class="slds-text-body_small">{!v.fileName} </div>
<div class="slds-m-top_large">
<lightning:button type="button" class="slds-button slds-button_brand" label="next" onclick="{!c.handleFormSubmit}" disabled="true" aura:id="uploadFileButton"/>
</div>
<div class="slds-m-top_large">
<p><lightning:button iconName="utility:Submit" class="slds-button slds-button_brand" label="Submit" variant="border-filled" onclick="{!c.doSubmit}"/></p>
<br/>
</div>
</aura:if>
</div>
</div>
</div>
</div>
</aura:component>
Controller :
({
doSubmit : function(cmp, evt, hlpr) {
var fileInput = cmp.find("fileId").get("v.files");
var file = fileInput[0];
var objFileReader = new FileReader();
//alert(file);
//console.log(file);
objFileReader.onload = $A.getCallback(function() {
var fileContents = objFileReader.result;
var base64 = 'base64,';
var dataStart = fileContents.indexOf(base64) + base64.length;
fileContents = fileContents.substring(dataStart);
console.log(encodeURIComponent(fileContents));
// call apex function SaveRegistrationDetail to save data in reg form
// also we have to pass RegForm as a parameter
var casedata = cmp.get("v.casedata");
// create a one-time use instance of the SaveRegistrationDetail action
// in the server-side controller
var action = cmp.get("c.Savesupportform");
action.setParams({
casedata : casedata,
fileName: file.name,
base64Data: encodeURIComponent(fileContents),
contentType: file.type
});
// Create a callback that is executed after
// the server-side action returns
action.setCallback(this, function(response) {
var state = response.getState();
alert(state);
if (state === "SUCCESS") {
// Alert the user with the value returned
// from the server
cmp.set("v.isDataSubmitted", 'True');
var parentId = response.getReturnValue();
cmp.set("v.RegistrationRecordId",parentId);
alert('Record created succesfully'+''+ parentId);
}
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");
}
}
});
// $A.enqueueAction adds the server-side action to the queue.
var radio=cmp.get('c.handleChange');
$A.enqueueAction(action,radio);
});
objFileReader.readAsDataURL(file);
},
handleFilesChange: function(component, event, helper) {
alert('fileselected');
var fileName = 'No File Selected..';
if (event.getSource().get("v.files").length > 0) {
fileName = event.getSource().get("v.files")[0]['name'];
}
component.set("v.fileName", fileName);
alert(fileName);
},
handleClick : function (component ,event,helper){
var nxtbtnonRadio=component.get("v.options");
var nxtbtonSelect=component.find("mySelect");
var nxtSelect=nxtbtonSelect.get("v.value");
if(nxtbtnonRadio != null && nxtSelect.trim() != null ){
component.set("isDataSubmitted", true);
}
},
handleChange: function (cmp, event) {
var changeValue = event.getParam("value");
console.log("On change : "+changeValue);
cmp.set("v.radioSelect", changeValue);
alert(changeValue);
//var actn=component.get("c.handleClick");
//actn.$meth$();
},
toggle: function (component, event, helper) {
var sel = component.find("mySelect");
var nav = sel.get("v.value");
if (nav.trim() == "Support-User Creation") {
component.set("v.userCreation", true);
}
else{
component.set("v.userCreation", false);
}
if(nav.trim() == "Support-User Termination"){
component.set("v.UserTermination", true);
}
else{
component.set("v.UserTermination", false);
}
if(nav.trim() == "Support-User Update Permissions"){
component.set("v.updatePermission" , true);
}
else{
component.set("v.updatePermission" , false);
}
},
nextButtonClickHandler : function(component, event, helper){
var sel = component.find("mySelect");
var nav = sel.get("v.value");
if(nav !== '--None--' && component.get("v.radioSelect") !== '') {
component.set("v.Isforsecond", true);
}
},
doInit : function(component, event, helper) {
/*
//Send LC Host as parameter to VF page so VF page can send message to LC; make it all dynamic
component.set('v.lcHost', window.location.hostname);
var frameSrc = '/apex/UploadFilePage?id=' + component.get('v.RegistrationRecordId') + '&lcHost=' + component.get('v.lcHost');
console.log('frameSrc:' , frameSrc);
component.set('v.frameSrc', frameSrc);
//Add message listener
window.addEventListener("message", function(event) {
console.log('event.data:', event.data);
// Handle the message
if(event.data.state == 'LOADED'){
//Set vfHost which will be used later to send message
component.set('v.vfHost', event.data.vfHost);
alert('file loaded');
}
if(event.data.state == 'uploadFileSelected'){
component.find('uploadFileButton').set('v.disabled', false);
alert('upload file selected');
}
if(event.data.state == 'fileUploadprocessed'){
var uiMessage = component.find('uiMessage');
//Disable Upload button until file is selected again
component.find('uploadFileButton').set('v.disabled', true);
alert('file upload is true');
$A.createComponents([
["markup://ui:message",{
"body" : event.data.message,
"severity" : event.data.messageType,
}]
],
function(components, status, errorMessage){
alert('create component');
if (status === "SUCCESS") {
var message = components[0];
// set the body of the ui:message to be the ui:outputText
component.find('uiMessage').set("v.body", message);
}
else if (status === "INCOMPLETE") {
console.log("No response from server or client is offline.")
// Show offline error
}
else if (status === "ERROR") {
console.log("Error: " + errorMessage);
// Show error message
}
}
);
}
}, false);
*/
},
sendMessageone: function(component, event, helper) {
//Clear UI message before trying for file upload again
component.find('uiMessage').set("v.body",[]);
//Prepare message in the format required in VF page
var message = {
"uploadFile" : true
} ;
//Send message to VF
var sndmsg=component.set("v.sendmsg", true);
helper.sendMessage(component, message);
},
setIframeCaseId : function(component, event, helper) {
component.set("v.formSubmitStatus", "");
var message = {
"recordId" : event.target.value
};
helper.sendMessage(component, helper, message);
},
handleFormSubmit: function(component, event, helper) {
alert('file is uploading');
console.log('file is uploading');
var message = {
"uploadFile" : true
};
helper.sendMessage(component, helper, message);
}
})
Do you think lightning:fileUpload component can solve your problem for attachment?
try lightning:input with type=file and required. let us know if you still have the issue.